A simple example of a serial communication interface for setting variables in an Mbed program with help of mydsc library.
Diff: main.cpp
- 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); + } }