This is a class which contains function to interface with the MLX75320

Dependents:   MLX75320_API

Revision:
12:d1767e2bd3a8
Parent:
11:bd2dee9957a9
Child:
13:ccf4ab73c33d
--- a/LidarSpi.cpp	Fri Apr 15 14:07:49 2016 +0000
+++ b/LidarSpi.cpp	Fri Apr 29 13:39:19 2016 +0000
@@ -8,6 +8,13 @@
 #include <inttypes.h>
 #define SPIFREQ 8000
 
+
+#ifndef DEBUG
+#define DEBUG 0
+#define debug_print(pntPc, ...) \
+            do { if (DEBUG) (Serial*)pntPc->printf(__VA_ARGS__); } while (0) //Arguments: Serial pointer and printf arguments
+#endif
+
 LidarSpi::LidarSpi(PinName mosi, PinName miso, PinName clk, PinName chipSelect, PinName dr, PinName rs, PinName tr, PinName smpl):device(mosi, miso, clk), chipS(chipSelect), dataReady(dr),resetPin(rs), trigger(tr), sampling(smpl)
 {
     //resetPin.write(1);
@@ -18,10 +25,10 @@
     //          -> mbed does not read first bit, this shifts the entire message on MISO 1 bit
     //Mode 3: CLPOL=1, CLPHA=1    => Transmission on mbed side good, Lidar chip returns CRC errors on the succesful tranmissions 
     //          -> Cant't send anything to lidar without changing lidar SPI mode
-    device.format(8,1);  //8 bit, CLPOL=1, CLPHA=1
+    device.format(8,1);  //8 bit, CLPOL=0, CLPHA=1
     device.frequency(16000000);
     resetPin.write(0);
-    wait_us(100);
+    wait_ms(300);
     resetPin.write(1);
     
 }
@@ -95,16 +102,16 @@
 int LidarSpi::TxPacket(uint8_t* rData, uint16_t *rSz, uint8_t *tData, uint16_t tSz, Serial* pc){    
     chipS=0;
     int i =0;
-    //pc->printf("Transmitting %d bytes...\n\r",tSz);
-    //pc->printf("Received:  ");
+    //debug_print(pc,"Transmitting %d bytes...\n\r",tSz);
+    //debug_print(pc,"Received:  ");
     for(i=0; i< tSz;i++){
         //*(tData+i)=*(tData+i)+1;         //<================Uncomment to write gibberish with wrong CRC
         *(rData+i)=device.write(*(tData+i));
-        //pc->printf("%02X", *(rData+i));
+        //debug_print(pc,"%02X", *(rData+i));
         //rData++;
         //tData++;
     }
-    //pc->printf("\n\r");
+    //debug_print(pc,"\n\r");
     chipS=1;
     *rSz=i;
     return 0;
@@ -177,36 +184,36 @@
     if (res < 0)
         return -3;
         
-    pc->printf("Read register request and response\n\r");
+    debug_print(pc,"Read register request and response\n\r");
     
-    pc->printf("MOSI ReadRegRequest:\t");
+    debug_print(pc,"MOSI ReadRegRequest:\t");
     for(int i=0;i<(sizeof(tx)/2);i++){
         uint8_t* pnt=(uint8_t*)tx;
-        pc->printf("%02X ", *(pnt+i));   
+        debug_print(pc,"%02X ", *(pnt+i));   
     }
-    pc->printf("\n\r");
-    pc->printf("MISO ReadRegRequest:\t");
+    debug_print(pc,"\n\r");
+    debug_print(pc,"MISO ReadRegRequest:\t");
     for(int i=0;i<(sizeof(tx)/2);i++){
         uint8_t* pnt=(uint8_t*)rx;
-        pc->printf("%02X ", *(pnt+i));   
+        debug_print(pc,"%02X ", *(pnt+i));   
     }
-    pc->printf("\n\r");
-    pc->printf("-- -- -- -- -- -- --\n\r");
+    debug_print(pc,"\n\r");
+    debug_print(pc,"-- -- -- -- -- -- --\n\r");
     
     
-    pc->printf("MOSI ReadRegResponse:\t");
+    debug_print(pc,"MOSI ReadRegResponse:\t");
     for(int i=0;i<(sizeof(tx)/2);i++){
         uint8_t* pnt=(uint8_t*)(tx+1);
-        pc->printf("%02X ", *(pnt+i));   
+        debug_print(pc,"%02X ", *(pnt+i));   
     }
-    pc->printf("\n\r");
-    pc->printf("MISO ReadRegResponse:\t");
+    debug_print(pc,"\n\r");
+    debug_print(pc,"MISO ReadRegResponse:\t");
     for(int i=0;i<(sizeof(tx)/2);i++){
         uint8_t* pnt=(uint8_t*)(rx+1);
-        pc->printf("%02X ", *(pnt+i));   
+        debug_print(pc,"%02X ", *(pnt+i));   
     }
-    pc->printf("\n\r");
-    pc->printf("-- -- -- -- -- -- --\n\r");
+    debug_print(pc,"\n\r");
+    debug_print(pc,"-- -- -- -- -- -- --\n\r");
 
     // Decode the response packet with register value
     res = MLX_DecodeResS(rx + 1, val);
@@ -215,7 +222,7 @@
             uint8_t isser=0;
             uint16_t err=0;
             MLX_DecodeStatusS(rx+1,&isser, &err);
-            pc->printf("Not a valid ReadRequestResponse-> Decode as short status: Result: %d,    IsError: %d,     Error: %d\n\r", res,isser,err);
+            debug_print(pc,"Not a valid ReadRequestResponse-> Decode as short status: Result: %d,    IsError: %d,     Error: %d\n\r", res,isser,err);
             return res;
         }
         else return res;
@@ -300,43 +307,43 @@
     if (res < 0)
         return -3;
 
-    //pc->printf("Write register request and response\n\r");
+    //debug_print(pc,"Write register request and response\n\r");
     
-    pc->printf("MOSI WriteRegRequest:\t 0x");
+    debug_print(pc,"MOSI WriteRegRequest:\t 0x");
     for(int i=0;i<(sizeof(tx)/2);i++){
         uint8_t* pnt=(uint8_t*)tx;
-        pc->printf("%02X", *(pnt+i));   
+        debug_print(pc,"%02X", *(pnt+i));   
     }
-    pc->printf("\n\r");
-    pc->printf("MISO WriteRegRequest:\t 0x");
+    debug_print(pc,"\n\r");
+    debug_print(pc,"MISO WriteRegRequest:\t 0x");
     for(int i=0;i<(sizeof(tx)/2);i++){
         uint8_t* pnt=(uint8_t*)rx;
-        pc->printf("%02X", *(pnt+i));   
+        debug_print(pc,"%02X", *(pnt+i));   
     }
