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.
Android.cpp
- Committer:
- maskas
- Date:
- 2018-01-09
- Revision:
- 2:aeecb6277fc7
- Parent:
- 1:6d9353593c3c
- Child:
- 3:36ff03cb6bab
File content as of revision 2:aeecb6277fc7:
#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) { this->serial.baud(115200); //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) { 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 id; command[0] = '\n'; id = -1; if (this->serial.readable()) { this->serial.scanf("%s\n", &command); printf("Command received: %s\n", command); 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"); } } }