#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; accy->signalPath = SIGNAL_PATH_ANT; accy->driveVoltage[LOW_FREQ] = V_27V; accy->driveVoltage[HIGH_FREQ] = V_27V; driver_setFrequency(freq); 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..."); 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; }