Skip to content

Commit 14f7017

Browse files
committed
Added part of main .h file writer. Added filewriter.
1 parent 7b13500 commit 14f7017

File tree

4 files changed

+284
-50
lines changed

4 files changed

+284
-50
lines changed

src/codegen/c-main-generator.cpp

Lines changed: 205 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,41 +5,223 @@
55
#include <cstdlib>
66
#include <filesystem>
77
#include <algorithm>
8+
#include <regex>
89

910
#include "c-main-generator.h"
1011

1112
static const size_t kMaxDirNum = 1000;
1213

1314
static const size_t kWBUFF_len = 2048;
14-
static char wbuff[kWBUFF_len] = { 0 };
15+
static char wbuff[kWBUFF_len] = {0};
16+
17+
static std::string __typeprint[] =
18+
{
19+
"int8_t",
20+
"int16_t",
21+
"int32_t",
22+
"int64_t",
23+
"uint8_t",
24+
"uint16_t",
25+
"uint32_t",
26+
"uint64_t"
27+
};
28+
29+
std::string str_toupper(std::string s)
30+
{
31+
std::transform(s.begin(), s.end(), s.begin(),
32+
[](unsigned char c)
33+
{
34+
return std::toupper(c);
35+
});
36+
return s;
37+
}
1538

1639
CiMainGenerator::CiMainGenerator()
1740
{
1841
sigprt = new CSigPrinter;
42+
fwriter = new FileWriter;
1943
}
2044

21-
void CiMainGenerator::Generate(std::vector<MessageDescriptor_t*>& msgs, std::string drvname, std::string dirpath)
45+
void CiMainGenerator::Generate(std::vector<MessageDescriptor_t*>& msgs,
46+
std::string drvname,
47+
std::string dirpath)
2248
{
23-
// Load income messages to sig printer
49+
// Load income messages to sig printer
2450
sigprt->LoadMessages(msgs);
2551

2652
std::sort(sigprt->sigs_expr.begin(), sigprt->sigs_expr.end(),
27-
[](const CiExpr_t* a, const CiExpr_t* b) -> bool
28-
{
29-
return a->msg.MsgID < b->msg.MsgID;
30-
});
53+
[](const CiExpr_t* a, const CiExpr_t* b) -> bool
54+
{
55+
return a->msg.MsgID < b->msg.MsgID;
56+
});
57+
58+
auto dirok = SetFinalPath(dirpath);
59+
60+
if (!dirok)
61+
{
62+
// TODO: handle error if directory cannot be used
63+
}
64+
65+
SetCommonValues(drvname);
66+
67+
// work_dir_path has the base dir path to gen files
68+
mhead.dir = work_dir_path;
69+
mhead.fname = drvname + ".h";
70+
mhead.fpath = mhead.dir + "/" + mhead.fname;
3171

