Microduino的cube小车。

Dependencies:   mbed-rtos mbed

Committer:
lixianyu
Date:
Sat May 28 05:09:18 2016 +0000
Revision:
4:0670023d3f36
Parent:
3:e4ac7c1a14de
??work????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lixianyu 3:e4ac7c1a14de 1 #include "Microduino_Protocol_HardSer.h"
lixianyu 3:e4ac7c1a14de 2
lixianyu 4:0670023d3f36 3 //Timer _timer;
lixianyu 4:0670023d3f36 4 extern Timer g_cubeTimer;
lixianyu 3:e4ac7c1a14de 5 uint8_t getChecksum(uint8_t length, uint8_t cmd, uint8_t mydata[])
lixianyu 3:e4ac7c1a14de 6 {
lixianyu 3:e4ac7c1a14de 7 //三个参数分别为: 数据长度 , 指令代码 , 实际数据数组
lixianyu 3:e4ac7c1a14de 8 uint8_t checksum = 0;
lixianyu 3:e4ac7c1a14de 9 checksum ^= (length & 0xFF);
lixianyu 3:e4ac7c1a14de 10 checksum ^= (cmd & 0xFF);
lixianyu 3:e4ac7c1a14de 11 for (int i = 0; i < length; i++) checksum ^= (mydata[i] & 0xFF);
lixianyu 3:e4ac7c1a14de 12 return checksum;
lixianyu 3:e4ac7c1a14de 13 }
lixianyu 3:e4ac7c1a14de 14
lixianyu 3:e4ac7c1a14de 15 /* Protocol::Protocol(PRO_PORT *ser , byte _channel) {
lixianyu 3:e4ac7c1a14de 16 // common_init(); // Set everything to common state, then...
lixianyu 3:e4ac7c1a14de 17 this->channel = _channel;
lixianyu 3:e4ac7c1a14de 18 this->num = 0;
lixianyu 3:e4ac7c1a14de 19 this->sta = false;
lixianyu 3:e4ac7c1a14de 20 this->error = false;
lixianyu 3:e4ac7c1a14de 21 P_Serial = ser; // ...override P_Serial with value passed.
lixianyu 3:e4ac7c1a14de 22 } */
lixianyu 3:e4ac7c1a14de 23
lixianyu 3:e4ac7c1a14de 24 void Protocol::begin(uint16_t _baud)
lixianyu 3:e4ac7c1a14de 25 {
lixianyu 4:0670023d3f36 26 //_timer.start();
lixianyu 3:e4ac7c1a14de 27 //P_Serial->begin(_baud);
lixianyu 3:e4ac7c1a14de 28 P_Serial->baud(_baud);
lixianyu 3:e4ac7c1a14de 29 //delay(20);
lixianyu 4:0670023d3f36 30 //wait_ms(20);
lixianyu 3:e4ac7c1a14de 31 }
lixianyu 3:e4ac7c1a14de 32
lixianyu 3:e4ac7c1a14de 33 bool Protocol::available(bool _sta)
lixianyu 3:e4ac7c1a14de 34 {
lixianyu 3:e4ac7c1a14de 35 //if (P_Serial->available() > 0) {
lixianyu 3:e4ac7c1a14de 36 if (P_Serial->readable() > 0) {
lixianyu 3:e4ac7c1a14de 37 if (_sta) {
lixianyu 3:e4ac7c1a14de 38 this->inCache = this->inChar;
lixianyu 3:e4ac7c1a14de 39 //this->inChar = P_Serial->read();
lixianyu 3:e4ac7c1a14de 40 this->inChar = P_Serial->getc();
lixianyu 3:e4ac7c1a14de 41 this->buffer[num] = this->inChar;
lixianyu 3:e4ac7c1a14de 42
lixianyu 3:e4ac7c1a14de 43 if (this->num > BUFFER_MAX - 1) {
lixianyu 3:e4ac7c1a14de 44 this->num = 0;
lixianyu 3:e4ac7c1a14de 45 return false;
lixianyu 3:e4ac7c1a14de 46 } else {
lixianyu 3:e4ac7c1a14de 47 this->num++;
lixianyu 3:e4ac7c1a14de 48 }
lixianyu 3:e4ac7c1a14de 49 }
lixianyu 3:e4ac7c1a14de 50 return true;
lixianyu 3:e4ac7c1a14de 51 }
lixianyu 3:e4ac7c1a14de 52 return false;
lixianyu 3:e4ac7c1a14de 53 }
lixianyu 3:e4ac7c1a14de 54
lixianyu 3:e4ac7c1a14de 55 uint8_t Protocol::parse(uint16_t* _data, bool _mod)
lixianyu 3:e4ac7c1a14de 56 {
lixianyu 3:e4ac7c1a14de 57 if (available(!_mod)) {
lixianyu 3:e4ac7c1a14de 58 //time = millis();
lixianyu 4:0670023d3f36 59 //time = _timer.read_ms();
lixianyu 4:0670023d3f36 60 time = g_cubeTimer.read_ms();
lixianyu 3:e4ac7c1a14de 61 do {
lixianyu 3:e4ac7c1a14de 62 if (this->sta) {
lixianyu 3:e4ac7c1a14de 63 this->sta = false;
lixianyu 3:e4ac7c1a14de 64 this->num = 0;
lixianyu 3:e4ac7c1a14de 65 if (this->inChar == this->channel) {
lixianyu 3:e4ac7c1a14de 66 this->error = false;
lixianyu 3:e4ac7c1a14de 67 if (!_mod) {
lixianyu 3:e4ac7c1a14de 68 return P_BUSY;
lixianyu 3:e4ac7c1a14de 69 }
lixianyu 3:e4ac7c1a14de 70 } else {
lixianyu 3:e4ac7c1a14de 71 this->error = true;
lixianyu 3:e4ac7c1a14de 72 return P_ERROR;
lixianyu 3:e4ac7c1a14de 73 }
lixianyu 3:e4ac7c1a14de 74 }
lixianyu 3:e4ac7c1a14de 75
lixianyu 3:e4ac7c1a14de 76 if (this->inChar == 0xBB && this->inCache == 0xAA) {
lixianyu 3:e4ac7c1a14de 77 this->sta = true;
lixianyu 3:e4ac7c1a14de 78 if (!_mod) {
lixianyu 3:e4ac7c1a14de 79 return P_BUSY;
lixianyu 3:e4ac7c1a14de 80 }
lixianyu 3:e4ac7c1a14de 81 }
lixianyu 3:e4ac7c1a14de 82
lixianyu 3:e4ac7c1a14de 83 if (this->num == (CHANNEL_NUM * 2 + 1) && !this->error) {
lixianyu 3:e4ac7c1a14de 84 this->inCache = this->buffer[CHANNEL_NUM * 2];
lixianyu 3:e4ac7c1a14de 85 this->buffer[CHANNEL_NUM * 2] = NULL;
lixianyu 3:e4ac7c1a14de 86 this->inChar = getChecksum(CHANNEL_NUM * 2, 200, this->buffer);
lixianyu 3:e4ac7c1a14de 87
lixianyu 3:e4ac7c1a14de 88 this->num = 0;
lixianyu 3:e4ac7c1a14de 89 if (!this->error && this->inCache == this->inChar) {
lixianyu 3:e4ac7c1a14de 90 for (uint8_t a = 0; a < CHANNEL_NUM; a++) {
lixianyu 3:e4ac7c1a14de 91 _data[a] = ((uint16_t)(this->buffer[a * 2])) | ((uint16_t)this->buffer[a * 2 + 1] << 8);
lixianyu 3:e4ac7c1a14de 92 }
lixianyu 3:e4ac7c1a14de 93 return P_FINE;
lixianyu 3:e4ac7c1a14de 94 } else {
lixianyu 3:e4ac7c1a14de 95 return P_ERROR;
lixianyu 3:e4ac7c1a14de 96 }
lixianyu 3:e4ac7c1a14de 97 } else if (!_mod) {
lixianyu 3:e4ac7c1a14de 98 return P_BUSY;
lixianyu 3:e4ac7c1a14de 99 }
lixianyu 4:0670023d3f36 100 } while (_mod && (available(true) && g_cubeTimer.read_ms() - time < 100));
lixianyu 3:e4ac7c1a14de 101
lixianyu 3:e4ac7c1a14de 102 if (_mod) {
lixianyu 3:e4ac7c1a14de 103 return P_TIMEOUT;
lixianyu 3:e4ac7c1a14de 104 }
lixianyu 3:e4ac7c1a14de 105 } else {
lixianyu 3:e4ac7c1a14de 106 return P_NONE;
lixianyu 3:e4ac7c1a14de 107 }
lixianyu 3:e4ac7c1a14de 108 }