141 lines
2.5 KiB
C
141 lines
2.5 KiB
C
#include "driver.h"
|
|
#include "ports.h"
|
|
#include "fgen.h"
|
|
#include "utils.h"
|
|
#include "System/system.h"
|
|
|
|
#define MIN_BROADCAST_FREQ 3140
|
|
#define MAX_BROADCAST_FREQ 210000
|
|
|
|
static uint8_t Bcast_LF_Value[5] = {0,5,10,15,20};
|
|
static uint8_t Bcast_HF_Value[5] = {0,12,25,37,50};
|
|
|
|
extern SYSTEM_DATA_t sys;
|
|
|
|
static FREQUENCY_t * setFrequency(ACCESSORY_t *accy, FREQUENCY_t *freq)
|
|
{
|
|
// use the current frequency if it is valid, otherwise, set to the lowest valid for broadcast
|
|
bool findFreq = false;
|
|
if (freq != NULL)
|
|
{
|
|
if (freq->frequency < MIN_BROADCAST_FREQ || freq->frequency > MAX_BROADCAST_FREQ)
|
|
{
|
|
findFreq = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
findFreq = true;
|
|
}
|
|
|
|
if (findFreq)
|
|
{
|
|
freq = fgen_findNearest(MIN_BROADCAST_FREQ);
|
|
|
|
if (freq == NULL)
|
|
{
|
|
accy->state = PORT_STATE_ERROR;
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
accy->setPower(accy, sys.driver->powerLevel);
|
|
|
|
return freq;
|
|
}
|
|
|
|
static int setPower(ACCESSORY_t *accy, PowerLevel_t power)
|
|
{
|
|
FREQUENCY_t *f = driver_getFrequency();
|
|
|
|
uint8_t duty = 0;
|
|
if(f->frequency <= 8010)
|
|
duty = Bcast_LF_Value[power];
|
|
else
|
|
duty = Bcast_HF_Value[power];
|
|
|
|
|
|
driver_setDuty(duty);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void _stateInit(ACCESSORY_t *accy)
|
|
{
|
|
FREQUENCY_t *freq = driver_getFrequency();
|
|
|
|
if (accy->initState)
|
|
{
|
|
accy->setFrequency = setFrequency;
|
|
accy->setPower = setPower;
|
|
|
|
driver_setFrequency(freq);
|
|
|
|
|
|
|
|
driver_broadcastOn(true);
|
|
|
|
ACCY_setTimeout(accy, 500);
|
|
}
|
|
|
|
if (ACCY_timedOut(accy))
|
|
{
|
|
accy->state = PORT_STATE_RUNNING;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
int broadcast_service(ACCESSORY_t *accy)
|
|
{
|
|
switch (accy->state)
|
|
{
|
|
case PORT_STATE_INIT:
|
|
{
|
|
_stateInit(accy);
|
|
break;
|
|
}
|
|
|
|
case PORT_STATE_DEINIT:
|
|
{
|
|
if (accy->initState)
|
|
{
|
|
//USB_SendString("Broadcast deinitializing...");
|
|
|
|
// turn off the amp and antenna
|
|
driver_broadcastOn(false);
|
|
delayms(50);
|
|
|
|
// turn off PWM
|
|
driver_setDuty(0);
|
|
|
|
// set PSU to minimum
|
|
driver_setPSUVoltage(V_24V);
|
|
|
|
accy->stateTimer = sys.systemTime + 500;
|
|
}
|
|
|
|
if (sys.systemTime >= accy->stateTimer)
|
|
{
|
|
accy->state = PORT_STATE_STANDBY;
|
|
//USB_SendString("Broadcast in standby!");
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
case PORT_STATE_RUNNING:
|
|
{
|
|
if (accy->initState)
|
|
{
|
|
//USB_SendString("Broadcast running!");
|
|
}
|
|
break;
|
|
}
|
|
default:
|
|
return -1;
|
|
}
|
|
|
|
return 0;
|
|
}
|