Use STM32 platform, install FreeRTOS, implement UART CLI for next functionality: - light on LED for specified period in seconds, other commands are available while LED is ON. When after specified period led is off - notify user with text message on same console - set/get brightness for LED - return state of user button - enable/disable button monitoring, asynchronously monitor state of button and if it's state changed(pressed/unpressed) notify user with text message on same console - help CLI must be user friendly as much as possible. Result: you can connect device to PC and work with CLI

main.cpp

Committer:
gjgsd
Date:
2017-12-10
Revision:
5:5195884584d6
Parent:
4:d4aeacb47955

File content as of revision 5:5195884584d6:

#include "mbed.h"


void print_help() //help message
{   
printf("***********************************************************\r\n");
printf("* LEDON:x        - set time for LED to be ON              *\r\n");
printf("*                - x - time in seconds (range 1-1000)     *\r\n");
printf("*  LEDOFF        - turn LED off                           *\r\n");
printf("*  LEDSTATE      - print current LED state                *\r\n");
printf("*  BRIGHTSET:x   - set LED brightnes                      *\r\n");
printf("*                  x - range 0-7 (0 - low, 7 - high)      *\r\n");
printf("*  BRIGHTGET     - get LED brightnes                      *\r\n");
printf("*  BUTTONGET     - get user button monitorring state      *\r\n");
printf("*  BUTTONSTATE   - get user button state                  *\r\n");
printf("*  BUTTONENABLE  - enable button monitorring              *\r\n");
printf("*  BUTTONDISABLE - disable button monitorring             *\r\n");
printf("*  HELP          - print available list of commands       *\r\n");
printf("***********************************************************\r\n");   
}

void print_welcome() //welcome message
{
printf("\r\n"); 
printf("***********************************************************\r\n");
printf("*                                                         *\r\n");
printf("*                        WELCOME!                         *\r\n");
printf("*                                                         *\r\n");
printf("* To turn LED on for X seconds type:                      *\r\n");
printf("* LEDON:x     where [x] is specified period of seconds    *\r\n");
printf("*             x range 1-1000                              *\r\n");
printf("*                                                         *\r\n");
printf("***********************************************************\r\n");
}

void print_fc_off() //fault code message when LED is off
{
printf("WRONG INPUT\r\n"); 
printf(" To turn LED on type:   \r\n");
printf(" LEDON:x     where [x] is specified period of seconds    \r\n");
printf("             x range 1-1000                              \r\n");
}
    
void print_fc_on() //fault code message when LED is on
{
printf("WRONG INPUT\r\n"); 
printf(" To see available list of commands type HELP\r\n");
}    

//const
 int const LED_ON = 1;
 int const BRIGHT = 2;
 int const ON = 1;
 int const OFF = 0;
 int const B_ON = 0;
 int const B_OFF = 1;

//threads
Thread lamp_thread;
Thread timer_thread;

//variables
int print = 1;
char input [64];
int lamp_bright = 4;
bool lamp_state = false;
int lamp_time;
int state = OFF;
int b_state = OFF;
int b_push = B_OFF;

//interfaces
DigitalIn button(PC_13);
DigitalOut led2(LED1);
PwmOut led1(D11);

//pow
int power(int x, int n) {
    if(n == 0) return 1;
    return x * power(x, n - 1);
 }

// parse string and calculate input integer data
int strtoint(char instring[64], int slogan) 
{
    int str_len = strlen(instring);
    int result = 0;
    switch (slogan){
    case LED_ON: // "LEDON:"
      if (str_len > 10) return -2; // too long time
      for(int i = 6; i < str_len; i++) 
      {
        if(instring[i] > 47 && instring[i] < 58) // if input is digit
        {
          result = (result * 10) + instring[i] - 48;
        }
        else  // not a digit
        {
          result = -1;
          break;
          }
      }
      if (result > 1000) result = -2;
      break;
      
    case BRIGHT: //BRIGHTSET:
      if (str_len > 11) return -2; // too long time
      if(instring[10] > 55) return -2; // too long time
      if(instring[10] > 47 && instring[10] < 58) // if input is digit
        result = instring[10] - 48; 
      else  // not a digit
          result = -1;
      break;
    default:
      break;
    }
    return result;
}

//translate to CAPS
void caps()
{
    for(int i = 0; i < 63; i++) 
    {
      if(input[i] > 96 && input[i] < 123)
        input[i] = input[i] - 32;
    }
    printf("\r\n<%s\r\n",input);
}

