PICO I2C FW

Dependencies:   USBDevice

Revision:
23:9bcf097cbfc2
Parent:
22:ee0d36d534cd
Child:
24:5ee9d36089f3
--- a/main.cpp	Fri Feb 08 16:59:34 2019 +0000
+++ b/main.cpp	Fri Feb 08 21:18:10 2019 +0000
@@ -4,88 +4,40 @@
 #define BS          8       // ASCII Back Space
 #define CR          13      // ASCII Carriage Return
 
-#define SLAVE_ADDRESS 0x50 
-
-//global variable
-
-// Virtual serial port over USB
+// Virtual serial port over USB TODO NEW VID PID NEEDED!!
 USBSerial pc(0x0B6A, 0x0042, 0x0001, false);
 
 // I2C setup
-I2C i2c(P1_6,P1_7);             // P3_4 -> I2C1_SDA,  P3_5-> I2C1_SCL
+I2C i2c(P1_6, P1_7);            // P1_6 -> I2C1_SDA,  P1_7-> I2C1_SCL
 
 //Timer setup
 Ticker timer_1;                 // timer for blinking led heartbeat
-
-bool tick_flag;                 // used for counting seconds
-bool log_flag = false;
 bool led_toggle_flag = false;
-bool button_flag = false;
-bool sd_insert_flag = false;
-bool error_flag;
-int error_ticks;
 
 //LED  blink setup
 DigitalOut rLED(LED1);
 DigitalOut gLED(LED2);
 DigitalOut bLED(LED3);
 
