AE11 GUI for PICO

Dependencies:   max32625pico USBDevice

Revision:
0:a13d6826cf66
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Jun 25 17:25:24 2020 +0000
@@ -0,0 +1,557 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////////
+// MAX32625PICO FIRMWARE FOR MAXIM AE11 EVBs
+// Revision:    1.3
+// Date:        09/18/2019
+// Author:      Bill Smith
+///////////////////////////////////////////////////////////////////////////////////////////////////////
+
+#include "mbed.h"
+#include "USBHID.h"
+#include "max32625pico.h"
+#include "i2c.h"
+
+// configure VDDIOH to local 3.3V supply, set dipVio and swdVio to 1.8V supply
+MAX32625PICO pico(MAX32625PICO::IOH_3V3, MAX32625PICO::VIO_1V8, MAX32625PICO::VIO_1V8);
+
+// We declare a USBHID device.
+// HID In/Out Reports are 64 Bytes long
+// Vendor ID (VID):     0x0B6A  // Maxim Integrated
+// Product ID (PID):    0x0001  // 
+// Serial Number:       0x0001  //
+USBHID hid(64, 64, 0x0B6A, 0x0003, 0x0001, true);
+
+InterruptIn alertb1(P3_2);             // Interrupt PIN (INPUT)
+InterruptIn alertb2(P3_3);             // Interrupt PIN (INPUT)
+
+DigitalOut red_led(LED1);
+DigitalOut green_led(LED2);
+DigitalOut blue_led(LED3);
+
+Timeout to_alertb1;                    // ALERTB1 timeout
+Timeout to_alertb2;                    // ALERTB2 timeout
+
+HID_REPORT send_report;
+HID_REPORT recv_report;
+
+//-----------------------------------------------------------------------------------------------------
+// USB COMMANDS
+//-----------------------------------------------------------------------------------------------------
+// LED Command
+#define WRITE_LED                   0x20    // Send data to the RGB LED
+
+// I2C1 Commands
+#define QUICK_WRITE_I2C1            0x30    // Send Device Address on I2C Master 1, look for ACK
+#define READ_BYTE_I2C1              0x31    // Read Data Byte (8-bits) from Register of I2C Device
+#define WRITE_BYTE_I2C1             0x32    // Write Data Byte (8-bits) to Register of I2C Device
+#define READ_WORD_I2C1              0x33    // Read Data Word (16-bits) from Register of I2C Device
+#define WRITE_WORD_I2C1             0x34    // Write Data Word (16-bits) to Register of I2C Device
+#define WRITE_BLOCK_I2C1            0x3A    // Write Data Block to Register of I2C Device
+#define SET_I2C_ADDR                0x3E    // Set I2C Slave Address
+#define GET_I2C_ADDR                0x3F    // Get I2C Slave Address
+
+// I2C2 Commands
+//#define QUICK_WRITE_I2C2            0x35    // Send Device Address on I2C Master 2, look for ACK
+//#define READ_BYTE_I2C2              0x36    // Read Data Byte (8-bits) from Register of I2C Device
+//#define WRITE_BYTE_I2C2             0x37    // Write Data Byte (8-bits) to Register of I2C Device
+//#define READ_WORD_I2C2              0x38    // Read Data Word (16-bits) from Register of I2C Device
+//#define WRITE_WORD_I2C2             0x39    // Write Data Word (16-bits) to Register of I2C Device
+//#define WRITE_BLOCK_I2C2            0x3B    // Write Data Block to Register of I2C Device
+
+// AE11 Commands
+#define GET_FUNC_REGS               0x40    // Return
+#define GET_VENDOR_REGS             0x41    // Return
+#define GET_INT_REGS                0x42    // Return
+#define GET_MASK_REGS               0x43    // Return
+#define GET_CTRL_REGS               0x44    // Return
+#define GET_TAB1_REGS               0x45    // Return
+#define GET_OTP_DATA_REGS           0x46    // Return
+#define GET_OTP_TEST_CMD_REGS       0x47    // Return
+#define GET_OTP_TEST_MODE_REGS      0x48    // Return
+#define GET_OTP_TEST_OVRD_REGS      0x49    // Return
+#define OTP_REGS_UNLOCK             0x4A    // Return 
+#define OTP_REGS_LOCK               0x4B    // Return     
+
+// INTERRUPT Commands
+#define ALERTB1_ASSERTED            0xF0    // ALERTB1 Interrupt
+#define CLEAR_INTS                  0xF2    // Clear All Interrupts
+
+// LED CONSTANTS
+#define LEDS_OFF        0x00
+#define RED             0x01
+#define GREEN           0x02
+#define BLUE            0x03
+#define YELLOW          0x04
+
+// LOGICAL CONSTANTS
+#define OFF             0x00
+#define ON              0x01
+
+char FUNC_REGS[63] = {  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
+                        0x0A, 0x0B, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+                        0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 
+                        0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2E, 0x2F, 
+                        0x30, 0x50, 0x51, 0x70, 0x71, 0x74, 0x75, 0x76, 0x77, 0x78, 
+                        0x79, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 
+                        0x89, 0x8A, 0x8B };
+                        
+char OTP_DATA_REGS[36] = {  0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
+                            0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3,
+                            0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD,
+                            0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3 };
+
+char OTP_TEST_CMD_REGS[16] = {  0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 
+                                0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF };
+                                
+char OTP_TEST_MODE_REGS[23] = { 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9,
+                                0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, 0xE0, 0xE1, 0xE2, 0xE3,
+                                0xE4, 0xE5, 0xE6 };
+                                
+char OTP_TEST_OVRD_REGS[13] = { 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9,
+                                0xFA, 0xFB, 0xFC };
+                     
+char VENDOR_REGS[12] = {    0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
+                            0x8A, 0x8B };
+
+char INT_REGS[8] = {    0x10, 0x11, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x8B };
+
+char MASK_REGS[5] = {   0x12, 0x13, 0x14, 0x15, 0x16 };
+
+char CTRL_REGS[5] = {   0x18, 0x19, 0x1A, 0x1B, 0x1C };
+
+char TAB1_REGS[29] = {  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 
+                        0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x80, 0x81, 0x82, 
+                        0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B };
+
+//-----------------------------------------------------------------------------------------------------
+// VARIABLES
+//-----------------------------------------------------------------------------------------------------
+char I2C1_RXDATA[40];
+//char I2C2_RXDATA[40];
+char I2C1_TXDATA[40];
+//char I2C2_TXDATA[40];
+static char ALERTB1_STATE = 0x00;              // ALERTB1 PIN STATE
+static bool ALERTB1_CHANGED = false;
+static char I2C_ADDR = 0x00;
+
+
+//-----------------------------------------------------------------------------------------------------
+// ALERTB1 INTERRUPT SERVICE ROUTINE
+//-----------------------------------------------------------------------------------------------------
+void test_alertb1_low()
+{
+    if(alertb1.read() == 0)
+    {
+        ALERTB1_STATE = 0x01;  // Capture the state of the ALERTB1 pin
+        ALERTB1_CHANGED = true;
+    }
+} 
+
+void test_alertb1_high()
+{
+    if(alertb1.read() == 1)
+    {
+        ALERTB1_STATE = 0x00;  // Capture the state of the ALERTB1 pin
+        ALERTB1_CHANGED = true;
+    }
+} 
+
+void ALERTB1_FALL_ISR()
+{
+    to_alertb1.attach(test_alertb1_low, 0.1);
+}
+
+void ALERTB1_RISE_ISR()
+{
+    to_alertb1.attach(test_alertb1_high, 0.1);
+}
+
+void StartUp_LEDs()
+{
+    red_led = 0;    // Turn ON RED LED
+    wait(0.3);
+    red_led = 1;    // Turn OFF RED LED
+    green_led = 0;  // Turn ON GREEN LED
+    wait(0.3);
+    green_led = 1;  // Turn OFF GREEN LED
+    blue_led = 0;   // Turn ON BLUE LED 
+    wait(0.3);   
+    blue_led = 1;   // Turn OFF BLUE LED   
+}
+
+
+// main() runs in its own thread in the OS
+int main()
+{
+    send_report.length = 64;
+    recv_report.length = 64;
+    
+    StartUp_LEDs(); // Cycle LEDs to show startup
+    
+    Init_I2C();     // Make sure we can talk
+    
+    alertb1.fall(&ALERTB1_FALL_ISR);          // Attaches ALERTB1 to the ISR
+    alertb1.rise(&ALERTB1_RISE_ISR);
+    
+    while (true) 
+    {
+        if(ALERTB1_CHANGED)
+        {
+            send_report.data[0] = ALERTB1_ASSERTED;        // Echo Command
+            send_report.data[1] = ALERTB1_STATE;           // Echo INTB State
+            
+            for(int i=0;i<8;i++)
+            {
+                send_report.data[2 + i] = I2C_Read_Byte(0x00, I2C_ADDR, INT_REGS[i]);       // Slave Address must be set!              
+            }
+                    
+            ALERTB1_CHANGED = false;                    // Clear the INTB State Changed Flag
+            hid.sendNB(&send_report);                   // Send the report (Non-blocking)
+        }
+        
+        if(hid.readNB(&recv_report)) 
+        {
+            switch(recv_report.data[0])
+            {
+            //-----------------------------------------------------------------------------------------------------------------
+                case WRITE_LED:             // COMMAND [0x20] - WRITE TO RGB LED
+            //-----------------------------------------------------------------------------------------------------------------
+                    switch(recv_report.data[1])
+                    {
+                        case LEDS_OFF:
+                            red_led = 1;    // Turn OFF RED LED
+                            green_led = 1;  // Turn OFF GREEN LED
+                            blue_led = 1;   // Turn OFF BLUE LED
+                            break;
+                        case RED:
+                            if(recv_report.data[2] == 1){red_led = 0;} else {red_led = 1;}
+                            break;
+                        case GREEN:
+                            if(recv_report.data[2] == 1){green_led = 0;} else {green_led = 1;}
+                            break; 
+                        case BLUE:
+                            if(recv_report.data[2] == 1){blue_led = 0;} else {blue_led = 1;}
+                            break;
+                        default:
+                            break;
+                    }// End Switch (RD1)
+                        
+                    send_report.data[0] = recv_report.data[0];                              // Echo Command
+                    send_report.data[1] = recv_report.data[1];                              // Echo Subcommand 1
+                    send_report.data[2] = recv_report.data[2];                              // Echo Subcommand 2
+                    break;
+            //-----------------------------------------------------------------------------------------------------------------
+              case QUICK_WRITE_I2C1:        // COMMAND [0x30] - QUICK WRITE TO I2C1
+            //-----------------------------------------------------------------------------------------------------------------                    
+                    send_report.data[0] = QUICK_WRITE_I2C1;                                 // Echo Command
+                    send_report.data[1] = recv_report.data[1];                              // Echo Subcommand                   
+                    send_report.data[2] = I2C_Quick_Write(0x00, recv_report.data[1]);       // Echo ACK/NACK Status
+                    break;
+            //-----------------------------------------------------------------------------------------------------------------
+                case READ_BYTE_I2C1:        // COMMAND [0x31] - BYTE READ FROM I2C1
+            //-----------------------------------------------------------------------------------------------------------------                     
+                    send_report.data[0] = READ_BYTE_I2C1;                                   // Echo Command
+                    send_report.data[1] = recv_report.data[1];                              // Echo Device Address
+                    send_report.data[2] = recv_report.data[2];                              // Echo Register 
+                    send_report.data[3] = I2C_Read_Byte(0x00, recv_report.data[1], recv_report.data[2]);   // Return Data  
+                    break;
+            //-----------------------------------------------------------------------------------------------------------------
+               case WRITE_BYTE_I2C1:        // COMMAND [0x32] - BYTE WRITE TO I2C1 
+            //-----------------------------------------------------------------------------------------------------------------                     
+                    send_report.data[0] = WRITE_BYTE_I2C1;                                  // Echo Command
+                    send_report.data[1] = recv_report.data[1];                              // Echo Device Address                   
+                    send_report.data[2] = recv_report.data[2];                              // Echo Register
+                    send_report.data[3] = recv_report.data[3];                              // Echo Data
+                    send_report.data[4] = I2C_Write_Register(0x00, recv_report.data[1], recv_report.data[2], recv_report.data[3]);                   
+                    break;
+            //-----------------------------------------------------------------------------------------------------------------
+                case READ_WORD_I2C1:        // COMMAND [0x33] - READ WORD FROM I2C1
+            //-----------------------------------------------------------------------------------------------------------------                     
+                    send_report.data[0] = READ_WORD_I2C1;                                   // Echo Command
+                    send_report.data[1] = recv_report.data[1];                              // Echo Device Address
+                    send_report.data[2] = recv_report.data[2];                              // Echo Register 
+                    
+                    unsigned short RX1 = I2C_Read_Word(0x00, recv_report.data[1], recv_report.data[2]);   // Read Device
+                    
+                    send_report.data[3] = (char)((RX1 & 0xFF00) >> 8);                       // Return Data High Byte
+                    send_report.data[4] = (char)(RX1 & 0x00FF);                              // Return Data Low Byte   
+                    break;
+            //-----------------------------------------------------------------------------------------------------------------
+               case WRITE_WORD_I2C1:        // COMMAND [0x34] - WORD WRITE TO I2C1 
+            //-----------------------------------------------------------------------------------------------------------------                     
+                    send_report.data[0] = WRITE_WORD_I2C1;                                  // Echo Command
+                    send_report.data[1] = recv_report.data[1];                              // Echo Device Address                   
+                    send_report.data[2] = recv_report.data[2];                              // Echo Register
+                    send_report.data[3] = recv_report.data[3];                              // Echo HBData
+                    send_report.data[4] = recv_report.data[4];                              // Echo LBData
+                    send_report.data[5] = I2C_Write_Word(0x00, recv_report.data[1], recv_report.data[2], recv_report.data[3], recv_report.data[4]);                    
+                    break;
+
+            //-----------------------------------------------------------------------------------------------------------------
+               case WRITE_BLOCK_I2C1:        // COMMAND [0x3A] - WRITE A BLOCK of DATA (1 to 10 bytes) TO I2C1 
+            //-----------------------------------------------------------------------------------------------------------------                     
+                    send_report.data[0] = WRITE_BLOCK_I2C1;                                 // Echo Command
+                    send_report.data[1] = recv_report.data[1];                              // Echo Device Address                   
+                    send_report.data[2] = recv_report.data[2];                              // Echo Register
+                    send_report.data[3] = recv_report.data[3];                              // Echo Number of Data Bytes
+
+                    I2C1_TXDATA[0] = recv_report.data[2];                                   // Register Address
+                    
+                    for(int n = 0; n < recv_report.data[3]; n++)
+                    {
+                        I2C1_TXDATA[1 + n] = recv_report.data[4 + n];                       // Load TX Buffer with Data
+                    }
+ 
+                    I2C_Write_Block(0x00, recv_report.data[1], recv_report.data[3]);
+                 
+                    break;
+
+            //-----------------------------------------------------------------------------------------------------------------
+              case SET_I2C_ADDR:           // COMMAND [0x3E] - ASSIGN I2C DEVICE ADDRESS FOR SLAVE OPERATIONS
+            //-----------------------------------------------------------------------------------------------------------------                    
+                    send_report.data[0] = SET_I2C_ADDR;                                     // Echo Command
+                    I2C_ADDR = recv_report.data[1];                                         // Assign Slave Address
+                    send_report.data[1] = recv_report.data[1];                              // Echo Subcommand                   
+                    break;
+            //-----------------------------------------------------------------------------------------------------------------
+              case GET_I2C_ADDR:           // COMMAND [0x3F] - ASSIGN I2C DEVICE ADDRESS FOR SLAVE OPERATIONS
+            //-----------------------------------------------------------------------------------------------------------------                    
+                    send_report.data[0] = GET_I2C_ADDR;                                     // Echo Command
+                    send_report.data[1] = I2C_ADDR;                                         // Return Slave Address                  
+                    break;
+/*
+            //-----------------------------------------------------------------------------------------------------------------
+              case QUICK_WRITE_I2C2:        // COMMAND [0x35] - QUICK WRITE TO I2C2
+            //-----------------------------------------------------------------------------------------------------------------                    
+                    send_report.data[0] = QUICK_WRITE_I2C2;                                 // Echo Command
+                    send_report.data[1] = recv_report.data[1];                              // Echo Subcommand                   
+                    send_report.data[2] = I2C_Quick_Write(0x01, recv_report.data[1]);       // Echo ACK/NACK Status
+                    break;
+            //-----------------------------------------------------------------------------------------------------------------
+                case READ_BYTE_I2C2:        // COMMAND [0x36] - BYTE READ FROM I2C1
+            //-----------------------------------------------------------------------------------------------------------------                     
+                    send_report.data[0] = READ_BYTE_I2C2;                                   // Echo Command
+                    send_report.data[1] = recv_report.data[1];                              // Echo Device Address
+                    send_report.data[2] = recv_report.data[2];                              // Echo Register 
+                    send_report.data[3] = I2C_Read_Byte(0x01, recv_report.data[1], recv_report.data[2]);   // Return Data  
+                    break;
+            //-----------------------------------------------------------------------------------------------------------------
+               case WRITE_BYTE_I2C2:        // COMMAND [0x37] - BYTE WRITE TO I2C2 
+            //-----------------------------------------------------------------------------------------------------------------                     
+                    send_report.data[0] = WRITE_BYTE_I2C2;                                  // Echo Command
+                    send_report.data[1] = recv_report.data[1];                              // Echo Device Address                   
+                    send_report.data[2] = recv_report.data[2];                              // Echo Register
+                    send_report.data[3] = recv_report.data[3];                              // Echo Data
+                    send_report.data[4] = I2C_Write_Register(0x01, recv_report.data[1], recv_report.data[2], recv_report.data[3]);                   
+                    break;
+            //-----------------------------------------------------------------------------------------------------------------
+                case READ_WORD_I2C2:        // COMMAND [0x38] - READ WORD FROM I2C2
+            //-----------------------------------------------------------------------------------------------------------------                     
+                    send_report.data[0] = READ_WORD_I2C2;                                   // Echo Command
+                    send_report.data[1] = recv_report.data[1];                              // Echo Device Address
+                    send_report.data[2] = recv_report.data[2];                              // Echo Register 
+                    
+                    unsigned short RX2 = I2C_Read_Word(0x01, recv_report.data[1], recv_report.data[2]);   // Read Device
+                    
+                    send_report.data[3] = (char)((RX2 & 0xFF00) >> 8);                       // Return Data High Byte
+                    send_report.data[4] = (char)(RX2 & 0x00FF);                              // Return Data Low Byte   
+                    break;
+            //-----------------------------------------------------------------------------------------------------------------
+               case WRITE_WORD_I2C2:        // COMMAND [0x39] - WORD WRITE TO I2C2 
+            //-----------------------------------------------------------------------------------------------------------------                     
+                    send_report.data[0] = WRITE_WORD_I2C2;                                  // Echo Command
+                    send_report.data[1] = recv_report.data[1];                              // Echo Device Address                   
+                    send_report.data[2] = recv_report.data[2];                              // Echo Register
+                    send_report.data[3] = recv_report.data[3];                              // Echo HBData
+                    send_report.data[4] = recv_report.data[4];                              // Echo LBData
+                    send_report.data[5] = I2C_Write_Word(0x01, recv_report.data[1], recv_report.data[2], recv_report.data[3], recv_report.data[4]);                    
+                    break;
+            //-----------------------------------------------------------------------------------------------------------------
+               case WRITE_BLOCK_I2C2:        // COMMAND [0x3B] - WRITE A BLOCK of DATA (1 to 10 bytes) TO I2C2 
+            //-----------------------------------------------------------------------------------------------------------------                     
+                    send_report.data[0] = WRITE_BLOCK_I2C2;                                 // Echo Command
+                    send_report.data[1] = recv_report.data[1];                              // Echo Device Address                   
+                    send_report.data[2] = recv_report.data[2];                              // Echo Register
+                    send_report.data[3] = recv_report.data[3];                              // Echo Number of Data Bytes
+
+                    I2C2_TXDATA[0] = recv_report.data[2];                                   // Register Address
+                    
+                    for(int n = 0; n < recv_report.data[3]; n++)
+                    {
+                        I2C2_TXDATA[1 + n] = recv_report.data[4 + n];                       // Load TX Buffer with Data
+                    }
+                    
+                    I2C_Write_Block(0x01, recv_report.data[1], recv_report.data[3]);
+                 
+                    break;
+*/
+            //-----------------------------------------------------------------------------------------------------------------
+                case GET_FUNC_REGS:             // COMMAND [0x40] - BLOCK READ OF MAX25430 FUNCTIONAL REGISTERS
+            //-----------------------------------------------------------------------------------------------------------------
+                    send_report.data[0] = GET_FUNC_REGS;                                    // Echo Command
+                    send_report.data[1] = recv_report.data[1];                              // Echo I2C Device Address
+                    
+                    for(int i=0;i<63;i++)
+                    {
+                        send_report.data[2 + i] = I2C_Read_Byte(0x00, recv_report.data[1], FUNC_REGS[i]);              
+                    }
+                    
+                    break;
+            //-----------------------------------------------------------------------------------------------------------------
+                case GET_VENDOR_REGS:          // COMMAND [0x41] - BLOCK READ OF MAX25430 VENDOR REGISTERS
+            //-----------------------------------------------------------------------------------------------------------------
+                    send_report.data[0] = GET_VENDOR_REGS;                                  // Echo Command
+                    send_report.data[1] = recv_report.data[1];                              // Echo I2C Device Address
+                    
+                    for(int i=0;i<12;i++)
+                    {
+                        send_report.data[2 + i] = I2C_Read_Byte(0x00, recv_report.data[1], VENDOR_REGS[i]);              
+                    }
+                    
+                    break;
+            //-----------------------------------------------------------------------------------------------------------------
+                case GET_INT_REGS:          // COMMAND [0x42] - BLOCK READ OF MAX25430 INTERRUPT REGISTERS
+            //-----------------------------------------------------------------------------------------------------------------
+                    send_report.data[0] = GET_INT_REGS;                                     // Echo Command
+                    send_report.data[1] = recv_report.data[1];                              // Echo I2C Device Address
+                    
+                    for(int i=0;i<8;i++)
+                    {
+                        send_report.data[2 + i] = I2C_Read_Byte(0x00, recv_report.data[1], INT_REGS[i]);              
+                    }
+                    
+                    break;
+            //-----------------------------------------------------------------------------------------------------------------
+                case GET_MASK_REGS:          // COMMAND [0x43] - BLOCK READ OF MAX25430 MASK REGISTERS
+            //-----------------------------------------------------------------------------------------------------------------
+                    send_report.data[0] = GET_MASK_REGS;                                    // Echo Command
+                    send_report.data[1] = recv_report.data[1];                              // Echo I2C Device Address
+                    
+                    for(int i=0;i<5;i++)
+                    {
+                        send_report.data[2 + i] = I2C_Read_Byte(0x00, recv_report.data[1], MASK_REGS[i]);              
+                    }
+                    
+                    break;
+            //-----------------------------------------------------------------------------------------------------------------
+                case GET_CTRL_REGS:          // COMMAND [0x44] - BLOCK READ OF MAX25430 TCPC CONTROL REGISTERS
+            //-----------------------------------------------------------------------------------------------------------------
+                    send_report.data[0] = GET_CTRL_REGS;                                    // Echo Command
+                    send_report.data[1] = recv_report.data[1];                              // Echo I2C Device Address
+                    
+                    for(int i=0;i<5;i++)
+                    {
+                        send_report.data[2 + i] = I2C_Read_Byte(0x00, recv_report.data[1], CTRL_REGS[i]);              
+                    }
+                    
+                    break;
+            //-----------------------------------------------------------------------------------------------------------------
+                case GET_TAB1_REGS:          // COMMAND [0x45] - BLOCK READ OF MAX25430 TAB1 REGISTERS
+            //-----------------------------------------------------------------------------------------------------------------
+                    send_report.data[0] = GET_TAB1_REGS;                                    // Echo Command
+                    send_report.data[1] = recv_report.data[1];                              // Echo I2C Device Address
+                    
+                    for(int i=0;i<29;i++)
+                    {
+                        send_report.data[2 + i] = I2C_Read_Byte(0x00, recv_report.data[1], TAB1_REGS[i]);              
+                    }
+                    
+                    break;
+            //-----------------------------------------------------------------------------------------------------------------
+                case GET_OTP_DATA_REGS:     // COMMAND [0x46] - BLOCK READ OF MAX25430 OTP DATA REGISTERS
+            //-----------------------------------------------------------------------------------------------------------------
+                    send_report.data[0] = GET_OTP_DATA_REGS;                                // Echo Command
+                    send_report.data[1] = recv_report.data[1];                              // Echo I2C Device Address
+                    
+                    for(int i=0;i<36;i++)
+                    {
+                        send_report.data[2 + i] = I2C_Read_Byte(0x00, recv_report.data[1], OTP_DATA_REGS[i]);              
+                    }
+                    
+                    break;
+            //-----------------------------------------------------------------------------------------------------------------
+                case GET_OTP_TEST_CMD_REGS:     // COMMAND [0x47] - BLOCK READ OF MAX25430 OTP TEST COMMAND REGISTERS
+            //-----------------------------------------------------------------------------------------------------------------
+                    send_report.data[0] = GET_OTP_TEST_CMD_REGS;                            // Echo Command
+                    send_report.data[1] = recv_report.data[1];                              // Echo I2C Device Address
+                    
+                    for(int i=0;i<16;i++)
+                    {
+                        send_report.data[2 + i] = I2C_Read_Byte(0x00, recv_report.data[1], OTP_TEST_CMD_REGS[i]);              
+                    }
+                    
+                    break;
+            //-----------------------------------------------------------------------------------------------------------------
+                case GET_OTP_TEST_MODE_REGS:    // COMMAND [0x48] - BLOCK READ OF MAX25430 OTP TEST MODE REGISTERS
+            //-----------------------------------------------------------------------------------------------------------------
+                    send_report.data[0] = GET_OTP_TEST_MODE_REGS;                           // Echo Command
+                    send_report.data[1] = recv_report.data[1];                              // Echo I2C Device Address
+                    
+                    for(int i=0;i<23;i++)
+                    {
+                        send_report.data[2 + i] = I2C_Read_Byte(0x00, recv_report.data[1], OTP_TEST_MODE_REGS[i]);              
+                    }
+                    
+                    break;
+            //-----------------------------------------------------------------------------------------------------------------
+                case GET_OTP_TEST_OVRD_REGS:    // COMMAND [0x49] - BLOCK READ OF MAX25430 OTP TEST OVERRIDE REGISTERS
+            //-----------------------------------------------------------------------------------------------------------------
+                    send_report.data[0] = GET_OTP_TEST_OVRD_REGS;                           // Echo Command
+                    send_report.data[1] = recv_report.data[1];                              // Echo I2C Device Address
+                    
+                    for(int i=0;i<13;i++)
+                    {
+                        send_report.data[2 + i] = I2C_Read_Byte(0x00, recv_report.data[1], OTP_TEST_OVRD_REGS[i]);              
+                    }
+                    
+                    break;
+            //-----------------------------------------------------------------------------------------------------------------
+                case OTP_REGS_UNLOCK:          // COMMAND [0x4A] - UNLOCK MAX25430 OTP REGISTERS
+            //-----------------------------------------------------------------------------------------------------------------
+                    send_report.data[0] = OTP_REGS_UNLOCK;                                  // Echo Command
+                    send_report.data[1] = recv_report.data[1];                              // Echo I2C Device Address
+                    
+                    I2C_Write_Register(0x00, recv_report.data[1], 0xC0, 0x12);
+                    I2C_Write_Register(0x00, recv_report.data[1], 0xC0, 0x34);
+                    I2C_Write_Register(0x00, recv_report.data[1], 0xC0, 0xFA);
+                    I2C_Write_Register(0x00, recv_report.data[1], 0xC0, 0xDB);              
+                   
+                    send_report.data[2] = 0x01;                                             // Task Complete
+                    
+                    break;
+            //-----------------------------------------------------------------------------------------------------------------
+                case OTP_REGS_LOCK:          // COMMAND [0x4B] - LOCK MAX25430 OTP REGISTERS
+            //-----------------------------------------------------------------------------------------------------------------
+                    send_report.data[0] = OTP_REGS_LOCK;                                    // Echo Command
+                    send_report.data[1] = recv_report.data[1];                              // Echo I2C Device Address
+                    
+                    I2C_Write_Register(0x00, recv_report.data[1], 0xC0, 0x00);
+                    I2C_Write_Register(0x00, recv_report.data[1], 0xC0, 0x00);
+                    I2C_Write_Register(0x00, recv_report.data[1], 0xC0, 0x00);
+                    I2C_Write_Register(0x00, recv_report.data[1], 0xC0, 0x00);              
+                   
+                    send_report.data[2] = 0x01;                                             // Task Complete
+                    
+                    break;    
+            //-----------------------------------------------------------------------------------------------------------------
+                case CLEAR_INTS:          // COMMAND [0xF2] - CLEAR ALL MAX25430 INTERRUPT REGISTERS
+            //-----------------------------------------------------------------------------------------------------------------
+                    send_report.data[0] = CLEAR_INTS;                                       // Echo Command
+                    send_report.data[1] = recv_report.data[1];                              // Echo I2C Device Address
+                    
+                    I2C_Write_Register(0x00, recv_report.data[1], 0x10, 0xFF);              // ALERT STATUS LB              
+                    I2C_Write_Register(0x00, recv_report.data[1], 0x11, 0xA7);              // ALERT STATUS HB
+                    I2C_Write_Register(0x00, recv_report.data[1], 0x1F, 0xFF);              // FAULT STATUS
+                    
+                    send_report.data[2] = 0x55;                                             // Task Complete
+                    
+                    break;
+                          
+                default:
+                    break;
+            }// End Switch - Command Interpretor
+ 
+            //Send the report
+            hid.send(&send_report);
+        }// End If - HID Message
+    }// End Main While Loop
+}// End Main
\ No newline at end of file