


#include "RadioControl.h"


void RadioInit(void)
{

/*
    NRF_RADIO_TASK_TXEN        Enable RADIO in TX mode
    NRF_RADIO_TASK_RXEN        Enable RADIO in RX mode
    NRF_RADIO_TASK_START       Start RADIO.
    NRF_RADIO_TASK_STOP        Stop RADIO.
    NRF_RADIO_TASK_DISABLE     Disable RADIO
    NRF_RADIO_TASK_RSSISTART   Start the RSSI and take one single sample of the receive signal strength.
    NRF_RADIO_TASK_RSSISTOP    TODO (Interessant für Kalman filter) Stop the RSSI measurement.
    NRF_RADIO_TASK_BCSTART     Start the bit counter.
    NRF_RADIO_TASK_BCSTOP      Stop the bit counter.
    NRF_RADIO_TASK_EDSTART     Start the Energy Detect measurement used in IEEE 802.15.4 mode.
    NRF_RADIO_TASK_EDSTOP      Stop the Energy Detect measurement.
    NRF_RADIO_TASK_CCASTART    TODO (Herrausfinden ob das für empfänger interessant ist) Start the Clear Channel Assessment used in IEEE 802.15.4 mode.
    NRF_RADIO_TASK_CCASTOP     Stop the Clear Channel Assessment.
*/

  nrf_radio_tast_trigger(NRF_RADIO_TASK_TXEN);        //Funktion für konfiguration des Radios
  nrf_radio_tast_trigger(NRF_RADIO_TASK_START);
 
/*
    NRF_RADIO_MODE_NRF_1MBIT            1Mbit/s Nordic proprietary radio mode.
    NRF_RADIO_MODE_NRF_2MBIT            2Mbit/s Nordic proprietary radio mode.
    NRF_RADIO_MODE_NRF_250KBIT          250Kbit/s Nordic proprietary radio mode.
    NRF_RADIO_MODE_BLE_1MBIT            1 Mbit/s Bluetooth Low Energy.
    NRF_RADIO_MODE_BLE_2MBIT            2 Mbit/s Bluetooth Low Energy.
    NRF_RADIO_MODE_BLE_LR125KBIT        Bluetooth Low Energy Long range 125 kbit/s TX, 125 kbit/s and 500 kbit/s RX
    NRF_RADIO_MODE_BLE_LR500KBIT        Bluetooth Low Energy Long range 500 kbit/s TX, 125 kbit/s and 500 kbit/s RX
    NRF_RADIO_MODE_IEEE802154_250KBIT   IEEE 802.15.4-2006 250 kbit/s.
*/

  nrf_radio_mode_set(NRF_RADIO_MODE_BLE_1MBIT);       //Modus welcher AoA Unterstützt (NRF_RADIO_MODE_BLE_1MBIT, NRF_RADIO_MODE_BLE_2MBIT)

/*
    NRF_RADIO_TXPOWER_POS8DBM 	8 dBm.
    NRF_RADIO_TXPOWER_POS7DBM 	7 dBm.
    NRF_RADIO_TXPOWER_POS6DBM 	6 dBm.
    NRF_RADIO_TXPOWER_POS5DBM 	5 dBm.
    NRF_RADIO_TXPOWER_POS4DBM 	4 dBm.
    NRF_RADIO_TXPOWER_POS3DBM 	3 dBm.
    NRF_RADIO_TXPOWER_POS2DBM 	2 dBm.
    NRF_RADIO_TXPOWER_0DBM      0 dBm.
    NRF_RADIO_TXPOWER_NEG4DBM 	-4 dBm.
    NRF_RADIO_TXPOWER_NEG8DBM 	-8 dBm.
    NRF_RADIO_TXPOWER_NEG12DBM 	-12 dBm.
    NRF_RADIO_TXPOWER_NEG16DBM 	-16 dBm.
    NRF_RADIO_TXPOWER_NEG20DBM 	-20 dBm.
    NRF_RADIO_TXPOWER_NEG30DBM 	-30 dBm.
    NRF_RADIO_TXPOWER_NEG40DBM 	-40 dBm.
*/

  nrf_radio_txpower_set(NRF_RADIO_TXPOWER_0DBM);      //Sendeleistung des Bluetooth Signals
  nrf_radio_frequency_set(uint16_t 2400);             //Einstellen auf 2.4GHz
  
  AntennenINIT();                                     //Funktion fpr Konfiguratin des Antennen Arrays nur für empfänger

  if(nrf_radio_event_check(nrf_radio_event_t NRF_RADIO_EVENT_READY) == true)
  {
    printf("Radio Initialisierung erfolgreich");    //TODO über uart "..." ausgeben
  }
}




