static void RADIO_PrintStatus(const FSSH1_StdIOType *io) { short dBm; unsigned char link_quality; /* Holds the link quality of the last received Packet.*/ FSSH1_SendStatusStr("Radio", "\r\n", io->stdOut); FSSH1_SendStatusStr(" transceiver", RADIO_isOn?"on\r\n":"off\r\n", io->stdOut); FSSH1_SendStatusStr(" sniffing", RADIO_isSniffing?"on\r\n":"off\r\n", io->stdOut); link_quality = SMAC1_MLMELinkQuality(); /* Read the link quality of the last received packet.*/ dBm = (short)(-(link_quality/2)); FSSH1_SendStatusStr(" LQ", "", io->stdOut); FSSH1_SendNum16s(dBm, io->stdOut); FSSH1_SendStr(" dBm\r\n", io->stdOut); FSSH1_SendStatusStr(" channel", "", io->stdOut); FSSH1_SendNum16u((uint16_t)RADIO_Channel, io->stdOut); FSSH1_SendStr("\r\n", io->stdOut); FSSH1_SendStatusStr(" outputPower", "", io->stdOut); FSSH1_SendNum16u((uint16_t)RADIO_OutputPower, io->stdOut); FSSH1_SendStr("\r\n", io->stdOut); FSSH1_SendStatusStr(" PAIND", RADIO_PREFIX_STR, io->stdOut); FSSH1_SendStr("\r\n", io->stdOut); FSSH1_SendStatusStr(" ACK", RADIO_ACK_STR, io->stdOut); FSSH1_SendStr("\r\n", io->stdOut); }
uint8_t RADIO_ParseCommand(const unsigned char *cmd, bool *handled, const FSSH1_StdIOType *io) { uint8_t res = ERR_OK; long val; const char *p; if (UTIL1_strcmp(cmd, FSSH1_CMD_HELP)==0 || UTIL1_strcmp(cmd, "radio help")==0) { RADIO_PrintHelp(io); *handled = TRUE; } else if (UTIL1_strcmp(cmd, FSSH1_CMD_STATUS)==0 || UTIL1_strcmp(cmd, "radio status")==0) { RADIO_PrintStatus(io); *handled = TRUE; } else if (UTIL1_strcmp(cmd, "radio on")==0) { RADIO_isOn = TRUE; *handled = TRUE; } else if (UTIL1_strcmp(cmd, "radio off")==0) { RADIO_isOn = FALSE; *handled = TRUE; } else if (UTIL1_strcmp(cmd, "radio sniff on")==0) { RADIO_isSniffing = TRUE; *handled = TRUE; } else if (UTIL1_strcmp(cmd, "radio sniff off")==0) { RADIO_isSniffing = FALSE; *handled = TRUE; } else if (UTIL1_strncmp(cmd, "radio channel", sizeof("radio channel")-1)==0) { p = cmd+sizeof("radio channel"); if (UTIL1_xatoi(&p, &val)==ERR_OK && val>=0 && val<=15) { RADIO_SetChannel((uint8_t)val); *handled = TRUE; } else { FSSH1_SendStr("Wrong argument, must be in the range 0..15\r\n", io->stdErr); res = ERR_FAILED; } } else if (UTIL1_strncmp(cmd, "radio power", sizeof("radio power")-1)==0) { p = cmd+sizeof("radio power"); if (UTIL1_xatoi(&p, &val)==ERR_OK && val>=0 && val<=15) { RADIO_SetOutputPower((uint8_t)val); *handled = TRUE; } else { FSSH1_SendStr("Wrong argument, must be in the range 0..15\r\n", io->stdErr); res = ERR_FAILED; } } else if (UTIL1_strncmp(cmd, "radio send", sizeof("radio send")-1)==0) { p = cmd+sizeof("radio send"); RADIO_SendString(p); *handled = TRUE; } return res; }
static portTASK_FUNCTION(ShellTask, pvParameters) { static unsigned char cmd_buf[48]; (void)pvParameters; (void)FSSH1_ParseCommand((unsigned char*)FSSH1_CMD_HELP, FSSH1_GetStdio(), ParseCommand); /* print help and prints as well the prompt */ cmd_buf[0] = '\0'; for(;;) { #if PL_USE_USB_SCI static char_t usb_tx_buf[USB1_DATA_BUFF_SIZE]; (void)CDC1_App_Task(usb_tx_buf, sizeof(usb_tx_buf)); /* Call the USB application task */ #endif (void)FSSH1_ReadAndParseLine(cmd_buf, sizeof(cmd_buf), FSSH1_GetStdio(), ParseCommand); #if PL_HAS_QUEUE #if QUEUE_SINGLE_CHAR { unsigned char ch; FSSH1_StdIO_OutErr_FctType io = FSSH1_GetStdio()->stdOut; while((ch=QUEUE_ReceiveChar()) && ch!='\0') { io(ch); } } #else { const unsigned char *msg; msg = QUEUE_ReceiveMessage(); if (msg!=NULL) { FSSH1_SendStr(msg, FSSH1_GetStdio()->stdOut); FRTOS1_vPortFree((void*)msg); } } #endif #endif #if PL_HAS_I2C if (SHELL_i2Commands && I2C_ReceiveCommand(cmd_buf, sizeof(cmd_buf))==ERR_OK) { bool handled = FALSE; (void)ParseCommand(cmd_buf, &handled, FSSH1_GetStdio()); } #endif FRTOS1_vTaskDelay(50/portTICK_RATE_MS); } }
/*! * \brief Send a string to the stdio channel. */ void SHELL_SendStr(const unsigned char *str) { FSSH1_SendStr(str, FSSH1_GetStdio()->stdOut); }