SurreyEARS / Mbed 2 deprecated EARS-FlightCTRL

Dependencies:   mbed USBDevice

Branch:
dev-RFM69
Revision:
10:6fe476ec05aa
Parent:
9:2a26eec46988
Child:
11:8f3e72f6a1e0
--- a/main.cpp	Sat Aug 01 22:59:16 2015 +0000
+++ b/main.cpp	Sat Aug 01 23:57:06 2015 +0000
@@ -99,6 +99,47 @@
     GAUSSIAN_THIRD
 };
 
+struct ModulationSetting{
+    char mode; 
+    char modulation; 
+    char shaping;
+};
+
+struct ocpSetting{
+    bool enabled;
+    char maxCurrent;
+};
+
+struct lnaSetting{
+    char ZIn;
+    bool agc;
+    char gain;
+};
+
+struct syncSetting{
+    bool syncOn;
+    bool fifoFillCondition;
+    char syncSize;
+    char syncTol;
+};
+
+struct packetSetting{
+    bool variableLength;
+    char dcFree;
+    bool crcOn;
+    bool crcAutoClearOff;
+    char addressFiltering;
+    char interPacketRxDelay;
+    bool restartRx;
+    bool autoRxRestartOn;
+    bool aesOn;
+};
+
+struct fifoThresholdSetting{
+    char txStartCondition;
+    char threshold;
+};
+
 SPI radio(PB_15, PB_14, PB_13);
 DigitalOut radioCS(PB_12,1);
 Serial pc(USBTX,USBRX);
@@ -169,14 +210,24 @@
     return fdev;
 }
 
