#include "LetterShell.h"
#include "shell.h"

#define WR_BUFFER_SIZE    512

/* 1. 创建shell对象，开辟shell缓冲区 */
Shell Host;                        //Shell实例化
char HostBuffer[WR_BUFFER_SIZE];   //读写缓冲区
uint32_t HostId;                   //串口号

/**
 * @brief  Shell写函数
 * @param  ComId 串口号，ch 数据
 * @retval void
 * @note   void
 * @example void
 */
signed short ShellWrite(char* ch, unsigned short Len)
{
    UsartSendStr(HostId, (uint8_t* )ch,Len);
    return Len;
}
/**
 * @brief  Shell读函数 - 中断回调实现
 * @param  Vector 中断向量号
 * @retval void
 * @note   void
 * @example void
 */
void LetterShellIrqFunc(uint32_t Vector)
{
    uint8_t ch = 0x00;
    ch = UsartReceiveChar(Vector);

    shellHandler(&Host, ch);
}


/**
 * @brief  初始化Shell
 * @param  ComId 串口号，baud 波特率
 * @retval void
 * @note   void
 * @example void
 */
void LetterShellInit(uint32_t ComId, uint32_t baud)
{
    HostId = ComId;
    
    //初始化串口
    UsartStdConfig(ComId, baud);
    //设置串口回调函数
    IntCbReg(TTY_COM_IRQN, LetterShellIrqFunc);
    //设置中断等级
    IntSetLevel(TTY_COM_IRQN,1,1);
    //注册写函数
    Host.write = ShellWrite;

    shellInit(&Host, HostBuffer, WR_BUFFER_SIZE);
}

/**
 * @brief  打印版本号
 * @param  void
 * @retval void
 * @note   void
 * @example void
 */
int version(void)
{
    printf("%s\r\n",VERSION);
    return 0;
}

/**
 * @brief  DO控制
 * @param  chnl 通道号 val状态值
 * @retval void
 * @note   void
 * @example void
 */
 void doSet(uint8_t chnl, uint8_t val)
 {
     IoCtl(IO_TYPE_DO, chnl, val);
 }
/**
 * @brief  DO控制反转
 * @param  chnl 通道号
 * @retval void
 * @note   void
 * @example void
 */
 void doToggle(uint8_t chnl)
 {
     IoCtlToggleDo(chnl);
 }

//打印版本号
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC), version, version, version);
//控制DO
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC), doSet, doSet, doSet);
//反转DO
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC), doToggle, doToggle, doToggle);
