System Management code

Dependencies:   mbed CANBuffer Watchdog MODSERIAL mbed-rtos xbeeRelay IAP

Fork of SystemManagement by Martin Deng

Files at this revision

API Documentation at this revision

Comitter:
pspatel321
Date:
Wed Feb 11 23:09:57 2015 +0000
Parent:
38:8efacce315ae
Commit message:
Updated CAN IDs for datalogging. Changed profile encoding.

Changed in this revision

DataStructures/Headers/DefaultProfile.h Show annotated file Show diff for this revision Revisions of this file
DataStructures/Headers/OperatingInfo.h Show annotated file Show diff for this revision Revisions of this file
DataStructures/Headers/Profile.h Show annotated file Show diff for this revision Revisions of this file
IOobjects/CAN_RxIDs.h Show annotated file Show diff for this revision Revisions of this file
IOobjects/CAN_TxIDs.h Show annotated file Show diff for this revision Revisions of this file
IOobjects/IOobjects.cpp Show annotated file Show diff for this revision Revisions of this file
IOobjects/IOobjects.h Show annotated file Show diff for this revision Revisions of this file
Libs/IMD/IMD.h Show annotated file Show diff for this revision Revisions of this file
Libs/LatchMonitor/LatchMonitor.cpp Show annotated file Show diff for this revision Revisions of this file
Libs/LatchMonitor/LatchMonitor.h Show annotated file Show diff for this revision Revisions of this file
Libs/xbeeRelay.lib Show annotated file Show diff for this revision Revisions of this file
Libs/xbeeRelay/PERMessage.cpp Show diff for this revision Revisions of this file
Libs/xbeeRelay/PERMessage.h Show diff for this revision Revisions of this file
Libs/xbeeRelay/XbeeRelay.cpp Show diff for this revision Revisions of this file
Libs/xbeeRelay/XbeeRelay.h Show diff for this revision Revisions of this file
inCommands/inCommands.cpp Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
outDiagnostics/outDiagnostics.cpp Show annotated file Show diff for this revision Revisions of this file
runTime/runTime.cpp Show annotated file Show diff for this revision Revisions of this file
diff -r 8efacce315ae -r ddf38df9699e DataStructures/Headers/DefaultProfile.h
--- a/DataStructures/Headers/DefaultProfile.h	Sat Feb 07 08:54:51 2015 +0000
+++ b/DataStructures/Headers/DefaultProfile.h	Wed Feb 11 23:09:57 2015 +0000
@@ -27,9 +27,6 @@
     CAN_RX_SIZE,        // CAN rx size
     SERIAL_BAUD,        // Serial port baudrate
     TX_SIZE,            // Serial tx buffer size
-    XBEE_BAUD,          // Xbee baudrate
-    XBEE_TX_SIZE,       // Xbee tx buffer size
-    XBEE_RX_SIZE,       // Xbee rx buffer size
 };
 
 #endif
diff -r 8efacce315ae -r ddf38df9699e DataStructures/Headers/OperatingInfo.h
--- a/DataStructures/Headers/OperatingInfo.h	Sat Feb 07 08:54:51 2015 +0000
+++ b/DataStructures/Headers/OperatingInfo.h	Wed Feb 11 23:09:57 2015 +0000
@@ -7,8 +7,8 @@
 
 enum OperatingMode {
     // MODES
-    FAULT=0,
-    OKAY=1,
+    OKAY=1<<0,
+    FAULT=1<<1,
 };
 
 // Items here will prevent moving from STANDBY to IDLE
@@ -81,15 +81,7 @@
         char imd;
         char ams;
     } latch;
-    
-    struct MsgCounter {     // Telemetry tracking
-        unsigned int msgIn;
-        unsigned int msgOut;
-        float rateOut;
-    };
-    struct MsgCounter xbee1;
-    struct MsgCounter xbee2;
-    
+
     char switchState;
     float internalTemp;
 };
diff -r 8efacce315ae -r ddf38df9699e DataStructures/Headers/Profile.h
--- a/DataStructures/Headers/Profile.h	Sat Feb 07 08:54:51 2015 +0000
+++ b/DataStructures/Headers/Profile.h	Wed Feb 11 23:09:57 2015 +0000
@@ -61,16 +61,10 @@
     unsigned int CANrxSize;             // Size of CAN RX buffer
     unsigned int SerialBaud;            // Serial port baudrate
     unsigned int SerialTxSize;          // Serial TX buffer size
-    unsigned int XbeeBaud;              // Serial port baudrate
-    unsigned int XbeeTxSize;            // Serial TX buffer size
-    unsigned int XbeeRxSize;            // Serial TX buffer size
     CHANGE_FUNC(CANtxSize,          1,    1000)
     CHANGE_FUNC(CANrxSize,          1,    1000)
     CHANGE_FUNC(SerialBaud,         9600, 921600)
     CHANGE_FUNC(SerialTxSize,       1,    10000)
-    CHANGE_FUNC(XbeeBaud,           9600, 921600)
-    CHANGE_FUNC(XbeeTxSize,         1,    10000)
-    CHANGE_FUNC(XbeeRxSize,         1,    10000)
 
     // Load / store / fetch functions
     static bool loadProfile(int index);                     // Load profile from flash into the current RAM object, 0=default, -1=freeze frame
diff -r 8efacce315ae -r ddf38df9699e IOobjects/CAN_RxIDs.h
--- a/IOobjects/CAN_RxIDs.h	Sat Feb 07 08:54:51 2015 +0000
+++ b/IOobjects/CAN_RxIDs.h	Wed Feb 11 23:09:57 2015 +0000
@@ -1,21 +1,20 @@
 #ifndef CAN_RXIDS_H
 #define CAN_RXIDS_H
 
-#define RX_ID_BASE             0x580              // Start at 0x500 for this device
+#define RX_ID_BASE                      0x580                   // Start at 0x500 for this device
 
 // Receive Command IDs
 // NOTE after each command is parsed, a message will return back with the same ID of length 1 with data[0]=1 for success and data[0]=0 for fail
