UsaPack for mbed OS 6
Embed:
(wiki syntax)
Show/hide line numbers
UsaPackOS.hpp
00001 #ifndef __USAPACKOS_HPP__ 00002 #define __USAPACKOS_HPP__ 00003 00004 #include "mbed.h" 00005 00006 #define receive_size 256 00007 #define package_types 64 00008 #define send_size 256 00009 00010 extern DigitalOut led; 00011 00012 class UsaPackOS 00013 { 00014 private: 00015 00016 char receive_buffer[receive_size]; 00017 int receive_index; 00018 int package_index; 00019 int package_address[package_types]; 00020 int package_size[package_types]; 00021 void* package_object[package_types]; 00022 00023 00024 char send_buffer[send_size]; 00025 int send_index; 00026 int send_end_index; 00027 00028 void SendByte(); 00029 void Receive(); 00030 void Decode(); 00031 public: 00032 UnbufferedSerial serial; 00033 UsaPackOS(PinName tx, PinName rx, int baud); 00034 static void CobsEncode(char data[], int length, char send_data[]); 00035 static void CobsDecode(char receive_data[], int length, char data[]); 00036 00037 template <typename T> 00038 void Subscribe(int address, T* receive_data) 00039 { 00040 package_address[package_index] = address; 00041 package_size[package_index] = sizeof(T); 00042 package_object[package_index] = receive_data; 00043 package_index++; 00044 } 00045 00046 template <typename T> 00047 void Send(int address, T* send_data) 00048 { 00049 union _package 00050 { 00051 struct 00052 { 00053 int _address; 00054 int _checksum; 00055 T raw_data; 00056 } address_package; 00057 char byte_data[sizeof(address_package)]; 00058 }; 00059 char send_cobs_data[sizeof(_package)+2]; 00060 00061 _package package; 00062 package.address_package._address = address; 00063 package.address_package.raw_data = *send_data; 00064 00065 int checksum = 0; 00066 for (int i = 8; i < sizeof(_package); i++) 00067 { 00068 checksum += package.byte_data[i]; 00069 } 00070 package.address_package._checksum = checksum; 00071 00072 CobsEncode(package.byte_data, (int)sizeof(_package), send_cobs_data); 00073 for (int i = 0; i < sizeof(_package)+2; i++) 00074 { 00075 send_buffer[(send_end_index + i) % send_size] = send_cobs_data[i]; 00076 } 00077 send_end_index = (send_end_index + sizeof(_package) + 2) % send_size; 00078 serial.attach(callback(this, &UsaPackOS::SendByte), UnbufferedSerial::TxIrq); 00079 } 00080 }; 00081 00082 #endif
Generated on Thu Sep 1 2022 14:06:47 by
1.7.2