This is the final version of Mini Gateway for Automation and Security desgined for Renesas GR Peach Design Contest

Dependencies:   GR-PEACH_video GraphicsFramework HTTPServer R_BSP mbed-rpc mbed-rtos Socket lwip-eth lwip-sys lwip FATFileSystem

Fork of mbed-os-example-mbed5-blinky by mbed-os-examples

Revision:
12:9a20164dcc47
Parent:
8:bb09890333fe
--- a/main.cpp	Fri Sep 02 15:15:05 2016 +0100
+++ b/main.cpp	Wed Jan 11 11:41:30 2017 +0000
@@ -1,13 +1,808 @@
-#include "mbed.h"
-
-DigitalOut led1(LED1);
-
-// main() runs in its own thread in the OS
-// (note the calls to Thread::wait below for delays)
-int main() {
-    while (true) {
-        led1 = !led1;
-        Thread::wait(500);
-    }
-}
-
+#include "mbed.h"
+#include "RF24.h"
+#include "ILI9486.h"
+#include "DisplayBace.h"
+#include "SDFileSystem.h"
+#include "JPEG_Converter.h"
+
+#include "HTTPServer.h"
+#include "FsHandler.h"
+
+#include "rtos.h"
+
+#include "stdio.h"
+#include "string"
+#include "Arial12x12.h"
+#include "Arial28x28.h"
+#include "Arial24x23.h"
+//#include "Terminal6x8.h"
+#include "Arial43x48_numb.h"
+#include "pict.h"
+#include "pavement_48x34.h"
+#include "Touch.h"
+
+#include "camera.h"
+#include "EthernetInterface.h"
+
+//Initialization
+Serial uart(USBTX, USBRX);
+ILI9486 myLCD(SPI_16, 16000000, P4_6, NC, P4_4, P4_5, P2_14, P8_1,"myLCD"); // Spi 16bit, 12MHz, mosi, miso, sclk, cs, reset, dc
+TouchScreenADS7843 TP(P4_6 ,P4_7 ,P4_4 ,P2_9 ,P7_15, &myLCD);// ADS7843 -> mosi, miso, sclk, cs, irq, SPI_myLCD
+SDFileSystem sd(P8_5, P8_6, P8_3, P8_4, "sd");
+RF24 radio(P10_14,P10_15, P10_12,P8_14, P10_13); // mosi, miso, sck, csn, ce, irq
+
+AnalogIn   temp(A4);
+DigitalOut led3(LED3);
+int temp_count=0,in_pic=0;
+
+struct Screen {
+    int16_t title[60*320];
+    int titlex,titley;
+    int16_t logo[80*320];
+    int logox,logoy;
+    int16_t hc[157*156];
+    int hcx,hcy,hch,hcw;
+    int16_t aut[158*156];
+    int autx,auty,autw,auth;
+    int16_t sec[157*158];
+    int secx,secy,secw,sech;
+    int16_t ind[158*158];
+    int indx,indy,indw,indh;
+    int indsize;
+    int secsize;
+    int autsize;
+    int hcsize;
+    int logosize;
+    int titlesize;
+} dis_nav;
+
+//Variables
+unsigned short backgroundcolor=Black;
+unsigned short foregroundcolor=Red;
+int pos[4];
+int16_t colors[16]= {
+    0x000F,0x0000,0x03E0,0x03EF,0x7800,0x780F,0x7BE0,0xC618,0x7BEF,0x001F,0x07E0,0x07FF,0xF800,0xF81F,0xFFE0,0xFFFF
+};
+int color_count=0;
+int cam_sel=0;
+int ind_speed=0;
+int ind_of=0;
+int16_t prev_col=0;
+EthernetInterface network;
+HTTPServer svr;
+TCPSocketServer rf_server;
+TCPSocketConnection client;
+
+
+static unsigned short col_buf[PIXEL_VW][PIXEL_HW]__attribute((section("NC_BSS"),aligned(8)));  //8 bytes aligned!;
+static uint8_t JCUBuffer_OUTPUT[PIXEL_HW * VIDEO_BUFFER_HEIGHT*4]__attribute((section("NC_BSS"),aligned(8)));  //8 bytes aligned!;
+
+
+
+//Init LCD and touch
+void Init_lcd_touch()
+{
+    Matrix matrix;
+    Coordinate ScreenSample[3];
+    myLCD.set_orientation(2);
+    // myLCD.claim(stdout);      // send stdout to the LCD display
+    //myLCD.claim(stderr);      // send stderr to the LCD display
+    myLCD.background(backgroundcolor);    // set background to black
+    myLCD.foreground(foregroundcolor);    // set chars to white
+    myLCD.cls();
+    myLCD.set_font((unsigned char*) Arial12x12);
+    myLCD.locate(0,20);
+    TP.TouchPanel_Calibrate();
+
+    //  myLCD.set_orientation(0);
+    // Display calibration values
+    TP.GetCalibration(&matrix, &ScreenSample[0]);
+    myLCD.cls();
+    myLCD.locate(0,20);
+    // read calibration results
+    printf("Read calibration results.\n");
+    printf("matrix.An = %d\n", matrix.An);
+    printf("matrix.Bn = %d\n", matrix.Bn);
+    printf("matrix.Cn = %d\n", matrix.Cn);
+    printf("matrix.Dn = %d\n", matrix.Dn);
+    printf("matrix.En = %d\n", matrix.En);
+    printf("matrix.Fn = %d\n", matrix.Fn);
+    printf("matrix.Di = %d\n", matrix.Divider);
+    for (int i=0; i<3; i++)
+        printf("sample x[%d] = %d\nsample y[%d] = %d\n", i, ScreenSample[i].x, i, ScreenSample[i].y);
+    // Write calibration results
+    printf("\nWrite calibration results...\n");
+    TP.SetCalibration(&matrix, &ScreenSample[0]);
+    printf("Done.\nTouch panel to start\n");
+    while(TP._tp_irq);
+}
+
+int get_xy()
+{
+    int x=0;
+    if(!TP._tp_irq) {
+        if (TP.Read_Ads7843()) {
+            TP.getDisplayPoint() ;
+            //myLCD.cls();
+            //myLCD.locate(20,0);
+            // TP.TP_DrawPoint(TP.display.x,TP.display.y, Blue);
+            x=1;
+        }
+    }
+    wait(0.1);
+    return x;
+}
+
+void init_dis_nav()
+{
+    dis_nav.indsize=158*158;
+    dis_nav.secsize=157*158;
+    dis_nav.autsize=158*156;
+    dis_nav.hcsize=157*156;
+    dis_nav.logosize=80*320;
+    dis_nav.titlesize=60*320;
+    myLCD.BMP_16(0,0,"/sd/gui/title.bmp",dis_nav.title);
+    dis_nav.titlex=0;
+    dis_nav.titley=0;
+    myLCD.BMP_16(0,400,"/sd/gui/logo.bmp",dis_nav.logo);
+    dis_nav.logox=0;
+    dis_nav.logoy=400;
+    myLCD.BMP_16(0,81,"/sd/gui/hc.bmp",dis_nav.hc);
+    dis_nav.hcx=0;
+    dis_nav.hcy=81;
+    dis_nav.hcw=157;
+    dis_nav.hch=158;
+    //myLCD.fillrect(161,81,319,237,White);
+    myLCD.BMP_16(dis_nav.autx=161,dis_nav.auty=81,"/sd/gui/auto.bmp",dis_nav.aut);
+    dis_nav.autw=158;
+    dis_nav.auth=156;
+    //myLCD.fillrect(0,241,157,399,White);
+    myLCD.BMP_16(dis_nav.secx=0,dis_nav.secy=241,"/sd/gui/secu.bmp",dis_nav.sec);
+    dis_nav.secw=157;
+    dis_nav.sech=158;
+    //myLCD.fillrect(161,241,319,399,White);
+    myLCD.BMP_16(dis_nav.indx=161,dis_nav.indy=241,"/sd/gui/indus.bmp",dis_nav.ind);
+    dis_nav.indw=158;
+    dis_nav.indh=158;
+}
+
+void init_gui()
+{
+    init_dis_nav();
+    myLCD.cls();
+    myLCD.BMP_disp(dis_nav.titlex,dis_nav.titley,dis_nav.title,dis_nav.titlesize,0,60);
+    myLCD.BMP_disp(dis_nav.logox,dis_nav.logoy,dis_nav.logo,dis_nav.logosize,0,80);
+    myLCD.rect(0,60,319,80,Red);
+    myLCD.rect(1,61,318,79,Red);
+    myLCD.locate(4,65);
+    // myLCD.fillrect(0,81,157,237,White);
+    myLCD.BMP_disp(dis_nav.hcx,dis_nav.hcy,dis_nav.hc,dis_nav.hcsize,dis_nav.hcw,dis_nav.hch);
+    //myLCD.fillrect(161,81,319,237,White);
+    myLCD.BMP_disp(dis_nav.autx,dis_nav.auty,dis_nav.aut,dis_nav.autsize,dis_nav.autw,dis_nav.auth);
+    //myLCD.fillrect(0,241,157,399,White);
+    myLCD.BMP_disp(dis_nav.secx,dis_nav.secy,dis_nav.sec,dis_nav.secsize,dis_nav.secw,dis_nav.sech);
+    //myLCD.fillrect(161,241,319,399,White);
+    myLCD.BMP_disp(dis_nav.indx,dis_nav.indy,dis_nav.ind,dis_nav.indsize,dis_nav.indw,dis_nav.indh);
+    myLCD.set_font((unsigned char*) Arial12x12);
+    myLCD.printf("Select a menu");
+    for(int i=158; i<160; i++) {
+        myLCD.line(i,80,i,400,Blue);
+    }
+    for(int i=238; i<240; i++) {
+        myLCD.line(0,i,319,i,Blue);
+    }
+
+}
+
+
+void set_ind(int o_f,int speed)
+{
+    uint8_t add[]= {0xe7,0xe7,0xe7,0xe7,0xe8};
+    radio.stopListening();
+    radio.openWritingPipe(add);
+    wait_ms(2);
+
+    int count=0;
+    char c[20];
+    sprintf(c,"NEO,1,%d,%d,1\n",o_f,speed);
+    myLCD.fillrect(2,62,317,78,Black);
+    myLCD.locate(4,65);
+    myLCD.set_font((unsigned char*) Arial12x12);
+    myLCD.printf("Writing %s",c);
+    while (!radio.write( &c, 20 )) {
+        myLCD.fillrect(2,62,317,78,Black);
+        myLCD.locate(4,65);
+        myLCD.set_font((unsigned char*) Arial12x12);
+        myLCD.printf("Failed");
+        count++;
+        if(count>=10)
+            break;
+        wait(0.1);
+    }
+    wait_ms(2);
+    radio.startListening();
+    wait_ms(1);
+}
+
+void set_color(char r,char g,char b)
+{
+    uint8_t add[]= {0xe7,0xe7,0xe7,0xe8,0xe8};
+    radio.stopListening();
+    radio.openWritingPipe(add);
+    wait_ms(2);
+
+    int count=0;
+    char c[20];
+    sprintf(c,"N,5,%d,%d,%d,%d,1\n",0x01,(r<<3),(g<<2),(b<<3));
+    myLCD.fillrect(2,62,317,78,Black);
+    myLCD.locate(4,65);
+    myLCD.set_font((unsigned char*) Arial12x12);
+    myLCD.printf("Writing %s",c);
+    while (!radio.write( &c, 20 )) {
+        myLCD.fillrect(2,62,317,78,Black);
+        myLCD.locate(4,65);
+        myLCD.set_font((unsigned char*) Arial12x12);
+        myLCD.printf("Failed");
+        count++;
+        if(count>=10)
+            break;
+        wait(0.1);
+    }
+    wait_ms(2);
+    radio.startListening();
+    wait_ms(1);
+}
+
+void take_pic_jpg(int name)
+{
+    led2=1;
+    JPEG_Converter  encoder;
+    JPEG_Converter::bitmap_buff_info_t  aBitmapData;
+    size_t EncodeSize;
+    FILE * wr_fp = NULL;
+
+    aBitmapData.width           = PIXEL_HW;
+    aBitmapData.height          = VIDEO_BUFFER_HEIGHT;
+    aBitmapData.format          = JPEG_Converter::WR_RD_YCbCr422;   //YCbCr[0] & ARGB8888[1] is 4byte, not RGB565[2] is 2byte
+    aBitmapData.buffer_address  = (void *)save_buff_addr;
+    if (encoder.encode(&aBitmapData, JCUBuffer_OUTPUT, &EncodeSize) == JPEG_Converter::JPEG_CONV_OK) {
+
+        char c[20];
+        sprintf(c,"/sd/abc%d.jpg",name);
+        wr_fp = fopen(c, "w");
+        fwrite(JCUBuffer_OUTPUT, sizeof(char), EncodeSize, wr_fp);
+        fclose(wr_fp);
+        led2=0;
+    }
+
+}
+
+unsigned short yuvtorgb(int y,int u,int v)
+{
+    unsigned short rgb=0;
+    int r = y + (1.402 * (v-128));
+    int g = y - (0.34414 * (u-128)) - (0.71414 * (v-128));
+    int b = y + (1.772* (u-128));
+    if(r<0)r=0;
+    else if(r>255)r=255;
+    if(g<0)g=0;
+    else if(g>255)g=255;
+    if(b<0)b=0;
+    else if(b>255)b=255;
+    r=r>>3;
+    g=g>>2;
+    b=b>>3;
+    rgb=(r<<11)|(g<<5)|b;
+    return rgb;
+
+}
+void take_picture()
+{
+    // uint8_t col_buf[PIXEL_HW * VIDEO_BUFFER_HEIGHT*4];
+    pos[2]=pos[1]=pos[0]=pos[3]=0;
+    DisplayBase::graphics_error_t error;
+    in_pic=1;
+    led1 = 1;
+
+    if (write_buff_addr == FrameBuffer_Video_A) {
+        write_buff_addr = FrameBuffer_Video_B;
+        save_buff_addr  = FrameBuffer_Video_A;
+    } else {
+        write_buff_addr = FrameBuffer_Video_A;
+        save_buff_addr  = FrameBuffer_Video_B;
+    }
+
+    /* Change write buffer */
+    error = Display.Video_Write_Change(
+                VIDEO_INPUT_CH,
+                write_buff_addr,
+                VIDEO_BUFFER_STRIDE);
+    if (error != DisplayBase::GRAPHICS_OK) {
+        uart.printf("Line %d, error %d\n", __LINE__, error);
+        while (1);
+    }
+    /* Wait 2 Vfield(Top or bottom field) */
+
+    WaitVfield(2);
+
+    myLCD.WindowMax();
+    int j=0,k=0;
+    for(int i=0; i<VIDEO_BUFFER_STRIDE * VIDEO_BUFFER_HEIGHT; i++) {
+        unsigned short rgb1=0,rgb2=0;
+        int yb=save_buff_addr[i];
+        int v=save_buff_addr[i+1];
+        int ya=save_buff_addr[i+2];
+        int u=save_buff_addr[i+3];
+        i=i+3;
+        rgb1=yuvtorgb(ya,u,v);
+        rgb2=yuvtorgb(yb,u,v);
+        col_buf[j][k++]=rgb2;
+        col_buf[j][k++]=rgb1;
+        if(k==320) {
+            j++;
+            k=0;
+        }
+    }
+
+    for(int i=0; i<480; i++) {
+        for(int j=0; j<320; j++) {
+            for(int k=3; k>=0; k--) {
+                myLCD.wr_gram(col_buf[i][k+j]);
+            }
+            j=j+3;
+        }
+    }
+
+    led1=0;
+
+    take_pic_jpg(10);
+
+}
+
+
+void navigate(int x,int y)
+{
+    if(in_pic==1) {
+        in_pic=0;
+        myLCD.cls();
+        myLCD.BMP_disp(dis_nav.titlex,dis_nav.titley,dis_nav.title,dis_nav.titlesize,0,60);
+        myLCD.BMP_disp(dis_nav.logox,dis_nav.logoy,dis_nav.logo,dis_nav.logosize,0,80);
+        myLCD.rect(0,60,319,80,Red);
+        myLCD.rect(1,61,318,79,Red);
+        myLCD.BMP_disp(dis_nav.indx,dis_nav.indy,dis_nav.ind,dis_nav.indsize,dis_nav.indw,dis_nav.indh);
+        myLCD.BMP_disp(dis_nav.secx,dis_nav.secy,dis_nav.sec,dis_nav.secsize,dis_nav.secw,dis_nav.sech);
+        myLCD.BMP_disp(dis_nav.autx,dis_nav.auty,dis_nav.aut,dis_nav.autsize,dis_nav.autw,dis_nav.auth);
+        myLCD.BMP_disp(dis_nav.hcx,dis_nav.hcy,dis_nav.hc,dis_nav.hcsize,dis_nav.hcw,dis_nav.hch);
+        pos[0]=pos[1]=pos[2]=pos[3]=0;
+        return;
+    }
+    if(y>85 && y<235) {
+        if(x<155) { //Healthcare Navigation
+            if(pos[0]==0) {
+                myLCD.fillrect(0,81,157,237,Black);
+                myLCD.BMP_16(2,82,"/sd/gui/heart.bmp");
+                myLCD.BMP_16(2,170,"/sd/gui/temp.bmp");
+                myLCD.BMP_16(58,136,"/sd/gui/b_but.bmp");
+                myLCD.set_font((unsigned char*) Arial28x28);
+                myLCD.foreground(Red);
+                //myLCD.set_font_zoom(2,2);
+                // myLCD.rect(96,96,144,128,Red);
+                //  myLCD.locate(100,100);
+                // myLCD.printf("92");
+                // myLCD.locate(78,194);
+//                myLCD.printf("32");
+//                // myLCD.rect(76,188,152,225,Red);
+//                myLCD.circle(116,197,3,Red);
+//                myLCD.locate(124,194);
+//                myLCD.printf("C");
+                pos[0]=1;
+            } else {
+                if(x>58&& x<108 && y>136 && y<176) {
+                    myLCD.BMP_disp(dis_nav.hcx,dis_nav.hcy,dis_nav.hc,dis_nav.hcsize,dis_nav.hcw,dis_nav.hch);
+                    pos[0]=0;
+                }
+            }
+
+        } else {
+            if(pos[1]==0) { //Automation Navigation
+                myLCD.fillrect(161,81,319,237,Black);
+                myLCD.BMP_16(280,88,"/sd/gui/b_but.bmp");
+                myLCD.BMP_16(207,82,"/sd/gui/bulb.bmp");
+                myLCD.circle(190,105,15,White);
+                myLCD.fillcircle(190,105,13,prev_col);
+                int count=0;
+                for(int i=0; i<3; i++) {
+                    for(int j=0; j<5; j++) {
+                        int a=164+(j*30);
+                        int b=138+(i*30);
+                        myLCD.fillrect(a,b,a+30,b+30,colors[count++]);
+                    }
+                }
+                pos[1]=1;
+            } else {
+                if(x>275 && x<319 && y>84 &&y<130) {
+                    myLCD.BMP_disp(dis_nav.autx,dis_nav.auty,dis_nav.aut,dis_nav.autsize,dis_nav.autw,dis_nav.auth);
+                    pos[1]=0;
+                } else if(x>164 && x<319 && y>138 && y<236) {
+                    int a=(x-164)/30;
+                    int b=(y-138)/30;
+                    int c=a+(b*5);
+                    myLCD.fillcircle(190,105,13,colors[c]);
+                    char r=(char)((colors[c]>>11)&0x1f);
+                    char g=(char)((colors[c]>>5)&0x3f);
+                    char bl=(char)((colors[c])&0x1f);
+                    set_color(r,g,bl);
+                    prev_col=colors[c];
+
+                }
+
+            }
+        }
+    } else if(y>238 && y<400) {
+        if(x<155) { //Security Navigation
+            if(pos[2]==0) {
+                myLCD.fillrect(dis_nav.secx,dis_nav.secy,dis_nav.secw+dis_nav.secx,dis_nav.sech+dis_nav.secy,Black);
+                myLCD.BMP_16(10,245,"/sd/gui/d_close.bmp");
+                myLCD.BMP_16(113,245,"/sd/gui/b_but.bmp");
+                myLCD.rect(10,365,35,390,White);
+                myLCD.rect(11,366,34,389,White);
+                myLCD.locate(45,365);
+                myLCD.set_font((unsigned char*) Arial24x23);
+                myLCD.printf("Camera");
+                pos[2]=1;
+            } else {
+                if(x>9 && y >364 && x<36 && y<391) {
+                    if(cam_sel==0) {
+                        myLCD.fillrect(12,367,33,388,Blue);
+                        cam_sel=1;
+                    } else {
+                        myLCD.fillrect(12,367,33,388,Black);
+                        cam_sel=0;
+                    }
+                } else if(x>112 && y>244 && x<154 && y<286) {
+                    myLCD.BMP_disp(dis_nav.secx,dis_nav.secy,dis_nav.sec,dis_nav.secsize,dis_nav.secw,dis_nav.sech);
+                    pos[2]=0;
+                }
+            }
+
+
+        } else { // Industry
+            if(pos[3]==0) {
+                myLCD.fillrect(dis_nav.indx,dis_nav.indy,dis_nav.indw+dis_nav.indx,dis_nav.indh+dis_nav.indy,Black);
+                myLCD.BMP_16(278,245,"/sd/gui/b_but.bmp");
+                myLCD.BMP_16(200,250,"/sd/gui/blower.bmp");
+                myLCD.BMP_16(163,345,"/sd/gui/minus.bmp");
+                if(ind_of==0)
+                    myLCD.BMP_16(214,335,"/sd/gui/b_p_off.bmp");
+                else
+                    myLCD.BMP_16(214,335,"/sd/gui/b_p_on.bmp");
+                myLCD.BMP_16(266,345,"/sd/gui/plus.bmp");
+                myLCD.locate(170,270);
+                myLCD.set_font((unsigned char*) Arial28x28);
+                myLCD.printf("%d",ind_speed);
+                pos[3]=1;
+            } else {
+                if(x>=266 && y>=345 && x<=316 && y<=395) {
+                    ind_speed++;
+                    if(ind_speed>9)
+                        ind_speed=9;
+
+                    set_ind(ind_of,ind_speed);
+                    myLCD.locate(170,270);
+                    myLCD.set_font((unsigned char*) Arial28x28);
+                    myLCD.printf("%d",ind_speed);
+                } else if(x>=163 && y>=345 && x<=213 && y<=395) {
+                    ind_speed--;
+                    if(ind_speed<0)
+                        ind_speed=0;
+                    set_ind(ind_of,ind_speed);
+                    myLCD.locate(170,270);
+                    myLCD.set_font((unsigned char*) Arial28x28);
+                    myLCD.printf("%d",ind_speed);
+                } else if(x>=214 && y>=335 && x<=264 && y<=385) {
+                    if(ind_of==0) {
+                        myLCD.BMP_16(214,335,"/sd/gui/b_p_on.bmp");
+                        ind_of=1;
+                        set_ind(ind_of,ind_speed);
+                    } else {
+                        myLCD.BMP_16(214,335,"/sd/gui/b_p_off.bmp");
+                        ind_of=0;
+                        set_ind(ind_of,ind_speed);
+                    }
+                } else if(x>=278 && y>=245 && x<=318 && y<=285) {
+
+                    myLCD.BMP_disp(dis_nav.indx,dis_nav.indy,dis_nav.ind,dis_nav.indsize,dis_nav.indw,dis_nav.indh);
+                    pos[3]=0;
+                }
+            }
+
+        }
+    } else if(y>400) {
+        myLCD.BMP_disp(dis_nav.indx,dis_nav.indy,dis_nav.ind,dis_nav.indsize,dis_nav.indw,dis_nav.indh);
+        myLCD.BMP_disp(dis_nav.secx,dis_nav.secy,dis_nav.sec,dis_nav.secsize,dis_nav.secw,dis_nav.sech);
+        myLCD.BMP_disp(dis_nav.autx,dis_nav.auty,dis_nav.aut,dis_nav.autsize,dis_nav.autw,dis_nav.auth);
+        myLCD.BMP_disp(dis_nav.hcx,dis_nav.hcy,dis_nav.hc,dis_nav.hcsize,dis_nav.hcw,dis_nav.hch);
+        pos[0]=pos[1]=pos[2]=pos[3]=0;
+    }
+    wait(0.1);
+}
+
+void init_radio()
+{
+    uint8_t hb[]= {0xe7,0xe7,0xe7,0xe8,0xe9};
+    uint8_t sec[]= {0xe8,0xe7,0xe7,0xe8,0xe9};
+    radio.begin();
+    radio.setAutoAck(1);
+    radio.setChannel(100);
+    radio.setDataRate(RF24_1MBPS);
+    radio.enableAckPayload();               // Allow optional ack payloads
+    radio.setRetries(15, 15);
+    radio.setPALevel(RF24_PA_MAX);
+    radio.enableDynamicPayloads();
+    radio.openReadingPipe(1,hb);
+    radio.openReadingPipe(2,sec);
+    radio.startListening();
+
+}
+
+void cli_decode(char *c)
+{
+    int count=0;
+    string s[10];
+    char c1[20];
+    int s_count=0;
+    for(int i=0; i<20; i++) {
+        if(c[i]=='\n')
+            break;
+        if(c[i]==',') {
+            s_count++;
+            continue;
+        }
+        s[s_count]+=c[i];
+    }
+
+    if(s[0]!="NEO"&&s[0]!="N")
+        return;
+    myLCD.fillrect(2,62,317,78,Black);
+    myLCD.locate(4,65);
+    myLCD.set_font((unsigned char*) Arial12x12);
+    myLCD.printf("Writing %s",c);
+    if(s[1]=="1") {
+        sprintf(c1,"%s,%s,%s,%s,1\n",s[0].c_str(),s[1].c_str(),s[2].c_str(),s[3].c_str());
+        uint8_t add[]= {0xe7,0xe7,0xe7,0xe7,0xe8};
+        radio.stopListening();
+        radio.openWritingPipe(add);
+        wait_ms(2);
+        while (!radio.write( &c1, 20 )) {
+            myLCD.fillrect(2,62,317,78,Black);
+            myLCD.locate(4,65);
+            myLCD.set_font((unsigned char*) Arial12x12);
+            myLCD.printf("Failed");
+            count++;
+            if(count>=10)
+                break;
+            wait(0.1);
+        }
+        wait_ms(2);
+        radio.startListening();
+        wait_ms(1);
+
+    } else if(s[1]=="5") {
+        sprintf(c1,"%s,%s,%s,%s,%s,%s,1\n",s[0].c_str(),s[1].c_str(),s[2].c_str(),s[3].c_str(),s[4].c_str(),s[5].c_str());
+        uint8_t add[]= {0xe7,0xe7,0xe7,0xe8,0xe8};
+        radio.stopListening();
+        radio.openWritingPipe(add);
+        wait_ms(2);
+        int count=0;
+        while (!radio.write( &c1, 20 )) {
+            myLCD.fillrect(2,62,317,78,Black);
+            myLCD.locate(4,65);
+            myLCD.set_font((unsigned char*) Arial12x12);
+            myLCD.printf("Failed");
+            count++;
+            if(count>=10)
+                break;
+            wait(0.1);
+        }
+        wait_ms(2);
+        radio.startListening();
+        wait_ms(1);
+
+
+    }
+}
+
+void rf_decode(char *c)
+{
+    string s[10];
+    c[19]='\n';
+
+    int s_count=0;
+    for(int i=0; i<20; i++) {
+        if(c[i]=='\n')
+            break;
+        if(c[i]==',') {
+            s_count++;
+            continue;
+        }
+        s[s_count]+=c[i];
+    }
+    if(s[0]!="NEO")
+        return;
+    char send_cli[20];
+    sprintf(send_cli,"%s,%s,%s,%s,%s\n",s[0].c_str(),s[1].c_str(),s[2].c_str(),s[3].c_str(),"1");
+    if(client.is_connected()==true) {
+        client.send(send_cli,strlen(send_cli));
+    }
+
+    if(s[1]=="2") {
+
+        if(pos[0]==1) {
+            myLCD.set_font((unsigned char*) Arial28x28);
+            myLCD.locate(86,100);
+            if(atoi(s[2].c_str())<100)
+                myLCD.printf("0%s",s[2].c_str());
+            else
+                myLCD.printf("%s",s[2].c_str());
+        }
+    } else if(s[1]=="3") {
+        if(pos[2]==1) {
+            if(s[2]=="1") {
+                myLCD.BMP_16(10,245,"/sd/gui/d_open.bmp");
+                if(cam_sel==1)
+                    take_picture();
+            } else
+                myLCD.BMP_16(10,245,"/sd/gui/d_close.bmp");
+        }
+    }
+
+}
+
+
+void init_internet()
+{
+    network.init("192.168.0.100","255.255.255.0","192.168.0.254"); //Use DHCP
+    network.connect();
+    myLCD.fillrect(2,62,317,78,Black);
+    myLCD.locate(4,65);
+    myLCD.set_font((unsigned char*) Arial12x12);
+    myLCD.printf("IP Address is %s\n", network.getIPAddress());
+
+}
+
+void init_fs()
+{
+    char indexPage[256];
+    sprintf(indexPage,"<HTML><HEAD><META content=\"text/html\" http-equiv=Content-Type><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" /> </HEAD><BODY><img src=\"abc10.jpg\" alt=\"Smiley face\" height=\"480\" width=\"320\"></BODY></HTML>\r\n\r\n");
+    FILE *fp;
+    fp = fopen("/sd/index.htm", "w");
+    fwrite(indexPage, sizeof(char), strlen(indexPage), fp);
+    fclose(fp);
+}
+
+
+
+
+void init_m_connect()
+{
+    if(rf_server.bind(10101)<0) {
+        myLCD.fillrect(2,62,317,78,Black);
+        myLCD.locate(4,65);
+        myLCD.set_font((unsigned char*) Arial12x12);
+        myLCD.printf("Error in RF Server%s\n", network.getIPAddress());
+        while(1);
+    }
+    if(rf_server.listen(1)<0) {
+        myLCD.fillrect(2,62,317,78,Black);
+        myLCD.locate(4,65);
+        myLCD.set_font((unsigned char*) Arial12x12);
+        myLCD.printf("Failed to listen", network.getIPAddress());
+        while(1);
+    }
+    rf_server.set_blocking(false,100);
+
+}
+
+void poll_rfserver()
+{
+    char a_buf[256];
+    if(client.is_connected()==false) {
+        led3=0;
+        if(rf_server.accept(client)<0) {
+            return;
+        }
+    } else {
+
+        int len=0;
+        led3=1;
+        client.set_blocking(false,100);
+        if((len=client.receive(a_buf,256))>0) {
+            a_buf[len+1]='\0';
+            a_buf[len]='\n';
+
+            myLCD.fillrect(2,62,317,78,Black);
+            myLCD.locate(4,65);
+            myLCD.set_font((unsigned char*) Arial12x12);
+            myLCD.printf("Received from client %s", a_buf);
+            cli_decode(a_buf);
+        }
+    }
+
+}
+
+
+int main()
+{
+    uart.baud (115200);
+    Init_lcd_touch();
+    init_gui();
+    pos[0]=pos[1]=pos[2]=pos[3]=0;
+    init_radio();
+    init_camera();
+    init_internet();
+    init_fs();
+    HTTPFsRequestHandler::mount("/sd/", "/");
+    svr.addHandler<HTTPFsRequestHandler>("/");
+    if (!svr.start(80,&network)) {
+        myLCD.fillrect(2,62,317,78,Black);
+        myLCD.locate(4,65);
+        myLCD.set_font((unsigned char*) Arial12x12);
+        myLCD.printf("Error in http server start", network.getIPAddress());
+        while(1);
+    }
+    init_m_connect();
+    char c[20];
+    while(1) {
+        if(network.getIPAddress()==NULL) {
+            init_internet();
+            if (!svr.start(80,&network)) {
+                myLCD.fillrect(2,62,317,78,Black);
+                myLCD.locate(4,65);
+                myLCD.set_font((unsigned char*) Arial12x12);
+                myLCD.printf("Error in http server start", network.getIPAddress());
+                while(1);
+            }
+            init_m_connect();
+
+        }
+        svr.poll();
+        poll_rfserver();
+        if(get_xy()==1) {
+            navigate(TP.display.x,TP.display.y);
+        }
+        if(radio.available()) {
+            while(radio.available()) {
+                radio.read(&c,20);
+                c[19]='\0';
+                if(in_pic!=1) {
+                    myLCD.fillrect(2,62,317,78,Black);
+                    myLCD.locate(4,65);
+                    myLCD.set_font((unsigned char*) Arial12x12);
+                    myLCD.printf("Reading %s",c);
+                }
+                rf_decode(c);
+            }
+        }
+        temp_count++;
+        if(temp_count>=10) {
+            temp_count=0;
+            char c[20];
+            float tem=temp.read()*3.3*100;
+            sprintf(c,"NEO,5,%2.0f,0,1\n",tem);
+            if(client.is_connected()==true) {
+                client.send(c,strlen(c));
+            }
+            if(pos[0]==1 && in_pic!=1) {
+                myLCD.set_font((unsigned char*) Arial28x28);
+
+                myLCD.locate(78,194);
+                myLCD.printf("%2.0f",tem);
+                // myLCD.rect(76,188,152,225,Red);
+                myLCD.circle(116,197,3,Red);
+                myLCD.locate(124,194);
+                myLCD.printf("C");
+                pos[0]=1;
+            }
+        }
+    }
+}
\ No newline at end of file