-#define RESET_RX_ID         RX_ID_BASE + 0x01    // Reset over CAN
-#define RESETCLEAR_RX_ID    RX_ID_BASE + 0x02    // Clear all errors and then reset, clean slate startup
-#define CAPTURE_RX_ID       RX_ID_BASE + 0x03    // Artificially capture freeze frame
-#define CLEAR_RX_ID         RX_ID_BASE + 0x04    // Clear a freeze frame error (0), clear every fault (1)
-#define TIME_RX_ID          RX_ID_BASE + 0x05    // Change the time (MM DD YY HH MM SS - 6 bytes)
-#define PROFILE_RX_ID       RX_ID_BASE + 0x06    // Byte[0] = load/write Byte[1] = profile #
-#define SOC_RX_ID           RX_ID_BASE + 0x07    // Change the current SOC to some float from 0 to 1
-#define AH_RX_ID            RX_ID_BASE + 0x08    // Change the current ampHours to some float from 0 to capacity
+#define RESET_RX_ID                     RX_ID_BASE + 0x00       // Reset over CAN
+#define RESETCLEAR_RX_ID                RX_ID_BASE + 0x01       // Clear all errors and then reset, clean slate startup
+#define CLEAR_RX_ID                     RX_ID_BASE + 0x02       // Clear a freeze frame error (0), clear every fault (1)
+#define TIME_RX_ID                      RX_ID_BASE + 0x03       // Change the time (MM DD YY HH MM SS - 6 bytes)
+#define PROFILE_RX_ID                   RX_ID_BASE + 0x04       // Byte[0] = load/write Byte[1] = profile #
 
-#define FAN_CONTROL_ID      RX_ID_BASE + 0x10
-#define PUMP_CONTROL_ID     RX_ID_BASE + 0x11
+#define FAN_CONTROL_RX_ID               RX_ID_BASE + 0x10
+#define PUMP_CONTROL_RX_ID              RX_ID_BASE + 0x11
+#define SOC_RX_ID                       RX_ID_BASE + 0x12       // Change the current SOC to some float from 0 to 1
+#define AH_RX_ID                        RX_ID_BASE + 0x13       // Change the current ampHours to some float from 0 to capacity
 
 // Profile Data Change Requests
 #define PROFILE_CHARGECURRENT_RX_ID     RX_ID_BASE + 0x20
@@ -28,22 +27,20 @@
 #define PROFILE_DCDCSTOPDELAY_RX_ID     RX_ID_BASE + 0x27
 #define PROFILE_DCDC_TAPS_RX_ID         RX_ID_BASE + 0x28
 #define PROFILE_IMDSTARTDELAY_RX_ID     RX_ID_BASE + 0x29
-#define PROFILE_INTERNALOVERTEMP_RX_ID  RX_ID_BASE + 0x2A
-#define PROFILE_CANNOACK_RX_ID          RX_ID_BASE + 0x2B
-#define PROFILE_EXTENDSERIAL_RX_ID      RX_ID_BASE + 0x2C
-#define PROFILE_CANTXSIZE_RX_ID         RX_ID_BASE + 0x2D
-#define PROFILE_CANRXSIZE_RX_ID         RX_ID_BASE + 0x2E
-#define PROFILE_SERIALBAUD_RX_ID        RX_ID_BASE + 0x2F
-#define PROFILE_SERIALTXSIZE_RX_ID      RX_ID_BASE + 0x30
-#define PROFILE_XBEEBAUD_RX_ID          RX_ID_BASE + 0x31
-#define PROFILE_XBEETXSIZE_RX_ID        RX_ID_BASE + 0x32
-#define PROFILE_XBEERXSIZE_RX_ID        RX_ID_BASE + 0x33
+#define PROFILE_AMSSTARTDELAY_RX_ID     RX_ID_BASE + 0x2A
+#define PROFILE_INTERNALOVERTEMP_RX_ID  RX_ID_BASE + 0x2B
+#define PROFILE_CANNOACK_RX_ID          RX_ID_BASE + 0x2C
+#define PROFILE_EXTENDSERIAL_RX_ID      RX_ID_BASE + 0x2D
+#define PROFILE_CANTXSIZE_RX_ID         RX_ID_BASE + 0x2E
+#define PROFILE_CANRXSIZE_RX_ID         RX_ID_BASE + 0x2F
+#define PROFILE_SERIALBAUD_RX_ID        RX_ID_BASE + 0x30
+#define PROFILE_SERIALTXSIZE_RX_ID      RX_ID_BASE + 0x31
 
-#define RX_ID_END                       0x5FF           // End of SYS MGMT receive block
+#define RX_ID_END                       0x5FF       // End of SYS MGMT receive block
 
 // Messages from other devices in the car
-#define CHARGER_ERR_ID          0x700       // Is the charger connected?
-#define AMS_MODE_ID             0x301       // Contains AIRs data
-#define GLOBAL_CAR_RESET_RX_ID  0x602       // Reset button from steering wheel
+#define CHARGER_ERR_RX_ID               0x700       // Is the charger connected?
+#define AMS_MODE_RX_ID                  0x301       // Contains AIRs data
+#define GLOBAL_CAR_RESET_RX_ID          0x602       // Reset button from steering wheel
 
-#endif
\ No newline at end of file
+#endif
diff -r 8efacce315ae -r ddf38df9699e IOobjects/CAN_TxIDs.h
--- a/IOobjects/CAN_TxIDs.h	Sat Feb 07 08:54:51 2015 +0000
+++ b/IOobjects/CAN_TxIDs.h	Wed Feb 11 23:09:57 2015 +0000
@@ -1,45 +1,39 @@
 #ifndef CAN_TXIDS_H
 #define CAN_TXIDS_H
 
-#define BASE_ID                 0x500                // Start at 0x500 for this device
+#define TX_ID_BASE              0x500                // Start at 0x500 for this device
 
 // Transmit IDs - System Mgmt Specific
 // Operating diagnostics
-#define SYS_ERROR_ID            BASE_ID + 0x00       // Error frame - critical errors that require shutdown
-#define SYS_MODE_ID             BASE_ID + 0x01       // Operating mode
-#define SYS_FLAGS_ID            BASE_ID + 0x02       // Signals
-#define SYS_PROFILE_ID          BASE_ID + 0x03       // Profile being used
-#define SYS_TIME_ID             BASE_ID + 0x04       // SysTime and startup time
-#define SYS_XBEE1_MSG_ID        BASE_ID + 0x05       // Message in/out counter for xbee1
-#define SYS_XBEE1_RATE_ID       BASE_ID + 0x06       // Message in/out counter for xbee1
-#define SYS_XBEE2_MSG_ID        BASE_ID + 0x07       // Message in/out counter for xbee2
-#define SYS_XBEE2_RATE_ID       BASE_ID + 0x08       // Message in/out counter for xbee2
-#define SYS_TEMP_ID             BASE_ID + 0x09       // Internal temperature of the glv battery chargerFET
+#define FAULTCODE_TX_ID         TX_ID_BASE + 0x00       // Error frame - critical errors that require shutdown
+#define MODE_TX_ID              TX_ID_BASE + 0x01       // Operating mode
+#define SIGNALS_TX_ID           TX_ID_BASE + 0x02       // Signals
+#define PROFILE_TX_ID           TX_ID_BASE + 0x03       // Profile being used
+#define TIME_TX_ID              TX_ID_BASE + 0x04       // SysTime and startup time
 
 // GLV Battery
