Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: ICE-Application/src/Drivers/mod.cpp
- Revision:
- 2:02cb20446785
- Parent:
- 1:b2e90cda7a5a
diff -r b2e90cda7a5a -r 02cb20446785 ICE-Application/src/Drivers/mod.cpp
--- a/ICE-Application/src/Drivers/mod.cpp Tue Jan 24 19:06:45 2017 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,516 +0,0 @@
-// modbus
-// ---------------------------------------------------------------------------------------------------------------------
-// includes
-
-#include "mbed.h"
-#include "global.h"
-#include "mod.h"
-
-// ---------------------------------------------------------------------------------------------------------------------
-// globals
-
-unsigned short int mod_data[MOD_DATA];
-unsigned short int mod_ireg[MOD_IREG];
-
-int mod_verbose = 0;
-
-// -------------------------------------------------------------------------------------------------
-// modbus buffers
-
-#define MOD_RXNUM 200
-#define MOD_TXNUM 200
-
-int mod_rxnum = 0;
-int mod_txnum = 0;
-
-unsigned char mod_rxbuf[MOD_RXNUM];
-unsigned char mod_txbuf[MOD_TXNUM];
-
-// -------------------------------------------------------------------------------------------------
-// print functions
-
-void print_uc(char hex, char bin, char dec, char* pre, unsigned char input, char* post)
-{
- if(pre[0] != 0) printf("%s", pre);
-
- if(hex)
- {
- printf("0x%02X", input);
- }
- if(bin)
- {
- if(hex) printf(" ");
- for(int i=7; i>=0; i--)
- {
- if(i<7 && (i%4)==3) printf(" "); if(input & (1<<i)) printf("1"); else printf("0");
- }
- }
- if(dec)
- {
- if(hex || bin) printf(" "); printf("%u", input);
- }
- if(post[0] != 0) printf("%s", post);
-}
-
-
-void print_us(char hex, char bin, char dec, char* pre, unsigned short int input, char* post)
-{
- if(pre[0] != 0) printf("%s", pre);
-
- if(hex)
- {
- printf("0x%04X", input);
- }
- if(bin)
- {
- if(hex) printf(" ");
- for(int i=15; i>=0; i--)
- {
- if(i<15 && (i%4)==3) printf(" "); if(input & (1<<i)) printf("1"); else printf("0");
- }
- }
- if(dec)
- {
- if(hex || bin) printf(" "); printf("%u", input);
- }
- if(post[0] != 0) printf("%s", post);
-}
-
-// -------------------------------------------------------------------------------------------------
-// initialization
-
-RawSerial mod(PC_6, PC_7);
-
-DigitalOut mod_de(PC_8);
-DigitalOut mod_re(PC_9);
-
-void mod_init(void)
-{
- mod_de = 0;
- mod_re = 0;
-
- mod.baud(MOD_BAUD);
- mod.attach(&mod_process, RawSerial::RxIrq);
-
- for(int i=0; i<MOD_IREG; i++) mod_ireg[i] = 0;
-}
-
-// -------------------------------------------------------------------------------------------------
-// utilities
-
-void mod_clear(void)
-{
- mod_rxnum = 0; for(int i=0; i<MOD_RXNUM; i++) mod_rxbuf[i] = 0;
- mod_txnum = 0; for(int i=0; i<MOD_TXNUM; i++) mod_txbuf[i] = 0;
-}
-
-unsigned short int mod_calc_crc(unsigned char *buffer, int length)
-{
- unsigned short int temp=0xFFFF, flag;
-
- for(int i=0; i<length; i++)
- {
- temp = temp ^ buffer[i];
-
- for(int j=1; j<=8; j++)
- {
- flag = temp & 0x0001;
- temp = temp >> 1;
- if(flag) temp = temp ^ 0xA001;
- }
- }
-
- return(temp);
-}
-
-void mod_ireg_dump(void)
-{
- for(int i=0; i<MOD_IREG; i++)
- {
- printf(" I%02d = ", i);
- print_us(1,0,1, "", mod_ireg[i], "\r\n");
- }
-}
-
-// ---------------------------------------------------------------------------------------------------------------------
-// process received data
-
-void mod_process(void)
-{
- if(mod.readable())
- {
- if(mod_rxnum < MOD_RXNUM)
- {
- mod_rxbuf[mod_rxnum++] = mod.getc();
- }
- else
- {
- if(mod_verbose) printf(" [mod_process] buffer full\r\n");
- mod_clear();
- }
- }
-}
-
-// ---------------------------------------------------------------------------------------------------------------------
-// MOD_FUNC_GET_IREG (NBYT = total bytes of data transmitted)
-// MOD_FUNC_GET_HREG
-//
-// byte: 0 1 2 3 4 5 6 7
-// received: ADDR FUNC SREG-H SREG-L NREG-H NREG-L RCRC-L RCRC-H
-// transmit: ADDR FUNC NBYT DATA-H DATA-L TCRC-L TCRC-H NULL
-
-int mod_read(int inp_addr, int inp_func, int inp_sreg, int inp_nreg, unsigned char *rd_buf)
-{
- int mod_error = 0;
-
- unsigned char tx_addr = inp_addr;
- unsigned char tx_func = inp_func;
- WORD2BYTE tx_sreg; tx_sreg.value = inp_sreg;
- if(inp_nreg < 1) inp_nreg = 1;
- WORD2BYTE tx_nreg; tx_nreg.value = inp_nreg;
-
-// fill transmit buffer
-
- mod_clear();
-
- mod_txbuf[mod_txnum++] = tx_addr;
- mod_txbuf[mod_txnum++] = tx_func;
- mod_txbuf[mod_txnum++] = tx_sreg.byte1;
- mod_txbuf[mod_txnum++] = tx_sreg.byte0;
- mod_txbuf[mod_txnum++] = tx_nreg.byte1;
- mod_txbuf[mod_txnum++] = tx_nreg.byte0;
-
- WORD2BYTE tx_crc; tx_crc.value = mod_calc_crc(mod_txbuf, mod_txnum);
- mod_txbuf[mod_txnum++] = tx_crc.byte0;
- mod_txbuf[mod_txnum++] = tx_crc.byte1;
-
-// transmit
-
- mod_de = 1;
- mod_re = 1;
- wait_ms(1);
- for(int i=0; i<mod_txnum; i++) mod.putc(mod_txbuf[i]);
- wait_ms(2);
- mod_de = 0;
- mod_re = 0;
-
- wait_ms(30);
-
-// output transmit buffer
-
- if(mod_verbose)
- {
- printf(" mod_txbuf: %d\r\n\r\n", mod_txnum);
- for(int i=0; i<mod_txnum; i++)
- {
- printf(" %02d", i); print_uc(1,0,1, " = ", mod_txbuf[i], "\r\n");
- }
- if(mod_txnum)
- {
- printf("\r\n");
- print_uc(1,0,1, " addr = ", tx_addr, "\r\n");
- print_uc(1,0,1, " func = ", tx_func, "\r\n");
- print_us(1,0,1, " sreg = ", tx_sreg.value, "\r\n");
- print_us(1,0,1, " nreg = ", tx_nreg.value, "\r\n");
- print_us(1,0,1, " tcrc = ", tx_crc.value, "\r\n");
- }
- }
-
-// process received buffer
-
- if(mod_verbose)
- {
- printf("\r\n mod_rxbuf: %d\r\n\r\n", mod_rxnum);
- for(int i=0; i<mod_rxnum; i++)
- {
- printf(" %02d", i); print_uc(1,0,1, " = ", mod_rxbuf[i], "\r\n");
- }
- }
- if(mod_rxnum)
- {
- int rxnum = 0;
- unsigned char rx_addr = mod_rxbuf[rxnum++];
- unsigned char rx_func = mod_rxbuf[rxnum++];
-
- if(mod_verbose)
- {
- print_uc(1,0,1, "\r\n addr = ", rx_addr, "\r\n");
- print_uc(1,0,1, " func = ", rx_func, "");
- }
- if(rx_func == tx_func)
- {
- int rd_buf_index = 0;
- unsigned char rx_nbyt = mod_rxbuf[rxnum++];
-
- if(mod_verbose) print_uc(1,0,1, "\r\n nbyt = ", rx_nbyt, "\r\n\r\n");
-
- for(int i=0; i<rx_nbyt/2; i++)
- {
- WORD2BYTE rx_data;
- rd_buf[rd_buf_index++] = rx_data.byte1 = mod_rxbuf[rxnum++];
- rd_buf[rd_buf_index++] = rx_data.byte0 = mod_rxbuf[rxnum++];
-
- int ireg = tx_sreg.value + i;
-
- if(ireg < MOD_IREG) mod_ireg[ireg] = rx_data.value;
-
- if(mod_verbose)
- {
- printf(" data(%03d)", ireg);
- print_us(1,0,1, " = ", rx_data.value, "\r\n");
- }
- }
- WORD2BYTE rx_crc;
- rx_crc.byte0 = mod_rxbuf[rxnum++];
- rx_crc.byte1 = mod_rxbuf[rxnum++];
-
- if(mod_verbose) print_us(1,0,1, "\r\n rcrc = ", rx_crc.value, "\r\n");
- }
- else
- {
- unsigned char rx_nerr = mod_rxbuf[rxnum++]; mod_error = rx_nerr;
-
- if(mod_verbose)
- {
- if(rx_func == tx_func+0x80) printf(" (func %d error)\r\n", tx_func);
- else printf(" (unknown func error)\r\n");
- print_uc(1,0,1, " nerr = ", rx_nerr, " (");
-
- switch(rx_nerr)
- {
- case MOD_ERROR_ILL_FUNC: ; printf("slave received illegal function code") ; break;
- case MOD_ERROR_ILL_ADDR: ; printf("slave received illegal register address") ; break;
- case MOD_ERROR_ILL_DATA: ; printf("slave received illegal register value") ; break;
- case MOD_ERROR_SLAVE_FAIL: ; printf("slave device-specific failure") ; break;
- case MOD_ERROR_SLAVE_ACK: ; printf("slave ACK") ; break;
- case MOD_ERROR_SLAVE_BUSY: ; printf("slave is busy") ; break;
- case MOD_ERROR_SLAVE_NACK: ; printf("slave NACK") ; break;
- case MOD_ERROR_SLAVE_PARITY: ; printf("slave memory parity error") ; break;
- case MOD_ERROR_RX_TIMEOUT: ; printf("master receive timeout") ; break;
- case MOD_ERROR_TX_TIMEOUT: ; printf("master transmit timeout") ; break;
- case MOD_ERROR_CRC: ; printf("master CRC error") ; break;
- default: ; printf("unknown error") ; break;
- }
- printf(")\r\n");
- }
-
- WORD2BYTE rx_crc;
- rx_crc.byte0 = mod_rxbuf[rxnum++];
- rx_crc.byte1 = mod_rxbuf[rxnum++];
-
- if(mod_verbose) print_us(1,0,1, " rcrc = ", rx_crc.value, "\r\n");
- }
- }
- else
- {
- mod_error = MOD_ERROR_RX_TIMEOUT; // no received data
- }
-
- if(mod_verbose) printf("\r\n mod_error: %d\r\n", mod_error);
-
- return(mod_error);
-}
-
-// ---------------------------------------------------------------------------------------------------------------------
-// MOD_FUNC_SET_HREG
-//
-// byte: 0 1 2 3 4 5 6 7 8
-// received: ADDR FUNC SREG-H SREG-L DATA-H DATA-L RCRC-L RCRC-H
-// transmit: ADDR FUNC SREG-H SREG-L DATA-H DATA-L TCRC-L TCRC-H NULL
-//
-// MOD_FUNC_SET_HREGS
-//
-// byte: 0 1 2 3 4 5 6 7 8 9 10
-// received: ADDR FUNC SREG-H SREG-L NREG-H NREG-L NBYT DATA-H DATA-L RCRC-L RCRC-H
-// transmit: ADDR FUNC SREG-H SREG-L NREG-H NREG-L TCRC-L TCRC-H NULL
-//
-int mod_write(int inp_addr, int inp_func, int inp_sreg, int inp_nreg, unsigned char *xmt_data)
-{
- int mod_error = 0;
-
- unsigned char tx_addr = inp_addr;
- unsigned char tx_func = inp_func;
- WORD2BYTE tx_sreg; tx_sreg.value = inp_sreg;
- WORD2BYTE tx_nreg; tx_nreg.value = inp_nreg;
- WORD2BYTE data;
- unsigned char nbyt = 2*inp_nreg;
-
-// fill transmit buffer
-
- mod_clear();
-
- mod_txbuf[mod_txnum++] = tx_addr;
- mod_txbuf[mod_txnum++] = tx_func;
- mod_txbuf[mod_txnum++] = tx_sreg.byte1;
- mod_txbuf[mod_txnum++] = tx_sreg.byte0;
-
- if(tx_func == MOD_FUNC_SET_HREG)
- {
-// data.value = xmt_data[0];
-// mod_txbuf[mod_txnum++] = data.byte1;
-// mod_txbuf[mod_txnum++] = data.byte0;
- mod_txbuf[mod_txnum++] = xmt_data[0];
- mod_txbuf[mod_txnum++] = xmt_data[1];
- }
- else
- {
- mod_txbuf[mod_txnum++] = tx_nreg.byte1;
- mod_txbuf[mod_txnum++] = tx_nreg.byte0;
- mod_txbuf[mod_txnum++] = nbyt;
- for(int i=0,i2=0; i<inp_nreg; i++)
- {
- // data.value = xmt_data[i];
- // mod_txbuf[mod_txnum++] = data.byte1;
- // mod_txbuf[mod_txnum++] = data.byte0;
- mod_txbuf[mod_txnum++] = xmt_data[i2];
- mod_txbuf[mod_txnum++] = xmt_data[(i2+1)];
- i2=i2+2;
- }
- }
-
- WORD2BYTE tx_crc; tx_crc.value = mod_calc_crc(mod_txbuf, mod_txnum);
- mod_txbuf[mod_txnum++] = tx_crc.byte0;
- mod_txbuf[mod_txnum++] = tx_crc.byte1;
-
-// transmit
-
- mod_de = 1;
- mod_re = 1;
- wait_ms(1);
- for(int i=0; i<mod_txnum; i++) mod.putc(mod_txbuf[i]);
- wait_ms(2);
- mod_de = 0;
- mod_re = 0;
-
- wait_ms(30);
-
-// output transmit buffer
-
- if(mod_verbose)
- {
- printf(" mod_txbuf: %d\r\n\r\n", mod_txnum);
- for(int i=0; i<mod_txnum; i++)
- {
- printf(" %02d", i); print_uc(1,0,1, " = ", mod_txbuf[i], "\r\n");
- }
-
- if(mod_txnum)
- {
- print_uc(1,0,1, "\r\n addr = ", tx_addr, "\r\n");
- print_uc(1,0,1, " func = ", tx_func, "\r\n");
- print_us(1,0,1, " sreg = ", tx_sreg.value, "\r\n");
-
- if(tx_func == MOD_FUNC_SET_HREG)
- {
- data.value = xmt_data[0];
- print_us(1,0,1, " data = ", data.value, "\r\n");
- }
- else
- {
- print_us(1,0,1, " nreg = ", tx_nreg.value, "\r\n");
- print_uc(1,0,1, " nbyt = ", nbyt, "\r\n\r\n");
-
- for(int i=0; i<inp_nreg; i++)
- {
- printf(" data(%03d)", tx_sreg.value+i);
- data.value = xmt_data[i];
- print_us(1,0,1, " = ", data.value, "\r\n");
- }
- }
- print_us(1,0,1, " tcrc = ", tx_crc.value, "\r\n");
- }
- }
-
-// process received buffer
-
- if(mod_verbose)
- {
- printf("\r\n mod_rxbuf: %d\r\n\r\n", mod_rxnum);
- for(int i=0; i<mod_rxnum; i++)
- {
- printf(" %02d", i); print_uc(1,0,1, " = ", mod_rxbuf[i], "\r\n");
- }
- }
- if(mod_rxnum)
- {
- int rxnum = 0;
- unsigned char rx_addr = mod_rxbuf[rxnum++];
- unsigned char rx_func = mod_rxbuf[rxnum++];
-
- if(mod_verbose)
- {
- print_uc(1,0,1, "\r\n addr = ", rx_addr, "\r\n");
- print_uc(1,0,1, " func = ", rx_func, "");
- }
-
- if(rx_func == tx_func)
- {
- WORD2BYTE rx_sreg;
- rx_sreg.byte1 = mod_rxbuf[rxnum++];
- rx_sreg.byte0 = mod_rxbuf[rxnum++];
-
- WORD2BYTE rx_nreg;
- rx_nreg.byte1 = mod_rxbuf[rxnum++];
- rx_nreg.byte0 = mod_rxbuf[rxnum++];
-
- WORD2BYTE rx_crc;
- rx_crc.byte0 = mod_rxbuf[rxnum++];
- rx_crc.byte1 = mod_rxbuf[rxnum++];
-
- if(mod_verbose)
- {
- print_us(1,0,1, "\r\n sreg = ", rx_sreg.value, "\r\n");
- print_us(1,0,1, " nreg = ", rx_nreg.value, "\r\n");
- print_us(1,0,1, " rcrc = ", rx_crc.value, "\r\n");
- }
- }
- else
- {
- unsigned char rx_nerr = mod_rxbuf[rxnum++]; mod_error = rx_nerr;
-
- if(mod_verbose)
- {
- if(rx_func == tx_func+0x80) printf(" (func %d error)\r\n", tx_func);
- else printf(" (unknown func error)\r\n");
-
- print_uc(1,0,1, " nerr = ", rx_nerr, " (");
-
- switch(rx_nerr)
- {
- case MOD_ERROR_ILL_FUNC: ; printf("slave received illegal function code") ; break;
- case MOD_ERROR_ILL_ADDR: ; printf("slave received illegal register address") ; break;
- case MOD_ERROR_ILL_DATA: ; printf("slave received illegal register value") ; break;
- case MOD_ERROR_SLAVE_FAIL: ; printf("slave device-specific failure") ; break;
- case MOD_ERROR_SLAVE_ACK: ; printf("slave ACK") ; break;
- case MOD_ERROR_SLAVE_BUSY: ; printf("slave is busy") ; break;
- case MOD_ERROR_SLAVE_NACK: ; printf("slave NACK") ; break;
- case MOD_ERROR_SLAVE_PARITY: ; printf("slave memory parity error") ; break;
- case MOD_ERROR_RX_TIMEOUT: ; printf("master receive timeout") ; break;
- case MOD_ERROR_TX_TIMEOUT: ; printf("master transmit timeout") ; break;
- case MOD_ERROR_CRC: ; printf("master CRC error") ; break;
- default: ; printf("unknown error") ; break;
- }
- printf(")\r\n");
- }
-
- WORD2BYTE rx_crc;
- rx_crc.byte0 = mod_rxbuf[rxnum++];
- rx_crc.byte1 = mod_rxbuf[rxnum++];
-
- if(mod_verbose) print_us(1,0,1, " rcrc = ", rx_crc.value, "\r\n");
- }
- }
- else
- {
- mod_error = MOD_ERROR_RX_TIMEOUT; // no received data
- }
-
- if(mod_verbose) printf("\r\n mod_error: %d\r\n", mod_error);
-
- return(mod_error);
-}
-
-// ---------------------------------------------------------------------------------------------------------------------
-
-
-