void AntennenINIT(void)
{
  //Informationen zum DFECTRL1 Register sind im Manual (nRF52833_PS_V1.3) auf der Seite 333 aufzufinden                              
  //TODO Masken Namen ändern anhand des Datenblattes
 
  const int DFE_OFF    = 0x00;  //Ein Ausschalten AoA und AoD anwendungen
  const int DFE_ON_AoD = 0x02;
  const int DFE_ON_AoA = 0x03;

  uint32_t GAIN_REDUCTION    = 0;   //Abschwächung des CTE Signals von 0(0000) bis 15(1111)   
  uint32_t REPEAT_PATTERN    = 0;   //Anzahl wiederholungen der Antennen Muster P0, P0, P1, P1, P2, P2, P3, P3, etc. 0 = Keine Wiederholung
  uint32_t TIME_BTW_SAMPLES  = 1;   //Zeit welche zwischen den Abtastungen benötigt wird. 1 = 4us, 2 = 2us, 3 = 1us, 4 = 0.5us
  uint32_t SAMPLE_TYPE       = 0;   //Art des Samples IQ = 0  MagPhase = 1
  uint32_t INTERVAL_BTW_SAMP = 1;   //Intervall zwischen Samples in der RefferenzPeriode. 1 = 4us, 2 = 2us, 3 = 1us, 4 = 0.5us
  uint32_t TIME_BTW_SWITCHES = 1;   //Zeit zwischen Wechsel der antennen 1 = 4us, 2 = 2us, 3 = 1us
  uint32_t CTE_EXTENTION     = 1;   //Wenn die CTE ausfgerufen wird. 1 = CrC, 2 = Payload
  uint32_t TOTAL_LENGHT      = 1;   //Gesammtdauer der CTE in 8us Schritten 00`0000 = 0us, 11`1111 = 512us 
  
  //Maske zum Ansteuern des DFECTRL1 Registers
  uint32_t DFECTRL1_MASK = (GAIN_REDUCTION << 24  | REPEAT_PATTERN << 20   | TIME_BTW_SAMPLES << 16 | SAMPLE_TYPE << 15  | INTERVAL_BTW_SAMP << 12 | TIME_BTW_SWITCHES << 8 | CTE_EXTENTION << 7 | TOTAL_LENGHT);
  printf("DFECTRL1 Register %d\n", DFECTRL1_MASK);

  NRF_RADIO->DFEMODE  = DFE_ON_AoA;
  NRF_RADIO->DFECTRL1 = DFECTRL1_MASK;

  NRF_GPIOTE->TASKS_CLR[2];                   //Löschen der IO-Pins
  NRF_GPIOTE->TASKS_CLR[3];
  NRF_GPIOTE->TASKS_CLR[4];
  NRF_GPIOTE->TASKS_CLR[5];

  NRF_RADIO->PSEL.DFEGPIO[2];                 //Pins für den Radio Betrieb
  NRF_RADIO->PSEL.DFEGPIO[3]; 
  NRF_RADIO->PSEL.DFEGPIO[4];
  NRF_RADIO->PSEL.DFEGPIO[5];
}


void AntennenController(void)
{
  const int ANT_1 = 0b0101;         //Ansteuerung der einzelnen antennen
  const int ANT_2 = 0b0110;         
  const int ANT_3 = 0b0100;
  const int ANT_4 = 0b1001;
  const int ANT_5 = 0b1010;
  const int ANT_6 = 0b1000;
  const int ANT_7 = 0b1101;
  const int ANT_8 = 0b1110;
  const int ANT_9 = 0b1100;
  const int ANT_10= 0b0001;
  const int ANT_11= 0b0010;
  const int ANT_12= 0b0000;
  const int ANT_ARRAY[12] = {ANT_1, ANT_2, ANT_3, ANT_4, ANT_5, ANT_6, ANT_7, ANT_8, ANT_9, ANT_10, ANT_11, ANT_12};   //Umwandlung vom Reelen wert in Bit wert
  
  NRF_RADIO->CLEARPATTERN;                                    //Alte Registerwerte Löschen
 
  for(int i = 0; i < sizeof(ANT_ARRAY)/sizeof(int); i++)      //Ausgabe der Antennensignale anhand des AMT_ARRAY
  {
    NRF_RADIO->SWITCHPATTERN = (ANT_ARRAY[i]<<2);             //Das zeichen N korespondiert mit dem Bit an PSEL.DFEGPIO[N] Da wir bei Zwei beginen verschieben wir um 2 nach links
    printf("ANT_SWITCH_REGISTER: %x \n",(ANT_ARRAY[i]<<2));
  }
}