-InterruptIn button(SW1);
+//InterruptIn button(SW1);
+
+void LED_blink_callback() { // LED Heart beat
 
-void LED_blink_callback(){ // LED Heart beat
-    
     led_toggle_flag = !led_toggle_flag;
-    
-    if(log_flag) //if logging
+
+    if (led_toggle_flag)
     {
-        
-        if(led_toggle_flag)
-        {
-        //toggle red led
-        rLED = LED_ON;
-        }
-        else
-        {
-            rLED = LED_OFF;
-            gLED = LED_OFF;
-            bLED = LED_OFF;
-        } 
-    }
-    else if(error_flag) //if error (no sd card)
-    {
-        if(led_toggle_flag)
-        {
-        //toggle red led
-        rLED = LED_ON;
+        //toggle teal leds
         gLED = LED_ON;
-        }
-        else
-        {
-            rLED = LED_OFF;
-            gLED = LED_OFF;
-            bLED = LED_OFF;
-        }
-        error_ticks--; 
-        if(error_ticks <= 0)
-            error_flag = false;
+        bLED = LED_ON;
     }
     else
     {
-        if(led_toggle_flag)
-        {
-        //toggle teal leds
-        gLED = LED_ON;
-        bLED = LED_ON;
-        }
-        else
-        {
-            rLED = LED_OFF;
-            gLED = LED_OFF;
-            bLED = LED_OFF;
-        } 
+        rLED = LED_OFF;
+        gLED = LED_OFF;
+        bLED = LED_OFF;
     }
-      
-    tick_flag = true;
+
 }
 
 // *****************************************************************************
@@ -96,14 +48,14 @@
 //   returns                    0 on success ACK, 1 on NACK 
 // *****************************************************************************
 
-int I2C_write_register(char I2C_add, char reg_add, char byte){
+int I2C_write_register(char I2C_add, char reg_add, char byte) {
     char data[2];
     int error;
     data[0] = reg_add;
     data[1] = byte;
-    error = i2c.write(I2C_add,data,2);  
-    return error; 
-    
+    error = i2c.write(I2C_add, data, 2);
+    return error;
+
 }
 
 /// ****************************************************************************
@@ -115,18 +67,18 @@
 //   returns                    0 on success ACK, 1 on NACK 
 // *****************************************************************************
 
-int I2C_write_register(char I2C_add, char reg_add, char *bytes, int n){
-    int i;   
+int I2C_write_register(char I2C_add, char reg_add, char *bytes, int n) {
+    int i;
     //set start address
     char data[16];
-    int error;                          
-    data[0] = reg_add; 
-    for(i=1;i<=n;i++){                   
-       data[i] = bytes[i-1];
+    int error;
+    data[0] = reg_add;
+    for (i = 1; i <= n; i++) {
+        data[i] = bytes[i - 1];
     }
-    error = i2c.write(I2C_add,data,n+1);  // send n bytes of data
-  
-    return error;      
+    error = i2c.write(I2C_add, data, n + 1);  // send n bytes of data
+
+    return error;
 }
 
 // *****************************************************************************
@@ -138,106 +90,107 @@
 //   returns                    0 on success, 1 on fail 
 // *****************************************************************************
 
-int I2C_read_register(char I2C_add, char reg_add, char *bytes, int n){
+int I2C_read_register(char I2C_add, char reg_add, char *bytes, int n) {
     int error;
-    error = i2c.write(I2C_add,&reg_add,1,1); 
-    if(error)return error;   
-    error = i2c.read(I2C_add,bytes,n);  
+    error = i2c.write(I2C_add, &reg_add, 1, 1);
+    if (error)return error;
+    error = i2c.read(I2C_add, bytes, n);
     //if(DEBUG)db.printf("rr e[%d]\r\n",error);
-    return error; 
+    return error;
+}
+
+
+/// ****************************************************************************
+//   process_command(char *)  writes multiple bytes to OT07
+//                       char * receive buffer from virtual serial port
+//   returns                    0 on processed command, 1 on invalid command 
+// *****************************************************************************
+int process_command(char rx_buff[128])
+{
+    char data[130];
+    int i;
+    int num_bytes;
+    char c;
+    int arg1 = 0;
+    int arg2 = 0;
+    int arg3 = 0;
+    int n = sscanf(rx_buff, " %c %x %x %x", &c, &arg1, &arg2, &arg3);
+    //process input
+    if (n > 0) {//got input so process it
+        switch (c) {
+        case 'r':
+        case 'R':
+            //read register "r slave.add radd.start radd.end"                                      
+            if (n == 3) {   //read single register from selected device
+                int error = I2C_read_register(arg1, arg2, data, 1);
+                if (error)
+                    pc.printf("nack\r\n");
+                else
+                    pc.printf("%02X\r\n", data[0]);
+            }
+            if (n == 4) {   //read a range of regesters from selected device 
+                num_bytes = arg3 - arg2 + 1;// calculate number of bytes to read
+                if (num_bytes < 1) num_bytes = 1;// if arg2 <= arg 1 just read arg1 address.                                      
+                I2C_read_register(arg1, arg2, data, num_bytes);
+                for (i = 0; i<num_bytes; i++) {
+                    pc.printf("%02X\r\n", data[i]);
+                }
+            }
+            break;
+        case 'w':
+        case 'W':   //write register "w device w.addr data"
+            int error = I2C_write_register(arg1, arg2, arg3);
+            if (error)
+                pc.printf("nack\r\n");
+            else
+                pc.printf("ack\r\n");
+            break;
+        default:
+            return 1;
+        }//end switch(c)
+    }
+    return 0;
 }
 
 //******************************************************************************
 //        main()
 //******************************************************************************
 
-
 int main()
 {
-    char data[130];
-    int i;
-    
     
     // i/o variables
     char rx_buff[128];              // comport input buffer
     int rx_index;                   // rx_buffer pointer
-    char c;                         // command type character
-    int n;                          // argument count
-    int arg1;                       // argumnet 1
-    int arg2;                       // argument 2
-    int arg3;                       // argument 3
-    int num_bytes;
-
 
     //************* init ticker timer callbacks  ****************
-    timer_1.attach(&LED_blink_callback,0.5);        //start ticker, once per  sec.      
-    
+    timer_1.attach(&LED_blink_callback, 0.5);     //start ticker, once per  sec.      
+
     i2c.frequency(400000);      //set I2C clock to 400kHz     
-    
+
     rLED = LED_OFF;
     gLED = LED_ON;
     bLED = LED_ON;
-    
+
     rx_index = 0;               //character buffer index for input from PC
-      
-    while(1) {  // start main loop,  take data if logging, check for input, repeat   
-      
- // ----------------------------------------------------------------------------
- //             test for charater input for USB com port
- // ----------------------------------------------------------------------------
-        
- //test if PC sent some charaters
-        while(pc.readable()){  //characters in buffer,  get them                               
+
+    while (1) {  // start main loop, check for input, process command repeat   
+
+        //test if PC sent some charaters
+        while (pc.readable()) {  //characters in buffer,  get them                               
             rx_buff[rx_index] = pc.getc();
-            
-            if(rx_buff[rx_index] == CR){
+
+            if (rx_buff[rx_index] == CR) {
                 rx_buff[++rx_index] = 0;
                 rx_index = -1;  // because i++ at end of while give i=0 on next loop 
-                //device = 0; 
-                arg1 = 0;
-                arg2 = 0;
-                arg3 = 0;
                 
-                n = sscanf(rx_buff, " %c %x %x %x", &c, &arg1, &arg2, &arg3);
-               //process input
-                if(n > 0){//got input so process it
-                    switch(c){
-                        case 'r':
-                        case 'R':   
-                                    //read register "r slave.add radd.start radd.end"                                      
-                                    if(n==3){   //read single register from selected device
-                                        int error = I2C_read_register(arg1,arg2,data,1); 
-                                        if(error)
-                                            pc.printf("nack\r\n");
-                                        else 
-                                            pc.printf("%02X\r\n",data[0]);
-                                    }
-                                    if(n==4){   //read a range of regesters from selected device 
-                                        num_bytes = arg3-arg2 + 1;                  // calculate number of bytes to read
-                                        if (num_bytes < 1) num_bytes = 1;           // if arg2 <= arg 1 just read arg1 address.                                      
-                                            I2C_read_register(arg1,arg2,data,num_bytes); 
-                                        for(i=0;i<num_bytes;i++){
-                                            pc.printf("%02X\r\n",data[i]);
-                                        }                                  
-                                    } 
-                                break;
-                        case 'w':
-                        case 'W':   //write register "w device w.addr data"
-                                    int error = I2C_write_register(arg1,arg2, arg3);
-                                    if(error)
-                                            pc.printf("nack\r\n");
-                                    else
-                                        pc.printf("ack\r\n");
-                                break;                                       
-                    }//end switch(c)
-                }//if(n>0)             
+                process_command(rx_buff);//if carriage return received, process command
+                          
             }//end if(CR)           
-            if(rx_buff[rx_index] == BS){//backspace received, back up buffer pointer                                
-                 if(rx_index>0)rx_index--;//remove last char from buffer if not at start.                 
-            }else rx_index++;                                      
+            if (rx_buff[rx_index] == BS) {//backspace received, back up buffer pointer                                
+                if (rx_index>0)rx_index--;//remove last char from buffer if not at start.                 
+            }
+            else rx_index++;
         }//end while(pc.redable()) 
-
-             
-      
     }//end while(1)
 }