c-coderdbc icon indicating copy to clipboard operation
c-coderdbc copied to clipboard

Fix multiplex sig unpack

Open calumroy opened this issue 6 months ago • 2 comments

Fixes issues #33.

The generated code now only unpacks the correct multiplex signals associated with the mutliplex master value. These changes do not affect CAN messages that have no mutliplex values. They also don't affect the decoding of unmultiplex signals or the multiplex master signal in a CAN message.

A comparison of decoding the following CAN msg below is shown:

BO_ 1096 MUX_SIG_TEST1: 8 MCU
 SG_ mux8_sig1 m8 : 8|8@1+ (1,0) [1|3] ""  VMU
 SG_ mux8_sig2 m8 : 16|15@1+ (0.125,0) [0|4090] "V"  VMU
 SG_ mux7_sig1 m7 : 8|8@1+ (1,0) [1|3] ""  VMU
 SG_ mux7_sig2 m7 : 16|15@1+ (0.125,0) [0|4090] "V"  VMU
 SG_ mux6_sig1 m6 : 8|48@1+ (1,0) [0|0] ""  VMU
 SG_ mux0_sig1 m0 : 32|8@1+ (1,0) [0|0] ""  VMU
 SG_ mux0_sig2 m0 : 24|8@1+ (1,0) [0|0] ""  VMU
 SG_ mux5_sig1 m5 : 8|48@1+ (1,0) [0|0] ""  VMU
 SG_ mux4_sig4 m4 : 8|32@1+ (1,0) [0|0] ""  VMU
 SG_ mux4_sig3 m3 : 24|16@1+ (1,0) [0|0] ""  VMU
 SG_ mux0_sig3 m0 : 16|8@1+ (1,0) [0|0] ""  VMU
 SG_ mux0_sig4 m0 : 8|8@1+ (1,0) [0|0] ""  VMU
 SG_ mux2_sig1 m2 : 8|16@1+ (1,-32767) [0|32760] "RPM"  VMU
 SG_ mux1_sig1 m1 : 8|15@1+ (0.125,0) [0|4090] "Nm"  VMU
 SG_ mux3_sig1 m3 : 16|8@1+ (1,0) [0|0] ""  VMU
 SG_ mux3_sig2 m3 : 8|8@1+ (1,0) [0|0] ""  VMU
 SG_ mux_master M : 0|7@1+ (1,0) [0|0] ""  VMU
 SG_ signal1 : 7|1@1+ (1,0) [0|0] ""  VMU

Before this fix the following was generated.

