![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
LPC824
Fork of CubeFine by
Microduino_Protocol_HardSer.cpp@0:362c1482232c, 2016-06-02 (annotated)
- Committer:
- lixianyu
- Date:
- Thu Jun 02 04:03:31 2016 +0000
- Revision:
- 0:362c1482232c
- Child:
- 2:7964622fb5a5
work fine.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
lixianyu | 0:362c1482232c | 1 | #include "Microduino_Protocol_HardSer.h" |
lixianyu | 0:362c1482232c | 2 | #include "MicroduinoPinNames.h" |
lixianyu | 0:362c1482232c | 3 | //Timer _timer; |
lixianyu | 0:362c1482232c | 4 | extern Timer g_cubeTimer; |
lixianyu | 0:362c1482232c | 5 | //DigitalOut myled(D13); |
lixianyu | 0:362c1482232c | 6 | uint8_t getChecksum(uint8_t length, uint8_t cmd, uint8_t mydata[]) |
lixianyu | 0:362c1482232c | 7 | { |
lixianyu | 0:362c1482232c | 8 | //三个参数分别为: 数据长度 , 指令代码 , 实际数据数组 |
lixianyu | 0:362c1482232c | 9 | uint8_t checksum = 0; |
lixianyu | 0:362c1482232c | 10 | checksum ^= (length & 0xFF); |
lixianyu | 0:362c1482232c | 11 | checksum ^= (cmd & 0xFF); |
lixianyu | 0:362c1482232c | 12 | for (int i = 0; i < length; i++) checksum ^= (mydata[i] & 0xFF); |
lixianyu | 0:362c1482232c | 13 | return checksum; |
lixianyu | 0:362c1482232c | 14 | } |
lixianyu | 0:362c1482232c | 15 | |
lixianyu | 0:362c1482232c | 16 | /* Protocol::Protocol(PRO_PORT *ser , byte _channel) { |
lixianyu | 0:362c1482232c | 17 | // common_init(); // Set everything to common state, then... |
lixianyu | 0:362c1482232c | 18 | this->channel = _channel; |
lixianyu | 0:362c1482232c | 19 | this->num = 0; |
lixianyu | 0:362c1482232c | 20 | this->sta = false; |
lixianyu | 0:362c1482232c | 21 | this->error = false; |
lixianyu | 0:362c1482232c | 22 | P_Serial = ser; // ...override P_Serial with value passed. |
lixianyu | 0:362c1482232c | 23 | } */ |
lixianyu | 0:362c1482232c | 24 | static void uart_callback(void) |
lixianyu | 0:362c1482232c | 25 | { |
lixianyu | 0:362c1482232c | 26 | //myled = !myled; |
lixianyu | 0:362c1482232c | 27 | } |
lixianyu | 0:362c1482232c | 28 | void Protocol::begin(uint16_t _baud) |
lixianyu | 0:362c1482232c | 29 | { |
lixianyu | 0:362c1482232c | 30 | //myled = 0; |
lixianyu | 0:362c1482232c | 31 | //_timer.start(); |
lixianyu | 0:362c1482232c | 32 | //P_Serial->begin(_baud); |
lixianyu | 0:362c1482232c | 33 | P_Serial->baud(_baud); |
lixianyu | 0:362c1482232c | 34 | //P_Serial->attach(uart_callback, Serial::RxIrq); |
lixianyu | 0:362c1482232c | 35 | //delay(20); |
lixianyu | 0:362c1482232c | 36 | //wait_ms(20); |
lixianyu | 0:362c1482232c | 37 | } |
lixianyu | 0:362c1482232c | 38 | |
lixianyu | 0:362c1482232c | 39 | bool Protocol::available(bool _sta) |
lixianyu | 0:362c1482232c | 40 | { |
lixianyu | 0:362c1482232c | 41 | //if (P_Serial->available() > 0) { |
lixianyu | 0:362c1482232c | 42 | if (P_Serial->readable() > 0) { |
lixianyu | 0:362c1482232c | 43 | if (_sta) { |
lixianyu | 0:362c1482232c | 44 | this->inCache = this->inChar; |
lixianyu | 0:362c1482232c | 45 | //this->inChar = P_Serial->read(); |
lixianyu | 0:362c1482232c | 46 | this->inChar = P_Serial->getc(); |
lixianyu | 0:362c1482232c | 47 | this->buffer[num] = this->inChar; |
lixianyu | 0:362c1482232c | 48 | |
lixianyu | 0:362c1482232c | 49 | if (this->num > BUFFER_MAX - 1) { |
lixianyu | 0:362c1482232c | 50 | this->num = 0; |
lixianyu | 0:362c1482232c | 51 | return false; |
lixianyu | 0:362c1482232c | 52 | } else { |
lixianyu | 0:362c1482232c | 53 | this->num++; |
lixianyu | 0:362c1482232c | 54 | } |
lixianyu | 0:362c1482232c | 55 | } |
lixianyu | 0:362c1482232c | 56 | return true; |
lixianyu | 0:362c1482232c | 57 | } |
lixianyu | 0:362c1482232c | 58 | return false; |
lixianyu | 0:362c1482232c | 59 | } |
lixianyu | 0:362c1482232c | 60 | |
lixianyu | 0:362c1482232c | 61 | uint8_t Protocol::parse(uint16_t* _data, bool _mod) |
lixianyu | 0:362c1482232c | 62 | { |
lixianyu | 0:362c1482232c | 63 | if (available(!_mod)) { |
lixianyu | 0:362c1482232c | 64 | //time = millis(); |
lixianyu | 0:362c1482232c | 65 | //time = _timer.read_ms(); |
lixianyu | 0:362c1482232c | 66 | time = g_cubeTimer.read_ms(); |
lixianyu | 0:362c1482232c | 67 | do { |
lixianyu | 0:362c1482232c | 68 | if (this->sta) { |
lixianyu | 0:362c1482232c | 69 | this->sta = false; |
lixianyu | 0:362c1482232c | 70 | this->num = 0; |
lixianyu | 0:362c1482232c | 71 | if (this->inChar == this->channel) { |
lixianyu | 0:362c1482232c | 72 | this->error = false; |
lixianyu | 0:362c1482232c | 73 | if (!_mod) { |
lixianyu | 0:362c1482232c | 74 | return P_BUSY; |
lixianyu | 0:362c1482232c | 75 | } |
lixianyu | 0:362c1482232c | 76 | } else { |
lixianyu | 0:362c1482232c | 77 | this->error = true; |
lixianyu | 0:362c1482232c | 78 | return P_ERROR; |
lixianyu | 0:362c1482232c | 79 | } |
lixianyu | 0:362c1482232c | 80 | } |
lixianyu | 0:362c1482232c | 81 | |
lixianyu | 0:362c1482232c | 82 | if (this->inChar == 0xBB && this->inCache == 0xAA) { |
lixianyu | 0:362c1482232c | 83 | this->sta = true; |
lixianyu | 0:362c1482232c | 84 | if (!_mod) { |
lixianyu | 0:362c1482232c | 85 | return P_BUSY; |
lixianyu | 0:362c1482232c | 86 | } |
lixianyu | 0:362c1482232c | 87 | } |
lixianyu | 0:362c1482232c | 88 | |
lixianyu | 0:362c1482232c | 89 | if (this->num == (CHANNEL_NUM * 2 + 1) && !this->error) { |
lixianyu | 0:362c1482232c | 90 | this->inCache = this->buffer[CHANNEL_NUM * 2]; |
lixianyu | 0:362c1482232c | 91 | this->buffer[CHANNEL_NUM * 2] = NULL; |
lixianyu | 0:362c1482232c | 92 | this->inChar = getChecksum(CHANNEL_NUM * 2, 200, this->buffer); |
lixianyu | 0:362c1482232c | 93 | |
lixianyu | 0:362c1482232c | 94 | this->num = 0; |
lixianyu | 0:362c1482232c | 95 | if (!this->error && this->inCache == this->inChar) { |
lixianyu | 0:362c1482232c | 96 | for (uint8_t a = 0; a < CHANNEL_NUM; a++) { |
lixianyu | 0:362c1482232c | 97 | _data[a] = ((uint16_t)(this->buffer[a * 2])) | ((uint16_t)this->buffer[a * 2 + 1] << 8); |
lixianyu | 0:362c1482232c | 98 | } |
lixianyu | 0:362c1482232c | 99 | return P_FINE; |
lixianyu | 0:362c1482232c | 100 | } else { |
lixianyu | 0:362c1482232c | 101 | return P_ERROR; |
lixianyu | 0:362c1482232c | 102 | } |
lixianyu | 0:362c1482232c | 103 | } else if (!_mod) { |
lixianyu | 0:362c1482232c | 104 | return P_BUSY; |
lixianyu | 0:362c1482232c | 105 | } |
lixianyu | 0:362c1482232c | 106 | } while (_mod && (available(true) && g_cubeTimer.read_ms() - time < 100)); |
lixianyu | 0:362c1482232c | 107 | |
lixianyu | 0:362c1482232c | 108 | if (_mod) { |
lixianyu | 0:362c1482232c | 109 | return P_TIMEOUT; |
lixianyu | 0:362c1482232c | 110 | } |
lixianyu | 0:362c1482232c | 111 | } else { |
lixianyu | 0:362c1482232c | 112 | return P_NONE; |
lixianyu | 0:362c1482232c | 113 | } |
lixianyu | 0:362c1482232c | 114 | } |