Joaquin Verastegui / jro

Dependents:   JRO_CR2 frdm_test

Fork of jro by Miguel Urco

Files at this revision

API Documentation at this revision

Comitter:
miguelcordero191
Date:
Mon Feb 23 20:36:23 2015 +0000
Parent:
4:de495ce256b8
Child:
6:aa70d2640f18
Commit message:
EthUtils module was added. Storing and reading ip address from internal flash.

Changed in this revision

EthUtils.cpp Show annotated file Show diff for this revision Revisions of this file
EthUtils.h Show annotated file Show diff for this revision Revisions of this file
JroDDS.cpp Show diff for this revision Revisions of this file
JroDDS.h Show diff for this revision Revisions of this file
JroIpdata.cpp Show annotated file Show diff for this revision Revisions of this file
JroIpdata.h Show annotated file Show diff for this revision Revisions of this file
JroSIR.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/EthUtils.cpp	Mon Feb 23 20:36:23 2015 +0000
@@ -0,0 +1,159 @@
+#include "EthUtils.h"
+
+const char* IP = IP_INI;               // IP
+const char* MASK = MASK_INI;           // MASK
+const char* GATEWAY = GATEWAY_INI;           // GATEWAY
+
+static int flash_addr = flash_size() - SECTOR_SIZE;           //Write in last sector
+static int flash_addr_ip = flash_addr + 16;
+static int flash_addr_mask = flash_addr + 16 + 32;
+static int flash_addr_gateway = flash_addr + 16 + 2*32;
+    
+int numberOfDigits(int x){
+    
+    int length = 1;
+    while ( x /= 10 )
+       length++;
+       
+    return length;
+}
+
+int isNumber(char *str){
+    int number;
+    
+    number = atoi(str);
+    
+    if (!(strlen(str) == numberOfDigits(number)))
+        return 0;
+        
+    if (number<0)
+        return 0;
+    
+    if (number>255)
+        return 0;
+    
+    return 1;
+}
+
+int splitstr(char *str, const char *delimiter, char parts[][MAX_IP_LEN]){
+
+    int nparts=0;
+    char *token;
+    
+    /* get the first token */
+    token = strtok(str, delimiter);
+    
+    /* walk through other tokens */
+    while( token != NULL ) 
+    {
+      strcpy(parts[nparts],token);
+      nparts++;
+      if (nparts>4) break;
+      
+      token = strtok(NULL, delimiter);
+    }
+    
+    return nparts;    
+}
+
+int validateIp(char *_ip){
+    
+    char delimiter[] = ".";
+    char ip_segment[5][MAX_IP_LEN];
+    int nsegments;
+    char str[80];
+    
+    strcpy(str, _ip);
+    
+    nsegments = splitstr(str, delimiter, ip_segment);
+    
+    if (nsegments != 4)
+        return 0;
+    
+    for (int i=0; i<4; i++){
+        if (!isNumber(ip_segment[i]))
+            return 0;
+    }
+        
+    return 1;
+    
+}
+
+int splitIpConf(char* str, char *_ip, char *_mask, char *_gateway){
+    
+    char delimiter[] = "/";
+    char parts[5][MAX_IP_LEN];
+    int nparts;
+    
+    nparts = splitstr(str, delimiter, parts);
+    
+    if (nparts != 3)
+        return 0;
+    
+    for (int i=0; i<MAX_IP_LEN; i++){
+        _ip[i] = 0x00;
+        _mask[i] = 0x00;
+        _gateway[i] = 0x00;
+    }
+    strcpy(_ip, parts[0]);
+    strcpy(_mask, parts[1]);
+    strcpy(_gateway, parts[2]);
+    
+    if (!validateIp(_ip))
+        return 0;
+    
+    if (!validateIp(_mask))
+        return 0;
+    
+    if (!validateIp(_gateway))
+        return 0;
+        
+    return 1;
+}
+
+int eraseIpConfig(){
+    
+    int flash_addr = flash_size() - SECTOR_SIZE;           //Write in last sector
+
+    erase_sector(flash_addr);   
+    
+    return 1;
+    
+}
+
+int saveIpConfig(char *ip, char *mask, char *gateway){
+
+    erase_sector(flash_addr);
+    
+    int flag[1] = {FLASH_FULL};
+    program_flash(flash_addr, (char*)&flag, 4);
+    
+    program_flash(flash_addr_ip, ip, MAX_IP_LEN);
+    program_flash(flash_addr_mask, mask, MAX_IP_LEN);
+    program_flash(flash_addr_gateway, gateway, MAX_IP_LEN);
+    
+    return 1;
+}
+
+int readIpConfig(char *_ip, char *_mask, char *_gateway){
+
+    int *flag_flash = (int*)flash_addr;
+    char *ip_flash = (char*)(flash_addr_ip);
+    char *mask_flash = (char*)(flash_addr_mask);
+    char *gateway_flash = (char*)(flash_addr_gateway);
+
+    if (flag_flash[0] == FLASH_FULL){
+        for (int i=0; i< MAX_IP_LEN; i++){
+            _ip[i] = ip_flash[i];
+            _mask[i] = mask_flash[i];
+            _gateway[i] = gateway_flash[i];
+        }
+    }
+    else{
+        strcpy(_ip, IP);
+        strcpy(_mask, MASK);
+        strcpy(_gateway, GATEWAY);
+    }
+    return 1;
+       
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/EthUtils.h	Mon Feb 23 20:36:23 2015 +0000
@@ -0,0 +1,24 @@
+#ifndef        UTILS_ETH
+#define        UTILS_ETH
+
+#include "FreescaleIAP.h"
+
+#define MAX_IP_LEN  16
+
+#define IP_INI          "192.168.7.2";               // IP
+#define MASK_INI        "255.255.255.0";           // MASK
+#define GATEWAY_INI     "0.0.0.0";                  // GATEWAY
+//INTERNAL FLASH
+#define FLASH_FULL  0xAA
+    
+int numberOfDigits(int x);
+int isNumber(char* str);
+int splitstr(char *, const char *, char parts[][MAX_IP_LEN]);
+int validateIp(char* str);
+int splitIpConf(char* str, char *_ip, char *_mask, char *_gateway);
+
+int eraseIpConfig();
+int saveIpConfig(char *ip, char *mask, char *gateway);
+int readIpConfig(char *_ip, char *_mask, char *_gateway);
+
+#endif
\ No newline at end of file
--- a/JroDDS.cpp	Tue Feb 10 14:28:42 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,700 +0,0 @@
-#include "JroDDS.h"
-
-static char controlRegister[4];
-static char read_spi_data[6];
-
-static char* KO_MSG = "KO";
-static char* OK_MSG = "OK";
-static char* NI_MSG = "NI";
-
-DDS::DDS(SPI *spi_dev, DigitalOut *mreset, DigitalOut *outramp, DigitalOut *spmode, DigitalOut *cs, DigitalOut *ioreset, DigitalInOut *updclk){
-    
-    spi_device      = spi_dev;
-    
-    dds_mreset      = mreset;
-    dds_outramp     = outramp;
-    dds_sp_mode     = spmode;
-    dds_cs          = cs;
-    dds_io_reset    = ioreset;
-    dds_updclk      = updclk;
-    
-    dds_updclk->input();
-    *dds_sp_mode = 0;
-    *dds_cs = 1;
-    *dds_outramp = 0;
-    
-    cmd_answer = NULL;
-    cmd_answer_len = 0;
-    
-    spi_device->format(SPI_BITS, SPI_MODE);
-    spi_device->frequency(SPI_FREQ);
-    
-    this->isConfig = false;
-    
-}
-    
-int DDS::__writeData(char addr, char ndata, const char* data){
-    
-    // I/O reset
-    *dds_updclk = 0;
-    *dds_io_reset = 1;
-    wait_us(10);
-    *dds_io_reset = 0;
-    wait_us(10);
-    
-    *dds_cs = 0;
-    
-    //Sending serial address
-    //printf("\r\nWriting Addr = %d", addr);
-    spi_device->write(addr & 0x0F);
-    
-    for(char i = 0; i < ndata; i++)
-    {
-        wait_us(150);
-        spi_device->write(data[i]);
-    }
-       
-    *dds_cs = 1;
-    /*
-    for(char i = 0; i < ndata; i++)
-    {
-        printf("\tData[%d] = 0x%x", i, data[i]);
-    }
-    */
-    
-    
-    wait_us(10);
-    *dds_updclk = 1;
-    wait_us(10);
-    *dds_updclk = 0;
-    wait_us(10);
-    
-    return 1;
-}
-
-
-char* DDS::__readData(char addr, char ndata){
-    
-    // I/O reset
-    *dds_io_reset = 1;
-    wait_us(10);
-    *dds_io_reset = 0;
-    wait_us(10);
-    
-    *dds_cs = 0;
-    
-    //Sending serial address
-    //printf("\r\nReading Addr = %d", addr);
-    spi_device->write((addr & 0x0F) | 0x80);
-    
-    for(char i = 0; i < ndata; i++)
-    {
-        wait_us(150);
-        read_spi_data[i] = spi_device->write(0x00);
-    }
-    
-    *dds_cs = 1;
-    /*
-    for(char i = 0; i < ndata; i++)
-    {
-        printf("\r\nData[%d] = 0x%x", i, read_spi_data[i]);
-    } 
-    */
-    
-    wait_us(10);
-    
-    return read_spi_data;
-    }
-
-int DDS::__writeDataAndVerify(char addr, char ndata, const char* wr_spi_data, SerialDriver *screen){
-    
-    int    success;
-    char*  rd_spi_data;
-    
-    this->__writeData(addr, ndata, wr_spi_data);
-    rd_spi_data = this->__readData(addr, ndata);
-    
-    success = 1;
-    
-    for(char i = 0; i < ndata; i++)
-    {
-        if (screen != NULL){
-            screen->putc(wr_spi_data[i]);
-            screen->putc(0x3D);
-            screen->putc(rd_spi_data[i]);
-        }
-        
-        if (wr_spi_data[i] != rd_spi_data[i])
-        {
-            success = 0;
-            break;
-        }
-        
-    }
-    
-    //printf("\r\nSuccessful writting = %d\r\n", success);
-    
-    return success;
-}
-
-char* DDS::__getControlRegister(){
-    
-    bool pll_range = 0;
-    bool pll_bypass = 1;
-    
-    if (cr_multiplier >= 4){
-        pll_bypass = 0;
-    }
-
-    if (frequency >= 200){
-        pll_range = 1;
-    }
-       
-    controlRegister[0] = 0x10 + cr_qdac_pwdn*4;
-    controlRegister[1] = pll_range*64 + pll_bypass*32 + (cr_multiplier & 0x1F);
-    controlRegister[2] = (cr_mode & 0x07)*2 + cr_ioupdclk;
-    controlRegister[3] = cr_inv_sinc*64 + cr_osk_en*32 + cr_osk_int*16 + cr_msb_lsb*2 + cr_sdo;
-    
-    return controlRegister;
-    
-    }
-    
-int DDS::__writeControlRegister(){
-    
-    bool            success;
-    char*  wr_spi_data;
-    char*  rd_spi_data;
-    char   addr = 0x07, ndata = 4;
-    
-    wr_spi_data = this->__getControlRegister();
-    
-    success = this->__writeData(addr, ndata, wr_spi_data);
-    
-    ////printf("\r\nChanging UPD_CLK as an OUTPUT ...");
-    dds_updclk->output();
-    
-    wait_us(100);
-    *dds_updclk = 1;
-    wait_us(10);
-    *dds_updclk = 0;
-    wait_us(10);
-    
-    rd_spi_data = this->__readData(addr, ndata);
-    
-    success = true;
-    
-    for(char i = 0; i < ndata; i++)
-    {
-        if (wr_spi_data[i] != rd_spi_data[i])
-        {
-            success = false;
-            break;
-        }
-    }
-    
-    return success;
-}   
-
-                    
-int DDS::reset(){
-    
-    // Master reset
-    //Set as a input, temporary
-    //printf("\r\nChange updclk direction as an INPUT ...\r\n");
-    dds_updclk->input();
-    dds_updclk->mode(PullDown);
-    
-    //printf("\r\nReseting DDS ...\r\n");
-    *dds_mreset = 1;
-    wait_ms(1);
-    *dds_mreset = 0;
-    wait_ms(1);
-    
-    this->rf_enabled = false;
-    
-    return 0;
-    }
-    
-int DDS::scanIOUpdate(){
-    
-    unsigned int cont = 0;
-    
-    this->reset();
-    
-    //printf("\r\nWaiting a upd_clk ...\r\n");
-    while(true){
-        if (*dds_updclk == 1)
-            break;
-        
-        cont += 1;
-        if (cont > 10000)
-            break;
-            
-        wait_us(1);
-    }
-    
-    if (cont > 10000){
-        //printf("\r\nA upd_clk was not found\r\n");
-        return 0;
-    }
-    
-    //printf("\r\nA upd_clk was found ...\r\n");
-    
-    return 1;
-    }
-    
-int DDS::find(){
-    /*
-    char phase[];
-    
-    phase[0] = 0x0A;
-    phase[1] = 0x55;
-    
-    this->__writeDataAndVerify(0x00, 5, phase);
-    */
-    this->__readData(0x05, 4);
-    this->__readData(0x0A, 1);
-    return 1;
-    
-    }
-    
-    
-int DDS::init(){
-    
-    //printf("\r\nSetting default parameters in CR ...\r\n");
-    
-    //Serial mode enabled
-    this->frequency = 200.0;        // Work frequency in MHz
-    this->cr_multiplier = 4;        // Multiplier 4- 20
-    this->cr_mode = 0;              // Single, FSK, Ramped FSK, Chirp, BPSK
-    this->cr_qdac_pwdn = 0;         // QDAC power down enabled: 0 -> disable
-    this->cr_ioupdclk = 0;          // IO Update clock direction: 0 -> input,  1 -> output
-    this->cr_inv_sinc  = 0;         // Sinc inverser filter enable: 0 -> enable
-    this->cr_osk_en = 1;            // Enable Amplitude multiplier: 0 -> disabled
-    this->cr_osk_int = 0;           // register/counter output shaped control: 0 -> register, 1 -> counter
-    this->cr_msb_lsb = 0;           // msb/lsb bit first: 0 -> MSB, 1 -> LSB
-    this->cr_sdo = 1;               // SDO pin active: 0 -> inactive
-
-    //printf("\r\nSetting in serial mode ...\r\n");
-    *dds_sp_mode = 0;
-    *dds_cs = 1;
-     
-    this->reset();
-    
-    //printf("\r\nWritting CR ...\r\n");
-    
-    if (not this->__writeControlRegister()){
-        //printf("\r\nUnsuccessful DDS initialization");
-        this->isConfig = false;
-        return false;
-        }
-        
-    //printf("\r\nSuccessfull DDS initialization");
-    
-    this->isConfig = true;
-    
-    return true;
-}
-
-char* DDS::rdMode(){
-    
-    char* rd_data;
-    char mode;
-    
-    rd_data = this->__readData(0x07, 4);
-    mode = (rd_data[2] & 0x0E) >> 1;
-    
-    rd_data[0] = mode;
-    
-    return rd_data;
-    }
-    
-char* DDS::rdMultiplier(){
-    
-    char* rd_data;
-    char mult;
-    
-    rd_data = this->__readData(0x07, 4);
-    mult = (rd_data[1] & 0x1F);
-    
-    rd_data[0] = mult;
-    rd_data[1] = ((int)clock >> 8) & 0xff; 
-    rd_data[2] = (int)clock & 0xff; 
-    
-    return rd_data;    
-    }
-char* DDS::rdPhase1(){
-
-    char* rd_data;
-    
-    rd_data = this->__readData(0x00, 2);
-    
-    return rd_data;
-    
-    }
-char* DDS::rdPhase2(){
-
-    char* rd_data;
-    
-    rd_data = this->__readData(0x01, 2);
-    
-    return rd_data;
-    }
-char* DDS::rdFrequency1(){
-
-    char* rd_data;
-    
-    rd_data = this->__readData(0x02, 6);
-    
-    return rd_data;
-    
-    }
-char* DDS::rdFrequency2(){
-
-    char* rd_data;
-    
-    rd_data = this->__readData(0x03, 6);
-    
-    return rd_data;
-    }
-char* DDS::rdAmplitudeI(){
-
-    char* rd_data;
-    
-    rd_data = this->__readData(0x08, 2);
-    
-    return rd_data;
-    }
-char* DDS::rdAmplitudeQ(){
-
-    char* rd_data;
-    
-    rd_data = this->__readData(0x09, 2);
-    
-    return rd_data;
-    }
-
-int DDS::isRFEnabled(){
-    
-    if (this->rf_enabled)
-        return 1;
-    
-    return 0;
-    }
-    
-int DDS::wrMode(char mode){
-    
-    this->cr_mode = mode & 0x07;
-    
-    return this->__writeControlRegister();
-    }
-
-int DDS::wrMultiplier(char multiplier, float clock){
-    
-    this->cr_multiplier = multiplier & 0x1F;
-    this->frequency = clock;
-    
-    //printf("\r\n mult = %d, clock = %f", multiplier, clock);
-    //printf("\r\n cr_mult = %d", cr_multiplier);
-    
-    return this->__writeControlRegister();
-    }
-        
-int DDS::wrPhase1(char* phase, SerialDriver *screen){
-    
-    return this->__writeDataAndVerify(0x00, 2, phase, screen);
-    
-    }
-    
-int DDS::wrPhase2(char* phase, SerialDriver *screen){
-    
-    return this->__writeDataAndVerify(0x01, 2, phase, screen);
-    
-    }
-    
-int DDS::wrFrequency1(char* freq, SerialDriver *screen){
-    
-    return this->__writeDataAndVerify(0x02, 6, freq, screen);
-    
-    }
-int DDS::wrFrequency2(char* freq, SerialDriver *screen){
-    
-    return this->__writeDataAndVerify(0x03, 6, freq, screen);
-    
-    }
-
-int DDS::wrAmplitudeI(char* amplitude, SerialDriver *screen){
-    
-    amplitudeI[0] = amplitude[0];
-    amplitudeI[1] = amplitude[1];
-    
-    return this->__writeDataAndVerify(0x08, 2, amplitude, screen);
-    
-    }
-
-int DDS::wrAmplitudeQ(char* amplitude, SerialDriver *screen){
-    
-    amplitudeQ[0] = amplitude[0];
-    amplitudeQ[1] = amplitude[1];
-     
-    return this->__writeDataAndVerify(0x09, 2, amplitude, screen);
-    
-    }
-
-int DDS::enableRF(){
-    
-    this->rf_enabled = true;
-    
-    this->__writeDataAndVerify(0x08, 2, this->amplitudeI);
-    return this->__writeDataAndVerify(0x09, 2, this->amplitudeQ);
-
-    }
-
-int DDS::disableRF(){
-    
-    this->rf_enabled = false;
-    
-    this->__writeDataAndVerify(0x08, 2, "\x00\x00");
-    return this->__writeDataAndVerify(0x09, 2, "\x00\x00");
-    
-    }
-       
-int DDS::defaultSettings(SerialDriver *screen){
-    
-    if (!(screen == NULL)){
-        screen->putc(0x37);
-        screen->putc(0x30);
-    }
-    
-    this->wrMultiplier(1, 0.0);
-    this->wrAmplitudeI("\x0F\xC0", screen);                //0xFC0 produces best SFDR than 0xFFF
-    this->wrAmplitudeQ("\x0F\xC0");                        //0xFC0 produces best SFDR than 0xFFF    
-    this->wrFrequency1("\x00\x00\x00\x00\x00\x00");        // 49.92 <> 0x3f 0xe5 0xc9 0x1d 0x14 0xe3 <> 49.92/clock*(2**48) \x3f\xe5\xc9\x1d\x14\xe3
-    this->wrFrequency2("\x00\x00\x00\x00\x00\x00");
-    this->wrPhase1("\x00\x00");                            //0 grados
-    this->wrPhase2("\x20\x00");                            //180 grados <> 0x20 0x00 <> 180/360*(2**14)
-    this->disableRF();
-        
-    if (!(screen == NULL)){
-        screen->putc(0x37);
-        screen->putc(0x31);
-    }
-    
-    return this->wrMode(4);                                //BPSK mode
-    
-    }
-    
-char* DDS::setCommand(unsigned short cmd, char* payload, unsigned long payload_len){
-    
-    bool success = false;    
-    char* tx_msg;
-    unsigned long tx_msg_len;
-    
-    tx_msg = KO_MSG;
-    tx_msg_len = 2;
-    
-    //printf("cmd = %d, payload_len = %d", cmd, payload_len);
-
-    //printf("\r\nPayload = ");
-    //for(unsigned long i=0; i< payload_len; i++)
-        //printf("0x%x ", payload[i]);
-    
-    //Si el DDS no esta inicializado siempre retornar NI_MSG
-    if (not this->isConfig){
-        this->cmd_answer = NI_MSG;
-        this->cmd_answer_len = 2;
-        
-        return this->cmd_answer;
-    }
-    
-    switch ( cmd )
-      {
-        case DDS_CMD_RESET:
-            success = this->init();
-            break;
-            
-        case DDS_CMD_ENABLE_RF:
-            if (payload_len == 1){
-                if (payload[0] == 0)
-                    success = this->disableRF();
-                else
-                    success = this->enableRF();
-            }
-            break;
-            
-        case DDS_CMD_MULTIPLIER:
-            if (payload_len == 3){
-                unsigned short clock = payload[1]*256 + payload[2];
-                success = this->wrMultiplier(payload[0], (float)clock);
-            }
-            break;
-            
-        case DDS_CMD_MODE:
-            if (payload_len == 1){
-                success = this->wrMode(payload[0]);
-            }
-            break;
-            
-        case DDS_CMD_FREQUENCY1:
-            if (payload_len == 6){
-                success = this->wrFrequency1(payload);
-            }
-            break;
-            
-        case DDS_CMD_FREQUENCY2:
-            if (payload_len == 6){
-                success = this->wrFrequency2(payload);
-            }
-            break;
-            
-        case DDS_CMD_PHASE1:
-            if (payload_len == 2){
-                success = this->wrPhase1(payload);
-            }
-            break;
-            
-        case DDS_CMD_PHASE2:
-            if (payload_len == 2){
-                success = this->wrPhase2(payload);
-            }
-            break;
-
-        case DDS_CMD_AMPLITUDEI:
-            if (payload_len == 2){
-                success = this->wrAmplitudeI(payload);
-            }
-            break;
-
-        case DDS_CMD_AMPLITUDEQ:
-            if (payload_len == 2){
-                success = this->wrAmplitudeQ(payload);
-            }
-            break;
-
-        case DDS_CMD_READ | DDS_CMD_ENABLE_RF:
-            if (this->isRFEnabled() == 1)
-                tx_msg = "\x01";
-            else
-                tx_msg = "\x00";
-                
-            tx_msg_len = 1;
-            
-            break;
-            
-        case DDS_CMD_READ | DDS_CMD_MULTIPLIER:
-            tx_msg = this->rdMultiplier();
-            tx_msg_len = 3;
-            break;
-            
-        case DDS_CMD_READ | DDS_CMD_MODE:
-            tx_msg = this->rdMode();
-            tx_msg_len = 1;
-            break;
-            
-        case DDS_CMD_READ | DDS_CMD_FREQUENCY1:
-            tx_msg = this->rdFrequency1();
-            tx_msg_len = 6;
-            break;
-            
-        case DDS_CMD_READ | DDS_CMD_FREQUENCY2:
-            tx_msg = this->rdFrequency2();
-            tx_msg_len = 6;
-            break;
-            
-        case DDS_CMD_READ | DDS_CMD_PHASE1:
-            tx_msg = this->rdPhase1();
-            tx_msg_len = 2;
-            break;
-            
-        case DDS_CMD_READ | DDS_CMD_PHASE2:
-            tx_msg = this->rdPhase2();
-            tx_msg_len = 2;
-            break;
-
-        case DDS_CMD_READ | DDS_CMD_AMPLITUDEI:
-            tx_msg = this->rdAmplitudeI();
-            tx_msg_len = 2;
-            break;
-
-        case DDS_CMD_READ | DDS_CMD_AMPLITUDEQ:
-            tx_msg = this->rdAmplitudeQ();
-            tx_msg_len = 2;
-            break;
-            
-        default:
-            success = false;
-        
-      }
-    
-    if (success){
-        tx_msg = OK_MSG;
-        tx_msg_len = 2;
-        }
-    
-    this->cmd_answer = tx_msg;
-    this->cmd_answer_len = tx_msg_len;
-    
-    return tx_msg;
-}
-
-char* DDS::getCmdAnswer(){
-    
-    return this->cmd_answer;
-    
-    }
-    
-unsigned long DDS::getCmdAnswerLen(){
-    
-    return this->cmd_answer_len;
-    
-    }
-
-int DDS::setAllDevice(char* payload, SerialDriver *screen){
-    
-    int sts;
-    char* phase1, *phase2;
-    char* freq1, *freq2;
-    char* delta_freq, *upd_rate_clk, *ramp_rate_clk;
-    char* control_reg;
-    char* amplitudeI, *amplitudeQ, *ampl_ramp_rate;
-    char* qdac;
-    
-    phase1 = &payload[0x00];
-    phase2 = &payload[0x02];
-    freq1 = &payload[0x04];
-    freq2 = &payload[0x0A];
-    delta_freq = &payload[0x10];
-    upd_rate_clk = &payload[0x16];
-    ramp_rate_clk = &payload[0x1A];
-    control_reg = &payload[0x1D];
-    amplitudeI = &payload[0x21];
-    amplitudeQ = &payload[0x23];
-    ampl_ramp_rate = &payload[0x25];
-    qdac = &payload[0x26];
-    
-    control_reg[2] = control_reg[2] & 0xFE;     //cr_ioupdclk always as an input = 0
-    control_reg[3] = control_reg[3] | 0x01;     //cr_sdo enable = 1
-    
-    this->wrPhase1(phase1);
-    this->wrPhase2(phase2);
-    this->wrFrequency1(freq1);
-    this->wrFrequency2(freq2);
-    this->__writeDataAndVerify(0x10, 6, delta_freq);
-    this->__writeDataAndVerify(0x16, 4, upd_rate_clk);
-    this->__writeDataAndVerify(0x1A, 3, ramp_rate_clk);
-    this->__writeDataAndVerify(0x1D, 4, control_reg);
-    this->wrAmplitudeI(amplitudeI);
-    this->wrAmplitudeQ(amplitudeQ);
-    this->__writeDataAndVerify(0x25, 1, ampl_ramp_rate);
-    this->__writeDataAndVerify(0x26, 2, qdac, screen);
-    
-    sts = this->enableRF();
-    
-    return sts;
-    
-    }
-
-bool DDS::wasInitialized(){
-    
-    return this->isConfig;
-}
\ No newline at end of file
--- a/JroDDS.h	Tue Feb 10 14:28:42 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,98 +0,0 @@
-#ifndef        JRO_DDS
-#define        JRO_DDS
-
-#include "mbed.h"
-#include "SerialDriver.h"
-
-#define SPI_BITS 8
-#define SPI_MODE 0
-#define SPI_FREQ 10000
-
-#define DDS_CMD_RESET       0X10
-#define DDS_CMD_ENABLE_RF   0x11
-#define DDS_CMD_MULTIPLIER  0X12
-#define DDS_CMD_MODE        0x13
-#define DDS_CMD_FREQUENCY1  0X14
-#define DDS_CMD_FREQUENCY2  0x15
-#define DDS_CMD_PHASE1      0X16
-#define DDS_CMD_PHASE2      0x17
-#define DDS_CMD_AMPLITUDEI  0X18
-#define DDS_CMD_AMPLITUDEQ  0x19
-#define DDS_CMD_READ        0x8000
-
-class DDS{
-    private:
-        float           frequency;              // Work frequency in MHz
-        char            cr_multiplier;         // Multiplier 4- 20
-        char            cr_mode;                // Single, FSK, Ramped FSK, Chirp, BPSK
-        bool            cr_qdac_pwdn;           // Q DAC power down enable: 0 -> disable
-        bool            cr_ioupdclk;            // IO Update clock enable: 0 -> input
-        bool            cr_inv_sinc;            // Inverse sinc filter enable: 0 -> enable
-        bool            cr_osk_en;              // Enable AM: 0 -> disabled
-        bool            cr_osk_int;             // ext/int output shaped control: 0 -> external
-        bool            cr_msb_lsb;             // msb/lsb bit first: 0 -> MSB
-        bool            cr_sdo;                 // SDO pin active: 0 -> inactive
-        
-        SPI             *spi_device;
-        //DDS I/O
-        DigitalOut      *dds_mreset;
-        DigitalOut      *dds_outramp;
-        DigitalOut      *dds_sp_mode;
-        DigitalOut      *dds_cs;
-        DigitalOut      *dds_io_reset;
-        DigitalInOut    *dds_updclk;
-        
-        char            frequency1[6];
-        char            frequency2[6];
-        char            phase1[2];
-        char            phase2[2];       
-        char            amplitudeI[2];
-        char            amplitudeQ[2];
-        bool            rf_enabled;
-        
-        char*           cmd_answer;
-        unsigned long   cmd_answer_len;
-        
-        int __writeData(char addr, char ndata, const char* data);
-        char* __readData(char addr, char ndata);
-        int __writeDataAndVerify(char addr, char ndata, const char* wr_spi_data, SerialDriver *screen=NULL);
-        char* __getControlRegister();
-        int __writeControlRegister();
-        
-    public:
-        bool isConfig;
-        
-        DDS(SPI *spi_dev, DigitalOut *mreset, DigitalOut *outramp, DigitalOut *spmode, DigitalOut *cs, DigitalOut *ioreset, DigitalInOut *updclk);
-        int init();
-        int reset();
-        int scanIOUpdate();
-        int find();
-        char* rdMode();
-        char* rdMultiplier();
-        char* rdPhase1();
-        char* rdPhase2();
-        char* rdFrequency1();
-        char* rdFrequency2();
-        char* rdAmplitudeI();
-        char* rdAmplitudeQ();
-        int isRFEnabled();
-        int wrMode(char mode);
-        int wrMultiplier(char multiplier, float clock);
-        int wrPhase1(char* phase, SerialDriver *screen=NULL);
-        int wrPhase2(char* phase, SerialDriver *screen=NULL);
-        int wrFrequency1(char* freq, SerialDriver *screen=NULL);
-        int wrFrequency2(char* freq, SerialDriver *screen=NULL);
-        int wrAmplitudeI(char* amplitude, SerialDriver *screen=NULL);
-        int wrAmplitudeQ(char* amplitude, SerialDriver *screen=NULL);
-        int enableRF();
-        int disableRF();
-        int defaultSettings(SerialDriver *screen=NULL);
-        char* setCommand(unsigned short cmd, char* payload, unsigned long payload_len);
-        char* getCmdAnswer();
-        unsigned long getCmdAnswerLen();
-        int setAllDevice(char* payload, SerialDriver *screen=NULL);
-        bool wasInitialized();
-    
-};
-
-#endif
\ No newline at end of file
--- a/JroIpdata.cpp	Tue Feb 10 14:28:42 2015 +0000
+++ b/JroIpdata.cpp	Mon Feb 23 20:36:23 2015 +0000
@@ -169,6 +169,8 @@
     this->len_payload = len_data - 5;       //1B id_class, 1B id_dev, 2B cmd y 1B xor
     this->xor_rd = ip_data[4+len_data-1];
     
+    this->payload[this->len_payload] = 0x00;                 //the last byte should be set to 0x00 (end of payload)
+    
     //printf("\r\nID_CLASS = 0x%x, ID_DEV = 0x%x, CMD = 0x%x, XOR = 0x%x", id_class, id_dev, cmd, xor_rd);
     //printf("\r\nPAYLOAD[0] = 0x%x, PYLD_LEN = 0x%x\r\n", payload[0], len_payload);
     
@@ -231,7 +233,7 @@
         
     return this->len_tx_buffer;
 }
