Skip to content

Commit d7fdcaf

Browse files
committed
Added auto rolling handling code.
1 parent 362a4d1 commit d7fdcaf

File tree

5 files changed

+53
-7
lines changed

5 files changed

+53
-7
lines changed

src/codegen/c-main-generator.cpp

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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()));

src/codegen/fs-creator.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,10 @@ bool FsCreator::PrepareDirectory(std::string drvname, std::string basepath, bool
116116

117117
snprintf(_tmpb, kTmpLen, "%s_USE_CANSTRUCT", FS.DRVNAME.c_str());
118118
FS.usesruct_def = _tmpb;
119+
120+
snprintf(_tmpb, kTmpLen, "%s_AUTO_ROLL", FS.DRVNAME.c_str());
121+
FS.useroll_def = _tmpb;
122+
119123
}
120124

121125
return ret;

src/codegen/fs-creator.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ typedef struct
2626
std::string usesruct_def;
2727
std::string usemon_def;
2828
std::string usesigfloat_def;
29+
std::string useroll_def;
2930

3031
} FsDescriptor_t;
3132

src/parser/dbcscanner.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,13 @@ void DbcScanner::ParseOtherInfo(istream& readstrm)
146146
{
147147
// signal has been found, update commnet text
148148
msg->Signals[i].CommentText = cmmnt.Text;
149+
150+
// 1 test if signal is rolling
151+
if (cmmnt.Text.find("<RollingCounter>") != std::string::npos)
152+
{
153+
// set the RollSig to generate necessary code
154+
msg->RollSig = &msg->Signals[i];
155+
}
149156
}
150157
}
151158
}
@@ -244,4 +251,5 @@ void DbcScanner::SetDefualtMessage(MessageDescriptor_t* message)
244251
message->Signals.clear();
245252
message->Transmitter = "";
246253
message->hasPhys = false;
254+
message->RollSig = nullptr;
247255
}

src/types/message.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,9 @@ typedef struct
109109
// flag about having sigfloat fields
110110
bool hasPhys;
111111

112+
// pointer to rolling counter signal
113+
SignalDescriptor_t* RollSig;
114+
112115
// Message comment
113116
std::string CommentText;
114117

0 commit comments

Comments
 (0)