Depot Pertamina / Mbed 2 deprecated Gate_FRDM

Dependencies:   EthernetInterface MbedJSONValue SDFileSystem mbed-rtos mbed

Fork of Gate_Aidik_FRDM_v2 by Depot Pertamina

Revision:
2:e870bcd7e63b
Parent:
0:fbb75122015f
--- a/main.cpp	Mon Aug 22 09:27:26 2016 +0000
+++ b/main.cpp	Thu Oct 20 03:42:29 2016 +0000
@@ -1,7 +1,10 @@
 #include "mbed.h"
 #include "EthernetInterface.h"
 #include "SDFileSystem.h"
-#include <string>
+#include "MbedJSONValue.h"
+#include <sstream>
+#include <iostream>
+#include <fstream>
 
 #define IP_CONF_PORT 50004
 
@@ -20,17 +23,15 @@
 Serial dbg(USBTX, USBRX);
 Serial pc(PTC17, PTC16);
 
-char IP[16], SUBNET[16], GATEWAY[16], MCAST[16];
-char PortListen[6], PortSend[6], PortHeartB[6];
-char IDX[4];
-char Baud[6];
+char IP[16], SUBNET[16], GATEWAY[16], MCAST[16], IDX[5];
+int PortListen, PortSend, PortHeartB;
 int BAUD = 19200;
 
 int width, TICK = 0;
 unsigned char ID[8], idx, idy, id_addr = 0x33, ix, er_tmp1 = 0, er_tmp2 = 0,
         sprmt = 0; // state = 1,
 char text[26], ch, rx_buff[6], tx_buff[7],  //86
