From 4629e6f29b1cee9e194fa4ae7dc57530a8ee92e4 Mon Sep 17 00:00:00 2001 From: Mingfei Date: Sat, 27 Apr 2019 12:21:05 -0400 Subject: [PATCH 01/25] Timestamped_Frame struct --- src/static.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/static.h b/src/static.h index a79591e..c6d9977 100644 --- a/src/static.h +++ b/src/static.h @@ -3,6 +3,7 @@ #include #include +#include typedef struct { uint32_t id; @@ -11,6 +12,11 @@ typedef struct { bool extended; } Frame; +typedef struct { + Frame frame; + time_t timestamp; +} Timestamped_Frame; + #define LIMIT(name) \ static Time_T last_sent = 0; \ if (HAL_GetTick() - last_sent < name ## _period) return; \ From 20f88aa1b7c4a11d814281466bba089f927a33f8 Mon Sep 17 00:00:00 2001 From: Mingfei Date: Sat, 27 Apr 2019 12:45:02 -0400 Subject: [PATCH 02/25] Generate timestamped structs --- generator/bus.py | 2 +- generator/structs.py | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/generator/bus.py b/generator/bus.py index dfa0fbd..8be89ce 100644 --- a/generator/bus.py +++ b/generator/bus.py @@ -20,7 +20,7 @@ def write(can, computers, output_path=bus_path): raw_buses = set() for computer in computers: if not ('can' in computer.participation['name'].keys()): - # This computer neither sends nor recieves can messages + # This computer neither sends nor receives can messages continue raw_buses |= set(computer.participation['name']['can'].mapping.values()) diff --git a/generator/structs.py b/generator/structs.py index 50d7be7..b7c0ff3 100644 --- a/generator/structs.py +++ b/generator/structs.py @@ -17,6 +17,13 @@ def msg_handler(frame, name_prepends, fw): fw('} ' + '{}_T;\n\n'.format(coord(name_prepends, frame.name))) +def timestamped_msg_handler(frame, name_prepends, fw): + fw('typedef struct {\n') + fw('\t{}_T msg;\n'.format(coord(name_prepends, frame.name))) + fw('\ttime_t timestamp;\n') + fw('} ' + '{}_Timestamped_T;\n\n'.format(coord(name_prepends, frame.name))) + + def write(can, output_path=structs_path): header_name = '_CAN_LIBRARY_STRUCTS' @@ -26,9 +33,11 @@ def write(can, output_path=structs_path): fw(ifndef(header_name)) fw('#include \n') fw('#include \n\n') + fw('#include \n\n') fw('#include "enum_atom.h"\n\n') for bus in can.bus: for msg in bus.frame: frame_handler(msg, bus.name, msg_handler, fw) + frame_handler(msg, bus.name, timestamped_msg_handler, fw) fw(endif(header_name)) From abdaaa75121f2485345bbc5749908fba1bfaefd4 Mon Sep 17 00:00:00 2001 From: Mingfei Date: Sat, 27 Apr 2019 13:40:25 -0400 Subject: [PATCH 03/25] Handle timestamped frames --- generator/computers_c.py | 6 +++--- generator/computers_h.py | 6 +++--- generator/send_receive.py | 9 ++++++--- generator/structs.py | 4 ++-- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/generator/computers_c.py b/generator/computers_c.py index bdf3e6a..93cdc85 100644 --- a/generator/computers_c.py +++ b/generator/computers_c.py @@ -81,13 +81,13 @@ def write(can, computers, output_path=computer_c_dir_path): for busnm, bus in computer.participation['name']['can'].subscribe.items(): fw( 'static void CANlib_update_can_{}(void)'.format(busnm) + '{\n' + - '\tFrame frame;\n' + '\tTimestampedFrame ts_frame;\n' ) if any(is_multplxd(msg) for msg in bus): fw('\tuint64_t bitstring;\n') fw( - '\tCANlib_ReadFrame(&frame, {});\n'.format(busnm) + - '\tswitch(frame.id) {\n' + '\tCANlib_ReadFrame(&(ts_frame.frame), {});\n'.format(busnm) + + '\tswitch(ts_frame.frame.id) {\n' ) for msg in bus: diff --git a/generator/computers_h.py b/generator/computers_h.py index 9f1ad5a..abe0b8f 100644 --- a/generator/computers_h.py +++ b/generator/computers_h.py @@ -14,7 +14,7 @@ def declare_sub_frame(frame, name_prepends, fw): tot_name = coord(name_prepends, frame.name, prefix=False) fw( 'extern CANlib_{}_T CANlib_{}_Input;\n'.format(tot_name, tot_name) + - 'void CANlib_Handle_{}(Frame *frame);\n'.format(tot_name, tot_name) + 'void CANlib_Handle_{}(TimeStampedFrame *frame);\n'.format(tot_name, tot_name) ) @@ -53,7 +53,7 @@ def write(can, computers, output_path=computer_h_dir_path): for frame in bus: frame_handler(frame, bus_name, declare_pub_frame, fw) except KeyError: - pass # No CAN messages sent by this board + pass # No CAN messages sent by this board fw('\n') @@ -65,7 +65,7 @@ def write(can, computers, output_path=computer_h_dir_path): fw('\n') fw('void CANlib_update_can(void);\n') except KeyError: - pass # No CAN messages received by this board + pass # No CAN messages received by this board fw('\n#ifdef __cplusplus\n} // extern "C"\n#endif // __cplusplus\n\n') diff --git a/generator/send_receive.py b/generator/send_receive.py index 85e6921..a1c5ca5 100644 --- a/generator/send_receive.py +++ b/generator/send_receive.py @@ -25,19 +25,22 @@ def define_pub_frame(frame, name_prepends, busnm, fw): def define_sub_frame(frame, name_prepends, fw): tot_name = coord(name_prepends, frame.name, prefix=False) - fw('void CANlib_Handle_{}(Frame *frame)'.format( - tot_name, tot_name) + ' {\n' + '\tCANlib_Unpack_{}(frame, &CANlib_{}_Input);\n'.format(tot_name, tot_name) + '}\n\n') + fw('void CANlib_Handle_{}(Timestamped_Frame *ts_frame) {{\n'.format(tot_name, tot_name)) + fw('\tCANlib_{}_Input.timestamp = HAL_GetTick();\n'.format(tot_name)) + fw('\tCANlib_Unpack_{}(&(ts_frame->frame), &(CANlib_{}_Input.msg));\n'.format(tot_name,tot_name)) + fw('}\n\n') def define_struct(frame, name_prepends, fw): tot_name = coord(name_prepends, frame.name) - fw('{}_T {}_Input;\n'.format( + fw('{}_Timestamped_T {}_Input;\n'.format( tot_name, tot_name)) def write(can, output_path=send_recieve_path): with open(output_path, 'w') as f: fw = f.write + fw('#include \n') fw('#include "pack_unpack.h"\n\n') for bus in can.bus: diff --git a/generator/structs.py b/generator/structs.py index b7c0ff3..dd5b5c3 100644 --- a/generator/structs.py +++ b/generator/structs.py @@ -32,8 +32,8 @@ def write(can, output_path=structs_path): fw(ifndef(header_name)) fw('#include \n') - fw('#include \n\n') - fw('#include \n\n') + fw('#include \n') + fw('#include \n') fw('#include "enum_atom.h"\n\n') for bus in can.bus: From 235d4c316b204dbf2519327db19338ef7f3c5b58 Mon Sep 17 00:00:00 2001 From: Mingfei Date: Sat, 27 Apr 2019 13:57:03 -0400 Subject: [PATCH 04/25] Fix bugs --- generator/computers_c.py | 4 ++-- generator/computers_h.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/generator/computers_c.py b/generator/computers_c.py index 93cdc85..6e28de6 100644 --- a/generator/computers_c.py +++ b/generator/computers_c.py @@ -11,7 +11,7 @@ def single_handler(frame, name_prepends, num_tabs, fw): tot_name = coord(name_prepends, frame.name, prefix=False) fw( '\t' * num_tabs + 'case CANlib_{}_key:'.format(tot_name) + '\n' + - '\t' * (num_tabs + 1) + 'CANlib_Handle_{}(&frame);\n'.format(tot_name) + + '\t' * (num_tabs + 1) + 'CANlib_Handle_{}(&ts_frame);\n'.format(tot_name) + '\t' * (num_tabs + 1) + 'break;\n' ) @@ -81,7 +81,7 @@ def write(can, computers, output_path=computer_c_dir_path): for busnm, bus in computer.participation['name']['can'].subscribe.items(): fw( 'static void CANlib_update_can_{}(void)'.format(busnm) + '{\n' + - '\tTimestampedFrame ts_frame;\n' + '\tTimestamped_Frame ts_frame;\n' ) if any(is_multplxd(msg) for msg in bus): fw('\tuint64_t bitstring;\n') diff --git a/generator/computers_h.py b/generator/computers_h.py index abe0b8f..f7cdb94 100644 --- a/generator/computers_h.py +++ b/generator/computers_h.py @@ -13,8 +13,8 @@ def declare_pub_frame(frame, name_prepends, fw): def declare_sub_frame(frame, name_prepends, fw): tot_name = coord(name_prepends, frame.name, prefix=False) fw( - 'extern CANlib_{}_T CANlib_{}_Input;\n'.format(tot_name, tot_name) + - 'void CANlib_Handle_{}(TimeStampedFrame *frame);\n'.format(tot_name, tot_name) + 'extern CANlib_{}_Timestamped_T CANlib_{}_Input;\n'.format(tot_name, tot_name) + + 'void CANlib_Handle_{}(Timestamped_Frame *frame);\n'.format(tot_name, tot_name) ) From e40b75c0413c68052ad34aa6a581d17f2309286b Mon Sep 17 00:00:00 2001 From: Mingfei Date: Sat, 27 Apr 2019 15:08:16 -0400 Subject: [PATCH 05/25] CANlib_ReadFrame now checks if frame is valid --- generator/computers_c.py | 5 +++-- src/driver.h | 3 ++- src/drivers/inc/stm32f4xx.h | 3 ++- src/drivers/src/stm32f4xx.c | 14 ++++++++------ 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/generator/computers_c.py b/generator/computers_c.py index 5181db6..5060a15 100644 --- a/generator/computers_c.py +++ b/generator/computers_c.py @@ -115,8 +115,9 @@ def write(can, computers, output_path=computer_c_dir_path): fw('\tuint64_t bitstring;\n') fw( - '\tCANlib_ReadFrame(&(ts_frame.frame), {});\n'.format(busnm) + - '\tCANlib_HandleFrame_{}(&ts_frame);\n'.format(busnm) + + '\tif (CANlib_ReadFrame(&(ts_frame.frame), {})) {{\n'.format(busnm) + + '\t\tCANlib_HandleFrame_{}(&ts_frame);\n'.format(busnm) + + '\t}\n' + '}\n\n' ) diff --git a/src/driver.h b/src/driver.h index 1546ebe..0a9f117 100644 --- a/src/driver.h +++ b/src/driver.h @@ -3,9 +3,10 @@ #include "drivers/inc/stm32f4xx.h" #include "bus.h" +#include CANlib_Transmit_Error_T CANlib_TransmitFrame(Frame *frame, CANlib_Bus_T bus); -void CANlib_ReadFrame(Frame *frame, CANlib_Bus_T bus); +bool CANlib_ReadFrame(Frame *frame, CANlib_Bus_T bus); CAN_Raw_Bus_T CANlib_GetRawBus(CANlib_Bus_T bus); #endif // __DRIVER_H diff --git a/src/drivers/inc/stm32f4xx.h b/src/drivers/inc/stm32f4xx.h index e77a7c2..a2118ad 100644 --- a/src/drivers/inc/stm32f4xx.h +++ b/src/drivers/inc/stm32f4xx.h @@ -6,12 +6,13 @@ #include "bus.h" #include +#include typedef uint32_t Time_T; // in ms typedef HAL_StatusTypeDef CANlib_Transmit_Error_T; typedef HAL_StatusTypeDef CANlib_Init_Error_T; CANlib_Transmit_Error_T CANlib_TransmitFrame(Frame *frame, CANlib_Bus_T bus); -void CANlib_ReadFrame(Frame *frame, CANlib_Bus_T bus); +bool CANlib_ReadFrame(Frame *frame, CANlib_Bus_T bus); #endif // __STM32F4XX_CAN_H diff --git a/src/drivers/src/stm32f4xx.c b/src/drivers/src/stm32f4xx.c index 805244e..7f0b09e 100644 --- a/src/drivers/src/stm32f4xx.c +++ b/src/drivers/src/stm32f4xx.c @@ -5,6 +5,7 @@ #include "driver.h" #include #include +#include extern CAN_HandleTypeDef hcan1; extern CAN_HandleTypeDef hcan2; @@ -38,7 +39,7 @@ HAL_StatusTypeDef CANlib_TransmitFrame(Frame *frame, CANlib_Bus_T bus) { return HAL_CAN_AddTxMessage(hcan, &pHeader, frame->data, &pTxMailbox); } -void CANlib_ReadFrame(Frame *frame, CANlib_Bus_T bus) { +bool CANlib_ReadFrame(Frame *frame, CANlib_Bus_T bus) { CAN_Raw_Bus_T raw_bus = CANlib_GetRawBus(bus); CAN_HandleTypeDef *hcan; switch(raw_bus) { @@ -52,22 +53,23 @@ void CANlib_ReadFrame(Frame *frame, CANlib_Bus_T bus) { hcan = &hcan3; break; default: - return; + return false; } uint8_t data[8] = {}; CAN_RxHeaderTypeDef pHeader; for (int fifo = 0; fifo < 2; fifo++) { // There are 2 receive FIFOs if (HAL_CAN_GetRxFifoFillLevel(hcan, fifo) > 0) { - HAL_CAN_GetRxMessage(hcan, fifo, &pHeader, data); + if (HAL_CAN_GetRxMessage(hcan, fifo, &pHeader, data) != HAL_OK) { + return false; + } frame->id = pHeader.IDE == CAN_ID_STD ? pHeader.StdId : pHeader.ExtId; frame->dlc = pHeader.DLC; memcpy(frame->data, data, sizeof(data)); frame->extended = pHeader.IDE == CAN_ID_EXT; - return; + return true; } } + return false; } - - From cf242354fc4695bf42ec49ba64f933e0fab93c22 Mon Sep 17 00:00:00 2001 From: Mingfei Date: Sat, 27 Apr 2019 15:19:08 -0400 Subject: [PATCH 06/25] CANlib_HandleFrame now uses CANlib_ReadFrame --- generator/computers_c.py | 7 +++++-- generator/computers_h.py | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/generator/computers_c.py b/generator/computers_c.py index 5060a15..85b88a3 100644 --- a/generator/computers_c.py +++ b/generator/computers_c.py @@ -126,12 +126,15 @@ def write(can, computers, output_path=computer_c_dir_path): fw('\tCANlib_update_can_{}();\n'.format(busnm)) fw('}\n\n') - fw('void CANlib_HandleFrame(CAN_Raw_Bus_T raw_bus, Timestamped_Frame* frame) {\n') + fw('void CANlib_HandleFrame(CAN_Raw_Bus_T raw_bus) {\n') + fw('\tTimestamped_Frame ts_frame;\n') fw('\tswitch(raw_bus) {\n') for bus in computer.participation['name']['can'].subscribe.keys(): fw( '\t\tcase {}:\n'.format(computer.participation['name']['can'].mapping[bus]) + - '\t\t\tCANlib_HandleFrame_{}(frame);\n'.format(bus) + + '\t\t\tif (CANlib_ReadFrame(&(ts_frame.frame), {})) {{\n'.format(bus) + + '\t\t\t\tCANlib_HandleFrame_{}(&ts_frame);\n'.format(bus) + + '\t\t\t}\n' + '\t\t\tbreak;\n' ) fw('\t\tdefault:\n\t\t\tbreak;\n') diff --git a/generator/computers_h.py b/generator/computers_h.py index 9ad4944..e6a4e96 100644 --- a/generator/computers_h.py +++ b/generator/computers_h.py @@ -65,7 +65,7 @@ def write(can, computers, output_path=computer_h_dir_path): frame_handler(frame, bus_name, declare_sub_frame, fw) fw('\n') fw('void CANlib_update_can(void);\n') - fw('void CANlib_HandleFrame(CAN_Raw_Bus_T raw_bus, Timestamped_Frame* frame);\n') + fw('void CANlib_HandleFrame(CAN_Raw_Bus_T raw_bus);\n') except KeyError: pass # No CAN messages received by this board From 0069c3e7255d07f0b655a8ef175a5eadeb40e2ba Mon Sep 17 00:00:00 2001 From: Mingfei Date: Sat, 27 Apr 2019 16:38:20 -0400 Subject: [PATCH 07/25] Fix typos --- generator/computers_h.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generator/computers_h.py b/generator/computers_h.py index e6a4e96..edd33fc 100644 --- a/generator/computers_h.py +++ b/generator/computers_h.py @@ -26,7 +26,7 @@ def write(can, computers, output_path=computer_h_dir_path): f_path = os.path.join(output_path, 'canlib_{}.h'.format(computer.name)) if not ('can' in computer.participation['name'].keys()): - # This computer neither sends nor recieves can messagess + # This computer neither sends nor receives can messages continue with open(f_path, 'w') as f: From a11eb1c7e4713f608fdd200e78442235fa413897 Mon Sep 17 00:00:00 2001 From: Mingfei Date: Tue, 30 Apr 2019 20:22:31 -0400 Subject: [PATCH 08/25] Check both FIFOs --- src/drivers/src/stm32f4xx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/drivers/src/stm32f4xx.c b/src/drivers/src/stm32f4xx.c index 7f0b09e..8cc3017 100644 --- a/src/drivers/src/stm32f4xx.c +++ b/src/drivers/src/stm32f4xx.c @@ -61,7 +61,7 @@ bool CANlib_ReadFrame(Frame *frame, CANlib_Bus_T bus) { for (int fifo = 0; fifo < 2; fifo++) { // There are 2 receive FIFOs if (HAL_CAN_GetRxFifoFillLevel(hcan, fifo) > 0) { if (HAL_CAN_GetRxMessage(hcan, fifo, &pHeader, data) != HAL_OK) { - return false; + continue; } frame->id = pHeader.IDE == CAN_ID_STD ? pHeader.StdId : pHeader.ExtId; frame->dlc = pHeader.DLC; From fb6cf2ebe9117e04f5e6133be4740619cb2706a8 Mon Sep 17 00:00:00 2001 From: Mingfei Date: Tue, 30 Apr 2019 20:42:22 -0400 Subject: [PATCH 09/25] Prevent unused warning --- generator/computers_c.py | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/generator/computers_c.py b/generator/computers_c.py index 85b88a3..2a408d4 100644 --- a/generator/computers_c.py +++ b/generator/computers_c.py @@ -127,15 +127,19 @@ def write(can, computers, output_path=computer_c_dir_path): fw('}\n\n') fw('void CANlib_HandleFrame(CAN_Raw_Bus_T raw_bus) {\n') - fw('\tTimestamped_Frame ts_frame;\n') - fw('\tswitch(raw_bus) {\n') - for bus in computer.participation['name']['can'].subscribe.keys(): - fw( - '\t\tcase {}:\n'.format(computer.participation['name']['can'].mapping[bus]) + - '\t\t\tif (CANlib_ReadFrame(&(ts_frame.frame), {})) {{\n'.format(bus) + - '\t\t\t\tCANlib_HandleFrame_{}(&ts_frame);\n'.format(bus) + - '\t\t\t}\n' + - '\t\t\tbreak;\n' - ) - fw('\t\tdefault:\n\t\t\tbreak;\n') - fw('\t}\n}\n') + if len(computer.participation['name']['can'].subscribe.keys()) > 0: # check if computer receives messages + fw('\tTimestamped_Frame ts_frame;\n') + fw('\tswitch(raw_bus) {\n') + for bus in computer.participation['name']['can'].subscribe.keys(): + fw( + '\t\tcase {}:\n'.format(computer.participation['name']['can'].mapping[bus]) + + '\t\t\tif (CANlib_ReadFrame(&(ts_frame.frame), {})) {{\n'.format(bus) + + '\t\t\t\tCANlib_HandleFrame_{}(&ts_frame);\n'.format(bus) + + '\t\t\t}\n' + + '\t\t\tbreak;\n' + ) + fw('\t\tdefault:\n\t\t\tbreak;\n') + fw('\t}\n') + else: # prevent unused warning + fw('\tUNUSED(raw_bus);\n') + fw('}\n') From 71c463ea97855bda21a2e651a81f2e2368e19be6 Mon Sep 17 00:00:00 2001 From: Mingfei Date: Thu, 2 May 2019 13:12:41 -0400 Subject: [PATCH 10/25] Rename TimestampedFrame --- generator/computers_c.py | 6 +++--- generator/computers_h.py | 2 +- generator/send_receive.py | 2 +- src/static.h | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/generator/computers_c.py b/generator/computers_c.py index 2a408d4..29373c0 100644 --- a/generator/computers_c.py +++ b/generator/computers_c.py @@ -92,7 +92,7 @@ def write(can, computers, output_path=computer_c_dir_path): for busnm, bus in computer.participation['name']['can'].subscribe.items(): fw( - 'static void CANlib_HandleFrame_{}(Timestamped_Frame* ts_frame)'.format(busnm) + '{\n' + + 'static void CANlib_HandleFrame_{}(TimestampedFrame* ts_frame)'.format(busnm) + '{\n' + '\tswitch(ts_frame->frame.id) {\n' ) @@ -109,7 +109,7 @@ def write(can, computers, output_path=computer_c_dir_path): for busnm, bus in computer.participation['name']['can'].subscribe.items(): fw( 'static void CANlib_update_can_{}(void)'.format(busnm) + '{\n' + - '\tTimestamped_Frame ts_frame;\n' + '\tTimestampedFrame ts_frame;\n' ) if any(is_multplxd(msg) for msg in bus): fw('\tuint64_t bitstring;\n') @@ -128,7 +128,7 @@ def write(can, computers, output_path=computer_c_dir_path): fw('void CANlib_HandleFrame(CAN_Raw_Bus_T raw_bus) {\n') if len(computer.participation['name']['can'].subscribe.keys()) > 0: # check if computer receives messages - fw('\tTimestamped_Frame ts_frame;\n') + fw('\tTimestampedFrame ts_frame;\n') fw('\tswitch(raw_bus) {\n') for bus in computer.participation['name']['can'].subscribe.keys(): fw( diff --git a/generator/computers_h.py b/generator/computers_h.py index edd33fc..adc5b82 100644 --- a/generator/computers_h.py +++ b/generator/computers_h.py @@ -14,7 +14,7 @@ def declare_sub_frame(frame, name_prepends, fw): tot_name = coord(name_prepends, frame.name, prefix=False) fw( 'extern CANlib_{}_Timestamped_T CANlib_{}_Input;\n'.format(tot_name, tot_name) + - 'void CANlib_Handle_{}(Timestamped_Frame *frame);\n'.format(tot_name, tot_name) + 'void CANlib_Handle_{}(TimestampedFrame *frame);\n'.format(tot_name, tot_name) ) diff --git a/generator/send_receive.py b/generator/send_receive.py index a1c5ca5..a90cf15 100644 --- a/generator/send_receive.py +++ b/generator/send_receive.py @@ -25,7 +25,7 @@ def define_pub_frame(frame, name_prepends, busnm, fw): def define_sub_frame(frame, name_prepends, fw): tot_name = coord(name_prepends, frame.name, prefix=False) - fw('void CANlib_Handle_{}(Timestamped_Frame *ts_frame) {{\n'.format(tot_name, tot_name)) + fw('void CANlib_Handle_{}(TimestampedFrame *ts_frame) {{\n'.format(tot_name, tot_name)) fw('\tCANlib_{}_Input.timestamp = HAL_GetTick();\n'.format(tot_name)) fw('\tCANlib_Unpack_{}(&(ts_frame->frame), &(CANlib_{}_Input.msg));\n'.format(tot_name,tot_name)) fw('}\n\n') diff --git a/src/static.h b/src/static.h index c6d9977..48ae5f5 100644 --- a/src/static.h +++ b/src/static.h @@ -15,7 +15,7 @@ typedef struct { typedef struct { Frame frame; time_t timestamp; -} Timestamped_Frame; +} TimestampedFrame; #define LIMIT(name) \ static Time_T last_sent = 0; \ From bff9a8b374a1c72b20438586ce36a87dfefccd0e Mon Sep 17 00:00:00 2001 From: Mingfei Date: Thu, 2 May 2019 13:33:27 -0400 Subject: [PATCH 11/25] Rename timestamp field to stamp --- generator/send_receive.py | 2 +- generator/structs.py | 2 +- src/static.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/generator/send_receive.py b/generator/send_receive.py index a90cf15..57676e5 100644 --- a/generator/send_receive.py +++ b/generator/send_receive.py @@ -26,7 +26,7 @@ def define_sub_frame(frame, name_prepends, fw): tot_name = coord(name_prepends, frame.name, prefix=False) fw('void CANlib_Handle_{}(TimestampedFrame *ts_frame) {{\n'.format(tot_name, tot_name)) - fw('\tCANlib_{}_Input.timestamp = HAL_GetTick();\n'.format(tot_name)) + fw('\tCANlib_{}_Input.stamp = HAL_GetTick();\n'.format(tot_name)) fw('\tCANlib_Unpack_{}(&(ts_frame->frame), &(CANlib_{}_Input.msg));\n'.format(tot_name,tot_name)) fw('}\n\n') diff --git a/generator/structs.py b/generator/structs.py index dd5b5c3..f1fe270 100644 --- a/generator/structs.py +++ b/generator/structs.py @@ -19,8 +19,8 @@ def msg_handler(frame, name_prepends, fw): def timestamped_msg_handler(frame, name_prepends, fw): fw('typedef struct {\n') + fw('\ttime_t stamp;\n') fw('\t{}_T msg;\n'.format(coord(name_prepends, frame.name))) - fw('\ttime_t timestamp;\n') fw('} ' + '{}_Timestamped_T;\n\n'.format(coord(name_prepends, frame.name))) diff --git a/src/static.h b/src/static.h index 48ae5f5..30a8308 100644 --- a/src/static.h +++ b/src/static.h @@ -13,8 +13,8 @@ typedef struct { } Frame; typedef struct { + time_t stamp; Frame frame; - time_t timestamp; } TimestampedFrame; #define LIMIT(name) \ From 3989e4541dd3762a032b7789e213d6e98420c03d Mon Sep 17 00:00:00 2001 From: Mingfei Date: Sat, 4 May 2019 14:25:26 -0400 Subject: [PATCH 12/25] Change name --- generator/computers_c.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generator/computers_c.py b/generator/computers_c.py index 29373c0..bf25224 100644 --- a/generator/computers_c.py +++ b/generator/computers_c.py @@ -108,7 +108,7 @@ def write(can, computers, output_path=computer_c_dir_path): for busnm, bus in computer.participation['name']['can'].subscribe.items(): fw( - 'static void CANlib_update_can_{}(void)'.format(busnm) + '{\n' + + 'static void CANlib_Update_can_{}(void)'.format(busnm) + ' {\n' + '\tTimestampedFrame ts_frame;\n' ) if any(is_multplxd(msg) for msg in bus): From d9404a3df79a277f6777c0bcce59ded36c5210a4 Mon Sep 17 00:00:00 2001 From: Mingfei Date: Sat, 4 May 2019 14:35:39 -0400 Subject: [PATCH 13/25] Change ReadFrame function --- src/drivers/src/stm32f4xx.c | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/src/drivers/src/stm32f4xx.c b/src/drivers/src/stm32f4xx.c index 8cc3017..f157c4f 100644 --- a/src/drivers/src/stm32f4xx.c +++ b/src/drivers/src/stm32f4xx.c @@ -39,23 +39,7 @@ HAL_StatusTypeDef CANlib_TransmitFrame(Frame *frame, CANlib_Bus_T bus) { return HAL_CAN_AddTxMessage(hcan, &pHeader, frame->data, &pTxMailbox); } -bool CANlib_ReadFrame(Frame *frame, CANlib_Bus_T bus) { - CAN_Raw_Bus_T raw_bus = CANlib_GetRawBus(bus); - CAN_HandleTypeDef *hcan; - switch(raw_bus) { - case CAN_1: - hcan = &hcan1; - break; - case CAN_2: - hcan = &hcan2; - break; - case CAN_3: - hcan = &hcan3; - break; - default: - return false; - } - +bool CANlib_ReadFrame(Frame *frame, CAN_HandleTypeDef *hcan) { uint8_t data[8] = {}; CAN_RxHeaderTypeDef pHeader; for (int fifo = 0; fifo < 2; fifo++) { // There are 2 receive FIFOs From 1377b3eb5e69173dadfe3a24b831e2607bd8470d Mon Sep 17 00:00:00 2001 From: Mingfei Date: Sat, 4 May 2019 14:46:59 -0400 Subject: [PATCH 14/25] Change CANlib_update functions --- generator/computers_c.py | 2 +- src/drivers/src/stm32f4xx.c | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/generator/computers_c.py b/generator/computers_c.py index bf25224..0a76ffe 100644 --- a/generator/computers_c.py +++ b/generator/computers_c.py @@ -115,7 +115,7 @@ def write(can, computers, output_path=computer_c_dir_path): fw('\tuint64_t bitstring;\n') fw( - '\tif (CANlib_ReadFrame(&(ts_frame.frame), {})) {{\n'.format(busnm) + + '\tif (CANlib_ReadFrame(&(ts_frame.frame), CANlib_GetRawBus({}))) {{\n'.format(busnm) + '\t\tCANlib_HandleFrame_{}(&ts_frame);\n'.format(busnm) + '\t}\n' + '}\n\n' diff --git a/src/drivers/src/stm32f4xx.c b/src/drivers/src/stm32f4xx.c index f157c4f..10e3760 100644 --- a/src/drivers/src/stm32f4xx.c +++ b/src/drivers/src/stm32f4xx.c @@ -39,7 +39,22 @@ HAL_StatusTypeDef CANlib_TransmitFrame(Frame *frame, CANlib_Bus_T bus) { return HAL_CAN_AddTxMessage(hcan, &pHeader, frame->data, &pTxMailbox); } -bool CANlib_ReadFrame(Frame *frame, CAN_HandleTypeDef *hcan) { +bool CANlib_ReadFrame(Frame *frame, CANlib_Raw_Bus_T bus) { + CAN_HandleTypeDef *hcan; + switch(bus) { + case CAN_1: + hcan = &hcan1; + break; + case CAN_2: + hcan = &hcan2; + break; + case CAN_3: + hcan = &hcan3; + break; + default: + return false; + } + uint8_t data[8] = {}; CAN_RxHeaderTypeDef pHeader; for (int fifo = 0; fifo < 2; fifo++) { // There are 2 receive FIFOs From acc08832865a615daa41e272273429c8f966e3c4 Mon Sep 17 00:00:00 2001 From: Mingfei Date: Sat, 4 May 2019 15:20:02 -0400 Subject: [PATCH 15/25] Change CANlib_HandleFrame --- generator/computers_c.py | 24 ++++++++++++++---------- generator/computers_h.py | 2 +- src/driver.h | 2 +- src/drivers/inc/stm32f4xx.h | 2 +- src/drivers/src/stm32f4xx.c | 4 ++-- 5 files changed, 19 insertions(+), 15 deletions(-) diff --git a/generator/computers_c.py b/generator/computers_c.py index 0a76ffe..f5c8d3a 100644 --- a/generator/computers_c.py +++ b/generator/computers_c.py @@ -63,6 +63,7 @@ def write(can, computers, output_path=computer_c_dir_path): with open(f_path, 'w') as f: fw = f.write + fw('#include \n') fw('#include "pack_unpack.h"\n') fw('#include "canlib_{}.h"\n\n'.format(computer.name)) @@ -115,7 +116,8 @@ def write(can, computers, output_path=computer_c_dir_path): fw('\tuint64_t bitstring;\n') fw( - '\tif (CANlib_ReadFrame(&(ts_frame.frame), CANlib_GetRawBus({}))) {{\n'.format(busnm) + + '\tif (CANlib_ReadFrame(&(ts_frame.frame), {})) {{\n'.format(computer.participation['name'][ + 'can'].mapping[busnm]) + '\t\tCANlib_HandleFrame_{}(&ts_frame);\n'.format(busnm) + '\t}\n' + '}\n\n' @@ -126,20 +128,22 @@ def write(can, computers, output_path=computer_c_dir_path): fw('\tCANlib_update_can_{}();\n'.format(busnm)) fw('}\n\n') - fw('void CANlib_HandleFrame(CAN_Raw_Bus_T raw_bus) {\n') + fw('void CANlib_HandleFrame(TimestampedFrame *ts_frame, time_t stamp, CAN_Raw_Bus_T raw_bus) {\n') if len(computer.participation['name']['can'].subscribe.keys()) > 0: # check if computer receives messages - fw('\tTimestampedFrame ts_frame;\n') - fw('\tswitch(raw_bus) {\n') + fw('\tif (CANlib_ReadFrame(&(ts_frame->frame), raw_bus)) {\n') + fw('\t\tts_frame->stamp = stamp;\n') + fw('\t\tswitch (raw_bus) {\n') for bus in computer.participation['name']['can'].subscribe.keys(): fw( - '\t\tcase {}:\n'.format(computer.participation['name']['can'].mapping[bus]) + - '\t\t\tif (CANlib_ReadFrame(&(ts_frame.frame), {})) {{\n'.format(bus) + - '\t\t\t\tCANlib_HandleFrame_{}(&ts_frame);\n'.format(bus) + - '\t\t\t}\n' + - '\t\t\tbreak;\n' + '\t\t\tcase {}:\n'.format(computer.participation['name']['can'].mapping[bus]) + + '\t\t\t\tCANlib_HandleFrame_{}(ts_frame);\n'.format(bus) + + '\t\t\t\tbreak;\n' ) - fw('\t\tdefault:\n\t\t\tbreak;\n') + fw('\t\t\tdefault:\n\t\t\tbreak;\n') + fw('\t\t}\n') fw('\t}\n') else: # prevent unused warning + fw('\tUNUSED(ts_frame);\n') + fw('\tUNUSED(stamp);\n') fw('\tUNUSED(raw_bus);\n') fw('}\n') diff --git a/generator/computers_h.py b/generator/computers_h.py index adc5b82..86546e3 100644 --- a/generator/computers_h.py +++ b/generator/computers_h.py @@ -65,7 +65,7 @@ def write(can, computers, output_path=computer_h_dir_path): frame_handler(frame, bus_name, declare_sub_frame, fw) fw('\n') fw('void CANlib_update_can(void);\n') - fw('void CANlib_HandleFrame(CAN_Raw_Bus_T raw_bus);\n') + fw('void CANlib_HandleFrame(TimestampedFrame *ts_frame, time_t stamp, CAN_Raw_Bus_T raw_bus);\n') except KeyError: pass # No CAN messages received by this board diff --git a/src/driver.h b/src/driver.h index 0a9f117..1e38511 100644 --- a/src/driver.h +++ b/src/driver.h @@ -6,7 +6,7 @@ #include CANlib_Transmit_Error_T CANlib_TransmitFrame(Frame *frame, CANlib_Bus_T bus); -bool CANlib_ReadFrame(Frame *frame, CANlib_Bus_T bus); +bool CANlib_ReadFrame(Frame *frame, CAN_Raw_Bus_T bus); CAN_Raw_Bus_T CANlib_GetRawBus(CANlib_Bus_T bus); #endif // __DRIVER_H diff --git a/src/drivers/inc/stm32f4xx.h b/src/drivers/inc/stm32f4xx.h index a2118ad..09102d8 100644 --- a/src/drivers/inc/stm32f4xx.h +++ b/src/drivers/inc/stm32f4xx.h @@ -13,6 +13,6 @@ typedef HAL_StatusTypeDef CANlib_Transmit_Error_T; typedef HAL_StatusTypeDef CANlib_Init_Error_T; CANlib_Transmit_Error_T CANlib_TransmitFrame(Frame *frame, CANlib_Bus_T bus); -bool CANlib_ReadFrame(Frame *frame, CANlib_Bus_T bus); +bool CANlib_ReadFrame(Frame *frame, CAN_Raw_Bus_T bus); #endif // __STM32F4XX_CAN_H diff --git a/src/drivers/src/stm32f4xx.c b/src/drivers/src/stm32f4xx.c index 10e3760..b63684e 100644 --- a/src/drivers/src/stm32f4xx.c +++ b/src/drivers/src/stm32f4xx.c @@ -39,9 +39,9 @@ HAL_StatusTypeDef CANlib_TransmitFrame(Frame *frame, CANlib_Bus_T bus) { return HAL_CAN_AddTxMessage(hcan, &pHeader, frame->data, &pTxMailbox); } -bool CANlib_ReadFrame(Frame *frame, CANlib_Raw_Bus_T bus) { +bool CANlib_ReadFrame(Frame *frame, CAN_Raw_Bus_T bus) { CAN_HandleTypeDef *hcan; - switch(bus) { + switch (bus) { case CAN_1: hcan = &hcan1; break; From 616a1f58cfcca25b48dfd868d53819854db4988f Mon Sep 17 00:00:00 2001 From: Mingfei Date: Sat, 4 May 2019 15:23:44 -0400 Subject: [PATCH 16/25] HandleFrame returns bool --- generator/computers_c.py | 9 +++++++-- generator/computers_h.py | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/generator/computers_c.py b/generator/computers_c.py index f5c8d3a..f77864d 100644 --- a/generator/computers_c.py +++ b/generator/computers_c.py @@ -64,6 +64,7 @@ def write(can, computers, output_path=computer_c_dir_path): with open(f_path, 'w') as f: fw = f.write fw('#include \n') + fw('#include \n') fw('#include "pack_unpack.h"\n') fw('#include "canlib_{}.h"\n\n'.format(computer.name)) @@ -128,7 +129,7 @@ def write(can, computers, output_path=computer_c_dir_path): fw('\tCANlib_update_can_{}();\n'.format(busnm)) fw('}\n\n') - fw('void CANlib_HandleFrame(TimestampedFrame *ts_frame, time_t stamp, CAN_Raw_Bus_T raw_bus) {\n') + fw('bool CANlib_HandleFrame(TimestampedFrame *ts_frame, time_t stamp, CAN_Raw_Bus_T raw_bus) {\n') if len(computer.participation['name']['can'].subscribe.keys()) > 0: # check if computer receives messages fw('\tif (CANlib_ReadFrame(&(ts_frame->frame), raw_bus)) {\n') fw('\t\tts_frame->stamp = stamp;\n') @@ -139,11 +140,15 @@ def write(can, computers, output_path=computer_c_dir_path): '\t\t\t\tCANlib_HandleFrame_{}(ts_frame);\n'.format(bus) + '\t\t\t\tbreak;\n' ) - fw('\t\t\tdefault:\n\t\t\tbreak;\n') + fw('\t\t\tdefault:\n') + fw('\t\t\t\tbreak;\n') fw('\t\t}\n') + fw('\t\treturn true;\n') fw('\t}\n') + fw('\treturn false;\n') else: # prevent unused warning fw('\tUNUSED(ts_frame);\n') fw('\tUNUSED(stamp);\n') fw('\tUNUSED(raw_bus);\n') + fw('\treturn false;\n') fw('}\n') diff --git a/generator/computers_h.py b/generator/computers_h.py index 86546e3..9dff3c2 100644 --- a/generator/computers_h.py +++ b/generator/computers_h.py @@ -65,7 +65,7 @@ def write(can, computers, output_path=computer_h_dir_path): frame_handler(frame, bus_name, declare_sub_frame, fw) fw('\n') fw('void CANlib_update_can(void);\n') - fw('void CANlib_HandleFrame(TimestampedFrame *ts_frame, time_t stamp, CAN_Raw_Bus_T raw_bus);\n') + fw('bool CANlib_HandleFrame(TimestampedFrame *ts_frame, time_t stamp, CAN_Raw_Bus_T raw_bus);\n') except KeyError: pass # No CAN messages received by this board From dd9d9db0541a3dd3424ad7011538044c1c5f3a0b Mon Sep 17 00:00:00 2001 From: Mingfei Date: Sat, 4 May 2019 15:59:00 -0400 Subject: [PATCH 17/25] New readframe functions --- src/driver.h | 3 ++- src/drivers/inc/stm32f4xx.h | 3 ++- src/drivers/src/stm32f4xx.c | 46 ++++++++++++++++--------------------- 3 files changed, 24 insertions(+), 28 deletions(-) diff --git a/src/driver.h b/src/driver.h index 1e38511..38c75ac 100644 --- a/src/driver.h +++ b/src/driver.h @@ -6,7 +6,8 @@ #include CANlib_Transmit_Error_T CANlib_TransmitFrame(Frame *frame, CANlib_Bus_T bus); -bool CANlib_ReadFrame(Frame *frame, CAN_Raw_Bus_T bus); +bool HAL_CANlib_ReadFrame(CAN_HandleTypeDef *hcan, Frame* out); +bool HAL_CANlib_ReadFrameFromFIFO(CAN_HandleTypeDef *hcan, uint32_t RxFifo, Frame* out); CAN_Raw_Bus_T CANlib_GetRawBus(CANlib_Bus_T bus); #endif // __DRIVER_H diff --git a/src/drivers/inc/stm32f4xx.h b/src/drivers/inc/stm32f4xx.h index 09102d8..3301199 100644 --- a/src/drivers/inc/stm32f4xx.h +++ b/src/drivers/inc/stm32f4xx.h @@ -13,6 +13,7 @@ typedef HAL_StatusTypeDef CANlib_Transmit_Error_T; typedef HAL_StatusTypeDef CANlib_Init_Error_T; CANlib_Transmit_Error_T CANlib_TransmitFrame(Frame *frame, CANlib_Bus_T bus); -bool CANlib_ReadFrame(Frame *frame, CAN_Raw_Bus_T bus); +bool HAL_CANlib_ReadFrame(CAN_HandleTypeDef *hcan, Frame* out); +bool HAL_CANlib_ReadFrameFromFIFO(CAN_HandleTypeDef *hcan, uint32_t RxFifo, Frame* out); #endif // __STM32F4XX_CAN_H diff --git a/src/drivers/src/stm32f4xx.c b/src/drivers/src/stm32f4xx.c index b63684e..62f44d8 100644 --- a/src/drivers/src/stm32f4xx.c +++ b/src/drivers/src/stm32f4xx.c @@ -39,36 +39,30 @@ HAL_StatusTypeDef CANlib_TransmitFrame(Frame *frame, CANlib_Bus_T bus) { return HAL_CAN_AddTxMessage(hcan, &pHeader, frame->data, &pTxMailbox); } -bool CANlib_ReadFrame(Frame *frame, CAN_Raw_Bus_T bus) { - CAN_HandleTypeDef *hcan; - switch (bus) { - case CAN_1: - hcan = &hcan1; - break; - case CAN_2: - hcan = &hcan2; - break; - case CAN_3: - hcan = &hcan3; - break; - default: - return false; - } +static void HAL_CANlib_ConvertFrame(CAN_RxHeaderTypeDef* pHeader, uint8_t[8] data, Frame *out) { + frame->id = pHeader.IDE == CAN_ID_STD ? pHeader.StdId : pHeader.ExtId; + frame->dlc = pHeader.DLC; + memcpy(frame->data, data, 8); + frame->extended = pHeader.IDE == CAN_ID_EXT; +} +bool HAL_CANlib_ReadFrameFromFIFO(CAN_HandleTypeDef *hcan, uint32_t RxFifo, Frame* out) { uint8_t data[8] = {}; CAN_RxHeaderTypeDef pHeader; - for (int fifo = 0; fifo < 2; fifo++) { // There are 2 receive FIFOs - if (HAL_CAN_GetRxFifoFillLevel(hcan, fifo) > 0) { - if (HAL_CAN_GetRxMessage(hcan, fifo, &pHeader, data) != HAL_OK) { - continue; - } - frame->id = pHeader.IDE == CAN_ID_STD ? pHeader.StdId : pHeader.ExtId; - frame->dlc = pHeader.DLC; - - memcpy(frame->data, data, sizeof(data)); - frame->extended = pHeader.IDE == CAN_ID_EXT; + if (HAL_CAN_GetRxFifoFillLevel(hcan, RxFifo) > 0) { + if (HAL_CAN_GetRxMessage(hcan, RxFifo, &pHeader, data) != HAL_OK) { + HAL_CANlib_ConvertFrame(&pHeader, data, out); return true; - } + } + } + return false; +} + +bool HAL_CANlib_ReadFrame(CAN_HandleTypeDef *hcan, Frame* out) { + for (uint8_t fifo = 0; fifo < 2; fifo++) { + if (HAL_CANlib_ReadFrameFromFIFO(hcan, fifo, out)) { + return true; + } } return false; } From cbd24958f8f031b924e1854d62076a05294e2671 Mon Sep 17 00:00:00 2001 From: Mingfei Date: Sat, 4 May 2019 16:03:01 -0400 Subject: [PATCH 18/25] Change HandleFrame --- generator/computers_c.py | 21 ++++++++------------- generator/computers_h.py | 2 +- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/generator/computers_c.py b/generator/computers_c.py index f77864d..95d938b 100644 --- a/generator/computers_c.py +++ b/generator/computers_c.py @@ -129,26 +129,21 @@ def write(can, computers, output_path=computer_c_dir_path): fw('\tCANlib_update_can_{}();\n'.format(busnm)) fw('}\n\n') - fw('bool CANlib_HandleFrame(TimestampedFrame *ts_frame, time_t stamp, CAN_Raw_Bus_T raw_bus) {\n') + fw('void CANlib_HandleFrame(TimestampedFrame *ts_frame, time_t stamp, CAN_Raw_Bus_T raw_bus) {\n') if len(computer.participation['name']['can'].subscribe.keys()) > 0: # check if computer receives messages - fw('\tif (CANlib_ReadFrame(&(ts_frame->frame), raw_bus)) {\n') - fw('\t\tts_frame->stamp = stamp;\n') - fw('\t\tswitch (raw_bus) {\n') + fw('\tts_frame->stamp = stamp;\n') + fw('\tswitch (raw_bus) {\n') for bus in computer.participation['name']['can'].subscribe.keys(): fw( - '\t\t\tcase {}:\n'.format(computer.participation['name']['can'].mapping[bus]) + - '\t\t\t\tCANlib_HandleFrame_{}(ts_frame);\n'.format(bus) + - '\t\t\t\tbreak;\n' + '\t\tcase {}:\n'.format(computer.participation['name']['can'].mapping[bus]) + + '\t\t\tCANlib_HandleFrame_{}(ts_frame);\n'.format(bus) + + '\t\t\tbreak;\n' ) - fw('\t\t\tdefault:\n') - fw('\t\t\t\tbreak;\n') - fw('\t\t}\n') - fw('\t\treturn true;\n') + fw('\t\tdefault:\n') + fw('\t\t\tbreak;\n') fw('\t}\n') - fw('\treturn false;\n') else: # prevent unused warning fw('\tUNUSED(ts_frame);\n') fw('\tUNUSED(stamp);\n') fw('\tUNUSED(raw_bus);\n') - fw('\treturn false;\n') fw('}\n') diff --git a/generator/computers_h.py b/generator/computers_h.py index 9dff3c2..86546e3 100644 --- a/generator/computers_h.py +++ b/generator/computers_h.py @@ -65,7 +65,7 @@ def write(can, computers, output_path=computer_h_dir_path): frame_handler(frame, bus_name, declare_sub_frame, fw) fw('\n') fw('void CANlib_update_can(void);\n') - fw('bool CANlib_HandleFrame(TimestampedFrame *ts_frame, time_t stamp, CAN_Raw_Bus_T raw_bus);\n') + fw('void CANlib_HandleFrame(TimestampedFrame *ts_frame, time_t stamp, CAN_Raw_Bus_T raw_bus);\n') except KeyError: pass # No CAN messages received by this board From 0863f19497e6a29272d7e686f21048347259ff60 Mon Sep 17 00:00:00 2001 From: Mingfei Date: Sat, 4 May 2019 16:06:25 -0400 Subject: [PATCH 19/25] Fix mistakes --- generator/send_receive.py | 3 +-- src/drivers/src/stm32f4xx.c | 10 +++++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/generator/send_receive.py b/generator/send_receive.py index 57676e5..1830562 100644 --- a/generator/send_receive.py +++ b/generator/send_receive.py @@ -26,7 +26,7 @@ def define_sub_frame(frame, name_prepends, fw): tot_name = coord(name_prepends, frame.name, prefix=False) fw('void CANlib_Handle_{}(TimestampedFrame *ts_frame) {{\n'.format(tot_name, tot_name)) - fw('\tCANlib_{}_Input.stamp = HAL_GetTick();\n'.format(tot_name)) + fw('\tCANlib_{}_Input.stamp = ts_frame->stamp;\n'.format(tot_name)) fw('\tCANlib_Unpack_{}(&(ts_frame->frame), &(CANlib_{}_Input.msg));\n'.format(tot_name,tot_name)) fw('}\n\n') @@ -40,7 +40,6 @@ def define_struct(frame, name_prepends, fw): def write(can, output_path=send_recieve_path): with open(output_path, 'w') as f: fw = f.write - fw('#include \n') fw('#include "pack_unpack.h"\n\n') for bus in can.bus: diff --git a/src/drivers/src/stm32f4xx.c b/src/drivers/src/stm32f4xx.c index 62f44d8..09ccf41 100644 --- a/src/drivers/src/stm32f4xx.c +++ b/src/drivers/src/stm32f4xx.c @@ -39,11 +39,11 @@ HAL_StatusTypeDef CANlib_TransmitFrame(Frame *frame, CANlib_Bus_T bus) { return HAL_CAN_AddTxMessage(hcan, &pHeader, frame->data, &pTxMailbox); } -static void HAL_CANlib_ConvertFrame(CAN_RxHeaderTypeDef* pHeader, uint8_t[8] data, Frame *out) { - frame->id = pHeader.IDE == CAN_ID_STD ? pHeader.StdId : pHeader.ExtId; - frame->dlc = pHeader.DLC; - memcpy(frame->data, data, 8); - frame->extended = pHeader.IDE == CAN_ID_EXT; +static void HAL_CANlib_ConvertFrame(CAN_RxHeaderTypeDef* pHeader, uint8_t data[8], Frame *out) { + out->id = pHeader->IDE == CAN_ID_STD ? pHeader->StdId : pHeader->ExtId; + out->dlc = pHeader->DLC; + memcpy(out->data, data, 8); + out->extended = pHeader->IDE == CAN_ID_EXT; } bool HAL_CANlib_ReadFrameFromFIFO(CAN_HandleTypeDef *hcan, uint32_t RxFifo, Frame* out) { From ac7ab57aaadd2233f3173d24595b2eec653e6ae0 Mon Sep 17 00:00:00 2001 From: Mingfei Date: Sat, 4 May 2019 16:25:34 -0400 Subject: [PATCH 20/25] Change update can functions --- generator/computers_c.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/generator/computers_c.py b/generator/computers_c.py index 95d938b..ab952e1 100644 --- a/generator/computers_c.py +++ b/generator/computers_c.py @@ -6,6 +6,7 @@ frame_handler, is_multplxd from math import ceil +raw_bus_to_instance = {"CAN_1": "hcan1", "CAN_2": "hcan2", "CAN_3": "hcan3"} def single_handler(frame, name_prepends, num_tabs, fw): tot_name = coord(name_prepends, frame.name, prefix=False) @@ -65,9 +66,14 @@ def write(can, computers, output_path=computer_c_dir_path): fw = f.write fw('#include \n') fw('#include \n') + fw('#include \n') fw('#include "pack_unpack.h"\n') fw('#include "canlib_{}.h"\n\n'.format(computer.name)) + fw('extern CAN_HandleTypeDef hcan1;\n') + fw('extern CAN_HandleTypeDef hcan2;\n') + fw('extern CAN_HandleTypeDef hcan3;\n\n') + fw( 'CAN_Raw_Bus_T CANlib_GetRawBus(CANlib_Bus_T bus) {\n' '\tswitch (bus) {\n' @@ -116,9 +122,11 @@ def write(can, computers, output_path=computer_c_dir_path): if any(is_multplxd(msg) for msg in bus): fw('\tuint64_t bitstring;\n') + raw_bus = computer.participation['name']['can'].mapping[busnm] + instance = raw_bus_to_instance[raw_bus] fw( - '\tif (CANlib_ReadFrame(&(ts_frame.frame), {})) {{\n'.format(computer.participation['name'][ - 'can'].mapping[busnm]) + + '\tif (CANlib_ReadFrame(&{}, &(ts_frame.frame))) {{\n'.format(instance) + + '\t\tts_frame.stamp = HAL_GetTick();\n' + '\t\tCANlib_HandleFrame_{}(&ts_frame);\n'.format(busnm) + '\t}\n' + '}\n\n' From 0cfa2d991b3bbc3dc6b88d70725a18e10b6f3ad6 Mon Sep 17 00:00:00 2001 From: Mingfei Date: Sat, 4 May 2019 16:55:00 -0400 Subject: [PATCH 21/25] Fix typos in update_can and switch on instance --- generator/computers_c.py | 16 +++++++++------- generator/computers_h.py | 2 +- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/generator/computers_c.py b/generator/computers_c.py index ab952e1..39c074f 100644 --- a/generator/computers_c.py +++ b/generator/computers_c.py @@ -6,7 +6,8 @@ frame_handler, is_multplxd from math import ceil -raw_bus_to_instance = {"CAN_1": "hcan1", "CAN_2": "hcan2", "CAN_3": "hcan3"} +raw_bus_to_handle = {"CAN_1": "hcan1", "CAN_2": "hcan2", "CAN_3": "hcan3"} +raw_bus_to_instance = {"CAN_1": "CAN1", "CAN_2": "CAN2", "CAN_3": "CAN3"} def single_handler(frame, name_prepends, num_tabs, fw): tot_name = coord(name_prepends, frame.name, prefix=False) @@ -123,9 +124,9 @@ def write(can, computers, output_path=computer_c_dir_path): fw('\tuint64_t bitstring;\n') raw_bus = computer.participation['name']['can'].mapping[busnm] - instance = raw_bus_to_instance[raw_bus] + instance = raw_bus_to_handle[raw_bus] fw( - '\tif (CANlib_ReadFrame(&{}, &(ts_frame.frame))) {{\n'.format(instance) + + '\tif (HAL_CANlib_ReadFrame(&{}, &(ts_frame.frame))) {{\n'.format(instance) + '\t\tts_frame.stamp = HAL_GetTick();\n' + '\t\tCANlib_HandleFrame_{}(&ts_frame);\n'.format(busnm) + '\t}\n' + @@ -134,16 +135,17 @@ def write(can, computers, output_path=computer_c_dir_path): fw('void CANlib_update_can() {\n') for busnm in computer.participation['name']['can'].subscribe.keys(): - fw('\tCANlib_update_can_{}();\n'.format(busnm)) + fw('\tCANlib_Update_can_{}();\n'.format(busnm)) fw('}\n\n') - fw('void CANlib_HandleFrame(TimestampedFrame *ts_frame, time_t stamp, CAN_Raw_Bus_T raw_bus) {\n') + fw('void CANlib_HandleFrame(TimestampedFrame *ts_frame, time_t stamp, CAN_TypeDef* instance) {\n') if len(computer.participation['name']['can'].subscribe.keys()) > 0: # check if computer receives messages fw('\tts_frame->stamp = stamp;\n') - fw('\tswitch (raw_bus) {\n') + fw('\tswitch ((intptr_t)instance) {\n') for bus in computer.participation['name']['can'].subscribe.keys(): fw( - '\t\tcase {}:\n'.format(computer.participation['name']['can'].mapping[bus]) + + '\t\tcase (intptr_t){}:\n'.format(raw_bus_to_instance[computer.participation['name']['can'].mapping[ + bus]]) + '\t\t\tCANlib_HandleFrame_{}(ts_frame);\n'.format(bus) + '\t\t\tbreak;\n' ) diff --git a/generator/computers_h.py b/generator/computers_h.py index 86546e3..7e7ad99 100644 --- a/generator/computers_h.py +++ b/generator/computers_h.py @@ -65,7 +65,7 @@ def write(can, computers, output_path=computer_h_dir_path): frame_handler(frame, bus_name, declare_sub_frame, fw) fw('\n') fw('void CANlib_update_can(void);\n') - fw('void CANlib_HandleFrame(TimestampedFrame *ts_frame, time_t stamp, CAN_Raw_Bus_T raw_bus);\n') + fw('void CANlib_HandleFrame(TimestampedFrame *ts_frame, time_t stamp, CAN_TypeDef* instance);\n') except KeyError: pass # No CAN messages received by this board From 827eeefd5e3a8c177191a902c66735cac7f6c94b Mon Sep 17 00:00:00 2001 From: Mingfei Date: Sat, 4 May 2019 18:07:28 -0400 Subject: [PATCH 22/25] Extern C stuff --- generator/computers_h.py | 2 ++ src/driver.h | 8 ++++++++ src/drivers/inc/stm32f4xx.h | 8 ++++++++ 3 files changed, 18 insertions(+) diff --git a/generator/computers_h.py b/generator/computers_h.py index 7e7ad99..e6981be 100644 --- a/generator/computers_h.py +++ b/generator/computers_h.py @@ -66,6 +66,8 @@ def write(can, computers, output_path=computer_h_dir_path): fw('\n') fw('void CANlib_update_can(void);\n') fw('void CANlib_HandleFrame(TimestampedFrame *ts_frame, time_t stamp, CAN_TypeDef* instance);\n') + fw('bool HAL_CANlib_ReadFrame(CAN_HandleTypeDef *hcan, Frame* out);\n') + fw('bool HAL_CANlib_ReadFrameFromFIFO(CAN_HandleTypeDef *hcan, uint32_t RxFifo, Frame* out);\n') except KeyError: pass # No CAN messages received by this board diff --git a/src/driver.h b/src/driver.h index 38c75ac..bb0cecd 100644 --- a/src/driver.h +++ b/src/driver.h @@ -5,9 +5,17 @@ #include "bus.h" #include +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + CANlib_Transmit_Error_T CANlib_TransmitFrame(Frame *frame, CANlib_Bus_T bus); bool HAL_CANlib_ReadFrame(CAN_HandleTypeDef *hcan, Frame* out); bool HAL_CANlib_ReadFrameFromFIFO(CAN_HandleTypeDef *hcan, uint32_t RxFifo, Frame* out); CAN_Raw_Bus_T CANlib_GetRawBus(CANlib_Bus_T bus); +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + #endif // __DRIVER_H diff --git a/src/drivers/inc/stm32f4xx.h b/src/drivers/inc/stm32f4xx.h index 3301199..710d0f0 100644 --- a/src/drivers/inc/stm32f4xx.h +++ b/src/drivers/inc/stm32f4xx.h @@ -12,8 +12,16 @@ typedef uint32_t Time_T; // in ms typedef HAL_StatusTypeDef CANlib_Transmit_Error_T; typedef HAL_StatusTypeDef CANlib_Init_Error_T; +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + CANlib_Transmit_Error_T CANlib_TransmitFrame(Frame *frame, CANlib_Bus_T bus); bool HAL_CANlib_ReadFrame(CAN_HandleTypeDef *hcan, Frame* out); bool HAL_CANlib_ReadFrameFromFIFO(CAN_HandleTypeDef *hcan, uint32_t RxFifo, Frame* out); +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + #endif // __STM32F4XX_CAN_H From 04a93f5fb1e196ec48366dd1fc3b41f67439b108 Mon Sep 17 00:00:00 2001 From: Mingfei Date: Sat, 11 May 2019 12:23:36 -0400 Subject: [PATCH 23/25] Fix typo --- src/drivers/src/stm32f4xx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/drivers/src/stm32f4xx.c b/src/drivers/src/stm32f4xx.c index 09ccf41..4826f41 100644 --- a/src/drivers/src/stm32f4xx.c +++ b/src/drivers/src/stm32f4xx.c @@ -50,7 +50,7 @@ bool HAL_CANlib_ReadFrameFromFIFO(CAN_HandleTypeDef *hcan, uint32_t RxFifo, Fram uint8_t data[8] = {}; CAN_RxHeaderTypeDef pHeader; if (HAL_CAN_GetRxFifoFillLevel(hcan, RxFifo) > 0) { - if (HAL_CAN_GetRxMessage(hcan, RxFifo, &pHeader, data) != HAL_OK) { + if (HAL_CAN_GetRxMessage(hcan, RxFifo, &pHeader, data) == HAL_OK) { HAL_CANlib_ConvertFrame(&pHeader, data, out); return true; } From 55267dcc1ca2aceab7daae526ae818722d4c5fcc Mon Sep 17 00:00:00 2001 From: Mingfei Date: Tue, 14 May 2019 21:01:23 -0400 Subject: [PATCH 24/25] Fix unused --- generator/computers_c.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generator/computers_c.py b/generator/computers_c.py index 39c074f..87fda6b 100644 --- a/generator/computers_c.py +++ b/generator/computers_c.py @@ -155,5 +155,5 @@ def write(can, computers, output_path=computer_c_dir_path): else: # prevent unused warning fw('\tUNUSED(ts_frame);\n') fw('\tUNUSED(stamp);\n') - fw('\tUNUSED(raw_bus);\n') + fw('\tUNUSED(instance);\n') fw('}\n') From 18be57ba8d35fa9d16e3ea51c60101c8493f47f6 Mon Sep 17 00:00:00 2001 From: Mingfei Date: Wed, 24 Jul 2019 20:44:41 -0400 Subject: [PATCH 25/25] Add comment --- generator/computers_h.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/generator/computers_h.py b/generator/computers_h.py index e6981be..188ce03 100644 --- a/generator/computers_h.py +++ b/generator/computers_h.py @@ -64,7 +64,7 @@ def write(can, computers, output_path=computer_h_dir_path): for frame in bus: frame_handler(frame, bus_name, declare_sub_frame, fw) fw('\n') - fw('void CANlib_update_can(void);\n') + fw('void CANlib_update_can(void); // for those who still lack CAN interrupts\n') fw('void CANlib_HandleFrame(TimestampedFrame *ts_frame, time_t stamp, CAN_TypeDef* instance);\n') fw('bool HAL_CANlib_ReadFrame(CAN_HandleTypeDef *hcan, Frame* out);\n') fw('bool HAL_CANlib_ReadFrameFromFIFO(CAN_HandleTypeDef *hcan, uint32_t RxFifo, Frame* out);\n') @@ -74,4 +74,3 @@ def write(can, computers, output_path=computer_h_dir_path): fw('\n#ifdef __cplusplus\n} // extern "C"\n#endif // __cplusplus\n\n') fw(endif(header_name)) -