TheRobotStudio ROSA
/
trs_master
Code for the mbed NXP LPC1768. To be used on The Robot Studio Master Boards. License : Simplified BSD.
main.cpp@0:369222671f3c, 2013-02-28 (annotated)
- Committer:
- rrknight
- Date:
- Thu Feb 28 17:31:55 2013 +0000
- Revision:
- 0:369222671f3c
- Child:
- 1:95d85c81bb11
high speed reading works
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
rrknight | 0:369222671f3c | 1 | #include"mbed.h" |
rrknight | 0:369222671f3c | 2 | |
rrknight | 0:369222671f3c | 3 | #define MODSERIAL_DEFAULT_RX_BUFFER_SIZE 512 |
rrknight | 0:369222671f3c | 4 | #define MODSERIAL_DEFAULT_TX_BUFFER_SIZE 1024 |
rrknight | 0:369222671f3c | 5 | #include "MODSERIAL.h" |
rrknight | 0:369222671f3c | 6 | |
rrknight | 0:369222671f3c | 7 | //Define |
rrknight | 0:369222671f3c | 8 | #define NUMBER_MAX_EPOS2_PER_SLAVE 15 |
rrknight | 0:369222671f3c | 9 | #define NUMBER_MSG_PER_PACKET 15 |
rrknight | 0:369222671f3c | 10 | #define NUMBER_BYTES_PER_MSG 7 |
rrknight | 0:369222671f3c | 11 | #define NUMBER_SLAVE_BOARDS 3 |
rrknight | 0:369222671f3c | 12 | #define EPOS2_OK 0 |
rrknight | 0:369222671f3c | 13 | #define EPOS2_ERROR -1 |
rrknight | 0:369222671f3c | 14 | #define LOOP_PERIOD_TIME 20000 //20 ms |
rrknight | 0:369222671f3c | 15 | |
rrknight | 0:369222671f3c | 16 | //SPI RxTx FIFO bits |
rrknight | 0:369222671f3c | 17 | #define TNF 0x02 |
rrknight | 0:369222671f3c | 18 | #define TFE 0x01 |
rrknight | 0:369222671f3c | 19 | #define RNE 0x04 |
rrknight | 0:369222671f3c | 20 | |
rrknight | 0:369222671f3c | 21 | MODSERIAL ros(p28, p27, 1024, 512); // tx, rx |
rrknight | 0:369222671f3c | 22 | Serial pc(USBTX, USBRX); //terminal for debug |
rrknight | 0:369222671f3c | 23 | DigitalOut ledchain[] = {(LED1), (LED2), (LED3), (LED4)}; //used for debugging |
rrknight | 0:369222671f3c | 24 | DigitalOut logicPin(p26); //to record with Logic analyser on an event, pin high. |
rrknight | 0:369222671f3c | 25 | |
rrknight | 0:369222671f3c | 26 | char* readBufferSerial; //[NUMBER_MSG_PER_PACKET][NUMBER_BYTES_PER_MSG]; //buffer of packets read by the master (written by the ros node on pc side) |
rrknight | 0:369222671f3c | 27 | uint8_t writeBufferSPI[NUMBER_SLAVE_BOARDS][NUMBER_MSG_PER_PACKET][NUMBER_BYTES_PER_MSG]; //buffer ready to be sent over SPI to different slaves |
rrknight | 0:369222671f3c | 28 | uint8_t readBufferSPI[NUMBER_SLAVE_BOARDS][NUMBER_MSG_PER_PACKET][NUMBER_BYTES_PER_MSG]; //buffer read by the master on SPI bus |
rrknight | 0:369222671f3c | 29 | |
rrknight | 0:369222671f3c | 30 | Timer timer; |
rrknight | 0:369222671f3c | 31 | uint64_t begin, end; |
rrknight | 0:369222671f3c | 32 | uint8_t numberCmds[NUMBER_SLAVE_BOARDS]; |
rrknight | 0:369222671f3c | 33 | |
rrknight | 0:369222671f3c | 34 | bool newCmd_detected = false; |
rrknight | 0:369222671f3c | 35 | uint8_t nbArrows = 0; |
rrknight | 0:369222671f3c | 36 | |
rrknight | 0:369222671f3c | 37 | uint8_t i=0; |
rrknight | 0:369222671f3c | 38 | uint8_t j=0; |
rrknight | 0:369222671f3c | 39 | |
rrknight | 0:369222671f3c | 40 | char rByte = 0x00; |
rrknight | 0:369222671f3c | 41 | bool threeArrowsFound = false; |
rrknight | 0:369222671f3c | 42 | |
rrknight | 0:369222671f3c | 43 | // Called everytime a new character goes into |
rrknight | 0:369222671f3c | 44 | // the RX buffer. Test that character for '/' |
rrknight | 0:369222671f3c | 45 | // Note, rxGetLastChar() gets the last char that |
rrknight | 0:369222671f3c | 46 | // we received but it does NOT remove it from |
rrknight | 0:369222671f3c | 47 | // the RX buffer. |
rrknight | 0:369222671f3c | 48 | void rxCallback(MODSERIAL_IRQ_INFO *q) |
rrknight | 0:369222671f3c | 49 | { |
rrknight | 0:369222671f3c | 50 | logicPin = 1; |
rrknight | 0:369222671f3c | 51 | |
rrknight | 0:369222671f3c | 52 | MODSERIAL *serial = q->serial; |
rrknight | 0:369222671f3c | 53 | |
rrknight | 0:369222671f3c | 54 | if ( serial->rxGetLastChar() == '/') |
rrknight | 0:369222671f3c | 55 | { |
rrknight | 0:369222671f3c | 56 | //pc.printf("new1\n"); |
rrknight | 0:369222671f3c | 57 | //newline_detected = true; |
rrknight | 0:369222671f3c | 58 | serial->move(readBufferSerial, NUMBER_MSG_PER_PACKET*NUMBER_BYTES_PER_MSG, '\n'); |
rrknight | 0:369222671f3c | 59 | serial->rxBufferFlush(); |
rrknight | 0:369222671f3c | 60 | //pc.printf("new\n"); |
rrknight | 0:369222671f3c | 61 | //for(int n=0; n<1; n++) |
rrknight | 0:369222671f3c | 62 | //{ |
rrknight | 0:369222671f3c | 63 | //pc.printf("new2\n\r"); |
rrknight | 0:369222671f3c | 64 | //pc.printf("0x%02X\n", s[0]); |
rrknight | 0:369222671f3c | 65 | //pc.printf("0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X\n", s[0], s[1], s[2], s[3], s[4], s[5], s[6]); |
rrknight | 0:369222671f3c | 66 | //} |
rrknight | 0:369222671f3c | 67 | } |
rrknight | 0:369222671f3c | 68 | /* |
rrknight | 0:369222671f3c | 69 | rByte = serial->rxGetLastChar(); |
rrknight | 0:369222671f3c | 70 | |
rrknight | 0:369222671f3c | 71 | if(nbArrows < 3) |
rrknight | 0:369222671f3c | 72 | { |
rrknight | 0:369222671f3c | 73 | if(rByte == 0x3C) |
rrknight | 0:369222671f3c | 74 | { |
rrknight | 0:369222671f3c | 75 | nbArrows++; |
rrknight | 0:369222671f3c | 76 | } |
rrknight | 0:369222671f3c | 77 | else |
rrknight | 0:369222671f3c | 78 | { |
rrknight | 0:369222671f3c | 79 | nbArrows = 0; |
rrknight | 0:369222671f3c | 80 | } |
rrknight | 0:369222671f3c | 81 | |
rrknight | 0:369222671f3c | 82 | if(nbArrows == 3) |
rrknight | 0:369222671f3c | 83 | { |
rrknight | 0:369222671f3c | 84 | threeArrowsFound = true; |
rrknight | 0:369222671f3c | 85 | } |
rrknight | 0:369222671f3c | 86 | } |
rrknight | 0:369222671f3c | 87 | else |
rrknight | 0:369222671f3c | 88 | { |
rrknight | 0:369222671f3c | 89 | readBufferSerial[i][j] = rByte; |
rrknight | 0:369222671f3c | 90 | //pc.printf("i=%d j=%d\n", i,j); |
rrknight | 0:369222671f3c | 91 | |
rrknight | 0:369222671f3c | 92 | j++; |
rrknight | 0:369222671f3c | 93 | if(j >= NUMBER_BYTES_PER_MSG) |
rrknight | 0:369222671f3c | 94 | { |
rrknight | 0:369222671f3c | 95 | j = 0; |
rrknight | 0:369222671f3c | 96 | i++; //next cmd |
rrknight | 0:369222671f3c | 97 | |
rrknight | 0:369222671f3c | 98 | if(i >= NUMBER_MSG_PER_PACKET) |
rrknight | 0:369222671f3c | 99 | { |
rrknight | 0:369222671f3c | 100 | nbArrows = 0; |
rrknight | 0:369222671f3c | 101 | i = 0; |
rrknight | 0:369222671f3c | 102 | j = 0; |
rrknight | 0:369222671f3c | 103 | serial->rxBufferFlush(); |
rrknight | 0:369222671f3c | 104 | //serial->txBufferFlush(); |
rrknight | 0:369222671f3c | 105 | |
rrknight | 0:369222671f3c | 106 | for(int n=0; n<1; n++) |
rrknight | 0:369222671f3c | 107 | { |
rrknight | 0:369222671f3c | 108 | pc.printf("0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X\n", readBufferSerial[n][0], readBufferSerial[n][1], readBufferSerial[n][2], readBufferSerial[n][3], readBufferSerial[n][4], readBufferSerial[n][5], readBufferSerial[n][6]); |
rrknight | 0:369222671f3c | 109 | } |
rrknight | 0:369222671f3c | 110 | } |
rrknight | 0:369222671f3c | 111 | } |
rrknight | 0:369222671f3c | 112 | } |
rrknight | 0:369222671f3c | 113 | */ |
rrknight | 0:369222671f3c | 114 | logicPin = 0; |
rrknight | 0:369222671f3c | 115 | } |
rrknight | 0:369222671f3c | 116 | |
rrknight | 0:369222671f3c | 117 | int main() |
rrknight | 0:369222671f3c | 118 | { |
rrknight | 0:369222671f3c | 119 | ros.baud(460800); //460800 works //921600 don't |
rrknight | 0:369222671f3c | 120 | pc.baud(115200); |
rrknight | 0:369222671f3c | 121 | |
rrknight | 0:369222671f3c | 122 | i=0; |
rrknight | 0:369222671f3c | 123 | j=0; |
rrknight | 0:369222671f3c | 124 | |
rrknight | 0:369222671f3c | 125 | //init alloc |
rrknight | 0:369222671f3c | 126 | readBufferSerial = (char*)malloc(NUMBER_MSG_PER_PACKET*NUMBER_BYTES_PER_MSG*sizeof(char*)); |
rrknight | 0:369222671f3c | 127 | |
rrknight | 0:369222671f3c | 128 | ros.attach(&rxCallback, MODSERIAL::RxIrq); |
rrknight | 0:369222671f3c | 129 | |
rrknight | 0:369222671f3c | 130 | pc.printf("*** Start Master Main ***\n\r"); |
rrknight | 0:369222671f3c | 131 | |
rrknight | 0:369222671f3c | 132 | logicPin = 0; |
rrknight | 0:369222671f3c | 133 | |
rrknight | 0:369222671f3c | 134 | // Wait here until we detect the \n going into the buffer. |
rrknight | 0:369222671f3c | 135 | while(!newCmd_detected); |
rrknight | 0:369222671f3c | 136 | |
rrknight | 0:369222671f3c | 137 | // When we get here the RX buffer now contains a sentence. |
rrknight | 0:369222671f3c | 138 | // ... |
rrknight | 0:369222671f3c | 139 | |
rrknight | 0:369222671f3c | 140 | } |