add shell for communication via uart

main
Simon Frei 4 years ago
parent 502cc280a5
commit d9f05dcaf5
  1. 28
      ADIS_tinyK22_SplitFlap/ADIS_tinyK22_SplitFlap.mex
  2. 46
      ADIS_tinyK22_SplitFlap/board/pin_mux.c
  3. 20
      ADIS_tinyK22_SplitFlap/board/pin_mux.h
  4. 2
      ADIS_tinyK22_SplitFlap/source/IncludeMcuLibConfig.h
  5. 8
      ADIS_tinyK22_SplitFlap/source/communication/uart1.c
  6. 13
      ADIS_tinyK22_SplitFlap/source/communication/uart1.h
  7. 2
      ADIS_tinyK22_SplitFlap/source/main.c
  8. 12
      ADIS_tinyK22_SplitFlap/source/platform.c
  9. 119
      ADIS_tinyK22_SplitFlap/source/shell.c
  10. 53
      ADIS_tinyK22_SplitFlap/source/shell.h

@ -39,39 +39,13 @@
<enableClock>true</enableClock>
</options>
<dependencies>
<dependency resourceType="Peripheral" resourceId="UART1" description="Peripheral UART1 is not initialized" problem_level="1" source="Pins:BOARD_InitPins">
<feature name="initialized" evaluation="equal">
<data>true</data>
</feature>
</dependency>
<dependency resourceType="SWComponent" resourceId="platform.drivers.common" description="Pins initialization requires the COMMON Driver in the project." problem_level="2" source="Pins:BOARD_InitPins">
<feature name="enabled" evaluation="equal" configuration="core0">
<data>true</data>
</feature>
</dependency>
<dependency resourceType="SWComponent" resourceId="platform.drivers.port" description="Pins initialization requires the PORT Driver in the project." problem_level="2" source="Pins:BOARD_InitPins">
<feature name="enabled" evaluation="equal" configuration="core0">
<data>true</data>
</feature>
</dependency>
</dependencies>
<pins>
<pin peripheral="UART1" signal="RX" pin_num="46" pin_signal="CMP1_IN1/PTC3/LLWU_P7/SPI0_PCS1/UART1_RX/FTM0_CH2/CLKOUT/I2S0_TX_BCLK/LPUART0_RX">
<pin_features>
<pin_feature name="open_drain" value="enable"/>
<pin_feature name="pull_select" value="up"/>
<pin_feature name="pull_enable" value="enable"/>
</pin_features>
</pin>
<pin peripheral="UART1" signal="TX" pin_num="49" pin_signal="PTC4/LLWU_P8/SPI0_PCS0/UART1_TX/FTM0_CH3/FB_AD11/CMP1_OUT/LPUART0_TX">
<pin_features>
<pin_feature name="direction" value="OUTPUT"/>
<pin_feature name="open_drain" value="enable"/>
<pin_feature name="pull_select" value="up"/>
<pin_feature name="pull_enable" value="enable"/>
</pin_features>
</pin>
</pins>
<pins/>
</function>
</functions_list>
</pins>

