Make sandwich by moving servos to dispense ingredients via RPC calls.

Dependencies:   Servo mbed-dev mbed-rpc

main.cpp

Committer:
K2Silver
Date:
2016-12-06
Revision:
0:9fa3ac1adbab

File content as of revision 0:9fa3ac1adbab:

#include "mbed.h"
#include "Servo.h"
#include "mbed_rpc.h"

/* Virtual USB serial port */
Serial pc(USBTX, USBRX); // tx, rx
 
/* Declare all servos */
Servo servo_ingredient0(p21);
Servo servo_ingredient1(p22);
Servo servo_ingredient2(p23);
Servo servo_ingredient3(p24);
Servo servo_bread(p25);  

/* Time between opening and closing the ingredient dispenser */
int TIME_OPEN = 300;

/* Time after closing the ingredient dispenser */
int TIME_AFTER_CLOSING = 500;

/* For debugging purpose */
/* Output the ingredient code (which ingredients to dispense) onto LEDs */
BusOut mbed_leds(LED1, LED2, LED3, LED4);

/* Make sandwich, using ingredient code */
/*  Ingredient code is bit mask of ingredients needed */
/*  Bit 0 -> Ingredient 0 needed (1) or not (0) */
/*  Bit 1 -> Ingredient 0 needed (1) or not (0) */
/*  Bit 2 -> Ingredient 0 needed (1) or not (0) */
/*  Bit 3 -> Ingredient 0 needed (1) or not (0) */
void move_servos(int ingr_code) {
    /* Dispense bread */
    servo_bread = 0; /* Dispense bread */
    wait_ms(1000);
    servo_bread = 1; /* Reset position */
    wait_ms(1000);
    
     /* Dispense ingredient 0 */
    if (ingr_code & 0x1) {
        servo_ingredient0 = 1; /* Open */
        wait_ms(TIME_OPEN);
        servo_ingredient0 = 0; /* Close */
        wait_ms(TIME_AFTER_CLOSING);
    }
    /* Dispense ingredient 1 */
    if (ingr_code & 0x2) {
        servo_ingredient1 = 1; /* Open */
        wait_ms(TIME_OPEN);
        servo_ingredient1 = 0; /* Close */
        wait_ms(TIME_AFTER_CLOSING);
    }
    /* Dispense ingredient 2 */
    if (ingr_code & 0x4) {
        servo_ingredient2 = 1; /* Open */
        wait_ms(TIME_OPEN);
        servo_ingredient2 = 0; /* Close */
        wait_ms(TIME_AFTER_CLOSING);
    }
    /* Dispense ingredient 3 */
    if (ingr_code & 0x8) {
        servo_ingredient3 = 1; /* Open */
        wait_ms(TIME_OPEN);
        servo_ingredient3 = 0; /* Close */
        wait_ms(TIME_AFTER_CLOSING);
    }
    /* Dispense bread again */
    servo_bread = 0; /* Dispense bread */
    wait_ms(1000);
    servo_bread = 1; /* Reset position */
    wait_ms(1000);
}

/* Declare function 'm_sand' exposed via RPC */
void m_sand(Arguments *in, Reply *out);
RPCFunction rpc_m_sand(&m_sand, "m_sand");
void m_sand(Arguments *in, Reply *out)  {
        
    /* Get argument */
    int ingr_code = in->getArg<int>();
    
    /* Output to LEDs for debugging */
    mbed_leds = ingr_code;
    
    /* Execute the function */
    move_servos(ingr_code);
    
    /* Set output */
    out->putData("SandwichMade");
    
    /* Reset LEDs */
    mbed_leds = 0;    
}

/* Main code */
int main() {
    /* Set pc serial baud rate */
    pc.baud(9600);
 
    // receive commands, and send back the responses
    char buf[256], outbuf[256];
    
    while(1) {
        /* Wait for command */
        while (!pc.readable()) {
            wait_ms(100);
        }
        /* Read the characters into string array */
        int i = 0;
        while (pc.readable()) {
            buf[i] = pc.getc();
            i++;
        }
        buf[i] = '\n';
        pc.printf("%s", buf);
        //Call the static call method on the RPC class
        RPC::call(buf, outbuf); 
        pc.printf("%s\n", outbuf);
        /* Flush pc serial buffer */
        while (pc.readable()) {
            pc.getc();
        }
    }
    
}