-        hex[17] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B',
+        _hex[17] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B',
                 'C', 'D', 'E', 'F' };  //,
 
 /*Contoh format data
@@ -52,7 +53,7 @@
  1, idle
  2, stdby/ idle
  3, merah/sopir
- 4, bitu/ MT
+ 4, biru/ MT
  5, buka gate
 
  format ipconfig
@@ -149,78 +150,90 @@
         break;
     }
 }
-void mbed_config_init() {
-    char chr[256];
-    int ilx = 0;
-    unsigned char n = 0, x = 0;
-    FILE *fp = fopen("/sd/IPCONF.TXT", "r");
-    if (fp == NULL)
-        dbg.printf("Error opening file");
-    else {
-        //dbg.printf("File Exist!\r\n");
-        do {
-            ilx++;
-            chr[ilx] = fgetc(fp);
-            //dbg.printf("%c",chr[ilx]);
-        } while (chr[ilx] != '$');
-        fclose(fp);
+
+string open_file(const char *location)
+{
+    string rtn = "\0";
+    
+//    dbg.printf("OPEN FILE %s\r\n", location);
+    ifstream stream(location, std::ifstream::binary);
+    
+    if ( !stream.is_open() ) {
+        dbg.printf("File Opening Error\n\r");
+        stream.close();
+    }
+    else
+    {
+        stream.seekg(0,stream.end);
+        int len = stream.tellg();
+        stream.seekg(0,stream.beg);
+        
+        char *_stream = new char [len];
+        
+        stream.read(_stream,len);
+        _stream[len] = '\0';
+        
+        rtn += _stream;
+        stream.close();
+        delete [] _stream;
     }
-    ilx = 1;
-    do {
-        if (chr[ilx] == '#') {
-            ilx = ilx + 1;
-            n = 1;
-            dbg.printf("Start file\r\n");
-        } else if (chr[ilx] == ',') {
-            n++;
-            x = 0;
-            ilx = ilx + 2;
+    
+    return rtn;
+}
+
+bool mbed_config_init()
+{
+    dbg.printf("Masuk mbed config init\r\n");
+    
+    MbedJSONValue config_json;
+    string dataSet = open_file("/sd/IPCONF.TXT");
+    dbg.printf("isi file :\r\n%s\r\n", dataSet.c_str());
+    
+    if(dataSet.size() > 1)
+    {
+        string err;
+        parse(config_json, dataSet.c_str(), dataSet.c_str() + strlen(dataSet.c_str()), &err);
+        if(err.size() > 0)
+        {
+            dbg.printf("res error? %s\r\n", err.c_str());
+            return false;
+        }   
+        else
+        {
+            const char *ip_temp      = config_json["IP"].get<string>().c_str();
+            const char *sub_temp     = config_json["SUBNET"].get<string>().c_str();
+            const char *gate_temp    = config_json["GATEWAY"].get<string>().c_str();
+            const char *mcast_temp   = config_json["MCAST"].get<string>().c_str();
+            const char *idx_temp     = config_json["IDX"].get<string>().c_str();
+            PortListen  = config_json["PortListen"].get<int>();
+            PortSend    = config_json["PortSend"].get<int>();
+            PortHeartB   = config_json["PortHeartBit"].get<int>();
+            BAUD        = config_json["BAUD"].get<int>();
+            
+            sprintf(IP,"%s", ip_temp);
+            sprintf(SUBNET, "%s", sub_temp);
+            sprintf(GATEWAY, "%s", gate_temp);
+            sprintf(MCAST, "%s", mcast_temp);
+            sprintf(IDX, "%s", idx_temp);
+            
+            dbg.printf("IP Device         = %s\r\n", IP);
+            dbg.printf("Subnet            = %s\r\n", SUBNET);
+            dbg.printf("Gateway           = %s\r\n", GATEWAY);
+            dbg.printf("Multicast IP      = %s\r\n", MCAST);
+            dbg.printf("Server to mBed    = %d\r\n", PortListen);
+            dbg.printf("mBed to Multicast = %d\r\n", PortSend);
+            dbg.printf("HeartBeat Port    = %d\r\n", PortHeartB);
+            dbg.printf("device IDX        = %s\r\n", IDX);
+            dbg.printf("Serial Baudrate   = %d\r\n", BAUD);
+            
+            return true;
         }
-        switch (n) {
-        case 0:
-            break;
-        case 1:
-            IP[x] = chr[ilx];
-            break;
-        case 2:
-            SUBNET[x] = chr[ilx];
-            break;
-        case 3:
-            GATEWAY[x] = chr[ilx];
-            break;
-        case 4:
-            MCAST[x] = chr[ilx];
-            break;
-        case 5:
-            PortListen[x] = chr[ilx];
-            break;
-        case 6:
-            PortSend[x] = chr[ilx];
-            break;
-        case 7:
-            PortHeartB[x] = chr[ilx];
-            break;
-        case 8:
-            IDX[x] = chr[ilx];
-            break;
-        case 9:
-            Baud[x] = chr[ilx];
-            break;
-        }
-        x++;
-        ilx++;
-    } while (chr[ilx] != '$');
-
-    dbg.printf("IP Device         = %s\r\n", IP);
-    dbg.printf("Subnet            = %s\r\n", SUBNET);
-    dbg.printf("Gateway           = %s\r\n", GATEWAY);
-    dbg.printf("Multicast IP      = %s\r\n", MCAST);
-    dbg.printf("Server to mBed    = %s\r\n", PortListen);
-    dbg.printf("mBed to Multicast = %s\r\n", PortSend);
-    dbg.printf("HeartBeat Port    = %s\r\n", PortHeartB);
-    dbg.printf("device IDX        = %s\r\n", IDX);
-    dbg.printf("Serial Baudrate   = %s\r\n", Baud);
-    BAUD = atoi(Baud);
+    }
+    else
+    {
+        dbg.printf("Config is not found\r\n");
+        return false;
+    }
 }
 
 unsigned char reset(void) {
@@ -288,11 +301,11 @@
     }
 
     for (idx = 0; idx < 8; idx++) {
-        text[((7 - idx) * 2) + 7] = hex[ID[idx] & 0x0f];
-        text[((7 - idx) * 2) + 6] = hex[(ID[idx] >> 4) & 0x0f];
+        text[((7 - idx) * 2) + 7] = _hex[ID[idx] & 0x0f];
+        text[((7 - idx) * 2) + 6] = _hex[(ID[idx] >> 4) & 0x0f];
     }
-    std::string str;
-    std::size_t found1;
+    string str;
+    size_t found1;
     str += text;
         
     found1 = str.find("FFFFFFFFFF");
@@ -326,7 +339,7 @@
     hb_buff[2] = IDX[2];
     hb_buff[3] = IDX[3];
 
-    multi.set_address(MCAST, atoi(PortHeartB));
+    multi.set_address(MCAST, PortHeartB);
     hb++;
 
     switch (std) {
@@ -396,14 +409,14 @@
             tx_buff[4] = 'P';
             tx_buff[5] = '0';
             tx_buff[6] = '0';
-            multi.set_address(MCAST, atoi(PortSend));
+            multi.set_address(MCAST, PortSend);
             sock.sendTo(multi, tx_buff, sizeof(tx_buff));
         } else if (rx_buff[1] == 'R') {
             tx_buff[4] = 'P';
             tx_buff[5] = '0';
             tx_buff[6] = '0';
             sprmt = 0;
-            multi.set_address(MCAST, atoi(PortSend));
+            multi.set_address(MCAST, PortSend);
             sock.sendTo(multi, tx_buff, sizeof(tx_buff));
             eMTy(0, 0);
             Sopir(0, 0);
@@ -415,19 +428,14 @@
     return 0;
 }
 
-void write_config(char buff[90]){
-    FILE *fp = fopen("/sd/IPCONF.TXT", "w");
-    fprintf(fp, buff);
-    fclose(fp);
-}
-
 int set_IP() {
     char ptr_data;
     //server.set_address(SERVER,ER_SEND_PORT);
     //char print_rx_buff[128];
-    char conf_buff[1024] = { 0 }, print_init[20] = { 0x1b, 0x40, 0x1b, 0x54,
-            0x1b/*,0x57*/, 0x00, 0x1b, 0x77, 0x00, 0x12, 0x1b, 0x43, 0x00, 0x06,
-            0x1b, 0x6c, 0x01, 0x12 };
+//    char conf_buff[1024] = { 0 }, print_init[20] = { 0x1b, 0x40, 0x1b, 0x54,
+//            0x1b/*,0x57*/, 0x00, 0x1b, 0x77, 0x00, 0x12, 0x1b, 0x43, 0x00, 0x06,
+//            0x1b, 0x6c, 0x01, 0x12 };
+    char conf_buff[1024] = { 0 };
     int n = ip_conf.receiveFrom(server, conf_buff, sizeof(conf_buff));
     if (n >= 0) {
         //printf("Packet from \"%s\": %s\n", server.get_address(), conf_buff);
@@ -476,19 +484,17 @@
                 //sock.close(true);
             } else if (conf_buff[1] == 'W') {
                 Sleep = 0;
-                //sock.bind(atoi(PortListen));
+                //sock.bind(PortListen);
             }
