traffic light controller with RPC over http interrupter

Dependencies:   EthernetInterface HTTPClient HTTPServer mbed-rpc mbed-rtos mbed

main.cpp

Committer:
daklowprofile
Date:
2018-07-16
Revision:
0:36fbb19fb8fb
Child:
1:2c577df21639

File content as of revision 0:36fbb19fb8fb:

#include "mbed.h"
#include "EthernetInterface.h"
#include "HTTPServer.h"
#include "HTTPClient.h"
#include "mbed_rpc.h"

Timer timer_tf;

Serial pc(USBTX, USBRX);

DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);

//DigitalIn button1(p14);
//DigitalIn button2(p27);
//DigitalIn button3(p28);

RpcDigitalOut button1(LED1,"button1");
RpcDigitalOut button2(LED2,"button2");
RpcDigitalOut button3(LED3,"button3");

//T1
DigitalOut t1red(p5);
DigitalOut t1yellow(p6);
DigitalOut t1green(p7);
//T2
DigitalOut t2red(p11);
DigitalOut t2yellow(p12);
DigitalOut t2green(p13);
//T3
DigitalOut t3red(p18);
DigitalOut t3yellow(p19);
DigitalOut t3green(p17);
//pin 20 cannot use for led

void t1light(char a){
        t1red = 0;
        t1yellow = 0;
        t1green = 0;    
    if (a == 'R'){
        t1red = 1;
        t1yellow = 0;
        t1green = 0;
    }else if(a == 'Y'){
        t1red = 0;
        t1yellow = 1;
        t1green = 0;
    }else if(a == 'G'){
        t1red = 0;
        t1yellow = 0;                                                 
        t1green = 1;
    }else{
        t1red = 0;
        t1yellow = 0;
        t1green = 0;    
    } 
}

void t2light(char a){
        t2red = 0;
        t2yellow = 0;
        t2green = 0;    
    if (a == 'R'){
        t2red = 1;
        t2yellow = 0;
        t2green = 0;
    }else if(a == 'Y'){
        t2red = 0;
        t2yellow = 1;
        t2green = 0;
    }else if(a == 'G'){
        t2red = 0;
        t2yellow = 0;
        t2green = 1;
    }else{
        t2red = 0;
        t2yellow = 0;
        t2green = 0;    
    } 
}

void t3light(char a){
        t3red = 0;
        t3yellow = 0;
        t3green = 0;        
    if (a == 'R'){
        t3red = 1;
        t3yellow = 0;
        t3green = 0;
    }else if(a == 'Y'){
        t3red = 0;
        t3yellow = 1;
        t3green = 0;
    }else if(a == 'G'){
        t3red = 0;
        t3yellow = 0;
        t3green = 1;
    }else{
        t3red = 0;
        t3yellow = 0;
        t3green = 0;    
    } 
}

void traffic_timer (char t1, char t2, char t3){
    t1light(t1);
    t2light(t2);
    t3light(t3);
    }


void http_get(){
    char* Server = "http://192.168.1.111/PDRM/api/api_update.php";
    char buffer[256];
    HTTPClient http;
    buffer[0] = 0;
    sprintf(buffer,"%s?t1=%d,%d,%d&t2=%d,%d,%d&t3=%d,%d,%d",Server,t1red.read(),t1yellow.read(),t1green.read(),t2red.read(),t2yellow.read(),t2green.read(),t3red.read(),t3yellow.read(),t3green.read());
    printf("Send to %s\r\n", buffer);
    http.get(buffer, buffer , 10); // Execute the URL of urlBuffer
}

void traffic_interrupt (char t1, char t2, char t3, int time){
    t1light(t1);
    t2light(t2);
    t3light(t3);
    http_get();
    wait(time);  
    }  

