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

Dependencies:   mbed mydsc

Revision:
1:2cd22f07b879
Parent:
0:46aa79a823ee
Child:
2:f884fffe2c4b
--- a/main.cpp	Tue Mar 12 20:07:54 2019 +0000
+++ b/main.cpp	Fri Feb 28 20:07:32 2020 +0000
@@ -4,38 +4,104 @@
 */
 
 #include "mbed.h"
+#include "stdio.h"
+#include "stdlib.h"
+#include "ctype.h"
 
-const unsigned long DELAY   = 5000000UL;
+#include "mydsc_kvp.h"
 
-Serial  serial(USBTX, USBRX);
+const unsigned VALUE_SIZE = 128;
 
-void 
-setup()
+float kp = 0;
+float ki = 0;
+
+char* get_proportional(void)
 {
-    serial.printf("Hello, world!\n");
-    serial.printf("Display: %x\n", 0);
+    static char value[VALUE_SIZE];
+    
+    sprintf(value, "%f", kp);
+    return value;       
 }
 
-void
-loop()
+int set_proportional(char* value)
 {
-    static unsigned short   display_count   = 0;
-    static unsigned long    delay_count     = DELAY;    
+    sscanf(value, "%f", &kp);
+    return MYDSC_KVP_SUCCESS;
+}
 
-    if (delay_count == 0)
-      {
-        display_count++;
-        display_count &= 0x0F;
-        serial.printf("Display: %x\n", display_count);
-        delay_count = DELAY;
-      }
+char* get_integral(void)
+{
+    static char value[VALUE_SIZE];
     
-    delay_count--;
+    sprintf(value, "%f", ki);
+    return value;       
+}
+
+int set_integral(char* value)
+{
+    sscanf(value, "%f", &kp);
+    return MYDSC_KVP_SUCCESS;
 }
 
 int main()
 {
-    setup();
-    while(1)
-        loop();
+    // Setup
+    const unsigned short BUFFER_SIZE    = 128;
+    static char command_buffer[BUFFER_SIZE];
+    static char key_buffer[BUFFER_SIZE];
+    static char value_buffer[BUFFER_SIZE];
+
+    Serial      serial(USBTX, USBRX);
+    serial.baud(9600);
+    serial.format(8, SerialBase::None, 1);
+    serial.printf("\r\nHello, world!");   
+
+    mydsc_kvp_t kvp; 
+    mydsc_kvp_init(&kvp);
+    mydsc_kvp_append(&kvp, "proportional",  &get_proportional,
+                                            &set_proportional);
+    mydsc_kvp_append(&kvp, "integral",  &get_integral, &set_integral);
+    serial.printf("\r\nVersion:\t%s", mydsc_kvp_get_value(&kvp, "version"));   
+
+    while(1) {
+        // Loop
+        int result = 0;
+        char* value = "";
+        
+        serial.printf("\r\n> ");
+ 
+        serial.scanf("%s",command_buffer);
+        if (strcmp(command_buffer, "set") == 0) {
+            serial.scanf("%s",key_buffer);
+            serial.scanf("%s",value_buffer);
+            result = mydsc_kvp_set_value(&kvp, key_buffer, value_buffer);
+
+            if (result == MYDSC_KVP_SUCCESS)
+                serial.printf("\r\nOk");
+            else if (result == MYDSC_KVP_NO_SET)
+                serial.printf("\r\nError: Value can't be changed");            
+            else if (result == MYDSC_KVP_NO_KEY)
+                serial.printf("\r\nError: There isn't such setting");
+            else if (result == MYDSC_KVP_WRONG_VALUE)
+                serial.printf("\r\nError: The value is wrong");
+            else
+                serial.printf("\r\nError: Unknown error");
+        }
+
+        else if (strcmp(command_buffer,"get") == 0) {
+            serial.scanf("%s",key_buffer);
+            value = mydsc_kvp_get_value(&kvp,key_buffer);
+            if (NULL != value)
+                serial.printf("\r\n%s", value);
+            else
+                serial.printf("\r\nError: There isn't such setting");            
+            serial.printf("\r\nOk");            
+        }
+        else if (strcmp(command_buffer,"help") == 0) {
+            serial.printf("\r\nAvailable commands are: get help set");
+            serial.printf("\r\nOk");            
+        }
+        else
+            serial.printf("\r\nError: %s doesn't exist\r\n", command_buffer);
+    }
 }