clear project
							parent
							
								
									7ab4153cca
								
							
						
					
					
						commit
						3abcb43b33
					
				| @ -1,109 +0,0 @@ | ||||
| /*
 | ||||
|  * ModbusRTUCRC.cpp | ||||
|  * | ||||
|  *      Author: Aleksey Gerasimenko | ||||
|  *      gerasimenko.aleksey.n@gmail.com | ||||
|  */ | ||||
| 
 | ||||
| #include "MODBUSRTU/ModbusRTUCRC.h" | ||||
| 
 | ||||
| namespace MODBUSRTU | ||||
| { | ||||
| 
 | ||||
| const uint16_t ModbusRTUCRC::m_table[256] = {0x0000, 0xC1C0, 0x81C1, 0x4001, 0x01C3, 0xC003, 0x8002, 0x41C2, | ||||
|                                       0x01C6, 0xC006, 0x8007, 0x41C7, 0x0005, 0xC1C5, 0x81C4, 0x4004, | ||||
|                                       0x01CC, 0xC00C, 0x800D, 0x41CD, 0x000F, 0xC1CF, 0x81CE, 0x400E, | ||||
|                                       0x000A, 0xC1CA, 0x81CB, 0x400B, 0x01C9, 0xC009, 0x8008, 0x41C8, | ||||
|                                       0x01D8, 0xC018, 0x8019, 0x41D9, 0x001B, 0xC1DB, 0x81DA, 0x401A, | ||||
|                                       0x001E, 0xC1DE, 0x81DF, 0x401F, 0x01DD, 0xC01D, 0x801C, 0x41DC, | ||||
|                                       0x0014, 0xC1D4, 0x81D5, 0x4015, 0x01D7, 0xC017, 0x8016, 0x41D6, | ||||
|                                       0x01D2, 0xC012, 0x8013, 0x41D3, 0x0011, 0xC1D1, 0x81D0, 0x4010, | ||||
|                                       0x01F0, 0xC030, 0x8031, 0x41F1, 0x0033, 0xC1F3, 0x81F2, 0x4032, | ||||
|                                       0x0036, 0xC1F6, 0x81F7, 0x4037, 0x01F5, 0xC035, 0x8034, 0x41F4, | ||||
|                                       0x003C, 0xC1FC, 0x81FD, 0x403D, 0x01FF, 0xC03F, 0x803E, 0x41FE, | ||||
|                                       0x01FA, 0xC03A, 0x803B, 0x41FB, 0x0039, 0xC1F9, 0x81F8, 0x4038, | ||||
|                                       0x0028, 0xC1E8, 0x81E9, 0x4029, 0x01EB, 0xC02B, 0x802A, 0x41EA, | ||||
|                                       0x01EE, 0xC02E, 0x802F, 0x41EF, 0x002D, 0xC1ED, 0x81EC, 0x402C, | ||||
|                                       0x01E4, 0xC024, 0x8025, 0x41E5, 0x0027, 0xC1E7, 0x81E6, 0x4026, | ||||
|                                       0x0022, 0xC1E2, 0x81E3, 0x4023, 0x01E1, 0xC021, 0x8020, 0x41E0, | ||||
|                                       0x01A0, 0xC060, 0x8061, 0x41A1, 0x0063, 0xC1A3, 0x81A2, 0x4062, | ||||
|                                       0x0066, 0xC1A6, 0x81A7, 0x4067, 0x01A5, 0xC065, 0x8064, 0x41A4, | ||||
|                                       0x006C, 0xC1AC, 0x81AD, 0x406D, 0x01AF, 0xC06F, 0x806E, 0x41AE, | ||||
|                                       0x01AA, 0xC06A, 0x806B, 0x41AB, 0x0069, 0xC1A9, 0x81A8, 0x4068, | ||||
|                                       0x0078, 0xC1B8, 0x81B9, 0x4079, 0x01BB, 0xC07B, 0x807A, 0x41BA, | ||||
|                                       0x01BE, 0xC07E, 0x807F, 0x41BF, 0x007D, 0xC1BD, 0x81BC, 0x407C, | ||||
|                                       0x01B4, 0xC074, 0x8075, 0x41B5, 0x0077, 0xC1B7, 0x81B6, 0x4076, | ||||
|                                       0x0072, 0xC1B2, 0x81B3, 0x4073, 0x01B1, 0xC071, 0x8070, 0x41B0, | ||||
|                                       0x0050, 0xC190, 0x8191, 0x4051, 0x0193, 0xC053, 0x8052, 0x4192, | ||||
|                                       0x0196, 0xC056, 0x8057, 0x4197, 0x0055, 0xC195, 0x8194, 0x4054, | ||||
|                                       0x019C, 0xC05C, 0x805D, 0x419D, 0x005F, 0xC19F, 0x819E, 0x405E, | ||||
|                                       0x005A, 0xC19A, 0x819B, 0x405B, 0x0199, 0xC059, 0x8058, 0x4198, | ||||
|                                       0x0188, 0xC048, 0x8049, 0x4189, 0x004B, 0xC18B, 0x818A, 0x404A, | ||||
|                                       0x004E, 0xC18E, 0x818F, 0x404F, 0x018D, 0xC04D, 0x804C, 0x418C, | ||||
|                                       0x0044, 0xC184, 0x8185, 0x4045, 0x0187, 0xC047, 0x8046, 0x4186, | ||||
|                                       0x0182, 0xC042, 0x8043, 0x4183, 0x0041, 0xC181, 0x8180, 0x4040}; | ||||
| 
 | ||||
| //CONSTRUCTOR
 | ||||
| ModbusRTUCRC::ModbusRTUCRC(): | ||||
|         m_crc_calculate(), | ||||
|         m_table_crc_index(0), | ||||
|         m_table_crc_value(), | ||||
|         m_start(0), | ||||
|         m_end(0) | ||||
| {}//CONSTRUCTOR
 | ||||
| 
 | ||||
| 
 | ||||
| // #pragma CODE_SECTION("ramfuncs");
 | ||||
| uint16_t ModbusRTUCRC::calculate(uint16_t *start, uint16_t length) | ||||
| { | ||||
|     m_crc_calculate.all = 0x0ffFF; | ||||
|     m_start = start; | ||||
|     m_end = start + length - 1; | ||||
| 
 | ||||
|     _while_cycle(); | ||||
| 
 | ||||
|     return m_crc_calculate.all; | ||||
| }//
 | ||||
| //
 | ||||
| // #pragma CODE_SECTION("ramfuncs");
 | ||||
| uint16_t ModbusRTUCRC::calculate(uint16_t *start, uint16_t *end) | ||||
| { | ||||
|     m_crc_calculate.all = 0x0ffFF; | ||||
|     m_start = start; | ||||
|     m_end = end; | ||||
| 
 | ||||
|     _while_cycle(); | ||||
| 
 | ||||
|     return m_crc_calculate.all; | ||||
| }//
 | ||||
| //
 | ||||
| // #pragma CODE_SECTION("ramfuncs");
 | ||||
| uint16_t ModbusRTUCRC::calculate(uint16_t databyte, uint16_t crc) | ||||
| { | ||||
|     m_crc_calculate.all = crc; | ||||
| 
 | ||||
|     m_table_crc_index = m_crc_calculate.byte.low ^ databyte; | ||||
|     m_table_crc_value.all = m_table[m_table_crc_index]; | ||||
|     m_crc_calculate.byte.low = m_crc_calculate.byte.high ^ m_table_crc_value.byte.high; | ||||
|     m_crc_calculate.byte.high = m_table_crc_value.byte.low; | ||||
| 
 | ||||
|     return m_crc_calculate.all; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| // #pragma CODE_SECTION("ramfuncs");
 | ||||
| inline void ModbusRTUCRC::_while_cycle() | ||||
| { | ||||
|     while(m_start <= m_end) | ||||
|     { | ||||
|         m_table_crc_index = m_crc_calculate.byte.low ^ (*m_start++); | ||||
|         m_table_crc_value.all = m_table[m_table_crc_index]; | ||||
|         m_crc_calculate.byte.low = m_crc_calculate.byte.high ^ m_table_crc_value.byte.high; | ||||
|         m_crc_calculate.byte.high = m_table_crc_value.byte.low; | ||||
|         //
 | ||||
|     }//while
 | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| 
 | ||||
| } /* namespace MODBUSRTU */ | ||||
| @ -1,58 +0,0 @@ | ||||
| /*
 | ||||
|  * ModbusRTUCRC.h | ||||
|  * | ||||
|  *      Author: Aleksey Gerasimenko | ||||
|  *      gerasimenko.aleksey.n@gmail.com | ||||
|  */ | ||||
| 
 | ||||
| #include <math.h> | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| 
 | ||||
| #ifndef MODBUSRTU_MODBUSRTUCRC_H_ | ||||
| #define MODBUSRTU_MODBUSRTUCRC_H_ | ||||
| 
 | ||||
| 
 | ||||
| struct Uint16ByteField | ||||
| { | ||||
|     uint16_t low: 8; | ||||
|     uint16_t high: 8; | ||||
| };//Uint16ByteField
 | ||||
| 
 | ||||
| union Uint16Register | ||||
| { | ||||
|     uint16_t all; | ||||
|     Uint16ByteField byte; | ||||
|     Uint16Register(): | ||||
|     all(0) | ||||
|     {} | ||||
| };//
 | ||||
| 
 | ||||
| 
 | ||||
| namespace MODBUSRTU | ||||
| { | ||||
| 
 | ||||
| class ModbusRTUCRC | ||||
| { | ||||
| private: | ||||
|     static const uint16_t m_table[256]; | ||||
| private: | ||||
| 
 | ||||
|     Uint16Register  m_crc_calculate; | ||||
|     uint16_t        m_table_crc_index; | ||||
|     Uint16Register  m_table_crc_value; | ||||
|     uint16_t        *m_start; | ||||
|     uint16_t        *m_end; | ||||
| public: | ||||
|     ModbusRTUCRC(); | ||||
| public: | ||||
|     uint16_t calculate(uint16_t *start, uint16_t length); | ||||
|     uint16_t calculate(uint16_t *start, uint16_t *end); | ||||
|     uint16_t calculate(uint16_t databyte, uint16_t crc); | ||||
| private: | ||||
|     inline void _while_cycle(); | ||||
| }; | ||||
| 
 | ||||
| } /* namespace MODBUSRTU */ | ||||
| 
 | ||||
| #endif /* MODBUSRTU_MODBUSRTUCRC_H_ */ | ||||
| @ -1,65 +0,0 @@ | ||||
| /*
 | ||||
|  * ModbusRTUCRCTable.h | ||||
|  * | ||||
|  *      Author: Aleksey Gerasimenko | ||||
|  *      gerasimenko.aleksey.n@gmail.com | ||||
|  */ | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| #ifndef MODBUSRTU_MODBUSRTUCRCTABLE_H_ | ||||
| #define MODBUSRTU_MODBUSRTUCRCTABLE_H_ | ||||
| 
 | ||||
| struct Uint16ByteField | ||||
| { | ||||
|     uint16_t low: 8; | ||||
|     uint16_t high: 8; | ||||
| };//Uint16ByteField
 | ||||
| 
 | ||||
| union Uint16Register | ||||
| { | ||||
|     uint16_t all; | ||||
|     Uint16ByteField byte; | ||||
|     Uint16Register(): | ||||
|     all(0) | ||||
|     {} | ||||
| };//
 | ||||
| 
 | ||||
| static const  uint16_t TABLE_CRC_16[] = | ||||
|     { | ||||
|         0x0000, 0xC1C0, 0x81C1, 0x4001, 0x01C3, 0xC003, 0x8002, 0x41C2, | ||||
|         0x01C6, 0xC006, 0x8007, 0x41C7, 0x0005, 0xC1C5, 0x81C4, 0x4004, | ||||
|         0x01CC, 0xC00C, 0x800D, 0x41CD, 0x000F, 0xC1CF, 0x81CE, 0x400E, | ||||
|         0x000A, 0xC1CA, 0x81CB, 0x400B, 0x01C9, 0xC009, 0x8008, 0x41C8, | ||||
|         0x01D8, 0xC018, 0x8019, 0x41D9, 0x001B, 0xC1DB, 0x81DA, 0x401A, | ||||
|         0x001E, 0xC1DE, 0x81DF, 0x401F, 0x01DD, 0xC01D, 0x801C, 0x41DC, | ||||
|         0x0014, 0xC1D4, 0x81D5, 0x4015, 0x01D7, 0xC017, 0x8016, 0x41D6, | ||||
|         0x01D2, 0xC012, 0x8013, 0x41D3, 0x0011, 0xC1D1, 0x81D0, 0x4010, | ||||
|         0x01F0, 0xC030, 0x8031, 0x41F1, 0x0033, 0xC1F3, 0x81F2, 0x4032, | ||||
|         0x0036, 0xC1F6, 0x81F7, 0x4037, 0x01F5, 0xC035, 0x8034, 0x41F4, | ||||
|         0x003C, 0xC1FC, 0x81FD, 0x403D, 0x01FF, 0xC03F, 0x803E, 0x41FE, | ||||
|         0x01FA, 0xC03A, 0x803B, 0x41FB, 0x0039, 0xC1F9, 0x81F8, 0x4038, | ||||
|         0x0028, 0xC1E8, 0x81E9, 0x4029, 0x01EB, 0xC02B, 0x802A, 0x41EA, | ||||
|         0x01EE, 0xC02E, 0x802F, 0x41EF, 0x002D, 0xC1ED, 0x81EC, 0x402C, | ||||
|         0x01E4, 0xC024, 0x8025, 0x41E5, 0x0027, 0xC1E7, 0x81E6, 0x4026, | ||||
|         0x0022, 0xC1E2, 0x81E3, 0x4023, 0x01E1, 0xC021, 0x8020, 0x41E0, | ||||
|         0x01A0, 0xC060, 0x8061, 0x41A1, 0x0063, 0xC1A3, 0x81A2, 0x4062, | ||||
|         0x0066, 0xC1A6, 0x81A7, 0x4067, 0x01A5, 0xC065, 0x8064, 0x41A4, | ||||
|         0x006C, 0xC1AC, 0x81AD, 0x406D, 0x01AF, 0xC06F, 0x806E, 0x41AE, | ||||
|         0x01AA, 0xC06A, 0x806B, 0x41AB, 0x0069, 0xC1A9, 0x81A8, 0x4068, | ||||
|         0x0078, 0xC1B8, 0x81B9, 0x4079, 0x01BB, 0xC07B, 0x807A, 0x41BA, | ||||
|         0x01BE, 0xC07E, 0x807F, 0x41BF, 0x007D, 0xC1BD, 0x81BC, 0x407C, | ||||
|         0x01B4, 0xC074, 0x8075, 0x41B5, 0x0077, 0xC1B7, 0x81B6, 0x4076, | ||||
|         0x0072, 0xC1B2, 0x81B3, 0x4073, 0x01B1, 0xC071, 0x8070, 0x41B0, | ||||
|         0x0050, 0xC190, 0x8191, 0x4051, 0x0193, 0xC053, 0x8052, 0x4192, | ||||
|         0x0196, 0xC056, 0x8057, 0x4197, 0x0055, 0xC195, 0x8194, 0x4054, | ||||
|         0x019C, 0xC05C, 0x805D, 0x419D, 0x005F, 0xC19F, 0x819E, 0x405E, | ||||
|         0x005A, 0xC19A, 0x819B, 0x405B, 0x0199, 0xC059, 0x8058, 0x4198, | ||||
|         0x0188, 0xC048, 0x8049, 0x4189, 0x004B, 0xC18B, 0x818A, 0x404A, | ||||
|         0x004E, 0xC18E, 0x818F, 0x404F, 0x018D, 0xC04D, 0x804C, 0x418C, | ||||
|         0x0044, 0xC184, 0x8185, 0x4045, 0x0187, 0xC047, 0x8046, 0x4186, | ||||
|         0x0182, 0xC042, 0x8043, 0x4183, 0x0041, 0xC181, 0x8180, 0x4040 | ||||
|     }; | ||||
| 
 | ||||
| 
 | ||||
| #endif /* MODBUSRTU_MODBUSRTUCRCTABLE_H_ */ | ||||
| @ -1,257 +0,0 @@ | ||||
| /*
 | ||||
|  * ModbusRTUDefines.h | ||||
|  * | ||||
|  *      Author: Aleksey Gerasimenko | ||||
|  *      gerasimenko.aleksey.n@gmail.com | ||||
|  */ | ||||
| 
 | ||||
| #include <math.h> | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| #include "F28335/DSP28x_Project.h" | ||||
| #include "F28335/DSP2833x_Examples.h" | ||||
| 
 | ||||
| #include "DSP28335/GPIO.h" | ||||
| #include "DSP28335/SCIBase.h" | ||||
| 
 | ||||
| #include "MODBUSRTU/ModbusRTUVariant.h" | ||||
| 
 | ||||
| 
 | ||||
| #ifndef SCIRS485_BAUDRATE_DEFAULT | ||||
| //#define SCIRS485_BAUDRATE_DEFAULT   (DSP28335::BR2400)
 | ||||
| //#define SCIRS485_BAUDRATE_DEFAULT   (DSP28335::BR4800)
 | ||||
| #define SCIRS485_BAUDRATE_DEFAULT   (DSP28335::BR9600) | ||||
| //#define SCIRS485_BAUDRATE_DEFAULT   (DSP28335::BR14400)
 | ||||
| //#define SCIRS485_BAUDRATE_DEFAULT   (DSP28335::BR19200)
 | ||||
| //#define SCIRS485_BAUDRATE_DEFAULT   (DSP28335::BR38400)
 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef SCIRS485_PARITY_DEFAULT | ||||
| #define SCIRS485_PARITY_DEFAULT     (DSP28335::NO) | ||||
| //#define SCIRS485_PARITY_DEFAULT     (MODBUSRTU::ODD)
 | ||||
| //#define SCIRS485_PARITY_DEFAULT     (MODBUSRTU::EVEN)
 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef SCIRS485_STOPBITS_DEFAULT | ||||
| #define SCIRS485_STOPBITS_DEFAULT   (DSP28335::ONE) | ||||
| //#define SCIRS485_STOPBITS_DEFAULT   (DSP28335::ODD)
 | ||||
| //#define SCIRS485_STOPBITS_DEFAULT   (DSP28335::EVEN)
 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef SCIRS485_LENGHT_DEFAULT | ||||
| #define SCIRS485_LENGHT_DEFAULT     (DSP28335::LEN8) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef SCIRS485_GPIO_SETUP_DEFAULT | ||||
| #define SCIRS485_GPIO_SETUP_DEFAULT (&DSP28335::GPIO::gpio_scib_setup) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef SCIRS485_GPIO_DE_DEFAULT | ||||
| #define SCIRS485_GPIO_DE_DEFAULT (&DSP28335::GPIO::gpio_scib_re_de_set) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef SCIRS485_GPIO_RE_DEFAULT | ||||
| #define SCIRS485_GPIO_RE_DEFAULT (&DSP28335::GPIO::gpio_scib_re_de_clear) | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| #ifndef NOP | ||||
| #define  NOP   asm(" NOP") | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #ifndef MODBUSRTU_FUNCTION_BROADCAST | ||||
| #define MODBUSRTU_FUNCTION_BROADCAST                    (uint16_t) 00 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef MODBUSRTU_FUNCTION_READ_COIL_STATUS | ||||
| #define MODBUSRTU_FUNCTION_READ_COIL_STATUS             (uint16_t) 01 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef MODBUSRTU_FUNCTION_READ_INPUT_STATUS | ||||
| #define MODBUSRTU_FUNCTION_READ_INPUT_STATUS            (uint16_t) 02 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef MODBUSRTU_FUNCTION_READ_HOLDING_REGISTERS | ||||
| #define MODBUSRTU_FUNCTION_READ_HOLDING_REGISTERS       (uint16_t) 03 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef MODBUSRTU_FUNCTION_READ_INPUT_REGISTERS | ||||
| #define MODBUSRTU_FUNCTION_READ_INPUT_REGISTERS         (uint16_t) 04 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef MODBUSRTU_FUNCTION_FORCE_SINGLE_COIL | ||||
| #define MODBUSRTU_FUNCTION_FORCE_SINGLE_COIL            (uint16_t) 05 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef MODBUSRTU_FUNCTION_PRESET_SINGLE_REGISTER | ||||
| #define MODBUSRTU_FUNCTION_PRESET_SINGLE_REGISTER       (uint16_t) 06 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef MODBUSRTU_FUNCTION_FORCE_MULTIPLE_COILS | ||||
| #define MODBUSRTU_FUNCTION_FORCE_MULTIPLE_COILS         (uint16_t) 15 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef MODBUSRTU_FUNCTION_PRESET_MULTIPLE_REGISTERS | ||||
| #define MODBUSRTU_FUNCTION_PRESET_MULTIPLE_REGISTERS    (uint16_t) 16 | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #ifndef DEFAULT_MODBUSRTU_INPUT_REGISTERS_SIZE | ||||
| #define DEFAULT_MODBUSRTU_INPUT_REGISTERS_SIZE (uint16_t)10 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef DEFAULT_MODBUSRTU_OUTPUT_REGISTERS_SIZE | ||||
| #define DEFAULT_MODBUSRTU_OUTPUT_REGISTERS_SIZE (uint16_t)10 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef DEFAULT_MODBUSRTU_INPUT_COILS_SIZE | ||||
| #define DEFAULT_MODBUSRTU_INPUT_COILS_SIZE (uint16_t)10 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef DEFAULT_MODBUSRTU_OUTPUT_COILS_SIZE | ||||
| #define DEFAULT_MODBUSRTU_OUTPUT_COILS_SIZE (uint16_t)10 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef MODBUSRTU_INPUT_REGISTERS_SIZE | ||||
| #define MODBUSRTU_INPUT_REGISTERS_SIZE DEFAULT_MODBUSRTU_INPUT_REGISTERS_SIZE | ||||
| #endif | ||||
| 
 | ||||
| #ifndef MODBUSRTU_OUTPUT_REGISTERS_SIZE | ||||
| #define MODBUSRTU_OUTPUT_REGISTERS_SIZE  DEFAULT_MODBUSRTU_OUTPUT_REGISTERS_SIZE | ||||
| #endif | ||||
| 
 | ||||
| #ifndef MODBUSRTU_INPUT_COILS_SIZE | ||||
| #define MODBUSRTU_INPUT_COILS_SIZE  DEFAULT_MODBUSRTU_INPUT_COILS_SIZE | ||||
| #endif | ||||
| 
 | ||||
| #ifndef MODBUSRTU_OUTPUT_COILS_SIZE | ||||
| #define MODBUSRTU_OUTPUT_COILS_SIZE  DEFAULT_MODBUSRTU_OUTPUT_COILS_SIZE | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #ifndef MODBUSRTU_MODBUSRTUDEFINES_H_ | ||||
| #define MODBUSRTU_MODBUSRTUDEFINES_H_ | ||||
| 
 | ||||
| 
 | ||||
| namespace MODBUSRTU | ||||
| { | ||||
| 
 | ||||
| enum buffer_type_t  {OUTPUTCOILS, INPUTCOILS, OUTPUTREGISTERS, INPUTREGISTERS}; | ||||
| enum transceiver_state_machine_t {SCAN, RECEIVE, WAIT_RESPONSE, TRANSMIT, BREAK}; | ||||
| enum transceiver_event_t {ENTRY, RXREADY, TXREADY, TXWAIT}; | ||||
| 
 | ||||
| enum modbusrtu_register_16_bit_t {  REG16_BIT0, | ||||
|                                     REG16_BIT1, | ||||
|                                     REG16_BIT2, | ||||
|                                     REG16_BIT3, | ||||
|                                     REG16_BIT4, | ||||
|                                     REG16_BIT5, | ||||
|                                     REG16_BIT6, | ||||
|                                     REG16_BIT7, | ||||
|                                     REG16_BIT8, | ||||
|                                     REG16_BIT9, | ||||
|                                     REG16_BIT10, | ||||
|                                     REG16_BIT11, | ||||
|                                     REG16_BIT12, | ||||
|                                     REG16_BIT13, | ||||
|                                     REG16_BIT14, | ||||
|                                     REG16_BIT15}; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| //struct ModbusRTUDataByteField
 | ||||
| //{
 | ||||
| //    uint16_t low :8;
 | ||||
| //    uint16_t high :8;
 | ||||
| //};//ModbusRTUDataByteField
 | ||||
| 
 | ||||
| //union ModbusRTUDataRegister
 | ||||
| //{
 | ||||
| //    uint16_t all;
 | ||||
| //    ModbusRTUDataByteField byte;
 | ||||
| //    ModbusRTUDataRegister():
 | ||||
| //        all(0)
 | ||||
| //    {}
 | ||||
| //};//ModbusRTUDataRegister
 | ||||
| 
 | ||||
| 
 | ||||
| //enum ModbusRTUEventRS
 | ||||
| //{
 | ||||
| //    ENTRY,                  // state entry event
 | ||||
| //    EXIT,                   // state exit event
 | ||||
| //    TIMEOUT3_5CHAR,         // All datagram have been received
 | ||||
| //    TIMEOUT1_5CHAR,         // Interval time of each byte in datagram. Not used
 | ||||
| //    RX_READY,               // SCIRXST.bit.RXRDY. Serial port received a serial data (one byte)
 | ||||
| //    TX_READY,               // All datagram have been sent
 | ||||
| //    TX_WAIT                 // Wait for the datagram to be sent
 | ||||
| //};//
 | ||||
| 
 | ||||
| /*
 | ||||
| enum ModbusRTUReceiveEvent | ||||
| { | ||||
|     ENTRY, | ||||
|     RECEIVE, | ||||
|     EXIT, | ||||
|     TIMEOUT355CHAR, | ||||
|     TIMEOUT155CHAR, | ||||
|     FRAMEREADY, | ||||
|     WAIT | ||||
| };//
 | ||||
| */ | ||||
| 
 | ||||
| 
 | ||||
| //struct ModbusRTUTimerStateBitField
 | ||||
| //{
 | ||||
| //    uint16_t time_over_1_5_char :1;
 | ||||
| //    uint16_t time_over_3_5_char :1;
 | ||||
| //};//ModbusRTUTimerStateBitField
 | ||||
| 
 | ||||
| //union ModbusRTUTimerState
 | ||||
| //{
 | ||||
| //    uint16_t all;
 | ||||
| //    ModbusRTUTimerStateBitField bit;
 | ||||
| //    ModbusRTUTimerState():
 | ||||
| //        all((uint16_t)0)
 | ||||
| //    {}
 | ||||
| //};//ModbusRTUTimerState
 | ||||
| 
 | ||||
| 
 | ||||
| //struct ModbusRTUTimer
 | ||||
| //{
 | ||||
| //    uint32_t counter;
 | ||||
| //    uint32_t start;
 | ||||
| //    uint32_t interval;
 | ||||
| //    uint32_t period_1_5_char;
 | ||||
| //    uint32_t period_3_5_char;
 | ||||
| //    ModbusRTUTimerState flag;
 | ||||
| //    ModbusRTUTimer():
 | ||||
| //        counter((uint32_t)0),
 | ||||
| //        start((uint32_t)0),
 | ||||
| //        interval((uint32_t)0),
 | ||||
| //        period_1_5_char((uint32_t)0),
 | ||||
| //        period_3_5_char((uint32_t)0),
 | ||||
| //        flag()
 | ||||
| //    {}
 | ||||
| //};//
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| } /* namespace MODBUSRTU */ | ||||
| 
 | ||||
| #endif /* MODBUSRTU_MODBUSRTUDEFINES_H_ */ | ||||
| @ -1,496 +0,0 @@ | ||||
| /*
 | ||||
|  * ModbusRTUTransceiver.cpp | ||||
|  * | ||||
|  *      Author: Aleksey Gerasimenko | ||||
|  *      gerasimenko.aleksey.n@gmail.com | ||||
|  */ | ||||
| 
 | ||||
| #include "MODBUSRTU/ModbusRTUTransceiver.h" | ||||
| 
 | ||||
| namespace MODBUSRTU | ||||
| { | ||||
| //CONSTRUCTOR
 | ||||
| //ModbusRTUTransceiver::ModbusRTUTransceiver(DSP28335::SCIBase& sciport, DSP28335::CPUTimers& cputimer, MODBUSRTU::ModbusRTUCRC& crc):
 | ||||
| ModbusRTUTransceiver::ModbusRTUTransceiver(DSP28335::SCIBase& sciport, DSP28335::MeasureTimeInterval& interval_measure, MODBUSRTU::ModbusRTUCRC& crc): | ||||
|         m_sci_port(sciport), | ||||
|         m_sci_config(), | ||||
|         m_node_id(0), | ||||
|         //
 | ||||
|         m_state_machine(MODBUSRTU::SCAN), | ||||
|         m_event(MODBUSRTU::ENTRY), | ||||
|         //
 | ||||
|         //m_interval(cputimer.CPUTimer),
 | ||||
|         m_interval_measure(interval_measure), | ||||
|         m_interval_pause((Uint32)0), | ||||
|         m_interval_b5((Uint32)0), | ||||
|         m_interval_b75((Uint32)0), | ||||
|         m_interval_1b((Uint32)0), | ||||
|         m_interval_1b25((Uint32)0), | ||||
|         m_interval_1b5((Uint32)0), | ||||
|         m_interval_1b75((Uint32)0), | ||||
|         m_interval_3b5((Uint32)0), | ||||
|         m_interval_freeze((Uint32)0), | ||||
|         m_interval_current((Uint32)0), | ||||
|         //
 | ||||
|         m_rx_buffer(), | ||||
|         m_tx_buffer(), | ||||
|         m_rx_count(0), | ||||
|         m_tx_count(0), | ||||
|         m_tx_length(0), | ||||
|         //
 | ||||
|         m_aux_rx_buf(0), | ||||
|         m_aux_rx_count(0), | ||||
|         m_aux_tx_buf(0), | ||||
|         m_aux_tx_count(0), | ||||
|         //
 | ||||
|         m_crc_status(false), | ||||
|         m_crc(crc), | ||||
|         m_crc_rx_frame(0), | ||||
|         m_crc_tx_frame(0), | ||||
|         //
 | ||||
|         m_rx_external_buffer(m_rx_buffer), | ||||
|         m_tx_external_buffer(m_tx_buffer), | ||||
|         m_rx_messaage_length(&m_rx_count), | ||||
|         m_tx_message_length(&m_tx_count), | ||||
|         //
 | ||||
|         m_destination(0), | ||||
|         m_source_start(0), | ||||
|         m_source_end(0), | ||||
|         m_copy_length(0), | ||||
|         //
 | ||||
|         _execute(&ModbusRTUTransceiver::_execute_transceiver), | ||||
|         _frame_transceiver(&ModbusRTUTransceiver::_frame_receive_node_id), | ||||
|         //
 | ||||
|         _re_de_setup(&DSP28335::GPIO::gpio_scib_re_de_setup), | ||||
|         _driver_enable(&DSP28335::GPIO::gpio_scib_re_de_set), | ||||
|         _receiver_enable(&DSP28335::GPIO::gpio_scib_re_de_clear) | ||||
|         //
 | ||||
| {}//CONSTRUCTOR
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| void ModbusRTUTransceiver::setup(ModbusRTUTransceiverSetup& setup) | ||||
| { | ||||
|     //m_interval.setup();
 | ||||
|     _re_de_setup = setup.gpio_re_de_setup; | ||||
|     _driver_enable = setup.gpio_driver_enable; | ||||
|     _receiver_enable = setup.gpio_receiver_enable; | ||||
| 
 | ||||
|      | ||||
|     (*_re_de_setup)(); | ||||
|      | ||||
|     _set_receive_node_id(); | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void ModbusRTUTransceiver::configure(ModbusRTUTransceiverConfiguration& config) | ||||
| { | ||||
|     m_sci_config = config.config; | ||||
|     m_node_id = config.node_id; | ||||
| 
 | ||||
|     if(!m_sci_port.compare_configuration(m_sci_config)) | ||||
|     { | ||||
|         m_sci_port.set_configuration(m_sci_config); | ||||
|         //
 | ||||
|     }//if
 | ||||
| 
 | ||||
|     switch(m_sci_config.baudrate) | ||||
|     { | ||||
|     case DSP28335::BR2400:  {m_interval_b5 = (Uint32)250000; m_interval_b75 = (Uint32)375000; m_interval_1b = (Uint32)500000; m_interval_1b25 = (Uint32)625000; m_interval_1b5 = (Uint32)750000; m_interval_1b75 = (Uint32)875000; m_interval_3b5 = (Uint32)1750000; m_interval_freeze = (Uint32)2000000; break;} | ||||
|     case DSP28335::BR4800:  {m_interval_b5 = (Uint32)125000; m_interval_b75 = (Uint32)187500; m_interval_1b = (Uint32)250000; m_interval_1b25 = (Uint32)312500; m_interval_1b5 = (Uint32)375000; m_interval_1b75 = (Uint32)250000; m_interval_3b5 = (Uint32) 875000; m_interval_freeze = (Uint32)1000000; break;} | ||||
|     case DSP28335::BR9600:  {m_interval_b5 = (Uint32) 62500; m_interval_b75 = (Uint32) 93750; m_interval_1b = (Uint32)125000; m_interval_1b25 = (Uint32)156250; m_interval_1b5 = (Uint32)187500; m_interval_1b75 = (Uint32)218750; m_interval_3b5 = (Uint32) 437500; m_interval_freeze = (Uint32) 500000; break;} | ||||
|     case DSP28335::BR19200: {m_interval_b5 = (Uint32) 31250; m_interval_b75 = (Uint32) 46875; m_interval_1b = (Uint32) 62500; m_interval_1b25 = (Uint32)78125;  m_interval_1b5 = (Uint32) 93750; m_interval_1b75 = (Uint32)109375; m_interval_3b5 = (Uint32) 218750; m_interval_freeze = (Uint32) 250000; break;} | ||||
|     case DSP28335::BR38400: {m_interval_b5 = (Uint32)15625;  m_interval_b75 = (Uint32)23437;  m_interval_1b = (Uint32) 31250; m_interval_1b25 = (Uint32)39062;  m_interval_1b5 = (Uint32) 46875; m_interval_1b75 = (Uint32) 54687; m_interval_3b5 = (Uint32) 109375; m_interval_freeze = (Uint32) 125000; break;} | ||||
|     default: {m_interval_b5 = (Uint32)62500;  m_interval_b75 = (Uint32)93750;  m_interval_1b = (Uint32)125000; m_interval_1b25 = (Uint32)156250; m_interval_1b5 = (Uint32)187500; m_interval_1b75 = (Uint32)218750; m_interval_3b5 = (Uint32) 437500; m_interval_freeze = (Uint32) 500000; break;} | ||||
|     }//switch
 | ||||
| 
 | ||||
|     m_interval_pause = m_interval_1b * 0.1; | ||||
|     //m_interval_pause = m_interval_1b * 0.2;
 | ||||
| 
 | ||||
|     _set_receive_node_id(); | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| 
 | ||||
| void ModbusRTUTransceiver::port_reset() | ||||
| { | ||||
|     m_sci_port.set_configuration(m_sci_config); | ||||
|     _set_receive_node_id(); | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| bool ModbusRTUTransceiver::compare_state(MODBUSRTU::transceiver_state_machine_t  state_machine) | ||||
| { | ||||
|     return m_state_machine == state_machine; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void ModbusRTUTransceiver::execute() | ||||
| { | ||||
|     (this->*_execute)(); | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| 
 | ||||
| void ModbusRTUTransceiver::_execute_transceiver() | ||||
| { | ||||
|     if(m_sci_port.SciRegs.SCIRXST.bit.BRKDT) | ||||
|     { | ||||
|         _set_break_condition(); | ||||
|         //
 | ||||
|     }//if
 | ||||
|     //
 | ||||
|     (this->*_frame_transceiver)(); | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void ModbusRTUTransceiver::_execute_break() | ||||
| { | ||||
|     //m_interval_current = m_interval.interval();
 | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void ModbusRTUTransceiver::setRXBuffer(uint16_t *bufferStart, uint16_t *messageLen) | ||||
| { | ||||
|     m_rx_external_buffer = bufferStart; | ||||
|     m_rx_messaage_length = messageLen; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void ModbusRTUTransceiver::setTXBuffer(uint16_t *bufferStart, uint16_t *messageLen) | ||||
| { | ||||
|     m_tx_external_buffer = bufferStart; | ||||
|     m_tx_message_length = messageLen; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| 
 | ||||
| // #pragma CODE_SECTION("ramfuncs");
 | ||||
| void ModbusRTUTransceiver::_set_receive_node_id() | ||||
| { | ||||
|     m_state_machine = MODBUSRTU::SCAN; | ||||
|     _frame_transceiver = &ModbusRTUTransceiver::_frame_receive_node_id; | ||||
|     _execute = &ModbusRTUTransceiver::_execute_transceiver; | ||||
|     (*_receiver_enable)(); | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| // #pragma CODE_SECTION("ramfuncs");
 | ||||
| void ModbusRTUTransceiver::_set_receive_function() | ||||
| { | ||||
|     m_state_machine = MODBUSRTU::RECEIVE; | ||||
|     _frame_transceiver = &ModbusRTUTransceiver::_frame_receive_function; | ||||
|     _execute = &ModbusRTUTransceiver::_execute_transceiver; | ||||
|     (*_receiver_enable)(); | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| // #pragma CODE_SECTION("ramfuncs");
 | ||||
| void ModbusRTUTransceiver::_set_receive_data() | ||||
| { | ||||
|     m_state_machine = MODBUSRTU::RECEIVE; | ||||
|     _frame_transceiver = &ModbusRTUTransceiver::_frame_receive_data; | ||||
|     _execute = &ModbusRTUTransceiver::_execute_transceiver; | ||||
|     (*_receiver_enable)(); | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| // #pragma CODE_SECTION("ramfuncs");
 | ||||
| void ModbusRTUTransceiver::_set_wait_response() | ||||
| { | ||||
|     m_state_machine = MODBUSRTU::WAIT_RESPONSE; | ||||
|     _frame_transceiver = &ModbusRTUTransceiver::_frame_wait_response; | ||||
|     _execute = &ModbusRTUTransceiver::_execute_transceiver; | ||||
|     (*_receiver_enable)(); | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| // #pragma CODE_SECTION("ramfuncs");
 | ||||
| void ModbusRTUTransceiver::_set_transmit_data() | ||||
| { | ||||
|     m_state_machine = MODBUSRTU::TRANSMIT; | ||||
|     _frame_transceiver = &ModbusRTUTransceiver::_frame_transmit_data; | ||||
|     _execute = &ModbusRTUTransceiver::_execute_transceiver; | ||||
|     (*_driver_enable)(); | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| // #pragma CODE_SECTION("ramfuncs");
 | ||||
| void ModbusRTUTransceiver::_set_break_condition() | ||||
| { | ||||
|     m_state_machine = MODBUSRTU::BREAK; | ||||
|     _frame_transceiver = &ModbusRTUTransceiver::_frame_break_condition; | ||||
|     _execute = &ModbusRTUTransceiver::_execute_break; | ||||
|     (*_receiver_enable)(); | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| // #pragma CODE_SECTION("ramfuncs");
 | ||||
| void ModbusRTUTransceiver::_frame_receive_node_id() | ||||
| { | ||||
|         if(m_sci_port.SciRegs.SCIRXST.bit.RXRDY) | ||||
|         { | ||||
|             m_aux_rx_buf = m_sci_port.SciRegs.SCIRXBUF.bit.RXDT; | ||||
| 
 | ||||
|             while(m_sci_port.SciRegs.SCIRXST.bit.RXRDY){} | ||||
| 
 | ||||
|             if((m_node_id == m_aux_rx_buf)||(MODBUSRTU_FUNCTION_BROADCAST == m_aux_rx_buf)) | ||||
|             { | ||||
|                 m_rx_buffer[0] = m_aux_rx_buf; | ||||
| 
 | ||||
|                 m_aux_rx_count = 1; | ||||
|                 m_interval_measure.start(); | ||||
|                 _set_receive_function(); | ||||
|                 //
 | ||||
|             }//if
 | ||||
|         } | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| // #pragma CODE_SECTION("ramfuncs");
 | ||||
| void ModbusRTUTransceiver::_frame_receive_function() | ||||
| { | ||||
|     if(m_sci_port.SciRegs.SCIRXST.bit.RXRDY) | ||||
|     { | ||||
|         m_aux_rx_buf = m_sci_port.SciRegs.SCIRXBUF.bit.RXDT; | ||||
| 
 | ||||
|         while(m_sci_port.SciRegs.SCIRXST.bit.RXRDY){} | ||||
| 
 | ||||
|         if(//(MODBUSRTU_FUNCTION_BROADCAST                        == m_aux_rx_buf)||
 | ||||
|                 (MODBUSRTU_FUNCTION_READ_COIL_STATUS            == m_aux_rx_buf)|| | ||||
|                 //(MODBUSRTU_FUNCTION_READ_INPUT_STATUS           == m_aux_rx_buf)||
 | ||||
|                 (MODBUSRTU_FUNCTION_READ_HOLDING_REGISTERS      == m_aux_rx_buf)|| | ||||
|                 //(MODBUSRTU_FUNCTION_READ_INPUT_REGISTERS        == m_aux_rx_buf)||
 | ||||
|                 (MODBUSRTU_FUNCTION_FORCE_SINGLE_COIL           == m_aux_rx_buf)|| | ||||
|                 (MODBUSRTU_FUNCTION_PRESET_SINGLE_REGISTER      == m_aux_rx_buf)|| | ||||
|                 (MODBUSRTU_FUNCTION_FORCE_MULTIPLE_COILS        == m_aux_rx_buf)|| | ||||
|                 (MODBUSRTU_FUNCTION_PRESET_MULTIPLE_REGISTERS   == m_aux_rx_buf)) | ||||
|         { | ||||
|             m_rx_buffer[1] = m_aux_rx_buf; | ||||
|             m_aux_rx_count = 2; | ||||
|             m_interval_measure.start(); | ||||
|             _set_receive_data(); | ||||
|             //
 | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             // wrong function, break receive
 | ||||
|             m_interval_measure.stop(); | ||||
|             _set_receive_node_id(); | ||||
|             //
 | ||||
|         }//if else
 | ||||
|         //
 | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         m_interval_current = m_interval_measure.interval(); | ||||
|         if(m_interval_current > m_interval_1b5) | ||||
|         { | ||||
|             // exceed time interval, break receive
 | ||||
|             m_interval_measure.stop(); | ||||
|             _set_receive_node_id(); | ||||
|             //
 | ||||
|         }//if
 | ||||
|         //
 | ||||
|     }//if else
 | ||||
|     //
 | ||||
| }//
 | ||||
| 
 | ||||
| // #pragma CODE_SECTION("ramfuncs");
 | ||||
| void ModbusRTUTransceiver::_frame_receive_data() | ||||
| { | ||||
|     if(m_sci_port.SciRegs.SCIRXST.bit.RXRDY) | ||||
|     { | ||||
|         m_aux_rx_buf = m_sci_port.SciRegs.SCIRXBUF.bit.RXDT; | ||||
| 
 | ||||
|         while(m_sci_port.SciRegs.SCIRXST.bit.RXRDY){} | ||||
| 
 | ||||
|         m_rx_buffer[m_aux_rx_count] = m_aux_rx_buf; | ||||
|         m_aux_rx_count++; | ||||
|         m_interval_measure.start(); | ||||
| 
 | ||||
|         if(m_aux_rx_count >= 256) | ||||
|         { | ||||
|             // exceed count, break receive
 | ||||
|             m_interval_measure.stop(); | ||||
|             _set_receive_node_id(); | ||||
|             //
 | ||||
|         }//if
 | ||||
|         //
 | ||||
|     } | ||||
|     else | ||||
|     { | ||||
| 
 | ||||
|         m_interval_current = m_interval_measure.interval(); | ||||
|         if(m_interval_current >= m_interval_1b5) | ||||
|         { | ||||
|             //
 | ||||
|             // count must be more then 4
 | ||||
|             if(m_aux_rx_count > 4) | ||||
|             { | ||||
|                 // stop receive, frame is ended
 | ||||
|                 // check message
 | ||||
|                 m_rx_count = m_aux_rx_count; | ||||
| 
 | ||||
|                 m_crc_calculate = m_crc.calculate(m_rx_buffer, m_rx_count - 2); | ||||
| 
 | ||||
|                 m_crc_rx_frame = (m_rx_buffer[m_rx_count - 1] << 8) | m_rx_buffer[m_rx_count - 2]; | ||||
| 
 | ||||
|                 m_crc_status =  m_crc_calculate == m_crc_rx_frame ? true : false; | ||||
| 
 | ||||
|                 if(m_crc_status) | ||||
|                 { | ||||
|                     m_destination = m_rx_external_buffer; | ||||
|                     m_source_start = m_rx_buffer; | ||||
|                     m_source_end = m_rx_buffer + m_rx_count - 1; | ||||
|                     m_copy_length = m_rx_count; | ||||
|                     *m_rx_messaage_length = m_rx_count; | ||||
|                     m_event = MODBUSRTU::RXREADY; | ||||
|                     //_frame_copy();
 | ||||
|                     _frame_copy_erase(); | ||||
|                     _set_wait_response(); | ||||
|                     //
 | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     m_interval_measure.stop(); | ||||
|                     _set_receive_node_id(); | ||||
|                     //
 | ||||
|                 }//if else
 | ||||
|                 //
 | ||||
|             }//
 | ||||
|             else | ||||
|             { | ||||
|                 m_interval_measure.stop(); | ||||
|                 _set_receive_node_id(); | ||||
|                 //
 | ||||
|             }// if else
 | ||||
|             //
 | ||||
|         }//if
 | ||||
|         //
 | ||||
|     }//if else
 | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| // #pragma CODE_SECTION("ramfuncs");
 | ||||
| void ModbusRTUTransceiver::_frame_wait_response() | ||||
| { | ||||
|     if(m_sci_port.SciRegs.SCIRXST.bit.RXRDY) | ||||
|     { | ||||
|         m_aux_rx_buf = m_sci_port.SciRegs.SCIRXBUF.bit.RXDT; | ||||
| 
 | ||||
|         while(m_sci_port.SciRegs.SCIRXST.bit.RXRDY){} | ||||
| 
 | ||||
|         // error protocol, reset message
 | ||||
|         m_interval_measure.stop(); | ||||
|         _set_receive_node_id(); | ||||
|         //
 | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         m_interval_current = m_interval_measure.interval(); | ||||
|         if(m_interval_current >= m_interval_3b5) | ||||
|         { | ||||
|             m_interval_measure.stop(); | ||||
|             _set_receive_node_id(); | ||||
|             //
 | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             if(*m_tx_message_length != 0) | ||||
|             { | ||||
|                 // copy external tx buffer
 | ||||
|                 m_tx_length = *m_tx_message_length; | ||||
|                 m_source_start = m_tx_external_buffer; | ||||
|                 m_source_end = m_tx_external_buffer + m_tx_length - 1; | ||||
|                 m_destination = m_tx_buffer; | ||||
|                 //_frame_copy_erase();
 | ||||
|                 _frame_copy(); | ||||
|                 *m_tx_message_length = 0; | ||||
|                 m_tx_count = 0; | ||||
|                 _set_transmit_data(); | ||||
|                 _frame_transmit_data(); | ||||
|                 m_interval_measure.stop(); | ||||
|                 //
 | ||||
|             }//if
 | ||||
|             //
 | ||||
|         }//if else
 | ||||
|         //
 | ||||
|     }//if else
 | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| // #pragma CODE_SECTION("ramfuncs");
 | ||||
| void ModbusRTUTransceiver::_frame_transmit_data() | ||||
| { | ||||
|     if(m_sci_port.SciRegs.SCICTL2.bit.TXRDY & m_sci_port.SciRegs.SCICTL2.bit.TXEMPTY) | ||||
|     { | ||||
|         // data was transmitted
 | ||||
|         if(m_tx_count >= m_tx_length) | ||||
|         { | ||||
|             // all message was transmitted
 | ||||
|             // break transmit mode, go to the receive mode
 | ||||
|             _set_receive_node_id(); | ||||
|             //
 | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             m_sci_port.SciRegs.SCITXBUF = m_tx_buffer[m_tx_count]; | ||||
| 
 | ||||
|             while(m_sci_port.SciRegs.SCICTL2.bit.TXEMPTY == 1){} | ||||
| 
 | ||||
|             m_tx_count++; | ||||
|             //
 | ||||
|         }//if else
 | ||||
|         //
 | ||||
|     }// if
 | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| // #pragma CODE_SECTION("ramfuncs");
 | ||||
| void ModbusRTUTransceiver::_frame_break_condition() | ||||
| { | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| // #pragma CODE_SECTION("ramfuncs");
 | ||||
| inline void ModbusRTUTransceiver::_frame_copy() | ||||
| { | ||||
|     while(m_source_start <= m_source_end) | ||||
|     { | ||||
|         *m_destination++ = *m_source_start++; | ||||
|         //
 | ||||
|     }//while
 | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| // #pragma CODE_SECTION("ramfuncs");
 | ||||
| inline void ModbusRTUTransceiver::_frame_copy_erase() | ||||
| { | ||||
|     while(m_source_start <= m_source_end) | ||||
|     { | ||||
|         *m_destination++ = *m_source_start; | ||||
|         *m_source_start++ = 0; | ||||
|         //
 | ||||
|     }//while
 | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| // #pragma CODE_SECTION("ramfuncs");
 | ||||
| void ModbusRTUTransceiver::_frame_copy(uint16_t *source, uint16_t length, uint16_t *destination) | ||||
| { | ||||
|     m_destination = destination; | ||||
|     m_source_start = source; | ||||
|     m_source_end = destination + length - 1; | ||||
|     m_copy_length = length; | ||||
| 
 | ||||
|     while(m_source_start <= m_source_end) | ||||
|     { | ||||
|         *m_destination++ = *m_source_start++; | ||||
|         //
 | ||||
|     }//while
 | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| 
 | ||||
| } /* namespace MODBUSRTU */ | ||||
| @ -1,125 +0,0 @@ | ||||
| /*
 | ||||
|  * ModbusRTUTransceiver.h | ||||
|  * | ||||
|  *      Author: Aleksey Gerasimenko | ||||
|  *      gerasimenko.aleksey.n@gmail.com | ||||
|  */ | ||||
| 
 | ||||
| #include <math.h> | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| 
 | ||||
| #include <DSP28x_Project.h> | ||||
| 
 | ||||
| #include "DSP28335/GPIO.h" | ||||
| #include "DSP28335/CPUTimers.h" | ||||
| #include "DSP28335/MeasureTimeInterval.h" | ||||
| #include "DSP28335/SCIA.h" | ||||
| #include "DSP28335/SCIB.h" | ||||
| #include "DSP28335/SCIBase.h" | ||||
| #include "DSP28335/SCIC.h" | ||||
| 
 | ||||
| #include "MODBUSRTU/ModbusRTUTransceiverBase.h" | ||||
| #include "MODBUSRTU/ModbusRTUCRC.h" | ||||
| #include "MODBUSRTU/ModbusRTUDefines.h" | ||||
| #include "MODBUSRTU/ModbusRTUVariant.h" | ||||
| 
 | ||||
| 
 | ||||
| #ifndef MODBUSRTU_MODBUSRTUTRANSCEIVER_H_ | ||||
| #define MODBUSRTU_MODBUSRTUTRANSCEIVER_H_ | ||||
| 
 | ||||
| namespace MODBUSRTU | ||||
| { | ||||
| 
 | ||||
| 
 | ||||
| class ModbusRTUTransceiver | ||||
| { | ||||
| private: | ||||
|     DSP28335::SCIBase&          m_sci_port; | ||||
|     DSP28335::SCIConfiguration  m_sci_config; | ||||
|     uint16_t                    m_node_id; | ||||
| private: | ||||
|     MODBUSRTU::transceiver_state_machine_t  m_state_machine; | ||||
|     MODBUSRTU::transceiver_event_t          m_event; | ||||
| private: | ||||
|     DSP28335::MeasureTimeInterval&    m_interval_measure; | ||||
|     Uint32 m_interval_pause; | ||||
|     Uint32 m_interval_b5; | ||||
|     Uint32 m_interval_b75; | ||||
|     Uint32 m_interval_1b; | ||||
|     Uint32 m_interval_1b25; | ||||
|     Uint32 m_interval_1b5; | ||||
|     Uint32 m_interval_1b75; | ||||
|     Uint32 m_interval_3b5; | ||||
|     Uint32 m_interval_freeze; | ||||
|     Uint32 m_interval_current; | ||||
| private: | ||||
|     uint16_t m_rx_buffer[256]; | ||||
|     uint16_t m_tx_buffer[256]; | ||||
|     uint16_t m_rx_count; | ||||
|     uint16_t m_tx_count; | ||||
|     uint16_t m_tx_length; | ||||
|     //
 | ||||
| private: | ||||
|     uint16_t     m_aux_rx_buf; | ||||
|     uint16_t     m_aux_rx_count; | ||||
|     uint16_t     m_aux_tx_buf; | ||||
|     uint16_t     m_aux_tx_count; | ||||
| private: | ||||
|     bool            m_crc_status; | ||||
|     MODBUSRTU::ModbusRTUCRC& m_crc; | ||||
|     uint16_t        m_crc_calculate; | ||||
|     uint16_t        m_crc_rx_frame; | ||||
|     uint16_t        m_crc_tx_frame; | ||||
| private: | ||||
|     uint16_t *m_rx_external_buffer; | ||||
|     uint16_t *m_tx_external_buffer; | ||||
|     uint16_t *m_rx_messaage_length; | ||||
|     uint16_t *m_tx_message_length; | ||||
| private: | ||||
|     uint16_t *m_destination; | ||||
|     uint16_t *m_source_start; | ||||
|     uint16_t *m_source_end; | ||||
|     uint16_t m_copy_length; | ||||
| public: | ||||
|     ModbusRTUTransceiver(DSP28335::SCIBase& sciport, DSP28335::MeasureTimeInterval& interval_measure, MODBUSRTU::ModbusRTUCRC& crc); | ||||
|     void setup(ModbusRTUTransceiverSetup& setup); | ||||
|     void configure(ModbusRTUTransceiverConfiguration& config); | ||||
|     void port_reset(); | ||||
|     bool compare_state(MODBUSRTU::transceiver_state_machine_t  state_machine); | ||||
| public: | ||||
|     void execute(); | ||||
| public: | ||||
|     void setRXBuffer(uint16_t *bufferStart, uint16_t *messageLen); | ||||
|     void setTXBuffer(uint16_t *bufferStart, uint16_t *messageLen); | ||||
| private: | ||||
|     void _set_receive_node_id(); | ||||
|     void _set_receive_function(); | ||||
|     void _set_receive_data(); | ||||
|     void _set_wait_response(); | ||||
|     void _set_transmit_data(); | ||||
|     void _set_break_condition(); | ||||
| private: | ||||
|     void (ModbusRTUTransceiver::*_execute)(); | ||||
|     void (ModbusRTUTransceiver::*_frame_transceiver)(); | ||||
|     void _execute_transceiver(); | ||||
|     void _execute_break(); | ||||
|     void _frame_receive_node_id(); | ||||
|     void _frame_receive_function(); | ||||
|     void _frame_receive_data(); | ||||
|     void _frame_wait_response(); | ||||
|     void _frame_transmit_data(); | ||||
|     void _frame_break_condition(); | ||||
| private: | ||||
|     inline void _frame_copy(); | ||||
|     inline void _frame_copy_erase(); | ||||
|     void _frame_copy(uint16_t *source, uint16_t length, uint16_t *destination); | ||||
| private: | ||||
|     void (*_re_de_setup)(); | ||||
|     void (*_driver_enable)(); | ||||
|     void (*_receiver_enable)(); | ||||
| }; | ||||
| 
 | ||||
| } /* namespace MODBUSRTU */ | ||||
| 
 | ||||
| #endif /* MODBUSRTU_MODBUSRTUTRANSCEIVER_H_ */ | ||||
| @ -1,23 +0,0 @@ | ||||
| /*
 | ||||
|  * ModbusRTUTransceiverBase.cpp | ||||
|  * | ||||
|  *      Author: Aleksey Gerasimenko | ||||
|  *      gerasimenko.aleksey.n@gmail.com | ||||
|  */ | ||||
| 
 | ||||
| #include "MODBUSRTU/ModbusRTUTransceiverBase.h" | ||||
| 
 | ||||
| namespace MODBUSRTU | ||||
| { | ||||
| //CONSTRUCTOR
 | ||||
| ModbusRTUTransceiverBase::ModbusRTUTransceiverBase(DSP28335::SCIBase& sciport, DSP28335::CPUTimers& cputimer, MODBUSRTU::ModbusRTUCRC& crc): | ||||
|         m_sci_port(sciport), | ||||
|         m_sci_config(), | ||||
|         m_node_id(0), | ||||
|         //
 | ||||
|         m_state_machine(MODBUSRTU::SCAN), | ||||
|         m_event(MODBUSRTU::ENTRY) | ||||
|         //
 | ||||
| {}//CONSTRUCTOR
 | ||||
| 
 | ||||
| } /* namespace MODBUSRTU */ | ||||
| @ -1,83 +0,0 @@ | ||||
| /*
 | ||||
|  * ModbusRTUTransceiverBase.h | ||||
|  * | ||||
|  *      Author: Aleksey Gerasimenko | ||||
|  *      gerasimenko.aleksey.n@gmail.com | ||||
|  */ | ||||
| 
 | ||||
| #include <math.h> | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| #include "F28335/DSP28x_Project.h" | ||||
| 
 | ||||
| #include "DSP28335/GPIO.h" | ||||
| #include "DSP28335/CPUTimers.h" | ||||
| #include "DSP28335/SCIA.h" | ||||
| #include "DSP28335/SCIB.h" | ||||
| #include "DSP28335/SCIBase.h" | ||||
| #include "DSP28335/SCIC.h" | ||||
| 
 | ||||
| #include "MODBUSRTU/ModbusRTUCRC.h" | ||||
| #include "MODBUSRTU/ModbusRTUDefines.h" | ||||
| #include "MODBUSRTU/ModbusRTUVariant.h" | ||||
| 
 | ||||
| #ifndef MODBUSRTU_MODBUSRTUTRANSCEIVERBASE_H_ | ||||
| #define MODBUSRTU_MODBUSRTUTRANSCEIVERBASE_H_ | ||||
| 
 | ||||
| namespace MODBUSRTU | ||||
| { | ||||
| 
 | ||||
| 
 | ||||
| struct ModbusRTUTransceiverSetup | ||||
| { | ||||
|     pGPIO_FUNCTION gpio_re_de_setup; | ||||
|     pGPIO_FUNCTION gpio_driver_enable; | ||||
|     pGPIO_FUNCTION gpio_receiver_enable; | ||||
|     ModbusRTUTransceiverSetup(): | ||||
|         gpio_re_de_setup(0), | ||||
|         gpio_driver_enable(0), | ||||
|         gpio_receiver_enable(0) | ||||
|     { | ||||
|         //gpio_re_de_setup = &DSP28335::GPIO::gpio_scib_re_de_setup;
 | ||||
|         //gpio_driver_enable = &DSP28335::GPIO::gpio_scib_re_de_set;
 | ||||
|         //gpio_receiver_enable = &DSP28335::GPIO::gpio_scib_re_de_clear;
 | ||||
|     } | ||||
| };//ModbusRTUTransceiverSetup
 | ||||
| 
 | ||||
| 
 | ||||
| struct ModbusRTUTransceiverConfiguration | ||||
| { | ||||
|     uint16_t                        node_id; | ||||
|     DSP28335::SCIConfiguration      config; | ||||
|     ModbusRTUTransceiverConfiguration(): | ||||
|         node_id(1234), | ||||
|         config() | ||||
|     { | ||||
|         //config.baudrate = SCIRS485_BAUDRATE_DEFAULT;
 | ||||
|         //config.parity = SCIRS485_PARITY_DEFAULT;
 | ||||
|         //config.stopbits = SCIRS485_STOPBITS_DEFAULT;
 | ||||
|         //config.lenght = SCIRS485_LENGHT_DEFAULT;
 | ||||
|     } | ||||
| };//ModbusRTUTransceiverConfiguration
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| class ModbusRTUTransceiverBase | ||||
| { | ||||
| protected: | ||||
|     DSP28335::SCIBase&          m_sci_port; | ||||
|     DSP28335::SCIConfiguration  m_sci_config; | ||||
|     uint16_t                    m_node_id; | ||||
| protected: | ||||
|     MODBUSRTU::transceiver_state_machine_t  m_state_machine; | ||||
|     MODBUSRTU::transceiver_event_t          m_event; | ||||
| 
 | ||||
| public: | ||||
|     ModbusRTUTransceiverBase(DSP28335::SCIBase& sciport, DSP28335::CPUTimers& cputimer, MODBUSRTU::ModbusRTUCRC& crc); | ||||
| }; | ||||
| 
 | ||||
| } /* namespace MODBUSRTU */ | ||||
| 
 | ||||
| #endif /* MODBUSRTU_MODBUSRTUTRANSCEIVERBASE_H_ */ | ||||
| @ -1,110 +0,0 @@ | ||||
| /*
 | ||||
|  * ModbusRTUVariant.cpp | ||||
|  * | ||||
|  *      Author: Aleksey Gerasimenko | ||||
|  *      gerasimenko.aleksey.n@gmail.com | ||||
|  */ | ||||
| 
 | ||||
| #include "MODBUSRTU/ModbusRTUVariant.h" | ||||
| 
 | ||||
| namespace MODBUSRTU | ||||
| { | ||||
| //CONSTRUCTOR
 | ||||
| ModbusRTUVariant::ModbusRTUVariant(): | ||||
|         t(MODBUSRTU::VARIANT_UINT32), | ||||
|         u32((uint32_t)0) | ||||
| {}//CONSTRUCTOR
 | ||||
| 
 | ||||
| 
 | ||||
| MODBUSRTU::modbus_variant_type_t ModbusRTUVariant::get_type() const | ||||
| { | ||||
|     return t; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| 
 | ||||
| void ModbusRTUVariant::set_float(float value) | ||||
| { | ||||
|     f = value; | ||||
|     t = MODBUSRTU::VARIANT_FLOAT; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| 
 | ||||
| void ModbusRTUVariant::set_int16(int16_t value) | ||||
| { | ||||
|     i16 = value; | ||||
|     t = MODBUSRTU::VARIANT_INT16; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void ModbusRTUVariant::set_int32(int32_t value) | ||||
| { | ||||
|     i32 = value; | ||||
|     t = MODBUSRTU::VARIANT_INT32; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void ModbusRTUVariant::set_uint16(uint16_t value) | ||||
| { | ||||
|     u16 = value; | ||||
|     t = MODBUSRTU::VARIANT_UINT16; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void ModbusRTUVariant::set_uint32(uint32_t value) | ||||
| { | ||||
|     u32 = value; | ||||
|     t = MODBUSRTU::VARIANT_UINT32; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void ModbusRTUVariant::set_bool(bool value) | ||||
| { | ||||
|     b = value; | ||||
|     t = MODBUSRTU::VARIANT_BOOL; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| float ModbusRTUVariant::get_float() const | ||||
| { | ||||
|     return f; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| 
 | ||||
| int16_t ModbusRTUVariant::get_int16() const | ||||
| { | ||||
|     return i16; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| int32_t  ModbusRTUVariant::get_int32() const | ||||
| { | ||||
|     return i32; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| uint16_t ModbusRTUVariant::get_uint16() const | ||||
| { | ||||
|     return u16; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| uint32_t ModbusRTUVariant::get_uint32() const | ||||
| { | ||||
|     return u32; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| 
 | ||||
| 
 | ||||
| bool ModbusRTUVariant::get_bool() const | ||||
| { | ||||
|     return b; | ||||
| }//
 | ||||
| //
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| } /* namespace MODBUSRTU */ | ||||
| @ -1,58 +0,0 @@ | ||||
| /*
 | ||||
|  * ModbusRTUVariant.h | ||||
|  * | ||||
|  *      Author: Aleksey Gerasimenko | ||||
|  *      gerasimenko.aleksey.n@gmail.com | ||||
|  */ | ||||
| 
 | ||||
| #include <math.h> | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| #include "RUDRIVEFRAMEWORK/DataTypesDefinitions.h" | ||||
| 
 | ||||
| 
 | ||||
| #ifndef MODBUSRTU_MODBUSRTUVARIANT_H_ | ||||
| #define MODBUSRTU_MODBUSRTUVARIANT_H_ | ||||
| 
 | ||||
| namespace MODBUSRTU | ||||
| { | ||||
| 
 | ||||
| 
 | ||||
| enum modbus_variant_type_t {VARIANT_FLOAT, VARIANT_INT16, VARIANT_INT32, VARIANT_UINT16, VARIANT_UINT32, VARIANT_BOOL}; | ||||
| 
 | ||||
| class ModbusRTUVariant | ||||
| { | ||||
| private: | ||||
|     union | ||||
|         { | ||||
|             float       f; | ||||
|             int16_t     i16; | ||||
|             int32_t     i32; | ||||
|             uint16_t    u16; | ||||
|             uint32_t    u32; | ||||
|             bool        b; | ||||
|         }; | ||||
|     modbus_variant_type_t t; | ||||
| public: | ||||
|     ModbusRTUVariant(); | ||||
|     modbus_variant_type_t get_type() const; | ||||
|     //setters
 | ||||
|     void set_float  (float    v); | ||||
|     void set_int16  (int16_t  v); | ||||
|     void set_int32  (int32_t  v); | ||||
|     void set_uint16 (uint16_t v); | ||||
|     void set_uint32 (uint32_t v); | ||||
|     void set_bool   (bool     v); | ||||
|     //getters
 | ||||
|     float    get_float() const; | ||||
|     int16_t  get_int16() const; | ||||
|     int32_t  get_int32() const; | ||||
|     uint16_t get_uint16() const; | ||||
|     uint32_t get_uint32() const; | ||||
|     bool     get_bool() const; | ||||
|     //
 | ||||
| }; | ||||
| 
 | ||||
| } /* namespace MODBUSRTU */ | ||||
| 
 | ||||
| #endif /* MODBUSRTU_MODBUSRTUVARIANT_H_ */ | ||||
| @ -1,26 +0,0 @@ | ||||
| /*
 | ||||
|  * HeaderWeinbus.h | ||||
|  * | ||||
|  *      Author: Aleksey Gerasimenko | ||||
|  *      gerasimenko.aleksey.n@gmail.com | ||||
|  */ | ||||
| 
 | ||||
| #ifndef MODBUS_HEADERWEINBUS_H_ | ||||
| #define MODBUS_HEADERWEINBUS_H_ | ||||
| 
 | ||||
| #include "WEINBUS/WeinbusBuffer.h" | ||||
| #include "WEINBUS/WeinbusBufferCoil.h" | ||||
| #include "WEINBUS/WeinbusBufferInputCoil.h" | ||||
| #include "WEINBUS/WeinbusBufferInputRegister.h" | ||||
| #include "WEINBUS/WeinbusBufferOutputCoil.h" | ||||
| #include "WEINBUS/WeinbusBufferOutputRegister.h" | ||||
| #include "WEINBUS/WeinbusBufferRegister.h" | ||||
| #include "WEINBUS/WeinbusDefines.h" | ||||
| #include "WEINBUS/WeinbusSlave.h" | ||||
| #include "WEINBUS/WeinbusTableCoil.h" | ||||
| #include "WEINBUS/WeinbusTableRegister.h" | ||||
| #include "WEINBUS/WeinbusTableUnit.h" | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #endif /* MODBUS_HEADERWEINBUS_H_ */ | ||||
| @ -1,41 +0,0 @@ | ||||
| /*
 | ||||
|  * WeinbusBuffer.cpp | ||||
|  * | ||||
|  *      Author: Aleksey Gerasimenko | ||||
|  *      gerasimenko.aleksey.n@gmail.com | ||||
|  */ | ||||
| 
 | ||||
| #include "WEINBUS/WeinbusBuffer.h" | ||||
| 
 | ||||
| namespace WEINBUS | ||||
| { | ||||
| //CONSTRUCTOR
 | ||||
| WeinbusBuffer::WeinbusBuffer(): | ||||
|         m_type(WEINBUS::OUTPUTCOILS), | ||||
|         m_length  (0), | ||||
|         m_start_addr(0), | ||||
|         m_end_addr(0), | ||||
|         m_addr(0), | ||||
|         m_counter(0), | ||||
|         m_quantity(0), | ||||
|         m_size(0) | ||||
|         //
 | ||||
| {}//CONSTRUCTOR
 | ||||
| //
 | ||||
| 
 | ||||
| void WeinbusBuffer::set(WEINBUS::buffer_type_t type, uint16_t startAddr) | ||||
| { | ||||
|     m_type = type; | ||||
|     m_start_addr = startAddr; | ||||
|     m_end_addr = startAddr; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| bool WeinbusBuffer::address_range(uint16_t address) | ||||
| { | ||||
| 
 | ||||
|     return ((address >= m_start_addr)&&(address <= m_end_addr) ? true : false); | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| } /* namespace WEINBUS */ | ||||
| @ -1,39 +0,0 @@ | ||||
| /*
 | ||||
|  * WeinbusBuffer.h | ||||
|  * | ||||
|  *      Author: Aleksey Gerasimenko | ||||
|  *      gerasimenko.aleksey.n@gmail.com | ||||
|  */ | ||||
| 
 | ||||
| #include <math.h> | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| #include "WEINBUS/WeinbusDefines.h" | ||||
| 
 | ||||
| #ifndef WEINBUS_WEINBUSBUFFER_H_ | ||||
| #define WEINBUS_WEINBUSBUFFER_H_ | ||||
| 
 | ||||
| namespace WEINBUS | ||||
| { | ||||
| 
 | ||||
| class WeinbusBuffer | ||||
| { | ||||
| protected: | ||||
|     WEINBUS::buffer_type_t m_type; | ||||
|     uint16_t m_length; | ||||
|     uint16_t m_start_addr; | ||||
|     uint16_t m_end_addr; | ||||
|     uint16_t m_addr; | ||||
| protected: | ||||
|     uint16_t m_counter; | ||||
|     uint16_t m_quantity; | ||||
|     uint16_t m_size; | ||||
| public: | ||||
|     WeinbusBuffer(); | ||||
|     void set(WEINBUS::buffer_type_t type, uint16_t startAddr); | ||||
|     bool address_range(uint16_t address); | ||||
| }; | ||||
| 
 | ||||
| } /* namespace WEINBUS */ | ||||
| 
 | ||||
| #endif /* WEINBUS_WEINBUSBUFFER_H_ */ | ||||
| @ -1,17 +0,0 @@ | ||||
| /*
 | ||||
|  * WeinbusBufferCoil.cpp | ||||
|  * | ||||
|  *      Author: Aleksey Gerasimenko | ||||
|  *      gerasimenko.aleksey.n@gmail.com | ||||
|  */ | ||||
| 
 | ||||
| #include "WEINBUS/WeinbusBufferCoil.h" | ||||
| 
 | ||||
| namespace WEINBUS | ||||
| { | ||||
| //CONSTRUCTOR
 | ||||
| WeinbusBufferCoil::WeinbusBufferCoil(): | ||||
|         WeinbusBuffer() | ||||
| {}//CONSTRUCTOR
 | ||||
| 
 | ||||
| } /* namespace WEINBUS */ | ||||
| @ -1,27 +0,0 @@ | ||||
| /*
 | ||||
|  * WeinbusBufferCoil.h | ||||
|  * | ||||
|  *      Author: Aleksey Gerasimenko | ||||
|  *      gerasimenko.aleksey.n@gmail.com | ||||
|  */ | ||||
| 
 | ||||
| #include "WEINBUS/WeinbusBuffer.h" | ||||
| 
 | ||||
| #ifndef WEINBUS_WEINBUSBUFFERCOIL_H_ | ||||
| #define WEINBUS_WEINBUSBUFFERCOIL_H_ | ||||
| 
 | ||||
| 
 | ||||
| namespace WEINBUS | ||||
| { | ||||
| 
 | ||||
| class WeinbusBufferCoil: public WEINBUS::WeinbusBuffer | ||||
| { | ||||
| public: | ||||
|     WeinbusBufferCoil(); | ||||
| public: | ||||
|     virtual void add(uint16_t offset, WEINBUS::weinbus_coil_t coil, uint16_t* param) = 0; | ||||
| }; | ||||
| 
 | ||||
| } /* namespace WEINBUS */ | ||||
| 
 | ||||
| #endif /* WEINBUS_WEINBUSBUFFERCOIL_H_ */ | ||||
| @ -1,29 +0,0 @@ | ||||
| /*
 | ||||
|  * WeinbusBufferInputCoil.cpp | ||||
|  * | ||||
|  *      Author: Aleksey Gerasimenko | ||||
|  *      gerasimenko.aleksey.n@gmail.com | ||||
|  */ | ||||
| 
 | ||||
| #include <WEINBUS/WeinbusBufferInputCoil.h> | ||||
| 
 | ||||
| namespace WEINBUS | ||||
| { | ||||
| //CONSTRUCTOR
 | ||||
| WeinbusBufferInputCoil::WeinbusBufferInputCoil(): | ||||
|         WeinbusBufferCoil(), | ||||
|         m_coils() | ||||
| {}//CONSTRUCTOR
 | ||||
| //
 | ||||
| void WeinbusBufferInputCoil::add(uint16_t offset, WEINBUS::weinbus_coil_t coil, uint16_t* param) | ||||
| { | ||||
|     if(m_counter < m_size) | ||||
|         { | ||||
|             m_coils[m_counter].add(m_start_addr + offset, coil, param); | ||||
|             m_counter++; | ||||
|             m_quantity = m_counter; | ||||
|         } | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| } /* namespace WEINBUS */ | ||||
| @ -1,30 +0,0 @@ | ||||
| /*
 | ||||
|  * WeinbusBufferInputCoil.h | ||||
|  * | ||||
|  *      Author: Aleksey Gerasimenko | ||||
|  *      gerasimenko.aleksey.n@gmail.com | ||||
|  */ | ||||
| 
 | ||||
| #include "WEINBUS/WeinbusBufferCoil.h" | ||||
| #include "WEINBUS/WeinbusTableCoil.h" | ||||
| 
 | ||||
| #ifndef WEINBUS_WEINBUSBUFFERINPUTCOIL_H_ | ||||
| #define WEINBUS_WEINBUSBUFFERINPUTCOIL_H_ | ||||
| 
 | ||||
| 
 | ||||
| namespace WEINBUS | ||||
| { | ||||
| 
 | ||||
| class WeinbusBufferInputCoil: public WEINBUS::WeinbusBufferCoil | ||||
| { | ||||
| private: | ||||
|     WEINBUS::WeinbusTableCoil m_coils[16]; | ||||
| public: | ||||
|     WeinbusBufferInputCoil(); | ||||
| public: | ||||
|     void add(uint16_t offset, WEINBUS::weinbus_coil_t coil, uint16_t* param); | ||||
| }; | ||||
| 
 | ||||
| } /* namespace WEINBUS */ | ||||
| 
 | ||||
| #endif /* WEINBUS_WEINBUSBUFFERINPUTCOIL_H_ */ | ||||
| @ -1,246 +0,0 @@ | ||||
| /*
 | ||||
|  * WeinbusBufferInputRegister.cpp | ||||
|  * | ||||
|  *      Author: Aleksey Gerasimenko | ||||
|  *      gerasimenko.aleksey.n@gmail.com | ||||
|  */ | ||||
| 
 | ||||
| #include "WEINBUS/WeinbusBufferInputRegister.h" | ||||
| 
 | ||||
| namespace WEINBUS | ||||
| { | ||||
| //CONSTRUCTOR
 | ||||
| WeinbusBufferInputRegister::WeinbusBufferInputRegister(): | ||||
|         WeinbusBufferRegister(), | ||||
|         m_registers(), | ||||
|         m_aux_register(), | ||||
|         m_iterator(0) | ||||
|         //
 | ||||
| { | ||||
|     m_size = WEINBUS_INPUT_REGISTERS_SIZE; | ||||
| }//CONSTRUCTRO
 | ||||
| 
 | ||||
| //
 | ||||
| void WeinbusBufferInputRegister::add(uint16_t offset, uint16_t   *param) | ||||
| { | ||||
|     if(m_counter < m_size) | ||||
|     { | ||||
|         m_addr = m_start_addr + offset; | ||||
|         m_end_addr = m_addr > m_end_addr ? m_addr : m_end_addr; | ||||
|         m_registers[m_counter].add(m_addr, (uint16_t*)param); | ||||
|         m_counter++; | ||||
|         m_quantity = m_counter; | ||||
|     } | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusBufferInputRegister::add(uint16_t offset, int16_t    *param) | ||||
| { | ||||
|     if(m_counter < m_size) | ||||
|     { | ||||
|         m_addr = m_start_addr + offset; | ||||
|         m_end_addr = m_addr > m_end_addr ? m_addr : m_end_addr; | ||||
|         m_registers[m_counter].add(m_addr, (int16_t*)param); | ||||
|         m_counter++; | ||||
|         m_quantity = m_counter; | ||||
|     } | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusBufferInputRegister::add(uint16_t offset, uint32_t   *param) | ||||
| { | ||||
|     if(m_counter < m_size) | ||||
|     { | ||||
|         m_addr = m_start_addr + offset; | ||||
|         m_end_addr = m_addr > m_end_addr ? m_addr : m_end_addr; | ||||
|         m_registers[m_counter].add(m_addr, (uint32_t*)param); | ||||
|         m_counter++; | ||||
|         m_quantity = m_counter; | ||||
|     } | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusBufferInputRegister::add(uint16_t offset, int32_t    *param) | ||||
| { | ||||
|     if(m_counter < m_size) | ||||
|     { | ||||
|         m_addr = m_start_addr + offset; | ||||
|         m_end_addr = m_addr > m_end_addr ? m_addr : m_end_addr; | ||||
|         m_registers[m_counter].add(m_addr, (int32_t*)param); | ||||
|         m_counter++; | ||||
|         m_quantity = m_counter; | ||||
|     } | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusBufferInputRegister::add(uint16_t offset, float      *param) | ||||
| { | ||||
|     if(m_counter < m_size) | ||||
|     { | ||||
|         m_addr = m_start_addr + offset; | ||||
|         m_end_addr = m_addr > m_end_addr ? m_addr : m_end_addr; | ||||
|         m_registers[m_counter].add(m_addr, (float*)param); | ||||
|         m_counter++; | ||||
|         m_quantity = m_counter; | ||||
|     } | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| 
 | ||||
| WEINBUS::WeinbusTableRegister WeinbusBufferInputRegister::get_register_address(uint16_t address) | ||||
| { | ||||
|     for(m_iterator = 0; m_iterator < m_quantity; m_iterator++) | ||||
|     { | ||||
| 
 | ||||
|         if(m_registers[m_iterator].get_address() == address) | ||||
|         { | ||||
|             m_aux_register = m_registers[m_iterator]; | ||||
|             break; | ||||
|         }//if
 | ||||
|         //
 | ||||
|     }//for
 | ||||
|     //
 | ||||
|     return m_aux_register; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| WEINBUS::WeinbusTableRegister WeinbusBufferInputRegister::get_register_cursor(uint16_t cursor) | ||||
| { | ||||
|     return m_registers[cursor]; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusBufferInputRegister::write(uint16_t address, uint16_t data) | ||||
| { | ||||
|     for(m_iterator = 0; m_iterator < m_quantity; m_iterator++) | ||||
|     { | ||||
|         if(m_registers[m_iterator].get_address() == address) | ||||
|         { | ||||
|             m_aux_register = m_registers[m_iterator]; | ||||
|             break; | ||||
|         }//if
 | ||||
|         //
 | ||||
|     }//for
 | ||||
|     //
 | ||||
|     m_aux_register.write((uint16_t)data); | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusBufferInputRegister::write(uint16_t address, int16_t  data) | ||||
| { | ||||
|     for(m_iterator = 0; m_iterator < m_quantity; m_iterator++) | ||||
|     { | ||||
|         if(m_registers[m_iterator].get_address() == address) | ||||
|         { | ||||
|             m_aux_register = m_registers[m_iterator]; | ||||
|             break; | ||||
|         }//if
 | ||||
|         //
 | ||||
|     }//for
 | ||||
|     //
 | ||||
|     m_aux_register.write((int16_t)data); | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusBufferInputRegister::write(uint16_t address, uint32_t data) | ||||
| { | ||||
|     for(m_iterator = 0; m_iterator < m_quantity; m_iterator++) | ||||
|     { | ||||
|         if(m_registers[m_iterator].get_address() == address) | ||||
|         { | ||||
|             m_aux_register = m_registers[m_iterator]; | ||||
|             break; | ||||
|         }//if
 | ||||
|         //
 | ||||
|     }//for
 | ||||
|     //
 | ||||
|     m_aux_register.write((uint32_t)data); | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusBufferInputRegister::write(uint16_t address, int32_t  data) | ||||
| { | ||||
|     for(m_iterator = 0; m_iterator < m_quantity; m_iterator++) | ||||
|     { | ||||
|         if(m_registers[m_iterator].get_address() == address) | ||||
|         { | ||||
|             m_aux_register = m_registers[m_iterator]; | ||||
|             break; | ||||
|         }//if
 | ||||
|         //
 | ||||
|     }//for
 | ||||
|     //
 | ||||
|     m_aux_register.write((int32_t)data); | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusBufferInputRegister::write(uint16_t address, float    data) | ||||
| { | ||||
|     for(m_iterator = 0; m_iterator < m_quantity; m_iterator++) | ||||
|     { | ||||
|         if(m_registers[m_iterator].get_address() == address) | ||||
|         { | ||||
|             m_aux_register = m_registers[m_iterator]; | ||||
|             break; | ||||
|         }//if
 | ||||
|         //
 | ||||
|     }//for
 | ||||
|     //
 | ||||
|     m_aux_register.write((float)data); | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| uint16_t WeinbusBufferInputRegister::get_cursor(uint16_t address) | ||||
| { | ||||
|     for(m_iterator = 0; m_iterator < m_quantity; m_iterator++) | ||||
|     { | ||||
|         if(m_registers[m_iterator].get_address() == address) | ||||
|         { | ||||
|             break; | ||||
|         }//if
 | ||||
|         //
 | ||||
|     }//for
 | ||||
|     //
 | ||||
|     return m_iterator; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusBufferInputRegister::write_cursor(uint16_t cursor, uint16_t data) | ||||
| { | ||||
|     m_registers[cursor].write((uint16_t)data); | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusBufferInputRegister::write_cursor(uint16_t cursor, int16_t  data) | ||||
| { | ||||
|     m_registers[cursor].write((int16_t)data); | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusBufferInputRegister::write_cursor(uint16_t cursor, uint32_t data) | ||||
| { | ||||
|     m_registers[cursor].write((uint32_t)data); | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusBufferInputRegister::write_cursor(uint16_t cursor, int32_t  data) | ||||
| { | ||||
|     m_registers[cursor].write((int32_t)data); | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusBufferInputRegister::write_cursor(uint16_t cursor, float    data) | ||||
| { | ||||
|     m_registers[cursor].write((float)data); | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| 
 | ||||
| 
 | ||||
| } /* namespace WEINBUS */ | ||||
| @ -1,52 +0,0 @@ | ||||
| /*
 | ||||
|  * WeinbusBufferInputRegisters.h | ||||
|  * | ||||
|  *      Author: Aleksey Gerasimenko | ||||
|  *      gerasimenko.aleksey.n@gmail.com | ||||
|  */ | ||||
| 
 | ||||
| #include "WEINBUS/WeinbusBufferRegister.h" | ||||
| 
 | ||||
| #ifndef WEINBUS_WEINBUSBUFFERINPUTREGISTER_H_ | ||||
| #define WEINBUS_WEINBUSBUFFERINPUTREGISTER_H_ | ||||
| 
 | ||||
| namespace WEINBUS | ||||
| { | ||||
| 
 | ||||
| class WeinbusBufferInputRegister:public WEINBUS::WeinbusBufferRegister | ||||
| { | ||||
| private: | ||||
|     WEINBUS::WeinbusTableRegister m_registers[WEINBUS_INPUT_REGISTERS_SIZE]; | ||||
| private: | ||||
|     WEINBUS::WeinbusTableRegister m_aux_register; | ||||
|     uint16_t m_iterator; | ||||
| public: | ||||
|     WeinbusBufferInputRegister(); | ||||
| public: | ||||
|     void add(uint16_t offset, uint16_t   *param); | ||||
|     void add(uint16_t offset, int16_t    *param); | ||||
|     void add(uint16_t offset, uint32_t   *param); | ||||
|     void add(uint16_t offset, int32_t    *param); | ||||
|     void add(uint16_t offset, float      *param); | ||||
| public: | ||||
|     WEINBUS::WeinbusTableRegister get_register_address(uint16_t address); | ||||
|     WEINBUS::WeinbusTableRegister get_register_cursor(uint16_t cursor); | ||||
| public: | ||||
|     void write(uint16_t address, uint16_t data); | ||||
|     void write(uint16_t address, int16_t  data); | ||||
|     void write(uint16_t address, uint32_t data); | ||||
|     void write(uint16_t address, int32_t  data); | ||||
|     void write(uint16_t address, float    data); | ||||
| public: | ||||
|     uint16_t get_cursor(uint16_t address); | ||||
| public: | ||||
|     void write_cursor(uint16_t cursor, uint16_t data); | ||||
|     void write_cursor(uint16_t cursor, int16_t  data); | ||||
|     void write_cursor(uint16_t cursor, uint32_t data); | ||||
|     void write_cursor(uint16_t cursor, int32_t  data); | ||||
|     void write_cursor(uint16_t cursor, float    data); | ||||
| }; | ||||
| 
 | ||||
| } /* namespace WEINBUS */ | ||||
| 
 | ||||
| #endif /* WEINBUS_WEINBUSBUFFERINPUTREGISTER_H_ */ | ||||
| @ -1,30 +0,0 @@ | ||||
| /*
 | ||||
|  * WeinbusBufferOutputCoil.cpp | ||||
|  * | ||||
|  *      Author: Aleksey Gerasimenko | ||||
|  *      gerasimenko.aleksey.n@gmail.com | ||||
|  */ | ||||
| 
 | ||||
| #include "WEINBUS/WeinbusBufferOutputCoil.h" | ||||
| 
 | ||||
| namespace WEINBUS | ||||
| { | ||||
| //CONSTRUCTOR
 | ||||
| WeinbusBufferOutputCoil::WeinbusBufferOutputCoil(): | ||||
|         WeinbusBufferCoil(), | ||||
|         m_coils() | ||||
| {}//CONSTRUCTOR
 | ||||
| 
 | ||||
| 
 | ||||
| void WeinbusBufferOutputCoil::add(uint16_t offset, WEINBUS::weinbus_coil_t coil, uint16_t* param) | ||||
| { | ||||
|     if(m_counter < m_size) | ||||
|         { | ||||
|             m_coils[m_counter].add(m_start_addr + offset, coil, param); | ||||
|             m_counter++; | ||||
|             m_quantity = m_counter; | ||||
|         } | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| } /* namespace WEINBUS */ | ||||
| @ -1,30 +0,0 @@ | ||||
| /*
 | ||||
|  * WeinbusBufferOutputCoil.h | ||||
|  * | ||||
|  *      Author: Aleksey Gerasimenko | ||||
|  *      gerasimenko.aleksey.n@gmail.com | ||||
|  */ | ||||
| 
 | ||||
| #include "WEINBUS/WeinbusBufferCoil.h" | ||||
| #include "WEINBUS/WeinbusTableCoil.h" | ||||
| 
 | ||||
| #ifndef WEINBUS_WEINBUSBUFFEROUTPUTCOIL_H_ | ||||
| #define WEINBUS_WEINBUSBUFFEROUTPUTCOIL_H_ | ||||
| 
 | ||||
| 
 | ||||
| namespace WEINBUS | ||||
| { | ||||
| 
 | ||||
| class WeinbusBufferOutputCoil: public WeinbusBufferCoil | ||||
| { | ||||
| private: | ||||
|     WEINBUS::WeinbusTableCoil m_coils[16]; | ||||
| public: | ||||
|     WeinbusBufferOutputCoil(); | ||||
| public: | ||||
|     void add(uint16_t offset, WEINBUS::weinbus_coil_t coil, uint16_t* param); | ||||
| }; | ||||
| 
 | ||||
| } /* namespace WEINBUS */ | ||||
| 
 | ||||
| #endif /* WEINBUS_WEINBUSBUFFEROUTPUTCOIL_H_ */ | ||||
| @ -1,239 +0,0 @@ | ||||
| /*
 | ||||
|  * WeinbusBufferOutputRegister.cpp | ||||
|  * | ||||
|  *      Author: Aleksey Gerasimenko | ||||
|  *      gerasimenko.aleksey.n@gmail.com | ||||
|  */ | ||||
| 
 | ||||
| #include "WEINBUS/WeinbusBufferOutputRegister.h" | ||||
| 
 | ||||
| namespace WEINBUS | ||||
| { | ||||
| //CONSTRUCTOR
 | ||||
| WeinbusBufferOutputRegister::WeinbusBufferOutputRegister(): | ||||
|         WeinbusBufferRegister(), | ||||
|         m_registers(), | ||||
|         m_aux_register(), | ||||
|         m_iterator(0) | ||||
|         //
 | ||||
| { | ||||
|     m_size = WEINBUS_OUTPUT_REGISTERS_SIZE; | ||||
| }//CONSTRUCTOR
 | ||||
| 
 | ||||
| void WeinbusBufferOutputRegister::add(uint16_t offset, uint16_t   *param) | ||||
| { | ||||
|     if(m_counter < m_size) | ||||
|     { | ||||
|         m_addr = m_start_addr + offset; | ||||
|         m_end_addr = m_addr > m_end_addr ? m_addr : m_end_addr; | ||||
|         m_registers[m_counter].add(m_addr, (uint16_t*)param); | ||||
|         m_counter++; | ||||
|         m_quantity = m_counter; | ||||
|     } | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusBufferOutputRegister::add(uint16_t offset, int16_t    *param) | ||||
| { | ||||
|     if(m_counter < m_size) | ||||
|     { | ||||
|         m_addr = m_start_addr + offset; | ||||
|         m_end_addr = m_addr > m_end_addr ? m_addr : m_end_addr; | ||||
|         m_registers[m_counter].add(m_addr, (int16_t*)param); | ||||
|         m_counter++; | ||||
|         m_quantity = m_counter; | ||||
|     } | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusBufferOutputRegister::add(uint16_t offset, uint32_t   *param) | ||||
| { | ||||
|     if(m_counter < m_size) | ||||
|     { | ||||
|         m_addr = m_start_addr + offset; | ||||
|         m_end_addr = m_addr > m_end_addr ? m_addr : m_end_addr; | ||||
|         m_registers[m_counter].add(m_addr, (uint32_t*)param); | ||||
|         m_counter++; | ||||
|         m_quantity = m_counter; | ||||
|     } | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusBufferOutputRegister::add(uint16_t offset, int32_t    *param) | ||||
| { | ||||
|     if(m_counter < m_size) | ||||
|     { | ||||
|         m_addr = m_start_addr + offset; | ||||
|         m_end_addr = m_addr > m_end_addr ? m_addr : m_end_addr; | ||||
|         m_registers[m_counter].add(m_addr, (int32_t*)param); | ||||
|         m_counter++; | ||||
|         m_quantity = m_counter; | ||||
|     } | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusBufferOutputRegister::add(uint16_t offset, float      *param) | ||||
| { | ||||
|     if(m_counter < m_size) | ||||
|     { | ||||
|         m_addr = m_start_addr + offset; | ||||
|         m_end_addr = m_addr > m_end_addr ? m_addr : m_end_addr; | ||||
|         m_registers[m_counter].add(m_addr, (float*)param); | ||||
|         m_counter++; | ||||
|         m_quantity = m_counter; | ||||
|     } | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| 
 | ||||
| WEINBUS::WeinbusTableRegister WeinbusBufferOutputRegister::get_register_address(uint16_t address) | ||||
| { | ||||
|     for(m_iterator = 0; m_iterator < m_quantity; m_iterator++) | ||||
|     { | ||||
| 
 | ||||
|         if(m_registers[m_iterator].get_address() == address) | ||||
|         { | ||||
|             m_aux_register = m_registers[m_iterator]; | ||||
|             break; | ||||
|         }//if
 | ||||
|         //
 | ||||
|     }//for
 | ||||
|     //
 | ||||
|     return m_aux_register; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| WEINBUS::WeinbusTableRegister WeinbusBufferOutputRegister::get_register_cursor(uint16_t cursor) | ||||
| { | ||||
|     return m_registers[cursor]; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusBufferOutputRegister::read(uint16_t address, uint16_t &data) | ||||
| { | ||||
|     for(m_iterator = 0; m_iterator < m_quantity; m_iterator++) | ||||
|     { | ||||
|         if(m_registers[m_iterator].get_address() == address) | ||||
|         { | ||||
|             m_aux_register = m_registers[m_iterator]; | ||||
|             break; | ||||
|         }//if
 | ||||
|         //
 | ||||
|     }//for
 | ||||
|     //
 | ||||
|     m_aux_register.read((uint16_t&)data); | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusBufferOutputRegister::read(uint16_t address, int16_t  &data) | ||||
| { | ||||
|     for(m_iterator = 0; m_iterator < m_quantity; m_iterator++) | ||||
|     { | ||||
|         if(m_registers[m_iterator].get_address() == address) | ||||
|         { | ||||
|             m_aux_register = m_registers[m_iterator]; | ||||
|             break; | ||||
|         }//if
 | ||||
|         //
 | ||||
|     }//for
 | ||||
|     //
 | ||||
|     m_aux_register.read((int16_t&)data); | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusBufferOutputRegister::read(uint16_t address, uint32_t &data) | ||||
| { | ||||
|     for(m_iterator = 0; m_iterator < m_quantity; m_iterator++) | ||||
|     { | ||||
|         if(m_registers[m_iterator].get_address() == address) | ||||
|         { | ||||
|             m_aux_register = m_registers[m_iterator]; | ||||
|             break; | ||||
|         }//if
 | ||||
|         //
 | ||||
|     }//for
 | ||||
|     //
 | ||||
|     m_aux_register.read((uint32_t&)data); | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusBufferOutputRegister::read(uint16_t address, int32_t  &data) | ||||
| { | ||||
|     for(m_iterator = 0; m_iterator < m_quantity; m_iterator++) | ||||
|     { | ||||
|         if(m_registers[m_iterator].get_address() == address) | ||||
|         { | ||||
|             m_aux_register = m_registers[m_iterator]; | ||||
|             break; | ||||
|         }//if
 | ||||
|         //
 | ||||
|     }//for
 | ||||
|     //
 | ||||
|     m_aux_register.read((int32_t&)data); | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusBufferOutputRegister::read(uint16_t address, float    &data) | ||||
| { | ||||
|     for(m_iterator = 0; m_iterator < m_quantity; m_iterator++) | ||||
|     { | ||||
|         if(m_registers[m_iterator].get_address() == address) | ||||
|         { | ||||
|             m_aux_register = m_registers[m_iterator]; | ||||
|             break; | ||||
|         }//if
 | ||||
|         //
 | ||||
|     }//for
 | ||||
|     //
 | ||||
|     m_aux_register.read((float&)data); | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| uint16_t WeinbusBufferOutputRegister::get_cursor(uint16_t address) | ||||
| { | ||||
|     for(m_iterator = 0; m_iterator < m_quantity; m_iterator++) | ||||
|     { | ||||
|         if(m_registers[m_iterator].get_address() == address) | ||||
|         { | ||||
|             break; | ||||
|         }//if
 | ||||
|         //
 | ||||
|     }//for
 | ||||
|     //
 | ||||
|     return m_iterator; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusBufferOutputRegister::read_cursor(uint16_t cursor, uint16_t &data) | ||||
| { | ||||
|     m_registers[cursor].read((uint16_t&)data); | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusBufferOutputRegister::read_cursor(uint16_t cursor, int16_t &data) | ||||
| { | ||||
|     m_registers[cursor].read((int16_t&)data); | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusBufferOutputRegister::read_cursor(uint16_t cursor, uint32_t &data) | ||||
| { | ||||
|     m_registers[cursor].read((uint32_t&)data); | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusBufferOutputRegister::read_cursor(uint16_t cursor, int32_t &data) | ||||
| { | ||||
|     m_registers[cursor].read((int32_t&)data); | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusBufferOutputRegister::read_cursor(uint16_t cursor, float &data) | ||||
| { | ||||
|     m_registers[cursor].read((float&)data); | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| 
 | ||||
| 
 | ||||
| } /* namespace WEINBUS */ | ||||
| @ -1,54 +0,0 @@ | ||||
| /*
 | ||||
|  * WeinbusBufferOutputRegister.h | ||||
|  * | ||||
|  *      Author: Aleksey Gerasimenko | ||||
|  *      gerasimenko.aleksey.n@gmail.com | ||||
|  */ | ||||
| 
 | ||||
| #include "WEINBUS/WeinbusBufferRegister.h" | ||||
| #include "WEINBUS/WeinbusTableRegister.h" | ||||
| 
 | ||||
| 
 | ||||
| #ifndef WEINBUS_WEINBUSBUFFEROUTPUTREGISTER_H_ | ||||
| #define WEINBUS_WEINBUSBUFFEROUTPUTREGISTER_H_ | ||||
| 
 | ||||
| namespace WEINBUS | ||||
| { | ||||
| 
 | ||||
| 
 | ||||
| class WeinbusBufferOutputRegister:public WEINBUS:: WeinbusBufferRegister | ||||
| { | ||||
| private: | ||||
|     WEINBUS::WeinbusTableRegister m_registers[WEINBUS_OUTPUT_REGISTERS_SIZE]; | ||||
| private: | ||||
|     WEINBUS::WeinbusTableRegister m_aux_register; | ||||
|     uint16_t m_iterator; | ||||
| public: | ||||
|     WeinbusBufferOutputRegister(); | ||||
| public: | ||||
|     void add(uint16_t offset, uint16_t   *param); | ||||
|     void add(uint16_t offset, int16_t    *param); | ||||
|     void add(uint16_t offset, uint32_t   *param); | ||||
|     void add(uint16_t offset, int32_t    *param); | ||||
|     void add(uint16_t offset, float      *param); | ||||
| public: | ||||
|     WEINBUS::WeinbusTableRegister get_register_address(uint16_t address); | ||||
|     WEINBUS::WeinbusTableRegister get_register_cursor(uint16_t cursor); | ||||
| public: | ||||
|     void read(uint16_t address, uint16_t &data); | ||||
|     void read(uint16_t address, int16_t  &data); | ||||
|     void read(uint16_t address, uint32_t &data); | ||||
|     void read(uint16_t address, int32_t  &data); | ||||
|     void read(uint16_t address, float    &data); | ||||
| public: | ||||
|     uint16_t get_cursor(uint16_t address); | ||||
|     void read_cursor(uint16_t cursor, uint16_t &data); | ||||
|     void read_cursor(uint16_t cursor, int16_t  &data); | ||||
|     void read_cursor(uint16_t cursor, uint32_t &data); | ||||
|     void read_cursor(uint16_t cursor, int32_t  &data); | ||||
|     void read_cursor(uint16_t cursor, float    &data); | ||||
| }; | ||||
| 
 | ||||
| } /* namespace WEINBUS */ | ||||
| 
 | ||||
| #endif /* WEINBUS_WEINBUSBUFFEROUTPUTREGISTER_H_ */ | ||||
| @ -1,18 +0,0 @@ | ||||
| /*
 | ||||
|  * WeinbusBufferRegister.cpp | ||||
|  * | ||||
|  *      Author: Aleksey Gerasimenko | ||||
|  *      gerasimenko.aleksey.n@gmail.com | ||||
|  */ | ||||
| 
 | ||||
| #include "WEINBUS/WeinbusBufferRegister.h" | ||||
| 
 | ||||
| namespace WEINBUS | ||||
| { | ||||
| //CONSTRUCTOR
 | ||||
| WeinbusBufferRegister::WeinbusBufferRegister(): | ||||
|         WeinbusBuffer() | ||||
| {}//CONSTRUCTOR
 | ||||
| 
 | ||||
| 
 | ||||
| } /* namespace WEINBUS */ | ||||
| @ -1,30 +0,0 @@ | ||||
| /*
 | ||||
|  * WeinbusBufferRegister.h | ||||
|  * | ||||
|  *      Author: Aleksey Gerasimenko | ||||
|  *      gerasimenko.aleksey.n@gmail.com | ||||
|  */ | ||||
| 
 | ||||
| #include "WEINBUS/WeinbusBuffer.h" | ||||
| #include "WEINBUS/WeinbusTableRegister.h" | ||||
| 
 | ||||
| #ifndef WEINBUS_WEINBUSBUFFERREGISTER_H_ | ||||
| #define WEINBUS_WEINBUSBUFFERREGISTER_H_ | ||||
| 
 | ||||
| namespace WEINBUS | ||||
| { | ||||
| 
 | ||||
| class WeinbusBufferRegister: public WEINBUS::WeinbusBuffer | ||||
| { | ||||
| public: | ||||
|     WeinbusBufferRegister(); | ||||
|     virtual void add(uint16_t offset, uint16_t   *param) = 0; | ||||
|     virtual void add(uint16_t offset, int16_t    *param) = 0; | ||||
|     virtual void add(uint16_t offset, uint32_t   *param) = 0; | ||||
|     virtual void add(uint16_t offset, int32_t    *param) = 0; | ||||
|     virtual void add(uint16_t offset, float      *param) = 0; | ||||
| }; | ||||
| 
 | ||||
| } /* namespace WEINBUS */ | ||||
| 
 | ||||
| #endif /* WEINBUS_WEINBUSBUFFERREGISTER_H_ */ | ||||
| @ -1,134 +0,0 @@ | ||||
| /*
 | ||||
|  * WeinbusDefines.h | ||||
|  * | ||||
|  *      Author: Aleksey Gerasimenko | ||||
|  *      gerasimenko.aleksey.n@gmail.com | ||||
|  */ | ||||
| 
 | ||||
| #include <math.h> | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| #ifndef WEINBUS_WEINBUSDEFINES_H_ | ||||
| #define WEINBUS_WEINBUSDEFINES_H_ | ||||
| 
 | ||||
| 
 | ||||
| typedef unsigned char uint8_t; | ||||
| typedef signed   char int8_t; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #ifndef WEINBUS_INPUT_REGISTERS_SIZE | ||||
| #define WEINBUS_INPUT_REGISTERS_SIZE    20 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef WEINBUS_OUTPUT_REGISTERS_SIZE | ||||
| #define WEINBUS_OUTPUT_REGISTERS_SIZE   20 | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| namespace WEINBUS | ||||
| { | ||||
| 
 | ||||
| enum data_variant_type_t {DATA_UINT16, DATA_INT16, DATA_UINT32, DATA_INT32, DATA_FLOAT}; | ||||
| 
 | ||||
| enum buffer_type_t  {OUTPUTCOILS, INPUTCOILS, OUTPUTREGISTERS, INPUTREGISTERS}; | ||||
| 
 | ||||
| enum weinbus_coil_t {    COIL00, | ||||
|                         COIL01, | ||||
|                         COIL02, | ||||
|                         COIL03, | ||||
|                         COIL04, | ||||
|                         COIL05, | ||||
|                         COIL06, | ||||
|                         COIL07, | ||||
|                         COIL08, | ||||
|                         COIL09, | ||||
|                         COIL10, | ||||
|                         COIL11, | ||||
|                         COIL12, | ||||
|                         COIL13, | ||||
|                         COIL14, | ||||
|                         COIL15}; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| struct REGISTER_16_BIT_FIELD | ||||
| { | ||||
|     uint16_t b00: 1; | ||||
|     uint16_t b01: 1; | ||||
|     uint16_t b02: 1; | ||||
|     uint16_t b03: 1; | ||||
|     uint16_t b04: 1; | ||||
|     uint16_t b05: 1; | ||||
|     uint16_t b06: 1; | ||||
|     uint16_t b07: 1; | ||||
|     uint16_t b08: 1; | ||||
|     uint16_t b09: 1; | ||||
|     uint16_t b10: 1; | ||||
|     uint16_t b11: 1; | ||||
|     uint16_t b12: 1; | ||||
|     uint16_t b13: 1; | ||||
|     uint16_t b14: 1; | ||||
|     uint16_t b15: 1; | ||||
| };//REGISTER_16_BIT_FIELD
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| struct REGISTER_16_BYTE_FIELD | ||||
| { | ||||
|     uint16_t bt0 :8; | ||||
|     uint16_t bt1 :8; | ||||
| };//REGISTER_16_BYTE_FIELD
 | ||||
| 
 | ||||
| union REGISTER_16 | ||||
| { | ||||
|     uint16_t            all; | ||||
|     REGISTER_16_BIT_FIELD  bit; | ||||
|     REGISTER_16_BYTE_FIELD byte; | ||||
|     REGISTER_16(): | ||||
|         all(0) | ||||
|     {} | ||||
|     REGISTER_16(uint16_t val): | ||||
|         all(val) | ||||
|     {} | ||||
| };//REGISTER_16
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| struct REGISTER_32_BYTE_FIELD | ||||
| { | ||||
|     uint16_t bt0 :8; | ||||
|     uint16_t bt1 :8; | ||||
|     uint16_t bt2 :8; | ||||
|     uint16_t bt3 :8; | ||||
| };//REGISTER_32_BYTE_FIELD
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| union REGISTER_32 | ||||
| { | ||||
|     uint32_t    all; | ||||
|     bool        b; | ||||
|     uint8_t     u8; | ||||
|     int8_t      i8; | ||||
|     uint16_t    u16; | ||||
|     int16_t     i16; | ||||
|     uint32_t    u32; | ||||
|     int32_t     i32; | ||||
|     float       f; | ||||
|     REGISTER_32_BYTE_FIELD byte; | ||||
|     REGISTER_32(): | ||||
|         all((uint32_t)0) | ||||
|     {}; | ||||
|     REGISTER_32(uint32_t val): | ||||
|         all(val) | ||||
|     {} | ||||
| };//REGISTER_32
 | ||||
| 
 | ||||
| 
 | ||||
| }//namespace WEINBUS
 | ||||
| 
 | ||||
| #endif /* WEINBUS_WEINBUSDEFINES_H_ */ | ||||
| @ -1,90 +0,0 @@ | ||||
| /*
 | ||||
|  * WeinRegisterVariant.cpp | ||||
|  * | ||||
|  *      Author: Aleksey Gerasimenko | ||||
|  *      gerasimenko.aleksey.n@gmail.com | ||||
|  */ | ||||
| 
 | ||||
| #include "WEINBUS/WeinbusRegisterVariant.h" | ||||
| 
 | ||||
| namespace WEINBUS | ||||
| { | ||||
| //CONSTRUCTOR
 | ||||
| WeinbusRegisterVariant::WeinbusRegisterVariant(): | ||||
|         t(WEINBUS::DATA_UINT32), | ||||
|         u32((uint32_t)0) | ||||
| {}//CONSTRUCTOR
 | ||||
| 
 | ||||
| 
 | ||||
| WEINBUS::data_variant_type_t WeinbusRegisterVariant::get_type() const | ||||
| { | ||||
|     return t; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusRegisterVariant::set_uint16(uint16_t value) | ||||
| { | ||||
|     u16 = value; | ||||
|     t = WEINBUS::DATA_UINT16; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusRegisterVariant::set_int16(int16_t value) | ||||
| { | ||||
|     i16 = value; | ||||
|     t = WEINBUS::DATA_INT16; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusRegisterVariant::set_uint32(uint32_t value) | ||||
| { | ||||
|     u32 = value; | ||||
|     t = WEINBUS::DATA_UINT32; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusRegisterVariant::set_int32(int32_t value) | ||||
| { | ||||
|     i32 = value; | ||||
|     t = WEINBUS::DATA_INT32; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusRegisterVariant::set_float(float value) | ||||
| { | ||||
|     f = value; | ||||
|     t = WEINBUS::DATA_FLOAT; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| uint16_t WeinbusRegisterVariant::get_uint16() const | ||||
| { | ||||
|     return u16; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| int16_t WeinbusRegisterVariant::get_int16() const | ||||
| { | ||||
|     return i16; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| uint32_t WeinbusRegisterVariant::get_uint32() const | ||||
| { | ||||
|     return u32; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| int32_t  WeinbusRegisterVariant::get_int32() const | ||||
| { | ||||
|     return i32; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| float WeinbusRegisterVariant::get_float() const | ||||
| { | ||||
|     return f; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| } /* namespace WEINBUS */ | ||||
| @ -1,52 +0,0 @@ | ||||
| /*
 | ||||
|  * WeinRegisterVariant.h | ||||
|  * | ||||
|  *      Author: Aleksey Gerasimenko | ||||
|  *      gerasimenko.aleksey.n@gmail.com | ||||
|  */ | ||||
| 
 | ||||
| #include <math.h> | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| #include "WEINBUS/WeinbusDefines.h" | ||||
| 
 | ||||
| #ifndef WEINBUS_WEINBUSREGISTERVARIANT_H_ | ||||
| #define WEINBUS_WEINBUSREGISTERVARIANT_H_ | ||||
| 
 | ||||
| 
 | ||||
| namespace WEINBUS | ||||
| { | ||||
| 
 | ||||
| class WeinbusRegisterVariant | ||||
| { | ||||
| private: | ||||
|     union | ||||
|         { | ||||
|         uint16_t    u16; | ||||
|         int16_t     i16; | ||||
|         uint32_t    u32; | ||||
|         int32_t     i32; | ||||
|         float       f; | ||||
|         }; | ||||
|     data_variant_type_t t; | ||||
| public: | ||||
|     WeinbusRegisterVariant(); | ||||
|     data_variant_type_t get_type() const; | ||||
|     //setters
 | ||||
|     void set_uint16 (uint16_t value); | ||||
|     void set_int16  (int16_t  value); | ||||
|     void set_uint32 (uint32_t value); | ||||
|     void set_int32  (int32_t  value); | ||||
|     void set_float  (float    value); | ||||
|     //getters
 | ||||
|     uint16_t get_uint16() const; | ||||
|     int16_t  get_int16()  const; | ||||
|     uint32_t get_uint32() const; | ||||
|     int32_t  get_int32()  const; | ||||
|     float    get_float()  const; | ||||
|     //
 | ||||
| }; | ||||
| 
 | ||||
| } /* namespace WEINBUS */ | ||||
| 
 | ||||
| #endif /* WEINBUS_WEINBUSREGISTERVARIANT_H_ */ | ||||
| @ -1,410 +0,0 @@ | ||||
| /*
 | ||||
|  * WeinbusSlave.cpp | ||||
|  * | ||||
|  *      Author: Aleksey Gerasimenko | ||||
|  *      gerasimenko.aleksey.n@gmail.com | ||||
|  */ | ||||
| 
 | ||||
| #include "WEINBUS/WeinbusSlave.h" | ||||
| 
 | ||||
| namespace WEINBUS | ||||
| { | ||||
| //CONSTRUCTOR
 | ||||
| WeinbusSlave::WeinbusSlave(MODBUSRTU::ModbusRTUCRC& crc): | ||||
|         //outputCoils(),
 | ||||
|         //inputCoils(),
 | ||||
|         outputRegisters(), | ||||
|         inputRegisters(), | ||||
|         //
 | ||||
|         rxStack(), | ||||
|         txStack(), | ||||
|         rxLength(0), | ||||
|         txLength(0), | ||||
|         //
 | ||||
|         m_function(0), | ||||
|         m_start_address(0), | ||||
|         m_length(0), | ||||
|         m_value(0), | ||||
|         m_counter(0), | ||||
|         m_counter_length(0), | ||||
|         m_point(0), | ||||
|         m_cursor(0), | ||||
|         m_byte_length(0), | ||||
|         m_byte_counter(0), | ||||
|         m_aux_register(), | ||||
|         //
 | ||||
|         m_crc(crc) | ||||
|         //
 | ||||
| {}//CONSTRUCTOR
 | ||||
| 
 | ||||
| 
 | ||||
| void WeinbusSlave::execute() | ||||
| { | ||||
|     if(rxLength != 0) | ||||
|     { | ||||
|         m_function = rxStack[1]; | ||||
| 
 | ||||
|         switch(m_function) | ||||
|         { | ||||
|         case MODBUSRTU_FUNCTION_BROADCAST:                  { _function_broadcast();                    break;} | ||||
|         case MODBUSRTU_FUNCTION_READ_COIL_STATUS:           { _function_read_coil_status();             break;} | ||||
|         case MODBUSRTU_FUNCTION_READ_INPUT_STATUS:          { _function_read_input_status();            break;} | ||||
|         case MODBUSRTU_FUNCTION_READ_HOLDING_REGISTERS:     { _function_read_holding_registers();       break;} | ||||
|         case MODBUSRTU_FUNCTION_READ_INPUT_REGISTERS:       { _function_read_input_registers();         break;} | ||||
|         case MODBUSRTU_FUNCTION_FORCE_SINGLE_COIL:          { _function_force_single_coil();            break;} | ||||
|         case MODBUSRTU_FUNCTION_PRESET_SINGLE_REGISTER:     { _function_preset_single_register();       break;} | ||||
|         case MODBUSRTU_FUNCTION_FORCE_MULTIPLE_COILS:       { _function_force_multiple_coils();         break;} | ||||
|         case MODBUSRTU_FUNCTION_PRESET_MULTIPLE_REGISTERS:  { _function_preset_multiple_registers();    break;} | ||||
|         default:{ txLength = 0;} | ||||
| 
 | ||||
|         //
 | ||||
|         }//switch
 | ||||
|         //
 | ||||
|     }//if
 | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusSlave::_function_broadcast() | ||||
| { | ||||
|     // Function 0x001 broadcast
 | ||||
|     //
 | ||||
|     txLength = 0; | ||||
|     rxLength = 0; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusSlave::_function_read_coil_status() | ||||
| { | ||||
|     // Function 0x01 read coil, table is "outputCoils"
 | ||||
|     //
 | ||||
|     txLength = 0; | ||||
|     rxLength = 0; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusSlave::_function_read_input_status() | ||||
| { | ||||
|     // Function 0x02 read input status
 | ||||
|     //
 | ||||
|     txLength = 0; | ||||
|     rxLength = 0; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusSlave::_function_read_holding_registers() | ||||
| { | ||||
|     // Function 0x03 read register, table is "outputRegisters"
 | ||||
| 
 | ||||
|     // construct start address
 | ||||
|     m_start_address.byte.bt1 = rxStack[2]; | ||||
|     m_start_address.byte.bt0 = rxStack[3]; | ||||
| 
 | ||||
|     // construct 16-bit register quantity
 | ||||
|     m_length.byte.bt1 = rxStack[4]; | ||||
|     m_length.byte.bt0 = rxStack[5]; | ||||
|     m_counter_length = m_length.all; | ||||
|     m_counter = 0; | ||||
| 
 | ||||
| 
 | ||||
|     // check address range
 | ||||
| //    if((outputRegisters.address_range(m_start_address.all))&
 | ||||
| //            (outputRegisters.address_range(m_start_address.all + m_length.all - (uint16_t)1)))
 | ||||
|     if(outputRegisters.address_range(m_start_address.all)) | ||||
|     { | ||||
|         // CONSTRUCT ANSWER
 | ||||
|         //1. Node ID
 | ||||
|         txStack[0] = rxStack[0]; | ||||
|         //2. Function code
 | ||||
|         txStack[1] = rxStack[1]; | ||||
|         //3. Byte number - should be counted
 | ||||
|         txStack[2] = 0 ; | ||||
|         m_byte_counter = 0; | ||||
|         //4. Fill fields with values
 | ||||
|         m_point = 3; | ||||
| 
 | ||||
|         m_cursor = outputRegisters.get_cursor(m_start_address.all); | ||||
| 
 | ||||
|         //for(m_counter = 0; m_counter < m_length.all; m_counter++)
 | ||||
|         while(m_counter < m_counter_length) | ||||
|         { | ||||
|             m_aux_register = outputRegisters.get_register_cursor(m_cursor); | ||||
|             switch(m_aux_register.get_type()) | ||||
|             { | ||||
|             case DATA_UINT16: | ||||
|             { | ||||
|                 m_aux_register.read((uint16_t&)m_value.u16); | ||||
|                 txStack[m_point] = m_value.byte.bt1; | ||||
|                 m_point++; | ||||
|                 txStack[m_point] = m_value.byte.bt0; | ||||
|                 m_point++; | ||||
|                 m_counter++; | ||||
|                 m_cursor++; | ||||
|                 m_byte_counter += 2; | ||||
|                 break; | ||||
|             } | ||||
|             case DATA_INT16: | ||||
|             { | ||||
|                 m_aux_register.read((int16_t&)m_value.i16); | ||||
|                 txStack[m_point] = m_value.byte.bt1; | ||||
|                 m_point++; | ||||
|                 txStack[m_point] = m_value.byte.bt0; | ||||
|                 m_point++; | ||||
|                 m_counter++; | ||||
|                 m_cursor++; | ||||
|                 m_byte_counter += 2; | ||||
|                 break; | ||||
|             } | ||||
|             case DATA_UINT32: | ||||
|             { | ||||
|                 m_aux_register.read((uint32_t&)m_value.u32); | ||||
|                 txStack[m_point] = m_value.byte.bt1; | ||||
|                 m_point++; | ||||
|                 txStack[m_point] = m_value.byte.bt0; | ||||
|                 m_point++; | ||||
|                 txStack[m_point] = m_value.byte.bt3; | ||||
|                 m_point++; | ||||
|                 txStack[m_point] = m_value.byte.bt2; | ||||
|                 m_point++; | ||||
|                 m_counter += 2; | ||||
|                 m_cursor++; | ||||
|                 m_byte_counter += 4; | ||||
|                 break; | ||||
|             } | ||||
|             case DATA_INT32: | ||||
|             { | ||||
|                 m_aux_register.read((int32_t&)m_value.i32); | ||||
|                 txStack[m_point] = m_value.byte.bt1; | ||||
|                 m_point++; | ||||
|                 txStack[m_point] = m_value.byte.bt0; | ||||
|                 m_point++; | ||||
|                 txStack[m_point] = m_value.byte.bt3; | ||||
|                 m_point++; | ||||
|                 txStack[m_point] = m_value.byte.bt2; | ||||
|                 m_point++; | ||||
|                 m_counter += 2; | ||||
|                 m_cursor++; | ||||
|                 m_byte_counter += 4; | ||||
|                 break; | ||||
|             } | ||||
|             case DATA_FLOAT: | ||||
|             { | ||||
|                 m_aux_register.read((float&)m_value.f); | ||||
|                 txStack[m_point] = m_value.byte.bt1; | ||||
|                 m_point++; | ||||
|                 txStack[m_point] = m_value.byte.bt0; | ||||
|                 m_point++; | ||||
|                 txStack[m_point] = m_value.byte.bt3; | ||||
|                 m_point++; | ||||
|                 txStack[m_point] = m_value.byte.bt2; | ||||
|                 m_point++; | ||||
|                 m_counter += 2; | ||||
|                 m_cursor++; | ||||
|                 m_byte_counter += 4; | ||||
|                 break; | ||||
|             } | ||||
|             default:{} | ||||
|             } | ||||
|             //
 | ||||
|         }//for
 | ||||
|         //
 | ||||
|         //5. Byte number
 | ||||
|         txStack[2] = m_byte_counter; | ||||
|         //6. CRC
 | ||||
|         m_value.all = m_crc.calculate(txStack, m_point); | ||||
|         txStack[m_point] = m_value.byte.bt0; | ||||
|         m_point++; | ||||
|         txStack[m_point] = m_value.byte.bt1; | ||||
|         m_point++; | ||||
|         //
 | ||||
|         //6. Finish
 | ||||
|         txLength = m_point; | ||||
|         rxLength = 0; | ||||
|         //
 | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         // address wrong
 | ||||
|         txLength = 0; | ||||
|         rxLength = 0; | ||||
|         //
 | ||||
|     }//if else
 | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusSlave::_function_read_input_registers() | ||||
| { | ||||
|     // Function 0x04 read input register
 | ||||
|     //
 | ||||
|     txLength = 0; | ||||
|     rxLength = 0; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusSlave::_function_force_single_coil() | ||||
| { | ||||
|     // Function 0x05 write single coil, table is "inputCoils"
 | ||||
|     //
 | ||||
|     txLength = 0; | ||||
|     rxLength = 0; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusSlave::_function_preset_single_register() | ||||
| { | ||||
|     // Function 0x06 write single register, table is "inputRegisters"
 | ||||
|     //
 | ||||
|     txLength = 0; | ||||
|     rxLength = 0; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusSlave::_function_force_multiple_coils() | ||||
| { | ||||
|     // Function 0x0F write multiple coil, table is "inputCoils"`
 | ||||
|     //
 | ||||
|     txLength = 0; | ||||
|     rxLength = 0; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void WeinbusSlave::_function_preset_multiple_registers() | ||||
| { | ||||
|     // Function 0x10 write multiple register, table is "inputRegisters"
 | ||||
| 
 | ||||
|     // construct start address
 | ||||
|     m_start_address.byte.bt1 = rxStack[2]; | ||||
|     m_start_address.byte.bt0 = rxStack[3]; | ||||
| 
 | ||||
|     // construct 16-bit register quantity
 | ||||
|     m_length.byte.bt1 = rxStack[4]; | ||||
|     m_length.byte.bt0 = rxStack[5]; | ||||
|     m_counter_length = m_length.all; | ||||
|     m_counter = 0; | ||||
| 
 | ||||
|     // construct byte length
 | ||||
|     m_byte_length = rxStack[6]; | ||||
|     m_byte_counter = 0; | ||||
| 
 | ||||
| 
 | ||||
|     // check address range
 | ||||
| //    if((outputRegisters.address_range(m_start_address.all))&
 | ||||
| //            (outputRegisters.address_range(m_start_address.all + m_length.all - (uint16_t)1)))
 | ||||
|     if(outputRegisters.address_range(m_start_address.all)) | ||||
|     { | ||||
| 
 | ||||
|         m_cursor = inputRegisters.get_cursor(m_start_address.all); | ||||
|         m_point = 7; | ||||
|         while(m_byte_counter < m_byte_length) | ||||
|         { | ||||
|             m_aux_register = inputRegisters.get_register_cursor(m_cursor); | ||||
|             switch(m_aux_register.get_type()) | ||||
|             { | ||||
|                 case DATA_UINT16: | ||||
|                 { | ||||
|                     m_value.byte.bt1 = rxStack[m_point]; | ||||
|                     m_point++; | ||||
|                     m_value.byte.bt0 = rxStack[m_point]; | ||||
|                     m_point++; | ||||
|                     m_byte_counter += 2; | ||||
|                     m_aux_register.write((uint16_t)m_value.u16); | ||||
|                     m_cursor++; | ||||
|                     break; | ||||
|                 } | ||||
|                 case DATA_INT16: | ||||
|                 { | ||||
|                     m_value.byte.bt1 = rxStack[m_point]; | ||||
|                     m_point++; | ||||
|                     m_value.byte.bt0 = rxStack[m_point]; | ||||
|                     m_point++; | ||||
|                     m_byte_counter += 2; | ||||
|                     m_aux_register.write((int16_t)m_value.i16); | ||||
|                     m_cursor++; | ||||
|                     break; | ||||
|                 } | ||||
|                 case DATA_UINT32: | ||||
|                 { | ||||
|                     m_value.byte.bt1 = rxStack[m_point]; | ||||
|                     m_point++; | ||||
|                     m_value.byte.bt0 = rxStack[m_point]; | ||||
|                     m_point++; | ||||
|                     m_value.byte.bt3 = rxStack[m_point]; | ||||
|                     m_point++; | ||||
|                     m_value.byte.bt2 = rxStack[m_point]; | ||||
|                     m_point++; | ||||
|                     m_byte_counter += 4; | ||||
|                     m_aux_register.write((uint32_t)m_value.u32); | ||||
|                     m_cursor++; | ||||
|                     break; | ||||
|                 } | ||||
|                 case DATA_INT32: | ||||
|                 { | ||||
|                     m_value.byte.bt1 = rxStack[m_point]; | ||||
|                     m_point++; | ||||
|                     m_value.byte.bt0 = rxStack[m_point]; | ||||
|                     m_point++; | ||||
|                     m_value.byte.bt3 = rxStack[m_point]; | ||||
|                     m_point++; | ||||
|                     m_value.byte.bt2 = rxStack[m_point]; | ||||
|                     m_point++; | ||||
|                     m_byte_counter += 4; | ||||
|                     m_aux_register.write((int32_t)m_value.i32); | ||||
|                     m_cursor++; | ||||
|                     break; | ||||
|                 } | ||||
|                 case DATA_FLOAT: | ||||
|                 { | ||||
|                     m_value.byte.bt1 = rxStack[m_point]; | ||||
|                     m_point++; | ||||
|                     m_value.byte.bt0 = rxStack[m_point]; | ||||
|                     m_point++; | ||||
|                     m_value.byte.bt3 = rxStack[m_point]; | ||||
|                     m_point++; | ||||
|                     m_value.byte.bt2 = rxStack[m_point]; | ||||
|                     m_point++; | ||||
|                     m_byte_counter += 4; | ||||
|                     m_aux_register.write((float)m_value.f); | ||||
|                     m_cursor++; | ||||
|                     break; | ||||
|                 } | ||||
|                 default:{} | ||||
|             }//switch
 | ||||
|             //
 | ||||
|         }//while
 | ||||
| 
 | ||||
|         // CONSTRUCT ANSWER
 | ||||
|         //1. Node ID
 | ||||
|         txStack[0] = rxStack[0]; | ||||
|         //2. Function code
 | ||||
|         txStack[1] = rxStack[1]; | ||||
|         //3. Address h-byte
 | ||||
|         txStack[2] = m_start_address.byte.bt1; | ||||
|         //4. Address l-byte
 | ||||
|         txStack[3] = m_start_address.byte.bt0; | ||||
|         //5. Quantity h-byte
 | ||||
|         txStack[4] = m_length.byte.bt1; | ||||
|         //6. Quantity l-byte
 | ||||
|         txStack[5] = m_length.byte.bt0; | ||||
|         //7. CRC
 | ||||
|         m_value.all = m_crc.calculate(txStack, 6); | ||||
|         txStack[6] = m_value.byte.bt0; | ||||
|         txStack[7] = m_value.byte.bt1; | ||||
|         //
 | ||||
|         //8. Finish
 | ||||
|         txLength = 8; | ||||
|         rxLength = 0; | ||||
|         //
 | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         // address wrong
 | ||||
|         txLength = 0; | ||||
|         rxLength = 0; | ||||
|         //
 | ||||
|     }//if else
 | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| //
 | ||||
| 
 | ||||
| 
 | ||||
| } /* namespace WEINBUS */ | ||||
| @ -1,82 +0,0 @@ | ||||
| /*
 | ||||
|  * WeinbusSlave.h | ||||
|  * | ||||
|  *      Author: Aleksey Gerasimenko | ||||
|  *      gerasimenko.aleksey.n@gmail.com | ||||
|  */ | ||||
| 
 | ||||
| #include <math.h> | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| 
 | ||||
| #include "WEINBUS/WeinbusDefines.h" | ||||
| #include "WEINBUS/WeinbusBuffer.h" | ||||
| #include "WEINBUS/WeinbusBufferRegister.h" | ||||
| #include "WEINBUS/WeinbusBufferInputRegister.h" | ||||
| #include "WEINBUS/WeinbusBufferOutputRegister.h" | ||||
| #include "WEINBUS/WeinbusBufferCoil.h" | ||||
| #include "WEINBUS/WeinbusBufferInputCoil.h" | ||||
| #include "WEINBUS/WeinbusBufferOutputCoil.h" | ||||
| 
 | ||||
| #include "MODBUSRTU/ModbusRTUCRC.h" | ||||
| #include "MODBUSRTU/ModbusRTUDefines.h" | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #ifndef WEINBUS_WEINBUSSLAVE_H_ | ||||
| #define WEINBUS_WEINBUSSLAVE_H_ | ||||
| 
 | ||||
| namespace WEINBUS | ||||
| { | ||||
| 
 | ||||
| class WeinbusSlave | ||||
| { | ||||
| public: | ||||
|     // Function 0x01 read coil
 | ||||
|     //WEINBUS::WeinbusBufferOutputCoil        outputCoils;
 | ||||
|     // Function 0x05, 0x0F write single/multiple coil
 | ||||
|     //WEINBUS::WeinbusBufferInputCoil         inputCoils;
 | ||||
|     // Function 0x03 read register
 | ||||
|     WEINBUS::WeinbusBufferOutputRegister    outputRegisters; | ||||
|     // Function 0x06, 0x10 write single/multiple register
 | ||||
|     WEINBUS::WeinbusBufferInputRegister     inputRegisters; | ||||
| public: | ||||
|     uint16_t    rxStack[256]; | ||||
|     uint16_t    txStack[256]; | ||||
|     uint16_t    rxLength; | ||||
|     uint16_t    txLength; | ||||
|     //
 | ||||
| private: | ||||
|     uint16_t        m_function; | ||||
|     REGISTER_16     m_start_address; | ||||
|     REGISTER_16     m_length; | ||||
|     REGISTER_32     m_value; | ||||
|     uint16_t        m_counter; | ||||
|     uint16_t        m_counter_length; | ||||
|     uint16_t        m_point; | ||||
|     uint16_t        m_cursor; | ||||
|     uint16_t        m_byte_length; | ||||
|     uint16_t        m_byte_counter; | ||||
| private: | ||||
|     WEINBUS::WeinbusTableRegister m_aux_register; | ||||
| private: | ||||
|     MODBUSRTU::ModbusRTUCRC& m_crc; | ||||
| public: | ||||
|     WeinbusSlave(MODBUSRTU::ModbusRTUCRC& crc); | ||||
| public: | ||||
|     void execute(); | ||||
| private: | ||||
|     inline void _function_broadcast(); | ||||
|     inline void _function_read_coil_status(); | ||||
|     inline void _function_read_input_status(); | ||||
|     inline void _function_read_holding_registers(); | ||||
|     inline void _function_read_input_registers(); | ||||
|     inline void _function_force_single_coil(); | ||||
|     inline void _function_preset_single_register(); | ||||
|     inline void _function_force_multiple_coils(); | ||||
|     inline void _function_preset_multiple_registers(); | ||||
| }; | ||||
| 
 | ||||
| } /* namespace WEINBUS */ | ||||
| 
 | ||||
| #endif /* WEINBUS_WEINBUSSLAVE_H_ */ | ||||
| @ -1,28 +0,0 @@ | ||||
| /*
 | ||||
|  * WeinbusTableCoil.cpp | ||||
|  * | ||||
|  *      Author: Aleksey Gerasimenko | ||||
|  *      gerasimenko.aleksey.n@gmail.com | ||||
|  */ | ||||
| 
 | ||||
| #include "WEINBUS/WeinbusTableCoil.h" | ||||
| 
 | ||||
| namespace WEINBUS | ||||
| { | ||||
| //CONSTRUCTOR
 | ||||
| WeinbusTableCoil::WeinbusTableCoil(): | ||||
|         WeinbusTableUnit(), | ||||
|         m_coil(WEINBUS::COIL00) | ||||
| {}//CONSTRUCTOR
 | ||||
| 
 | ||||
| 
 | ||||
| void WeinbusTableCoil::add(uint16_t address, WEINBUS::weinbus_coil_t coil, uint16_t* param) | ||||
| { | ||||
|     m_address = address; | ||||
|     m_param = param; | ||||
|     m_coil = coil; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| 
 | ||||
| } /* namespace WEINBUS */ | ||||
| @ -1,35 +0,0 @@ | ||||
| /*
 | ||||
|  * WeinbusTableCoil.h | ||||
|  * | ||||
|  *      Author: Aleksey Gerasimenko | ||||
|  *      gerasimenko.aleksey.n@gmail.com | ||||
|  */ | ||||
| #include <math.h> | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| #include "WEINBUS/WeinbusDefines.h" | ||||
| #include "WEINBUS/WeinbusTableUnit.h" | ||||
| 
 | ||||
| #ifndef WEINBUS_WEINBUSTABLECOIL_H_ | ||||
| #define WEINBUS_WEINBUSTABLECOIL_H_ | ||||
| 
 | ||||
| namespace WEINBUS | ||||
| { | ||||
| 
 | ||||
| class WeinbusTableCoil: public WEINBUS::WeinbusTableUnit | ||||
| { | ||||
| private: | ||||
|     WEINBUS::weinbus_coil_t m_coil; | ||||
| public: | ||||
|     WeinbusTableCoil(); | ||||
| public: | ||||
|     void add(uint16_t address, WEINBUS::weinbus_coil_t coil, uint16_t* param); | ||||
| public: | ||||
|     void read(uint16_t data); | ||||
|     void write(uint16_t data); | ||||
|     void write(int16_t  data); | ||||
| }; | ||||
| 
 | ||||
| } /* namespace WEINBUS */ | ||||
| 
 | ||||
| #endif /* WEINBUS_WEINBUSTABLECOIL_H_ */ | ||||
| @ -1,125 +0,0 @@ | ||||
| /*
 | ||||
|  * WeinbusTableRegister.cpp | ||||
|  * | ||||
|  *      Author: Aleksey Gerasimenko | ||||
|  *      gerasimenko.aleksey.n@gmail.com | ||||
|  */ | ||||
| 
 | ||||
| #include "WEINBUS/WeinbusTableRegister.h" | ||||
| 
 | ||||
| namespace WEINBUS | ||||
| { | ||||
| //CONSTRUCTOR
 | ||||
| WeinbusTableRegister::WeinbusTableRegister(): | ||||
|         WeinbusTableUnit(), | ||||
|         t(WEINBUS::DATA_UINT32) | ||||
| {}//CONSTRUCTOR
 | ||||
| 
 | ||||
| 
 | ||||
| WEINBUS::data_variant_type_t WeinbusTableRegister::get_type() | ||||
| { | ||||
|     return t; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| //
 | ||||
| void  WeinbusTableRegister::add(uint16_t address, uint16_t  *param) | ||||
| { | ||||
|     m_address = address; | ||||
|     m_param = param; | ||||
|     t = WEINBUS::DATA_UINT16; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void  WeinbusTableRegister::add(uint16_t address, int16_t   *param) | ||||
| { | ||||
|     m_address = address; | ||||
|     m_param = param; | ||||
|     t = WEINBUS::DATA_INT16; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void  WeinbusTableRegister::add(uint16_t address, uint32_t  *param) | ||||
| { | ||||
|     m_address = address; | ||||
|     m_param = param; | ||||
|     t = WEINBUS::DATA_UINT32; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void  WeinbusTableRegister::add(uint16_t address, int32_t   *param) | ||||
| { | ||||
|     m_address = address; | ||||
|     m_param = param; | ||||
|     t = WEINBUS::DATA_INT32; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void  WeinbusTableRegister::add(uint16_t address, float     *param) | ||||
| { | ||||
|     m_address = address; | ||||
|     m_param = param; | ||||
|     t = WEINBUS::DATA_FLOAT; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void  WeinbusTableRegister::read(uint16_t   &data) | ||||
| { | ||||
|     data = *(uint16_t*)m_param; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void  WeinbusTableRegister::read(int16_t    &data) | ||||
| { | ||||
|     data = *(int16_t*)m_param; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void  WeinbusTableRegister::read(uint32_t   &data) | ||||
| { | ||||
|     data = *(uint32_t*)m_param; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void  WeinbusTableRegister::read(int32_t    &data) | ||||
| { | ||||
|     data = *(int32_t*)m_param; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void  WeinbusTableRegister::read(float      &data) | ||||
| { | ||||
|     data = *(float*)m_param; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void  WeinbusTableRegister::write(uint16_t  data) | ||||
| { | ||||
|     *(uint16_t*)m_param = (uint16_t)data; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void  WeinbusTableRegister::write(int16_t   data) | ||||
| { | ||||
|     *(int16_t*)m_param = (int16_t)data; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void  WeinbusTableRegister::write(uint32_t  data) | ||||
| { | ||||
|     *(uint32_t*)m_param = (uint32_t)data; | ||||
|     //
 | ||||
| }//
 | ||||
| //
 | ||||
| void  WeinbusTableRegister::write(int32_t  data) | ||||
| { | ||||
|     *(int32_t*)m_param = (int32_t)data; | ||||
|     //
 | ||||
| }//
 | ||||
| void  WeinbusTableRegister::write(float  data) | ||||
| { | ||||
|     *(float*)m_param = (float)data; | ||||
|     //
 | ||||
| }//
 | ||||
| 
 | ||||
| } /* namespace WEINBUS */ | ||||
| @ -1,49 +0,0 @@ | ||||
| /*
 | ||||
|  * WeinbusTableRegister.h | ||||
|  * | ||||
|  *      Author: Aleksey Gerasimenko | ||||
|  *      gerasimenko.aleksey.n@gmail.com | ||||
|  */ | ||||
| #include <math.h> | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| #include "WEINBUS/WeinbusDefines.h" | ||||
| #include "WEINBUS/WeinbusTableUnit.h" | ||||
| 
 | ||||
| #ifndef WEINBUS_WEINBUSTABLEREGISTER_H_ | ||||
| #define WEINBUS_WEINBUSTABLEREGISTER_H_ | ||||
| 
 | ||||
| namespace WEINBUS | ||||
| { | ||||
| 
 | ||||
| class WeinbusTableRegister: public WEINBUS::WeinbusTableUnit | ||||
| { | ||||
| protected: | ||||
|     WEINBUS::data_variant_type_t t; | ||||
| public: | ||||
|     WeinbusTableRegister(); | ||||
| public: | ||||
|     WEINBUS::data_variant_type_t get_type(); | ||||
| public: | ||||
|     void add(uint16_t address, uint16_t  *param); | ||||
|     void add(uint16_t address, int16_t   *param); | ||||
|     void add(uint16_t address, uint32_t  *param); | ||||
|     void add(uint16_t address, int32_t   *param); | ||||
|     void add(uint16_t address, float     *param); | ||||
| public: | ||||
|     void read(uint16_t   &data); | ||||
|     void read(int16_t    &data); | ||||
|     void read(uint32_t   &data); | ||||
|     void read(int32_t    &data); | ||||
|     void read(float      &data); | ||||
| public: | ||||
|     void write(uint16_t  data); | ||||
|     void write(int16_t   data); | ||||
|     void write(uint32_t  data); | ||||
|     void write(int32_t   data); | ||||
|     void write(float     data); | ||||
| }; | ||||
| 
 | ||||
| } /* namespace WEINBUS */ | ||||
| 
 | ||||
| #endif /* WEINBUS_WEINBUSTABLEREGISTER_H_ */ | ||||
| @ -1,25 +0,0 @@ | ||||
| /*
 | ||||
|  * WeinbusTableUnit.cpp | ||||
|  * | ||||
|  *      Author: Aleksey Gerasimenko | ||||
|  *      gerasimenko.aleksey.n@gmail.com | ||||
|  */ | ||||
| 
 | ||||
| #include "WEINBUS/WeinbusTableUnit.h" | ||||
| 
 | ||||
| namespace WEINBUS | ||||
| { | ||||
| //CONSTRUCTOR
 | ||||
| WeinbusTableUnit::WeinbusTableUnit(): | ||||
|         m_address(0), | ||||
|         m_param(0) | ||||
| {}//CONSTRUCTOR
 | ||||
| 
 | ||||
| 
 | ||||
| uint16_t WeinbusTableUnit::get_address() | ||||
| { | ||||
|     return m_address; | ||||
|     //
 | ||||
| }//
 | ||||
| 
 | ||||
| } /* namespace WEINBUS */ | ||||
| @ -1,32 +0,0 @@ | ||||
| /*
 | ||||
|  * WeinbusTableUnit.h | ||||
|  * | ||||
|  *      Author: Aleksey Gerasimenko | ||||
|  *      gerasimenko.aleksey.n@gmail.com | ||||
|  */ | ||||
| 
 | ||||
| #include <math.h> | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| #include "WEINBUS/WeinbusDefines.h" | ||||
| 
 | ||||
| #ifndef WEINBUS_WEINBUSTABLEUNIT_H_ | ||||
| #define WEINBUS_WEINBUSTABLEUNIT_H_ | ||||
| 
 | ||||
| namespace WEINBUS | ||||
| { | ||||
| 
 | ||||
| class WeinbusTableUnit | ||||
| { | ||||
| protected: | ||||
|     uint16_t    m_address; | ||||
|     void*       m_param; | ||||
| public: | ||||
|     WeinbusTableUnit(); | ||||
| public: | ||||
|     uint16_t    get_address(); | ||||
| }; | ||||
| 
 | ||||
| } /* namespace WEINBUS */ | ||||
| 
 | ||||
| #endif /* WEINBUS_WEINBUSTABLEUNIT_H_ */ | ||||
					Loading…
					
					
				
		Reference in New Issue