LAN(Wi-Fi) air controller through the Internet. Also you can use TANK. See:http://wizard.nestegg.jp/lanir.html

Dependencies:   EthernetNetIf mbed HTTPServer

main.cpp

Committer:
halfpitch
Date:
2011-08-01
Revision:
0:6f9648f5eaab

File content as of revision 0:6f9648f5eaab:

//////////////////////////////////////////////////////////
//Nest Egg Inc.                                         //
//Wi-Fi TANK with Air conditioner                       //
//                                                      //
//SD card module must be Normal chip select mode.       //
//Do not use wwChipSelect.cpp & wwChipSelect.h          //
//White Wizard Chip Select setting must be              //
//invalidated.                                          //
//////////////////////////////////////////////////////////

#include "mbed.h"
#include "EthernetNetIf.h"
#include "HTTPServer.h"
#include "RPCFunction.h"

#include "string.h"
#include "stdio.h"

//SD-----------------------
#include "SDFileSystem.h"

//semaphore----------------
#include "Semaphore.h"

#define SDch        0x05
#define MAXdatanum  500
#define TimeLimit   3000
#define pul38khz       26
#define pul38k_ON      13
#define pul38k_OFF     26

#define test 1

//semaphore----------------
Semaphore sem;
volatile char shared_resource = 'a';   // This is a shared resource for example.
#define LOCK() sem.try_enter()
#define UNLOCK() sem.release()

//prototype
void send_pulse(int, int);

SDFileSystem sd(p5, p6, p7, p8, "sd");
//-------------------------

//IR-----------------------
PwmOut Pulse_pin(p25);
//-------------------------

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

DigitalOut motor1(p21);
DigitalOut motor2(p22);
DigitalOut motor3(p23);
DigitalOut motor4(p24);

AnalogIn ad19(p19);
AnalogIn ad20(p20);

#if 1
/*
 * Use DHCP
 */
        EthernetNetIf ethif;
#else
/*
 * Use "static IP address" (Parameters:IP, Subnet mask, Gateway, DNS)
 */
        EthernetNetIf ethif(IpAddr(xxx,xxx,xxx,xxx), IpAddr(xxx,xxx,xxx,xxx), IpAddr(xxx,xxx,xxx,xxx), IpAddr(xxx,xxx,xxx,xxx));
#endif
    
    HTTPServer server;
    LocalFileSystem local("local");
    void MotorSig(char *input,char *output);
    void ReadStatus(char *input,char *output);
    RPCFunction rpcFunc(&MotorSig, "MotorSig");
    RPCFunction readrpcFunc(&ReadStatus, "ReadStatus");

int main(void) {
    //Base::add_rpc_class<DigitalOut>();
    //Base::add_rpc_class<AnalogIn>();

    if (ethif.setup()) {
        error("Ethernet setup failed.");
        return 1;
    }
    
    IpAddr ethIp=ethif.getIp();
    
    led1=1;
    wait(1);
    server.addHandler<SimpleHandler>("/hello");
    server.addHandler<RPCHandler>("/rpc");
    FSHandler::mount("/local", "/");
    server.addHandler<FSHandler>("/");
    server.bind(80);
    while (1) {
        Net::poll();
    }

}


