Added terminal application for embedded devices
This commit is contained in:
parent
4cc886ee5a
commit
29629e2a47
304
Terminal.c
Normal file
304
Terminal.c
Normal file
@ -0,0 +1,304 @@
|
||||
/*
|
||||
* Terminal.c
|
||||
*
|
||||
* Created on: Jul 13, 2021
|
||||
* Author: angoosh
|
||||
*/
|
||||
#include "Terminal.h"
|
||||
#include "main.h"
|
||||
|
||||
|
||||
uint8_t pointr = 0;
|
||||
uint8_t RX[1];
|
||||
uint8_t termRxBuffer[TERM_BUFFER_SIZE];
|
||||
|
||||
|
||||
UART_HandleTypeDef huart3;
|
||||
|
||||
|
||||
uint8_t msgOk[] = {"\nOK\n"};
|
||||
uint8_t msgBlank[] = {"> "};
|
||||
uint8_t msgNoGpioPort[] = {"\nNo such GPIO port\n"};
|
||||
uint8_t msgUnknownParameter[] = {"\nUnknown parameter\n"};
|
||||
uint8_t msgNL = '\n';
|
||||
|
||||
/**
|
||||
* @brief Callback for uart byte by byte receive
|
||||
*/
|
||||
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
|
||||
termRxBuffer[pointr] = RX[0];
|
||||
pointr++;
|
||||
HAL_UART_Receive_IT(&huart3, RX, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Readout whole receive buffer, for debug
|
||||
*/
|
||||
void PrintRxBuffer(){
|
||||
for(int l = 0; l<sizeof(termRxBuffer); l++){
|
||||
HAL_UART_Transmit(&huart3, &termRxBuffer[l], 1, 0xFFFF);
|
||||
termRxBuffer[l] = 0;
|
||||
}
|
||||
pointr = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Read rx buffer and parse commands
|
||||
*
|
||||
* commands:
|
||||
* ls - list fatfs drive
|
||||
* mkdir - make fatfs directory
|
||||
* touch - create fatfs file
|
||||
* rm - remove file
|
||||
* echo - print contents of file / write to file
|
||||
* reset - reset MCU
|
||||
* gpio - gpio operations as set, reset, input, output
|
||||
* time - print local time
|
||||
* help - print all commands
|
||||
*/
|
||||
void ReadBuffer(){
|
||||
|
||||
char reset[] = {"reset"};
|
||||
char gpio[] = {"gpio"};
|
||||
char help[] = {"help"};
|
||||
char time[] = {"time"};
|
||||
|
||||
for(int i = 0; i < TERM_BUFFER_SIZE; i++){
|
||||
char chachar[TERM_BUFFER_SIZE];
|
||||
for(int j = 0; j < (TERM_BUFFER_SIZE - i); j++){
|
||||
chachar[j] = termRxBuffer[j+i];
|
||||
}
|
||||
if(chachar[0] == '\n'){}
|
||||
else if(strncmp(reset, chachar, 5) == 0){
|
||||
HAL_UART_Transmit(&huart3, msgOk, 3, 0xFFFF);
|
||||
HAL_NVIC_SystemReset();
|
||||
}
|
||||
else if(strncmp(gpio, chachar, 4) == 0){
|
||||
char pinStr[2];
|
||||
uint pin;
|
||||
uint pinBinary = 1;
|
||||
GPIO_InitTypeDef GPIO_ReInitStruct = {0};
|
||||
char pinState[2];
|
||||
|
||||
uint8_t msgGpioHelp[] = {"\nUsage:\ngpio -[SWITCH]\n\nSwitch structure:\n-[s,r,i,o,g][GPIO port A-D][GPIO pin 0-15]\n-s GPIO set pin HIGH\n-r GPIO reset pin to LOW\n-i GPIO set pin as INPUT\n-o GPIO set pin as OUTPUT\n-g Read GPIO pin\n"};
|
||||
uint8_t msgGpioRead[] = {"\nGPIO pin state is: "};
|
||||
uint8_t msgGpioSet[] = {"\nGPIO pin set\n"};
|
||||
uint8_t msgGpioReset[] = {"\nGPIO pin reset\n"};
|
||||
uint8_t msgGpioSetIn[] = {"\nGPIO pin set input\n"};
|
||||
uint8_t msgGpioSetOut[] = {"\nGPIO pin set output\n"};
|
||||
|
||||
if(chachar[5] == '-'){
|
||||
switch(chachar[6]){
|
||||
case 's':
|
||||
pinStr[0] = chachar[8];
|
||||
pinStr[1] = chachar[9];
|
||||
sscanf(pinStr, "%u", &pin);
|
||||
|
||||
switch(chachar[7]){
|
||||
case 'A':
|
||||
HAL_GPIO_WritePin(GPIOA, (pinBinary << pin), 1);
|
||||
HAL_UART_Transmit(&huart3, msgGpioSet, sizeof(msgGpioSet)-1, 0xFFFF);
|
||||
break;
|
||||
case 'B':
|
||||
HAL_GPIO_WritePin(GPIOB, (pinBinary << pin), 1);
|
||||
HAL_UART_Transmit(&huart3, msgGpioSet, sizeof(msgGpioSet)-1, 0xFFFF);
|
||||
break;
|
||||
case 'C':
|
||||
HAL_GPIO_WritePin(GPIOC, (pinBinary << pin), 1);
|
||||
HAL_UART_Transmit(&huart3, msgGpioSet, sizeof(msgGpioSet)-1, 0xFFFF);
|
||||
break;
|
||||
case 'D':
|
||||
HAL_GPIO_WritePin(GPIOD, (pinBinary << pin), 1);
|
||||
HAL_UART_Transmit(&huart3, msgGpioSet, sizeof(msgGpioSet)-1, 0xFFFF);
|
||||
break;
|
||||
default:
|
||||
HAL_UART_Transmit(&huart3, msgNoGpioPort, sizeof(msgNoGpioPort)-1, 0xFFFF);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 'r':
|
||||
pinStr[0] = chachar[8];
|
||||
pinStr[1] = chachar[9];
|
||||
sscanf(pinStr, "%u", &pin);
|
||||
|
||||
switch(chachar[7]){
|
||||
case 'A':
|
||||
HAL_GPIO_WritePin(GPIOA, (pinBinary << pin), 0);
|
||||
HAL_UART_Transmit(&huart3, msgGpioReset, sizeof(msgGpioReset)-1, 0xFFFF);
|
||||
break;
|
||||
case 'B':
|
||||
HAL_GPIO_WritePin(GPIOB, (pinBinary << pin), 0);
|
||||
HAL_UART_Transmit(&huart3, msgGpioReset, sizeof(msgGpioReset)-1, 0xFFFF);
|
||||
break;
|
||||
case 'C':
|
||||
HAL_GPIO_WritePin(GPIOC, (pinBinary << pin), 0);
|
||||
HAL_UART_Transmit(&huart3, msgGpioReset, sizeof(msgGpioReset)-1, 0xFFFF);
|
||||
break;
|
||||
case 'D':
|
||||
HAL_GPIO_WritePin(GPIOD, (pinBinary << pin), 0);
|
||||
HAL_UART_Transmit(&huart3, msgGpioReset, sizeof(msgGpioReset)-1, 0xFFFF);
|
||||
break;
|
||||
default:
|
||||
HAL_UART_Transmit(&huart3, msgNoGpioPort, sizeof(msgNoGpioPort)-1, 0xFFFF);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 'i':
|
||||
pinStr[0] = chachar[8];
|
||||
pinStr[1] = chachar[9];
|
||||
sscanf(pinStr, "%u", &pin);
|
||||
|
||||
GPIO_ReInitStruct.Pin = (pinBinary << pin);
|
||||
GPIO_ReInitStruct.Mode = GPIO_MODE_INPUT;
|
||||
GPIO_ReInitStruct.Pull = GPIO_PULLUP;
|
||||
GPIO_ReInitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||
|
||||
switch(chachar[7]){
|
||||
case 'A':
|
||||
HAL_GPIO_DeInit(GPIOA, (pinBinary << pin));
|
||||
HAL_GPIO_Init(GPIOA, &GPIO_ReInitStruct);
|
||||
HAL_UART_Transmit(&huart3, msgGpioSetIn, sizeof(msgGpioSetIn)-1, 0xFFFF);
|
||||
break;
|
||||
case 'B':
|
||||
HAL_GPIO_DeInit(GPIOB, (pinBinary << pin));
|
||||
HAL_GPIO_Init(GPIOB, &GPIO_ReInitStruct);
|
||||
HAL_UART_Transmit(&huart3, msgGpioSetIn, sizeof(msgGpioSetIn)-1, 0xFFFF);
|
||||
break;
|
||||
case 'C':
|
||||
HAL_GPIO_DeInit(GPIOC, (pinBinary << pin));
|
||||
HAL_GPIO_Init(GPIOC, &GPIO_ReInitStruct);
|
||||
HAL_UART_Transmit(&huart3, msgGpioSetIn, sizeof(msgGpioSetIn)-1, 0xFFFF);
|
||||
break;
|
||||
case 'D':
|
||||
HAL_GPIO_DeInit(GPIOD, (pinBinary << pin));
|
||||
HAL_GPIO_Init(GPIOD, &GPIO_ReInitStruct);
|
||||
HAL_UART_Transmit(&huart3, msgGpioSetIn, sizeof(msgGpioSetIn)-1, 0xFFFF);
|
||||
break;
|
||||
default:
|
||||
HAL_UART_Transmit(&huart3, msgNoGpioPort, sizeof(msgNoGpioPort)-1, 0xFFFF);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 'o':
|
||||
pinStr[0] = chachar[8];
|
||||
pinStr[1] = chachar[9];
|
||||
sscanf(pinStr, "%u", &pin);
|
||||
|
||||
GPIO_ReInitStruct.Pin = (pinBinary << pin);
|
||||
GPIO_ReInitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||
GPIO_ReInitStruct.Pull = GPIO_NOPULL;
|
||||
GPIO_ReInitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||
|
||||
switch(chachar[7]){
|
||||
case 'A':
|
||||
HAL_GPIO_DeInit(GPIOA, (pinBinary << pin));
|
||||
HAL_GPIO_Init(GPIOA, &GPIO_ReInitStruct);
|
||||
HAL_UART_Transmit(&huart3, msgGpioSetOut, sizeof(msgGpioSetOut)-1, 0xFFFF);
|
||||
break;
|
||||
case 'B':
|
||||
HAL_GPIO_DeInit(GPIOB, (pinBinary << pin));
|
||||
HAL_GPIO_Init(GPIOB, &GPIO_ReInitStruct);
|
||||
HAL_UART_Transmit(&huart3, msgGpioSetOut, sizeof(msgGpioSetOut)-1, 0xFFFF);
|
||||
break;
|
||||
case 'C':
|
||||
HAL_GPIO_DeInit(GPIOC, (pinBinary << pin));
|
||||
HAL_GPIO_Init(GPIOC, &GPIO_ReInitStruct);
|
||||
HAL_UART_Transmit(&huart3, msgGpioSetOut, sizeof(msgGpioSetOut)-1, 0xFFFF);
|
||||
break;
|
||||
case 'D':
|
||||
HAL_GPIO_DeInit(GPIOD, (pinBinary << pin));
|
||||
HAL_GPIO_Init(GPIOD, &GPIO_ReInitStruct);
|
||||
HAL_UART_Transmit(&huart3, msgGpioSetOut, sizeof(msgGpioSetOut)-1, 0xFFFF);
|
||||
break;
|
||||
default:
|
||||
HAL_UART_Transmit(&huart3, msgNoGpioPort, sizeof(msgNoGpioPort)-1, 0xFFFF);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 'g':
|
||||
pinStr[0] = chachar[8];
|
||||
pinStr[1] = chachar[9];
|
||||
sscanf(pinStr, "%u", &pin);
|
||||
|
||||
switch(chachar[7]){
|
||||
case 'A':
|
||||
sprintf(pinState, "%u", HAL_GPIO_ReadPin(GPIOA, (pinBinary << pin)));
|
||||
HAL_UART_Transmit(&huart3, msgGpioRead, sizeof(msgGpioRead)-1, 0xFFFF);
|
||||
HAL_UART_Transmit(&huart3, pinState, 1, 0xFFFF);
|
||||
HAL_UART_Transmit(&huart3, &msgNL, sizeof(msgNL), 0xFFFF);
|
||||
break;
|
||||
case 'B':
|
||||
sprintf(pinState, "%u", HAL_GPIO_ReadPin(GPIOB, (pinBinary << pin)));
|
||||
HAL_UART_Transmit(&huart3, msgGpioRead, sizeof(msgGpioRead)-1, 0xFFFF);
|
||||
HAL_UART_Transmit(&huart3, pinState, 1, 0xFFFF);
|
||||
HAL_UART_Transmit(&huart3, &msgNL, sizeof(msgNL), 0xFFFF);
|
||||
break;
|
||||
case 'C':
|
||||
sprintf(pinState, "%u", HAL_GPIO_ReadPin(GPIOC, (pinBinary << pin)));
|
||||
HAL_UART_Transmit(&huart3, msgGpioRead, sizeof(msgGpioRead)-1, 0xFFFF);
|
||||
HAL_UART_Transmit(&huart3, pinState, 1, 0xFFFF);
|
||||
HAL_UART_Transmit(&huart3, &msgNL, sizeof(msgNL), 0xFFFF);
|
||||
break;
|
||||
case 'D':
|
||||
sprintf(pinState, "%u", HAL_GPIO_ReadPin(GPIOD, (pinBinary << pin)));
|
||||
HAL_UART_Transmit(&huart3, msgGpioRead, sizeof(msgGpioRead)-1, 0xFFFF);
|
||||
HAL_UART_Transmit(&huart3, pinState, 1, 0xFFFF);
|
||||
HAL_UART_Transmit(&huart3, &msgNL, sizeof(msgNL), 0xFFFF);
|
||||
break;
|
||||
default:
|
||||
HAL_UART_Transmit(&huart3, msgNoGpioPort, sizeof(msgNoGpioPort)-1, 0xFFFF);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 'h':
|
||||
HAL_UART_Transmit(&huart3, msgGpioHelp, sizeof(msgGpioHelp)-1, 0xFFFF);
|
||||
break;
|
||||
default:
|
||||
HAL_UART_Transmit(&huart3, msgUnknownParameter, sizeof(msgUnknownParameter)-1, 0xFFFF);
|
||||
break;
|
||||
}
|
||||
}
|
||||
HAL_UART_Transmit(&huart3, msgBlank, sizeof(msgBlank)-1, 0xFFFF);
|
||||
}
|
||||
else if(strncmp(help, chachar, 4) == 0){
|
||||
uint8_t msgHelp[] = {"\ncommands:\n\
|
||||
* ls - list fatfs drive\n\
|
||||
* mkdir - make fatfs directory\n\
|
||||
* touch - create fatfs file\n\
|
||||
* rm - remove file\n\
|
||||
* echo - print contents of file / write to file\n\
|
||||
* reset - reset MCU\n\
|
||||
* gpio - gpio operations as set, reset, input, output\n\
|
||||
* time - print local time\n\
|
||||
* errls - list all errors\n\
|
||||
* errclr - clear all errors\n\
|
||||
* help - print all commands\n"};
|
||||
HAL_UART_Transmit(&huart3, msgHelp, sizeof(msgHelp)-1, 0xFFFF);
|
||||
HAL_UART_Transmit(&huart3, msgBlank, sizeof(msgBlank)-1, 0xFFFF);
|
||||
}
|
||||
}
|
||||
for(int i = 0; i < TERM_BUFFER_SIZE; i++){
|
||||
termRxBuffer[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void TerminalInit(){
|
||||
uint8_t msgWelcome[] = {"\nWelcome to terminal utility by Angoosh\nLIBRARY VERSION: "};
|
||||
uint8_t msgTermVersion[] = {LIB_VERSION};
|
||||
uint8_t msgSwVerHeader[] = {"\nSOFTWARE VERSION: "};
|
||||
#ifdef SOFTWARE_VERSION
|
||||
uint8_t msgSoftwareVersion[] = ;
|
||||
#else
|
||||
uint8_t msgSoftwareVersion[] = {"unknown"};
|
||||
#endif
|
||||
uint8_t msgTalk[] = {"\n\nFor list of avaiable commands type help"};
|
||||
|
||||
HAL_UART_Transmit(&huart3, msgWelcome, sizeof(msgWelcome)-1, 0xFFFF);
|
||||
HAL_UART_Transmit(&huart3, msgTermVersion, sizeof(msgTermVersion)-1, 0xFFFF);
|
||||
HAL_UART_Transmit(&huart3, msgSwVerHeader, sizeof(msgSwVerHeader)-1, 0xFFFF);
|
||||
HAL_UART_Transmit(&huart3, msgSoftwareVersion, sizeof(msgSoftwareVersion)-1, 0xFFFF);
|
||||
HAL_UART_Transmit(&huart3, msgTalk, sizeof(msgTalk)-1, 0xFFFF);
|
||||
HAL_UART_Transmit(&huart3, &msgNL, sizeof(msgNL), 0xFFFF);
|
||||
HAL_UART_Transmit(&huart3, &msgNL, sizeof(msgNL), 0xFFFF);
|
||||
HAL_UART_Transmit(&huart3, msgBlank, sizeof(msgBlank)-1, 0xFFFF);
|
||||
}
|
25
Terminal.h
Normal file
25
Terminal.h
Normal file
@ -0,0 +1,25 @@
|
||||
/*
|
||||
* Terminal.h
|
||||
*
|
||||
* Created on: Jul 13, 2021
|
||||
* Author: angoosh
|
||||
*/
|
||||
|
||||
#ifndef INC_TERMINAL_H_
|
||||
#define INC_TERMINAL_H_
|
||||
|
||||
//#include "main.h"
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#define LIB_VERSION "0.1"
|
||||
|
||||
#define TERM_BUFFER_SIZE 255 //size of terminal buffer
|
||||
|
||||
|
||||
void PrintRxBuffer();
|
||||
void ReadBuffer();
|
||||
void TerminalInit();
|
||||
|
||||
|
||||
#endif /* INC_TERMINAL_H_ */
|
Loading…
x
Reference in New Issue
Block a user