@@ -98,6 +98,7 @@ struct flex_params {
98
98
struct flex_get getter [GETTER_SLOTS ];
99
99
unsigned decode_uart ;
100
100
unsigned decode_dm ;
101
+ unsigned decode_mc ;
101
102
char const * fields [7 + GETTER_SLOTS + 1 ]; // NOTE: needs to match output_fields
102
103
};
103
104
@@ -257,6 +258,19 @@ static int flex_callback(r_device *decoder, bitbuffer_t *bitbuffer)
257
258
}
258
259
}
259
260
261
+ // IEEE 802.3 MC, may need G.E.Thomas option (bitbuffer_invert_row())
262
+ if (params -> decode_mc ) {
263
+ for (i = 0 ; i < bitbuffer -> num_rows ; i ++ ) {
264
+ // TODO: refactor to bitbuffer_decode_mc_row()
265
+ unsigned len = bitbuffer -> bits_per_row [i ];
266
+ bitbuffer_t tmp = {0 };
267
+ bitbuffer_manchester_decode (bitbuffer , i , 0 , & tmp , len );
268
+ len = tmp .bits_per_row [0 ];
269
+ memcpy (bitbuffer -> bb [i ], tmp .bb [0 ], (len + 7 ) / 8 ); // safe to write over: can only be shorter
270
+ bitbuffer -> bits_per_row [i ] = len ;
271
+ }
272
+ }
273
+
260
274
decoder_log_bitbuffer (decoder , 1 , params -> name , bitbuffer , "" );
261
275
262
276
// discard duplicates
@@ -406,6 +420,7 @@ static void help(void)
406
420
"\treflect : reflect each byte (MSB first to MSB last)\n"
407
421
"\tdecode_uart : UART 8n1 (10-to-8) decode\n"
408
422
"\tdecode_dm : Differential Manchester decode\n"
423
+ "\tdecode_mc : Manchester decode\n"
409
424
"\tmatch=<bits> : only match if the <bits> are found\n"
410
425
"\tpreamble=<bits> : match and align at the <bits> preamble\n"
411
426
"\t\t<bits> is a row spec of {<bit count>}<bits as hex number>\n"
@@ -716,6 +731,8 @@ r_device *flex_create_device(char *spec)
716
731
params -> decode_uart = parse_atoiv (val , 1 , "decode_uart: " );
717
732
else if (!strcasecmp (key , "decode_dm" ))
718
733
params -> decode_dm = parse_atoiv (val , 1 , "decode_dm: " );
734
+ else if (!strcasecmp (key , "decode_mc" ))
735
+ params -> decode_mc = parse_atoiv (val , 1 , "decode_mc: " );
719
736
720
737
else if (!strcasecmp (key , "symbol_zero" ))
721
738
params -> symbol_zero = parse_symbol (val );
0 commit comments