Mangirdas Skripka / Android

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");
        }        
        
        

    }
}