@ -21,7 +21,6 @@ pin_labels:
/* clang-format on */
#include "fsl_common.h"
#include "fsl_port.h"
#include "pin_mux.h"
/* FUNCTION ************************************************************************************************************
@ -40,11 +39,7 @@ void BOARD_InitBootPins(void)
* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
BOARD_InitPins:
- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'}
- pin_list:
- {pin_num: '46', peripheral: UART1, signal: RX, pin_signal: CMP1_IN1/PTC3/LLWU_P7/SPI0_PCS1/UART1_RX/FTM0_CH2/CLKOUT/I2S0_TX_BCLK/LPUART0_RX, open_drain: enable,
pull_select: up, pull_enable: enable}
- {pin_num: '49', peripheral: UART1, signal: TX, pin_signal: PTC4/LLWU_P8/SPI0_PCS0/UART1_TX/FTM0_CH3/FB_AD11/CMP1_OUT/LPUART0_TX, direction: OUTPUT, open_drain: enable,
pull_select: up, pull_enable: enable}
- pin_list: []
* BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********
*/
/* clang-format on */
@ -57,45 +52,6 @@ BOARD_InitPins:
* END ****************************************************************************************************************/
void BOARD_InitPins(void)
{
/* Port C Clock Gate Control: Clock enabled */
CLOCK_EnableClock(kCLOCK_PortC);
/* PORTC3 (pin 46) is configured as UART1_RX */
PORT_SetPinMux(BOARD_INITPINS_UART1_RX_PORT, BOARD_INITPINS_UART1_RX_PIN, kPORT_MuxAlt3);
PORTC->PCR[3] = ((PORTC->PCR[3] &
/* Mask bits to zero which are setting */
(~(PORT_PCR_PS_MASK | PORT_PCR_PE_MASK | PORT_PCR_ODE_MASK | PORT_PCR_ISF_MASK)))
/* Pull Select: Internal pullup resistor is enabled on the corresponding pin, if the
* corresponding PE field is set. */
| (uint32_t)(kPORT_PullUp)
/* Open Drain Enable: Open drain output is enabled on the corresponding pin, if the pin is
* configured as a digital output. */
| PORT_PCR_ODE(kPORT_OpenDrainEnable));
/* PORTC4 (pin 49) is configured as UART1_TX */
PORT_SetPinMux(BOARD_INITPINS_UART1_TX_PORT, BOARD_INITPINS_UART1_TX_PIN, kPORT_MuxAlt3);
PORTC->PCR[4] = ((PORTC->PCR[4] &
/* Mask bits to zero which are setting */
(~(PORT_PCR_PS_MASK | PORT_PCR_PE_MASK | PORT_PCR_ODE_MASK | PORT_PCR_ISF_MASK)))
/* Pull Select: Internal pullup resistor is enabled on the corresponding pin, if the
* corresponding PE field is set. */
| (uint32_t)(kPORT_PullUp)
/* Open Drain Enable: Open drain output is enabled on the corresponding pin, if the pin is
* configured as a digital output. */
| PORT_PCR_ODE(kPORT_OpenDrainEnable));
SIM->SOPT5 = ((SIM->SOPT5 &
/* Mask bits to zero which are setting */
(~(SIM_SOPT5_UART1TXSRC_MASK)))
/* UART 1 transmit data source select: UART1_TX pin. */
| SIM_SOPT5_UART1TXSRC(SOPT5_UART1TXSRC_UART_TX));
}
/***********************************************************************************************************************
* EOF

@ -25,26 +25,6 @@ extern "C" {
*/
void BOARD_InitBootPins(void);
#define SOPT5_UART1TXSRC_UART_TX 0x00u /*!<@brief UART 1 transmit data source select: UART1_TX pin */
/*! @name PORTC3 (number 46), UART1_RX
@{ */
/* Symbols to be used with PORT driver */
#define BOARD_INITPINS_UART1_RX_PORT PORTC /*!<@brief PORT peripheral base pointer */
#define BOARD_INITPINS_UART1_RX_PIN 3U /*!<@brief PORT pin number */
#define BOARD_INITPINS_UART1_RX_PIN_MASK (1U << 3U) /*!<@brief PORT pin mask */
/* @} */
/*! @name PORTC4 (number 49), UART1_TX
@{ */
/* Symbols to be used with PORT driver */
#define BOARD_INITPINS_UART1_TX_PORT PORTC /*!<@brief PORT peripheral base pointer */
#define BOARD_INITPINS_UART1_TX_PIN 4U /*!<@brief PORT pin number */
#define BOARD_INITPINS_UART1_TX_PIN_MASK (1U << 4U) /*!<@brief PORT pin mask */
/* @} */
/*!
* @brief Configures pin routing and optionally pin electrical features.
*

@ -96,7 +96,7 @@ add_compile_options(-include "../config/IncludeMcuLibConfig.h")
#endif
#define McuULN2003_CONFIG_USE_ACCELERATION (1)
/* ------------------- RTOS ---------------------------*/
#define McuLib_CONFIG_SDK_USE_FREERTOS (0)
#define McuLib_CONFIG_SDK_USE_FREERTOS (1)
/* #define configUSE_SEGGER_SYSTEM_VIEWER_HOOKS (1) */
/* #define configTOTAL_HEAP_SIZE (24*1024) */
/* #define configUSE_HEAP_SECTION_NAME (1) */