void MotorSig(char *input , char *output)
{
    //for data-----------------------
    int     IRdata[MAXdatanum];
    int     pulsetime[MAXdatanum];
    int     j = 0;
    int     datanum = 0;
    int     pHL = 0;    
    int     t = 0; 
//    FILE    *fp1;
    
    //text---------------------------
    int length = 0;
    char *str;
    char *str1;
    char str2[30] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    char str3[30] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    
    //get input data length
    for (length = 0; input[length] != '\0'; length++);
    
    //check data
    printf("length = %d : input = %s\n", length, input);
    
    //check period of extension
    if((length > 4)&&(input[length-4] == '.')){
        //data
        //printf("data mode start\n");
        
        //read file from micro SD card
        str1 = "/sd/";
        //printf("%s\n",str1);
        for(j = 0; j < length; j++){
            //printf("j=%d  input[%d] = %c\n",j,j,input[j]);
            str2[j] = input[j];
        }
        
       // printf("str1 = %s\n",str1);
        //printf("str2 = %s\n",str2);
        
        strcpy(str3, str1);
        //printf("strcpy = %s\n",str3);
        
        strcat(str3, str2);
        //printf("strcat = %s\n",str3);
        
        for (length = 0; (str3[length] != '\0'); length++);
        
        FILE *fp1 = fopen(str3, "r");
        //FILE *fp1 = fopen("/sd/off.csv", "r");
        
        if(fp1 == NULL){
            printf("can not open data file!\n");
            
        }else{
            printf("loading %s ...\n",str3);
            datanum = 0;           
        
            fscanf(fp1, "%d\n",&datanum);    //read from SD
            printf("datanum, %d\n",datanum);
            
            Pulse_pin.period_us(pul38khz);
            
            j=0;
            for(j=0;j<datanum;++j){
                 fscanf(fp1, "%d,%d,\n", &pHL, &t);
                 IRdata[j] = pHL;
                 pulsetime[j] = t;
            }
            
            
            fclose(fp1);
            printf("close fp1\n");
            
            j=0;
            if (LOCK()) {
                for(j=0;j<datanum;++j){
                    send_pulse(IRdata[j],pulsetime[j]);
                }
                UNLOCK();
                printf("WW sent IR data!\n");
            }
                
                Pulse_pin.pulsewidth(pul38k_OFF);
        }
        
    }else{
        //controller
        printf("controller mode start\n");
    
        str = "forward";
        if (strcmp(input,str) == 0){
            //printf("input OK!\n");
            motor1 = 0;
            motor2 = 1;
            motor3 = 1;
            motor4 = 0;
                
            led1 = 0;
            led2 = 1;
            led3 = 1;
            led4 = 0;
        }
        
        str = "stop";
        if (strcmp(input,str) == 0){
            //printf("input OK!\n");
            motor1 = 0;
            motor2 = 0;
            motor3 = 0;
            motor4 = 0;
                
            led1 = 0;
            led2 = 0;
            led3 = 0;
            led4 = 0;
        }
        
        str = "back";
        if (strcmp(input,str) == 0){
            //printf("input OK!\n");
            motor1 = 1;
            motor2 = 0;
            motor3 = 0;
            motor4 = 1;
                
            led1 = 1;
            led2 = 0;
            led3 = 0;
            led4 = 1;
        }
        
        str = "right";
        if (strcmp(input,str) == 0){
            //printf("input OK!\n");
            motor1 = 0;
            motor2 = 1;
            motor3 = 0;
            motor4 = 1;
                
            led1 = 0;
            led2 = 1;
            led3 = 0;
            led4 = 1;
        }
        
        str = "left";
        if (strcmp(input,str) == 0){
            //printf("input OK!\n");
            motor1 = 1;
            motor2 = 0;
            motor3 = 1;
            motor4 = 0;
                
            led1 = 1;
            led2 = 0;
            led3 = 1;
            led4 = 0;
        }
    }
    //-------------------------------
}

void ReadStatus(char * input, char * output){

    float   ADdata19,ADdata20,temp,humid;
    char    str[30] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    
    ADdata19 = ad19.read()*3.3;
    ADdata20 = ad20.read()*3.3;
    
    temp = 100*(ADdata20-0.5);       //temp
    humid = (80.0/1.3)*(ADdata19-0.6);    //humid
    
    sprintf( str, "T : %.1f <br>  H : %.1f", temp, humid);
    sprintf(output, str);
}

void send_pulse(int pHL, int t){

    int k = 0;
    
    if(pHL == 0){
        //38kHz pulse on
        Pulse_pin.pulsewidth_us(pul38k_ON);
        
    }else if(pHL == 1){
        //38kHz pulse off
        Pulse_pin.pulsewidth(pul38k_OFF);
        
    }else{
        Pulse_pin.pulsewidth(pul38k_OFF);
        printf("\n\n-----Data format is incorrect!!-----\n pHL = %d, t = %d \n", pHL, t);
        
    }
        for(k = 0; k < t; ++k){
            wait_us(50);
        }
}