-#define SYS_GLV_CURRENT_ID      BASE_ID + 0x10       // GLV battery current
-#define SYS_GLV_CAPACITY_ID     BASE_ID + 0x11       // GLV battery capacity setting
-#define SYS_GLV_AH_ID           BASE_ID + 0x12       // GLV battery amphours
-#define SYS_GLV_SOC_ID          BASE_ID + 0x13       // GLV battery SOC
-#define SYS_GLV_ERROR_ID        BASE_ID + 0x14       // GLV battery error byte
+#define TEMP_TX_ID              TX_ID_BASE + 0x10       // Internal temperature of the glv battery chargerFET
+#define GLV_CURRENT_TX_ID       TX_ID_BASE + 0x11       // GLV battery current
+#define GLV_CAPACITY_TX_ID      TX_ID_BASE + 0x12       // GLV battery capacity setting
+#define GLV_AH_TX_ID            TX_ID_BASE + 0x13       // GLV battery amphours
+#define GLV_SOC_TX_ID           TX_ID_BASE + 0x14       // GLV battery SOC
+#define GLV_ERROR_TX_ID         TX_ID_BASE + 0x15       // GLV battery error byte
 
 // DC-DC Converter
-#define SYS_DCDC_CURRENT_ID     BASE_ID + 0x20       // DC-DC current 
-#define SYS_DCDC_STATUS_ID      BASE_ID + 0x21       // DC-DC status byte
-
-// PWM Channels
-#define SYS_PWM_FAN_ID          BASE_ID + 0x30       // FAN1 actual pwm
-#define SYS_PWM_PUMP_ID         BASE_ID + 0x31       // PUMP1 actual pwm
+#define DCDC_CURRENT_TX_ID      TX_ID_BASE + 0x20       // DC-DC current 
+#define DCDC_STATUS_TX_ID       TX_ID_BASE + 0x21       // DC-DC status byte
+#define PWM_FAN_TX_ID           TX_ID_BASE + 0x22       // FAN1 actual pwm
+#define PWM_PUMP_TX_ID          TX_ID_BASE + 0x23       // PUMP1 actual pwm
 
 // IMD
-#define SYS_IMD_STATUS_ID       BASE_ID + 0x40       // IMD status byte
-#define SYS_IMD_RESIST_ID       BASE_ID + 0x41       // IMD resistance measurement
+#define IMD_STATUS_TX_ID        TX_ID_BASE + 0x30       // IMD status byte
+#define IMD_RESIST_TX_ID        TX_ID_BASE + 0x31       // IMD resistance measurement
 
 // Latch Supervisor states
-#define SYS_IMD_LATCH_ID        BASE_ID + 0x50       // IMD Latch circuit error byte
-#define SYS_AMS_LATCH_ID        BASE_ID + 0x51       // AMS Latch circuit error byte
+#define IMD_LATCH_TX_ID         TX_ID_BASE + 0x40       // IMD Latch circuit error byte
+#define AMS_LATCH_TX_ID         TX_ID_BASE + 0x41       // AMS Latch circuit error byte
 
 // Shutdown Switches
-#define SYS_SWITCHES_ID         BASE_ID + 0x60       // Shutdown Switch State
+#define SWITCHES_TX_ID          TX_ID_BASE + 0x50       // Shutdown Switch State
 
-#endif
\ No newline at end of file
+#endif
diff -r 8efacce315ae -r ddf38df9699e IOobjects/IOobjects.cpp
--- a/IOobjects/IOobjects.cpp	Sat Feb 07 08:54:51 2015 +0000
+++ b/IOobjects/IOobjects.cpp	Wed Feb 11 23:09:57 2015 +0000
@@ -21,9 +21,9 @@
 IMD imd(P1_26);                                      // IMD PWM sense channel to read status and resistance (IMD PWM PIN)
 LatchMonitor AMSlatch(P0_18, P0_22);                 // Supervisor for AMS hardware latch/reset circuit (OK PIN, FAULT PIN, STARTUP DELAY (ms))
 LatchMonitor IMDlatch(P0_17, P0_21);                 // Supervisor for IMD hardware latch/reset circuit (OK PIN, FAULT PIN, STARTUP DELAY (ms))
-MODSERIAL pc(USBTX, USBRX, 1, RX_SIZE);              // Serial to computer for diagnostics, 3kB output buffer, 256 byte input buffer
 DC_DC dcdc(p18, p20, p26, p25, p24, p23, 0.01, 5, 1);// DC-DC converter & high-current load control (CONTROL PIN, CURRENT SENSE PIN, FAN1 PIN, FAN2 PIN, PUMP1 PIN, PUMP2 PIN, PWM PERIOD (sec), FULL-SCALE SLEW (sec))
 Temperature internalTmp(&NXFT15XH103_TABLE, p15);    // Temperature conversion look-up table for internal temperature on the GLV bat charger FET (TABLE PTR, PIN)
-XbeeManager xbeeRelay(p9, p10, p13, p14, XBEE_BAUD, 1, 1);
-//XbeeRelay xbee;
+//XbeeManager xbeeRelay(p9, p10, p13, p14, XBEE_BAUD, 1, 1);
+MODSERIAL pc(USBTX, USBRX, 1, RX_SIZE);              // Software buffered serial
+XbeeRelay xbee;
 DigitalOut extras[] = {(p16), (p17)};                // Unused analog pins driven low
diff -r 8efacce315ae -r ddf38df9699e IOobjects/IOobjects.h
--- a/IOobjects/IOobjects.h	Sat Feb 07 08:54:51 2015 +0000
+++ b/IOobjects/IOobjects.h	Wed Feb 11 23:09:57 2015 +0000
@@ -15,9 +15,9 @@
 #include "PollSwitch.h"
 #include "Temperature.h"
 #include "Watchdog.h"
-#include "XbeeManager.h"
+//#include "XbeeManager.h"
 #include "DataStructures.h"
-//#include "XbeeRelay.h"
+#include "XbeeRelay.h"
 
 extern CANBuffer can;
 extern CoulombCounter glvBat;
