Skip to content

Commit 1fb18ed

Browse files
committedApr 2, 2022
changes for 64 bit uint. Not sure I like them.
1 parent 2cf23db commit 1fb18ed

File tree

2 files changed

+250
-18
lines changed

2 files changed

+250
-18
lines changed
 

‎src/eotd.c

+239-5
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,13 @@
3737
#include <time.h>
3838

3939
#include "textcolor.h"
40+
#include "eotd_defs.h"
4041
#include "eotd.h"
4142

43+
#define EOTD_RAW
44+
#define EOTD_TIMESTAMP
45+
#define EOTD_APPEND_HEX
46+
4247
/*-------------------------------------------------------------------
4348
*
4449
* Convert EOTD binary block (from HDLC frame) to text.
@@ -48,14 +53,243 @@
4853
*
4954
*--------------------------------------------------------------------*/
5055

56+
void add_comma(char *text, int text_size) {
57+
strlcat(text, ",", text_size);
58+
}
59+
60+
void get_chain(uint64_t pkt, char *text, int text_size) {
61+
uint32_t val;
62+
63+
val = pkt & 0x03ULL;
64+
65+
strlcat(text, "chain=", text_size);
66+
67+
strlcat(text, val & 0x02 ? "FIRST+" : "NOT_FIRST+", text_size);
68+
strlcat(text, val & 0x01 ? "LAST" : "NOT_LAST", text_size);
69+
}
70+
71+
void get_dev_batt_stat(uint64_t pkt, char *text, int text_size) {
72+
uint32_t val;
73+
74+
pkt >>= 2;
75+
val = pkt & 0x03ULL;
76+
77+
strlcat(text, "devbat=", text_size);
78+
79+
switch(val) {
80+
case 3:
81+
strlcat(text, "OK", text_size);
82+
break;
83+
case 2:
84+
strlcat(text, "WEAK", text_size);
85+
break;
86+
case 1:
87+
strlcat(text, "VERY_WEAK", text_size);
88+
break;
89+
case 0:
90+
strlcat(text, "NOT_MONITORED", text_size);
91+
break;
92+
}
93+
}
94+
95+
void get_msg_id_type(uint64_t pkt, char *text, int text_size) {
96+
uint32_t val;
97+
char temp[32];
98+
99+
pkt >>= 4;
100+
val = pkt & 0x07ULL;
101+
102+
strlcat(text, "msgid=", text_size);
103+
104+
switch(val) {
105+
case 0:
106+
strlcat(text, "ONEWAY", text_size);
107+
break;
108+
109+
default:
110+
sprintf(temp, "CUSTOM(%d)", val);
111+
strlcat(text, temp, text_size);
112+
break;
113+
}
114+
}
115+
116+
void get_unit_addr_code(uint64_t pkt, char *text, int text_size) {
117+
uint32_t val;
118+
char temp[32];
119+
120+
pkt >>= 7;
121+
val = pkt & 0x1ffffULL;
122+
strlcat(text, "unit_addr=", text_size);
123+
sprintf(temp, "%d", val);
124+
strlcat(text, temp, text_size);
125+
}
126+
127+
void get_brake_pressure(uint64_t pkt, char *text, int text_size) {
128+
uint32_t val;
129+
char temp[32];
130+
131+
pkt >>= 24;
132+
val = pkt & 0x7fULL;
133+
134+
strlcat(text, "brake_status=", text_size);
135+
136+
switch (val) {
137+
case 127:
138+
strlcat(text, "GO", text_size);
139+
break;
140+
141+
case 126:
142+
strlcat(text, "NO-GO", text_size);
143+
break;
144+
145+
default:
146+
if (val < 45) {
147+
sprintf(temp, "NO-GO(%d psig)", val);
148+
} else {
149+
sprintf(temp, "GO(%d psig)", val);
150+
}
151+
152+
strlcat(text, temp, text_size);
153+
break;
154+
}
155+
}
156+
157+
void get_disc_bits(uint64_t pkt, char *text, int text_size) {
158+
uint32_t val;
159+
char temp[32];
160+
161+
pkt >>= 31;
162+
val = pkt & 0xffULL;
163+
164+
strlcat(text, "disc_bits=", text_size);
165+
sprintf(temp, "%02x", val);
166+
strlcat(text, temp, text_size);
167+
}
168+
169+
void get_valve_bit(uint64_t pkt, char *text, int text_size) {
170+
uint32_t val;
171+
172+
pkt >>= 39;
173+
val = pkt & 0x01;
174+
175+
strlcat(text, "valve=", text_size);
176+
strlcat(text, val == 0 ? "FAILED" : "OPERATIONAL", text_size);
177+
}
178+
179+
void get_confirm_bit(uint64_t pkt, char *text, int text_size) {
180+
uint32_t val;
181+
182+
pkt >>= 40;
183+
val = pkt & 0x01;
184+
185+
strlcat(text, "confirm=", text_size);
186+
strlcat(text, val == 0 ? "UPDATE" : "RESPONSE", text_size);
187+
}
188+
189+
void get_disc_bit1(uint64_t pkt, char *text, int text_size) {
190+
uint32_t val;
191+
char temp[32];
192+
193+
pkt >>= 41;
194+
val = pkt & 0x01;
195+
196+
strlcat(text, "disc_bit_1=", text_size);
197+
sprintf(temp, "%d", val);
198+
strlcat(text, temp, text_size);
199+
}
200+
201+
void get_motion_bit(uint64_t pkt, char *text, int text_size) {
202+
uint32_t val;
203+
204+
pkt >>= 42;
205+
val = pkt & 0x01;
206+
207+
strlcat(text, "motion=", text_size);
208+
strlcat(text, val == 0 ? "STOPPED/NOT_MONITORED" : "IN_MOTION", text_size);
209+
}
210+
211+
void get_mkr_light_batt_bit(uint64_t pkt, char *text, int text_size) {
212+
uint32_t val;
213+
214+
pkt >>= 43;
215+
val = pkt & 0x01;
216+
217+
strlcat(text, "light_batt=", text_size);
218+
strlcat(text, val == 0 ? "OK/NOT_MONITORED" : "WEAK", text_size);
219+
}
220+
221+
void get_mkr_light_bit(uint64_t pkt, char *text, int text_size) {
222+
uint32_t val;
223+
224+
pkt >>= 44;
225+
val = pkt & 0x01;
226+
227+
strlcat(text, "light=", text_size);
228+
strlcat(text, val == 0 ? "OFF/NOT_MONITORED" : "ON", text_size);
229+
}
230+
51231
void eotd_to_text (unsigned char *eotd, int eotd_len, char *text, int text_size)
52232
{
53-
time_t now = time(NULL);
233+
assert (eotd_len == EOTD_LENGTH + 1);
234+
235+
uint64_t pkt = 0ULL;
236+
237+
for (int i = 0; i < EOTD_LENGTH; i++) {
238+
pkt <<= 8;
239+
pkt |= eotd[i];
240+
}
241+
54242
*text = '\0';
55-
strcat(text, ctime(&now));
56-
for (int i = 0; i < eotd_len; i++) {
57-
char temp[32];
58-
snprintf(temp, sizeof(temp), " %02x", eotd[i]);
243+
#ifndef EOTD_RAW
244+
char eotd_type = eotd[EOTD_LENGTH];
245+
246+
if (eotd_type == EOTD_TYPE_F2R) {
247+
strlcat(text, "FRONT>REAR:", text_size);
248+
} else {
249+
strlcat(text, "REAR>FRONT:", text_size);
250+
}
251+
252+
#ifdef EOTD_TIMESTAMP
253+
time_t now = time(NULL);
254+
strlcat(text, "timestamp=", text_size);
255+
strlcat(text, ctime(&now), text_size);
256+
text[strlen(text) -1] = ','; // zap lf
257+
#endif
258+
get_chain(pkt, text, text_size);
259+
add_comma(text, text_size);
260+
get_dev_batt_stat(pkt, text, text_size);
261+
add_comma(text, text_size);
262+
get_msg_id_type(pkt, text, text_size);
263+
add_comma(text, text_size);
264+
get_unit_addr_code(pkt, text, text_size);
265+
add_comma(text, text_size);
266+
get_brake_pressure(pkt, text, text_size);
267+
add_comma(text, text_size);
268+
get_disc_bits(pkt, text, text_size);
269+
add_comma(text, text_size);
270+
get_valve_bit(pkt, text, text_size);
271+
add_comma(text, text_size);
272+
get_confirm_bit(pkt, text, text_size);
273+
add_comma(text, text_size);
274+
get_disc_bit1(pkt, text, text_size);
275+
add_comma(text, text_size);
276+
get_motion_bit(pkt, text, text_size);
277+
add_comma(text, text_size);
278+
get_mkr_light_batt_bit(pkt, text, text_size);
279+
add_comma(text, text_size);
280+
get_mkr_light_bit(pkt, text, text_size);
281+
#ifdef EOTD_APPEND_HEX
282+
char hex[64];
283+
add_comma(text, text_size);
284+
snprintf(hex, sizeof(hex), "%llx", pkt);
285+
strlcat(text, "hex=", text_size);
286+
strlcat(text, hex, text_size);
287+
#endif
288+
#else
289+
char temp[8];
290+
for (int i = 0; i < 8; i++) {
291+
sprintf(temp, " %02x", eotd[i]);
59292
strlcat(text, temp, text_size);
60293
}
294+
#endif
61295
}

‎src/hdlc_rec.c

+11-13
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
#include "demod_9600.h" /* for descramble() */
4747
#include "ptt.h"
4848
#include "fx25.h"
49+
#include "eotd_defs.h"
4950

5051

5152
//#define TEST 1 /* Define for unit testing. */
@@ -116,6 +117,8 @@ struct hdlc_state_s {
116117

117118
uint64_t eotd_acc; /* Accumulate last recent 32 bits for EOTD. */
118119

120+
char eotd_type; /* E for End of train, H for head of train */
121+
119122
int eotd_gathering; /* Decoding in progress - valid frame. */
120123
};
121124

@@ -429,14 +432,6 @@ a good modem here and providing a result when it is received.
429432
*
430433
***********************************************************************************/
431434

432-
#define EOTD_MAX_BYTES 8
433-
434-
#define EOTD_PREAMBLE_AND_BARKER_CODE 0x48eaaaaa00000000ULL
435-
#define EOTD_PREAMBLE_MASK 0xffffffff00000000ULL
436-
437-
#define HOTD_PREAMBLE_AND_BARKER_CODE 0x9488f1aa00000000ULL
438-
#define HOTD_PREAMBLE_MASK 0xffffffff00000000ULL
439-
440435
static void eotd_rec_bit (int chan, int subchan, int slice, int raw, int future_use)
441436
{
442437
struct hdlc_state_s *H;
@@ -451,7 +446,7 @@ dw_printf("chan=%d subchan=%d slice=%d raw=%d\n", chan, subchan, slice, raw);
451446
#endif
452447
//dw_printf ("slice %d = %d\n", slice, raw);
453448

454-
// Accumulate most recent 32 bits in LSB-first order.
449+
// Accumulate most recent 64 bits in LSB-first order.
455450

456451
H->eotd_acc >>= 1;
457452
if (raw) {
@@ -466,6 +461,7 @@ dw_printf("chan=%d subchan=%d slice=%d raw=%d\n", chan, subchan, slice, raw);
466461
#ifdef EOTD_DEBUG
467462
dw_printf ("Barker Code Found %llx\n", H->eotd_acc);
468463
#endif
464+
H->eotd_type = (H->eotd_acc & EOTD_PREAMBLE_MASK) == EOTD_PREAMBLE_AND_BARKER_CODE ? EOTD_TYPE_R2F : EOTD_TYPE_F2R;
469465
H->olen = 0;
470466
H->eotd_gathering = 1;
471467
H->frame_len = 0;
@@ -474,15 +470,17 @@ dw_printf("chan=%d subchan=%d slice=%d raw=%d\n", chan, subchan, slice, raw);
474470
else if (H->eotd_gathering) {
475471
H->olen++;
476472

477-
if (H->olen == EOTD_MAX_BYTES * 8) {
478-
H->frame_len = EOTD_MAX_BYTES;
479-
for (int i = EOTD_MAX_BYTES -1; i >=0; i--) {
473+
if (H->olen == EOTD_LENGTH * 8) {
474+
H->frame_len = EOTD_LENGTH + 1; // appended type
475+
for (int i = EOTD_LENGTH -1; i >=0; i--) {
480476
H->frame_buf[i] = H->eotd_acc & 0xff;
481477
H->eotd_acc >>= 8;
482478
}
479+
480+
H->frame_buf[EOTD_LENGTH] = H->eotd_type;
483481
done = 1;
484482
#ifdef EOTD_DEBUG
485-
for (int ii=0; ii < EOTD_MAX_BYTES; ii++) {dw_printf("%02x ", H->frame_buf[ii]); } dw_printf("\n");
483+
for (int ii=0; ii < EOTD_MAX_LENGTH; ii++) {dw_printf("%02x ", H->frame_buf[ii]); } dw_printf("\n");
486484
#endif
487485
}
488486
}

0 commit comments

Comments
 (0)