-
+    
 char* IpData::getNIData(unsigned short cmd){
     
     char tx_data[5];
@@ -244,4 +246,32 @@
 unsigned long IpData::getNIDataLen(){
         
     return this->len_tx_buffer;
+}
+
+char* IpData::getOKData(unsigned short cmd){
+    
+    char tx_data[5];
+    
+    strcpy(tx_data, OK_PAYLOAD);
+    
+    return this->encode(cmd, tx_data, OK_LEN);
+}
+
+unsigned long IpData::getOKDataLen(){
+        
+    return this->len_tx_buffer;
+}
+
+char* IpData::getKOData(unsigned short cmd){
+    
+    char tx_data[5];
+    
+    strcpy(tx_data, KO_PAYLOAD);
+    
+    return this->encode(cmd, tx_data, KO_LEN);
+}
+
+unsigned long IpData::getKODataLen(){
+        
+    return this->len_tx_buffer;
 }
\ No newline at end of file
--- a/JroIpdata.h	Tue Feb 10 14:28:42 2015 +0000
+++ b/JroIpdata.h	Mon Feb 23 20:36:23 2015 +0000
@@ -7,6 +7,12 @@
 #define ID_CLASS    2
 #define ID_DEV      1
 
+#define OK_PAYLOAD  "OK"
+#define OK_LEN      2
+
+#define KO_PAYLOAD  "KO"
+#define KO_LEN      2
+
 #define NI_PAYLOAD  "NI"
 #define NI_LEN      2
 
@@ -79,6 +85,10 @@
         unsigned long getTxDataLen();
         char* getNIData(unsigned short cmd=0x0);
         unsigned long getNIDataLen();
+        char* getOKData(unsigned short cmd=0x0);
+        unsigned long getOKDataLen();
+        char* getKOData(unsigned short cmd=0x0);
+        unsigned long getKODataLen();
 };
 
 #endif
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/JroSIR.h	Mon Feb 23 20:36:23 2015 +0000
@@ -0,0 +1,9 @@
+#ifndef        JRO_SIR
+#define        JRO_SIR
+
+//Device commands
+#define CMD_RESET       0X01
+#define CMD_ENABLE      0x02
+#define CMD_CHANGE_IP   0x03
+
+#endif
\ No newline at end of file