-void setModulation(DataMode mode, Modulation modul, Shaping shape){
+void setModulation(ModulationSetting settings){
     radioCS = 0;
     radio.write(REG_DATA_MODULATION | 0x80);
-    radio.write((mode << 5)&0x60 | ((modul <<3)&0x18) | (shape&0x03));
+    radio.write((settings.mode << 5)&0x60 | ((settings.modulation <<3)&0x18) | (settings.shaping&0x03));
+    radioCS = 1;
 }
 
-void getModulation(DataMode mode, Modulation modul, Shaping shape){
-    //WRITE A GOOD THING HERE
+ModulationSetting getModulation(){
+    ModulationSetting settings;
+    char reg;
+    radioCS = 0;
+    radio.write(REG_DATA_MODULATION);
+    reg= radio.write(0x00)&0xFF;
+    radioCS = 1;
+    settings.mode = (reg&0x60) >> 5;
+    settings.modulation = (reg&0x18) >>3;
+    settings.shaping = (reg&0x03);
+    return settings;
 }
 
 void setBitrate(int bitrate){
@@ -239,32 +290,40 @@
     return level;
 }
 
-void setOCP(bool enabled, char maxCurrent){
+void setOCP(ocpSetting ocp){
     char regOCP = 0;
-    if(enabled){
+    if(ocp.enabled){
         regOCP = 0x10;
     }
-    regOCP |= ((maxCurrent - 45)/5) & 0xFF;
+    regOCP |= ((ocp.maxCurrent - 45)/5) & 0x0F;
     radioCS = 0;
     radio.write(REG_OCP | 0x80);
     radio.write(regOCP);
     radioCS = 1;
 }
 
-void getOCP(){
-    //SOMETHING GOOD HERE
+ocpSetting getOCP(){
+    char reg;
+    ocpSetting ocp;
+    radioCS = 0;
+    radio.write(REG_OCP);
+    reg = radio.write(0x00);
+    radioCS = 1;
+    ocp.enabled = reg>>4;
+    ocp.maxCurrent = (reg & 0x0F)*5+45;
+    return ocp;
 }
 
-void setLNA(char lnaZIn, bool agc, char gain){
+void setLNA(lnaSetting lna){
     char regLNA = 0;
-    if(lnaZIn == 200){
+    if(lna.ZIn == 200){
         regLNA = 0x80;
     }
-    if(!agc){        
-        if(gain>48){
+    if(!lna.agc){        
+        if(lna.gain>48){
             regLNA |= 0x01;
         }else{
-            regLNA |= (gain&0x07);
+            regLNA |= (lna.gain&0x07);
         }
     }
     radioCS = 0;
@@ -273,8 +332,25 @@
     radioCS = 1;
 }
 
-void setLNA(char lnaZIn, bool agc, char gain){
-    //SOMETHING GOOD HERE
+lnaSetting getLNA(){
+    char reg;
+    lnaSetting lna;
+    radioCS = 0;
+    radio.write(REG_LNA);
+    reg = radio.write(0x00);
+    radioCS = 1;
+    if(reg&0x80){
+        lna.ZIn = 200;
+    }else{
+        lna.ZIn = 50;
+    }
+    if(reg&0x07==0){
+        lna.agc = 1;
+    }else{
+        lna.agc = 0;
+    }
+    lna.gain = (reg&0x1A)>>3;
+    return lna;
 }
 
 void setDIOMapping(int regValue){
@@ -285,7 +361,7 @@
     radioCS = 1;
 }
 
-int setDIOMapping(){
+int getDIOMapping(){
     int regValue;
     radioCS = 0;
     radio.write(REG_DIO_MAPPING_1|0x80);
@@ -295,20 +371,42 @@
     return regValue;
 }
 
-void setSyncConfig(bool syncOn, bool fifoFillCondition, char syncSize, char syncTol){
+void setSyncConfig(syncSetting sync){
     char regSync = 0;
-    if(syncOn){
+    if(sync.syncOn){
         regSync |= 0x80;
     }
-    if(fifoFillCondition){
+    if(sync.fifoFillCondition){
         regSync |= 0x40;
     }
-    regSync |= ((syncSize&0x07)<<3);
-    regSync |= (syncTol&0x07);
+    regSync |= ((sync.syncSize&0x07)<<3);
+    regSync |= (sync.syncTol&0x07);
+    radioCS = 0;
+    radio.write(REG_SYNC_CONFIG);
+    radio.write(regSync);
+    radioCS = 1;
 }
 
-void getSyncConfig(){
-    //SOMETHING GOOD
+syncSetting getSyncConfig(){
+    char reg;
+    syncSetting sync;
+    radioCS = 0;
+    radio.write(REG_SYNC_CONFIG);
+    reg = radio.write(0x00);
+    radioCS = 1;
+    if(reg &= 0x80){
+        sync.syncOn = 1;
+    }else{
+        sync.syncOn = 0;
+    }
+    if(reg&0x40){
+        sync.fifoFillCondition = 1;
+    }else{
+        sync.fifoFillCondition = 0;
+    }
+    sync.syncSize = (reg&0x1A)>>3;
+    sync.syncTol = (reg&0x07);
+    return sync;
 }
 
 void setSyncValue(long long value){
@@ -341,34 +439,34 @@
     return value;
 }
 
-void setPacketConfig(bool variableLength, char dcFree, bool crcOn, bool crcAutoClearOff, char addressFiltering, char interPacketRxDelay,bool restartRx,bool autoRxRestartOn, bool aesOn){
+void setPacketConfig(packetSetting packetConfig){
     char regPacketConfig1 = 0x00;
     char regPacketConfig2 = 0x00;
-    if(variableLength){
+    if(packetConfig.variableLength){
         regPacketConfig1 |= 0x80;
     }
-    regPacketConfig1 |= (dcFree&0x03)<<5;
-    if(crcOn){
+    regPacketConfig1 |= (packetConfig.dcFree&0x03)<<5;
+    if(packetConfig.crcOn){
         regPacketConfig1 |= 0x10;
     }
-    if(crcAutoClearOff){
+    if(packetConfig.crcAutoClearOff){
         regPacketConfig1 |= 0x08;
     }
-    regPacketConfig1 |= ((addressFiltering & 0x03)<<1);
+    regPacketConfig1 |= ((packetConfig.addressFiltering & 0x03)<<1);
     
     radioCS = 0;
     radio.write(REG_PACKET_CONFIG_1|0x80);
     radio.write(regPacketConfig1);
     radioCS = 1;
     
-    regPacketConfig2 |= ((interPacketRxDelay&0x0F)<<4);
-    if(restartRx){
+    regPacketConfig2 |= ((packetConfig.interPacketRxDelay&0x0F)<<4);
+    if(packetConfig.restartRx){
         regPacketConfig2 |= (1<<2);
     }
-    if(autoRxRestartOn){
+    if(packetConfig.autoRxRestartOn){
         regPacketConfig2 |= (1<<1);
     }
-    if(aesOn){
+    if(packetConfig.aesOn){
         regPacketConfig2 |= 0x01;
     }
     radioCS = 0;
@@ -377,8 +475,53 @@
     radioCS = 1;
 }
 
-void getPacketConfig(){
-    //SOMETHING GOOD HERE
+packetSetting getPacketConfig(){
+    packetSetting packetConfig;
+    char regPacketConfig1;
+    char regPacketConfig2;
+    radioCS = 0;
+    radio.write(REG_PACKET_CONFIG_1|0x80);
+    regPacketConfig1 = radio.write(0x00);
+    radioCS = 1;
+    radioCS = 0;
+    radio.write(REG_PACKET_CONFIG_2|0x80);
+    regPacketConfig2 = radio.write(0x00);
+    radioCS = 1;
+    if(regPacketConfig1 & 0x80){
+        packetConfig.variableLength = 1;
+    }else{
+        packetConfig.variableLength = 0;
+    }
+    packetConfig.dcFree = (regPacketConfig1&0x60)>>5;
+    if(regPacketConfig1 & 0x10){
+        packetConfig.crcOn = 1;
+    }else{
+        packetConfig.crcOn = 0;
+    }
+    if(regPacketConfig1 & 0x08){
+        packetConfig.crcAutoClearOff = 1;
+    }else{
+        packetConfig.crcAutoClearOff = 1;
+    }
+    packetConfig.addressFiltering = (regPacketConfig1&0x06)>>1;
+    
+    packetConfig.interPacketRxDelay = (regPacketConfig2&0xF0)>>4;
+    if(regPacketConfig2 & 0x04){
+        packetConfig.restartRx = 1;
+    }else{
+        packetConfig.restartRx = 0;
+    }
+    if(regPacketConfig2 & 0x02){
+        packetConfig.autoRxRestartOn = 1;
+    }else{
+        packetConfig.autoRxRestartOn = 0;
+    }
+    if(regPacketConfig2 & 0x01){
+        packetConfig.aesOn = 1;
+    }else{
+        packetConfig.aesOn = 0;
+    }
+    return packetConfig;
 }
 
 void setPayloadLength(char payloadLength){
@@ -398,15 +541,23 @@
     return payloadLength;
 }
 
-void setFifoThreshold(char txStartCondition, char fifoThreshold){
+void setFifoThreshold(fifoThresholdSetting fifo){
     radioCS = 0;
     radio.write(REG_FIFO_THRESH | 0x80);
-    radio.write((txStartCondition<<7)|(fifoThreshold&0x7F));
+    radio.write((fifo.txStartCondition<<7)|(fifo.threshold&0x7F));
     radioCS = 1;
 }
 
-void getFifoThreshold(){
-    //SOMETHING GOOD HERE
+fifoThresholdSetting getFifoThreshold(){
+    fifoThresholdSetting fifo;
+    char reg;
+    radioCS = 0;
+    radio.write(REG_FIFO_THRESH);
+    reg = radio.write(0x00);
+    radioCS = 1;
+    fifo.txStartCondition = reg >> 7;
+    fifo.threshold = reg &0x7F;
+    return fifo;
 }
 
 int main(){