【背景】 「ネットワークが物理的に接続されていることを確かめたい.」というニーズで製作した.. 【動作】 mbedのローカルに保存されたIPアドレスに,他のPC等からpingを打つと,mbedはpong返す. ファイルに書かれた各アドレスは,外部のボタン(設定,左,下,上,右)で編集可能である. ただし,編集後のIPアドレスでpingを返すためには,mbedを再起動させる必要がある.(なぜか) 【ハードウェア】 ☆board Orange の他に,タクトスイッチをプルアップで5つ使用している.

Dependencies:   EthernetNetIf TextLCD mbed

main.cpp

Committer:
_muki
Date:
2012-06-12
Revision:
0:1eb068a97a7f

File content as of revision 0:1eb068a97a7f:

#include "mbed.h"
#include "EthernetNetIf.h"
//#include "HTTPServer.h"
#include "TextLCD.h"
#include "mbedServer.h"

EthernetNetIf *eth;
IpAddr ipaddr, netmask, gateway, nameserver;

DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut power(p10);


TextLCD lcd(p24, p26, p27, p28, p29, p30); // rs, e, d0-d3 
LocalFileSystem local("local");

char word[4][16] = {"IPAddress","NetworkMask", "Gateway", "DomainName"}; 
int ipe[4][12]={{0},{0},{0},{0}};


void ipe_print(int mode){
    lcd.locate(0,1);
    lcd.printf("%1d%1d%1d.%1d%1d%1d.%1d%1d%1d.%1d%1d%1d",
    ipe[mode][0],ipe[mode][1],ipe[mode][2],
    ipe[mode][3],ipe[mode][4],ipe[mode][5],
    ipe[mode][6],ipe[mode][7],ipe[mode][8],
    ipe[mode][9],ipe[mode][10],ipe[mode][11]);
};


void ipe_input(int mode, int ip0, int ip1, int ip2, int ip3){
    int tmp[4]={ip0, ip1, ip2, ip3};
    
    ipe[mode][2] = tmp[0]%10;   tmp[0]=tmp[0]/10; // 1keta
    ipe[mode][1] = tmp[0]%10;   tmp[0]=tmp[0]/10; // 2keta
    ipe[mode][0] = tmp[0]%10;   tmp[0]=tmp[0]/10; // 3keta

    ipe[mode][5] = tmp[1]%10;   tmp[1]=tmp[1]/10; // 1keta
    ipe[mode][4] = tmp[1]%10;   tmp[1]=tmp[1]/10; // 2keta
    ipe[mode][3] = tmp[1]%10;   tmp[1]=tmp[1]/10; // 3keta

    ipe[mode][8] = tmp[2]%10;   tmp[2]=tmp[2]/10; // 1keta
    ipe[mode][7] = tmp[2]%10;   tmp[2]=tmp[2]/10; // 2keta
    ipe[mode][6] = tmp[2]%10;   tmp[2]=tmp[2]/10; // 3keta

    ipe[mode][11] = tmp[3]%10;   tmp[3]=tmp[3]/10; // 1keta
    ipe[mode][10] = tmp[3]%10;   tmp[3]=tmp[3]/10; // 2keta
    ipe[mode][9] = tmp[3]%10;   tmp[3]=tmp[3]/10; // 3keta
    
}


int config_write(char filename[32]){
    FILE *conf_fp;
    int i, j;
    int ip;
    char str[32];

    sprintf(str,"/local/%s",filename);
    conf_fp = fopen(str,"w");    
    
    if(NULL == conf_fp){
        lcd.printf("File access error");
        return -1;
    }

    for(i=0; i<4; i++){
        fprintf(conf_fp,"%s ",word[i]);

        for(j=0; j<12; j= j+3){
            ip = 100*ipe[i][j] + 10*ipe[i][j+1] + ipe[i][j+2];
            fprintf(conf_fp,"%3d,",ip);
        }
        fprintf(conf_fp,"\n");
    }
  
    fclose(conf_fp);
    return 0;    
}



int config_read(char filename[32]){
    FILE *conf_fp;
    char buf[80], name[16];
    char str[32];
    int ip0, ip1, ip2, ip3;

    sprintf(str,"/local/%s",filename);
    conf_fp = fopen(str,"r");    

    if(NULL == conf_fp){
        lcd.printf("File access error");
        wait(2);
        return -1;
    }else{;}

    while(fgets(buf,sizeof(buf),conf_fp) != NULL){
         lcd.cls(); //debug
        if(sscanf(buf, "%s %d,%d,%d,%d", name, &ip0, &ip1, &ip2, &ip3) == 0){
            lcd.printf("error...");
            return -1;
        }else{;}
        
        if(strcmp(name,word[0])==0){
            /* debug */
            lcd.printf("IP Address\n");
            lcd.printf("%d.%d.%d.%d.",ip0, ip1, ip2, ip3);
            ipaddr = IpAddr(ip0, ip1, ip2, ip3);
            ipe_input( 0, ip0, ip1, ip2, ip3);
        }else{;}

        if(strcmp(name,word[1])==0){
            /* debug */
            lcd.printf("NetworkMask\n");
            lcd.printf("%d.%d.%d.%d.",ip0, ip1, ip2, ip3);
            netmask = IpAddr(ip0, ip1, ip2, ip3);
            ipe_input( 1, ip0, ip1, ip2, ip3);
        }else{;}

        if(strcmp(name,word[2])==0){
            /* debug */
            lcd.printf("Gateway\n");
            lcd.printf("%d.%d.%d.%d.",ip0, ip1, ip2, ip3);
            gateway = IpAddr(ip0, ip1, ip2, ip3);
            ipe_input( 2, ip0, ip1, ip2, ip3);

        }else{;}

        if(strcmp(name,word[3])==0){
            /* debug */
            lcd.printf("Domain Name\n");
            lcd.printf("%d.%d.%d.%d.",ip0, ip1, ip2, ip3);
            nameserver = IpAddr(ip0, ip1, ip2, ip3);
            ipe_input( 3, ip0, ip1, ip2, ip3);
        }else{;}
    };

    fclose(conf_fp);   
    return 0;    
}