-    pc->printf("\n\r");
-    pc->printf("-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n\r");
+    debug_print(pc,"\n\r");
+    debug_print(pc,"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n\r");
     
     
-    pc->printf("MOSI WriteRegResponse:\t 0x");
+    debug_print(pc,"MOSI WriteRegResponse:\t 0x");
     for(int i=0;i<(sizeof(tx)/2);i++){
         uint8_t* pnt=(uint8_t*)(tx+1);
-        pc->printf("%02X", *(pnt+i));   
+        debug_print(pc,"%02X", *(pnt+i));   
     }
-    pc->printf("\n\r");
-    pc->printf("MISO WriteRegResponse:\t 0x");
+    debug_print(pc,"\n\r");
+    debug_print(pc,"MISO WriteRegResponse:\t 0x");
     for(int i=0;i<(sizeof(tx)/2);i++){
         uint8_t* pnt=(uint8_t*)(rx+1);
-        pc->printf("%02X", *(pnt+i));   
+        debug_print(pc,"%02X", *(pnt+i));   
     }
-    pc->printf("\n\r");
-    pc->printf("==========================================================\n\r");
+    debug_print(pc,"\n\r");
+    debug_print(pc,"==========================================================\n\r");
 
 
 
     // Decode response (a status packet)
     res = MLX_DecodeStatusS(rx + 1, &iserr, &error);
     if (res < 0 || iserr){
-        pc->printf("Decode as short status: Result: %d,    IsError: %d,     Error: %d\n\r", res,iserr,error);
+        debug_print(pc,"Decode as short status: Result: %d,    IsError: %d,     Error: %d\n\r", res,iserr,error);
         return res;}
 
     return 0;
@@ -405,7 +412,7 @@
     
     res = ReadReg(470, &val);     // PORT_READY 
     val=val>>16;
-    //pc->printf("PORT READY: %x\n\r",val);
+    //debug_print(pc,"PORT READY: %x\n\r",val);
     trigger.write(0);
     // Encode the request and send it
     res = MLX_ReqReadEch(tx);
@@ -501,7 +508,7 @@
 
     // Required buffer space
     if (maxN < MAXECH){
-        pc->printf("maxN too small\n\r");
+        debug_print(pc,"maxN too small\n\r");
         return -1;
         }
 
@@ -518,29 +525,32 @@
     //res = MLXSPI::SetConfig(0);  //debug
 
     // Write 1 to PORT_ACQU register and then wait
-    pc->printf("\tRead PORT_ACQU\n\r");
+    debug_print(pc,"\tRead PORT_ACQU\n\r");
     res = ReadReg(0x146, &val);    // PORT_ACQU
+    wait_us(4);
     if (res < 0){
-        pc->printf("ReadReg Error\n\r");
+        debug_print(pc,"ReadReg Error\n\r");
         goto END;}
     val = (val >> 16) | 1;
-    pc->printf("\tWrite 1 to PORT_ACQU\n\r");
+    debug_print(pc,"\tWrite 1 to PORT_ACQU\n\r");
     trigger.write(1);
     res = WriteReg(0x146, val);     // PORT_ACQU
+    wait_us(4);
     if (res < 0){
-        pc->printf("WriteReg Error\n\r");
+        debug_print(pc,"WriteReg Error\n\r");
         goto END;}
 
     // Wait till PORT_READY bit is set.
-    
-    pc->printf("\tWait for PORT_READY bit\n\r");
+    cnt = 0;
+    debug_print(pc,"\tWait for PORT_READY bit\n\r");
     res = ReadReg(470, &val);     // PORT_READY 
-    while(res<0){
-            pc->printf("Error: reread state of ready PIN\n\r");
-            wait_us(4);
-            res=ReadReg(470, &val);
-        }
-    cnt = 0;
+    wait_us(4);
+    while((!dataReady.read())&& (cnt<2000)){
+        wait_us(50);
+        cnt++;
+    }
+    if (cnt>=2000) 
+    debug_print(pc,"Port ready pin timeout\n\r");
     trigger.write(1);
     // Wait till PORT_READY bit is set.
 
@@ -553,52 +563,51 @@
         res = ReadReg(470, &val);     // PORT_READY
         cnt++;
     } */   
-    while((!dataReady.read())&& (cnt<2000)){
-        wait_us(50);
-        cnt++;
-    }
+
     
     
     res = ReadReg(470, &val);     // PORT_READY 
+    wait_us(4);
     val=val>>16;
-    pc->printf("PORT READY: %x\n\r",val);
-    pc->printf("Counter: %d\n\r", cnt);
+    debug_print(pc,"PORT READY: %x\n\r",val);
+    debug_print(pc,"Counter: %d\n\r", cnt);
 
     // Encode the request and send it
     res = MLX_ReqReadEch(tx);
     if (res < 0){
-        pc->printf("ReqreadEch error\n\r");
+        debug_print(pc,"ReqreadEch error\n\r");
         goto END;}
 
     //--------------------------------------------------------------------------------------
     //----SHORT PACKET EXCHANGE--------
-    pc->printf("\tSend ReqReadEch\n\r");
+    debug_print(pc,"\tSend ReqReadEch\n\r");
     res = TxPacketSlow((uint8*)rx, &rSz, (uint8*)tx, sizeof(tx), 4);
     if (res < 0){
-        pc->printf("txPacketSlow Error\n\r");
+        debug_print(pc,"txPacketSlow Error\n\r");
         goto END;}
+    wait_us(4);
     /*
-    pc->printf("\tFirmware read request - processed\n\r");
-    pc->printf("Firmware readRequest MOSI: \t");
+    debug_print(pc,"\tFirmware read request - processed\n\r");
+    debug_print(pc,"Firmware readRequest MOSI: \t");
     for(int i =0; i<sizeof(tx);i++) {
         uint8_t* pnt=(uint8_t*)(&tx);
-        pc->printf("%02X ", *(pnt+i));     
+        debug_print(pc,"%02X ", *(pnt+i));     
     }
-    pc->printf("\n\r");
-    pc->printf("Firmware readRequest MISO: \t");
+    debug_print(pc,"\n\r");
+    debug_print(pc,"Firmware readRequest MISO: \t");
     for(int i =0; i<sizeof(rx);i++) {
         uint8_t* pnt=(uint8_t*)(&rx);
-        pc->printf("%02X ", *(pnt+i));     
+        debug_print(pc,"%02X ", *(pnt+i));     
     }
-    pc->printf("\n\r");
-    pc->printf("-- -- -- -- -- -- --\n\r");*/
+    debug_print(pc,"\n\r");
+    debug_print(pc,"-- -- -- -- -- -- --\n\r");*/
     
     //----PACKET EXCHANGE
 
     // Optional status decoding
     res = MLX_DecodeStatusS(rx, &iserr, &err);
     if (res < 0 || iserr){
-        pc->printf("Short status decode: Iss err?\n\r");
+        debug_print(pc,"Short status decode: Iss err?\n\r");
         goto END;}
 
     // Temporary pointer to uint16 data, for simplicity purpose
