APC UPS monitoring program

Dependencies:   EthernetInterface NetworkAPI mbed-rtos mbed

Fork of ups_mon_141217_bumisee by jinbeom kim

Revision:
0:fb1f6d3926fe
diff -r 000000000000 -r fb1f6d3926fe main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Jan 19 02:40:27 2015 +0000
@@ -0,0 +1,387 @@
+#include "mbed.h"
+#include "rtos.h"
+#include "USBHost.h"
+#include "EthernetInterface.h"
+#include "NetworkAPI/buffer.hpp"
+#include "NetworkAPI/ip/address.hpp"
+#include "NetworkAPI/tcp/socket.hpp"
+/////////////////////////////////////////////////
+// Reset time
+// 1. TCP server connect error 5 times
+// 2. Server send '$'
+// 3. Day reset(12 or 24hours)
+// 4. Server not request 10 min
+/////////////////////////////////////////////////
+
+Serial pc(USBTX, USBRX);
+
+//DIO Setting
+
+DigitalOut MODE1(p30);
+DigitalOut MODE2(p29);
+DigitalOut SEL1(p28);
+DigitalOut SEL2(p27);
+DigitalOut USB_S(p26);
+DigitalOut TCP_S(p25);
+
+DigitalIn S100_1(p5);
+DigitalIn S100_2(p6);
+DigitalIn S100_4(p7);
+DigitalIn S100_8(p8);
+DigitalIn S10_1(p9);
+DigitalIn S10_2(p10);
+DigitalIn S10_4(p11);
+DigitalIn S10_8(p12);
+DigitalIn S1_1(p13);
+DigitalIn S1_2(p14);
+DigitalIn S1_4(p15);
+DigitalIn S1_8(p16);
+
+DigitalIn MODE_S(p17);
+DigitalIn SEL_S(p18);
+DigitalIn SET_S(p19);
+
+network::tcp::Socket socket;
+network::Buffer buffer(256);
+EthernetInterface interface;
+int u_flag,u_r_done,u_r_done_buf;
+int ups_connect_state,tcp_connect_state;
+int ups_state,ups_time,ups_capacity;
+u8 u_data[256];
+u8 u_buffer[256];
+char u_temp[256];
+char l_temp[256];
+int ms_count=0;
+int m_count=0;
+int day_reset_flag=0;
+int rq_reset_flag=2;
+
+extern "C" void mbed_reset();
+int event_state = 0;
+int d_reset[3]={0,12,24};
+int r_reset[3]={0,5,10};
+int server_rq_count;
+void display_ups_state(void);
+//TCP thread
+void TCP_thread(void const *args)
+{
+    tcp_connect_state = TCP_DISCONNECT;
+    server_rq_count=0;
+    printf(">TCP thread start\r\n");
+    int result;
+    int rc_count=0;
+    int id=21;
+    char ip[15];
+    std::string request("@");
+    
+    
+    //IP SET
+    id = (100*((S100_1*1)+(S100_2*2)))+(10*((S10_1*1)+(S10_2*2)+(S10_4*4)+(S10_8*8)))+((S1_1*1)+(S1_2*2)+(S1_4*4)+(S1_8*8));
+    snprintf(ip,sizeof(ip),"192.168.205.%d",id);
+    interface.init((char *)ip,"255.255.0.0","192.168.1.1");
+    //Ether set    
+    interface.connect();
+    printf("IP Address is %s\n\r", interface.getIPAddress());
+        
+    //Socket open
+    if(socket.open() < 0) {
+        printf("Failed to open TCP Socket\n\r");
+        
+    }
+    //Socket connect - 5 time retry and reset
+    do{
+        if( (result = socket.connect("192.168.200.11", 7900))< 0){ 
+            if(rc_count>=5)
+                mbed_reset();
+          
+            printf("Failed to connect with Server(%d)\n\r",result);
+            rc_count++;
+        }
+        
+        
+    }    
+    while(result<0);
+    tcp_connect_state = TCP_CONNECT;
+    TCP_S = 1;
+    
+    //Send Connection message to server
+    if (socket.write((void *)request.data(), request.size()) < 0) {
+        printf("Failed to write request\n\r");
+        
+    }
+    
+    //Recieve Loop
+    do
+    {
+        result = socket.read(buffer);
+        strcpy((char *)u_buffer, (char *)buffer.data());
+        
+        printf("Received %d bytes:\n\r%s\n\r", result, (char *)buffer.data());
+        //Data request
+        if(u_buffer[0] == '!'){
+                   
+            
+            socket.write((void *)u_temp, sizeof(u_temp));
+        }
+        //reset
+        else if(u_buffer[0] == '$'){
+            printf("Reset bye bye!!\r\n");
+            Thread::wait(1000);
+            mbed_reset();
+        }
+        server_rq_count=0;
+    } while(result > 0);
+    
+    socket.close();
+    
+    
+}
+
+//Time&Event thread
+void Event_thread(void const *args)
+{
+    printf(">Event thread start\r\n");
+    int push_count = 0;
+    string menu[3]={"OFF","ON 12H","ON 24H"};
+    string r_menu[3]={"OFF","ON 5min","ON 10min"};
+ 
+    
+    while(1){
+    //Nomal state    
+        if(event_state == 0){
+            //Day setting 
+            if(MODE_S){
+                while(MODE_S){
+                   push_count++;
+                   if(push_count > 20){
+                     event_state = 1;
+                     if(day_reset_flag == 1){
+                         MODE1 = 1;
+                         MODE2 = 0;
+                         SEL1 = 1;
+                         SEL2 = 0;
+                     }
+                    else if(day_reset_flag == 2){
+                         MODE1 = 1;
+                         MODE2 = 0;
+                        SEL1 = 0;
+                        SEL2 = 1;
+                    }
+                    else{
+                        MODE1 = 1;
+                        MODE2 = 0;
+                        SEL1 = 0;
+                        SEL2 = 0;
+                    }
+                    while(MODE_S);
+                         break;
+                    }
+                    
+                    Thread::wait(100);
+                }
+                
+                push_count=0;
+            }
+            
+            else if(ms_count >60000)
+                ms_count=0;
+            //ups data get
+            else if((ups_connect_state==UPS_CONNECT)&&(ms_count%50==0)){
+                //Min count
+                if(ms_count%600==0){
+                    m_count++;
+                    server_rq_count++;
+                    //reset
+                    if(((m_count >= 60*d_reset[day_reset_flag])&&(day_reset_flag>0))||((server_rq_count>=r_reset[rq_reset_flag])&&(rq_reset_flag>0))){
+                        printf("Reset bye bye!!\r\n");
+                        
+                        Thread::wait(1000);
+                        mbed_reset();
+                    }
+                    
+                    
+                        
+                }
+                printf(">Push %d %d\r\n",ms_count,m_count);
+                
+                u_flag = 1;
+                            
+            }
+            
+        }
+        //day reset setting state
+        else if(event_state == 1){
+             if(day_reset_flag == 1){
+                 MODE1 = 1;
+                 MODE2 = 0;
+                 SEL1 = 1;
+                 SEL2 = 0;
+             }
+             else if(day_reset_flag == 2){
+                 MODE1 = 1;
+                 MODE2 = 0;
+                 SEL1 = 0;
+                 SEL2 = 1;
+            }
+            else{
+                 MODE1 = 1;
+                 MODE2 = 0;
+                 SEL1 = 0;
+                 SEL2 = 0;
+            }    
+            
+            if(MODE_S){
+                while(MODE_S);
+                   event_state = 2;
+            }
+                        
+            
+            else if(SEL_S){
+                while(SEL_S);
+                day_reset_flag++;
+                if(day_reset_flag>2)
+                    day_reset_flag =0;
+            }
+            //Day reset set
+            else if(SET_S){
+                while(SET_S);
+                event_state = 0;
+                MODE1 = 0;
+                MODE2 = 0;
+                SEL1 = 0;
+                SEL2 = 0;
+                
+                display_ups_state();
+            }
+       }
+       //TCP reset setting
+       else if(event_state==2){
+            for(int i=0;i<3;i++){
+                if(rq_reset_flag == 1){
+                    MODE1 = 0;
+                    MODE2 = 1;
+                    SEL1 = 1;
+                    SEL2 = 0;
+                }
+                else if(rq_reset_flag == 2){
+                    MODE1 = 0;
+                    MODE2 = 1;
+                    SEL1 = 0;
+                    SEL2 = 1;
+                }
+                else{
+                    MODE1 = 0;
+                    MODE2 = 1;
+                    SEL1 = 0;
+                    SEL2 = 0;
+                }
+                
+            }
+            if(SEL_S){
+                while(SEL_S);
+                rq_reset_flag++;
+                if(rq_reset_flag>2)
+                    rq_reset_flag =0;
+            }
+            //Day reset set
+            else if(SET_S){
+                while(SET_S);
+                event_state = 0;
+                MODE1 = 0;
+                MODE2 = 0;
+                SEL1 = 0;
+                SEL2 = 0;
+                display_ups_state(); 
+            }
+        }
+        
+            ms_count++;
+            Thread::wait(95);
+    }
+}
+void display_ups_state(void)
+{
+    if(ups_connect_state == UPS_CONNECT)
+        USB_S = 1;
+    else
+        USB_S = 0;
+                    
+    if(tcp_connect_state == TCP_CONNECT)
+        TCP_S = 1;
+    else
+        TCP_S = 0;
+    switch(u_data[0])
+    { 
+        case(8): { ups_state = ALLOFF;printf("[All Off]hx%02X",u_data[0]); snprintf(l_temp,sizeof(l_temp),"[All Off] %d%% %dsec \n",ups_capacity,ups_time);break;}
+        case(10): { ups_state = BATTERY;printf("[Battery]hx%02X",u_data[0]); snprintf(l_temp,sizeof(l_temp),"[Battery] %d%% %dsec \n",ups_capacity,ups_time);break;}
+        case(12): { ups_state = ONLINE;printf("[Online]hx%02X",u_data[0]); snprintf(l_temp,sizeof(l_temp),"[Online] %d%% %dsec \n",ups_capacity,ups_time);break;}
+        case(13): { ups_state = ONLINE;printf("[Online]hx%02X",u_data[0]); snprintf(l_temp,sizeof(l_temp),"[Online] %d%% %dsec \n",ups_capacity,ups_time);break;}
+        case(14): { ups_state = ONLINE;printf("[Online]hx%02X",u_data[0]); snprintf(l_temp,sizeof(l_temp),"[Online] %d%% %dsec \n",ups_capacity,ups_time);break;}
+        default: {snprintf(l_temp,sizeof(l_temp),"?????");};
+    } 
+    
+    if(day_reset_flag>0){
+        SEL1=1;
+        SEL2=1;
+    }
+    else{
+        SEL1=0;
+        SEL2=0;
+    }
+        
+}
+
+int main(void)
+{
+    Serial pc(USBTX, USBRX);
+    pc.baud(460800);
+    u_r_done = 0;
+    std::string u_sdata;
+    wait(3);
+    
+    
+    printf("\r\n==== mbed program start ====\r\n");
+    display_ups_state();
+    //Thread start
+    Thread th_console_out1(TCP_thread);
+    wait(0.5);
+    Thread th_console_out2(Event_thread);
+    wait(0.5);
+    printf(">USB Host start\r\n");
+    snprintf(u_temp,sizeof(u_temp),"!,%d,%d,%d,%d# \n",ups_connect_state,ups_state,ups_capacity,ups_time);
+    USBInit();
+    std::string request("TEST\r\n\r\n");
+    //USB Loop
+    for (;;){
+     u_r_done = USBLoop(u_flag,u_data);
+        //Get report
+        if(u_r_done==UPS_REPORT){
+            u_r_done_buf = u_r_done;
+            ups_capacity = u_data[1];
+            ups_time = u_data[2]+u_data[3]*256;
+           
+            printf("  [Battery Capacity : %d]hx%02X",u_data[1],u_data[1]);
+            printf("  [Battery Time : %d]hx%02X hx%02X",(u_data[2]+u_data[3]*256),u_data[2],u_data[3]);         
+            printf("\n"); 
+            snprintf(u_temp,sizeof(u_temp),"!,%d,%d,%d,%d# \n",ups_connect_state,ups_state,ups_capacity,ups_time);
+            display_ups_state();
+            u_flag = 0;
+        }
+        
+        else if(u_r_done==UPS_CONNECT){
+            ups_connect_state = UPS_CONNECT;
+            USB_S = 1;
+            
+        }
+        else if(u_r_done==UPS_DISCONNECT){
+            ups_connect_state = UPS_DISCONNECT;
+            USB_S = 1;
+            
+        }
+     }
+        
+    printf("=== mbed program end ====\r\n");
+    exit(1);
+}
+
+