last version

Dependencies:   LCD_DISCO_F429ZI mbed BSP_DISCO_F429ZI

Files at this revision

API Documentation at this revision

Comitter:
bolko
Date:
Tue Jun 09 11:23:48 2020 +0000
Parent:
1:d562d46c33b7
Commit message:
look;

Changed in this revision

TS_DISCO_F429ZI.lib Show diff for this revision Revisions of this file
command_decoder.cpp Show annotated file Show diff for this revision Revisions of this file
command_decoder.h Show annotated file Show diff for this revision Revisions of this file
keyboard_ts.cpp Show diff for this revision Revisions of this file
keyboard_ts.h Show diff for this revision Revisions of this file
keyboard_ts_lcd.cpp Show diff for this revision Revisions of this file
keyboard_ts_lcd.h Show diff for this revision Revisions of this file
led_lcd.cpp Show diff for this revision Revisions of this file
led_lcd.h Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
servo_gui.cpp Show annotated file Show diff for this revision Revisions of this file
servo_gui.h Show annotated file Show diff for this revision Revisions of this file
--- a/TS_DISCO_F429ZI.lib	Wed May 20 07:59:22 2020 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-https://os.mbed.com/teams/ST/code/TS_DISCO_F429ZI/#4f8b6df8e235
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/command_decoder.cpp	Tue Jun 09 11:23:48 2020 +0000
@@ -0,0 +1,80 @@
+#include "command_decoder.h"
+#include <string.h>
+#include <iostream>
+#include "mbed.h"
+
+struct Keyword asKeywordList[MAX_KEYWORD_NR]=
+    {
+        {ID, "id"},
+        {CALLIB, "callib"},
+        {GOTO, "goto"},
+        {STEP, "step"}
+    };
+struct Token asToken[MAX_TOKEN_NR];
+enum State {TOKEN,DELIMITER};
+unsigned char ucTokenNr = 0;
+
+unsigned char CommandDecoder::ucFindTokensInString(char *pcString){
+    char * pCurrentToken;
+    unsigned char ucTokenCounter = 0;
+    
+    pCurrentToken = strtok(pcString, " ");
+    while(NULL != pCurrentToken && ucTokenCounter < MAX_TOKEN_NR){
+        asToken[ucTokenCounter].uValue.pcString = pCurrentToken;
+        ucTokenCounter++;
+        pCurrentToken = strtok(NULL, " ");
+    }    
+    return ucTokenCounter;
+}
+
+
+enum Result CommandDecoder::eStringToKeyword(char pcStr[],enum KeywordCode *peKeywordCode){
+    unsigned char ucKeywordCounter;
+    for(ucKeywordCounter=0;ucKeywordCounter<MAX_KEYWORD_NR;ucKeywordCounter++)
+    {
+        if (strcmp(pcStr,asKeywordList[ucKeywordCounter].cString) == 0)
+        {
+            *peKeywordCode = asKeywordList[ucKeywordCounter].eCode;
+            return OK;
+        }
+    }
+    return FAIL;
+};
+
+
+enum Result CommandDecoder::DecodeTokens(){
+    
+    unsigned int uiNumber;
+    unsigned char ucTokenIndex;
+    enum KeywordCode eKeyword;
+    
+    for(ucTokenIndex=0; ucTokenIndex < ucTokenNr; ucTokenIndex++){
+        if((eStringToKeyword (asToken[ucTokenIndex].uValue.pcString, &eKeyword))== OK){
+            asToken[ucTokenIndex].eType = KEYWORD;
+            asToken[ucTokenIndex].uValue.eKeyword=eKeyword;
+        }
+        else if(sscanf(asToken[ucTokenIndex].uValue.pcString,"%x",&uiNumber) == 1){ 
+            asToken[ucTokenIndex].eType = NUMBER;
+            asToken[ucTokenIndex].uValue.uiNumber = uiNumber;       
+        }
+        else{
+            asToken[ucTokenIndex].eType = STRING;
+        }
+    }
+    return OK;
+}
+
+
+void CommandDecoder::ReplaceCharactersInString(char pcString[], char cOldChar,char cNewChar){
+    char *pString = pcString;
+    while((pString = strchr(pString,cOldChar)) != NULL){
+        *pString++ = cNewChar;
+    }    
+}    
+
+
+void CommandDecoder::DecodeMsg(char *pcString){
+    ucTokenNr = ucFindTokensInString(pcString);
+    ReplaceCharactersInString(pcString,' ', NULL);
+    DecodeTokens();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/command_decoder.h	Tue Jun 09 11:23:48 2020 +0000
@@ -0,0 +1,47 @@
+#ifndef COMMAND_DECODER_H
+#define COMMAND_DECODER_H
+#include "mbed.h"
+#include <string>
+
+#define MAX_TOKEN_NR 2 
+#define MAX_KEYWORD_STRING_LTH 6
+#define MAX_KEYWORD_NR 4
+#define DELIMITER_CHAR 0x20
+
+enum TokenType { KEYWORD, NUMBER, STRING};
+enum KeywordCode {ID,CALLIB,GOTO,STEP};
+enum Result { OK, FAIL };
+
+
+union TokenValue {
+    enum KeywordCode eKeyword;
+    unsigned int uiNumber;
+    char *pcString;
+};
+
+struct Token {
+    enum TokenType eType; 
+    union TokenValue uValue;
+};
+
+struct Keyword {
+    enum KeywordCode eCode;
+    char cString[MAX_KEYWORD_STRING_LTH + 1]; 
+};
+
+class CommandDecoder {
+    public:
+        void DecodeMsg(char *pcString);
+        struct Token asToken[MAX_TOKEN_NR];
+        unsigned char ucTokenNr;
+    private:
+        enum Result eHexStringToUInt(char pcStr[],unsigned int *puiValue);
+        void ReplaceCharactersInString(char pcString[], char cOldChar,char cNewChar);
+        void TokenizeString(char *pcString);
+        unsigned char ucFindTokensInString(char *pcString);
+        enum Result eStringToKeyword(char pcStr[],enum KeywordCode *peKeywordCode);
+        enum Result DecodeTokens();
+       
+};    
+
+#endif
\ No newline at end of file
--- a/keyboard_ts.cpp	Wed May 20 07:59:22 2020 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
-#include "keyboard_ts.h"
-#include "TS_DISCO_F429ZI.h"
-
-TS_DISCO_F429ZI ts;
-
-KeyboardTs::KeyboardTs(uint8_t WhichColumn){
-        ts.Init(240,320);
-        ui8Column = ((WhichColumn > 1) && (WhichColumn <= 3)) ? WhichColumn: 1;
-};
-enum KeyboardState KeyboardTs::eRead(void){
-        TS_StateTypeDef TS_State; 
-        ts.GetState(&TS_State);
-        
-             if(TS_State.TouchDetected &&(TS_State.X > (80*(ui8Column-1))) && (TS_State.X<(80*ui8Column))){
-                 if((TS_State.Y<80)){
-                     return BUTTON_0;
-                 }
-                else if((TS_State.Y >= 80) && (TS_State.Y<160)){
-                    return BUTTON_1;
-                }
-                else if((TS_State.Y >= 160)&& (TS_State.Y<240)){
-                    return BUTTON_2;
-                }
-                else if((TS_State.Y >= 240)&& (TS_State.Y<320)){
-                    return BUTTON_3; 
-                }               
-             }
-             return RELEASED;
-};
\ No newline at end of file
--- a/keyboard_ts.h	Wed May 20 07:59:22 2020 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-#ifndef KEYBOARD_TS_H
-#define KEYBOARD_TS_H
-#include "mbed.h"
-
-enum KeyboardState{
-    BUTTON_0,
-    BUTTON_1,
-    BUTTON_2,
-    BUTTON_3,
-    RELEASED
-};
-    
-class KeyboardTs{
-    public:
-        enum KeyboardState eRead();
-        KeyboardTs(uint8_t);
-    private:
-        uint8_t ui8Column;
-};
-
-
-#endif
\ No newline at end of file
--- a/keyboard_ts_lcd.cpp	Wed May 20 07:59:22 2020 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-#include "keyboard_ts_lcd.h"
-
-KeyboardTsLcd::KeyboardTsLcd(uint8_t ui8Column) {
-        pKeyboard = new KeyboardTs(ui8Column);
-        pLed = new LedLcd(ui8Column);
-    };
-
-
-enum KeyboardState KeyboardTsLcd::eRead(){
-    switch(pKeyboard->eRead()){
-            case BUTTON_0:
-                pLed->On(0);
-                return BUTTON_0;
-            case BUTTON_1:
-                pLed->On(1);
-                return BUTTON_1;
-            case BUTTON_2:
-                pLed->On(2);
-                return BUTTON_2;
-            case BUTTON_3:
-                pLed->On(3);
-                return BUTTON_3;
-            default :
-                pLed->On(4);
-                return RELEASED;         
-         }   
-    };
\ No newline at end of file
--- a/keyboard_ts_lcd.h	Wed May 20 07:59:22 2020 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-#ifndef KEYBOARD_TS_LCD_H
-#define KEYBOARD_TS_LCD_H
-#include "led_lcd.h"
-#include "keyboard_ts.h"
-
-class KeyboardTsLcd{
-    public:
-    KeyboardTsLcd(uint8_t ui8Column);
-    enum KeyboardState eRead(); 
-    
-    private:
-    KeyboardTs *pKeyboard;
-    LedLcd *pLed;
-    
-    };
-
-
-#endif
--- a/led_lcd.cpp	Wed May 20 07:59:22 2020 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,51 +0,0 @@
-#include "led_lcd.h"
-#include "mbed.h"
-#include "LCD_DISCO_F429ZI.h"
-
-LCD_DISCO_F429ZI lcd;
-
-LedLcd::LedLcd(uint8_t WhichColumn){
-    lcd.Clear(LCD_COLOR_BLACK);
-    ui8Column = ((WhichColumn > 1) && (WhichColumn <= 3)) ? WhichColumn: 1;
-      
-};
-
-void LedLcd::DrawLed(uint8_t ui8LedNumber, LedState eLedState){
-     char cBuffer[2];
-      
-     lcd.SetTextColor(LCD_COLOR_GREEN);
-     lcd.DrawRect(((ui8Column-1)*80),80*ui8LedNumber,80,80);
-     
-     if(eLedState == LED_PRESSED){
-          lcd.SetTextColor(LCD_COLOR_GREEN); 
-     }
-    else if(eLedState == LED_RELEASED){
-          lcd.SetTextColor(LCD_COLOR_BLUE); 
-    }
-    
-     lcd.FillRect(((ui8Column-1)*80)+2,80*ui8LedNumber+2,77,77);
-     
-     BSP_LCD_SetFont(&Font24);
-     lcd.SetBackColor(LCD_COLOR_RED);
-     sprintf(cBuffer,"%d",ui8LedNumber);
-     lcd.SetTextColor(LCD_COLOR_WHITE);   
-     lcd.DisplayStringAt(((ui8Column-1)*80)+1,80*ui8LedNumber+1,(uint8_t *)&cBuffer,LEFT_MODE);
-};     
-        
-/*void LedLcd::On(uint8_t ui8LedNumber){     
-    
-    for(uint8_t ui8LedCounter=0; ui8LedCounter<4; ui8LedCounter++){
-            if(ui8LedCounter == ui8LedNumber){ 
-                DrawLed(ui8LedCounter,LED_PRESSED);
-            }
-            else {
-                DrawLed(ui8LedCounter,LED_RELEASED);
-            }
-    }*/
-void LedLcd::On(uint8_t ui8LedNumber){ 
-
-     for(uint8_t ui8LedCounter = 0; ui8LedCounter <= 3; ui8LedCounter++){
-            DrawLed(ui8LedCounter, LED_RELEASED);
-     } 
-     DrawLed(ui8LedNumber,LED_PRESSED);                                                  
-};  
--- a/led_lcd.h	Wed May 20 07:59:22 2020 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-#ifndef LED_LCD_H
-#define LED_LCD_H
-#include "LCD_DISCO_F429ZI.h"
-
-enum LedState {
-    LED_PRESSED,
-    LED_RELEASED
-    };
-
-
-class LedLcd{
-    public:
-        LedLcd(uint8_t);
-        void On(uint8_t);
-    private:
-        void DrawLed(uint8_t,LedState);
-        uint8_t ui8Column;
-    };
-    
-#endif
\ No newline at end of file
--- a/main.cpp	Wed May 20 07:59:22 2020 +0000
+++ b/main.cpp	Tue Jun 09 11:23:48 2020 +0000
@@ -1,30 +1,106 @@
 #include "mbed.h"
-#include "keyboard_ts_lcd.h"
+#include "command_decoder.h"
+#include "servo_gui.h"
+
+#define CR '\r'
+
+Serial MyUART(USBTX, USBRX,9600);
+ServoGui MyServoGui;
+CommandDecoder MyCommandDecoder;
 
-int main()
-{  
-    KeyboardTsLcd MyKeyboardTsLcd(1);
-    LedLcd MyLed(3);
+uint8_t puts(char *cBufferTransmit, unsigned char ucBufferSize){
+    unsigned char ucCharacterCounter;   
+    
+    for(ucCharacterCounter = 0; ucCharacterCounter <= ucBufferSize; ucCharacterCounter++){      
+        if(cBufferTransmit[ucBufferSize] == NULL){
+        break;
+        }
+    }       
+    if(ucCharacterCounter == ucBufferSize){
+        return 1;
+    }
+        
+    for(unsigned char ucCharacterCounter = 0; cBufferTransmit[ucCharacterCounter] != NULL; ucCharacterCounter++){
+        MyUART.putc(cBufferTransmit[ucCharacterCounter]); 
+    }                              
+    MyUART.putc(CR);           
+    return 0;     
+  } 
   
-    while(1){  
-       switch(MyKeyboardTsLcd.eRead()){
-           case BUTTON_0:
-                MyLed.On(3);
+uint8_t gets(char *cBufferReceived, unsigned char ucBufferSize){
+    unsigned char ucCharacterCounter = 0;
+    
+    while(ucCharacterCounter < ucBufferSize){
+        cBufferReceived[ucCharacterCounter] = MyUART.getc(); 
+        if(cBufferReceived[ucCharacterCounter] == CR){
+           cBufferReceived[ucCharacterCounter] = NULL; 
+           return 0;        
+        }
+        ucCharacterCounter++;
+    }    
+    return 1;
+} 
+
+void TokenHandling(){  
+    char cID[] = "id_0x777";
+    char cUnkownCommand[] = "unknowncommand";
+    char cOK[] = "ok";
+    
+    if((MyCommandDecoder.ucTokenNr>0) && (MyCommandDecoder.asToken[0].eType == KEYWORD)){
+       switch(MyCommandDecoder.asToken[0].uValue.eKeyword){
+            case ID:
+                puts(cID);
                 break;
-            case BUTTON_1:
-                MyLed.On(2);
-                break; 
-            case BUTTON_2:
-                MyLed.On(1);
-                break;    
-            case BUTTON_3:
-                MyLed.On(0);
+            case CALLIB:
+                MyServoGui.ServoCallib();
+                puts(cOK);
+                break;
+            case GOTO:
+                if(MyCommandDecoder.asToken[1].eType == NUMBER){
+                  MyServoGui.ServoGoTo(MyCommandDecoder.asToken[1].uValue.uiNumber);
+                  MyServoGui.sServo.uiPreviousPosition = MyCommandDecoder.asToken[1].uValue.uiNumber;   
+                  puts(cOK);                         
+                }
+                else{
+                   puts(cUnkownCommand);
+                }
                 break;   
+            case STEP:
+                if(MyCommandDecoder.asToken[1].eType == NUMBER){
+                  MyServoGui.ServoGoTo(MyServoGui.sServo.uiPreviousPosition + MyCommandDecoder.asToken[1].uValue.uiNumber);
+                  MyServoGui.sServo.uiPreviousPosition = MyServoGui.sServo.uiPreviousPosition + MyCommandDecoder.asToken[1].uValue.uiNumber; 
+                  puts(cOK); 
+                }
+                else{
+                 puts(cUnkownCommand);
+                }  
+                break;
             default:
-                MyLed.On(4);
-            break; 
+                puts(cUnkownCommand);
+                break;                                                                   
         }
-     wait(0.1); 
-     } 
+    }
+    else {
+        puts(cUnkownCommand,sizeof(cUnkownCommand));
+    }       
+}              
+
+int main(){    
+   char cUnkownCommand[] = "unkowncommand"; 
+   char cBufferReceived[10];
+
+    while(1){   
+          
+          if(gets(cBufferReceived,sizeof(cBufferReceived)) == 0){
+              MyCommandDecoder.DecodeMsg(cBufferReceived);
+              TokenHandling();
+              
+          }
+          else{
+              puts(cUnkownCommand,sizeof(cUnkownCommand));
+          } 
+                              
+    }     
 }
 
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/servo_gui.cpp	Tue Jun 09 11:23:48 2020 +0000
@@ -0,0 +1,97 @@
+#include "servo_gui.h"
+
+
+DigitalIn MyCallibButton(USER_BUTTON);
+
+ServoGui::ServoGui(){
+    lcd.Clear(LCD_COLOR_WHITE);
+    ui8ActualLedPoint = 0;
+    DrawDisk();
+    LedOn(0);
+    
+}
+
+enum eState ServoGui::eReadDetector(){
+    if(MyCallibButton == 1){
+        return ON;
+    }
+    else {
+        return OFF;
+    }    
+}    
+
+void ServoGui::ServoCallib(){
+    while(eReadDetector() == OFF){
+        LedStep(RIGHT);
+        wait(DELAY);    
+    }
+    sServo.uiCurrentPosition = ui8ActualLedPoint;
+    sServo.uiDesiredPosition = ui8ActualLedPoint;
+    
+}
+
+void ServoGui::ServoGoTo(uint8_t ui8Position){
+  sServo.uiDesiredPosition = ui8Position;
+  while(sServo.uiCurrentPosition != sServo.uiDesiredPosition){
+      if(sServo.uiCurrentPosition < sServo.uiDesiredPosition){
+            LedStep(LEFT);
+            sServo.uiCurrentPosition++;
+       }
+       else if(sServo.uiCurrentPosition > sServo.uiDesiredPosition){
+           LedStep(RIGHT);
+           sServo.uiCurrentPosition--;   
+       } 
+       wait(DELAY);  
+  }   
+}
+
+void ServoGui::DrawLed(uint8_t ui8LedNumber){
+    
+    if(ui8LedNumber <= 3){
+        lcd.SetTextColor(LCD_COLOR_BLACK);
+        lcd.DrawCircle(LED_X + LED_DISTANCE*ui8LedNumber,LED_Y,LED_RADIUS); 
+    }
+    if(eLedStates[ui8LedNumber] == ON){
+        lcd.SetTextColor(LCD_COLOR_BLUE);
+    }
+    else{
+        lcd.SetTextColor(LCD_COLOR_WHITE);
+    }
+    
+    lcd.FillCircle(LED_X+LED_DISTANCE*ui8LedNumber,LED_Y ,LED_RADIUS-2);
+}  
+
+
+void ServoGui::LedOn(uint8_t ui8LedNumber){
+      for(uint8_t ui8LedCounter = 0; ui8LedCounter <= 3; ui8LedCounter++){
+            eLedStates[ui8LedCounter] = OFF;
+            DrawLed(ui8LedCounter);
+      }
+          if(ui8LedNumber <= 3){
+            eLedStates[ui8LedNumber] = ON;
+            DrawLed(ui8LedNumber);
+          }    
+}  
+
+void ServoGui::LedStep(enum eDirection eWhere){
+    if(eWhere == RIGHT){
+        ui8ActualLedPoint = ui8ActualLedPoint + 1;
+    }
+    else if(eWhere == LEFT){
+        ui8ActualLedPoint = ui8ActualLedPoint - 1;
+    }
+    LedOn(ui8ActualLedPoint%4);
+    DrawDisk();   
+}
+
+void ServoGui::DrawDisk(){
+    double dAngleOfPointer = (ui8ActualLedPoint%MAX_STEPS);
+    dAngleOfPointer = dAngleOfPointer/ MAX_STEPS;
+    dAngleOfPointer = dAngleOfPointer * 2 * PI;
+    
+    lcd.SetTextColor(LCD_COLOR_BLACK);
+    lcd.FillCircle(DISK_X,DISK_Y,DISK_RADIUS);
+    lcd.SetTextColor(LCD_COLOR_WHITE);
+    lcd.DrawLine(DISK_X,DISK_Y,DISK_X+(DISK_RADIUS * cos(dAngleOfPointer)), DISK_Y + (DISK_RADIUS * sin(dAngleOfPointer)));
+    lcd.FillCircle(DISK_X,DISK_Y,SMALL_DISK_RADIUS);    
+}    
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/servo_gui.h	Tue Jun 09 11:23:48 2020 +0000
@@ -0,0 +1,48 @@
+#ifndef SERVO_GUI_H
+#define SERVO_GUI_H
+#include "LCD_DISCO_F429ZI.h"
+#include "mbed.h"
+
+#define DISK_X 120
+#define DISK_Y 120
+#define DISK_RADIUS 100
+#define SMALL_DISK_RADIUS 20
+#define MAX_STEPS 16
+#define PI 3.14159
+#define LED_X 30
+#define LED_Y 290
+#define LED_DISTANCE 60
+#define LED_RADIUS 20
+#define DELAY 0.25
+
+
+enum eState {ON,OFF};
+enum eDirection {LEFT,RIGHT};
+
+struct Servo {
+    unsigned int uiCurrentPosition;
+    unsigned int uiDesiredPosition;
+    unsigned int uiPreviousPosition;
+};
+
+class ServoGui{
+    public:
+        ServoGui();
+        void ServoCallib();
+        void ServoGoTo(uint8_t ui8Position);
+        struct Servo sServo;
+    private:
+        LCD_DISCO_F429ZI lcd;
+        uint8_t ui8ActualLedPoint;
+        void DrawDisk();
+        enum eState eLedStates[3];
+        void LedOn(uint8_t ui8LedNumber);
+        void DrawLed(uint8_t);
+        enum eState eReadDetector();
+        void LedStep(enum eDirection eWhere);      
+};     
+
+
+
+
+#endif