32-
SetFinalPath(dirpath);
3372
// 1 step is to define final directory for source code bunch
73+
fwriter->AppendLine("#pragma once", 3);
74+
fwriter->AppendLine("#ifdef __cplusplus\nextern \"C\" {\n#endif", 2);
75+
fwriter->AppendLine("#include <stdint.h>");
76+
77+
for (size_t num = 0; num < sigprt->sigs_expr.size(); num++)
78+
{
79+
// write message typedef s and additional expressions
80+
MessageDescriptor_t& m = sigprt->sigs_expr[num]->msg;
81+
82+
snprintf(wbuff, kWBUFF_len, "// def @%s CAN Message (%-4d %#x)", m.Name.c_str(), m.MsgID, m.MsgID);
83+
fwriter->AppendLine(wbuff);
84+
snprintf(wbuff, kWBUFF_len, "#define %s_IDE (%uU)", m.Name.c_str(), m.IsExt);
85+
fwriter->AppendLine(wbuff);
86+
snprintf(wbuff, kWBUFF_len, "#define %s_DLC (%uU)", m.Name.c_str(), m.DLC);
87+
fwriter->AppendLine(wbuff);
88+
snprintf(wbuff, kWBUFF_len, "#define %s_CANID (%#x)", m.Name.c_str(), m.MsgID);
89+
fwriter->AppendLine(wbuff);
90+
91+
if (m.Cycle > 0)
92+
{
93+
snprintf(wbuff, kWBUFF_len, "#define %s_CYC (%dU)", m.Name.c_str(), m.Cycle);
94+
fwriter->AppendLine(wbuff);
95+
}
96+
97+
if (m.CommentText.size() > 0)
98+
{
99+
fwriter->AppendLine("// -- " + m.CommentText);
100+
}
101+
102+
size_t max_sig_name_len = 27;
103+
104+
for (size_t signum = 0; signum < m.Signals.size(); signum++)
105+
{
106+
SignalDescriptor_t& s = m.Signals[signum];
107+
108+
// TODO: print signal to_S and from_S definitions if necessary
109+
//string ret = cprint.PrintSignalPackExpression(sig, msg.MessageName);
110+
111+
//if (ret != null)
112+
//{
113+
// fwriter->AppendLine(ret);
114+
//}
115+
if (s.Name.size() > max_sig_name_len)
116+
max_sig_name_len = s.Name.size();
117+
}
118+
119+
snprintf(wbuff, kWBUFF_len, "typedef struct");
120+
fwriter->AppendLine(wbuff);
121+
122+
fwriter->AppendLine("{\n");
123+
124+
// Write section for bitfielded part
125+
snprintf(wbuff, kWBUFF_len, "#ifdef %s", usebits_str.c_str());
126+
fwriter->AppendLine(wbuff, 2);
127+
128+
for (size_t signum = 0; signum < m.Signals.size(); signum++)
129+
{
130+
SignalDescriptor_t& sig = m.Signals[signum];
131+
// Write bit-fielded part
132+
WriteSigStructField(sig, true, max_sig_name_len);
133+
}
134+
135+
// Write clean part
136+
fwriter->AppendLine("#else", 2);
137+
138+
for (size_t signum = 0; signum < m.Signals.size(); signum++)
139+
{
140+
SignalDescriptor_t& sig = m.Signals[signum];
141+
// Write clean signals
142+
WriteSigStructField(sig, false, max_sig_name_len);
143+
}
144+
145+
snprintf(wbuff, kWBUFF_len, "#endif // %s", usebits_str.c_str());
146+
fwriter->AppendLine(wbuff, 2);
34147

148+
//if (CodeSett.Code.UseMonitors == 1)
149+
// fwriter->AppendLine(" FrameMonitor_t mon1;");
150+
151+
snprintf(wbuff, kWBUFF_len, "} %s_t;", m.Name.c_str());
152+
fwriter->AppendLine(wbuff, 2);
153+
//fwriter->AppendLine("} " + msg.MessageName + "_t;");
154+
//fwriter->AppendLine();
155+
}
156+
157+
fwriter->AppendLine("#ifdef __cplusplus\n}\n#endif");
158+
fwriter->Flush(mhead.fpath);
35159
// 2 step is to print main head file
36-
160+
37161
// 3 step is to print main source file
38162

39163
// 4 step is to pring fmon head file
40164

41165
// 5 step is to print fmon source file
166+
}
167+
168+
void CiMainGenerator::WriteSigStructField(const SignalDescriptor_t& sig, bool bits, size_t padwidth)
169+
{
170+
if (sig.CommentText.size() > 0)
171+
{
172+
fwriter->AppendLine(" // " + std::regex_replace(sig.CommentText, std::regex("\n"), "\n // "));
173+
}
174+
175+
if (sig.ValueText.size() > 0)
176+
{
177+
fwriter->AppendLine(" // " + std::regex_replace(sig.ValueText, std::regex("\n"), "\n // "));
178+
}
179+
180+
std::string dtype = "";
181+
182+
dtype += " " + __typeprint[(int)sig.Type] + " " + sig.Name;
183+
184+
if (bits && (sig.LengthBit < 8))
185+
{
186+
snprintf(wbuff, kWBUFF_len, " : %d", sig.LengthBit);
187+
dtype += wbuff;
188+
}
189+
190+
dtype += ";";
191+
192+
std::string pad = " ";
193+
194+
dtype += pad.insert(0, padwidth + 16 - dtype.size(), ' ');
42195

196+
fwriter->AppendText(dtype);
197+
198+
pad = " // ";
199+
pad += (sig.Signed) ? " [-]" : " ";
200+
201+
fwriter->AppendText(pad);
202+
203+
snprintf(wbuff, kWBUFF_len, " Bits=%2d", sig.LengthBit);
204+
fwriter->AppendText(wbuff);
205+
206+
if (sig.Unit.size() > 0)
207+
{
208+
snprintf(wbuff, kWBUFF_len, " Unit:'%-13s'", sig.Unit.c_str());
209+
fwriter->AppendText(wbuff);
210+
}
211+
212+
if (sig.Offset != 0)
213+
{
214+
snprintf(wbuff, kWBUFF_len, " Offset= %-18f", sig.Offset);
215+
fwriter->AppendText(wbuff);
216+
}
217+
218+
if (sig.Factor != 1)
219+
{
220+
snprintf(wbuff, kWBUFF_len, " Factor= %-15d", sig.LengthBit);
221+
fwriter->AppendText(wbuff);
222+
}
223+
224+
fwriter->AppendLine("", 2);
43225
}
44226

