*: use more constexpr
[xcsoar.git] / src / Device / Driver / Volkslogger / grecord.cpp
blob499cb33f470e8b507eb077c24aa2702e18eadaea
1 /***********************************************************************
2 **
3 ** grecord.cpp
4 **
5 ** This file is part of libkfrgcs.
6 **
7 ************************************************************************
8 **
9 ** Copyright (c): 2002 by Garrecht Ingenieurgesellschaft
11 ** This file is distributed under the terms of the General Public
12 ** Licence. See the file COPYING for more information.
14 ** $Id$
16 ***********************************************************************/
18 #include "grecord.h"
19 #include "Util/StringUtil.hpp"
21 #include <stdio.h>
22 #include <string.h>
24 // base-64 functions
26 static const char *
27 byte_bas64(const uint8_t *b)
29 static constexpr char base64tab[] =
30 "0123456789@ABCDEFGHIJKLMNOPQRSTUVWXYZ`abcdefghijklmnopqrstuvwxyz";
31 static char bas64ar[5];
32 bas64ar[0] = base64tab[ b[0] >> 2 ];
33 bas64ar[1] = base64tab[ ((b[0] & 0x03) << 4) | (b[1] >> 4) ];
34 bas64ar[2] = base64tab[ ((b[1] & 0x0f) << 2) | (b[2] >> 6) ];
35 bas64ar[3] = base64tab[ b[2] & 0x3f ];
36 bas64ar[4] = 0;
37 return bas64ar;
40 // g-record functions
42 GRECORD::GRECORD(FILE *ausgabedatei) {
43 strcpy(grecord, "");
44 tricnt = 0;
45 gcnt = 0;
46 memset(ba,0xff,3);
47 ausgabe = ausgabedatei;
50 void
51 GRECORD::update(uint8_t b)
53 ba[tricnt++] = b;
54 if (tricnt == 3) {
55 tricnt = 0;
56 strcat(grecord,byte_bas64(ba));
57 memset(ba,0xff,3);
58 gcnt++;
59 if (gcnt == 18) {
60 gcnt = 0;
61 fprintf(ausgabe,"G%s\n",grecord);
62 strcpy(grecord, "");
67 void GRECORD::finish(void) {
68 if (tricnt || gcnt) {
69 strcat(grecord,byte_bas64(ba));
70 fprintf(ausgabe,"G%s\n",grecord);
75 DATA-GCS:
76 - Binärblock beim Logger anfordern und im Speicher ablegen
77 * - Binärblock ins IGC-Format konvertieren
78 * - IGC-Datei abspeichern
79 - Binärblock im radix-64-Format als G-Records an IGC-Datei anhängen
81 VALI-GCS:
82 - IGC-Datei laden und ohne die nicht vom Logger stammenden Datensätze
83 und Whitespaces in temp1.igc abspeichern
84 - G-Records aus IGC-Datei laden von radix-64 in Binärblock umwandeln
85 * - Binärblock ins IGC-Format konvertieren
86 * und speichern in Datei temp2.igc
87 - Sicherheitscheck:
88 Dateien temp1 und temp2 vergleichen
89 Signatur überprüfen
91 * kann für DATA- und VALI-Programm genutzt werden
95 Benötigte Funktionen: (D=für DATA, V=für VALI, P=schon programmiert)
96 DV P
97 x x - Verzeichnis der Flüge auslesen
98 x x - Binärblock(Flug) vom Logger lesen
99 xx - Binärblock ins IGC-Format konvertieren dabei IGC-Datei abspeichern
100 x - Dateiname nach IGC-Vorschrift generieren
101 xx - Datei kopieren
102 x - Signatur in Binärblock überprüfen
103 x x - Binärblock in GR64 konvertieren und anhängen
104 x - GR64 laden, in Binärblock umwandeln und im Speicher ablegen
105 - IGC-Datei laden und alle nicht vom Logger stammenden Datensätze
106 ausfiltern, die Datei dann wieder als temp-Datei abspeichern
110 void
111 print_g_record(FILE *datei, const uint8_t *puffer, size_t puflen)
113 GRECORD g1(datei);
114 for (size_t i = 0; i < puflen; ++i)
115 g1.update(puffer[i]);
116 g1.finish();