uint32_t Unpack_MUX_SIG_TEST1_testdb(MUX_SIG_TEST1_t* _m, const uint8_t* _d, uint8_t dlc_)
{
 (void)dlc_;
 _m->mux_master = (uint8_t) ( (_d[0] & (0x7FU)) );
 _m->signal1 = (uint8_t) ( ((_d[0] >> 7U) & (0x01U)) );
 _m->mux8_sig1 = (uint8_t) ( (_d[1] & (0xFFU)) );
 _m->mux7_sig1 = (uint8_t) ( (_d[1] & (0xFFU)) );
 _m->mux6_sig1 = (uint64_t) ( ((uint64_t)(_d[6] & (0xFFU)) << 40U) | ((uint64_t)(_d[5] & (0xFFU)) << 32U) | ((_d[4] & (0xFFU)) << 24U) | ((_d[3] & (0xFFU)) << 16U) | ((_d[2] & (0xFFU)) << 8U) | (_d[1] & (0xFFU)) );
 _m->mux3_sig2 = (uint8_t) ( (_d[1] & (0xFFU)) );
 _m->mux5_sig1 = (uint64_t) ( ((uint64_t)(_d[6] & (0xFFU)) << 40U) | ((uint64_t)(_d[5] & (0xFFU)) << 32U) | ((_d[4] & (0xFFU)) << 24U) | ((_d[3] & (0xFFU)) << 16U) | ((_d[2] & (0xFFU)) << 8U) | (_d[1] & (0xFFU)) );
 _m->mux4_sig4 = (uint32_t) ( ((_d[4] & (0xFFU)) << 24U) | ((_d[3] & (0xFFU)) << 16U) | ((_d[2] & (0xFFU)) << 8U) | (_d[1] & (0xFFU)) );
 _m->mux1_sig1_ro = (uint16_t) ( ((_d[2] & (0x7FU)) << 8U) | (_d[1] & (0xFFU)) );
#ifdef TESTDB_USE_SIGFLOAT
 _m->mux1_sig1_phys = (sigfloat_t)(TESTDB_mux1_sig1_ro_fromS(_m->mux1_sig1_ro));
#endif // TESTDB_USE_SIGFLOAT

 _m->mux0_sig4 = (uint8_t) ( (_d[1] & (0xFFU)) );
 _m->mux2_sig1_ro = (uint16_t) ( ((_d[2] & (0xFFU)) << 8U) | (_d[1] & (0xFFU)) );
#ifdef TESTDB_USE_SIGFLOAT
 _m->mux2_sig1_phys = (int32_t) TESTDB_mux2_sig1_ro_fromS(_m->mux2_sig1_ro);
#endif // TESTDB_USE_SIGFLOAT

 _m->mux8_sig2_ro = (uint16_t) ( ((_d[3] & (0x7FU)) << 8U) | (_d[2] & (0xFFU)) );
#ifdef TESTDB_USE_SIGFLOAT
 _m->mux8_sig2_phys = (sigfloat_t)(TESTDB_mux8_sig2_ro_fromS(_m->mux8_sig2_ro));
#endif // TESTDB_USE_SIGFLOAT

 _m->mux3_sig1 = (uint8_t) ( (_d[2] & (0xFFU)) );
 _m->mux0_sig3 = (uint8_t) ( (_d[2] & (0xFFU)) );
 _m->mux7_sig2_ro = (uint16_t) ( ((_d[3] & (0x7FU)) << 8U) | (_d[2] & (0xFFU)) );
#ifdef TESTDB_USE_SIGFLOAT
 _m->mux7_sig2_phys = (sigfloat_t)(TESTDB_mux7_sig2_ro_fromS(_m->mux7_sig2_ro));
#endif // TESTDB_USE_SIGFLOAT

 _m->mux4_sig3 = (uint16_t) ( ((_d[4] & (0xFFU)) << 8U) | (_d[3] & (0xFFU)) );
 _m->mux0_sig2 = (uint8_t) ( (_d[3] & (0xFFU)) );
 _m->mux0_sig1 = (uint8_t) ( (_d[4] & (0xFFU)) );

#ifdef TESTDB_USE_DIAG_MONITORS
 _m->mon1.dlc_error = (dlc_ < MUX_SIG_TEST1_DLC);
 _m->mon1.last_cycle = GetSystemTick();
 _m->mon1.frame_cnt++;

 FMon_MUX_SIG_TEST1_testdb(&_m->mon1, MUX_SIG_TEST1_CANID);
#endif // TESTDB_USE_DIAG_MONITORS

 return MUX_SIG_TEST1_CANID;
}

After this fix it now generates this Unpack function:

