Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 39 additions & 9 deletions datenbasis.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ void add_frame(struct frame_struct **db, canid_t canID, char *frameName) {
s->canID = canID;
s->signals = NULL;
strcpy(s->name, frameName);
s->isMultiplexed = 0;
s->isMultiplexed = 0;
HASH_ADD_INT( *db, canID, s );
}

Expand Down Expand Up @@ -60,7 +60,7 @@ void add_signal(struct frame_struct *db, int frameId, char *signalName, int star
struct signal_struct *newSignal;

frame = find_frame(db, frameId);

newSignal = malloc(sizeof(struct signal_struct));
strcpy(newSignal->name, signalName);
newSignal->startBit = startBit;
Expand All @@ -71,15 +71,15 @@ void add_signal(struct frame_struct *db, int frameId, char *signalName, int star
newSignal->offset = offset;
newSignal->min = min;
newSignal->max = max;


if(isMultiplexer > 0)
{
frame->isMultiplexed = 1;
}
newSignal->isMultiplexer = isMultiplexer;
newSignal->muxId = muxId;

strcpy(newSignal->unit, unit);
strcpy(newSignal->receiverList, receiverList);

Expand Down Expand Up @@ -110,7 +110,7 @@ int readInDatabase(struct frame_struct **db, char *Filename)
{
if(sscanf(line," BO_ %d %s %d %s",&frameId,frameName,&len,sender) == 4)
{
frameName[strlen(frameName)-1] = 0;
frameName[strlen(frameName)-1] = 0;
add_frame(db, frameId, frameName);
}
else if(sscanf(line," SG_ %s : %d|%d@%d%c (%f,%f) [%f|%f] %s %s",signalName, &startBit, &signalLength,&byteOrder, &signedState, &factor, &offset, &min, &max, unit, receiverList ) > 5)
Expand All @@ -131,7 +131,7 @@ int readInDatabase(struct frame_struct **db, char *Filename)
startBit = cpos + (bytes * 8) + (int)(startBit/8) * 8;
}
}
add_signal(*db, frameId, signalName, startBit, signalLength, byteOrder == 0, signedState == '-', factor, offset, min, max, unit, receiverList, 0,0);
add_signal(*db, frameId, signalName, startBit, signalLength, byteOrder == 0, signedState == '-', factor, offset, min, max, unit, receiverList, 0,0);
}
else if(sscanf(line," SG_ %s %s : %d|%d@%d%c (%f,%f) [%f|%f] %s %s",signalName, mux, &startBit, &signalLength,&byteOrder, &signedState, &factor, &offset, &min, &max, unit, receiverList ) > 5)
{
Expand Down Expand Up @@ -159,10 +159,40 @@ int readInDatabase(struct frame_struct **db, char *Filename)
{
sscanf(mux, "m%d", &muxId);
add_signal(*db, frameId, signalName, startBit, signalLength, byteOrder == 0, signedState == '-', factor, offset, min, max, unit, receiverList, 2, muxId);

}

}
}
return 0;
}

void releaseResource(struct frame_struct **db)
{
struct frame_struct *frame;
struct signal_struct *signals;
for (frame = *db; frame != NULL;)
{
struct frame_struct *temp = frame;
frame = (struct frame_struct *)frame->hh.next;
// free or delete
for (signals = temp->signals; signals != NULL;)
{
struct signal_struct *signal_temp = signals;
signals = (struct signal_struct *)signals->hh.next;

HASH_DEL(temp->signals, signal_temp);
free(signal_temp);
signal_temp = NULL;
}

HASH_DEL(*db, temp);
free(temp->signals);
temp->signals = NULL;
free(temp);
temp = NULL;
}

free(*db);
*db = NULL;
}
4 changes: 2 additions & 2 deletions datenbasis.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ struct signal_struct {
char receiverList[512];
__u8 isMultiplexer;
__u8 muxId;

__u8 number;
UT_hash_handle hh;
};
Expand All @@ -46,4 +46,4 @@ struct signal_struct *find_signal_by_name(struct frame_struct *frame, char *name
struct frame_struct *find_frame_by_signalname(struct frame_struct *db, char *name);
void add_signal(struct frame_struct *db, int frameId, char *signalName, int startBit, int signalLength, int byteOrder, int signedState, float factor, float offset, float min, float max, char *unit, char *receiverList, unsigned char isMultiplexer, unsigned char muxId);
int readInDatabase(struct frame_struct **db, char *Filename);

void releaseResource(struct frame_struct **db);
15 changes: 12 additions & 3 deletions main.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ int main(int argc, char **argv)
struct frame_struct *myFrame;
struct timeval tv;

int res = 0;

if (argc < 2)
{
fprintf(stderr, "Usage:\n");
Expand Down Expand Up @@ -64,6 +66,7 @@ int main(int argc, char **argv)
if (!myFrame)
{
fprintf(stderr, "Error finding Frame %s\n", frameName);
releaseResource(&dataBase);
exit(1);
}

Expand All @@ -73,6 +76,7 @@ int main(int argc, char **argv)
if (!mySignal)
{
fprintf(stderr, "Error finding Signal %s\n", signalName);
releaseResource(&dataBase);
exit(1);
}
}
Expand All @@ -98,15 +102,20 @@ int main(int argc, char **argv)
ascframe) != 4)
{
fprintf(stderr, "incorrect line format in logfile\n");
return 1;
res = 1;
goto err;
}

if (parse_canframe(ascframe, &cf))
{
return 1;
res = 1;
goto err;
}
processFrame(callbackList, &cf, tv, device);
}

return 0;
err:
releaseSignalCallbackResource(&callbackList);
releaseResource(&dataBase);
return res;
}
18 changes: 18 additions & 0 deletions processFrame.c
Original file line number Diff line number Diff line change
Expand Up @@ -105,4 +105,22 @@ void processFrame(struct signal_callback_list *callbackList, struct can_frame *c
}
}

void releaseSignalCallbackResource(struct signal_callback_list **cb_list)
{
struct signal_callback_list *signal_cb;
for (signal_cb = *cb_list; signal_cb != NULL;)
{
struct signal_callback_list *signal_cb_temp = signal_cb;
signal_cb = (struct signal_callback_list *)signal_cb->hh.next;

signal_cb_temp->frame = NULL;
signal_cb_temp->signal = NULL;
signal_cb_temp->callback = 0;
signal_cb_temp->rawValue = 0;
signal_cb_temp->onChange = 0;

HASH_DEL(*cb_list, signal_cb_temp);
free(signal_cb_temp);
signal_cb_temp = NULL;
}
}
6 changes: 4 additions & 2 deletions processFrame.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,12 @@ struct signal_callback_list {
UT_hash_handle hh;
};

void add_callback(struct signal_callback_list **callbackList,
void add_callback(struct signal_callback_list **callbackList,
struct frame_struct *frame, struct signal_struct *signal,
void (*callback)(char *, __u64, double, struct timeval, char *device), __u8 onChange);

void processFrame(struct signal_callback_list *callbackList, struct can_frame *cf, struct timeval tv, char *device);

void releaseSignalCallbackResource(struct signal_callback_list **cb_list);

#endif