@@ -29,7 +29,7 @@
 extern PollSwitch switches;
 extern Temperature internalTmp;
 extern Watchdog wdt;
-//extern XbeeRelay xbee;
-extern XbeeManager xbeeRelay;
+extern XbeeRelay xbee;
+//extern XbeeManager xbeeRelay;
 
 #endif
diff -r 8efacce315ae -r ddf38df9699e Libs/IMD/IMD.h
--- a/Libs/IMD/IMD.h	Sat Feb 07 08:54:51 2015 +0000
+++ b/Libs/IMD/IMD.h	Wed Feb 11 23:09:57 2015 +0000
@@ -6,13 +6,13 @@
 #include "mbed.h"
 
 enum IMDstatus  {
-    OFF         = 0,
-    NORMAL      = 1,
-    UNDERVOLT   = 2,
-    SPEEDSTART  = 3,
-    ERROR       = 4,
-    GROUNDERR   = 5,
-    INVALID     = 6,  
+    OFF         = 1<<0,
+    NORMAL      = 1<<1,
+    UNDERVOLT   = 1<<2,
+    SPEEDSTART  = 1<<3,
+    ERROR       = 1<<4,
+    GROUNDERR   = 1<<5,
+    INVALID     = 1<<6,  
 };
 
 class IMD{
diff -r 8efacce315ae -r ddf38df9699e Libs/LatchMonitor/LatchMonitor.cpp
--- a/Libs/LatchMonitor/LatchMonitor.cpp	Sat Feb 07 08:54:51 2015 +0000
+++ b/Libs/LatchMonitor/LatchMonitor.cpp	Wed Feb 11 23:09:57 2015 +0000
@@ -3,17 +3,16 @@
 LatchMonitor::LatchMonitor(PinName _ok, PinName _fault) : okPin(_ok, PullDown), faultPin(_fault, PullDown)
 {
     started = false;
-    lastStat = 0;
     startDelay = 0;
 }
+
 void LatchMonitor::setup(float* _startDelay)
 {
     startDelay = _startDelay;
 }
+
 void LatchMonitor::delayStart()
 {
-    lastStat = 0;
-    update();
     if (startDelay == 0) return;    // Not setup yet
 
     // Power-on reset detected
@@ -39,9 +38,8 @@
     if (started) {
         ret |= !okPin << 2;                 // Mirror the ok pin when started only
         if (!okPin && !faultPin) {          // If started && okFault but not caught in hardware
-            ret |= HARD_FAULT;
+            //ret |= HARD_FAULT;
         }
     }
-    lastStat = ret;
     return ret;
 }
diff -r 8efacce315ae -r ddf38df9699e Libs/LatchMonitor/LatchMonitor.h
--- a/Libs/LatchMonitor/LatchMonitor.h	Sat Feb 07 08:54:51 2015 +0000
+++ b/Libs/LatchMonitor/LatchMonitor.h	Wed Feb 11 23:09:57 2015 +0000
@@ -21,7 +21,6 @@
     
     char update();
 private:
-    char lastStat;
     float* startDelay;
     Timeout startup;
     void startupDelay();
diff -r 8efacce315ae -r ddf38df9699e Libs/xbeeRelay.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Libs/xbeeRelay.lib	Wed Feb 11 23:09:57 2015 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/teams/Penn-Electric-Racing/code/xbeeRelay/#d98bea800a7b
diff -r 8efacce315ae -r ddf38df9699e Libs/xbeeRelay/PERMessage.cpp
--- a/Libs/xbeeRelay/PERMessage.cpp	Sat Feb 07 08:54:51 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-#include "PERMessage.h"
-
-PERMessage::PERMessage() {
-
-}
-
-PERMessage::PERMessage(char contentID, char deviceID, bool rtr, char length, unsigned char* data) {
-     dataArray[0] = contentID;
-     dataArray[1] = ((deviceID & 0x7) << 5) | (rtr << 4) | (length & 0xF);
-     for (int i = 0; i < (length & 0xF); i++) {
-        dataArray[i+2] = data[i];
-     }
-}
-
-char PERMessage::getContentID() {
-    return dataArray[0];
-}
-
-char PERMessage::getDeviceID() {
-    return (dataArray[1] >> 5) & 0x7;
-}
-
-bool PERMessage::getRTR() {
-    return dataArray[1] & 0x1F;
-}
-
-char PERMessage::getLength() {
-    return dataArray[1] & 0xF;
-}
-
-void PERMessage::getDataArray(char* buffer) {
-    for (int i = 0; i < getLength() + 2; i++) {
-        buffer[i] = dataArray[i];
-    }
-}
-bool PERMessage::setContentID(char contentID) {
-    dataArray[0] = contentID;
-    return true;
-}
-
-bool PERMessage::setDeviceID(char deviceID) {
-    dataArray[1] = dataArray[1] | (deviceID & 0x7) << 5;
-    return true;
-}
-
-bool PERMessage::setRTR(bool RTR) {
-    dataArray[1] = dataArray[1] | RTR << 4;
-    return true;
-}
-
-bool PERMessage::setLength(char length) {
-    dataArray[1] = dataArray[1] | length & 0xF;
-    return true;
-}
diff -r 8efacce315ae -r ddf38df9699e Libs/xbeeRelay/PERMessage.h
--- a/Libs/xbeeRelay/PERMessage.h	Sat Feb 07 08:54:51 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-#ifndef PERMESSAGE
-#define PERMESSAGE
-
-class PERMessage {
-
-public: 
-    PERMessage ();
-    PERMessage (char /* content */, char /* device ID */, bool /* rtr */, char /* length */, unsigned char* /* data[] */);
-    char getContentID();
-    char getDeviceID();
-    bool getRTR();
-    char getLength();
-    void getDataArray(char* /*buffer*/);
-
-
-    bool setContentID(char /*contentID*/);
-    bool setDeviceID(char /*deviceID*/);
-    bool setRTR(bool /*RTR*/);
-    bool setLength(char /* Length*/);
-
-
-private:
-    char dataArray[10];
-};
-
-#endif
\ No newline at end of file
diff -r 8efacce315ae -r ddf38df9699e Libs/xbeeRelay/XbeeRelay.cpp
--- a/Libs/xbeeRelay/XbeeRelay.cpp	Sat Feb 07 08:54:51 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,64 +0,0 @@
-#include "XbeeRelay.h"
-#include "mbed.h"
-//#include "MODDMA.h"
-//#include "MODSERIAL.h"
-#include "PERMessage.h"
-
-#define MOTORCONID 0x181
-#define PCMIDLOW 0x200
-#define PCMIDHIGH 0x2FF
-
-#define MOTORCONSERIALID 0x3
-#define PCMSERIALID 0x2
-
-#define DMA_CHANNEL_XBEE_1 0
-#define DMA_CHANNEL_XBEE_2 1
-
-XbeeRelay::XbeeRelay() : Xbee_e1(p9,p10), Xbee_e2(p13,p14), counter(0) {
-   Xbee_e1.baud(250000);
-   Xbee_e2.baud(250000);
-  // Xbee_e1.MODDMA(&dma);
-   //Xbee_e2.MODDMA(&dma);
-}
-
-bool XbeeRelay::receive(CANMessage cm)  {
-    this->cm = cm;
-    
-    XbeeRelay::parse();
-    return true;//XbeeRelay::send();
-}
-
-void XbeeRelay::parseMotorCon () {
-    unsigned char *dataPtr = cm.data;
-    PERMessage pm(*dataPtr, MOTORCONSERIALID, false, cm.len - 1, (dataPtr+1)); 
-    this->pm = pm;
-}
-
-void XbeeRelay::parseNormal () {
-    unsigned char *dataPtr = cm.data;
-    PERMessage pm(cm.id & 0xFF, (cm.id & 0x700) >> 8, false, cm.len, dataPtr); 
-    this->pm = pm;
-}
-
-void XbeeRelay::parse () {
-    if (cm.id == MOTORCONID) {
-        parseMotorCon();
-    } else {
-        parseNormal();
-    }
-}
-
-bool XbeeRelay::send () {
-    char dataarr[pm.getLength() + 2];
-    pm.getDataArray(dataarr);
-    
-   /* if (!dma.Enabled(DMA_CHANNEL_XBEE_1)) {
-      //  Xbee_e1.dmaSend(dataarr, sizeof(dataarr), DMA_CHANNEL_XBEE_1);
-        return true;
-    } else if (!dma.Enabled(DMA_CHANNEL_XBEE_2)) {
-      //  Xbee_e2.dmaSend(dataarr, sizeof(dataarr), DMA_CHANNEL_XBEE_2);
-        return true;
-    }
-    */
-    return false;
-}
\ No newline at end of file
diff -r 8efacce315ae -r ddf38df9699e Libs/xbeeRelay/XbeeRelay.h
--- a/Libs/xbeeRelay/XbeeRelay.h	Sat Feb 07 08:54:51 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-#ifndef XBEERELAY
-
-#define XBEERELAY
-
-#include "mbed.h"
-//#include "MODDMA.h"
-#include "MODSERIAL.h"
-#include "PERMessage.h"
-
-
-class XbeeRelay {
-
-public:
-    XbeeRelay ();
-    // returns TRUE on successful send, FALSE otherwise
-    bool receive(CANMessage /* cm */);
-    
-
-private:
-    void parse(void /* cm */);
-    void parseMotorCon(void);
-    void parseNormal(void /* deviceID */);
-    bool send(void /*pm*/);
-    char dataLength (char /*contentID*/);
-    MODSERIAL Xbee_e1;
-    MODSERIAL Xbee_e2;
-    unsigned int counter;
-    //MODDMA dma;
-    CANMessage cm;
-    PERMessage pm;
-};
-
-#endif
\ No newline at end of file
diff -r 8efacce315ae -r ddf38df9699e inCommands/inCommands.cpp
--- a/inCommands/inCommands.cpp	Sat Feb 07 08:54:51 2015 +0000
+++ b/inCommands/inCommands.cpp	Wed Feb 11 23:09:57 2015 +0000
@@ -177,9 +177,6 @@
         CHANGE_VAR("CANrxSize",     CANrxSize)
         CHANGE_VAR("SerialBaud",    SerialBaud)
         CHANGE_VAR("SerialTx",      SerialTxSize)
-        CHANGE_VAR("XbeeBaud",      XbeeBaud)
-        CHANGE_VAR("XbeeTxSize",    XbeeTxSize)
-        CHANGE_VAR("XbeeRxSize",    XbeeRxSize)
         CHANGE_VAR("CANack",        CANnoAck)
 
         if (!parsed) return -1;
@@ -191,9 +188,6 @@
         CMP(1, "CANrxSize")             return can.rxSize(param->CANrxSize)?1:-1;
         CMP(1, "SerialBaud")            pc.baud(param->SerialBaud);
         CMP(1, "SerialTx")              return (pc.txBufferSetSize(param->SerialTxSize) == 0)?1:-1;
-        CMP(1, "XbeeBaud")              xbeeRelay.baud(param->XbeeBaud);
-        CMP(1, "XbeeTxSize")            return (xbeeRelay.txSize(param->XbeeTxSize))?1:-1;
-        CMP(1, "XbeeRxSize")            return (xbeeRelay.rxSize(param->XbeeRxSize))?1:-1;
 
         return 1;
     }
