/* * 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 "over_ride.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" extern volatile uint8_t BC_Duty_Cycle; uint8_t Task,Tx_Time_Out_Flag,i,Test_Mode; extern uint8_t Power_Level,Over_Voltage_Flag,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,Sys_Chk_tmr,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 ADC_t adc; 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 BYPASS_USB_SAFETY 0 //Use for debugging #define DDS_PLL_TEST 0 ClampData_t clampData; int main(void) { // indicate no slope calulated since slope will always be positive clampData.slope = -1.0f; /* 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 */ Power_ON_OFF(ON); // Enable_Psu(); Ensure Power supply stays switched on. Select_Estop(ON); // Ensure output is ISOLATED from connections Init_vars(); Init_peripherals(); HWF_Init(); Init_sys(); //################### Check_For_Usb(); // Set everything safe if so KEY_Init(); //Init keys after splash delay to prevent POWER short press on startup // Display_Splash(); //Display splash screen // Delay_Ticks(100); // execute short delay BL_ReadInfo(); EE_LoadData(); //Read saved data #if !BYPASS_USB_SAFETY if(GPIO_PinRead(GPIO,1,6)) { USB_Init(); Display_Splash(); //Display splash screen Delay_Ticks(100); // execute short delay } while(GPIO_PinRead(GPIO,1,6)) { LCD_Clear(); Display_USB(); //Display USB icon LCD_Update(); Delay_Ticks(1); // execute short delay safe_key(); // process primary keys as safety menu USB_Update(); } #endif //################### Display_Splash(); //Display splash screen Delay_Ticks(100); // execute short delay ADC_Init2(); ACCY_Init(); KEY_Init(); //Init keys after splash delay to prevent POWER short press on startup // Read_Tx_Ports(); // Read output ports and determine what is connected // Select_Amplifier(); // Select correct amplifier according to frequency Init_Mode(); // //init_PWM(); // PWM_Setup(32768, BC_Duty_Cycle);//freqArray[frequency].frequency1 // PWM_Setup(29430, BC_Duty_Cycle); PWM_Setup(15890, 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. what_val1=0; what_val2=0; Cur_Mode = PORT2_A; init_flag = 0; for( i=0; i < 15; i++) { Delay_Ticks(10); // ADC_Update(); // Read_Tx_Ports(); // check for whats plugged in at the ports every 100mS. } if ((adc.V_ID2 > 3.0) && (adc.V_ID1 > 3.0)) { Cur_Mode = BROADCAST; Port_changed_flag= 1; init_flag = 1; } Disconnect(2); Delay_Ticks(30); Check_For_Clamp_On_Pwr_Up(); Select_Output_Port(); Safety_Check(); // Second time J.I.C Check all voltages are safe to continue in DC. Normal_Bypass_Chk(); old_freq = DUMMY_FRQ; //force a frequency on initialization frq_chg_tmr = 0; Update_Frequency(); // Select_Bypass(OFF); // 3/14/24 Select_Estop(OFF); // Restore output. Init_Amplitude(); USB_Init(); Menu_init(); sys.guiMode = GUI_MODE_NORMAL; #if DDS_PLL_TEST //# Insert special test code here. uint32_t tmp; All_Amps_Off(); // Set OBPTEN tmp = Calc_Freq(3500090); Load_Frq_Gen(SINGLE,tmp,0); // # update the frequency generators //# End Test code #endif while(1) { static uint32_t tickCount = 0; USB_Update(); //Update USB here so we're outside the ISR #if !BYPASS_USB_SAFETY //##################### Check_For_Usb(); if(GPIO_READ(PIN_VBUS)) { Task = USB_SAFE_TASK; // process primary keys as safety menu safe_key(); // process primary keys as safety menu LCD_Clear(); Display_USB(); //Display USB icon LCD_Update(); } else if(!GPIO_READ(PIN_VBUS) && Ports_Cleared_Flag) { Normal_Init(); // USB is unplugged so reinitialize } //############################### #endif Delay_Ticks(1); //10mS delay KEY_Update(); #if !BYPASS_USB_SAFETY if((tickCount++ % 10 == 0) && !GPIO_READ(PIN_VBUS)) //every 10 ticks = 100mS AND !USB #else if(tickCount++ % 10 == 0) //every 10 ticks = 100mS #endif { uint32_t pressed = 0; if (sys.guiMode == GUI_MODE_MENU) { Menu_service(); } else { pressed = KEY_GetPressed(); switch(pressed) { case MENU_KEY: { Menu_mainMenu(); break; } } Display_Update(); } switch (Task) { case SAFETY_TASK: safe_key(); // process primary keys as safety menu break; case USB_SAFE_TASK: safe_key(); // process primary keys as safety menu break; case FATAL_ERROR_TASK: safe_key(); // process primary keys as safety menu break; case PRIMARY_TASK: pro_key(pressed); // process primary keys front 6 first menu break; case MENU_TASK: // Allows user to select options menu_key(); Task = PRIMARY_TASK; break; case MODE_TASK: // Selects between DC || BC mode_menu(); Task = PRIMARY_TASK; break; case PWR_OFF_TASK: Power_Down(); // Stores last settings and powers off break; case OVER_RIDE_TASK: // Allows user to Over ride safe settings Over_Ride(); // schedule Over Ride Menu KEY_ClearKeyPresses(); 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; } #if !DDS_PLL_TEST 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 (Sys_Chk_tmr == 0) { System_Check(); // Check all system functions Chk_Gain(); if(catch_up_flag) { Delay_Ticks(10); Request_Current_Change(); // Request_Current_Change(); catch_up_flag = false; } } if((!Check_For_Clamp_New())) { Check_For_Open_Circuit(); // DC mode only } else { 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 // Display_Update(); } } }