@ -1,8 +0,0 @@
/*
* uart1.c
*
* Created on: 7 Oct 2022
* Author: simon
*/

@ -1,13 +0,0 @@
/*
* uart1.h
*
* Created on: 7 Oct 2022
* Author: simon
*/
#ifndef COMMUNICATION_UART1_H_
#define COMMUNICATION_UART1_H_
#endif /* COMMUNICATION_UART1_H_ */

@ -49,7 +49,6 @@
* @brief Application entry point.
*/
int main(void) {
/* Init board hardware. */
BOARD_InitBootPins();
BOARD_InitBootClocks();
@ -62,7 +61,6 @@ int main(void) {
/* init platform */
PRINTF("Initializing Platform...\n");
PL_Init();
/* init app */
PRINTF("Initializing App...\n");
App_Init();

@ -12,6 +12,10 @@
#include "McuGPIO.h"
#include "McuULN2003.h"
#include "splitflap.h"
#include "McuRTOS.h"
#include "McuRTT.h"
#include "McuShell.h"
#include "shell.h"
void PL_Init(void){
@ -21,19 +25,27 @@ void PL_Init(void){
CLOCK_EnableClock(kCLOCK_PortC);
McuLib_Init();
McuRTOS_Init();
McuWait_Init();
McuGPIO_Init();
McuLED_Init();
McuULN2003_Init();
McuRTT_Init();
McuShell_Init();
SHELL_Init();
SF_InitConfig();
}
void PL_Deinit(void){
SF_DeInitConfig();
SHELL_Deinit();
McuShell_Deinit();
McuRTT_Deinit();
McuULN2003_Deinit();
McuLED_Deinit();
McuGPIO_Deinit();
McuWait_Deinit();
McuRTOS_Deinit();
McuLib_Deinit();
}

@ -0,0 +1,119 @@
/*
* Copyright (c) 2019-2022, Erich Styger
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "platform.h"
#include "Shell.h"
#include "McuShell.h"
#include "McuRTOS.h"
#include "McuRTT.h"
#include "McuArmTools.h"
#include "McuShellUart.h"
#include "McuLog.h"
#include "McuUtility.h"
static uint8_t splitFlapId = 0;
static uint8_t ParseCommand(const uint8_t *cmd, bool *handled, McuShell_ConstStdIOType *io){
uint8_t size = sizeof(SHELL_CMD_IDENTIFY_SF)-1;
if (McuUtility_strcmp((char*)cmd, McuShell_CMD_HELP)==0) {
McuShell_SendStr((unsigned char*)"\r\n", io->stdOut);
McuShell_SendStr((unsigned char*)McuShell_DASH_LINE, io->stdOut);
McuShell_SendStr((unsigned char*)"\r\n", io->stdOut);
McuShell_SendHelpStr((unsigned char*)"SplitFlap Help", (const unsigned char*)"Group of SplitFlap commands\r\n", io->stdOut);
McuShell_SendHelpStr((unsigned char*)" help", (const unsigned char*)"Print help this message\r\n", io->stdOut);
McuShell_SendHelpStr((unsigned char*)SHELL_CMD_IDENTIFY_SF, (const unsigned char*)"<SplitFlapId> (uint8_t)\r\n", io->stdOut);
McuShell_SendHelpStr((unsigned char*)" ", (const unsigned char*)"the number printed on the splitflap\r\n", io->stdOut);
McuShell_SendHelpStr((unsigned char*)" ", (const unsigned char*)"Splitflap Number:16\n", io->stdOut);
*handled = TRUE;
return ERR_OK;
} else if(McuUtility_strncmp((char*)cmd, SHELL_CMD_IDENTIFY_SF, size) == 0){
*handled = TRUE;
cmd += sizeof(SHELL_CMD_IDENTIFY_SF)-1;
if(McuUtility_ScanDecimal8uNumber(&cmd, &splitFlapId) != ERR_OK){
// Do not save id
return ERR_FAILED;
}
}
return ERR_OK;
}
static const McuShell_ParseCommandCallback CmdParserTable[] =
{
ParseCommand,
McuShell_ParseCommand,
McuRTOS_ParseCommand,
NULL /* Sentinel */
};
typedef struct {
McuShell_ConstStdIOType *stdio;
unsigned char *buf;
size_t bufSize;
} SHELL_IODesc;
static const SHELL_IODesc ios[] =
{
// {&McuShellUart_stdio, McuShellUart_DefaultShellBuffer, sizeof(McuShellUart_DefaultShellBuffer)},
{&McuRTT_stdio, McuRTT_DefaultShellBuffer, sizeof(McuRTT_DefaultShellBuffer)},
// {&USB_CdcStdio, USB_CdcDefaultShellBuffer, sizeof(USB_CdcDefaultShellBuffer)},
};
void SHELL_SendChar(unsigned char ch) {
for(int i=0;i<sizeof(ios)/sizeof(ios[0]);i++) {
McuShell_SendCh(ch, ios[i].stdio->stdOut);
}
}
uint8_t SHELL_ParseCommandIO(const unsigned char *command, McuShell_ConstStdIOType *io, bool silent) {
if (io==NULL) { /* use a default */
io = McuShell_GetStdio();
}
return McuShell_ParseWithCommandTableExt(command, io, CmdParserTable, silent);
}
void SHELL_SendString(const unsigned char *str) {
for(int i=0;i<sizeof(ios)/sizeof(ios[0]);i++) {
McuShell_SendStr(str, ios[i].stdio->stdOut);
}
}
static void ShellTask(void *pv) {
int i;
McuLog_info("Shell task started");
for(i=0;i<sizeof(ios)/sizeof(ios[0]);i++) {
ios[i].buf[0] = '\0';
}
for(;;) {
/* process all I/Os */
for(i=0;i<sizeof(ios)/sizeof(ios[0]);i++) {
(void)McuShell_ReadAndParseWithCommandTable(ios[i].buf, ios[i].bufSize, ios[i].stdio, CmdParserTable);
}
vTaskDelay(pdMS_TO_TICKS(20));
}
}
void SHELL_Init(void) {
if (xTaskCreate(
ShellTask, /* pointer to the task */
"Shell", /* task name for kernel awareness debugging */
800/sizeof(StackType_t), /* task stack size */
(void*)NULL, /* optional task startup argument */
tskIDLE_PRIORITY+2, /* initial priority */
(TaskHandle_t*)NULL /* optional task handle to create */
) != pdPASS)
{
McuLog_fatal("failed creating Shell task");
for(;;){} /* error! probably out of memory */
}
McuShell_SetStdio(McuRTT_GetStdio()); /* use RTT as the default */
vTaskStartScheduler();
}
void SHELL_Deinit(void) {}

@ -0,0 +1,53 @@
/*
* Copyright (c) 2021-2022, Erich Styger
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef SHELL_H_
#define SHELL_H_
#include "McuShell.h"
#define SHELL_CMD_IDENTIFY_SF "Splitflap Number:"
#ifdef __cplusplus
extern "C" {
#endif
/*!
* \brief Send a string to all supported I/Os
* \param str String to send
*/
void SHELL_SendString(const unsigned char *str);
/*!
* \brief Send a character to all supported I/Os
* \param ch Character to send
*/
void SHELL_SendChar(unsigned char ch);
/*!
* \brief Parses a command with a given standard I/O channel
* \param command Command to be parsed
* \param io I/O to be used. If NULL, the standard default I/O will be used
* \param silent If parsing shall be silent or not
* \return Error code, ERR_OK for no error
*/
uint8_t SHELL_ParseCommandIO(const unsigned char *command, McuShell_ConstStdIOType *io, bool silent);
/*!
* \brief Module de-initialization
*/
void SHELL_Deinit(void);
/*!
* \brief Module Initialization
*/
void SHELL_Init(void);
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* SHELL_H_ */
Loading…
Cancel
Save