@@ -608,13 +617,13 @@
     res = MLX_EncodeStatusL2(&txL, 0, 0); //Create echo status packet
     memset(&prevRX,0,sizeof(prevRX));
     memset(&prevTX,0,sizeof(prevTX));
-    pc->printf("Value of npack:%d \n\r", nPack);
+    debug_print(pc,"Value of npack:%d \n\r", nPack);
     for (a = 0; a < nPack; ++a)
     {
         
         if (res < 0){
             res = -7;
-            pc->printf("Problem creating echo status\n\r");
+            debug_print(pc,"Problem creating echo status\n\r");
             goto END;
         }
         wait_us(10);
@@ -624,34 +633,34 @@
         //----LONG PACKET EXCHANGE--------
         res=TxPacket((uint8_t*)&rxL, &rSz, (uint8_t*)&txL, sizeof(PACK_LONG2));
         if (res < 0){
-            pc->printf("Packet #%d => txPacket_long error\n\r",a);
+            debug_print(pc,"Packet #%d => txPacket_long error\n\r",a);
             goto END;}
-
+        wait_us(12);
         
         // Decode the long responses, then extract data values
         res = MLX_DecodeResL2(&rxL);
         if ((res < 0)){
 
-            pc->printf("\n\r");
-            pc->printf("-- -- -- -- -- -- --\n\r");
-            pc->printf("Packet #%d => Decode long response error \n\r", a);
+            debug_print(pc,"\n\r");
+            debug_print(pc,"-- -- -- -- -- -- --\n\r");
+            debug_print(pc,"Packet #%d => Decode long response error \n\r", a);
             
-            pc->printf("TXLONG MOSI Response:        ");
+            debug_print(pc,"TXLONG MOSI Response:        ");
             for(int i=0;i<(sizeof(PACK_LONG2));i++){
                 uint8_t* pnt=(uint8_t*)(&txL);
-                pc->printf("%02X ", *(pnt+i));   
+                debug_print(pc,"%02X ", *(pnt+i));   
             }
-            pc->printf("\n\r");
-            pc->printf("-- -- -- -- -- -- --\n\r");
-            pc->printf("TXLONG MISO Response:        ");
+            debug_print(pc,"\n\r");
+            debug_print(pc,"-- -- -- -- -- -- --\n\r");
+            debug_print(pc,"TXLONG MISO Response:        ");
             for(int i=0;i<(sizeof(PACK_LONG2));i++){
                 uint8_t* pnt=(uint8_t*)(&rxL);
-                pc->printf("%02X ", *(pnt+i));   
+                debug_print(pc,"%02X ", *(pnt+i));   
             
             }
-            pc->printf("\n\r");
-            pc->printf("-- -- -- -- -- -- --\n\r");
-            pc->printf("Packet #%d => Decode long response error \n\r", a);
+            debug_print(pc,"\n\r");
+            debug_print(pc,"-- -- -- -- -- -- --\n\r");
+            debug_print(pc,"Packet #%d => Decode long response error \n\r", a);
             goto END;}
 
         // Gather all of the echo data in a buffer.
@@ -693,7 +702,7 @@
 
 int LidarSpi::GetTrace  ( uint16_t *buf, uint16_t maxN, uint16_t nSam, uint16_t idx, Serial* pc){
     trigger.write(0);
-    int res, a, b, i;
+    int res, a, b;
     uint32_t cnt;
     uint16_t rSz;
     PACK_SHORT rx[1], tx[1];
@@ -704,17 +713,17 @@
     int nBytes=0;
     
     uint16_t * u16ptr;
-    pc->printf("Buffer space required: %d\n\r", MAXTRCLEN);
+    debug_print(pc,"Buffer space required: %d\n\r", MAXTRCLEN);
     // Required buffer space
     if (maxN < MAXTRCLEN){
-        pc-printf("NOT ENOUGH BUFFER SPACEn\r");
+        debug_print(pc,"NOT ENOUGH BUFFER SPACEn\r");
         return -1;}
         
     // Divide by payload size to get number of packets
     //    const int nPack = MAXTRCLEN / MLX_LONG_DATA_SZ;
     // WTA: change nPack to a variable, initially 64  
     int nPack = MAXTRCLEN / MLX_LONG1_DATA_SZ;
-    pc->printf("npack: %d", nPack);
+    debug_print(pc,"npack: %d", nPack);
     // Ensure transmitted packet is all zeros to not send trash
     memset(&txL, 0, sizeof(PACK_LONG1));
 
@@ -726,7 +735,7 @@
     if (res < 0)
         goto END;
     val >>= 16;
-    pc->printf("chsel = %d\n", val);
+    debug_print(pc,"chsel = %d\n", val);
     cnt = 0;
     // Count how many channels are selected 
     for (int i = 0; i < 16; i++) {
@@ -739,11 +748,11 @@
     nPack /= 16;
     
     res = ReadReg(332, &val);    // PORT_OVR_ACCUM_ACQ_OVR
-//  pc->printf("PORT_OVR  = %d\n", (val >> 16));
+//  debug_print(pc,"PORT_OVR  = %d\n", (val >> 16));
     val = (val >> 16) & 3;               // Get bits 0 and 1
 
     if (res < 0){
-        pc->printf("ReadReg Error1\n\r");
+        debug_print(pc,"ReadReg Error1\n\r");
         goto END;}
 
     if (val == 0){       //00 = 1
@@ -759,20 +768,20 @@
         nPack /= 1;
     }
     else {
-        pc->printf("GetTrace: bad value\n");
+        debug_print(pc,"GetTrace: bad value\n");
     }
 
     
     // Write 1 to PORT_ACQU register and then wait
     res = ReadReg(0x146, &val);    // PORT_ACQU
     if (res < 0){
-        pc->printf("ReadReg Error2\n\r");
+        debug_print(pc,"ReadReg Error2\n\r");
         goto END;}
     val = (val>>16) | 1;
     
     res = WriteReg(0x146, val);     // PORT_ACQU
     if (res < 0){
-        pc->printf("WriteReg Error3\n\r");
+        debug_print(pc,"WriteReg Error3\n\r");
         goto END;}
     trigger.write(1);
     
@@ -785,10 +794,10 @@
     
     res = ReadReg(470, &val);     // PORT_READY 
     val=val>>16;
-    pc->printf("PORT READY: %x\n\r",val);
+    debug_print(pc,"PORT READY: %x\n\r",val);
     
     trigger.write(0);
-    pc-printf("Count: %d\n\r", cnt);
+    debug_print(pc,"Count: %d\n\r", cnt);
 
     // Encode the request and send it
     res = MLX_ReqReadTrc(tx);
@@ -828,8 +837,8 @@
 
         // Clock the remaining long packets 
         res = TxPacket((uint8_t*)&rxL, &rSz, (uint8_t*)&txL, sizeof(PACK_LONG1));
-        //      pc->printf("\nRXL%d = 0x%02x%02x%02x...[x294 bytes]...%02x%02x%02x\n", a + 1, rxL.buf[0], rxL.buf[1], rxL.buf[2], rxL.buf[297], rxL.buf[298], rxL.buf[299]);
-        //      pc->printf("\nRXL%d = 0x%02x%02x%02x%02x%02x%02x\n", a + 1, rxL.buf[2], rxL.buf[3], rxL.buf[4], rxL.buf[5], rxL.buf[6], rxL.buf[7]);
+        //      debug_print(pc,"\nRXL%d = 0x%02x%02x%02x...[x294 bytes]...%02x%02x%02x\n", a + 1, rxL.buf[0], rxL.buf[1], rxL.buf[2], rxL.buf[297], rxL.buf[298], rxL.buf[299]);
+        //      debug_print(pc,"\nRXL%d = 0x%02x%02x%02x%02x%02x%02x\n", a + 1, rxL.buf[2], rxL.buf[3], rxL.buf[4], rxL.buf[5], rxL.buf[6], rxL.buf[7]);
         if (res < 0){
             res = -8;
             goto END;
@@ -838,27 +847,27 @@
         // Decode the long responses, then extract data values
         res = MLX_DecodeResL1(&rxL);
         if ((res < 0)){
-            pc->printf("LONG READ ERROR: Stopped at the %d long message\n", a);
-            pc->printf("TXLONG MOSI Response:        ");
+            debug_print(pc,"LONG READ ERROR: Stopped at the %d long message\n", a);
+            debug_print(pc,"TXLONG MOSI Response:        ");
             for(int i=0;i<(sizeof(PACK_LONG1));i++){
                 uint8_t* pnt=(uint8_t*)(&txL);
-                pc->printf("%02X ", *(pnt+i));   
+                debug_print(pc,"%02X ", *(pnt+i));   
             }
-            pc->printf("\n\r");
-            pc->printf("-- -- -- -- -- -- --\n\r");
-            pc->printf("TXLONG MISO Response:        ");
+            debug_print(pc,"\n\r");
+            debug_print(pc,"-- -- -- -- -- -- --\n\r");
+            debug_print(pc,"TXLONG MISO Response:        ");
             for(int i=0;i<(sizeof(PACK_LONG1));i++){
                 uint8_t* pnt=(uint8_t*)(&rxL);
-                pc->printf("%02X ", *(pnt+i));   
+                debug_print(pc,"%02X ", *(pnt+i));   
             
             }
-            pc->printf("\n\r");
-            pc->printf("-- -- -- -- -- -- --\n\r");
+            debug_print(pc,"\n\r");
+            debug_print(pc,"-- -- -- -- -- -- --\n\r");
             //printf("last RXL = \n");
             //for (i = 0; i < 300; i++) {
-            //  pc->printf("%02x", rxL.buf[i]);
+            //  debug_print(pc,"%02x", rxL.buf[i]);
             //  if (((i + 1) % 8) == 0)
-            //      pc->printf("\n");
+            //      debug_print(pc,"\n");
             //}
             //printf("\n");
             res = -9;
@@ -895,7 +904,7 @@
     uint32_t val = 0;
     
     uint16_t * u16ptr;
-    //pc->printf("Buffer space required: %d\n\r", MAXTRCLEN);
+    //debug_print(pc,"Buffer space required: %d\n\r", MAXTRCLEN);
     // Required buffer space
     if (maxN < MAXTRCLEN){
         pc-printf("NOT ENOUGH BUFFER SPACEn\r");
@@ -905,7 +914,7 @@
     //    const int nPack = MAXTRCLEN / MLX_LONG_DATA_SZ;
     // WTA: change nPack to a variable, initially 64  
     int nPack = MAXTRCLEN / MLX_LONG1_DATA_SZ;
-    //pc->printf("npack: %d", nPack);
+    //debug_print(pc,"npack: %d", nPack);
     // Ensure transmitted packet is all zeros to not send trash
     memset(&txL, 0, sizeof(PACK_LONG1));
 
@@ -917,7 +926,7 @@
     if (res < 0)
         goto END;
     val >>= 16;
-    //pc->printf("chsel = %d\n", val);
+    //debug_print(pc,"chsel = %d\n", val);
     cnt = 0;
     // Count how many channels are selected 
     for (i = 0; i < 16; i++) {
@@ -929,11 +938,11 @@
     nPack /= 16;
 
     res = ReadReg(332, &val);    // PORT_OVR_ACCUM_ACQ_OVR
-//  pc->printf("PORT_OVR  = %d\n", (val >> 16));
+//  debug_print(pc,"PORT_OVR  = %d\n", (val >> 16));
     val = (val >> 16) & 3;               // Get bits 0 and 1
 
     if (res < 0){
-        pc->printf("ReadReg Error1\n\r");
+        debug_print(pc,"ReadReg Error1\n\r");
         goto END;}
 
     if (val == 0){       //00 = 1
@@ -949,19 +958,19 @@
         nPack /= 1;
     }
     else {
-        pc->printf("GetTrace: bad value\n");
+        debug_print(pc,"GetTrace: bad value\n");
     }
 
 
     // Write 1 to PORT_ACQU register and then wait
     res = ReadReg(0x146, &val);    // PORT_ACQU
     if (res < 0){
-        pc->printf("ReadReg Error2\n\r");
+        debug_print(pc,"ReadReg Error2\n\r");
         goto END;}
     val = (val>>16) | 1;
     res = WriteReg(0x146, val);     // PORT_ACQU
     if (res < 0){
-        pc->printf("WriteReg Error3\n\r");
+        debug_print(pc,"WriteReg Error3\n\r");
         goto END;}
 
     // Wait till PORT_READY bit is set.
@@ -985,19 +994,19 @@
     if (res < 0)
       goto END;
       
-    pc->printf("MOSI ReqReadTrace:\t 0x");
+    debug_print(pc,"MOSI ReqReadTrace:\t 0x");
     for(int i=0;i<(sizeof(tx));i++){
         uint8_t* pnt=(uint8_t*)tx;
-        pc->printf("%02X", *(pnt+i));   
+        debug_print(pc,"%02X", *(pnt+i));   
     }
-    pc->printf("\n");
-    pc->printf("MISO ReqReadTrace:\t 0x");
+    debug_print(pc,"\n");
+    debug_print(pc,"MISO ReqReadTrace:\t 0x");
     for(int i=0;i<(sizeof(tx));i++){
         uint8_t* pnt=(uint8_t*)rx;
-        pc->printf("%02X", *(pnt+i));   
+        debug_print(pc,"%02X", *(pnt+i));   
     }
-    pc->printf("\n");
-    pc->printf("-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n");
+    debug_print(pc,"\n");
+    debug_print(pc,"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n");
     //----PACKET EXCHANGE
     //--------------------------------------------------------------------------------------
 
@@ -1025,8 +1034,8 @@
 
         // Clock the remaining long packets 
         res = TxPacket((uint8_t*)&rxL, &rSz, (uint8_t*)&txL, sizeof(PACK_LONG1));
-        //      pc->printf("\nRXL%d = 0x%02x%02x%02x...[x294 bytes]...%02x%02x%02x\n", a + 1, rxL.buf[0], rxL.buf[1], rxL.buf[2], rxL.buf[297], rxL.buf[298], rxL.buf[299]);
-        //      pc->printf("\nRXL%d = 0x%02x%02x%02x%02x%02x%02x\n", a + 1, rxL.buf[2], rxL.buf[3], rxL.buf[4], rxL.buf[5], rxL.buf[6], rxL.buf[7]);
+        //      debug_print(pc,"\nRXL%d = 0x%02x%02x%02x...[x294 bytes]...%02x%02x%02x\n", a + 1, rxL.buf[0], rxL.buf[1], rxL.buf[2], rxL.buf[297], rxL.buf[298], rxL.buf[299]);
+        //      debug_print(pc,"\nRXL%d = 0x%02x%02x%02x%02x%02x%02x\n", a + 1, rxL.buf[2], rxL.buf[3], rxL.buf[4], rxL.buf[5], rxL.buf[6], rxL.buf[7]);
         if (res < 0){
             res = -8;
             goto END;
@@ -1036,27 +1045,27 @@
         // Decode the long responses, then extract data values
         res = MLX_DecodeResL1(&rxL);
         if ((res < 0)){
-            pc->printf("LONG READ ERROR: Stopped at the %d long message\n", a);
-            pc->printf("TXLONG MOSI Response:        ");
+            debug_print(pc,"LONG READ ERROR: Stopped at the %d long message\n", a);
+            debug_print(pc,"TXLONG MOSI Response:        ");
             for(int i=0;i<(sizeof(PACK_LONG1));i++){
                 uint8_t* pnt=(uint8_t*)(&txL);
-                pc->printf("%02X ", *(pnt+i));   
+                debug_print(pc,"%02X ", *(pnt+i));   
             }
-            pc->printf("\n\r");
-            pc->printf("-- -- -- -- -- -- --\n\r");
-            pc->printf("TXLONG MISO Response:        ");
+            debug_print(pc,"\n\r");
+            debug_print(pc,"-- -- -- -- -- -- --\n\r");
+            debug_print(pc,"TXLONG MISO Response:        ");
             for(int i=0;i<(sizeof(PACK_LONG1));i++){
                 uint8_t* pnt=(uint8_t*)(&rxL);
-                pc->printf("%02X ", *(pnt+i));   
+                debug_print(pc,"%02X ", *(pnt+i));   
             
             }
-            pc->printf("\n\r");
-            pc->printf("-- -- -- -- -- -- --\n\r");
+            debug_print(pc,"\n\r");
+            debug_print(pc,"-- -- -- -- -- -- --\n\r");
             //printf("last RXL = \n");
             //for (i = 0; i < 300; i++) {
-            //  pc->printf("%02x", rxL.buf[i]);
+            //  debug_print(pc,"%02x", rxL.buf[i]);
             //  if (((i + 1) % 8) == 0)
-            //      pc->printf("\n");
+            //      debug_print(pc,"\n");
             //}
             //printf("\n");
             res = -9;
@@ -1071,21 +1080,21 @@
             buf[a*(MLX_LONG1_DATA_SZ / 2) + b] = u16ptr[b];
         }
         if(a<64){
-            pc->printf("Trace packet %d MOSI: \n\t\t\t\t\t0x", a);
+            debug_print(pc,"Trace packet %d MOSI: \n\t\t\t\t\t0x", a);
             for(int i=0;i<(sizeof(PACK_LONG1));i++){
                 uint8_t* pnt=(uint8_t*)(&txL);
-                pc->printf("%02X", *(pnt+i));   
-                if(((i %30) ==0)&&(i>0))pc->printf("\n\t\t\t\t\t");
+                debug_print(pc,"%02X", *(pnt+i));   
+                if(((i %30) ==0)&&(i>0))debug_print(pc,"\n\t\t\t\t\t");
             }
-            pc->printf("\n\r");
-            pc->printf("Trace packet %d MISO: \n\t\t\t\t\t0x", a);
+            debug_print(pc,"\n\r");
+            debug_print(pc,"Trace packet %d MISO: \n\t\t\t\t\t0x", a);
             for(int i=0;i<(sizeof(PACK_LONG1));i++){
                 uint8_t* pnt=(uint8_t*)(&rxL);
-                pc->printf("%02X", *(pnt+i));   
-                if(((i %30) ==0)&&(i>0))pc->printf("\n\t\t\t\t\t");
+                debug_print(pc,"%02X", *(pnt+i));   
+                if(((i %30) ==0)&&(i>0))debug_print(pc,"\n\t\t\t\t\t");
             }
-            pc->printf("\n\r");
-            pc->printf("-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n\r");    
+            debug_print(pc,"\n\r");
+            debug_print(pc,"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n\r");    
         }
         
     }
@@ -1099,6 +1108,7 @@
 
 
 int LidarSpi::LoadPatch (const char *patch, Serial * pc){
+    debug_print(pc,"Entered LiadPatch method....\n\r");
     int res=0;
     uint16_t rSz;
     PACK_SHORT rx[1], tx[1];
@@ -1109,8 +1119,9 @@
     uint16_t nWordsRemaining;
     uint16_t  nPack;
     uint16_t nWords;
-    
+    debug_print(pc,"Allocating memory....\n\r");
     uint8_t memory[15000];
+    debug_print(pc,"Memory allocated\n\r");
     uint16_t addrStart, startLine, nBytes ;
     startLine=0;
     memset(memory, 0, 15000);
@@ -1118,25 +1129,25 @@
     int count=0;
     res=WriteReg(0x1d8, 128);
     if (res<0){
-        pc->printf("PORT_LONG_PACKET_SIZE Write error\n\r");
+        debug_print(pc,"PORT_LONG_PACKET_SIZE Write error\n\r");
         goto END;
     }
     
     res=WriteReg(0x6c, 31796); //0x7C19
     if (res<0) {
-        pc->printf("REG_MLX16_ITC_MASK0 Write error\n\r");
+        debug_print(pc,"REG_MLX16_ITC_MASK0 Write error\n\r");
     }
     
     wait_us(5);
-    pc->printf("Start loading fragments \n\r");
+    debug_print(pc,"Start loading fragments \n\r");
     
     LoadPatchFragment(patch,&addrStart, &startLine, &nBytes, memory, pc);
     Trigger(0);
-    pc->printf("Load fragment %d\n\r", count);
+    debug_print(pc,"Load fragment %d\n\r", count);
     for(int i =0; i<nBytes;i++){
-        //pc->printf("Addr[%d] : %d\n\r", addrStart+i, memory[i] );    
+        //debug_print(pc,"Addr[%d] : %d\n\r", addrStart+i, memory[i] );    
     }
-    pc->printf("addrStart: %d, startLine %d, nBytes: %d\n\r",addrStart, startLine, nBytes);
+    debug_print(pc,"addrStart: %d, startLine %d, nBytes: %d\n\r",addrStart, startLine, nBytes);
     nWords= nBytes / 2;
     
     // Ensure all packets are all zeros to not send trash
@@ -1146,34 +1157,34 @@
     //The Number of words to be transferred can be a multiple of LONG_DATA_SZ. Incase it is not
     //multiple of LONG_DATA_SZ, we do last packet with partial data and remaining words as 0
     nPack = nWords / (MLX_LONG2_DATA_SZ / 2)  + (nWords % (MLX_LONG2_DATA_SZ / 2) == 0 ? 0  :1);
-    pc->printf("npack: %d\n\r", nPack);
+    debug_print(pc,"npack: %d\n\r", nPack);
     // Encode the request and send it
     res = MLX_ReqWriteFW(tx, nPack, addrStart);
     if (res < 0){
-        pc->printf("Err @ 1");
+        debug_print(pc,"Err @ 1");
         goto END;   }
         
     wait_us(16);
     res = TxPacket((uint8_t*)rx, &rSz, (uint8_t*)tx, sizeof(tx));
     if (res < 0){
-        pc->printf("Err @ 2");
+        debug_print(pc,"Err @ 2");
         goto END;   }
     //Trigger(1);
           
-    pc->printf("ReqWriteFirmware MOSI: \n\r0x");
+    debug_print(pc,"ReqWriteFirmware MOSI: \n\r0x");
     for(int k=0;k<(sizeof(tx));k++){
         uint8_t* pnt=(uint8_t*)(&tx);
-        pc->printf("%02X", *(pnt+k));   
-        if(((k %30) ==0)&&(k>0)) pc->printf("\n\r");
+        debug_print(pc,"%02X", *(pnt+k));   
+        if(((k %30) ==0)&&(k>0)) debug_print(pc,"\n\r");
     }
-    pc->printf("\n\r");
-    pc->printf("ReqWriteFirmware MISO: \n\r0x");
+    debug_print(pc,"\n\r");
+    debug_print(pc,"ReqWriteFirmware MISO: \n\r0x");
     for(int k=0;k<(sizeof(rx));k++){
         uint8_t* pnt=(uint8_t*)(&rx);
-        pc->printf("%02X", *(pnt+k));   
-        if(((k %30) ==0)&&(k>0)) pc->printf("\n\r");
+        debug_print(pc,"%02X", *(pnt+k));   
+        if(((k %30) ==0)&&(k>0)) debug_print(pc,"\n\r");
     }
-    pc->printf("\n\r-------------------\n\r");
+    debug_print(pc,"\n\r-------------------\n\r");
     
     
     
@@ -1182,15 +1193,15 @@
     // Optional status decoding
     res = MLX_DecodeStatusS(rx, &iserr, &err);
     if (res < 0 || iserr){
-        pc->printf("Err @ 3");
+        debug_print(pc,"Err @ 3");
         
-        pc->printf("LOAD PATCH REQ response MISO: \n\r0x");
+        debug_print(pc,"LOAD PATCH REQ response MISO: \n\r0x");
             for(int k=0;k<(sizeof(PACK_LONG2));k++){
                 uint8_t* pnt=(uint8_t*)(&rxL);
-                pc->printf("%02X", *(pnt+k));   
-                if(((k %30) ==0)&&(k>0)) pc->printf("\n\r");
+                debug_print(pc,"%02X", *(pnt+k));   
+                if(((k %30) ==0)&&(k>0)) debug_print(pc,"\n\r");
             }
-        pc->printf("\n\r");
+        debug_print(pc,"\n\r");
         
         
         goto END;   }
@@ -1216,41 +1227,41 @@
         wait_us(12);
         /*
             
-        pc->printf("LOAD PATCH LONG RESPONSE %d of fragment %d    MOSI: \n\r0x", a,count);
+        debug_print(pc,"LOAD PATCH LONG RESPONSE %d of fragment %d    MOSI: \n\r0x", a,count);
         for(int k=0;k<(sizeof(PACK_LONG2));k++){
             uint8_t* pnt=(uint8_t*)(&txL);
-            pc->printf("%02X", *(pnt+k));   
-            if(((k %30) ==0)&&(k>0)) pc->printf("\n\r");
+            debug_print(pc,"%02X", *(pnt+k));   
+            if(((k %30) ==0)&&(k>0)) debug_print(pc,"\n\r");
         }
-        pc->printf("\n\r");
-        pc->printf("LOAD PATCH LONG RESPONSE %d of fragment %d   MISO: \n\r0x", a,count);
+        debug_print(pc,"\n\r");
+        debug_print(pc,"LOAD PATCH LONG RESPONSE %d of fragment %d   MISO: \n\r0x", a,count);
         for(int k=0;k<(sizeof(PACK_LONG2));k++){
             uint8_t* pnt=(uint8_t*)(&rxL);
-            pc->printf("%02X", *(pnt+k));   
-            if(((k %30) ==0)&&(k>0)) pc->printf("\n\r");
+            debug_print(pc,"%02X", *(pnt+k));   
+            if(((k %30) ==0)&&(k>0)) debug_print(pc,"\n\r");
         }
-        pc->printf("\n\r-----------\n\r");
+        debug_print(pc,"\n\r-----------\n\r");
         
         */
         
         res = MLX_DecodeResL2(&rxL);
         if (res < 0){
-            pc->printf("LONG WRITE ERROR: Stopped at the %d long message, res=%d\n", a, res);
+            debug_print(pc,"LONG WRITE ERROR: Stopped at the %d long message, res=%d\n", a, res);
             
-            pc->printf("LOAD PATCH LONG RESPONSE %d MOSI: \n\r0x", a);
+            debug_print(pc,"LOAD PATCH LONG RESPONSE %d MOSI: \n\r0x", a);
             for(int k=0;k<(sizeof(PACK_LONG2));k++){
                 uint8_t* pnt=(uint8_t*)(&txL);
-                pc->printf("%02X", *(pnt+k));   
-                if(((k %30) ==0)&&(k>0)) pc->printf("\n\r");
+                debug_print(pc,"%02X", *(pnt+k));   
+                if(((k %30) ==0)&&(k>0)) debug_print(pc,"\n\r");
             }
-            pc->printf("\n\r");
-            pc->printf("LOAD PATCH LONG RESPONSE %d MISO: \n\r0x", a);
+            debug_print(pc,"\n\r");
+            debug_print(pc,"LOAD PATCH LONG RESPONSE %d MISO: \n\r0x", a);
             for(int k=0;k<(sizeof(PACK_LONG2));k++){
                 uint8_t* pnt=(uint8_t*)(&rxL);
-                pc->printf("%02X", *(pnt+k));   
-                if(((k %30) ==0)&&(k>0)) pc->printf("\n\r");
+                debug_print(pc,"%02X", *(pnt+k));   
+                if(((k %30) ==0)&&(k>0)) debug_print(pc,"\n\r");
             }
-            pc->printf("\n\r");
+            debug_print(pc,"\n\r");
             res = -9;
             goto END;
         }
@@ -1270,7 +1281,7 @@
     res = TxPacket((uint8_t*)&rxL, &rSz, (uint8_t*)&txL, sizeof(PACK_LONG2));
     wait_us(11);
     if (res < 0){
-        pc->printf("Err @ 4");
+        debug_print(pc,"Err @ 4");
         goto END;   }
     
     
@@ -1280,37 +1291,37 @@
     wait_us(12);
     
     
-    pc->printf("Status long packet to check status after last fragment : %d, res=%d\n", count, res);
+    debug_print(pc,"Status long packet to check status after last fragment : %d, res=%d\n", count, res);
                 
-    pc->printf("LOAD PATCH LONG STATUS %d MOSI: \n\r0x", count);
+    debug_print(pc,"LOAD PATCH LONG STATUS %d MOSI: \n\r0x", count);
     for(int k=0;k<(sizeof(PACK_LONG2));k++){
         uint8_t* pnt=(uint8_t*)(&txL);
-        pc->printf("%02X", *(pnt+k));   
-        if(((k %30) ==0)&&(k>0)) pc->printf("\n\r");
+        debug_print(pc,"%02X", *(pnt+k));   
+        if(((k %30) ==0)&&(k>0)) debug_print(pc,"\n\r");
     }
-    pc->printf("\n\r");
-    pc->printf("LOAD PATCH LONG RESPONSE %d MISO: \n\r0x", count);
+    debug_print(pc,"\n\r");
+    debug_print(pc,"LOAD PATCH LONG RESPONSE %d MISO: \n\r0x", count);
     for(int k=0;k<(sizeof(PACK_LONG2));k++){
         uint8_t* pnt=(uint8_t*)(&rxL);
-        pc->printf("%02X", *(pnt+k));   
-        if(((k %30) ==0)&&(k>0)) pc->printf("\n\r");
+        debug_print(pc,"%02X", *(pnt+k));   
+        if(((k %30) ==0)&&(k>0)) debug_print(pc,"\n\r");
     }
-    pc->printf("\n\r-----------\n\r");
+    debug_print(pc,"\n\r-----------\n\r");
 
     // Change jump table pointer.
     //res=LoadPatchFragment(patch,&addrStart, &startLine, &nBytes, memory, pc);
-    //pc->printf("Return from a loadPatchFragment: res = %d \n\r", res);
+    //debug_print(pc,"Return from a loadPatchFragment: res = %d \n\r", res);
     wait_ms(100);
     
     if (true){
-        pc->printf("Change jumptable... \n\r");
+        debug_print(pc,"Change jumptable... \n\r");
         res = WriteReg(0x1000, 0x7000, pc);     // write addr: 0x1000 value:0x7000
         if (res < 0){
-            pc->printf("Err @ 5");
+            debug_print(pc,"Err @ 5");
             goto END;   
         }
     }
-    else pc->printf("Failed to read the file\n\r");
+    else debug_print(pc,"Failed to read the file\n\r");
     
 END:
     return res;     
@@ -1329,12 +1340,10 @@
     uint16_t i, total = 0, lineno = 1;
     uint16_t minaddr = 65535, maxaddr = 0;
     
-    uint16_t prevAddr = 0;
     uint16_t lineCount = *startLine;
     uint16_t lines = 0;
     
-    bool isFirst = true;
-    
+
     *nBytes = 0;
     if (strlen(patch) == 0) {
         //printf("   Can't load a file without the filename.");
@@ -1342,45 +1351,45 @@
     }
     fin = fopen(patch, "r");
     if (fin == NULL) {
-        pc->printf("   Can't open file '%s' for reading.\n\r", patch);
+        debug_print(pc,"   Can't open file '%s' for reading.\n\r", patch);
         return -10;
     }
-    pc->printf("Opened file\n\r");
+    debug_print(pc,"Opened file\n\r");
     //  printf("Patch file %s opened\n", filename);
     
     while (true) {
         line[0] = '\0';
         fgets(line, 1000, fin);
         lines++;
-        //pc->printf("Startline: %d, lines: %d\n\r", *startLine,lines);
+        //debug_print(pc,"Startline: %d, lines: %d\n\r", *startLine,lines);
 
         if (line[strlen(line) - 1] == '\n') line[strlen(line) - 1] = '\0';
         if (line[strlen(line) - 1] == '\r') line[strlen(line) - 1] = '\0';
         *addrStart= 0;
         //int res=parse_hex_line(line, bytes, &addr, &n, &status);
-        //pc->printf("Result of parse: %d\n\r", res);
+        //debug_print(pc,"Result of parse: %d\n\r", res);
         if (parse_hex_line(line, bytes, &addr, &n, &status)>0) {
             //cout << "Parse OK\n\r";
-            //pc->printf("Line: %s\n\r", line);
+            //debug_print(pc,"Line: %s\n\r", line);
 
             if (*nBytes>15000) {
                 *addrStart = minaddr;
                 *startLine = lines;
                 fclose(fin);
-                pc->printf("Close file\n\r");
+                debug_print(pc,"Close file\n\r");
                 return -5;
             }
             
             if (status == 0) {  /* data */
                                 //cout << "Status=0";
                 //if (addr < minaddr) minaddr = addr;
-                //pc->printf("addr: %d, minaddr: %d\n\r", addr, minaddr);
-                isFirst = false;
+                //debug_print(pc,"addr: %d, minaddr: %d\n\r", addr, minaddr);
+                //isFirst = false;
                 if (addr < minaddr) minaddr = addr;
                 for (i = 0; i <= (n - 1); i++) {
                     
                     
-                    prevAddr = addr;
+                    //prevAddr = addr;
                     
                     if (i % 2 == 0)
                         memory[addr-minaddr] = bytes[i + 1] & 255;  //Assumption even no of bytes per line
@@ -1395,14 +1404,14 @@
             }
             if (status == 1) {  /* end of file */
                 fclose(fin);
-                pc->printf("Closed file\n\r");
+                debug_print(pc,"Closed file\n\r");
                 //printf("load_file parsed %d bytes between:", total);
                 //printf(" %04X to %04X\n", minaddr, maxaddr);
                 
                 *addrStart= minaddr;
-                pc->printf("minAddr: %d, maxAddr: %d\n\r", minaddr, maxaddr);
+                debug_print(pc,"minAddr: %d, maxAddr: %d\n\r", minaddr, maxaddr);
                 *nBytes=maxaddr-minaddr;
-                pc->printf("End of file\n\r");
+                debug_print(pc,"End of file\n\r");
                 return total;
             }
             if (status == 2)  /* begin of file */
@@ -1414,10 +1423,10 @@
         }
         lineCount++;
     NEXT:   lineno++;
-    }
+    }/*
     fclose(fin);
-    pc->printf("Close file\n\r");
-    return 0;
+    debug_print(pc,"Close file\n\r");
+    return 0;*/
     
 }
 int LidarSpi::parse_hex_line(char *theline, uint8_t bytes[], uint16_t *addr, uint16_t *num, uint16_t *code){
@@ -1460,89 +1469,89 @@
 {
     uint16_t val=148;
     int res=0;
-    //pc->printf("Write PORT_LONG_PACKET_SIZE: %d\n\r",val);
+    //debug_print(pc,"Write PORT_LONG_PACKET_SIZE: %d\n\r",val);
     //Trigger(1);
     res=WriteReg(0x1d8, val);
     //Trigger(0);
     if (res<0){
-        //pc->printf("PORT_LONG_PACKET_SIZE Write error\n\r");
+        //debug_print(pc,"PORT_LONG_PACKET_SIZE Write error\n\r");
         return res;
     }
 
-    //pc->printf("Packet size: %d\n\r", val);
+    //debug_print(pc,"Packet size: %d\n\r", val);
     
-    //pc->printf("Write REG_PORT_CHSEL: 0xFFFF\n\r");
+    //debug_print(pc,"Write REG_PORT_CHSEL: 0xFFFF\n\r");
     res=WriteReg(0x150, 0xffff);
     if (res<0) {
-        //pc->printf("REG_PORT_CHSEL Write error\n\r");
+        //debug_print(pc,"REG_PORT_CHSEL Write error\n\r");
         return res;
     }
-    //pc->printf("Write REG_PORT_OVR_ACCUM: 0x4B3,\n\r");
+    //debug_print(pc,"Write REG_PORT_OVR_ACCUM: 0x4B3,\n\r");
     //res=WriteReg(0x14c, 1203); //0x4B3
     res=WriteReg(0x14c, 0x0fff); //0x4B3
     //res=WriteReg(0x14c, 0b0011); //0x4B3
     if (res<0) {
-        //pc->printf("REG_PORT_OVR_ACCUM Write error\n\r");
+        //debug_print(pc,"REG_PORT_OVR_ACCUM Write error\n\r");
         return res;
     }
-    //pc->printf("Write REG_PORT_FIXED_DIVIDER: 0x802\n\r");
+    //debug_print(pc,"Write REG_PORT_FIXED_DIVIDER: 0x802\n\r");
     res=WriteReg(0x14E, 0x0); //0x802
     if (res<0) {
-        //pc->printf("REG_PORT_FIXED_DIVIDER Write error\n\r");
+        //debug_print(pc,"REG_PORT_FIXED_DIVIDER Write error\n\r");
         return res;
     }
     
     
-    //pc->printf("Write REG_PORT_TRIGGER_PERIOD: 0x3E8\n\r");
+    //debug_print(pc,"Write REG_PORT_TRIGGER_PERIOD: 0x3E8\n\r");
     res=WriteReg(0x148, 1000); //0x3e8
     if (res<0) {
-        //pc->printf("REG_PORT_TRIGGER_PERIOD Write error\n\r");
+        //debug_print(pc,"REG_PORT_TRIGGER_PERIOD Write error\n\r");
         return res;
     }
     
-    //pc->printf("Write REG_PORT_MEAS_DELAY: 0x0000\n\r");
+    //debug_print(pc,"Write REG_PORT_MEAS_DELAY: 0x0000\n\r");
     res=WriteReg(0x32, 0);
     if (res<0) {
-        //pc->printf("REG_PORT_MEAS_DELAY Write error\n\r");
+        //debug_print(pc,"REG_PORT_MEAS_DELAY Write error\n\r");
         return res;
     }
-    //pc->printf("Write REG_PORT_MODE_EN: 0x0000\n\r");
+    //debug_print(pc,"Write REG_PORT_MODE_EN: 0x0000\n\r");
     res=WriteReg(0x30, 0x00);
     if (res<0) {
-        //pc->printf("REG_PORT_MODE_EN Write error\n\r");
+        //debug_print(pc,"REG_PORT_MODE_EN Write error\n\r");
         return res;
     }
     
-    //pc->printf("Write REG_MLX16_ITC_MASK0: 0x7C34\n\r");
+    //debug_print(pc,"Write REG_MLX16_ITC_MASK0: 0x7C34\n\r");
     res=WriteReg(0x6c, 0x7C34); //0x7C19
     if (res<0) {
-        //pc->printf("REG_MLX16_ITC_MASK0 Write error\n\r");
+        //debug_print(pc,"REG_MLX16_ITC_MASK0 Write error\n\r");
         return res;
     }
-    //pc->printf("Write REG_STIMER2_VALUE: 0xBFFF\n\r");
+    //debug_print(pc,"Write REG_STIMER2_VALUE: 0xBFFF\n\r");
     res=WriteReg(0x22, 49151); //0xBFFF
     if (res<0) {
-        //pc->printf("REG_STIMER2_VALUE Write error\n\r");
+        //debug_print(pc,"REG_STIMER2_VALUE Write error\n\r");
         return res;
     }
     /*
-    //pc->printf("Write REG_PORT_FIXED_DIVIDER: 0x802\n\r");
+    //debug_print(pc,"Write REG_PORT_FIXED_DIVIDER: 0x802\n\r");
     res=WriteReg(0x14E, 0x0); //0x802
     if (res<0) {
-        //pc->printf("REG_PORT_FIXED_DIVIDER Write error\n\r");
+        //debug_print(pc,"REG_PORT_FIXED_DIVIDER Write error\n\r");
         return res;
     }
     
     //0x124=0xae40, and 0x126=0xae40
-    //pc->printf("Improvement registers for trace without patch\n\r");
+    //debug_print(pc,"Improvement registers for trace without patch\n\r");
     res=WriteReg(0x124, 0xae40); //0x802
     if (res<0) {
-        //pc->printf("PORT SH1 Write error\n\r");
+        //debug_print(pc,"PORT SH1 Write error\n\r");
         return res;
     }
     res=WriteReg(0x126, 0xae40); //0x802
     if (res<0) {
-        //pc->printf("PORT SH2 Write error\n\r");
+        //debug_print(pc,"PORT SH2 Write error\n\r");
         return res;
     }*/
     
@@ -1620,10 +1629,18 @@
     
     //Peak Min Pulse edge len
     res=WriteReg(0x1c80,0xe);
-    if (res<0) return res;
-    
-    
-    
-    
+    return res;
 }
 
+int LidarSpi::setLed(bool state){
+    int res=0;
+    if(state){
+        WriteReg(0x1AC, 0x08);  //PWM1 OFF
+        res=WriteReg(0x154, 0x19);  //LED1 ON
+    }
+    else{
+        WriteReg(0x1AC, 0x00);  //PWM0 and 1 OFF
+        res=WriteReg(0x154, 0x11);  //LED1 OFF
+    }    
+    return res;
+}