Mangirdas Skripka / Android
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");
+        }        
+        
+        
+
     }
 }