-        } else if (conf_buff[0] == '#') {
-            write_config(conf_buff);
         } else if (conf_buff[0] == 0x0f) {
-            dbg.printf("%s", print_init);
+            //dbg.printf("%s", print_init);
             pc.printf("%s", conf_buff);
             ptr_data = *strchr(conf_buff, 0x1d);
             if (ptr_data != NULL) {
                 tx_buff[4] = 'D';
                 tx_buff[5] = '0';
                 tx_buff[6] = '1';
-                multi.set_address(MCAST, atoi(PortSend));
+                multi.set_address(MCAST, PortSend);
                 sock.sendTo(multi, tx_buff, sizeof(tx_buff));
                 dbg.printf("Printer Done\r\n");
             }
@@ -517,15 +523,15 @@
 
 void Set_IP_Manual()
 {
-    sprintf(IP,"192.168.0.14");
+    sprintf(IP,"192.168.0.101");
     sprintf(SUBNET, "255.255.255.0");
     sprintf(GATEWAY, "192.168.0.1");
     sprintf(MCAST, "224.1.1.8");
-    sprintf(PortListen, "50007");
-    sprintf(PortSend, "50001");
-    sprintf(PortHeartB, "50003");
-    sprintf(IDX, "GI01");
-    BAUD = 19200;
+    PortListen = 50007;
+    PortSend = 50001;
+    PortHeartB = 50003;
+    sprintf(IDX, "GO01");
+    BAUD = 38400;
     
     dbg.printf("IP Device         = %s\r\n", IP);
     dbg.printf("Subnet            = %s\r\n", SUBNET);
@@ -540,12 +546,16 @@
 int main(void) {
     mkdir("/sd/", 0777);
     
-    mbed_config_init(); // Digunakan jika setting ip melalui micro sd
-    Set_IP_Manual(); // Digunakan jika setting ip secara manual
+    bool card_ready = mbed_config_init(); // Digunakan jika setting ip melalui micro sd
+    if(!card_ready)
+    {
+        dbg.printf("Set Config via hard code\r\n");
+        Set_IP_Manual(); // Digunakan jika setting ip secara manual
+    }
     
-    dbg.printf("\r\nPrinter Baud = %d\r\n",BAUD);
+    dbg.printf("Printer Baud = %d\r\n",BAUD);
     pc.baud(BAUD);
-    dbg.baud(BAUD);
+    dbg.baud(9600);
     dbg.printf("System Start \r\n");
 
     EthernetInterface eth;
@@ -560,7 +570,7 @@
     ip_conf.set_blocking(false, 0);
     server.set_address(MCAST, 50002);
 
-    sock.bind(atoi(PortListen));
+    sock.bind(PortListen);
 
     sock.set_blocking(false, 0);
 
@@ -584,7 +594,7 @@
     tx_buff[4] = 'R';
     tx_buff[5] = '0';
     
-    multi.set_address(MCAST, atoi(PortSend));
+    multi.set_address(MCAST, PortSend);
     sock.sendTo(multi, tx_buff, sizeof(tx_buff));
     
     eMTy(ijo, 0);
@@ -625,7 +635,7 @@
                         text[5] = 'M';
                     }
                     if (cmpstr(text, "F") < 10) {
-                        multi.set_address(MCAST, atoi(PortSend));
+                        multi.set_address(MCAST, PortSend);
                         sock.sendTo(multi, text, sizeof(text));
                         sndrcv = 1;
                     }
@@ -645,7 +655,7 @@
             break;
         }
         case 1: {
-            sock.bind(atoi(PortListen));
+            sock.bind(PortListen);
             
             int n = sock.receiveFrom(server, rx_buff, sizeof(rx_buff));
             if (n != 0) {
@@ -658,7 +668,7 @@
                     tx_buff[4] = 'O';
                     tx_buff[5] = 'K';
                     tx_buff[6] = '!';
-                    multi.set_address(MCAST, atoi(PortSend));
+                    multi.set_address(MCAST, PortSend);
                     sock.sendTo(multi, tx_buff, sizeof(tx_buff));
                     dbg.printf("Data S Valid..\r\n");
                 } else if ((rx_buff[1] == 'A') && (rx_buff[3] == '3')) {
@@ -671,7 +681,7 @@
                     tx_buff[4] = 'O';
                     tx_buff[5] = 'K';
                     tx_buff[6] = '!';
-                    multi.set_address(MCAST, atoi(PortSend));
+                    multi.set_address(MCAST, PortSend);
                     sock.sendTo(multi, tx_buff, sizeof(tx_buff));
                     dbg.printf("Data S Not Valid, but M valid, reset!!!!\r\n");
                 } else if ((rx_buff[1] == 'V') && (rx_buff[3] == '4')) {
@@ -686,7 +696,7 @@
                     tx_buff[4] = 'O';
                     tx_buff[5] = 'K';
                     tx_buff[6] = '!';
-                    multi.set_address(MCAST, atoi(PortSend));
+                    multi.set_address(MCAST, PortSend);
                     sock.sendTo(multi, tx_buff, sizeof(tx_buff));
                     dbg.printf("Data M Valid..\r\n");
                 } else if ((rx_buff[1] == 'A') && (rx_buff[3] == '4')) {
@@ -700,7 +710,7 @@
                     tx_buff[4] = 'O';
                     tx_buff[5] = 'K';
                     tx_buff[6] = '!';
-                    multi.set_address(MCAST, atoi(PortSend));
+                    multi.set_address(MCAST, PortSend);
                     sock.sendTo(multi, tx_buff, sizeof(tx_buff));
                     dbg.printf("Data M Not Valid, refresh!!!!\r\n");
                 } else if (rx_buff[1] == 'R') {
@@ -711,7 +721,7 @@
                     tx_buff[4] = 'O';
                     tx_buff[5] = 'K';
                     tx_buff[6] = '!';
-                    multi.set_address(MCAST, atoi(PortSend));
+                    multi.set_address(MCAST, PortSend);
                     sock.sendTo(multi, tx_buff, sizeof(tx_buff));
                     dbg.printf("All Data Not Valid, reset!!!!\r\n");
                 }
@@ -738,7 +748,7 @@
                 tx_buff[4] = 'X';
                 tx_buff[5] = '0';
                 tx_buff[6] = '1';
-                multi.set_address(MCAST, atoi(PortSend));
+                multi.set_address(MCAST, PortSend);
                 dbg.printf("Printer Error\r\n");
                 sock.sendTo(multi, tx_buff, sizeof(tx_buff));
             } else
@@ -751,7 +761,7 @@
                 tx_buff[5] = '0';
                 tx_buff[6] = '1';
                 dbg.printf("Printer Fixed\r\n");
-                multi.set_address(MCAST, atoi(PortSend));
+                multi.set_address(MCAST, PortSend);
                 sock.sendTo(multi, tx_buff, sizeof(tx_buff));
             } else
                 er_tmp2 = 5;