@@ -357,6 +351,8 @@
     } else {
         if (!can.rxRead(msg)) return false;
     }
+    xbee.receive(msg);
+
     // Redirect global car reset
     if (msg.id == GLOBAL_CAR_RESET_RX_ID) msg.id = RESETCLEAR_RX_ID;
 
@@ -369,8 +365,8 @@
             }
             CAN_FAIL
 
-        
-        // Clear non-volatile fault flags, then reset microcontroller
+
+            // Clear non-volatile fault flags, then reset microcontroller
         case (RESETCLEAR_RX_ID):
             if (msg.len == 0) {                 // Length must = 0
                 FreezeFrame::clearError();
@@ -378,30 +374,13 @@
                 CAN_SUCCESS
             }
             CAN_FAIL
-
-        // Artificially capture a freeze frame
-        case (CAPTURE_RX_ID):
-            if (msg.len == 0) {                         // Length must = 0
-                if (!FreezeFrame::getError()) {         // Only allow capture if freeze frame from the last error was read
-                    if (FreezeFrame::writeFrame()) {    // Capture the RAM contents to flash
-                        CAN_SUCCESS
-                    }
-                }
-            }
-            CAN_FAIL
-
-        // Clear fault conditions
+            
+            // Clear fault conditions
         case (CLEAR_RX_ID):
