Set key(p20)を押したあと、Upper key(p19)、Down key(p18)をクリックしても、表示されるアドレス(ipe[4][4][3])が変化しない。もう一度Set keyを押さないと表示されない。ループで回している以上、逐次表示されるはずでは? あと、Right key(p16), Left key(p19)をおすと、表示される数字が、 Right:42, 41 , 00 Left: 41 , 40, 32 という数字。 なのに、実際数字が入力される配列は、 ipe[0][0〜2]の、3つのみである。 本当に不可解。

Revision:
0:4c9b6e0bb8d5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sat May 19 20:35:17 2012 +0000
@@ -0,0 +1,360 @@
+#include "mbed.h"
+#include "EthernetNetIf.h"
+#include "HTTPServer.h"
+#include "TextLCD.h"
+
+EthernetNetIf *eth;
+IpAddr ipaddr, netmask, gateway, nameserver;
+ 
+DigitalOut led1(LED1);
+DigitalOut led2(LED2);
+DigitalIn Setkey(p20);
+DigitalIn Leftkey(p19);
+DigitalIn Downkey(p18);
+DigitalIn Upperkey(p17);
+DigitalIn Rightkey(p16);
+
+TextLCD lcd(p24, p26, p27, p28, p29, p30); // rs, e, d0-d3 
+LocalFileSystem local("local");
+
+
+struct keystate{
+    int state; // push(0) or left(1)?
+};
+
+struct keystate port20; // setup key
+struct keystate port19; // left key
+struct keystate port18; // down key
+struct keystate port17; // up key
+struct keystate port16; // right key
+
+
+void ipe_print(int ipe[4][4][3], int mode){
+    lcd.locate(0,1);
+    lcd.printf("%d%d%d.%d%d%d.%d%d%d.%d%d%d",
+    ipe[mode][0][0],ipe[mode][0][1],ipe[mode][0][2],
+    ipe[mode][1][0],ipe[mode][1][1],ipe[mode][1][2],
+    ipe[mode][2][0],ipe[mode][2][1],ipe[mode][2][2],
+    ipe[mode][3][0],ipe[mode][3][1],ipe[mode][3][2]);
+
+};
+
+
+void edit(){
+    int ipe[4][4][3]=
+    {{{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},{0,0,0},{0,0,0}},
+     {{0,0,0},{0,0,0},{0,0,0},{0,0,0}}};
+     // ipe[mode][i][j];
+
+    int ip[4][4]={0,0,0,0};
+    int mono=0, keta=0;
+    int mode = 0; // 0:IP Adress, 1:NetMask, 2: Gateway, 3:DNS
+    char address[4][16]; // address[mode][Address]
+    char word[4][16] = {"IP Address","NetMask", "Gateway", "Domain Name"}; 
+    
+    lcd.locate(0,0);
+    lcd.printf("%d %s",mode,word[mode]);
+    
+    while(mode < 4){ /*edit Address*/
+        ipe_print(ipe,mode);
+
+   /* ----Settei Key -----*/
+        if((Setkey == 0 )&& (port20.state==1)){
+            lcd.locate(14,0);
+            lcd.printf("S");
+
+            port20.state = 0;
+            mode = mode + 1;
+            if(mode >= 4){
+                lcd.locate(0,0);//        lcd.printf("%s",address[mode]);
+                lcd.printf("edited\n");            
+                break;
+            }else{;}
+
+            lcd.cls();
+            lcd.locate(0,0);//        lcd.printf("%s",address[mode]);
+            lcd.printf("%d %s",mode,word[mode]);
+
+        }else if((Setkey == 1 )&& (port20.state == 0)){
+               port20.state = 1;
+        }else{;}
+
+    /* ----Right Key -----*/
+        if((Rightkey == 0 )&& (port16.state== 1)){
+            port16.state = 0;
+            keta = keta+1;
+            if( keta >= 3){
+                keta = 0;
+                mono = mono+1;
+                if( mono = 4 ){
+                    mono = 0;
+                }else{ //i == 0, 1, 2, 3
+                    ;
+                }
+            }else{ // j == 0, 1, 2;
+                ;
+            }
+            /* debug */
+            lcd.locate(15,0);
+            lcd.printf("R");
+            lcd.locate(13,0);
+            lcd.printf("%d%d",mono, keta);
+        }else if((Rightkey == 1) && (port16.state == 0)){
+               port16.state = 1;
+        }else{;}
+        
+    /* ----Left Key -----*/
+        if((Leftkey == 0) && (port19.state==1)){
+
+            port19.state = 0;
+            keta = keta - 1;
+            if( keta < 0){ // j== 0, 1, 2; 
+                keta = 2;
+                mono = mono - 1;
+                if( mono < 0 ){ // i == 0, 1, 2, 3
+                    mono = 3;
+                }else{
+                    ;
+                 }
+            }else{
+                ;
+            }
+            /* debug */
+            lcd.locate(15,0);
+            lcd.printf("L");
+            lcd.locate(13,0);
+            lcd.printf("%d%d",mono,keta);
+
+         }else if((Leftkey == 1 )&& (port19.state == 0)){
+               port19.state = 1;
+         }else{;}
+
+    /* ----Down Key -----*/
+        if((Downkey == 0) && (port18.state==1)){
+            port18.state = 0;
+            ipe[mode][mono][keta] = ipe[mode][mono][keta]-1;
+            if(ipe[mode][mono][keta] < 0){
+                ipe[mode][mono][keta] = 9;
+            }else{;}
+            /* debug */
+            lcd.locate(15,0);
+            lcd.printf("D");
+            lcd.locate(13,0);
+            lcd.printf("%d ",ipe[mode][mono][keta]);
+        }else if((Downkey == 1 )&& (port18.state == 0)){
+            port18.state = 1;
+        }else{;}
+
+    /* ----Upper Key -----*/
+        if((Upperkey == 0 )&& (port17.state==1)){
+            port17.state = 0;
+            ipe[mode][mono][keta] = ipe[mode][mono][keta]+1;
+            if(ipe[mode][mono][keta] > 9){
+                ipe[mode][mono][keta] = 0;
+            }else{;}        
+            /* debug */
+            lcd.locate(15,0);
+            lcd.printf("U");
+            lcd.locate(13,0);
+            lcd.printf("%d ",ipe[mode][mono][keta]);
+
+
+        }else if((Upperkey == 1) && (port17.state == 0)){
+            port17.state = 1;
+        }else{;}
+                
+//        lcd.locate(1,0); lcd.printf("%d.%d.%d.%d", ip[0],ip[1],ip[2],ip[3]);
+        
+
+
+        for(mono=0; mono<4; mono++){
+            ip[mode][mono] = 100*ipe[mode][mono][0] + 10*ipe[mode][mono][1] + ipe[mode][mono][2];
+        }
+        sprintf(address[mode],"%3d.%3d.%3d.%3d", ip[mode][0],ip[mode][1],ip[mode][2],ip[mode][3]);
+//        lcd.cls();
+//        lcd.locate(0,0);       lcd.printf("%s",address[mode]);
+//        lcd.printf("%s\n",word[mode]);
+
+        
+        wait(0.2);
+   }
+
+    // config_write();        
+    lcd.cls();
+//    return 0;
+}
+
+/*
+int config_write(int *IP[4], int *NM[4], int *GW[4], int  *NS[4]){
+    FILE *conf_fp;
+    char buf[80], name[16];
+    int ip0, ip1, ip2, ip3;
+
+    conf_fp = fopen("/local/ipconfig.txt","w");    
+    if(NULL == conf_fp){
+        //printf("\r\nError: The message file cannot be accessed\r\n");
+        lcd.printf("File access error");
+        return -1;
+    }
+
+    fclose(conf_fp);   r
+    return 0;    
+}
+*/
+
+
+int config_read(){
+    FILE *conf_fp;
+    char buf[80], name[16];
+    int ip0, ip1, ip2, ip3;
+
+    conf_fp = fopen("/local/ipconfig.txt","r");    
+    if(NULL == conf_fp){
+        //printf("\r\nError: The message file cannot be accessed\r\n");
+        lcd.printf("File access error");
+        return -1;
+    }
+
+    while( fgets(buf,sizeof(buf),conf_fp) != NULL){
+         lcd.cls(); //debug
+         //lcd.locate(0,0);lcd.printf("%s\n",buf); // debug
+        if(sscanf(buf, "%s %d,%d,%d,%d", name, &ip0, &ip1, &ip2, &ip3) != 0){
+            //lcd.locate(0,0);
+            //lcd.printf("%s\n%3d,%3d,%3d,%3d", name, ip0, ip1, ip2, ip3);
+        }else{
+            lcd.printf("error...");
+            return -1;
+        }
+
+        if(strcmp(name,"IPAddress")==0){
+            lcd.printf("IP Address\n");
+            lcd.printf("%d.%d.%d.%d",ip0, ip1, ip2, ip3);
+            ipaddr = IpAddr(ip0, ip1, ip2, ip3);
+
+        }
+        if(strcmp(name,"NetworkMask")==0){
+            lcd.printf("NetworkMask\n");
+            lcd.printf("%d.%d.%d.%d",ip0, ip1, ip2, ip3);
+            netmask = IpAddr(ip0, ip1, ip2, ip3);
+        }
+        if(strcmp(name,"Gateway")==0){
+            lcd.printf("Gateway\n");
+            lcd.printf("%d.%d.%d.%d",ip0, ip1, ip2, ip3);
+            gateway = IpAddr(ip0, ip1, ip2, ip3);
+        }
+        if(strcmp(name,"DNS")==0){
+            lcd.printf("Domain Name\n");
+            lcd.printf("%d.%d.%d.%d",ip0, ip1, ip2, ip3);
+            nameserver = IpAddr(ip0, ip1, ip2, ip3);
+        }
+        wait(3);
+    };
+
+    fclose(conf_fp);   
+    return 0;    
+}
+
+
+int setup(){
+    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;
+    }
+
+    return 0;
+}
+
+int test(){
+    led2 = 1;
+    return 0;
+}
+
+
+int main() {
+    int i=0;
+
+    lcd.printf("Setting up...");
+    config_read();
+    if(setup() != 0){
+        return -1;
+    }
+
+
+    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]);
+//    wait(5);
+ 
+//  Timer tm;
+//  tm.start();
+
+
+  //Listen indefinitely
+    while(true){
+    
+        Net::poll();
+        //if(tm.read()>.5){
+
+
+        if(i>5){
+            led1=!led1; //Show that we are alive
+            i=0;
+        }else{
+            i++;
+        }
+       // lcd.printf("main loop\n");
+    
+    
+        if(Setkey == 0 && port20.state==1){
+            port20.state = 0;
+            test();
+
+//            led2 = !led2;
+            edit();
+
+            lcd.cls();
+            lcd.printf("IP Address\n");
+            //lcd.printf("%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
+            //lcd.printf("main loop\n");
+            lcd.printf("%3d.%3d.%3d.%3d.", ip[0], ip[1], ip[2], ip[3]);
+
+/*           if((config_read() != 0) && (setup() !=0)){
+               return -1;
+             }
+             IpAddr ip = eth->getIp() ;
+*/
+        }else if(Setkey == 1 && port20.state == 0){
+            port20.state = 1;
+            led2 = 0;
+        }else if(Setkey == 0 && port20.state == 0){ // state == 0
+//            led2 = !led2;
+        }else{ //Setkey ==1 && state == 1 
+//            led2 = !led2;
+        }
+//      tm.start();
+//    }
+        wait(0.1);      
+    }
+
+    lcd.cls();
+    lcd.printf("bye!");
+    return 0;
+}
\ No newline at end of file