//thread lamp, while led is off
void led_off()
{
        if (!strncmp (input,"LEDON:",6))
        {
          lamp_time = strtoint(input, LED_ON);
          switch (lamp_time){
            case 0:
            case -2: // wrong time time
              printf("WRONG TIME IS SPECIFIED. RANGE IS 1-1000\r\n");
              break;
          case -1:
              printf("PLEASE USE DIGITS FOR TIME SPECIFICATION.\r\n");
              break;
          default:
              printf("LED IS ON FOR %d SECONDS\r\n",lamp_time);
              led1 = power(2,lamp_bright) * 0.01;
              state = ON;
          }
        }
        else
        {
           print_fc_off();
        }
}

//thread lamp, while led is on
void led_on()
{
    if (!strcmp (input,"LEDOFF")) //turn led off
    {
        lamp_time = 1;
    }
    else if(!strcmp (input,"LEDSTATE")) //print LED state
    {
        printf("LED IS ON FOR %d SECONDS\r\n",lamp_time);
    }
    else if(!strncmp(input,"BRIGHTSET:",10)) //BRIGHTSET:x
    {
        int bright = strtoint(input, BRIGHT);
        switch (bright){
          case -2: // wrong brightness
              printf("WRONG BRIGHTNESS IS SPECIFIED. RANGE IS 0-7\r\n");
              break;
          case -1:
              printf("PLEASE USE DIGITS FOR BRIGHTNESS SPECIFICATION.\r\n");
              break;
          default:
              lamp_bright = bright;
              led1 = power(2,lamp_bright) * 0.01;
              printf("BRIGHTNESS IS SET TO %d\r\n",lamp_bright);
          }
    }
    else if(!strcmp (input,"BRIGHTGET")) //print brightness level
    {
        printf("BRIGHTNESS IS SET TO %d\r\n",lamp_bright);
    }
    else if(!strcmp (input,"BUTTONGET")) //print user button state
    {
        printf("BUTTON MONITORRING IS SET TO %s\r\n",b_state?"ON":"OFF");
    }
    else if(!strcmp (input,"BUTTONENABLE")) //enable button monitoring
    {
        b_state = ON;
        printf("BUTTON MONITORRING IS SET TO ON\r\n");
    }   
    else if(!strcmp (input,"BUTTONDISABLE")) //disable button monitoring
    {
        b_state = OFF;
        printf("BUTTON MONITORRING IS SET TO OFF\r\n");
    }  
    else if(!strcmp (input,"BUTTONSTATE")) //get button state
    {
        printf("BUTTON IS %sPUSHED\r\n",button?"NOT ":"");
    }  
    else if(!strcmp (input,"HELP")) //print help message
    {
        print_help();
    }
    else if (!strncmp (input,"LEDON:",6)) // reinit led timer
    {
        lamp_time = strtoint(input, LED_ON);
        switch (lamp_time){
        case 0:
        case -2: // wrong time time
            printf("WRONG TIME IS SPECIFIED. RANGE IS 1-1000\r\n");
            break;
        case -1:
            printf("PLEASE USE DIGITS FOR TIME SPECIFICATION.\r\n");
            break;
        default:
            printf("LED IS ON FOR %d SECONDS\r\n",lamp_time);
            led1 = power(2,lamp_bright) * 0.01;
            state = ON;
        }
    }
    else // wrong input
    {
        print_fc_on();
    }
}

//thread lamp, main function
void led()
{
    while (true)
    {
        scanf("%s",input);
        caps();
        switch (state){
        case OFF:
          led_off();
          break;
        case ON:
          led_on();
          break;
        default:
          break;
          }
     }
}

//thread timer, main function
void timer()
{
    while(true){
      while(state == ON)
      {
        lamp_time --;
        if (lamp_time == 0)
        {
          led1 = 0; 
          printf("LED IS TURNED OFF\r\n");
          lamp_thread.start(led_off);
          state = OFF;
          b_state = OFF;
        }
        wait(1);
      }
      wait(1);
    }
}

int main()
{
     print_welcome();
     lamp_thread.start(led);
     timer_thread.start(timer);

    while (true) {
        
        if (state == ON && b_state == ON)
        {
            if (button != b_push)
            {
              b_push = button;
              printf("BUTTON IS %sPUSHED\r\n",b_push?"NOT ":"");
            }
        }
        wait(0.2);
        
        }

}