/* * main.c * * Created on: May 20, 2022 * Author: Keith.Lloyd */ #include "fsl_spi.h" #include "pin_mux.h" #include "board.h" #include "fsl_debug_console.h" #include "fsl_power.h" #include #include #include "Fonts\fontLibrary.h" #include "Graphics\graphicsLibrary.h" #include "spi.h" #include "lcd.h" #include "main.h" #include "frq.h" #include "pro_key.h" #include "menu1.h" #include "mode.h" #include "utils.h" #include "timer.h" #include "menu.h" #include "sys_chk.h" #include "amps.h" #include "display.h" #include "ports.h" #include "adc.h" #include "battery.h" #include "mode.h" #include "init.h" #include "taps.h" #include "pwm.h" #include "safety_key.h" #include "usbComms.h" #include "flashUpdate.h" #include "bootloader.h" #include "eeprom.h" #include "sys_chk.h" #include "pwr_level.h" #include "Graphics/icons.h" #include "hwFixes.h" //temp #include "fsl_sctimer.h" #include "System/system.h" #include "io.h" #include "soft_timer.h" #include "driver.h" extern volatile uint8_t BC_Duty_Cycle; uint8_t Task,Tx_Time_Out_Flag,i,Test_Mode; extern uint8_t Power_Level,Safe_Mode; extern uint8_t Port_State[]; extern uint8_t old_freq, frequency, frq_chg_tmr,Cur_Mode; extern uint8_t Bat_Type,Bcast_Pwr_Level; extern uint16_t Port_timer, Taps_adjust_timer,Shut_down_tmr; extern uint8_t Port_changed_flag; extern uint16_t Low_Bat_timer,Estop_timer; extern uint32_t what_val1, what_val2; extern uint32_t new_freq; uint8_t init_flag,catch_up_flag; uint8_t Selected = false; extern uint8_t frq_update_flag,Ports_Cleared_Flag; extern HARDWARE_FIX_t hwf; extern uint8_t tempString[40]; // Todo move extern SYSTEM_DATA_t sys; #define DDS_PLL_TEST 0 ClampData_t clampData; void setSafeMode(bool safe) { sys.safeMode = safe; //Select_Estop((safe ? ISOLATED : CONNECTED)); driver_isolateOutput(true); if (safe) { //clear shift registers to known state Port_State[MID_SR] = USB_STATE_MID; // Port_State[BOTTOM_SR] = USB_STATE_BOT; // Port_State[TOP_SR] = USB_STATE_TOP; SPI0_SendBytes(Port_State, 3, EXPANDER); // Update shift register Delay_Ticks(1); Send_Ctrl_Word(SLP_CTRL_WRD2, SIGNAL); // Switch signal off } } bool isUsbConnected(void) { return GPIO_READ(PIN_VBUS); } static char tmpString[32]; static bool _firstInit = true; static void init(void) { if (_firstInit) { /* attach 12 MHz clock to FLEXCOMM0 (debug console) */ CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH); /* attach 12 MHz clock to SPI3 */ CLOCK_AttachClk(kFRO12M_to_FLEXCOMM3); /* reset FLEXCOMM for SPI */ RESET_PeripheralReset(kFC3_RST_SHIFT_RSTn); BOARD_InitPins(); BOARD_BootClockPLL150M(); CLOCK_SetupFROClocking(96000000U); // Set up high frequency FRO output for USB POWER_DisablePD(kPDRUNCFG_PD_USB0_PHY); /*Turn on USB Phy */ system_init(); _firstInit = false; } driver_enablePower(true); driver_isolateOutput(true); timer_init(); SPI_Init(); LCD_Init(); HWF_Init(); driver_init(); ADC_SysInit(); ACCY_Init(); io_expanderClearAll(false); io_backlightOn(true, NO_UPDATE); io_ampABOn(true, NO_UPDATE); io_update(); BL_ReadInfo(); EE_LoadData(); //Read saved data Display_Splash(); //Display splash screen delayms(1000); KEY_Init(); //Init keys after splash delay to prevent POWER short press on startup driver_setDuty(0); // switches off PWM Delay_Ticks(100); // execute short delay //Safety_Check(); // Check all voltages are safe to continue in DC. Check_Bat_Id(); // Check for Alkaline or Lithium and battery insertion error. USB_Init(); Menu_init(); // Broadcast accessory is always connected ACCY_Connect(&sys.ports[ACCY_PORT_INDUCTION], ID_BROADCAST); // ACCY_setActive(&sys.ports[ACCY_PORT_INDUCTION], CHANNEL_A); sys.guiMode = GUI_MODE_NORMAL; } int main(void) { bool prevUsbConnected = false; sys.usbConnected = false; // indicate no slope calulated since slope will always be positive clampData.slope = -1.0f; init(); while(1) { static uint32_t tickCount = 0; sys.usbConnected = isUsbConnected(); USB_Update(); //Update USB here so we're outside the ISR if (sys.usbConnected) { // USB connected if (!prevUsbConnected) { setSafeMode(true); } Display_USB(); } else { // USB disconnected if (prevUsbConnected) { //setSafeMode(false); //Normal_Init(); // USB is unplugged so reinitialize //init(); // check that things are safe before exiting safe mode setSafeMode(false); prevUsbConnected = false; } } //delayms(10); //10mS delay if (stimer_fired(sys.h100HzTimer)) { KEY_Update(); stimer_clearFired(sys.h100HzTimer); } // 1Hz tasks if (stimer_fired(sys.h1HzTimer)) { // check for power off timeout if (sys.usbConnected) { // send diagnostics //sprintf(tmpString, "Hello!"); //USB_SendString(tmpString); } stimer_clearFired(sys.h1HzTimer); } // 10Hz Tasks if (stimer_fired(sys.h10HzTimer)) { stimer_clearFired(sys.h10HzTimer); // check for accessories ACCY_service(); uint32_t pressed = 0; if (sys.guiMode == GUI_MODE_MENU) { Menu_service(); } else { pressed = KEY_GetPressed(); #if 0 if (sys.safeMode) { // only allow power off while in safe mode if (pressed != KEY_POWER) { pressed = MENU_ID_NONE; } } #endif switch(pressed) { case KEY_POWER: { Power_Down(); break; } case MENU_KEY: { Menu_mainMenu(); break; } case FRQ_KEY: { //freq_key_process(); break; } case MODE_KEY: { //mode_menu(); // test accessory state machine //ACCY_next(); ACCY_setActive(&sys.ports[ACCY_PORT_INDUCTION], CHANNEL_A); break; } #if 0 case PWR_UP_KEY: { if(Key_Lock_Out_tmr == 0) { Vchktmr = LOCK_OUT_DELAY; inc_pwr();//increment the power output Key_Lock_Out_tmr = KEY_LOCK_TIME; Suspend_Step_Chk = false; step_count = 0; } } break; case PWR_DN_KEY: { if(Key_Lock_Out_tmr == 0) { Vchktmr = LOCK_OUT_DELAY; dec_pwr();// decrement the power output Key_Lock_Out_tmr = KEY_LOCK_TIME; Suspend_Step_Chk = false; step_count = 0; } break; } #endif } Display_Update(); } #if 0 switch (Task) { case PRIMARY_TASK: pro_key(pressed); // process primary keys front 6 first menu break; case BAT_INSERTION_ERROR: if(Shut_down_tmr == 0); //Display_Bat_Error(); Power_Down(); // Stores last settings and powers off break; case LOW_BATTERY_TASK: if(Low_Bat_timer == 0) Task = PWR_OFF_TASK; break; } #endif #if 0 if(old_freq != frequency && frq_chg_tmr == 0 && (!frq_update_flag)) { Update_Frequency(); //Port_changed_flag = true; } if(Bat_Type == BAT_ERROR) Task = BAT_INSERTION_ERROR; if (Port_timer == 0) Read_Tx_Ports(); // check for whats plugged in at the ports every 100mS. if(Port_changed_flag) { Select_Output_Port(); Update_Frequency(); Init_Pwr_Level_One(); // Set power out level 1 } if((!Check_For_Clamp_New())) { Check_For_Open_Circuit(); // DC mode only } else { EXPANDER_SET(BYPASS_ON, true); //Port_State[MID_SR] |= BYPASS_ON; // Set relay to By Pass protection cap //SPI0_SendBytes(Port_State, 3, EXPANDER); // Send_Update_Port(); } if (Check_For_Clamp()) { doClampPower(); } //Send_Wireless_Data(); // Send system update to Receiver. if (Taps_adjust_timer == 0) Check_Taps(); // Check for optimum Taps #endif } prevUsbConnected = sys.usbConnected; } // while (1) }