@@ -126,13 +126,30 @@ void CiMainGenerator::Gen_MainHeader()
126126 // Write section for bitfielded part
127127 fwriter->AppendLine (PrintF (" #ifdef %s" , fdesc->usebits_def .c_str ()), 2 );
128128
129+ SignalDescriptor_t rollsig;
130+
131+ if (m.RollSig != nullptr )
132+ {
133+ // rolling counter is detected
134+ rollsig = (*m.RollSig );
135+ rollsig.CommentText = " " ;
136+ rollsig.Name += " _expt" ;
137+ }
138+
129139 for (size_t signum = 0 ; signum < m.Signals .size (); signum++)
130140 {
131141 SignalDescriptor_t& sig = m.Signals [signum];
132142 // Write bit-fielded part
133143 WriteSigStructField (sig, true , max_sig_name_len);
134144 }
135145
146+ if (m.RollSig != nullptr )
147+ {
148+ fwriter->AppendLine (PrintF (" #ifdef %s" , fdesc->useroll_def .c_str ()), 2 );
149+ WriteSigStructField (rollsig, true , max_sig_name_len);
150+ fwriter->AppendLine (PrintF (" #endif // %s" , fdesc->useroll_def .c_str ()), 2 );
151+ }
152+
136153 // Write clean part
137154 fwriter->AppendLine (" #else" , 2 );
138155
@@ -143,6 +160,13 @@ void CiMainGenerator::Gen_MainHeader()
143160 WriteSigStructField (sig, false , max_sig_name_len);
144161 }
145162
163+ if (m.RollSig != nullptr )
164+ {
165+ fwriter->AppendLine (PrintF (" #ifdef %s" , fdesc->useroll_def .c_str ()), 2 );
166+ WriteSigStructField (rollsig, false , max_sig_name_len);
167+ fwriter->AppendLine (PrintF (" #endif // %s" , fdesc->useroll_def .c_str ()), 2 );
168+ }
169+
146170 fwriter->AppendLine (PrintF (" #endif // %s" , fdesc->usebits_def .c_str ()), 2 );
147171
148172 // start mon1 section
@@ -422,16 +446,22 @@ void CiMainGenerator::WriteUnpackBody(const CiExpr_t* sgs)
422446
423447 fwriter->AppendLine (" // check DLC correctness" );
424448 fwriter->AppendLine (PrintF (" _m->mon1.dlc_error = (dlc_ < %s_DLC);" , sgs->msg .Name .c_str ()));
425-
426-
427- // TODO: put CRC and ROLLING COUNTER tests here
428- // 1
429- // 2
430-
431-
432449 fwriter->AppendLine (" _m->mon1.last_cycle = GetSysTick();" );
433450 fwriter->AppendLine (" _m->mon1.frame_cnt++;" , 2 );
434451
452+ if (sgs->msg .RollSig != nullptr )
453+ {
454+ // Put rolling monitor here
455+ fwriter->AppendLine (PrintF (" #ifdef %s" , fdesc->useroll_def .c_str ()), 2 );
456+ fwriter->AppendLine (PrintF (" _m->mon1.roll_error = (_m->%s != _m->%s_expt);" ,
457+ sgs->msg .RollSig ->Name .c_str (), sgs->msg .RollSig ->Name .c_str ()));
458+ fwriter->AppendLine (PrintF (" _m->%s_expt = (_m->%s + 1) & (0x%02XU);" , sgs->msg .RollSig ->Name .c_str (),
459+ sgs->msg .RollSig ->Name .c_str (), (1 << sgs->msg .RollSig ->LengthBit ) - 1 ), 2 );
460+ // Put rolling monitor here
461+ fwriter->AppendLine (PrintF (" #ifdef // %s" , fdesc->useroll_def .c_str ()), 2 );
462+ }
463+
464+
435465 auto Fmon_func = " FMon_" + sgs->msg .Name + " _" + fdesc->drvname ;
436466
437467 fwriter->AppendLine (PrintF (" %s(&_m->mon1);" , Fmon_func.c_str ()));
0 commit comments