Erick / Mbed 2 deprecated ICE_BLE_TEST

Dependencies:   NaturalTinyShell_ice libmDot-12Sept mbed-rtos mbed

Fork of ICE by Erick

Revision:
190:af7ab603c9fe
Parent:
189:546b04f89b19
Child:
197:594afd088f32
--- a/src/ModbusMaster/ModbusMaster.cpp	Wed Oct 05 21:51:01 2016 +0000
+++ b/src/ModbusMaster/ModbusMaster.cpp	Thu Oct 06 15:24:10 2016 +0000
@@ -9,6 +9,7 @@
 #include "MTSLog.h"
 #include "BLEDataHandler.h"
 #include "ModbusMaster.h"
+#include "mod.h"
 #include "MbedJSONValue.h"
 
 DigitalOut dout1(PC_1);
@@ -32,9 +33,9 @@
     bool status;
     RegisterType_t regType;
 
-    modbus_init(MB_BAUD_RATE);
-    DigitalOut flu_power(PA_11);
-    flu_power = 0; // provide power to the modbus
+    mod_init();
+    DigitalOut mod_power(PA_11);
+    mod_power = 0; // provide power to the modbus
 
     while( true ) {
 
@@ -100,7 +101,7 @@
                 ModbusRegisterMap[id].rfreq = atoi(json_value["rfreq"].get<std::string>().c_str());
                 ModbusRegisterMap[id].regType = regType;
                 ModbusRegisterMap[id].simulated = false;
-                ModbusRegisterMap[id].valid = true;
+                ModbusRegisterMap[id].errflag = 0;
                 if( (regType == REG_TYPE_VINPUT) || (regType == REG_TYPE_VOUTPUT) ) {
                     ModbusRegisterMap[id].vcmd = json_value["vcmd"].get<std::string>().c_str();
                 }
@@ -143,32 +144,40 @@
                 }
 
                 if( iter->second.node != 0 ) {
-
+                    unsigned char rd_buf[10];
+                    memset( rd_buf, 0, 10 );
                     logInfo("Processing Input: tag=%s, node=%d, reg=%d, size=%d, order=%d", iter->first.c_str(), iter->second.node, iter->second.reg, iter->second.size, iter->second.order );
-                    SendModbusCommand(iter->second.node, iter->second.reg, iter->second.size);
-                    Thread::wait(30);
+                    int ret = mod_read(iter->second.node, iter->second.rtype, iter->second.reg, iter->second.size, rd_buf);
                     switch( iter->second.type ) {
                         case TYPE_32BIT_FLOAT:
                             float float_value;
-                            status = ReadModbus_32bit_float( &float_value, iter->second.order );
+                            if( ret != MOD_ERROR_NONE ) {
+                                ModbusRegisterMap[iter->first].errflag = ret;
+                                break;
+                            }
+                            status = ReadModbus_32bit_float( &float_value, iter->second.order, rd_buf );
                             if( status == true ) {
                                 ModbusRegisterMap[iter->first].float_value = float_value;
-                                ModbusRegisterMap[iter->first].valid = true;
+                                ModbusRegisterMap[iter->first].errflag = 0;
 //                                logInfo("Modbus Tag:%s value=%2.2f", iter->first.c_str(), float_value );
                             } else {
-                                ModbusRegisterMap[iter->first].valid = false;
+                                ModbusRegisterMap[iter->first].errflag = 1000;
 //                                logInfo("Modbus Read Failed, tag=%s", iter->first.c_str() );
                             }
                             break;
                         case TYPE_32BIT_INT:
                             int32_t int32_value;
-                            status = ReadModbus_32bit_int( &int32_value, iter->second.order );
+                            if( ret != MOD_ERROR_NONE ) {
+                                ModbusRegisterMap[iter->first].errflag = ret;
+                                break;
+                            }
+                            status = ReadModbus_32bit_int( &int32_value, iter->second.order, rd_buf );
                             if( status == true ) {
                                 ModbusRegisterMap[iter->first].float_value = int32_value;
-                                ModbusRegisterMap[iter->first].valid = true;
+                                ModbusRegisterMap[iter->first].errflag = 0;
                                 logInfo("Modbus Tag:%s value=%2.2f", iter->first.c_str(), ModbusRegisterMap[iter->first].float_value );
                             } else {
-                                ModbusRegisterMap[iter->first].valid = false;
+                                ModbusRegisterMap[iter->first].errflag = 1000;
                                 logInfo("Modbus Read Failed, tag=%s", iter->first.c_str() );
                             }
                             break;
@@ -266,119 +275,22 @@
     }
 }
 