45227
bool CiMainGenerator::SetFinalPath(std::string dirpath)
@@ -73,3 +255,17 @@ bool CiMainGenerator::SetFinalPath(std::string dirpath)
73255

74256
return true;
75257
}
258+
259+
void CiMainGenerator::SetCommonValues(const std::string& drvname)
260+
{
261+
DRVNAME = str_toupper(drvname);
262+
263+
snprintf(wbuff, kWBUFF_len, "%s_USE_BITS_SIGNAL", DRVNAME.c_str());
264+
usebits_str = wbuff;
265+
266+
snprintf(wbuff, kWBUFF_len, "%s_USE_DIAG_MONITORS", DRVNAME.c_str());
267+
usediag_str = wbuff;
268+
269+
snprintf(wbuff, kWBUFF_len, "%s_USE_CANSTRUCT", DRVNAME.c_str());
270+
canframe_str = wbuff;
271+
}

src/codegen/c-main-generator.h

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,42 @@
22

33
#include <stdint.h>
44
#include "c-sigprinter.h"
5+
#include "filewriter.h"
56
#include "../types/message.h"
7+
#include "../types/outfile.h"
68

7-
class CiMainGenerator
8-
{
9-
public:
10-
CiMainGenerator();
9+
class CiMainGenerator {
10+
public:
11+
CiMainGenerator();
1112

12-
void Generate(std::vector<MessageDescriptor_t*>& msgs, std::string drvname, std::string dirpath);
13+
void Generate(std::vector<MessageDescriptor_t*>& msgs, std::string drvname, std::string dirpath);
1314

14-
private:
15-
16-
bool SetFinalPath(std::string dirpath);
15+
private:
16+
bool SetFinalPath(std::string dirpath);
1717

18-
private:
18+
void SetCommonValues(const std::string& drvname);
1919

20-
std::string work_dir_path;
21-
22-
std::string workstr;
20+
void WriteSigStructField(const SignalDescriptor_t& sig, bool bitfield, size_t pad);
2321

24-
CSigPrinter* sigprt;
22+
private:
23+
std::string work_dir_path;
2524

25+
std::string workstr;
26+
27+
std::string DRVNAME;
28+
29+
std::string usebits_str;
30+
std::string usediag_str;
31+
std::string canframe_str;
32+
33+
std::vector<std::string> tmpvect;
34+
35+
CSigPrinter* sigprt;
36+
37+
FileWriter* fwriter;
38+
39+
OutFileDescriptor_t mhead;
40+
OutFileDescriptor_t mcode;
41+
OutFileDescriptor_t fhead;
42+
OutFileDescriptor_t fcode;
2643
};

src/codegen/filewriter.cpp

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,57 @@
1+
#include <iostream>
2+
#include <fstream>
13
#include "filewriter.h"
24

5+
6+
FileWriter::FileWriter()
7+
{
8+
}
9+
10+
FileWriter::~FileWriter()
11+
{
12+
}
13+
314
void FileWriter::Flush()
415
{
5-
strm.clear();
16+
strm.clear();
617
}
718

8-
void FileWriter::AppendText(const char* text, size_t len)
19+
void FileWriter::Flush(const std::string& fpath)
920
{
10-
strm.write(text, len);
21+
std::ofstream wfile;
22+
23+
wfile.open(fpath, std::ios::out);
24+
25+
wfile << strm.rdbuf();
26+
27+
wfile.close();
28+
29+
Flush();
1130
}
1231

13-
void FileWriter::AppendLine(const char* text, size_t len)
32+
void FileWriter::AppendText(const char* text)
1433
{
15-
AppendText(text, len);
16-
AppendText("\n", 1);
34+
std::string str = text;
35+
AppendText(str);
36+
}
37+
38+
void FileWriter::AppendLine(const char* text, int32_t post_empty_lines)
39+
{
40+
AppendText(text);
41+
42+
for (int32_t i = 0; i < post_empty_lines; i++)
43+
AppendText("\n");
1744
}
1845

1946

2047
void FileWriter::AppendText(const std::string& str)
2148
{
22-
strm.str(str);
49+
strm << str;
2350
}
2451

2552
void FileWriter::AppendLine(const std::string& str)
2653
{
27-
AppendText(str);
28-
AppendText("\n", 1);
54+
AppendText(str);
55+
AppendText("\n");
2956
}
3057

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy