Clone of the "Keyboard" project combined with string>LCD calls and Serial reading for the STM32F746G-DISCO. Screen has to be reset and the font set again, and Serial must be created and destroyed each time, to dodge apparent F7 lower-level issues. Keyboard can print prompt.

Dependencies:   BSP_DISCO_F746NG mbed

Fork of Keyboard by Faberge Fabulous

main.cpp

Committer:
jknowles
Date:
2017-02-15
Revision:
3:12b494808ffa
Parent:
2:14dc9a7c52ac
Child:
4:0e5755618652

File content as of revision 3:12b494808ffa:

/*
 *******************************************************************************
 * Пример работы экранной клавиатуры на демо-плате STM32F746NG Discovery с
 * использованием стандартного набора библиотек BSP и пользовательской
 * библиотеки "keyboard.h"
 *******************************************************************************
 */

/* Добавляем библиотеку для работы с LCD */
#include "stm32746g_discovery_lcd.h"

/* Добавляем библиотеку экранной клавиатуры */
#include "keyboard.h"


#include "mbed.h"



/* Вспомогательные переменые */
uint8_t i;
uint8_t key;
uint8_t  len;

/* Пользовательский буфер */
char kb_buffer[45];


RawSerial pc(USBTX, USBRX);                 // terminal console

/*  
 * Calculates the mean and standard deviation of the array in data[] 
 */ 
void GetMeanSD(float data[], int qty, float *mn, float *sd)
{
    float sum = 0.0;
    float mean;
    float stdDev = 0.0;
    int i;
    float delt;
    for(i=0; i<qty; i++)    {
        sum = sum + data[i];
    }
    mean = sum/(float)qty;

    for(i=0; i<qty; i++) {
        delt = data[i] - mean;
        stdDev = stdDev + (delt * delt);
    }    
    *sd = sqrt(stdDev/(float)qty);
    *mn = mean;
}



/* copies comma-seperate item into 
 *   rcvr_str, returns ptr to the next or end 
 */
char *get_csv_itm(char *inbufloc, char *rcvr_str) 
{
    char *p1  =  inbufloc;
    char *p2  = rcvr_str ;
    *p2 = '\0';   /* null the rcvr first */
     if (*p1 == ',')     /* this is and empty item */
     {
        p1++;
        return(p1);
     } 
     while (*p1 != '\0'  && *p1 != ',')
     {
        *p2 = *p1;
        p1++;
        p2++;
     }
     if (*p1 == ',')
     {
        p1++;   /* move to nxt item */
     }
    *p2 = '\0';
    return(p1);
}






void start_KB_LCD()  
{
    /* Инициализация дисплея */
    /* Включаем дисплей */
    /* Настраиваем первый и второй слои дисплея */
    BSP_LCD_Init();
    BSP_LCD_LayerDefaultInit(0, LCD_FB_START_ADDRESS);
    BSP_LCD_LayerDefaultInit(1, LCD_FB_START_ADDRESS + (BSP_LCD_GetXSize() * BSP_LCD_GetYSize() * 4));
    BSP_LCD_DisplayOn();
    BSP_LCD_SelectLayer(0);
    BSP_LCD_Clear(LCD_COLOR_WHITE);
    BSP_LCD_SelectLayer(1);
    BSP_LCD_Clear(LCD_COLOR_BLACK);
    BSP_LCD_SetTransparency(0, 0);
    BSP_LCD_SetTransparency(1, 100);
    /* Настраиваем цвет фона экрана и цвет текста, а также шрифт  */
    BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
    BSP_LCD_SetBackColor(LCD_COLOR_BLACK);
    BSP_LCD_SetFont(&Font16);
    
    /* Инициализация тач-экрана*/
    BSP_TS_Init(BSP_LCD_GetXSize(), BSP_LCD_GetYSize());
   
}


void get_kbd_str(char *bufr)
{
      start_KB_LCD();
      Keyboard_init(0, 80);
      while(1)  {
          key = Keyboard_handler(bufr);
          if (key == KEY_ENTER_VALUE)   break;    // to go to another screen ?
          HAL_Delay(10);  
      }
 }  






/* Основная программа */
int main(void)
{
#define STATSIZE 128
      
      char  sbuf[128];  
      char  dbgtlk[128];
      
      char  tstr[128];
      char  bstr[32];
      char  cstr[32];
      char  estr[32];
      char  pbstr[32];
      int   ii;
      
         char *rawp;
    char *csvp;
    int   rawq; 
    int   bi, ci, ei; 
    float pbf, bf, cf, ef;
    float pbar[STATSIZE];
    float bar[STATSIZE];
    float car[STATSIZE];
    float ear[STATSIZE];
    int duds = 0;
    char  gotc;
    
    float pb_mn, pb_sd, b_mn, b_sd, c_mn, c_sd, e_mn, e_sd;
    
      char msg_b[128];
      int  u_tries;
      char u_name[128];
      char u_passwd[128];
      char out_str[128];
      
      pc.baud(9600);
     
      
      
      for (u_tries = 0;  u_tries < 2; u_tries++)
      {
         start_KB_LCD();
         BSP_LCD_SetFont(&Font24);
         strcpy(msg_b, "ENTER NAME");
         BSP_LCD_DisplayStringAtLine(1, (uint8_t *) msg_b);
         HAL_Delay(2000);      
         get_kbd_str(kb_buffer);
         strcpy(u_name, kb_buffer);
         kb_buffer[0] = '\0';
         
         start_KB_LCD();
         BSP_LCD_SetFont(&Font24);
         strcpy(msg_b, "ENTER PASSWORD");
         BSP_LCD_DisplayStringAtLine(1, (uint8_t *) msg_b);
         HAL_Delay(2000);      
         get_kbd_str(kb_buffer);
         strcpy(u_passwd, kb_buffer);
         kb_buffer[0] = '\0';
         
         start_KB_LCD(); 
         BSP_LCD_SetFont(&Font24);
         strcpy(out_str, "USER  NAME: ");
         strcat(out_str, u_name);  
         BSP_LCD_DisplayStringAtLine(2, (uint8_t *) out_str);
         strcpy(out_str, "USER PASWD: ");
         strcat(out_str, u_passwd);  
         BSP_LCD_DisplayStringAtLine(4, (uint8_t *) out_str);
         HAL_Delay(150);
     }
       
       
       
       start_KB_LCD();
       BSP_LCD_SetFont(&Font16);
       
       /*  orangecalypso */
    BSP_LCD_DisplayStringAtLine(1, (uint8_t *)"RDG  Pb     #B     #C     #E   ");
    wait(1.0);
    for (ii=0; ii<STATSIZE; ii++)   {
        
        pbf = 10.2 + (float)ii/20.1;
        bi  = 80 + ii*20;    bf = (float) bi;
        ci  = 60 + ii*6;     cf = (float) ci;
        ei  = 30 + ii*4;     ef = (float) ei;
        
        pbar[ii] = pbf;
        bar[ii]  = bf;
        car[ii]  = cf;
        ear[ii]  = ef;
            
        sprintf(tstr, "%03d  %3.2f  %05d  %05d  %05d ", ii, pbf, bi, ci, ei);
        BSP_LCD_DisplayStringAtLine((2 + (ii%5)), (uint8_t *)tstr);
                
        if (ii > 2)  {
           GetMeanSD(pbar, ii, &pb_mn, &pb_sd);
           GetMeanSD(bar, ii, &b_mn, &b_sd);
           GetMeanSD(car, ii, &c_mn, &c_sd);
           GetMeanSD(ear, ii, &e_mn, &e_sd);
                
           sprintf(tstr, "Mean %4.2f  %05d  %05d  %05d", pb_mn, (int)b_mn, (int)c_mn, (int)e_mn);
           BSP_LCD_DisplayStringAtLine((8), (uint8_t *)tstr);
           sprintf(tstr, "StDv %4.2f   %05d  %05d  %05d", pb_sd, (int)b_sd, (int)c_sd, (int)e_sd); 
           BSP_LCD_DisplayStringAtLine((9), (uint8_t *)tstr);
           
           sprintf(tstr, "                   %-04.2f%% %-04.2f%%",  100.0*(c_sd/c_mn), 100.0*(e_sd/e_mn)); 
           BSP_LCD_DisplayStringAtLine((10), (uint8_t *)tstr);
       
       
           strcpy (sbuf, "---trying serial----");    
           BSP_LCD_DisplayStringAtLine(LINE(11), (uint8_t *)sbuf);
           rawq = 0;
           strcpy (sbuf, "--currently empty---");
           rawp = sbuf;   // ptr to the buffer
           rawq = duds = 0;    // raw qty , number of duds for timeout
           gotc = 'x';  
           strcpy (dbgtlk, "---pt1---"); 
           BSP_LCD_DisplayStringAtLine((12), (uint8_t *)dbgtlk);
           while (gotc != '\r' && gotc != '\n'  && rawq < 127  && duds < 40)  {
              if (pc.readable())   {
                 duds = 0;                     // reset timeout counter
                 strcpy (dbgtlk, "---pt2---");  
                 BSP_LCD_DisplayStringAtLine(LINE(12), (uint8_t *)dbgtlk);
                 gotc =  pc.getc();
                 *rawp = gotc;
                 rawq++;
                 rawp++;
              }
              strcpy (dbgtlk, "---pt3---"); 
              BSP_LCD_DisplayStringAtLine((12), (uint8_t *)dbgtlk);
              wait(.05);   
              duds++;
           }   
           strcpy (dbgtlk, "---pt4---");   
           BSP_LCD_DisplayStringAtLine((12), (uint8_t *)dbgtlk);
           if (rawq > 0)   *rawp = '\0';
           sbuf[20] = '\0';   // just for test .... truncate the line
           BSP_LCD_DisplayStringAtLine((11), (uint8_t *)sbuf);
           /*
                char *get_csv_itm(char *inbufloc, char *rcvr_str)
                csvp = sbuf;
                csvp = get_csv_itm(csvp,   bstr);    bi = atoi(bstr);
                csvp = get_csv_itm(csvp,   cstr);    ci = atoi(cstr);
                csvp = get_csv_itm(csvp,   estr);    ei = atoi(estr); 
                csvp = get_csv_itm(csvp,   pbstr);   pbf = atof(pbstr);
            */    
        }
        wait(2.0); 
    }
    
    
    
    
    
       
             
       
       
       
       
       
       
       
}