-
-volatile char       modbus_buffer_char;
-volatile bool       modbus_interrupt_complete = false;
-
-uint8_t             modbus_input_buffer[SIZE_MB_BUFFER];// 1byte address + 1 byte function +1 byte number of regs + 12 bytes of data + 2 bytes for crc response frame from slave
-volatile uint8_t    modbus_input_buffer_counter = 0;
-
-//Frame crc calucation
-uint16_t modbus_crc(uint8_t* buf, int len)
-{
-    uint16_t crc = 0xFFFF;
-
-    for (int pos = 0; pos < len; pos++) {
-        crc ^= (uint16_t)buf[pos];          // XOR byte into least sig. byte of crc
-
-        for (int i = 8; i != 0; i--) {
-            // Loop over each bit
-            if ((crc & 0x0001) != 0) {
-                // If the LSB is set
-                crc >>= 1;                    // Shift right and XOR 0xA001
-                crc ^= 0xA001;
-            } else                          // Else LSB is not set
-                crc >>= 1;                    // Just shift right
-        }
-    }
-    // Note, this number has low and high bytes swapped, so use it accordingly (or swap bytes)
-    return crc;
-}
-
-RawSerial modbus(PA_2, PA_3);
-DigitalOut mod_de(PB_0);
-DigitalOut mod_re(PB_1);
-
-void modbus_init( uint16_t baudRate )
-{
-    modbus.baud(baudRate);
-    modbus.attach(&modbus_recv, RawSerial::RxIrq);
-}
-
-//call back when character goes into RX buffer for RS485 modbus
-void modbus_recv()
-{
-
-    if (modbus.readable()) {
-        modbus_buffer_char = modbus.getc();
-        if (modbus_input_buffer_counter == 0 && modbus_buffer_char == 0x00) {
-            modbus_input_buffer_counter = 0;
-        } else {
-            modbus_input_buffer[modbus_input_buffer_counter] = modbus_buffer_char;
-            modbus_input_buffer_counter++;
-        }
-    }
-
-    if (modbus_input_buffer_counter > modbus_input_buffer[2] + 4) {
-        modbus_interrupt_complete = true;
-        modbus_input_buffer_counter = 0;
-    }
-}
-
-// Read modbus master frame
-void SendModbusCommand(uint8_t slave_address, uint16_t firstReg, uint16_t noRegs)
-{
-    uint8_t L1V[8] = {slave_address, 0x04, 0x00, 0x02, 0x00, 0x02, 0xD1, 0x16};
-
-    L1V[2] = (firstReg >> 8) & 0xFF;
-    L1V[3] = firstReg & 0xFF;
-    L1V[4] = (noRegs >> 8) & 0xFF;
-    L1V[5] = noRegs & 0xFF;
-    L1V[6] = modbus_crc(L1V,6) & 0xFF;
-    L1V[7] = (modbus_crc(L1V,6)>>8) & 0xFF;
-
-    mod_de = 1;
-    mod_re = 1;
-    Thread::wait(1);
-    for (uint8_t i = 0; i < 8; i++)
-        modbus.putc(L1V[i]);
-
-    Thread::wait(2);
-    mod_de = 0;
-    mod_re = 0;
-
-}
-
-bool mbInterruptComplete()
-{
-    if (modbus_interrupt_complete) {
-        modbus_interrupt_complete = false;
-        return true;
-    } else {
-        return false;
-    }
-}
-
-bool ReadModbus_32bit_float( float *float_value, int order )
+bool ReadModbus_32bit_float( float *float_value, int order, unsigned char *rd_buf )
 {
     MR_REGISTER_32_BIT_FLOAT value;
 
-    if (mbInterruptComplete() != true ) {
-        return false;
-    }
-
     switch( order ) {
         case BigEndian:
-            value.b.lo_lo = modbus_input_buffer[6];
-            value.b.lo_hi = modbus_input_buffer[5];
-            value.b.hi_lo = modbus_input_buffer[4];
-            value.b.hi_hi = modbus_input_buffer[3];
+            value.b.lo_lo = rd_buf[3];
+            value.b.lo_hi = rd_buf[2];
+            value.b.hi_lo = rd_buf[1];
+            value.b.hi_hi = rd_buf[0];
             break;
         case BigEndianReverseWord:
-            value.b.lo_lo = modbus_input_buffer[4];
-            value.b.lo_hi = modbus_input_buffer[3];
-            value.b.hi_lo = modbus_input_buffer[6];
-            value.b.hi_hi = modbus_input_buffer[5];
+            value.b.lo_lo = rd_buf[1];
+            value.b.lo_hi = rd_buf[0];
+            value.b.hi_lo = rd_buf[3];
+            value.b.hi_hi = rd_buf[2];
             break;
         default:
             return false;
@@ -388,26 +300,22 @@
     return true;
 }
 
-bool ReadModbus_32bit_int( int32_t *int32_value, int order )
+bool ReadModbus_32bit_int( int32_t *int32_value, int order, unsigned char *rd_buf )
 {
     MR_REGISTER_32BIT_INT value;
 
-    if (mbInterruptComplete() != true ) {
-        return false;
-    }
-
     switch( order ) {
         case BigEndian:
-            value.b.lo_lo = modbus_input_buffer[6];
-            value.b.lo_hi = modbus_input_buffer[5];
-            value.b.hi_lo = modbus_input_buffer[4];
-            value.b.hi_hi = modbus_input_buffer[3];
+            value.b.lo_lo = rd_buf[3];
+            value.b.lo_hi = rd_buf[2];
+            value.b.hi_lo = rd_buf[1];
+            value.b.hi_hi = rd_buf[0];
             break;
         case BigEndianReverseWord:
-            value.b.lo_lo = modbus_input_buffer[4];
-            value.b.lo_hi = modbus_input_buffer[3];
-            value.b.hi_lo = modbus_input_buffer[6];
-            value.b.hi_hi = modbus_input_buffer[5];
+            value.b.lo_lo = rd_buf[1];
+            value.b.lo_hi = rd_buf[0];
+            value.b.hi_lo = rd_buf[3];
+            value.b.hi_hi = rd_buf[2];
             break;
         default:
             return false;