diff --git a/.cache/clangd/index/main.cpp.6C7D4E708A9CF215.idx b/.cache/clangd/index/main.cpp.6C7D4E708A9CF215.idx index a967e37..6e70e18 100644 Binary files a/.cache/clangd/index/main.cpp.6C7D4E708A9CF215.idx and b/.cache/clangd/index/main.cpp.6C7D4E708A9CF215.idx differ diff --git a/.cache/clangd/index/p_serial_bus.cpp.ABEC82C874071671.idx b/.cache/clangd/index/p_serial_bus.cpp.ABEC82C874071671.idx index 73df55a..c0254db 100644 Binary files a/.cache/clangd/index/p_serial_bus.cpp.ABEC82C874071671.idx and b/.cache/clangd/index/p_serial_bus.cpp.ABEC82C874071671.idx differ diff --git a/.cache/clangd/index/p_serial_bus.h.48DDA2AACC6854FD.idx b/.cache/clangd/index/p_serial_bus.h.48DDA2AACC6854FD.idx index da31c74..47e1373 100644 Binary files a/.cache/clangd/index/p_serial_bus.h.48DDA2AACC6854FD.idx and b/.cache/clangd/index/p_serial_bus.h.48DDA2AACC6854FD.idx differ diff --git a/.cache/clangd/index/p_serial_packet.cpp.45B1DE7F1E66FFCC.idx b/.cache/clangd/index/p_serial_packet.cpp.45B1DE7F1E66FFCC.idx index d5a8f73..62e854b 100644 Binary files a/.cache/clangd/index/p_serial_packet.cpp.45B1DE7F1E66FFCC.idx and b/.cache/clangd/index/p_serial_packet.cpp.45B1DE7F1E66FFCC.idx differ diff --git a/.cache/clangd/index/p_serial_packet.h.38E83F6A61EFB6BA.idx b/.cache/clangd/index/p_serial_packet.h.38E83F6A61EFB6BA.idx index d4bdd84..e38295c 100644 Binary files a/.cache/clangd/index/p_serial_packet.h.38E83F6A61EFB6BA.idx and b/.cache/clangd/index/p_serial_packet.h.38E83F6A61EFB6BA.idx differ diff --git a/.cache/clangd/index/p_util.h.B320A73FB9F772F8.idx b/.cache/clangd/index/p_util.h.B320A73FB9F772F8.idx new file mode 100644 index 0000000..48deef9 Binary files /dev/null and b/.cache/clangd/index/p_util.h.B320A73FB9F772F8.idx differ diff --git a/.gdb_history b/.gdb_history new file mode 100644 index 0000000..2d8b0d6 --- /dev/null +++ b/.gdb_history @@ -0,0 +1,5 @@ +info source +b main +r +info source +q diff --git a/Makefile b/Makefile index 2b5f668..7a1b7b7 100644 --- a/Makefile +++ b/Makefile @@ -2,6 +2,7 @@ TARGET=sbm BUILD_DIR=build MK_DIR=mkdir -p + CPP_SRCS= \ src/main.cpp \ src/p_serial_bus.cpp \ @@ -15,7 +16,24 @@ SIZE=$(TOOLCHAIN)-size INCLUDES=\ -Icfg\ -Iinc -CFLAGS=-Og -Wall -fdata-sections -ffunction-sections -g3 -DDEBUG $(INCLUDES) -lzmq +CFLAGS=-Og \ + -Wall \ + -fdata-sections \ + -ffunction-sections \ + -std=gnu++11 \ + -g3 \ + -DDEBUG \ + $(INCLUDES) \ + -Wextra \ + -Werror \ + -Wconversion \ + -lzmq + +ifdef RUN_TESTS + CPP_SRCS+=tests/tests.cpp + INCLUDES+=-Itests + CFLAGS+=-DRUN_TESTS +endif all: bin/$(TARGET) diff --git a/bin/sbm b/bin/sbm index 811c567..93ae3fd 100644 Binary files a/bin/sbm and b/bin/sbm differ diff --git a/build/main.o b/build/main.o index 27dd328..c2bfcb1 100644 Binary files a/build/main.o and b/build/main.o differ diff --git a/build/p_idp.o b/build/p_idp.o index 5ee1a23..3502edb 100644 Binary files a/build/p_idp.o and b/build/p_idp.o differ diff --git a/build/p_serial_bus.o b/build/p_serial_bus.o index 5ad4aa1..2ee8507 100644 Binary files a/build/p_serial_bus.o and b/build/p_serial_bus.o differ diff --git a/build/p_serial_packet.o b/build/p_serial_packet.o index e21916c..0821794 100644 Binary files a/build/p_serial_packet.o and b/build/p_serial_packet.o differ diff --git a/build/tests.o b/build/tests.o new file mode 100644 index 0000000..1470e03 Binary files /dev/null and b/build/tests.o differ diff --git a/compile_commands.json b/compile_commands.json index 52f3b6f..aaf735f 100644 --- a/compile_commands.json +++ b/compile_commands.json @@ -7,15 +7,88 @@ "-Wall", "-fdata-sections", "-ffunction-sections", + "-std=gnu++11", "-g3", "-DDEBUG", "-Icfg", "-Iinc", + "-Wextra", + "-Werror", + "-Wconversion", "-o", "build/p_serial_bus.o", "src/p_serial_bus.cpp" ], "directory": "/storage/Shared/Projects/Penguinator/pi_serial_bus_manager", "file": "src/p_serial_bus.cpp" + }, + { + "arguments": [ + "g++", + "-c", + "-Og", + "-Wall", + "-fdata-sections", + "-ffunction-sections", + "-std=gnu++11", + "-g3", + "-DDEBUG", + "-Icfg", + "-Iinc", + "-Wextra", + "-Werror", + "-Wconversion", + "-o", + "build/p_idp.o", + "src/p_idp.cpp" + ], + "directory": "/storage/Shared/Projects/Penguinator/pi_serial_bus_manager", + "file": "src/p_idp.cpp" + }, + { + "arguments": [ + "g++", + "-c", + "-Og", + "-Wall", + "-fdata-sections", + "-ffunction-sections", + "-std=gnu++11", + "-g3", + "-DDEBUG", + "-Icfg", + "-Iinc", + "-Wextra", + "-Werror", + "-Wconversion", + "-o", + "build/main.o", + "src/main.cpp" + ], + "directory": "/storage/Shared/Projects/Penguinator/pi_serial_bus_manager", + "file": "src/main.cpp" + }, + { + "arguments": [ + "g++", + "-c", + "-Og", + "-Wall", + "-fdata-sections", + "-ffunction-sections", + "-std=gnu++11", + "-g3", + "-DDEBUG", + "-Icfg", + "-Iinc", + "-Wextra", + "-Werror", + "-Wconversion", + "-o", + "build/p_serial_packet.o", + "src/p_serial_packet.cpp" + ], + "directory": "/storage/Shared/Projects/Penguinator/pi_serial_bus_manager", + "file": "src/p_serial_packet.cpp" } ] \ No newline at end of file diff --git a/env.sh b/env.sh index 86b6ab3..5ff1ece 100644 --- a/env.sh +++ b/env.sh @@ -1,6 +1,7 @@ alias pipush="rsync -ar \ --include='src**' \ --include='inc**' \ + --include='Makefile' \ --exclude='*' \ ~/Projects/Penguinator/pi_serial_bus_manager/ penguin@192.168.1.121:~/pi_serial_bus_manager" alias pipull="rsync -ar penguin@192.168.1.121:~/pi_serial_bus_manager/* ~/Projects/Penguinator/pi_serial_bus_manager" diff --git a/inc/p_serial_packet.h b/inc/p_serial_packet.h index 4cad629..4b4eba5 100644 --- a/inc/p_serial_packet.h +++ b/inc/p_serial_packet.h @@ -20,7 +20,7 @@ public: ps_packet(uint8_t _src_addr, uint8_t _dest_addr, uint8_t* _frame_data, uint8_t _frame_data_len); // for decoding - ps_packet(uint8_t* data); + ps_packet(uint8_t* _msg, size_t _msg_len); ~ps_packet(); uint8_t* src_addr; uint8_t* dest_addr; @@ -32,8 +32,9 @@ public: bool encode(); bool decode(); static ps_packet from_xy(int x, int y); - static ps_packet test_packet(); #ifdef DEBUG + static ps_packet test_packet_send(); + static ps_packet test_packet_recv(); void show_packet() const; #endif diff --git a/inc/p_util.h b/inc/p_util.h new file mode 100644 index 0000000..54c6c68 --- /dev/null +++ b/inc/p_util.h @@ -0,0 +1,6 @@ +#ifndef __P_UTIL_H__ +#define __P_UTIL_H__ + +#define UNUSED(x) (void)(x) + +#endif diff --git a/src/main.cpp b/src/main.cpp index f2f9d7d..410b4fa 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,5 +1,6 @@ #include "p_serial_bus.h" #include "p_serial_packet.h" +#include "p_util.h" #include #include #include @@ -7,6 +8,10 @@ #include #include +#ifdef RUN_TESTS +#include "tests.h" +#endif + #define SERIAL_DEV ("/dev/ttyAMA1") #define ZMQ_IPC_ADDR ("ipc:///penguinator/pubsub") @@ -17,6 +22,7 @@ bool b_quit = false; void sigint_handler(int param) { + (void)param; b_quit = true; std::cout << "Exiting..." << std::endl; return; @@ -24,6 +30,10 @@ void sigint_handler(int param) int main() { +#ifdef RUN_TESTS + run_tests(); + return 0; +#endif signal(SIGINT, sigint_handler); ps_bus sbus(SERIAL_DEV); @@ -39,7 +49,7 @@ int main() int32_t y = 0; try { - if (sub.recv(&msg_recv, 0)) + if (sub.recv(msg_recv, zmq::recv_flags(0))) { uint8_t xy[64]; memset(xy, 0, 64); diff --git a/src/p_serial_bus.cpp b/src/p_serial_bus.cpp index 10a45a7..7b79a3f 100644 --- a/src/p_serial_bus.cpp +++ b/src/p_serial_bus.cpp @@ -1,4 +1,5 @@ #include "p_serial_bus.h" +#include "p_util.h" #include #include #include @@ -33,7 +34,7 @@ ps_bus::ps_bus(const char* dev) /* Set logical level for RTS pin equal to 1 after sending: */ // rs485conf.flags |= SER_RS485_RTS_AFTER_SEND; /* or, set logical level for RTS pin equal to 0 after sending: */ - rs485conf.flags &= ~(SER_RS485_RTS_AFTER_SEND); + rs485conf.flags &= (uint32_t) ~(SER_RS485_RTS_AFTER_SEND); // /* Set rts delay before send, if needed: */ // rs485conf.delay_rts_before_send = ...; @@ -46,18 +47,18 @@ ps_bus::ps_bus(const char* dev) memset(&toptions, 0, sizeof(toptions)); tcgetattr(dev_fd, &toptions); - toptions.c_cflag &= ~(CSIZE | PARENB); + toptions.c_cflag &= (uint32_t) ~(CSIZE | PARENB); // enable receiver toptions.c_cflag |= CREAD; // 8 data bit toptions.c_cflag |= CS8; // Ignore framing errors and parity errors - toptions.c_lflag &= ~(ICANON); - toptions.c_lflag &= ~(ECHO); - toptions.c_lflag &= ~(ECHOE); + toptions.c_lflag &= (uint32_t) ~(ICANON); + toptions.c_lflag &= (uint32_t) ~(ECHO); + toptions.c_lflag &= (uint32_t) ~(ECHOE); // disable signal chars - toptions.c_lflag &= ~(ISIG); + toptions.c_lflag &= (uint32_t) ~(ISIG); // set baud rate cfsetspeed(&toptions, B115200); // flush cache @@ -84,7 +85,7 @@ bool ps_bus::send_pkt(const ps_packet* const pkt) { bool ret = true; pkt->show_packet(); - if (write(dev_fd, pkt->data, pkt->msg_len) != pkt->msg_len) + if (write(dev_fd, pkt->data, pkt->msg_len) != (int)pkt->msg_len) { ret = false; } @@ -94,6 +95,7 @@ bool ps_bus::send_pkt(const ps_packet* const pkt) } bool ps_bus::recv_pkt(ps_packet* const pkt) { + UNUSED(pkt); bool ret = true; return ret; } diff --git a/src/p_serial_packet.cpp b/src/p_serial_packet.cpp index 1a66e3b..a8dd870 100644 --- a/src/p_serial_packet.cpp +++ b/src/p_serial_packet.cpp @@ -1,11 +1,21 @@ #include "p_serial_packet.h" +#include "p_util.h" #include #include #include #include -ps_packet::ps_packet(uint8_t* data) -{} +ps_packet::ps_packet(uint8_t* _msg, size_t _msg_len) +{ + memset(data, 0, MAX_MESSAGE_LEN); + memcpy(data, _msg, _msg_len); + src_addr = &data[1]; + dest_addr = &data[2]; + frame_data_len = &data[3]; + frame_data = &data[4]; + msg_len = _msg_len; + checksum = nullptr; +} ps_packet::ps_packet(uint8_t _src_addr, uint8_t _dest_addr, uint8_t* _frame_data, uint8_t _frame_data_len) @@ -56,7 +66,7 @@ bool ps_packet::decode() ret = false; break; } - + checksum = &data[msg_len - 1]; if (!validate()) { ret = false; @@ -70,12 +80,14 @@ bool ps_packet::decode() // done after receiving a packet and destuffing it bool ps_packet::validate() { - bool ret = true; - do + uint8_t csum = calc_checksum(); + if (csum != *checksum) { - - } while (0); - return ret; + printf("Bad checksum check\nCalculated: 0x%02x\nActual: 0x%02x\n", csum, + *checksum); + return false; + } + return true; } uint8_t ps_packet::calc_checksum() @@ -119,7 +131,30 @@ bool ps_packet::stuff_bytes() bool ps_packet::destuff_bytes() { - return false; + bool ret = true; + + uint8_t _checksum = data[msg_len - 1]; + int old_ind = 0; + int new_ind = 0; + uint8_t temp_buffer[MAX_FRAME_DATA_LEN] = {0}; + memcpy(temp_buffer, frame_data, MAX_FRAME_DATA_LEN); + memset(frame_data, 0, MAX_FRAME_DATA_LEN); + for (; new_ind < *frame_data_len; new_ind++) + { + if (temp_buffer[old_ind] == 0x7D) + { + msg_len--; + frame_data[new_ind] = temp_buffer[++old_ind] ^ 0x20; + } + else + { + frame_data[new_ind] = temp_buffer[old_ind]; + } + old_ind++; + } + checksum = &data[msg_len - 1]; + *checksum = _checksum; + return ret; } ps_packet ps_packet::from_xy(int32_t x, int32_t y) @@ -135,7 +170,7 @@ ps_packet ps_packet::from_xy(int32_t x, int32_t y) return ps_packet(MASTER_ADDR, 0x02, frame_data, 1 + sizeof(x) + sizeof(y)); } -ps_packet ps_packet::test_packet() +ps_packet ps_packet::test_packet_send() { uint8_t frame_data[16] = {0xFF, 0x01, 0x02, 0x03, 0x04, 0x7D, 0x7D, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0F, 0x7E}; @@ -143,6 +178,16 @@ ps_packet ps_packet::test_packet() return ps_packet(MASTER_ADDR, 0xFF, frame_data, 16); } +ps_packet ps_packet::test_packet_recv() +{ + uint8_t frame_data[24] = {0x7E, 0xFF, MASTER_ADDR, 0x10, 0xFF, 0x01, + 0x02, 0x03, 0x04, 0x7D, 0x5D, 0x7D, + 0x5D, 0x07, 0x08, 0x09, 0x0A, 0x0B, + 0x0C, 0x0D, 0x0F, 0x7D, 0x5E, 0x29}; + + return ps_packet(frame_data, 24); +} + #ifdef DEBUG void ps_packet::show_packet() const { @@ -157,6 +202,6 @@ void ps_packet::show_packet() const } printf("\n"); printf("Message Length: %lu\n", msg_len); - printf("Checksum: %0x02x\n", *checksum); + printf("Checksum: 0x%02x\n", *checksum); } #endif diff --git a/tests/tests.cpp b/tests/tests.cpp new file mode 100644 index 0000000..1652bab --- /dev/null +++ b/tests/tests.cpp @@ -0,0 +1,24 @@ +#include "tests.h" +#include "p_serial_packet.h" + +void run_tests() +{ + + // tests + ps_packet test_pkt_send = ps_packet::test_packet_send(); + test_pkt_send.encode(); + test_pkt_send.show_packet(); + printf("\n\n"); + bool decode_ret = test_pkt_send.decode(); + printf("Decode was %s\n", decode_ret ? "Successful" : "Unsuccessful"); + test_pkt_send.show_packet(); + printf("\n\n"); + + ps_packet test_pkt_recv = ps_packet::test_packet_recv(); + bool decode_ret_recv = test_pkt_recv.decode(); + printf("Decode was %s\n", decode_ret_recv ? "Successful" : "Unsuccessful"); + test_pkt_recv.show_packet(); + printf("\n\n"); + test_pkt_recv.encode(); + test_pkt_recv.show_packet(); +} diff --git a/tests/tests.h b/tests/tests.h new file mode 100644 index 0000000..bcf2a70 --- /dev/null +++ b/tests/tests.h @@ -0,0 +1,6 @@ +#ifndef __TESTS_H__ +#define __TESTS_H__ + +void run_tests(); + +#endif