Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: Android.cpp
- Revision:
- 2:aeecb6277fc7
- Parent:
- 1:6d9353593c3c
- Child:
- 3:36ff03cb6bab
--- a/Android.cpp Mon Jan 08 16:09:56 2018 +0000 +++ b/Android.cpp Tue Jan 09 20:07:04 2018 +0000 @@ -1,39 +1,170 @@ #include "mbed.h" +#include<string> #include "Android.h" +#include "MODSERIAL.h" + +#define ARDUINO_STARTED "AR1" +#define ANDROID_CONNECTED "AN1" +#define OK "OK" +#define ARDUINO_HEART_BEAT "ARD_HB" +#define ANDROID_HEART_BEAT "AND_HB" +#define DISPENSING_STARTED "DISP1" +#define DISPENSING_COMPLETE "DISP2" +#define DISPENSING_NO_PAYMENT "DISP0" +#define PRODUCT_TAKEN "TAKEN" +#define DISPENSING_FAILED "DISP3" +#define TAKE_PAYMENT "PAY1" +#define TAKING_PAYMENT "PAY2" +#define PAYMENT_RECEIVED "PAY3" +#define PAYMENT_FAILED "PAY4" +#define SHOW_HOME_SCREEN "HOME" +#define PRODUCT_SELECTED "SELECTION" + +#define COMMAND_CONNECTED 100 +#define COMMAND_HEARTH_BEAT 101 +#define COMMAND_PRODUCT_SELECT 102 +#define COMMAND_TAKE_PAYMENT 103 +#define COMMAND_DISPENSE 104 +#define COMMAND_VALUE 200 +#define COMMAND_UNKNOWN 900 + + + + + +#define PAYMENT_MODE "PAID" +#define MESSAGE_BUFFER_SIZE 32 + +char messageBufferIncoming[MESSAGE_BUFFER_SIZE]; +char messageBufferOutgoing[MESSAGE_BUFFER_SIZE]; +int lastCommands[3]; +int commandValue = 0; + +void Android::onMessage(MODSERIAL_IRQ_INFO *q) +{ + MODSERIAL *sys = q->serial; + sys->move(messageBufferIncoming, MESSAGE_BUFFER_SIZE); + + this->processMessageBuffer(); + + printf("Command received: %s\n", messageBufferIncoming); +} + Android::Android(PinName txPin, PinName rxPin, Carousel& carousel): serial(txPin, rxPin), myled(LED1), carousel(carousel) { - //Serial pc(USBTX, USBRX); // tx, rx - this->serial.baud(115200); - this->serial.attach(callback(this, &Android::onData)); + //this->serial.attach(callback(this, &Android::onData)); + this->serial.attach(this, &Android::onMessage, MODSERIAL::RxAutoDetect); + this->serial.autoDetectChar('\n'); this->ticker.attach(callback(this, &Android::hearthBeat), 5.0f); this->carousel.callibrate(); } + +void Android::processMessageBuffer() +{ + lastCommands[0] = lastCommands[1]; + lastCommands[1] = lastCommands[2]; + + int newCommand = 0; + if (strncmp(messageBufferIncoming, ANDROID_CONNECTED, sizeof(ANDROID_CONNECTED)) == 0) { + newCommand = COMMAND_CONNECTED; + } else if (strncmp(messageBufferIncoming, ANDROID_HEART_BEAT, sizeof(ANDROID_HEART_BEAT)) == 0) { + newCommand = COMMAND_HEARTH_BEAT; + } else if (strncmp(messageBufferIncoming, PRODUCT_SELECTED, sizeof(PRODUCT_SELECTED)) == 0) { + newCommand = COMMAND_PRODUCT_SELECT; + } else if (strncmp(messageBufferIncoming, TAKE_PAYMENT, sizeof(TAKE_PAYMENT)) == 0) { + newCommand = COMMAND_TAKE_PAYMENT; + } else if (strncmp(messageBufferIncoming, DISPENSING_NO_PAYMENT, sizeof(DISPENSING_NO_PAYMENT)) == 0) { + newCommand = COMMAND_DISPENSE; + } else if (atoi(messageBufferIncoming) != 0) { + newCommand = COMMAND_VALUE; + commandValue = atoi(messageBufferIncoming); + } else { + newCommand = COMMAND_UNKNOWN; + printf("Did not understood Android message: "); + printf(messageBufferIncoming); + printf("\n"); + } + lastCommands[2] = newCommand; + + this->executeCommands(); +} + +void Android::executeCommands() +{ + switch(lastCommands[2]) { + case COMMAND_VALUE: + switch (lastCommands[1]) { + case COMMAND_DISPENSE: + this->carousel.dispenseProduct(lastCommands[2]); + break; + } + break; + case COMMAND_CONNECTED: + this->sendToAndroid(OK); + break; + case COMMAND_DISPENSE: + case COMMAND_TAKE_PAYMENT: + case COMMAND_PRODUCT_SELECT: + case COMMAND_HEARTH_BEAT: + //do nothing + break; + } +} + + + void Android::hearthBeat(void) { - printf("HEARTH BEAT SENT\n"); - this->serial.printf("ARD_HB"); - this->serial.putc(-91); - this->serial.printf("OK"); - this->serial.putc(-91); + this->sendToAndroid(ARDUINO_HEART_BEAT); +} +void Android::sendToAndroid(string message) +{ + printf("Sent to Android: %s\n", message); + this->serial.printf("%s\n", message); + this->serial.putc(-91); } void Android::onData(void) { char command[50]; - int product; + int id; + + command[0] = '\n'; + id = -1; + if (this->serial.readable()) { - this->serial.scanf("%s", &command); - this->serial.scanf("%d", &product); - printf(command); - printf("%d", product); + this->serial.scanf("%s\n", &command); + printf("Command received: %s\n", command); - printf("Command Received: \r\n"); + if (strcmp(command, ANDROID_CONNECTED) == 0) { + this->sendToAndroid(OK); + } else if (command == ANDROID_HEART_BEAT) { + //enjoy + } else if (strcmp(command, PRODUCT_SELECTED) == 0) { + this->serial.scanf("%d\n", &id); + printf("%d\n", id); + //do nothing + //preTurnProduct(); + } else if (strcmp(command, TAKE_PAYMENT) == 0) { + //do nothing + } else if (strcmp(command, DISPENSING_NO_PAYMENT) == 0) { + this->serial.scanf("%d\n", &id); + printf("%d\n", id); + this->carousel.dispenseProduct(id); + } else { + printf("Did not understood Android message: "); + printf(command); + printf("\n"); + } + + + } }