void interrupt(int buffer){ 
    switch(buffer){
        case 1 :
        timer_tf.stop();
        if(timer_tf.read() >= 0 && timer_tf.read() <= 51){
        wait(15);
        }else if(timer_tf.read() >= 52 && timer_tf.read() <= 90){
        traffic_interrupt('R','Y','R',3);
        traffic_interrupt('G','R','R',15);
        traffic_interrupt('Y','R','R',3);
        }else if(timer_tf.read() >= 91 && timer_tf.read() <= 94){
        wait(3);
        traffic_interrupt('G','R','R',15);
        traffic_interrupt('Y','R','R',3);
        }else if(timer_tf.read() >= 95 && timer_tf.read() <= 165){
        traffic_interrupt('R','R','Y',3);
        traffic_interrupt('G','R','R',15);    
        traffic_interrupt('Y','R','R',3);    
        }else if(timer_tf.read() >= 166 && timer_tf.read() <= 169){
        wait(3);
        traffic_interrupt('G','R','R',15);
        traffic_interrupt('Y','R','R',3);
        }
        timer_tf.start();   
        break;
          
        case 2 :
        timer_tf.stop();
        if(timer_tf.read() >= 0 && timer_tf.read() <= 47){
        traffic_interrupt('Y','R','R',3);
        traffic_interrupt('R','G','R',15);
        traffic_interrupt('R','Y','R',3);
        }else if(timer_tf.read() >= 48 && timer_tf.read() <= 51){
        wait(3);
        traffic_interrupt('R','G','R',15);
        traffic_interrupt('R','Y','R',3);
        }else if(timer_tf.read() >= 52 && timer_tf.read() <= 94){
        wait(15);
        }else if(timer_tf.read() >= 95 && timer_tf.read() <= 165){
        traffic_interrupt('R','R','Y',3);
        traffic_interrupt('R','G','R',15);
        traffic_interrupt('R','Y','R',3);
        }else if(timer_tf.read() >= 166 && timer_tf.read() <= 169){
        wait(3);
        traffic_interrupt('R','G','R',15);
        traffic_interrupt('R','Y','R',3);
        }    
        timer_tf.start();          
        break;
        
        case 3 :
        timer_tf.stop();
        if(timer_tf.read() >= 0 && timer_tf.read() <= 47){
        traffic_interrupt('Y','R','R',3);
        traffic_interrupt('R','R','G',15);
        traffic_interrupt('R','R','Y',3);
        }else if(timer_tf.read() >= 48 && timer_tf.read() <= 51){
        wait(3);
        traffic_interrupt('R','R','G',15);
        traffic_interrupt('R','R','Y',3);
        }else if(timer_tf.read() >= 52 && timer_tf.read() <= 90){
        traffic_interrupt('R','Y','R',3);
        traffic_interrupt('R','R','G',15);
        traffic_interrupt('R','R','Y',3);
        }else if(timer_tf.read() >= 91 && timer_tf.read() <= 94){
        wait(3);
        traffic_interrupt('R','R','G',15);
        traffic_interrupt('R','R','Y',3);
        }else if(timer_tf.read() >= 95 && timer_tf.read() <= 169){
        wait(15);
        }
        timer_tf.start();
        break;
        }
   
   }

//post when changed
int t1red_o,t1yellow_o,t1green_o,t2red_o,t2yellow_o,t2green_o,t3red_o,t3yellow_o,t3green_o = 0;
void change(int t1red_n, int t1yellow_n,int t1green_n, int t2red_n, int t2yellow_n, int t2green_n, int t3red_n, int t3yellow_n, int t3green_n){ 
    
    if(t1red_o != t1red_n || t1yellow_o != t1yellow_n || t1green_o != t1green_n || t2red_o != t2red_n || t2yellow_o != t2yellow_n || t2green_o != t2green_n || t3red_o != t3red_n || t3yellow_o != t3yellow_n || t3green_o != t3green_n){
    http_get();
    t1red_o = t1red_n;   
    t1yellow_o = t1yellow_n;   
    t1green_o = t1green_n;   
    t2red_o = t2red_n;   
    t2yellow_o = t2yellow_n;   
    t2green_o = t2green_n;   
    t3red_o = t3red_n;   
    t3yellow_o = t3yellow_n;   
    t3green_o = t3green_n;   
    }else{}
}


void normal_traffic(){
    if(timer_tf.read() >= 0 && timer_tf.read() <= 47){
    traffic_timer('G','R','R');
    }else if(timer_tf.read() >= 48 && timer_tf.read() <= 51){
    traffic_timer('Y','R','R');
    }else if(timer_tf.read() >= 52 && timer_tf.read() <= 90){
    traffic_timer('R','G','R');
    }else if(timer_tf.read() >= 91 && timer_tf.read() <= 94){
    traffic_timer('R','Y','R');
    }else if(timer_tf.read() >= 95 && timer_tf.read() <= 165){
    traffic_timer('R','R','G');
    }else if(timer_tf.read() >= 166 && timer_tf.read() <= 169){
    traffic_timer('R','R','Y');
    }else if(timer_tf.read() >= 170){
    timer_tf.reset();
    }
    
    if(button1.read()==1){
        interrupt(1);
        button1.write(0);
    }else if(button2.read()==1){
        interrupt(2);
        button2.write(0);
    }else if(button3.read()==1){
        interrupt(3);
        button3.write(0);
    }
    change(t1red.read(),t1yellow.read(),t1green.read(),t2red.read(),t2yellow.read(),t2green.read(),t3red.read(),t3yellow.read(),t3green.read());

}


int main() {
    EthernetInterface eth;  
    HTTPServer svr;
    
    button1.write(0);
    button2.write(0);        
    button3.write(0);
     
    RPC::add_rpc_class<RpcDigitalOut>();
       
    printf("Setting up...\r\n");
    eth.init(); 
    int ethErr = eth.connect();
    if(ethErr < 0)
    {
        printf("Error %d in setup.\r\n", ethErr);
        return -1;
    }
  
      svr.addHandler<HTTPRpcRequestHandler>("/rpc");
        
      //attach server to port 80
      svr.start(80, &eth);
  
      printf("Listening...\n");  
      
    //Listen indefinitely
    Timer tm;
    tm.start();     
    timer_tf.start(); 
      
  while(1)
  {
    //while(button1.read()==0&&button2.read()==0&&button3.read()==0){
    normal_traffic();
    //}
    //wait(20);
    svr.poll();
    if(tm.read()>.5)
    {
      tm.start();
    }

    
    
  }
  
}