UsaPack for mbed OS 6

Dependents:   mbedOS_UsaPackOS

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers UsaPackOS.hpp Source File

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