-            if (msg.len == 1) {                         // One data byte
-                if (msg.data[0] == 0) {                 // Clear only freeze frame error if = 0
-                    FreezeFrame::clearError();          // Clear non-volatile freeze frame marker
-                    CAN_SUCCESS
-                }
-                if (msg.data[0] == 1) {                 // Clear everything if = 1
-                    runTime::clearFaults();
-                    op->faultCode = 0;
-                    CAN_SUCCESS
-                }
+            if (msg.len == 0) {                         // No data byte
+                runTime::clearFaults();
+                op->faultCode = 0;
+                CAN_SUCCESS
             }
             CAN_FAIL
 
@@ -427,9 +406,15 @@
             // RAM and flash profile manipulations
         case (PROFILE_RX_ID):
             if (msg.len == 2*sizeof(char)) {                    // 2 command bytes
+                int index=-2;
+                for (int i = 0; i < NUM_STORED_PROFILES+1; i++) {   // Get the profile number
+                    if (msg.data[1] == (1<<i))  index=i;
+                }
+                if (msg.data[1] == 1<<6)   index=-1;                // Special case for Freeze
+                if (index == -2) {                              // Not matched to anything, fail
+                    CAN_FAIL
+                }
                 if (msg.data[0] == 0) {                         // Load profile from a flash location to RAM
-                    int index = msg.data[1];                    // Second byte contains profile index
-                    if (msg.data[1] == 0xff) index = -1;        // If freeze (special case)
                     if (Profile::loadProfile(index)) {          // Attempt to load (copy flash to RAM)
                         op->profileIndex = Profile::usingProfile();     // Change the currently loaded profile marker
                         op->profileModded = false;                      // Mark it as a fresh, unmodified profile
@@ -437,8 +422,6 @@
                     }
                 }
                 if (msg.data[0] == 1) {                         // Write profile to flash from RAM
-                    int index = msg.data[1];                    // Get which slot to write to from message
-                    if (msg.data[1] == 0xff) index = -1;        // If freeze (special case)
                     bool s = Profile::saveProfile(index);       // Write profile to flash slot
                     if (s) {
                         op->profileIndex = Profile::usingProfile();     // Change the currently loaded profile marker
@@ -449,30 +432,30 @@
             }
             CAN_FAIL
 
-        case FAN_CONTROL_ID:
+        case FAN_CONTROL_RX_ID:
             if (msg.len != 2*sizeof(float)) return false;
             REFRESH_TIMEOUT(FANS)
             op->dcdc.request.fan1 = *((float*)((void*)(&msg.data[0])));
             op->dcdc.request.fan2 = *((float*)((void*)(&msg.data[4])));
             return true;
 
-        case PUMP_CONTROL_ID:
+        case PUMP_CONTROL_RX_ID:
             if (msg.len != 2*sizeof(float)) return false;
             REFRESH_TIMEOUT(PUMPS)
             op->dcdc.request.pump1 = *((float*)((void*)(&msg.data[0])));
             op->dcdc.request.pump2 = *((float*)((void*)(&msg.data[4])));
             return true;
 
-        case AMS_MODE_ID:
+        case AMS_MODE_RX_ID:
             if (msg.len != sizeof(char)) return false;
             REFRESH_TIMEOUT(AIRS_CLOSED)
-            if (msg.data[0] & 1<<2) {     // AIRs closed?
+            if (msg.data[0] & 1<<3) {     // AIRs closed?
                 op->signals |= AIRS_CLOSED;
             } else {
                 op->signals &= ~AIRS_CLOSED;
             }
             return true;
-        case CHARGER_ERR_ID:
+        case CHARGER_ERR_RX_ID:
             REFRESH_TIMEOUT(CHARGER_DET)
             op->signals |= CHARGER_DET;
             return true;
@@ -491,6 +474,7 @@
     CAN_CHANGE(dcdcStopDelay,           PROFILE_DCDCSTOPDELAY_RX_ID     )
     CAN_CHANGE(dcdc_taps,               PROFILE_DCDC_TAPS_RX_ID         )
     CAN_CHANGE(imdStartDelay,           PROFILE_IMDSTARTDELAY_RX_ID     )
+    CAN_CHANGE(amsStartDelay,           PROFILE_AMSSTARTDELAY_RX_ID     )
     CAN_CHANGE(internalOverTemp,        PROFILE_INTERNALOVERTEMP_RX_ID  )
     CAN_CHANGE(CANnoAck,                PROFILE_CANNOACK_RX_ID          )
     CAN_CHANGE(extendedSerial,          PROFILE_EXTENDSERIAL_RX_ID      )
@@ -498,9 +482,6 @@
     CAN_CHANGE(CANrxSize,               PROFILE_CANRXSIZE_RX_ID         )
     CAN_CHANGE(SerialBaud,              PROFILE_SERIALBAUD_RX_ID        )
     CAN_CHANGE(SerialTxSize,            PROFILE_SERIALTXSIZE_RX_ID      )
-    CAN_CHANGE(XbeeBaud,                PROFILE_XBEEBAUD_RX_ID          )
-    CAN_CHANGE(XbeeTxSize,              PROFILE_XBEETXSIZE_RX_ID        )
-    CAN_CHANGE(XbeeRxSize,              PROFILE_XBEERXSIZE_RX_ID        )
 
     if (!parsed) return false;
 
@@ -511,13 +492,11 @@
     if (msg.id == PROFILE_CANRXSIZE_RX_ID       )   return can.rxSize(param->CANrxSize)?1:-1;
     if (msg.id == PROFILE_SERIALBAUD_RX_ID      )   pc.baud(param->SerialBaud);
     if (msg.id == PROFILE_SERIALTXSIZE_RX_ID    )   return (pc.txBufferSetSize(param->SerialTxSize) == 0)?1:-1;
-    if (msg.id == PROFILE_XBEEBAUD_RX_ID        )   xbeeRelay.baud(param->XbeeBaud);
-    if (msg.id == PROFILE_XBEETXSIZE_RX_ID      )   return (xbeeRelay.txSize(param->XbeeTxSize))?1:-1;
-    if (msg.id == PROFILE_XBEERXSIZE_RX_ID      )   return (xbeeRelay.rxSize(param->XbeeRxSize))?1:-1;
 
     return true;
 }
 // Check for incoming messages from the xbees, relay them to the CAN function and send them out on the bus
+/*
 bool receiveMsgXbee()
 {
     CANMessage msg;
@@ -526,14 +505,13 @@
         serviceCAN(&msg);                               // Send it into the local serviceCAN routine
         return true;
     } else return false;
-}
-
+}*/
 
 void inCommands::thread_getInputs(void const* args)
 {
     while(1) {
         serviceCAN(0);
-        receiveMsgXbee();
+        //receiveMsgXbee();
 
         int ret = serviceSerial();
         if (ret == -1) tempData.parseGoodChar = 'x';
diff -r 8efacce315ae -r ddf38df9699e main.cpp
--- a/main.cpp	Sat Feb 07 08:54:51 2015 +0000
+++ b/main.cpp	Wed Feb 11 23:09:57 2015 +0000
@@ -8,8 +8,8 @@
     tempData.wdtThreadId = Thread::gettid();
     wdt.kick(WDT_TIME);
     while(1) {
-        Thread::wait(100);
-        //Thread::signal_wait(0x1F);
+        //Thread::wait(100);
+        Thread::signal_wait(0x1F);
         wdt.kick();
     }
 }
@@ -64,9 +64,9 @@
     can.rxSize(param->CANrxSize);
     pc.baud(param->SerialBaud);
     pc.txBufferSetSize(param->SerialTxSize);
-    xbeeRelay.baud(param->XbeeBaud);
-    xbeeRelay.txSize(param->XbeeTxSize);
-    xbeeRelay.rxSize(param->XbeeRxSize);
+    //xbeeRelay.baud(param->XbeeBaud);
+    //xbeeRelay.txSize(param->XbeeTxSize);
+    //xbeeRelay.rxSize(param->XbeeRxSize);
     
     // INITIAL SETUP, LINK PROFILE VARIABLES
     glvBat.changeCapacity(param->nominalCapacity);
diff -r 8efacce315ae -r ddf38df9699e outDiagnostics/outDiagnostics.cpp
--- a/outDiagnostics/outDiagnostics.cpp	Sat Feb 07 08:54:51 2015 +0000
+++ b/outDiagnostics/outDiagnostics.cpp	Wed Feb 11 23:09:57 2015 +0000
@@ -122,9 +122,6 @@
             ADD_SPRINTF_LINE
             snprintf(temp, max_charsPerLine, "CANtxSize:   %4d %sCANrxSize: %4d %sSerialBaud: %6d%sSerialTx:  %5d",  dashParam->CANtxSize,barSpace, dashParam->CANrxSize,barSpace, dashParam->SerialBaud,barSpace, dashParam->SerialTxSize);
             ADD_SPRINTF_LINE
-            snprintf(temp, max_charsPerLine, "XbeeBaud:  %6d %sXbeeTxSize: %4d%sXbeeRxSize: %4d  %s CANack:   %5s",  dashParam->XbeeBaud, barSpace, dashParam->XbeeTxSize,barSpace, dashParam->XbeeRxSize,barSpace, dashParam->CANnoAck?"NOACK":"ACK");
-            ADD_SPRINTF_LINE
-
             BLANK_LINE
         }
         snprintf(temp, max_charsPerLine, " Operating Info %s", freeze?"(Viewing Freeze of Last Fault) ":"");
@@ -257,8 +254,15 @@
         BLANK_LINE
         snprintf(temp, max_charsPerLine, " IMD %s", freeze?"(Viewing Freeze of Last Fault) ":"");
         TITLE(temp)
-        const char IMDstr[7][12] = {"OFF","NORMAL","UNDERVOLT","SPEEDSTART","ERROR","GROUNDFLT","INVALID"};
-        sprintf(temp, "Status: %10s   Resistance: %7.0fKohm   Error: %3s", IMDstr[dashOp->imd.status], dashOp->imd.resistance/1.0e3, dashOp->imd.error?"ERR":"OK");
+        char imdStatN=6;
+        if (dashOp->imd.status & OFF) imdStatN=0;
+        if (dashOp->imd.status & NORMAL) imdStatN=1;
+        if (dashOp->imd.status & UNDERVOLT) imdStatN=2;
+        if (dashOp->imd.status & SPEEDSTART) imdStatN=3;
+        if (dashOp->imd.status & ERROR) imdStatN=4;
+        if (dashOp->imd.status & GROUNDERR) imdStatN=5;
+        const char IMDstr[7][12] = {"OFF","NORMAL","UNDERVOLT","SPEEDSTART","ERROR","GROUNDERR","INVALID"};
+        sprintf(temp, "Status: %10s   Resistance: %7.0fKohm   Error: %3s", IMDstr[imdStatN], dashOp->imd.resistance/1.0e3, dashOp->imd.error?"ERR":"OK");
         ADD_SPRINTF_LINE
 
         BLANK_LINE
@@ -280,14 +284,6 @@
         else sprintf(temp, "%s is OPEN.", switchNames[switches-1]);
         ADD_SPRINTF_LINE
 
-        BLANK_LINE
-        snprintf(temp, max_charsPerLine, " Telemetry %s", freeze?"(Viewing Freeze of Last Fault) ":"");
-        TITLE(temp)
-        sprintf(temp, "Channel 1 -    MsgIn: %5d   MsgOut: %5d %5.2f", dashOp->xbee1.msgIn, dashOp->xbee1.msgOut, dashOp->xbee1.rateOut);
-        ADD_SPRINTF_LINE
-        sprintf(temp, "Channel 2 -    MsgIn: %5d   MsgOut: %5d %5.2f", dashOp->xbee2.msgIn, dashOp->xbee2.msgOut, dashOp->xbee2.rateOut);
-        ADD_SPRINTF_LINE
-
         // Erase screen every few counts to remove glitches
         static int count = 0;
         if (count % 50 == 0 || lastModeExtended != inExtendedMode) {
@@ -334,56 +330,53 @@
 
         // OPERATING DIAGNOSTICS
         // Error Frame
-        CAN_SINGLE(faultCode,   SYS_ERROR_ID)
+        CAN_SINGLE(faultCode,   FAULTCODE_TX_ID)
 
         // Mode
-        CAN_SINGLE(mode,        SYS_MODE_ID)
+        CAN_SINGLE(mode,        MODE_TX_ID)
 
         // Flags
-        CAN_SINGLE(signals,     SYS_FLAGS_ID)
+        CAN_SINGLE(signals,     SIGNALS_TX_ID)
 
         // Profile
-        char byte = (op->profileIndex != -1) ? op->profileIndex : 1<<6;   // Mark the second to last bit of the byte if using Freeze profile (data[0]=64 for freeze, data[0]=0 for default)
-        byte |= (op->profileModded) ? 1<<7 : 0;                           // Mark the last bit of the byte if the profile was modified (OR'd with profile id from above)
-        SEND_CAN_SINGLE(byte, SYS_PROFILE_ID);
+        char byte=0;
+        byte = (op->profileIndex != -1)? 1 << op->profileIndex : 1<<6;
+        byte |= (op->profileModded) ? 1<<7 : 0;     // Mark the last bit of the byte if the profile was modified (OR'd with profile id from above)
+        SEND_CAN_SINGLE(byte, PROFILE_TX_ID);
 
         // Time
-        CAN_PAIR(SysTime,       startTime,      SYS_TIME_ID)
-
-        // Xbee1 Counter
-        CAN_PAIR(xbee1.msgIn,   xbee1.msgOut,   SYS_XBEE1_MSG_ID)
-
-        // Xbee2 Counter
-        CAN_PAIR(xbee2.msgIn,   xbee2.msgOut,   SYS_XBEE2_MSG_ID)
+        CAN_PAIR(SysTime,       startTime,      TIME_TX_ID)
 
         // Internal temperature
-        CAN_SINGLE(internalTemp, SYS_TEMP_ID)
+        CAN_SINGLE(internalTemp, TEMP_TX_ID)
 
         // GLV Battery
-        CAN_SINGLE(glvBat.current,  SYS_GLV_CURRENT_ID)
-        CAN_SINGLE(glvBat.capacity, SYS_GLV_CAPACITY_ID)
-        CAN_SINGLE(glvBat.Ah,       SYS_GLV_AH_ID)
-        CAN_SINGLE(glvBat.SOC,      SYS_GLV_SOC_ID)
-        CAN_SINGLE(glvBat.error,    SYS_GLV_ERROR_ID)
+        CAN_SINGLE(glvBat.current,  GLV_CURRENT_TX_ID)
+        CAN_SINGLE(glvBat.capacity, GLV_CAPACITY_TX_ID)
+        CAN_SINGLE(glvBat.Ah,       GLV_AH_TX_ID)
+        CAN_SINGLE(glvBat.SOC,      GLV_SOC_TX_ID)
+        CAN_SINGLE(glvBat.error,    GLV_ERROR_TX_ID)
 
         // DC-DC Converter
-        CAN_SINGLE(dcdc.current,    SYS_DCDC_CURRENT_ID)
-        CAN_SINGLE(dcdc.status,     SYS_DCDC_STATUS_ID)
+        CAN_SINGLE(dcdc.current,    DCDC_CURRENT_TX_ID)
+        CAN_SINGLE(dcdc.status,     DCDC_STATUS_TX_ID)
 
         // PWM Channels
-        CAN_PAIR(dcdc.actual.fan1,  dcdc.actual.fan2,  SYS_PWM_FAN_ID)
-        CAN_PAIR(dcdc.actual.pump1, dcdc.actual.pump2, SYS_PWM_PUMP_ID)
+        CAN_PAIR(dcdc.actual.fan1,  dcdc.actual.fan2,  PWM_FAN_TX_ID)
+        CAN_PAIR(dcdc.actual.pump1, dcdc.actual.pump2, PWM_PUMP_TX_ID)
 
         // IMD
-        CAN_SINGLE(imd.status,      SYS_IMD_STATUS_ID)
-        CAN_SINGLE(imd.resistance,  SYS_IMD_RESIST_ID)
+        CAN_SINGLE(imd.status,      IMD_STATUS_TX_ID)
+        CAN_SINGLE(imd.resistance,  IMD_RESIST_TX_ID)
 
         // Latches
-        CAN_SINGLE(latch.imd,       SYS_IMD_LATCH_ID)
-        CAN_SINGLE(latch.ams,       SYS_AMS_LATCH_ID)
+        CAN_SINGLE(latch.imd,       IMD_LATCH_TX_ID)
+        CAN_SINGLE(latch.ams,       AMS_LATCH_TX_ID)
 
         // Shutdown Switches
-        CAN_SINGLE(switchState,     SYS_SWITCHES_ID)
+        uint16_t tmp=0;
+        if (op->switchState != 0) tmp |= 1 << (op->switchState-1);
+        SEND_CAN_SINGLE(tmp,        SWITCHES_TX_ID);
 
         osSignalSet((osThreadId)(tempData.wdtThreadId), 1<<4);      // Signal watchdog thread
         Thread::wait(CAN_LOOP*1000);
diff -r 8efacce315ae -r ddf38df9699e runTime/runTime.cpp
--- a/runTime/runTime.cpp	Sat Feb 07 08:54:51 2015 +0000
+++ b/runTime/runTime.cpp	Wed Feb 11 23:09:57 2015 +0000
@@ -44,16 +44,16 @@
     op->internalTemp        = internalTmp.read();
 
     // Telemetry trackers
-    op->xbee1.msgIn         = xbeeRelay.counterX1in;
-    op->xbee1.msgOut        = xbeeRelay.counterX1out;
-    op->xbee1.msgIn         = xbeeRelay.counterX2in;
-    op->xbee2.msgOut        = xbeeRelay.counterX2out;
-    if (counter++ % 10 == 0) {                               // Do every 1 second
-        op->xbee1.rateOut   = xbeeRelay.bytesX1out / 1000.0;   // Measure data rate in KB/s
-        op->xbee2.rateOut   = xbeeRelay.bytesX2out / 1000.0;   
-        xbeeRelay.bytesX1out = 0;                            // Clear every second
-        xbeeRelay.bytesX2out = 0;
-    }
+ //   op->xbee1.msgIn         = xbeeRelay.counterX1in;
+ //   op->xbee1.msgOut        = xbeeRelay.counterX1out;
+ //   op->xbee1.msgIn         = xbeeRelay.counterX2in;
+ //   op->xbee2.msgOut        = xbeeRelay.counterX2out;
+//    if (counter++ % 10 == 0) {                               // Do every 1 second
+//        op->xbee1.rateOut   = xbeeRelay.bytesX1out / 1000.0;   // Measure data rate in KB/s
+//        op->xbee2.rateOut   = xbeeRelay.bytesX2out / 1000.0;   
+//        xbeeRelay.bytesX1out = 0;                            // Clear every second
+ //       xbeeRelay.bytesX2out = 0;
+ //   }
     
     // CATCH ERRORS
     if (op->glvBat.error)                                   op->faultCode |= GLVBAT_FAULT;
@@ -63,7 +63,7 @@
     if (op->latch.imd & HARD_FAULT)                         op->faultCode |= IMD_LATCH;
     if (op->imd.error)                                      op->faultCode |= IMD_FAULT;
     
-    if (FreezeFrame::getError())                            op->faultCode |= FREEZE_FRAME;
+    if (FreezeFrame::getError())                          ;//  op->faultCode |= FREEZE_FRAME;
     else                                                    op->faultCode &= ~FREEZE_FRAME;
     
     // UPDATE MODE