Changes to allow for SPI communication. MTS_SPI_Slave.cpp replaces MTSSerial.cpp. AT_SPI_Slave.ccp replaces ATSerial.cpp.

Dependencies:   MTS_SPI libmDot-dev-mbed5-deprecated

Fork of Dot-AT-Firmware by MultiTech

Committer:
ScottHoppeMultitech
Date:
Thu Dec 28 21:16:28 2017 +0000
Revision:
19:c37f04c52ccb
Parent:
18:adc82f3ebaf4
Changes to allow for SPI communication. MTS_SPI_Slave.cpp replaces MTSSerial.cpp. AT_SPI_Slave.ccp replaces ATSerial.cpp.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ScottHoppeMultitech 18:adc82f3ebaf4 1 #include "mbed.h"
ScottHoppeMultitech 18:adc82f3ebaf4 2 #include "AT_SPI_Slave.h"
ScottHoppeMultitech 18:adc82f3ebaf4 3 #include "MTSLog.h"
ScottHoppeMultitech 18:adc82f3ebaf4 4
ScottHoppeMultitech 18:adc82f3ebaf4 5 using namespace mts;
ScottHoppeMultitech 18:adc82f3ebaf4 6 Serial debug(USBTX, USBRX); //DEBUG
ScottHoppeMultitech 18:adc82f3ebaf4 7
ScottHoppeMultitech 18:adc82f3ebaf4 8 AT_SPI_Slave::AT_SPI_Slave(PinName mosi, PinName miso, PinName sclk, PinName ssel, int txBufferSize, int rxBufferSize)
ScottHoppeMultitech 18:adc82f3ebaf4 9 : MTS_SPI_Slave(mosi,miso,sclk,ssel,txBufferSize, rxBufferSize)
ScottHoppeMultitech 18:adc82f3ebaf4 10 , _spi(new SPISlave(mosi,miso,sclk,ssel))
ScottHoppeMultitech 18:adc82f3ebaf4 11 , _thread(new Thread),
ScottHoppeMultitech 18:adc82f3ebaf4 12
ScottHoppeMultitech 18:adc82f3ebaf4 13 _frequency(1000000),
ScottHoppeMultitech 18:adc82f3ebaf4 14 _format_bits(8),
ScottHoppeMultitech 18:adc82f3ebaf4 15 _format_mode(0),
ScottHoppeMultitech 18:adc82f3ebaf4 16 _stop_bits(1),
ScottHoppeMultitech 18:adc82f3ebaf4 17 _last_time(0),
ScottHoppeMultitech 18:adc82f3ebaf4 18 _esc_cnt(0),
ScottHoppeMultitech 18:adc82f3ebaf4 19 _esc_ch('+'),
ScottHoppeMultitech 18:adc82f3ebaf4 20 _escaped(false)
ScottHoppeMultitech 18:adc82f3ebaf4 21 {
ScottHoppeMultitech 18:adc82f3ebaf4 22 debug.baud(115200);
ScottHoppeMultitech 18:adc82f3ebaf4 23 _thread->start(this, &AT_SPI_Slave::polling_Read);
ScottHoppeMultitech 18:adc82f3ebaf4 24 timer.start();
ScottHoppeMultitech 18:adc82f3ebaf4 25 }
ScottHoppeMultitech 18:adc82f3ebaf4 26
ScottHoppeMultitech 18:adc82f3ebaf4 27 AT_SPI_Slave::~AT_SPI_Slave()
ScottHoppeMultitech 18:adc82f3ebaf4 28 {
ScottHoppeMultitech 18:adc82f3ebaf4 29 delete _spi;
ScottHoppeMultitech 18:adc82f3ebaf4 30 delete _thread;
ScottHoppeMultitech 18:adc82f3ebaf4 31 }
ScottHoppeMultitech 18:adc82f3ebaf4 32 void AT_SPI_Slave::polling_Read()
ScottHoppeMultitech 18:adc82f3ebaf4 33 {
ScottHoppeMultitech 18:adc82f3ebaf4 34 while(true){
ScottHoppeMultitech 18:adc82f3ebaf4 35 if(this->receive()){
ScottHoppeMultitech 18:adc82f3ebaf4 36 this->handleRead();
ScottHoppeMultitech 18:adc82f3ebaf4 37 }
ScottHoppeMultitech 18:adc82f3ebaf4 38 thread.wait(2000); // 2 micro seconds
ScottHoppeMultitech 18:adc82f3ebaf4 39 }
ScottHoppeMultitech 18:adc82f3ebaf4 40 }
ScottHoppeMultitech 18:adc82f3ebaf4 41
ScottHoppeMultitech 18:adc82f3ebaf4 42 void AT_SPI_Slave::frequency(int frequency)
ScottHoppeMultitech 18:adc82f3ebaf4 43 {
ScottHoppeMultitech 18:adc82f3ebaf4 44 _frequency = frequency;
ScottHoppeMultitech 18:adc82f3ebaf4 45 _spi->frequency(_frequency);
ScottHoppeMultitech 18:adc82f3ebaf4 46 }
ScottHoppeMultitech 18:adc82f3ebaf4 47
ScottHoppeMultitech 18:adc82f3ebaf4 48 void AT_SPI_Slave::format(int format_bits, int format_mode)
ScottHoppeMultitech 18:adc82f3ebaf4 49 {
ScottHoppeMultitech 18:adc82f3ebaf4 50 _format_bits = format_bits;
ScottHoppeMultitech 18:adc82f3ebaf4 51 _format_mode = format_mode;
ScottHoppeMultitech 18:adc82f3ebaf4 52 _spi->format(_format_bits,_format_mode);
ScottHoppeMultitech 18:adc82f3ebaf4 53 }
ScottHoppeMultitech 18:adc82f3ebaf4 54
ScottHoppeMultitech 18:adc82f3ebaf4 55 int AT_SPI_Slave::receive()
ScottHoppeMultitech 18:adc82f3ebaf4 56 {
ScottHoppeMultitech 18:adc82f3ebaf4 57 return _spi->receive();
ScottHoppeMultitech 18:adc82f3ebaf4 58 }
ScottHoppeMultitech 18:adc82f3ebaf4 59
ScottHoppeMultitech 18:adc82f3ebaf4 60 void AT_SPI_Slave::handleWrite()
ScottHoppeMultitech 18:adc82f3ebaf4 61 {
ScottHoppeMultitech 18:adc82f3ebaf4 62 while(txBuffer.size() != 0) {
ScottHoppeMultitech 18:adc82f3ebaf4 63 char byte;
ScottHoppeMultitech 18:adc82f3ebaf4 64 if(txBuffer.read(byte)==1){
ScottHoppeMultitech 18:adc82f3ebaf4 65 _spi->reply(byte);
ScottHoppeMultitech 18:adc82f3ebaf4 66 }
ScottHoppeMultitech 18:adc82f3ebaf4 67 else{
ScottHoppeMultitech 18:adc82f3ebaf4 68 return;
ScottHoppeMultitech 18:adc82f3ebaf4 69 }
ScottHoppeMultitech 18:adc82f3ebaf4 70 }
ScottHoppeMultitech 18:adc82f3ebaf4 71 }
ScottHoppeMultitech 18:adc82f3ebaf4 72
ScottHoppeMultitech 18:adc82f3ebaf4 73 bool AT_SPI_Slave::escaped() {
ScottHoppeMultitech 18:adc82f3ebaf4 74
ScottHoppeMultitech 18:adc82f3ebaf4 75 int now = timer.read_ms();
ScottHoppeMultitech 18:adc82f3ebaf4 76
ScottHoppeMultitech 18:adc82f3ebaf4 77 // Have we seen three esc chars and 1 sec end guard has passed
ScottHoppeMultitech 18:adc82f3ebaf4 78 if (_escaped || (_esc_cnt == 3 && (now - _last_time > 1000))) {
ScottHoppeMultitech 18:adc82f3ebaf4 79 _escaped = true;
ScottHoppeMultitech 18:adc82f3ebaf4 80 return true;
ScottHoppeMultitech 18:adc82f3ebaf4 81
ScottHoppeMultitech 18:adc82f3ebaf4 82 // Have we seen a couple esc chars but nothing in 500 ms
ScottHoppeMultitech 18:adc82f3ebaf4 83 } else if (_esc_cnt > 0 && _esc_cnt != 3 && now - _last_time > 500) {
ScottHoppeMultitech 18:adc82f3ebaf4 84 // Write seen esc chars
ScottHoppeMultitech 18:adc82f3ebaf4 85 while (_esc_cnt) {
ScottHoppeMultitech 18:adc82f3ebaf4 86 rxBuffer.write(_esc_ch);
ScottHoppeMultitech 18:adc82f3ebaf4 87 _esc_cnt--;
ScottHoppeMultitech 18:adc82f3ebaf4 88 }
ScottHoppeMultitech 18:adc82f3ebaf4 89 }
ScottHoppeMultitech 18:adc82f3ebaf4 90
ScottHoppeMultitech 18:adc82f3ebaf4 91 return false;
ScottHoppeMultitech 18:adc82f3ebaf4 92 }
ScottHoppeMultitech 18:adc82f3ebaf4 93
ScottHoppeMultitech 18:adc82f3ebaf4 94 void AT_SPI_Slave::clearEscaped() {
ScottHoppeMultitech 18:adc82f3ebaf4 95 _esc_cnt = 0;
ScottHoppeMultitech 18:adc82f3ebaf4 96 _escaped = false;
ScottHoppeMultitech 18:adc82f3ebaf4 97 }
ScottHoppeMultitech 18:adc82f3ebaf4 98
ScottHoppeMultitech 18:adc82f3ebaf4 99 void AT_SPI_Slave::handleRead()
ScottHoppeMultitech 18:adc82f3ebaf4 100 {
ScottHoppeMultitech 18:adc82f3ebaf4 101
ScottHoppeMultitech 18:adc82f3ebaf4 102 char byte = _spi->read();
ScottHoppeMultitech 18:adc82f3ebaf4 103 debug.printf("Cur char: %c\n\r",byte);
ScottHoppeMultitech 18:adc82f3ebaf4 104 int now = timer.read_ms();
ScottHoppeMultitech 18:adc82f3ebaf4 105
ScottHoppeMultitech 18:adc82f3ebaf4 106 // Have we seen 3 esc chars but this char is before 1 sec end guard time
ScottHoppeMultitech 18:adc82f3ebaf4 107 if (_esc_cnt == 3 && (now - _last_time < 1000)) {
ScottHoppeMultitech 18:adc82f3ebaf4 108 debug.printf("1");
ScottHoppeMultitech 18:adc82f3ebaf4 109 // Write the three chars we held back
ScottHoppeMultitech 18:adc82f3ebaf4 110 while (_esc_cnt) {
ScottHoppeMultitech 18:adc82f3ebaf4 111 rxBuffer.write(_esc_ch);
ScottHoppeMultitech 18:adc82f3ebaf4 112 _esc_cnt--;
ScottHoppeMultitech 18:adc82f3ebaf4 113 }
ScottHoppeMultitech 18:adc82f3ebaf4 114 } else if (byte == _esc_ch) {
ScottHoppeMultitech 18:adc82f3ebaf4 115 debug.printf("2");
ScottHoppeMultitech 18:adc82f3ebaf4 116 // Has 1 second passed before last char
ScottHoppeMultitech 18:adc82f3ebaf4 117 if (now - _last_time > 1000) {
ScottHoppeMultitech 18:adc82f3ebaf4 118 _esc_cnt = 1;
ScottHoppeMultitech 18:adc82f3ebaf4 119 // Is this second or third esc char
ScottHoppeMultitech 18:adc82f3ebaf4 120 } else if (_esc_cnt > 0 && _esc_cnt < 3) {
ScottHoppeMultitech 18:adc82f3ebaf4 121 _esc_cnt++;
ScottHoppeMultitech 18:adc82f3ebaf4 122 }
ScottHoppeMultitech 18:adc82f3ebaf4 123 } else if (_esc_cnt > 0) {
ScottHoppeMultitech 18:adc82f3ebaf4 124 debug.printf("3");
ScottHoppeMultitech 18:adc82f3ebaf4 125 // Write any esc chars held back
ScottHoppeMultitech 18:adc82f3ebaf4 126 while (_esc_cnt) {
ScottHoppeMultitech 18:adc82f3ebaf4 127 rxBuffer.write(_esc_ch);
ScottHoppeMultitech 18:adc82f3ebaf4 128 _esc_cnt--;
ScottHoppeMultitech 18:adc82f3ebaf4 129 }
ScottHoppeMultitech 18:adc82f3ebaf4 130 }
ScottHoppeMultitech 18:adc82f3ebaf4 131
ScottHoppeMultitech 18:adc82f3ebaf4 132 if(_esc_cnt == 0 && rxBuffer.write(byte) != 1) {
ScottHoppeMultitech 18:adc82f3ebaf4 133 logError("Serial Rx Byte Dropped [%c][0x%02X]", byte, byte);
ScottHoppeMultitech 18:adc82f3ebaf4 134 }
ScottHoppeMultitech 18:adc82f3ebaf4 135
ScottHoppeMultitech 18:adc82f3ebaf4 136 _last_time = timer.read_ms();
ScottHoppeMultitech 18:adc82f3ebaf4 137 }
ScottHoppeMultitech 18:adc82f3ebaf4 138
ScottHoppeMultitech 18:adc82f3ebaf4 139 void AT_SPI_Slave::escapeChar(char esc) {
ScottHoppeMultitech 18:adc82f3ebaf4 140 _esc_ch = esc;
ScottHoppeMultitech 18:adc82f3ebaf4 141 }
ScottHoppeMultitech 18:adc82f3ebaf4 142
ScottHoppeMultitech 18:adc82f3ebaf4 143 char AT_SPI_Slave::escapeChar() {
ScottHoppeMultitech 18:adc82f3ebaf4 144 return _esc_ch;
ScottHoppeMultitech 18:adc82f3ebaf4 145 }