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

Dependencies:   mbed mydsc

main.cpp

Committer:
ghsalazar
Date:
2020-03-04
Revision:
2:f884fffe2c4b
Parent:
1:2cd22f07b879
Child:
4:e315db7c4dea

File content as of revision 2:f884fffe2c4b:

/** 
    @file   main.cpp
    @author Gastón SALAZAR  <gaston_salazar@yahoo.com>
*/

#include "mbed.h"
#include "stdio.h"
#include "stdlib.h"
#include "ctype.h"

#include "mydsc_kvp.h"

const unsigned VALUE_SIZE = 128;

float kp = 0;
float ki = 0;

char* get_proportional(void)
{
    static char value[VALUE_SIZE];
    
    sprintf(value, "%f", kp);
    return value;       
}

int set_proportional(char* value)
{
    sscanf(value, "%f", &kp);
    return MYDSC_KVP_SUCCESS;
}

char* get_integral(void)
{
    static char value[VALUE_SIZE];
    
    sprintf(value, "%f", ki);
    return value;       
}

int set_integral(char* value)
{
    sscanf(value, "%f", &ki);
    return MYDSC_KVP_SUCCESS;
}

int main()
{
    // 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);
    }
}