Basketball robot mainboard firmware

Dependencies:   USBDevice mbed

Committer:
Reiko
Date:
Mon Sep 10 15:24:08 2018 +0000
Revision:
0:88887cfb2b04
Mainboard firmware for basketball robot

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Reiko 0:88887cfb2b04 1 //#include <TARGET_LPC1768/cmsis.h>
Reiko 0:88887cfb2b04 2 #include "RFManager.h"
Reiko 0:88887cfb2b04 3
Reiko 0:88887cfb2b04 4 RFManager::RFManager(PinName txPinName, PinName rxPinName):
Reiko 0:88887cfb2b04 5 serial(txPinName, rxPinName), buf(64) {
Reiko 0:88887cfb2b04 6
Reiko 0:88887cfb2b04 7 messageAvailable = false;
Reiko 0:88887cfb2b04 8 receiveCounter = 0;
Reiko 0:88887cfb2b04 9 shortCommandsEnabled = false;
Reiko 0:88887cfb2b04 10 shortCommandLength = 5;
Reiko 0:88887cfb2b04 11 longCommandLength = 12;
Reiko 0:88887cfb2b04 12 commandLength = longCommandLength;
Reiko 0:88887cfb2b04 13
Reiko 0:88887cfb2b04 14 if (rxPinName == P2_1) {
Reiko 0:88887cfb2b04 15 serialId = 1;
Reiko 0:88887cfb2b04 16 } else if (rxPinName == P0_11) {
Reiko 0:88887cfb2b04 17 serialId = 2;
Reiko 0:88887cfb2b04 18 } else if (rxPinName == P0_1) {
Reiko 0:88887cfb2b04 19 serialId = 3;
Reiko 0:88887cfb2b04 20 } else {
Reiko 0:88887cfb2b04 21 serialId = 0;
Reiko 0:88887cfb2b04 22 }
Reiko 0:88887cfb2b04 23
Reiko 0:88887cfb2b04 24 serial.attach(this, &RFManager::rxHandler);
Reiko 0:88887cfb2b04 25 }
Reiko 0:88887cfb2b04 26
Reiko 0:88887cfb2b04 27 void RFManager::baud(int baudrate) {
Reiko 0:88887cfb2b04 28 serial.baud(baudrate);
Reiko 0:88887cfb2b04 29 }
Reiko 0:88887cfb2b04 30
Reiko 0:88887cfb2b04 31 void RFManager::rxHandler(void) {
Reiko 0:88887cfb2b04 32 // Interrupt does not work with RTOS when using standard functions (getc, putc)
Reiko 0:88887cfb2b04 33 // https://developer.mbed.org/forum/bugs-suggestions/topic/4217/
Reiko 0:88887cfb2b04 34
Reiko 0:88887cfb2b04 35 while (serial.readable()) {
Reiko 0:88887cfb2b04 36 char c = serialReadChar();
Reiko 0:88887cfb2b04 37
Reiko 0:88887cfb2b04 38 if (receiveCounter < commandLength) {
Reiko 0:88887cfb2b04 39 if (receiveCounter == 0) {
Reiko 0:88887cfb2b04 40 // Do not continue before a is received
Reiko 0:88887cfb2b04 41 if (c == 'a') {
Reiko 0:88887cfb2b04 42 receiveBuffer[receiveCounter] = c;
Reiko 0:88887cfb2b04 43 receiveCounter++;
Reiko 0:88887cfb2b04 44 }
Reiko 0:88887cfb2b04 45 } else if (c == 'a' && !shortCommandsEnabled
Reiko 0:88887cfb2b04 46 || c == 'a' && shortCommandsEnabled && (receiveCounter < commandLength - 1)
Reiko 0:88887cfb2b04 47 ) {
Reiko 0:88887cfb2b04 48 // If a is received in the middle, assume some bytes got lost before and start from beginning
Reiko 0:88887cfb2b04 49 receiveCounter = 0;
Reiko 0:88887cfb2b04 50
Reiko 0:88887cfb2b04 51 receiveBuffer[receiveCounter] = c;
Reiko 0:88887cfb2b04 52 receiveCounter++;
Reiko 0:88887cfb2b04 53 } else {
Reiko 0:88887cfb2b04 54 receiveBuffer[receiveCounter] = c;
Reiko 0:88887cfb2b04 55 receiveCounter++;
Reiko 0:88887cfb2b04 56 }
Reiko 0:88887cfb2b04 57
Reiko 0:88887cfb2b04 58 if (receiveCounter == commandLength) {
Reiko 0:88887cfb2b04 59 receiveCounter = 0;
Reiko 0:88887cfb2b04 60
Reiko 0:88887cfb2b04 61 for (unsigned int i = 0; i < commandLength; i++) {
Reiko 0:88887cfb2b04 62 buf.queue(receiveBuffer[i]);
Reiko 0:88887cfb2b04 63 }
Reiko 0:88887cfb2b04 64
Reiko 0:88887cfb2b04 65 if (!messageAvailable) {
Reiko 0:88887cfb2b04 66 handleMessage();
Reiko 0:88887cfb2b04 67 //break;
Reiko 0:88887cfb2b04 68 }
Reiko 0:88887cfb2b04 69 }
Reiko 0:88887cfb2b04 70 }
Reiko 0:88887cfb2b04 71 }
Reiko 0:88887cfb2b04 72 }
Reiko 0:88887cfb2b04 73
Reiko 0:88887cfb2b04 74 bool RFManager::readable() {
Reiko 0:88887cfb2b04 75 return messageAvailable;
Reiko 0:88887cfb2b04 76 }
Reiko 0:88887cfb2b04 77
Reiko 0:88887cfb2b04 78 char *RFManager::read() {
Reiko 0:88887cfb2b04 79 messageAvailable = false;
Reiko 0:88887cfb2b04 80 return receivedMessage;
Reiko 0:88887cfb2b04 81 }
Reiko 0:88887cfb2b04 82
Reiko 0:88887cfb2b04 83 void RFManager::send(char *sendData) {
Reiko 0:88887cfb2b04 84 serialWrite(sendData, commandLength);
Reiko 0:88887cfb2b04 85 }
Reiko 0:88887cfb2b04 86
Reiko 0:88887cfb2b04 87 void RFManager::send(char *sendData, int length) {
Reiko 0:88887cfb2b04 88 serialWrite(sendData, length);
Reiko 0:88887cfb2b04 89 }
Reiko 0:88887cfb2b04 90
Reiko 0:88887cfb2b04 91 void RFManager::update() {
Reiko 0:88887cfb2b04 92 /*if (receiveCounter == commandLength) {
Reiko 0:88887cfb2b04 93 handleMessage();
Reiko 0:88887cfb2b04 94 _callback.call();
Reiko 0:88887cfb2b04 95 }*/
Reiko 0:88887cfb2b04 96
Reiko 0:88887cfb2b04 97 if (buf.available() >= commandLength) {
Reiko 0:88887cfb2b04 98 handleMessage();
Reiko 0:88887cfb2b04 99 }
Reiko 0:88887cfb2b04 100 }
Reiko 0:88887cfb2b04 101
Reiko 0:88887cfb2b04 102 void RFManager::handleMessage() {
Reiko 0:88887cfb2b04 103 if (messageAvailable) {
Reiko 0:88887cfb2b04 104 return;
Reiko 0:88887cfb2b04 105 }
Reiko 0:88887cfb2b04 106
Reiko 0:88887cfb2b04 107 for (unsigned int i = 0; i < commandLength; i++) {
Reiko 0:88887cfb2b04 108 buf.dequeue(receivedMessage + i);
Reiko 0:88887cfb2b04 109 }
Reiko 0:88887cfb2b04 110
Reiko 0:88887cfb2b04 111 receivedMessage[commandLength] = '\0';
Reiko 0:88887cfb2b04 112
Reiko 0:88887cfb2b04 113 /*receiveCounter = 0;
Reiko 0:88887cfb2b04 114
Reiko 0:88887cfb2b04 115 memcpy(receivedMessage, receiveBuffer, sizeof(receiveBuffer));*/
Reiko 0:88887cfb2b04 116
Reiko 0:88887cfb2b04 117 messageAvailable = true;
Reiko 0:88887cfb2b04 118 }
Reiko 0:88887cfb2b04 119
Reiko 0:88887cfb2b04 120 void RFManager::serialWrite(char *sendData, int length) {
Reiko 0:88887cfb2b04 121 int i = 0;
Reiko 0:88887cfb2b04 122
Reiko 0:88887cfb2b04 123 while (i < length) {
Reiko 0:88887cfb2b04 124 if (serial.writeable()) {
Reiko 0:88887cfb2b04 125 serial.putc(sendData[i]);
Reiko 0:88887cfb2b04 126 }
Reiko 0:88887cfb2b04 127 i++;
Reiko 0:88887cfb2b04 128 }
Reiko 0:88887cfb2b04 129 }
Reiko 0:88887cfb2b04 130
Reiko 0:88887cfb2b04 131 char RFManager::serialReadChar() {
Reiko 0:88887cfb2b04 132 if (serialId == 1) {
Reiko 0:88887cfb2b04 133 return LPC_UART1->RBR;
Reiko 0:88887cfb2b04 134 }
Reiko 0:88887cfb2b04 135
Reiko 0:88887cfb2b04 136 if (serialId == 2) {
Reiko 0:88887cfb2b04 137 return LPC_UART2->RBR;
Reiko 0:88887cfb2b04 138 }
Reiko 0:88887cfb2b04 139
Reiko 0:88887cfb2b04 140 if (serialId == 3) {
Reiko 0:88887cfb2b04 141 return LPC_UART3->RBR;
Reiko 0:88887cfb2b04 142 }
Reiko 0:88887cfb2b04 143
Reiko 0:88887cfb2b04 144 return LPC_UART0->RBR;
Reiko 0:88887cfb2b04 145 }
Reiko 0:88887cfb2b04 146
Reiko 0:88887cfb2b04 147 void RFManager::setShortCommandMode(bool isEnabled) {
Reiko 0:88887cfb2b04 148 shortCommandsEnabled = isEnabled;
Reiko 0:88887cfb2b04 149 receiveCounter = 0;
Reiko 0:88887cfb2b04 150
Reiko 0:88887cfb2b04 151 if (isEnabled) {
Reiko 0:88887cfb2b04 152 commandLength = shortCommandLength;
Reiko 0:88887cfb2b04 153 } else {
Reiko 0:88887cfb2b04 154 commandLength = longCommandLength;
Reiko 0:88887cfb2b04 155 }
Reiko 0:88887cfb2b04 156 }