/** * @brief Changes the selection mode. * @param select_mode: Selection mode * @retval None */ void CDC_ChangeSelectMode(CDC_DEMO_SelectMode select_mode) { if(select_mode == CDC_SELECT_CONFIG) { LCD_ClearTextZone(); CDC_SelectItem(DEMO_CONFIGURATION_menu, 0xFF); CdcSettingsState.select = 0; CDC_SelectSettingsItem(0); } else if(select_mode == CDC_SELECT_FILE) { CDC_SelectItem(DEMO_SEND_menu, 0xFF); CdcSettingsState.select = 0; } else if(select_mode == CDC_SELECT_MENU) { if(CdcDemo.state == CDC_DEMO_CONFIGURATION) { CDC_SelectSettingsItem(0xFF); CDC_SelectItem(DEMO_CONFIGURATION_menu, 0); } if(CdcDemo.state == CDC_DEMO_SEND) { CDC_SelectItem(DEMO_SEND_menu, 1); } } CdcSelectMode = select_mode; CdcDemo.select = 0; }
/** * @brief Handles Configuration Menu. * @param None * @retval None */ void CDC_Handle_Configuration_Menu(void) { if(CdcSelectMode == CDC_SELECT_MENU) { switch(CdcDemo.Configuration_state) { case CDC_CONFIGURATION_IDLE: InitSettingsItems(); ConfigurationMenu_Init(); CdcSettingsState.select = 0; CdcDemo.Configuration_state = CDC_CONFIGURATION_WAIT; CDC_SelectItem (DEMO_CONFIGURATION_menu, 0xFF); CdcDemo.select = 0; break; case CDC_CONFIGURATION_WAIT: if(CdcDemo.select != PrevSelect) { PrevSelect = CdcDemo.select; CDC_SelectItem (DEMO_CONFIGURATION_menu, CdcDemo.select & 0x7F); /* Handle select item */ if(CdcDemo.select & 0x80) { switch (CdcDemo.select & 0x7F) { case 0: /* Apply new settings */ USBH_CDC_SetLineCoding(&hUSBHost, &LineCoding); ReturnFromConfigurationMenu(); break; case 1: /* Apply default settings */ USBH_CDC_SetLineCoding(&hUSBHost, &DefaultLineCoding); ReturnFromConfigurationMenu(); break; case 2: /* Return from configuration menu */ ReturnFromConfigurationMenu(); break; default: break; } } } break; default: break; } } else if(CdcSelectMode == CDC_SELECT_CONFIG) { CDC_AdjustSettingMenu(); } CdcDemo.select &= 0x7F; }
/** * @brief Handles CDC Receive Menu. * @param None * @retval None */ void CDC_Handle_Receive_Menu(void) { switch(CdcDemo.Receive_state) { case CDC_RECEIVE_IDLE: CdcDemo.Receive_state = CDC_RECEIVE_WAIT; CDC_SelectItem(DEMO_RECEIVE_menu, 0); CdcDemo.select = 0; USBH_CDC_Stop(&hUSBHost); BSP_LCD_SetTextColor(LCD_COLOR_GREEN); BSP_LCD_DisplayStringAtLine(14, (uint8_t *)" "); BSP_LCD_DisplayStringAtLine(15, (uint8_t *)"Use [Buttons Left/Right] to scroll up/down"); break; case CDC_RECEIVE_WAIT: if(CdcDemo.select != PrevSelect) { PrevSelect = CdcDemo.select; CDC_SelectItem(DEMO_RECEIVE_menu, CdcDemo.select & 0x7F); /* Handle select item */ if(CdcDemo.select & 0x80) { switch(CdcDemo.select & 0x7F) { case 0: BSP_LCD_SetTextColor(LCD_COLOR_WHITE); /* Start Reception */ LCD_ClearTextZone(); BSP_LCD_DisplayStringAtLine(3, (uint8_t *)"Receiving data ..."); xPos = 0; yLinePos = 4; memset(CDC_RX_Buffer, 0, RX_BUFF_SIZE); USBH_CDC_Receive(&hUSBHost, CDC_RX_Buffer, RX_BUFF_SIZE); CdcDemo.Receive_state = CDC_RECEIVE_WAIT; break; case 1: BSP_LCD_SetTextColor(LCD_COLOR_WHITE); USBH_CDC_Stop(&hUSBHost); ReturnFromReceiveMenu(); break; default: break; } } } break; default: break; } CdcDemo.select &= 0x7F; }
/** * @brief Handles CDC Send Menu. * @param None * @retval None */ void CDC_Handle_Send_Menu(void) { if(CdcSelectMode == CDC_SELECT_MENU) { switch(CdcDemo.Send_state) { case CDC_SEND_IDLE: CdcDemo.Send_state = CDC_SEND_WAIT; CDC_SelectItem (DEMO_SEND_menu, 0); CdcDemo.select = 0; PrevPos = 0; USBH_CDC_Stop(&hUSBHost); break; case CDC_SEND_WAIT: if(CdcDemo.select != PrevSelect) { PrevSelect = CdcDemo.select; CDC_SelectItem (DEMO_SEND_menu, CdcDemo.select & 0x7F); /* Handle select item */ if(CdcDemo.select & 0x80) { switch(CdcDemo.select & 0x7F) { case 0: memset(CDC_TX_Buffer, 0x5A, TX_BUFF_SIZE); LCD_DbgLog("Sending data ...\n"); USBH_CDC_Transmit(&hUSBHost, CDC_TX_Buffer, TX_BUFF_SIZE); use_file = 0; break; case 1: if(FileList.ptr > 0) { SendFileMenu_Init(); if(FilePos >= 9) { CDC_ShowFiles(FileOffset, 9); } else { CDC_ShowFiles(FileOffset, FilePos); } CdcDemo.Send_state = CDC_SEND_SELECT_FILE; } else { LCD_ErrLog("No file on the microSD\n"); } break; case 2: /* Return */ ReturnFromSendMenu(); break; default: break; } } } break; default: break; } } else if(CdcSelectMode == CDC_SELECT_FILE) { switch(CdcDemo.Send_state) { case CDC_SEND_SELECT_FILE: if(CdcDemo.select & 0x80) { CdcDemo.select &= 0x7F; CdcDemo.Send_state = CDC_SEND_TRANSMIT_FILE; } break; case CDC_SEND_TRANSMIT_FILE: LCD_DbgLog("Sending file ...\n"); use_file = 1; CDC_SendFile(FilePos); CDC_ChangeSelectMode(CDC_SELECT_MENU); LCD_LOG_UpdateDisplay(); CdcDemo.Send_state = CDC_SEND_WAIT; break; default: break; } if(FilePos != PrevPos) { if(((FilePos > 9)&&(FilePos > PrevPos)) || ((FilePos >= 9)&&(FilePos < PrevPos))) { if(FilePos > PrevPos) { FileOffset++; } else { FileOffset--; } CDC_ShowFiles(FileOffset, 9); } else { CDC_ShowFiles(0, FilePos); } PrevPos = FilePos; } } CdcDemo.select &= 0x7F; }
/** * @brief Manages CDC Menu Process. * @param None * @retval None */ void CDC_MenuProcess(void) { switch(CdcDemo.state) { case CDC_DEMO_IDLE: CDC_SelectItem(CDC_main_menu, 0); CdcDemo.state = CDC_DEMO_WAIT; CdcDemo.select = 0; break; case CDC_DEMO_WAIT: if(CdcDemo.select != PrevSelect) { PrevSelect = CdcDemo.select; CDC_SelectItem(CDC_main_menu, CdcDemo.select & 0x7F); /* Handle select item */ if(CdcDemo.select & 0x80) { switch(CdcDemo.select & 0x7F) { case 0: CdcDemo.state = CDC_DEMO_SEND; CdcDemo.Send_state = CDC_SEND_IDLE; break; case 1: CdcDemo.state = CDC_DEMO_RECEIVE; CdcDemo.Receive_state = CDC_RECEIVE_IDLE; break; case 2: CdcDemo.state = CDC_DEMO_CONFIGURATION; CdcDemo.Configuration_state = CDC_CONFIGURATION_IDLE; break; case 3: CdcDemo.state = CDC_DEMO_REENUMERATE; break; default: break; } } } break; case CDC_DEMO_SEND: if(Appli_state == APPLICATION_READY) { CDC_Handle_Send_Menu(); } else { CdcDemo.state = CDC_DEMO_WAIT; } break; case CDC_DEMO_RECEIVE: if(Appli_state == APPLICATION_READY) { CDC_Handle_Receive_Menu(); } else { CdcDemo.state = CDC_DEMO_WAIT; } break; case CDC_DEMO_CONFIGURATION: if(Appli_state == APPLICATION_READY) { CDC_Handle_Configuration_Menu(); } else { CdcDemo.state = CDC_DEMO_WAIT; } break; case CDC_DEMO_REENUMERATE: /* Force MSC Device to re-enumerate */ USBH_ReEnumerate(&hUSBHost); CdcDemo.state = CDC_DEMO_WAIT; break; default: break; } CdcDemo.select &= 0x7F; if(Appli_state == APPLICATION_DISCONNECT) { Appli_state = APPLICATION_IDLE; LCD_LOG_ClearTextZone(); LCD_ErrLog("CDC device disconnected!\n"); CDC_ChangeSelectMode(CDC_SELECT_MENU); CdcDemo.state = CDC_DEMO_IDLE; CdcDemo.select = 0; } }