Adds customer internal lib schusstafel

This commit is contained in:
torsten committed 2026-10-21 16:32:37 +00:00
1 parent 16ec70af1b
commit b635acb2fc
4 files changed
+381

No files matched your search

+3
View File
@@ -0,0 +1,3 @@
985fd529adec6514f64aede19ffe2ae3e9df0ddcb72041b9d99e57785be4ae3d Schusstafel.h
aaab96761236062e729a2e1a5f37638e579c6096cf6d36c213c2b90753e1e9d8 libSchusstafel.a
20709adcebac0adc7c89bb60c81c09b0dfd2ec9e6623598fb736b410304fb0f1 libSchusstafel.so
+378
View File
@@ -0,0 +1,378 @@
/*!
// ------------------------------------------------------------------
// filename : Schusstafel.h
// ------------------------------------------------------------------
// Time-stamp: "11.09.14-14:02 marienfeld"
// ------------------------------------------------------------------
// copyright (C) 2011 Rheinmetall Defence Electronics, D-28305 BREMEN
// ------------------------------------------------------------------
//
// HIER/ITEM : CSU:
// BRIEF DESC:
// AUTHOR : R. Marienfeld, SGTB
// RELEASE : /main/0
// MODIF/STAT: 09.09.2011
// ORIGIN REF:
// LANGUAGE : C/C++
*/
#ifndef __SCHUSSTAFEL_H_
#define __SCHUSSTAFEL_H_
#include <string>
#include <math.h>
class Schusstafel {
#define MAXTAFEL 13 /* Standard- und Nicht_Std_Tafel */
#define MAXCORR 3 /* Anzahl Korrektur-Tafeln */
#define DATAROWS 600 /* Anzahl Daten-Zeilen pro Tafel */
#define DATACOLS 16 /* Anzahl Daten-Spalten pro Tafel */
#define DATAFLNG 48 /* Anzahl Zeichen je Datenfeld */
#define MAXZIELW 25 /* Anzahl Tafeln Zielhoehenwinkel */
#define TESTFLAG 0 /* Test der Tafeln beim Einlesen */
public:
typedef enum {
ST_ENTFERNUNG, ST_AUFSATZ, ST_FLUGZEIT
} TAFEL_NAMEN_ET;
class Fehler : public std::exception {
public:
explicit Fehler (const std::string& what_arg);
virtual ~Fehler () throw();
virtual const char* what() const throw();
private:
std::string fehler_string;
};
Schusstafel (std::string pfad, std::string munitionsart, std::string suffix)
throw (Fehler);
~Schusstafel () {};
/*
Aufbau der Datenfiles fuer die Schusstafeln
-------------------------------------------
Die Schusstafeln fuer jede Munition wird in einem eigenen Text-File beschrieben.
Zu jeder Schusstafel muessen die Datenbloecke "Schuss_Tafel" und "Standard_Tafel"
vorhanden sein.
Optional koennen die "Nicht_Std_Tafel" und die "Korrektur_Tafel" vorhanden sein.
Die Nicht-Standard-Tafel modifiziert Tafelwerte aus der Standard-Tafel.
Die Korrektur-Tafel modifiziert Tafelwerte aus der Nicht-Standard-Tafel.
Der Datenblock "Schuss_Tafel" beschreibt die Basis-Parameter einer Munition:
Schuss_Tafel =
Munition = "xxxx"
Version = "XXXX"
Muni_Parameter = { Kaliber = x.x Masse = x.x V0 = x.x }
Std_Parameter = { DELTA_V0 = x.x
LUFTTEMP = x.x
LUFTDRUCK = x.x
LAENGSWIND = x.x
QUERWIND = x.x
PULVERTEMP = x.x }
Diese Parameter koennen mit den Funktionen
"ST_version", "ST_muni_parameter" und "ST_std_parameter" abgefragt werden.
Der Datenblock "Standard_Tafel" beschreibt die Standard-Parameter einer Munition:
Standard_Tafel =
Spaltengruppe =
Belegung = { AUFSATZ = (2) [-]
VORHALT = (3) [-]
FLUGZEIT = (4)
}
Zeilenlaenge = 4
Datenblock = {
# ENTF AUFSATZ VORHALT FLUGZEIT V_END
xx x.x x.x x.x x.x
xx x.x x.x x.x x.x
}
Der Parameter "Zeilenlaenge" (besser: Anzahl Spalten) bestimmt wie viele Spalten der
Tabelle eingelesen werden. Sind mehr Spalten in der Tabelle vorhanden als angegeben,
werden die restlichen Spalten nicht beruecksichtigt.
Der Parameter "Belegung" beschreibt den Aufbau der Tabelle:
"name" = (spalte) [dimension]
Bei der Standard-Tafel muessen die Parameter ENTFERNUNG, AUFSATZ, VORHALT und
FLUGZEIT vorhanden sein. Weitere Parameter (z.B. Endgeschwindigkeit, Fallwinkel, ..)
koennen hinzugefuegt werden.
Die (spalte) definiert die Spaltennummer in der Tabelle, ist diese Angabe nicht
vorhanden, wird die Spalte nicht beruecksichtigt.
Die [dimension] definiert die Winkeleinheit. Der Standardwert ist rad, zulaessige
Einheiten sind "-", "mil", "STRICH".
Es werden so viele Zeile eingelesen wie in der Tabelle vorhanden sind. Bei
ballistischen Schusstafeln funktioniert die Berechnung der Anzahl der Zeilen ueber
die Angabe der Entfernung-Range nicht.
Der Datenblock "Nicht_Std_Tafel" beschreibt die Nicht-Standard-Parameter einer
Munition:
Nicht_Std_Tafel =
Parameter = LUFTTEMP
Tafelwerte = { AUFSATZ FLUGZEIT }
Spaltengruppe = {
Belegung = { AUFSATZ ( x.x ) = (2) [-]
FLUGZEIT ( x.x ) = (4)
AUFSATZ ( x.x ) = (3) [-]
FLUGZEIT ( x.x ) = (5)
}
Zeilenlaenge = 5
Datenblock = {
# ENTF AUFSATZ AUFSATZ FLUGZEIT FLUGZEIT
xx x.x x.x x.x x.x
xx x.x x.x x.x x.x
}
In dem Beispiel beeinflusst die Lufttemperatur den Aufsatz und die Flugzeit in
Abhaengigkeit der Entfernung.
Ist am Ende der Belegungs-Zeile ein "+/-" angegeben wird das Vorzeichen der Daten
dieser Spalte invertiert.
Zum Aufbau einer symmetrischen Nicht-Standard-Tafel (z.B. fuer Seitenwind) kann
am Ende der Belegungs-Zeile ein "-(n)" angegeben werden.
Belegung = { VORHALT ( 0.0) = (2) [-] +/-
VORHALT ( 5.0) = (3) [-]
VORHALT ( 10.0) = (4) [-]
VORHALT ( -5.0) = (5) [-] -(3)
VORHALT (-10.0) = (6) [-] -(4)
}
Zeilenlaenge = 6
Datenblock = {
# ENTF VORHALT VORHALT VORHALT
# 0.0 +5.0 +10.0
xx -x.x x.x x.x
xx -x.x x.x x.x
}
In dem Beispiel wird aus der Spalte 3 (5m/s) eine neue Spalte 5 (-5m/s) erzeugt.
Die Daten der Spalte 2 (0m/s) werden invertiert.
*/
void ST_tafelwerte (TAFEL_NAMEN_ET arg_name, float arg_wert,
float luftdruck, float lufttemp, float delta_v0,
float querwind, float pulvertemp,
float *entfernung, float *aufsatz, float *vorhalt,
float *flugzeit);
/* diese Funktion liefert fuer die angegebenen Argumente die korrigierten und */
/* interpolierten Werte fuer Entfernung, Aufsatz, Vorhalt und Flugzeit aus der */
/* aktuellen Schusstafel. Bei Entfernungen groesser als der max. Tafelwert */
/* werden die letzten Tafelwerte linear extrapoliert. */
/* Die Einheit fuer die Aufsatz- und Vorhalt-Winkel ist rad. */
void ST_artillerie
(TAFEL_NAMEN_ET arg_name, float arg_wert, float zielhoehenwinkel,
float *entfernung1, float *aufsatz1, float *flugzeit1, float *drift1,
float *entfernung2, float *aufsatz2, float *flugzeit2, float *drift2);
/* diese Funktion liefert fuer die angegebenen Argumente die interpolierten */
/* Werte fuer Entfernung, Aufsatz, Flugzeit und Drift aus der aktuellen */
/* Schusstafel. Bei der Funktion Aufsatz, Flugzeit, Drift in Abhaengigkeit */
/* der Entfernung werden die Werte fuer die untere (in 1) und obere (in 2) */
/* Winkelgruppe ausgegeben, bei den anderen Funktionen sind diese Werte 0. */
/* Die Winkel-Einheit ist rad. */
/* Der Zielhoehenwinkel wird (noch) nicht beruecksichtigt. */
int ST_status (std::string *fehler);
/* diese Funktion liefert das Ergebnis vom Einlesen der Schusstafel. */
/* In "fehler" ist die letzte Fehler-Info enthalten */
/* return: 0 = fehlerfrei, -1 = Datenfile nicht gefunden, >0 = Fehler */
char* ST_version (void);
/* diese Funktion liefert den Versions-String der aktuellen Munition */
void ST_muni_parameter (float *kaliber, float *masse, float *v0);
/* diese Funktion liefert die Munitions-Parameter */
int ST_std_parameter (std::string tafel, std::string tafelwert, float *value);
/* diese Funktion liefert den Standard-Wert einer Nicht_Std_Tafel */
void ST_entfernung_range (float *min, float *max, float *delta);
/* diese Funktion liefert den Entfernung-Bereich der Standard-Tafel */
int ST_zielhoehenwinkel (float zielwinkel);
/* diese Funktion waehlt die Tafeln fuer den Zielhoehenwinkel. */
/* Zwischen allen Tafelwerte wird linear interpoliert. */
/* Weil die Differenzen der Werte bei grossen Zielhoehenwinkel */
/* stark nichtlinear sind, (Fehler bei 90 Grad ist unendlich) */
/* wird der Zielhoehenwinkel auf den kleinsten bzw groessten */
/* Wert aus den eingelesenen Kommandotafeln begrenzt. */
/* return: 0 = fehlerfrei, -1 = Schusstafeln nicht gefunden */
private:
Schusstafel () {};
void ST_setze_pfad (std::string pfad, std::string praefix, std::string suffix);
/* vor dem Einlesen von Datenfiles koennen Pfad und Filenamen projektspezifisch */
/* modifiziert werden */
/* Open fuer das Datenfile erfolgt mit "<pfad><praefix><munitionsart><suffix>" */
/* Standard fuer Pfad/Filenamen ist "./<munitionsart>.sus" */
int ST_einlesen (void);
/* liest das Datenfile einer Munitionsart ein und erzeugt eine Schusstafel */
/* return: 0 = fehlerfrei, -1 = Datenfile nicht gefunden, >0 = Fehler */
typedef enum {
ENTF=0, AUFSATZ, VORHALT, FLUGZEIT, DRIFT
} correl_et;
typedef struct {
char titel[DATAFLNG];
char einheit[DATAFLNG];
char vorz[11];
float wert;
} spalten_typ;
typedef struct {
float value[DATACOLS];
} daten_typ;
daten_typ datenblock;
typedef struct {
int zeilenlaenge;
float zielwinkel;
char parameter[DATAFLNG];
spalten_typ spalte[DATACOLS+1];
} beleg_typ;
typedef struct {
int hoehenwinkel;
int datenzeilen;
int zuordnung[DATAROWS];
beleg_typ belegung;
daten_typ datenblock[DATAROWS];
} tafel_typ;
tafel_typ schusstafel[MAXTAFEL+1];
typedef struct {
tafel_typ schusstafel[MAXTAFEL+1];
} zielw_typ;
zielw_typ *pZielwinkel;
typedef struct {
char parameter[DATAFLNG];
char belegung[DATAFLNG];
int datenlen;
daten_typ datenblock[DATAROWS];
} korrektur_typ;
korrektur_typ korrektur[MAXCORR];
typedef struct {
float winkel;
long index;
} elev_typ;
elev_typ elevation[MAXZIELW+2];
typedef struct {
char munition[DATAFLNG];
char version[DATAFLNG];
char flugbahn[DATAFLNG];
int parabel;
float zielwinkel;
float kaliber; /* Muni_Parameter */
float masse;
float v0;
float luftdruck; /* Std_Parameter */
float lufttemp;
float delta_v0;
float querwind;
float pulvertemp;
float laengswind;
float min; /* Entfernung_Range */
float max;
float delta;
float scheitel;
} parameter_typ;
parameter_typ parameter;
parameter_typ aktuell;
#define BUFLNG 512
#define MILRAD M_PI/3200
#define MILGRAD 360/6400
char ST_file[BUFLNG/2];
char ST_pfad[BUFLNG/2];
char ST_praefix[BUFLNG/2];
char ST_suffix[BUFLNG/2];
char buffer[BUFLNG];
char notice[BUFLNG];
char element[DATAFLNG];
int inhalt[MAXTAFEL+1];
float delta_aufs, delta_vorh, delta_zeit;
long fpos1, fpos2;
int col_aufs;
int col_vorh;
int col_zeit;
int winkel;
int error;
int tafel;
int zeile;
int index;
int len;
FILE *fd1;
int Elevation_Tafel (FILE *fd, elev_typ *elev);
void Basis_Parameter (void);
void Tafel_einlesen (int tafel);
void Tafel_Belegung (int tafel);
void Korrektur_Tafel (int tafel);
void Standard_Tafel (void);
int Nicht_Std_Tafel (int tafel);
void sortiere_Tafel (int tafel);
void kopiere_Spalte (tafel_typ *ziel, int sp1, tafel_typ von, int sp2);
void aktuelle_Tafel (float luftdruck, float lufttemp, float delta_v0,
float querwind, float pulvertemp);
void neue_tafelwerte (float entfernung, float luftdruck, float lufttemp,
float delta_v0, float querwind, float pulvertemp,
float *aufsatz, float *vorhalt, float *flugzeit);
void ladeSchusstafel (int tafel);
void sucheSpalten (float value, char *tafelwert,
beleg_typ belegung, int *spalte1, int *spalte2);
float abweichung (float value, float entf, int tafel,
std::string spalte, int zeile);
float korrigieren (float value, std::string param, std::string belegung);
int leseDatenblock (daten_typ *daten, int tafel);
void copyDatenblock (daten_typ *ziel, daten_typ *von,
beleg_typ *tafel);
int testDatenblock (tafel_typ tafel, daten_typ *block);
void neuerDatenblock (float winkel, daten_typ *neu,
beleg_typ beleg1, daten_typ *block1,
beleg_typ beleg2, daten_typ *block2);
int sucheTafel (std::string param, std::string tafel);
int ZeileLesen (char *buf);
int leseZeichen (int full);
int DatenZeile (char *buf);
int splitValue (char *buf, char *val);
int fetchValue (char *buf, char *val);
int floatValue (std::string item, float *value);
int sucheString (char *str1, std::string str2);
void setzeEinheit (beleg_typ *tafel);
void sucheEinheit (char *zeile, beleg_typ *tafel);
float interpolieren (float x, float f1, float f0, float x1, float x0);
void upperCase (char *buf, int len);
void cArray (std::string str, char *chr);
};
#endif /* __SCHUSSTAFEL_H_ */
/*
----------------------------------------
------ PROGRAM REVISION HISTORY ------
----------------------------------------
09.09.11: Marienfeld, SGTB, Tel: 457-4657
first edition
12.07.12: Marienfeld, SGTB, Tel: 457-4657
Funktion "ST_distanz" hinzugefuegt
04.09.12: Marienfeld, SGTB, Tel: 457-4657
Die Funktion "ST_distanz" entfaellt
05.05.14: Marienfeld, SGAP, Tel: 457-4657
Funktion "ST_zielhoehenwinkel" hinzugefuegt
26.06.14: Marienfeld, SGAP, Tel: 457-4657
Funktion "ST_artillerie" hinzugefuegt
*/
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.