Files
TX/source/main.c
2025-06-20 18:02:50 -05:00

421 lines
7.7 KiB
C

/*
* 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 <stdbool.h>
#include <stdint.h>
#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)
}