Gerrod Ubben / Mbed 2 deprecated ECE4180_Final_Project

Dependencies:   mbed mbed-rtos 4DGL-uLCD-SE RPCInterface

Committer:
robo1340
Date:
Tue Nov 12 19:21:49 2019 +0000
Revision:
12:f1856a0b8ced
Parent:
11:0309bef74ba8
Child:
13:f1649dc31b04
can send rpc commands to update time and message string

Who changed what in which revision?

UserRevisionLine numberNew contents of line
emilmont 1:491820ee784d 1 #include "mbed.h"
mbed_official 11:0309bef74ba8 2 #include "rtos.h"
robo1340 12:f1856a0b8ced 3
robo1340 12:f1856a0b8ced 4 #include "mbed_rpc.h"
robo1340 12:f1856a0b8ced 5 #include "uLCD_4DGL.h"
robo1340 12:f1856a0b8ced 6
robo1340 12:f1856a0b8ced 7 uLCD_4DGL uLCD(p9,p10,p11); // serial tx, serial rx, reset pin;
robo1340 12:f1856a0b8ced 8 Serial bluetooth(p13,p14);
robo1340 12:f1856a0b8ced 9 Serial pc(USBTX, USBRX);
robo1340 12:f1856a0b8ced 10
robo1340 12:f1856a0b8ced 11 Mutex stdio_mutex;
robo1340 12:f1856a0b8ced 12 Mutex lcd_mutex;
robo1340 12:f1856a0b8ced 13
robo1340 12:f1856a0b8ced 14 Thread bluetooth_thread;
robo1340 12:f1856a0b8ced 15 Thread time_thread;
robo1340 12:f1856a0b8ced 16
robo1340 12:f1856a0b8ced 17 void writeLCD(Arguments *in, Reply *out);
robo1340 12:f1856a0b8ced 18 void setTime (Arguments *in, Reply *out);
robo1340 12:f1856a0b8ced 19
robo1340 12:f1856a0b8ced 20 //rpc function prototypes
robo1340 12:f1856a0b8ced 21 RPCFunction rpcWriteLCD(&writeLCD, "writeLCD");
robo1340 12:f1856a0b8ced 22 RPCFunction rpcSetTime(&setTime, "setTime");
robo1340 12:f1856a0b8ced 23
robo1340 12:f1856a0b8ced 24
robo1340 12:f1856a0b8ced 25 void time_thread_func() {
emilmont 1:491820ee784d 26
robo1340 12:f1856a0b8ced 27 while (true) {
robo1340 12:f1856a0b8ced 28 time_t seconds = time(NULL);
robo1340 12:f1856a0b8ced 29
robo1340 12:f1856a0b8ced 30 stdio_mutex.lock();
robo1340 12:f1856a0b8ced 31 lcd_mutex.lock();
robo1340 12:f1856a0b8ced 32
robo1340 12:f1856a0b8ced 33 uLCD.locate(0,0);
robo1340 12:f1856a0b8ced 34 uLCD.printf("%s", ctime(&seconds)); //Time as a basic string
robo1340 12:f1856a0b8ced 35
robo1340 12:f1856a0b8ced 36 stdio_mutex.unlock();
robo1340 12:f1856a0b8ced 37 lcd_mutex.unlock();
robo1340 12:f1856a0b8ced 38
robo1340 12:f1856a0b8ced 39 //printf("Time as seconds since January 1, 1970 = %d\n", seconds);
emilmont 1:491820ee784d 40
robo1340 12:f1856a0b8ced 41 //char buffer[32];
robo1340 12:f1856a0b8ced 42 //strftime(buffer, 32, "%I:%M %p\n", localtime(&seconds));
robo1340 12:f1856a0b8ced 43 //printf("Time as a custom formatted string = %s", buffer);
robo1340 12:f1856a0b8ced 44
robo1340 12:f1856a0b8ced 45 Thread::wait(1000); //only update every second
robo1340 12:f1856a0b8ced 46 }
robo1340 12:f1856a0b8ced 47
robo1340 12:f1856a0b8ced 48 }
robo1340 12:f1856a0b8ced 49
robo1340 12:f1856a0b8ced 50
robo1340 12:f1856a0b8ced 51 void bluetooth_thread_func() {
robo1340 12:f1856a0b8ced 52
robo1340 12:f1856a0b8ced 53 //The mbed RPC classes are now wrapped to create an RPC enabled version - see RpcClasses.h so don't add to base class
robo1340 12:f1856a0b8ced 54 // receive commands, and send back the responses
robo1340 12:f1856a0b8ced 55 char buf[256], outbuf[256];
robo1340 12:f1856a0b8ced 56 uint16_t buf_pos = 0;
robo1340 12:f1856a0b8ced 57
robo1340 12:f1856a0b8ced 58 while(true) {
robo1340 12:f1856a0b8ced 59 //Thread::wait(20);
robo1340 12:f1856a0b8ced 60
robo1340 12:f1856a0b8ced 61 if (pc.readable() == true) {
robo1340 12:f1856a0b8ced 62 //if (bluetooth.readable() == true) {
robo1340 12:f1856a0b8ced 63
robo1340 12:f1856a0b8ced 64 stdio_mutex.lock();
robo1340 12:f1856a0b8ced 65
robo1340 12:f1856a0b8ced 66 buf[buf_pos] = pc.getc();
robo1340 12:f1856a0b8ced 67 //buf[buf_pos] = bluetooth.getc();
robo1340 12:f1856a0b8ced 68
robo1340 12:f1856a0b8ced 69 stdio_mutex.unlock();
robo1340 12:f1856a0b8ced 70
robo1340 12:f1856a0b8ced 71 if (buf[buf_pos] == '\n') { //the end of the RPC command has been received
robo1340 12:f1856a0b8ced 72 buf[buf_pos] = '\0';
robo1340 12:f1856a0b8ced 73 buf_pos = 0;
robo1340 12:f1856a0b8ced 74 RPC::call(buf, outbuf); //make an RPC call
robo1340 12:f1856a0b8ced 75
robo1340 12:f1856a0b8ced 76 stdio_mutex.lock();
robo1340 12:f1856a0b8ced 77 pc.printf("%s\n", outbuf); //send the response
robo1340 12:f1856a0b8ced 78 stdio_mutex.unlock();
robo1340 12:f1856a0b8ced 79 }
robo1340 12:f1856a0b8ced 80 else {
robo1340 12:f1856a0b8ced 81 buf_pos++;
robo1340 12:f1856a0b8ced 82 }
robo1340 12:f1856a0b8ced 83
robo1340 12:f1856a0b8ced 84 } else {
robo1340 12:f1856a0b8ced 85 Thread::yield();
robo1340 12:f1856a0b8ced 86 }
robo1340 12:f1856a0b8ced 87
emilmont 1:491820ee784d 88 }
emilmont 1:491820ee784d 89 }
robo1340 12:f1856a0b8ced 90
emilmont 1:491820ee784d 91 int main() {
robo1340 12:f1856a0b8ced 92
robo1340 12:f1856a0b8ced 93 bluetooth_thread.start(bluetooth_thread_func);
robo1340 12:f1856a0b8ced 94 time_thread.start(time_thread_func);
robo1340 12:f1856a0b8ced 95
robo1340 12:f1856a0b8ced 96 }
robo1340 12:f1856a0b8ced 97
robo1340 12:f1856a0b8ced 98
robo1340 12:f1856a0b8ced 99 // Make sure the method takes in Arguments and Reply objects.
robo1340 12:f1856a0b8ced 100 void setTime (Arguments *in, Reply *out) {
robo1340 12:f1856a0b8ced 101 static const char * unix_time_str;
robo1340 12:f1856a0b8ced 102 uint32_t unix_time;
robo1340 12:f1856a0b8ced 103
robo1340 12:f1856a0b8ced 104 //set_time(1256729737); // Set RTC time to Wed, 28 Oct 2009 11:35:37
robo1340 12:f1856a0b8ced 105 unix_time_str = in->getArg<const char*>(); //get a pointer to the location where the argument string is stored
robo1340 12:f1856a0b8ced 106 unix_time = atoll(unix_time_str);
robo1340 12:f1856a0b8ced 107
robo1340 12:f1856a0b8ced 108 set_time(unix_time); // Set RTC time to Wed, 28 Oct 2009 11:35:37
emilmont 1:491820ee784d 109
emilmont 1:491820ee784d 110 }
robo1340 12:f1856a0b8ced 111
robo1340 12:f1856a0b8ced 112
robo1340 12:f1856a0b8ced 113 // Make sure the method takes in Arguments and Reply objects.
robo1340 12:f1856a0b8ced 114 void writeLCD (Arguments *in, Reply *out) {
robo1340 12:f1856a0b8ced 115 static const char * msg_str;
robo1340 12:f1856a0b8ced 116
robo1340 12:f1856a0b8ced 117 msg_str = in->getArg<const char*>(); //get a pointer to the location where the argument string is stored
robo1340 12:f1856a0b8ced 118
robo1340 12:f1856a0b8ced 119 stdio_mutex.lock();
robo1340 12:f1856a0b8ced 120 lcd_mutex.lock();
robo1340 12:f1856a0b8ced 121
robo1340 12:f1856a0b8ced 122 uLCD.locate(0,2);
robo1340 12:f1856a0b8ced 123 uLCD.printf("%s\r\n",msg_str);
robo1340 12:f1856a0b8ced 124
robo1340 12:f1856a0b8ced 125 stdio_mutex.unlock();
robo1340 12:f1856a0b8ced 126 lcd_mutex.unlock();
robo1340 12:f1856a0b8ced 127
robo1340 12:f1856a0b8ced 128 }