int ip_setup(){            
    lcd.cls();
    lcd.printf("Setup...\n");
    /* debug */
    lcd.cls();    lcd.locate(0,0);
    lcd.printf("ipaddr\n");
    lcd.printf("%3d,%3d,%3d,%3d", (int)ipaddr[0], (int)ipaddr[1], (int)ipaddr[2], (int)ipaddr[3]);
    wait(2);
    lcd.cls();    lcd.locate(0,0);
    lcd.printf("netmask\n");
    lcd.printf("%3d,%3d,%3d,%3d", (int)netmask[0], (int)netmask[1], (int)netmask[2], (int)netmask[3]);
    wait(2);
    lcd.cls();    lcd.locate(0,0);
    lcd.printf("gateway\n");
    lcd.printf("%3d,%3d,%3d,%3d", (int)gateway[0], (int)gateway[1], (int)gateway[2], (int)gateway[3]);
    wait(2);
    lcd.cls();    lcd.locate(0,0);
    lcd.printf("nameserver\n");
    lcd.printf("%3d,%3d,%3d,%3d", (int)nameserver[0], (int)nameserver[1], (int)nameserver[2], (int)nameserver[3]);
    wait(2);


    if (ipaddr[0] == 255) {
        // dhcp ip address
        eth = new EthernetNetIf;
    }else{
        // static ip address
        eth = new EthernetNetIf(ipaddr, netmask, gateway, nameserver);      
    }
    EthernetErr ethErr = eth->setup();

    if(ethErr){
        lcd.cls();
        lcd.printf("Error %d in setup.", ethErr);
        return -1;
    }else{;}
    return 0;

}


int edit(){
    int mode = -1;
    int i = 0, j= 0;
    int mode_buf,i_buf;

    Leftkey.rise(&LeftClick);
    Downkey.rise(&DownClick);
    Upkey.rise(&UpClick);
    Rightkey.rise(&RightClick);


    while(Set.num > 0 ){
        mode_buf = mode;
        i_buf = i;

        lcd.cls();
        lcd.locate(15,0); lcd.printf("%d",Set.num);
        mode = Set.num - 1;
        if(mode != mode_buf){
            Right.num = 0;
            Left.num = 0;       
        }else{;}
        
        i = (Right.num - Left.num)%12;
        if(i < 0){
            i = 12 +i;
        }else{;}
        if(mode != mode_buf || i != i_buf){
            Down.num =0;
            Up.num = ipe[mode][i]; 
        }else{;}

        j = (Up.num - Down.num)%10;
        if(j < 0){
            j = 10 +j;
        }else{;}
 
        if(mode == 0){
                    lcd.locate(0,0);  lcd.printf("IP Address");
                    ipe[mode][i] = j;
        }else if(mode == 1){
                    lcd.locate(0,0);  lcd.printf("Network Mask");
                    ipe[mode][i] = j;
        }else if(mode == 2){
                    lcd.locate(0,0);  lcd.printf("Gateway");
                    ipe[mode][i] = j;
        }else if(mode == 3){
                    lcd.locate(0,0);  lcd.printf("Domain Name");
                    ipe[mode][i] = j;
        }else{
            Set.num = 0;
            break;
        }
        
        ipe_print(mode);   
        wait(0.1);   
   }
    /* debug */
    lcd.locate(0,0);  lcd.printf("Edit done");
    wait(1);
    return 0;
}


int main() {
    int i=0;
    char filename[32];


    lcd.printf("Setting up...");
    Set.num = 0;
    Left.num = 0;
    Right.num = 0;
    Down.num = 0;
    Up.num = 0;
    power = 1;

    sprintf(filename,"IPCONFIG.TXT");
    if(config_read(filename) != 0){
        return -1;
    };

    if(ip_setup() != 0){
        return -1;
    }else{;}

    lcd.cls();
    lcd.printf("Setup OK");
 
    IpAddr ip = eth->getIp() ;
 
    lcd.cls();
    lcd.printf("IP Address\n");
    lcd.printf("%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);

    Setkey.rise(&SetClick); 

  //Listen indefinitely
    do{
        Net::poll();
        if(i>5){
            led1=!led1; //Show that we are alive
            i = 0;
        }else{
            i++;
        }

        /* Settei mode*/
        if(Set.num >= 1){
            led2 = 1;
            if(edit()!= 0){
                return -1;
            }else{;}
            
            if(config_write(filename) != 0){
                return -1;
            }else{;}
            
            break;
        }
        wait(0.1);
    }while(1);

    led2 = 0;
    lcd.cls(); lcd.locate(0,0);
    lcd.printf("Please restart.\n");

    return 0;
}