A simple example of a serial communication interface for setting variables in an Mbed program with help of mydsc library.

Dependencies:   mbed mydsc

Committer:
ghsalazar
Date:
Sat Mar 28 16:09:30 2020 +0000
Revision:
4:e315db7c4dea
Parent:
2:f884fffe2c4b
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ghsalazar 0:46aa79a823ee 1 /**
ghsalazar 0:46aa79a823ee 2 @file main.cpp
ghsalazar 0:46aa79a823ee 3 @author Gastón SALAZAR <gaston_salazar@yahoo.com>
ghsalazar 0:46aa79a823ee 4 */
ghsalazar 0:46aa79a823ee 5
ghsalazar 0:46aa79a823ee 6 #include "mbed.h"
ghsalazar 1:2cd22f07b879 7 #include "stdio.h"
ghsalazar 1:2cd22f07b879 8 #include "stdlib.h"
ghsalazar 4:e315db7c4dea 9 #include "string.h"
ghsalazar 1:2cd22f07b879 10 #include "ctype.h"
ghsalazar 0:46aa79a823ee 11
ghsalazar 1:2cd22f07b879 12 #include "mydsc_kvp.h"
ghsalazar 4:e315db7c4dea 13 #include "mydsc_error.h"
ghsalazar 0:46aa79a823ee 14
ghsalazar 4:e315db7c4dea 15 // Hardware Interface
ghsalazar 4:e315db7c4dea 16 DigitalOut led (LED1);
ghsalazar 4:e315db7c4dea 17 Serial serial (USBTX, USBRX);
ghsalazar 4:e315db7c4dea 18 InterruptIn button (USER_BUTTON);
ghsalazar 4:e315db7c4dea 19
ghsalazar 4:e315db7c4dea 20
ghsalazar 4:e315db7c4dea 21 // Behavior interface
ghsalazar 4:e315db7c4dea 22 const unsigned MESSAGE_MAX_LEN = 126;
ghsalazar 4:e315db7c4dea 23 const char END_OF_LINE = 015;
ghsalazar 4:e315db7c4dea 24 const unsigned VALUE_SIZE = 128;
ghsalazar 4:e315db7c4dea 25 const unsigned short BUFFER_SIZE = 128;
ghsalazar 4:e315db7c4dea 26
ghsalazar 4:e315db7c4dea 27 unsigned long delay = 5000000UL;
ghsalazar 4:e315db7c4dea 28
ghsalazar 4:e315db7c4dea 29 char message[MESSAGE_MAX_LEN+2];
ghsalazar 4:e315db7c4dea 30
ghsalazar 4:e315db7c4dea 31 volatile bool semaphore_input = false;
ghsalazar 4:e315db7c4dea 32 volatile bool semaphore_button = false;
ghsalazar 4:e315db7c4dea 33
ghsalazar 4:e315db7c4dea 34 // This set of functions are callbacks
ghsalazar 0:46aa79a823ee 35
ghsalazar 4:e315db7c4dea 36 void on_rx()
ghsalazar 4:e315db7c4dea 37 {
ghsalazar 4:e315db7c4dea 38 static char c;
ghsalazar 4:e315db7c4dea 39 static unsigned index = 0;
ghsalazar 4:e315db7c4dea 40
ghsalazar 4:e315db7c4dea 41 c = serial.getc();
ghsalazar 4:e315db7c4dea 42 message[index] = c;
ghsalazar 4:e315db7c4dea 43 index++;
ghsalazar 4:e315db7c4dea 44 message[index] = '\0';
ghsalazar 4:e315db7c4dea 45 if ((END_OF_LINE == c) || (MESSAGE_MAX_LEN+1) == index) {
ghsalazar 4:e315db7c4dea 46 semaphore_input = true;
ghsalazar 4:e315db7c4dea 47 index = 0;
ghsalazar 4:e315db7c4dea 48 }
ghsalazar 4:e315db7c4dea 49 }
ghsalazar 1:2cd22f07b879 50
ghsalazar 4:e315db7c4dea 51 void on_user_button()
ghsalazar 4:e315db7c4dea 52 {
ghsalazar 4:e315db7c4dea 53 semaphore_button = !semaphore_button;
ghsalazar 4:e315db7c4dea 54 serial.printf("\r\n%s\r\nOk > ", (semaphore_button? "Paused": "Running"));
ghsalazar 4:e315db7c4dea 55 }
ghsalazar 4:e315db7c4dea 56
ghsalazar 4:e315db7c4dea 57 char* get_delay(void)
ghsalazar 0:46aa79a823ee 58 {
ghsalazar 1:2cd22f07b879 59 static char value[VALUE_SIZE];
ghsalazar 1:2cd22f07b879 60
ghsalazar 4:e315db7c4dea 61 sprintf(value, "%lu", delay);
ghsalazar 1:2cd22f07b879 62 return value;
ghsalazar 0:46aa79a823ee 63 }
ghsalazar 0:46aa79a823ee 64
ghsalazar 4:e315db7c4dea 65 int set_delay(char* value)
ghsalazar 1:2cd22f07b879 66 {
ghsalazar 4:e315db7c4dea 67 sscanf(value, "%lu", &delay);
ghsalazar 4:e315db7c4dea 68 return MYDSC_SUCCESS;
ghsalazar 0:46aa79a823ee 69 }
ghsalazar 0:46aa79a823ee 70
ghsalazar 0:46aa79a823ee 71 int main()
ghsalazar 0:46aa79a823ee 72 {
ghsalazar 1:2cd22f07b879 73 // Setup
ghsalazar 4:e315db7c4dea 74 static char command_buffer[BUFFER_SIZE];
ghsalazar 4:e315db7c4dea 75 static char key_buffer[BUFFER_SIZE];
ghsalazar 4:e315db7c4dea 76 static char value_buffer[BUFFER_SIZE];
ghsalazar 4:e315db7c4dea 77 long unsigned delay_count = delay;
ghsalazar 1:2cd22f07b879 78
ghsalazar 1:2cd22f07b879 79 Serial serial(USBTX, USBRX);
ghsalazar 1:2cd22f07b879 80 serial.baud(9600);
ghsalazar 1:2cd22f07b879 81 serial.printf("\r\nHello, world!");
ghsalazar 1:2cd22f07b879 82
ghsalazar 4:e315db7c4dea 83 // Setting the key-value list up
ghsalazar 1:2cd22f07b879 84 mydsc_kvp_t kvp;
ghsalazar 1:2cd22f07b879 85 mydsc_kvp_init(&kvp);
ghsalazar 4:e315db7c4dea 86
ghsalazar 4:e315db7c4dea 87 // Setting the callbacks up
ghsalazar 4:e315db7c4dea 88 serial.attach(&on_rx, Serial::RxIrq);
ghsalazar 4:e315db7c4dea 89 button.fall(&on_user_button);
ghsalazar 4:e315db7c4dea 90 mydsc_kvp_append(&kvp, "delay", &get_delay, &set_delay);
ghsalazar 4:e315db7c4dea 91 serial.printf("\r\nOK > ");
ghsalazar 4:e315db7c4dea 92
ghsalazar 4:e315db7c4dea 93 led = 1;
ghsalazar 1:2cd22f07b879 94
ghsalazar 1:2cd22f07b879 95 while(1) {
ghsalazar 1:2cd22f07b879 96 // Loop
ghsalazar 1:2cd22f07b879 97 int result = 0;
ghsalazar 1:2cd22f07b879 98 char* value = "";
ghsalazar 1:2cd22f07b879 99
ghsalazar 4:e315db7c4dea 100 if (semaphore_input == true) {
ghsalazar 4:e315db7c4dea 101 semaphore_input = false;
ghsalazar 4:e315db7c4dea 102 strcpy(command_buffer, strtok(message," \015"));
ghsalazar 4:e315db7c4dea 103 if (strcmp(command_buffer, "set") == 0) {
ghsalazar 4:e315db7c4dea 104 strcpy(key_buffer, strtok(NULL," \015"));
ghsalazar 4:e315db7c4dea 105 strcpy(value_buffer, strtok(NULL, " \015"));
ghsalazar 4:e315db7c4dea 106 result = mydsc_kvp_set_value(&kvp, key_buffer, value_buffer);
ghsalazar 4:e315db7c4dea 107 if (result != MYDSC_SUCCESS)
ghsalazar 4:e315db7c4dea 108 serial.printf("\r\nError: %s", mydsc_error[result]);
ghsalazar 4:e315db7c4dea 109 }
ghsalazar 4:e315db7c4dea 110 else if (strcmp(command_buffer,"get") == 0) {
ghsalazar 4:e315db7c4dea 111 strcpy(key_buffer, strtok(NULL," \015"));
ghsalazar 4:e315db7c4dea 112 value = mydsc_kvp_get_value(&kvp,key_buffer);
ghsalazar 4:e315db7c4dea 113 if (NULL != value)
ghsalazar 4:e315db7c4dea 114 serial.printf("\r\n%s", value);
ghsalazar 4:e315db7c4dea 115 else
ghsalazar 4:e315db7c4dea 116 serial.printf("\r\nError: %s", mydsc_error[MYDSC_KVP_NO_KEY]);
ghsalazar 4:e315db7c4dea 117 }
ghsalazar 4:e315db7c4dea 118 else if (strcmp(command_buffer,"help") == 0) {
ghsalazar 4:e315db7c4dea 119 serial.printf("\r\nAvailable commands are: get help set");
ghsalazar 4:e315db7c4dea 120 }
ghsalazar 1:2cd22f07b879 121 else
ghsalazar 4:e315db7c4dea 122 serial.printf("\r\nError: %s doesn't exist\r\n", command_buffer);
ghsalazar 4:e315db7c4dea 123 serial.printf("\r\nOk > ");
ghsalazar 1:2cd22f07b879 124 }
ghsalazar 4:e315db7c4dea 125 if (!delay_count) {
ghsalazar 4:e315db7c4dea 126 led = !led;
ghsalazar 4:e315db7c4dea 127 delay_count = delay;
ghsalazar 1:2cd22f07b879 128 }
ghsalazar 4:e315db7c4dea 129 if (!semaphore_button)
ghsalazar 4:e315db7c4dea 130 delay_count--;
ghsalazar 1:2cd22f07b879 131 }
ghsalazar 0:46aa79a823ee 132 }