uint32_t Unpack_MUX_SIG_TEST1_testdb(MUX_SIG_TEST1_t* _m, const uint8_t* _d, uint8_t dlc_)
{
  (void)dlc_;
  _m->mux_master = (uint8_t) ( (_d[0] & (0x7FU)) );
  _m->signal1 = (uint8_t) ( ((_d[0] >> 7U) & (0x01U)) );
  if (_m->mux_master == 8) {
    _m->mux8_sig1 = (uint8_t) ( (_d[1] & (0xFFU)) );
  }
  if (_m->mux_master == 7) {
    _m->mux7_sig1 = (uint8_t) ( (_d[1] & (0xFFU)) );
  }
  if (_m->mux_master == 6) {
    _m->mux6_sig1 = (uint64_t) ( ((uint64_t)(_d[6] & (0xFFU)) << 40U) | ((uint64_t)(_d[5] & (0xFFU)) << 32U) | ((_d[4] & (0xFFU)) << 24U) | ((_d[3] & (0xFFU)) << 16U) | ((_d[2] & (0xFFU)) << 8U) | (_d[1] & (0xFFU)) );
  }
  if (_m->mux_master == 3) {
    _m->mux3_sig2 = (uint8_t) ( (_d[1] & (0xFFU)) );
  }
  if (_m->mux_master == 5) {
    _m->mux5_sig1 = (uint64_t) ( ((uint64_t)(_d[6] & (0xFFU)) << 40U) | ((uint64_t)(_d[5] & (0xFFU)) << 32U) | ((_d[4] & (0xFFU)) << 24U) | ((_d[3] & (0xFFU)) << 16U) | ((_d[2] & (0xFFU)) << 8U) | (_d[1] & (0xFFU)) );
  }
  if (_m->mux_master == 4) {
    _m->mux4_sig4 = (uint32_t) ( ((_d[4] & (0xFFU)) << 24U) | ((_d[3] & (0xFFU)) << 16U) | ((_d[2] & (0xFFU)) << 8U) | (_d[1] & (0xFFU)) );
  }
  if (_m->mux_master == 1) {
    _m->mux1_sig1_ro = (uint16_t) ( ((_d[2] & (0x7FU)) << 8U) | (_d[1] & (0xFFU)) );
#ifdef TESTDB_USE_SIGFLOAT
    _m->mux1_sig1_phys = (sigfloat_t)(TESTDB_mux1_sig1_ro_fromS(_m->mux1_sig1_ro));
#endif // TESTDB_USE_SIGFLOAT

  }
  if (_m->mux_master == 0) {
    _m->mux0_sig4 = (uint8_t) ( (_d[1] & (0xFFU)) );
  }
  if (_m->mux_master == 2) {
    _m->mux2_sig1_ro = (uint16_t) ( ((_d[2] & (0xFFU)) << 8U) | (_d[1] & (0xFFU)) );
#ifdef TESTDB_USE_SIGFLOAT
    _m->mux2_sig1_phys = (int32_t) TESTDB_mux2_sig1_ro_fromS(_m->mux2_sig1_ro);
#endif // TESTDB_USE_SIGFLOAT

  }
  if (_m->mux_master == 8) {
    _m->mux8_sig2_ro = (uint16_t) ( ((_d[3] & (0x7FU)) << 8U) | (_d[2] & (0xFFU)) );
#ifdef TESTDB_USE_SIGFLOAT
    _m->mux8_sig2_phys = (sigfloat_t)(TESTDB_mux8_sig2_ro_fromS(_m->mux8_sig2_ro));
#endif // TESTDB_USE_SIGFLOAT

  }
  if (_m->mux_master == 3) {
    _m->mux3_sig1 = (uint8_t) ( (_d[2] & (0xFFU)) );
  }
  if (_m->mux_master == 0) {
    _m->mux0_sig3 = (uint8_t) ( (_d[2] & (0xFFU)) );
  }
  if (_m->mux_master == 7) {
    _m->mux7_sig2_ro = (uint16_t) ( ((_d[3] & (0x7FU)) << 8U) | (_d[2] & (0xFFU)) );
#ifdef TESTDB_USE_SIGFLOAT
    _m->mux7_sig2_phys = (sigfloat_t)(TESTDB_mux7_sig2_ro_fromS(_m->mux7_sig2_ro));
#endif // TESTDB_USE_SIGFLOAT

  }
  if (_m->mux_master == 3) {
    _m->mux4_sig3 = (uint16_t) ( ((_d[4] & (0xFFU)) << 8U) | (_d[3] & (0xFFU)) );
  }
  if (_m->mux_master == 0) {
    _m->mux0_sig2 = (uint8_t) ( (_d[3] & (0xFFU)) );
  }
  if (_m->mux_master == 0) {
    _m->mux0_sig1 = (uint8_t) ( (_d[4] & (0xFFU)) );
  }

#ifdef TESTDB_USE_DIAG_MONITORS
  _m->mon1.dlc_error = (dlc_ < MUX_SIG_TEST1_DLC);
  _m->mon1.last_cycle = GetSystemTick();
  _m->mon1.frame_cnt++;

  FMon_MUX_SIG_TEST1_testdb(&_m->mon1, MUX_SIG_TEST1_CANID);
#endif // TESTDB_USE_DIAG_MONITORS

  return MUX_SIG_TEST1_CANID;
}

calumroy avatar Aug 15 '24 02:08 calumroy