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
AT_SPI_Slave.cpp@19:c37f04c52ccb, 2017-12-28 (annotated)
- 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?
User | Revision | Line number | New 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 | } |