@@ -280,26 +280,33 @@ static char *unit_names[][3] = {
280
280
static double pow10_table [8 ] = { 0.001 , 0.01 , 0.1 , 1 , 10 , 100 , 1000 , 10000 };
281
281
282
282
283
- static data_t * append_str (data_t * data , enum UnitType unit_type , uint8_t value_type , uint8_t sn , char const * extra , char const * value )
283
+ static data_t * append_str (data_t * data , enum UnitType unit_type , uint8_t value_type , uint8_t sn ,
284
+ char const * key_extra , char const * pretty_extra , char const * value )
284
285
{
285
286
char key [100 ] = {0 };
286
287
char pretty [100 ] = {0 };
287
288
288
289
value_type &= 0x3 ;
289
290
290
- snprintf (key , sizeof (key ), "%s_%s_%d" , value_types_tab [value_type ][0 ], unit_names [unit_type ][0 ], sn );
291
- if (extra [0 ] == '\0' ) {
291
+ if (key_extra [0 ] == '\0' ) {
292
+ snprintf (key , sizeof (key ), "%s_%s_%d" , value_types_tab [value_type ][0 ], unit_names [unit_type ][0 ], sn );
293
+ } else {
294
+ snprintf (key , sizeof (key ), "%s_%s_%s_%d" , value_types_tab [value_type ][0 ], unit_names [unit_type ][0 ], key_extra , sn );
295
+ }
296
+
297
+ if (pretty_extra [0 ] == '\0' ) {
292
298
snprintf (pretty , sizeof (pretty ), "%s %s[%d]" , value_types_tab [value_type ][1 ], unit_names [unit_type ][1 ], sn );
293
299
} else {
294
- snprintf (pretty , sizeof (pretty ), "%s %s %s" , value_types_tab [value_type ][1 ], unit_names [unit_type ][1 ], extra );
300
+ snprintf (pretty , sizeof (pretty ), "%s %s %s" , value_types_tab [value_type ][1 ], unit_names [unit_type ][1 ], pretty_extra );
295
301
}
296
302
297
303
return data_append (data ,
298
304
key , pretty , DATA_STRING , value , NULL );
299
305
300
306
}
301
307
302
- static data_t * append_val (data_t * data , enum UnitType unit_type , uint8_t value_type , uint8_t sn , char const * extra , int64_t val , int exp )
308
+ static data_t * append_val (data_t * data , enum UnitType unit_type , uint8_t value_type , uint8_t sn ,
309
+ char const * key_extra , char const * pretty_extra , int64_t val , int exp )
303
310
{
304
311
char const * prefix = "" ;
305
312
char buffer_val [256 ] = {0 };
@@ -332,7 +339,7 @@ static data_t *append_val(data_t *data, enum UnitType unit_type, uint8_t value_t
332
339
333
340
snprintf (buffer_val , sizeof (buffer_val ), "%.03f %s%s" , fvalue , prefix , unit_names [unit_type ][2 ]);
334
341
335
- return append_str (data , unit_type , value_type , sn , extra , buffer_val );
342
+ return append_str (data , unit_type , value_type , sn , key_extra , pretty_extra , buffer_val );
336
343
}
337
344
338
345
static size_t m_bus_tm_decode (const uint8_t * data , size_t data_size , char * output , size_t output_size )
@@ -516,96 +523,97 @@ static int m_bus_decode_records(data_t *data, const uint8_t *b, uint8_t dif_codi
516
523
case 0 :
517
524
if ((vif_uam & 0xF8 ) == 0 ) {
518
525
// E000 0nnn Energy 10nnn-3 Wh 0.001Wh to 10000Wh
519
- data = append_val (data , kEnergy_Wh , dif_ff , dif_sn , "" , val , -3 + (vif_uam & 0x7 ));
526
+ data = append_val (data , kEnergy_Wh , dif_ff , dif_sn , "" , "" , val , -3 + (vif_uam & 0x7 ));
520
527
} else if ((vif_uam & 0xF8 ) == 0x08 ) {
521
528
// E000 1nnn Energy 10nnn J 0.001kJ to 10000kJ
522
- data = append_val (data , kEnergy_J , dif_ff , dif_sn , "" , val , vif_uam & 0x7 );
529
+ data = append_val (data , kEnergy_J , dif_ff , dif_sn , "" , "" , val , vif_uam & 0x7 );
523
530
} else if ((vif_uam & 0xF8 ) == 0x10 ) {
524
531
// E001 0nnn Volume 10nnn-6 m3 0.001l to 10000l
525
532
526
533
if (dif_sn == 0 ) {
527
- data = append_val (data , kVolume , dif_ff , dif_sn , "" , val , -6 + (vif_uam & 0x7 ));
534
+ data = append_val (data , kVolume , dif_ff , dif_sn , "" , "" , val , -6 + (vif_uam & 0x7 ));
528
535
} else
529
536
if (dif_sn >= 8 && dif_sn <= 19 ) {
530
537
dif_sn -= 8 ;
531
- data = append_val (data , kVolume , dif_ff , dif_sn , history_months [dif_sn ][1 ], val , -6 + (vif_uam & 0x7 ));
538
+ data = append_val (data , kVolume , dif_ff , dif_sn ,
539
+ history_months [dif_sn ][0 ], history_months [dif_sn ][1 ], val , -6 + (vif_uam & 0x7 ));
532
540
}
533
541
534
542
} else if ((vif_uam & 0xF8 ) == 0x18 ) {
535
543
// E001 1nnn Mass 10nnn-3 kg 0.001kg to 10000kg
536
- data = append_val (data , kEnergy_J , dif_ff , dif_sn , "" , val , -3 + (vif_uam & 0x7 ));
544
+ data = append_val (data , kEnergy_J , dif_ff , dif_sn , "" , "" , val , -3 + (vif_uam & 0x7 ));
537
545
} else if ((vif_uam & 0xFC ) == 0x20 ) {
538
546
/* E010 00nn On Time nn = 00 seconds
539
547
nn = 01 minutes
540
548
nn = 10 hours
541
549
nn = 11 days */
542
550
switch (vif_uam & 3 ) {
543
- case 0 : data = append_val (data , kOnTimeSec , dif_ff , dif_sn , "" , val , 0 ); break ;
544
- case 1 : data = append_val (data , kOnTimeMin , dif_ff , dif_sn , "" , val , 0 ); break ;
545
- case 2 : data = append_val (data , kOnTimeHours , dif_ff , dif_sn , "" , val , 0 ); break ;
546
- case 3 : data = append_val (data , kOnTimeDays , dif_ff , dif_sn , "" , val , 0 ); break ;
551
+ case 0 : data = append_val (data , kOnTimeSec , dif_ff , dif_sn , "" , "" , val , 0 ); break ;
552
+ case 1 : data = append_val (data , kOnTimeMin , dif_ff , dif_sn , "" , "" , val , 0 ); break ;
553
+ case 2 : data = append_val (data , kOnTimeHours , dif_ff , dif_sn , "" , "" , val , 0 ); break ;
554
+ case 3 : data = append_val (data , kOnTimeDays , dif_ff , dif_sn , "" , "" , val , 0 ); break ;
547
555
default : break ;
548
556
}
549
557
} else if ((vif_uam & 0xFC ) == 0x24 ) {
550
558
// E010 01nn Operating Time coded like OnTime
551
559
switch (vif_uam & 3 ) {
552
- case 0 : data = append_val (data , kOperTimeSec , dif_ff , dif_sn , "" , val , 0 ); break ;
553
- case 1 : data = append_val (data , kOperTimeMin , dif_ff , dif_sn , "" , val , 0 ); break ;
554
- case 2 : data = append_val (data , kOperTimeHours , dif_ff , dif_sn , "" , val , 0 ); break ;
555
- case 3 : data = append_val (data , kOperTimeDays , dif_ff , dif_sn , "" , val , 0 ); break ;
560
+ case 0 : data = append_val (data , kOperTimeSec , dif_ff , dif_sn , "" , "" , val , 0 ); break ;
561
+ case 1 : data = append_val (data , kOperTimeMin , dif_ff , dif_sn , "" , "" , val , 0 ); break ;
562
+ case 2 : data = append_val (data , kOperTimeHours , dif_ff , dif_sn , "" , "" , val , 0 ); break ;
563
+ case 3 : data = append_val (data , kOperTimeDays , dif_ff , dif_sn , "" , "" , val , 0 ); break ;
556
564
default : break ;
557
565
}
558
566
} else if ((vif_uam & 0xF8 ) == 0x28 ) {
559
567
// E010 1nnn Power 10nnn-3 W 0.001W to 10000W
560
- data = append_val (data , kPower_W , dif_ff , dif_sn , "" , val , -3 + (vif_uam & 0x7 ));
568
+ data = append_val (data , kPower_W , dif_ff , dif_sn , "" , "" , val , -3 + (vif_uam & 0x7 ));
561
569
} else if ((vif_uam & 0xF8 ) == 0x30 ) {
562
570
// E011 0nnn Power 10nnn J/h 0.001kJ/h to 10000kJ/h
563
- data = append_val (data , kPower_Jh , dif_ff , dif_sn , "" , val , vif_uam & 0x7 );
571
+ data = append_val (data , kPower_Jh , dif_ff , dif_sn , "" , "" , val , vif_uam & 0x7 );
564
572
} else if ((vif_uam & 0xF8 ) == 0x38 ) {
565
573
// E011 1nnn Volume Flow 10nnn-6 m3/h 0.001l/h to 10000l/h
566
- data = append_val (data , kVolumeFlow_h , dif_ff , dif_sn , "" , val , -6 + (vif_uam & 0x7 ));
574
+ data = append_val (data , kVolumeFlow_h , dif_ff , dif_sn , "" , "" , val , -6 + (vif_uam & 0x7 ));
567
575
} else if ((vif_uam & 0xF8 ) == 0x40 ) {
568
576
// E100 0nnn Volume Flow ext. 10nnn-7 m3/min 0.0001l/min to 1000l/min
569
- data = append_val (data , kVolumeFlow_min , dif_ff , dif_sn , "" , val , -7 + (vif_uam & 0x7 ));
577
+ data = append_val (data , kVolumeFlow_min , dif_ff , dif_sn , "" , "" , val , -7 + (vif_uam & 0x7 ));
570
578
} else if ((vif_uam & 0xF8 ) == 0x48 ) {
571
579
// E100 1nnn Volume Flow ext. 10nnn-9 m³/s 0.001ml/s to 10000ml/s
572
580
// in litres so exp -3
573
- data = append_val (data , kVolumeFlow_s , dif_ff , dif_sn , "" , val , -3 + (vif_uam & 0x7 ));
581
+ data = append_val (data , kVolumeFlow_s , dif_ff , dif_sn , "" , "" , val , -3 + (vif_uam & 0x7 ));
574
582
} else if ((vif_uam & 0xF8 ) == 0x50 ) {
575
583
// E101 0nnn Mass flow 10nnn-3 kg/h 0.001kg/h to 10000kg/h
576
- data = append_val (data , kMassFlow , dif_ff , dif_sn , "" , val , -3 + (vif_uam & 0x7 ));
584
+ data = append_val (data , kMassFlow , dif_ff , dif_sn , "" , "" , val , -3 + (vif_uam & 0x7 ));
577
585
} else if ((vif_uam & 0xFC ) == 0x58 ) {
578
586
// E101 10nn Flow Temperature 10nn-3 °C 0.001°C to 1°C
579
- data = append_val (data , kTemperatureFlow , dif_ff , dif_sn , "" , val , -3 + (vif_uam & 0x3 ));
587
+ data = append_val (data , kTemperatureFlow , dif_ff , dif_sn , "" , "" , val , -3 + (vif_uam & 0x3 ));
580
588
} else if ((vif_uam & 0xFC ) == 0x5C ) {
581
589
// E101 11nn Return Temperature 10nn-3 °C 0.001°C to 1°C
582
- data = append_val (data , kTemperatureReturn , dif_ff , dif_sn , "" , val , -3 + (vif_uam & 0x3 ));
590
+ data = append_val (data , kTemperatureReturn , dif_ff , dif_sn , "" , "" , val , -3 + (vif_uam & 0x3 ));
583
591
} else if ((vif_uam & 0xFC ) == 0x60 ) {
584
592
// E110 00nn Temperature Difference 10nn-3 K 1mK to 1000mK
585
- data = append_val (data , kTemperatureDiff , dif_ff , dif_sn , "" , val , -3 + (vif_uam & 0x3 ));
593
+ data = append_val (data , kTemperatureDiff , dif_ff , dif_sn , "" , "" , val , -3 + (vif_uam & 0x3 ));
586
594
} else if ((vif_uam & 0xFC ) == 0x64 ) {
587
595
// E110 01nn External temperature 10 nn-3 ° C 0.001 ° C to 1 ° C
588
- data = append_val (data , kTemperatureExtern , dif_ff , dif_sn , history_hours [dif_sn & 0x3 ], val , -3 + (vif_uam & 0x3 ));
596
+ data = append_val (data , kTemperatureExtern , dif_ff , dif_sn , "" , history_hours [dif_sn & 0x3 ], val , -3 + (vif_uam & 0x3 ));
589
597
} else if ((vif_uam & 0xFC ) == 0x68 ) {
590
598
// E110 10nn Pressure 10nn-3 bar 1mbar to 1000mbar
591
- data = append_val (data , kPressure , dif_ff , dif_sn , "" , val , -3 + (vif_uam & 0x3 ));
599
+ data = append_val (data , kPressure , dif_ff , dif_sn , "" , "" , val , -3 + (vif_uam & 0x3 ));
592
600
} else if ((vif_uam & 0xFE ) == 0x6C ) {
593
601
// E110 110n Time Point n = 0 date, n = 1 time & date
594
602
char buff_time [256 ] = {0 };
595
603
596
604
if (vif_uam & 1 ) {
597
605
if (m_bus_tm_decode (b , dif_coding , buff_time , sizeof (buff_time ))) {
598
- data = append_str (data , kTimeDate , dif_ff , dif_sn , "" , buff_time );
606
+ data = append_str (data , kTimeDate , dif_ff , dif_sn , "" , "" , buff_time );
599
607
}
600
608
} else {
601
609
if (m_bus_tm_decode (b , dif_coding , buff_time , sizeof (buff_time ))) {
602
- data = append_str (data , kDate , dif_ff , dif_sn , "" , buff_time );
610
+ data = append_str (data , kDate , dif_ff , dif_sn , "" , "" , buff_time );
603
611
}
604
612
}
605
613
606
614
} else if (vif_uam == 0x6E ) {
607
615
// E110 1110 Units for H.C.A. dimensionless
608
- data = append_val (data , kHca , dif_ff , dif_sn , "" , val , 0 );
616
+ data = append_val (data , kHca , dif_ff , dif_sn , "" , "" , val , 0 );
609
617
} else if ((vif_uam & 0xFC ) == 0x70 ) {
610
618
// E111 00nn Averaging Duration coded like OnTime
611
619
} else if ((vif_uam & 0xFC ) == 0x74 ) {
0 commit comments