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

Dependencies:   EthernetNetIf TextLCD mbed

Committer:
_muki
Date:
Tue Jun 12 04:56:03 2012 +0000
Revision:
0:1eb068a97a7f
ver. 3.0.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
_muki 0:1eb068a97a7f 1 #include "mbed.h"
_muki 0:1eb068a97a7f 2 #include "EthernetNetIf.h"
_muki 0:1eb068a97a7f 3 //#include "HTTPServer.h"
_muki 0:1eb068a97a7f 4 #include "TextLCD.h"
_muki 0:1eb068a97a7f 5 #include "mbedServer.h"
_muki 0:1eb068a97a7f 6
_muki 0:1eb068a97a7f 7 EthernetNetIf *eth;
_muki 0:1eb068a97a7f 8 IpAddr ipaddr, netmask, gateway, nameserver;
_muki 0:1eb068a97a7f 9
_muki 0:1eb068a97a7f 10 DigitalOut led1(LED1);
_muki 0:1eb068a97a7f 11 DigitalOut led2(LED2);
_muki 0:1eb068a97a7f 12 DigitalOut power(p10);
_muki 0:1eb068a97a7f 13
_muki 0:1eb068a97a7f 14
_muki 0:1eb068a97a7f 15 TextLCD lcd(p24, p26, p27, p28, p29, p30); // rs, e, d0-d3
_muki 0:1eb068a97a7f 16 LocalFileSystem local("local");
_muki 0:1eb068a97a7f 17
_muki 0:1eb068a97a7f 18 char word[4][16] = {"IPAddress","NetworkMask", "Gateway", "DomainName"};
_muki 0:1eb068a97a7f 19 int ipe[4][12]={{0},{0},{0},{0}};
_muki 0:1eb068a97a7f 20
_muki 0:1eb068a97a7f 21
_muki 0:1eb068a97a7f 22 void ipe_print(int mode){
_muki 0:1eb068a97a7f 23 lcd.locate(0,1);
_muki 0:1eb068a97a7f 24 lcd.printf("%1d%1d%1d.%1d%1d%1d.%1d%1d%1d.%1d%1d%1d",
_muki 0:1eb068a97a7f 25 ipe[mode][0],ipe[mode][1],ipe[mode][2],
_muki 0:1eb068a97a7f 26 ipe[mode][3],ipe[mode][4],ipe[mode][5],
_muki 0:1eb068a97a7f 27 ipe[mode][6],ipe[mode][7],ipe[mode][8],
_muki 0:1eb068a97a7f 28 ipe[mode][9],ipe[mode][10],ipe[mode][11]);
_muki 0:1eb068a97a7f 29 };
_muki 0:1eb068a97a7f 30
_muki 0:1eb068a97a7f 31
_muki 0:1eb068a97a7f 32 void ipe_input(int mode, int ip0, int ip1, int ip2, int ip3){
_muki 0:1eb068a97a7f 33 int tmp[4]={ip0, ip1, ip2, ip3};
_muki 0:1eb068a97a7f 34
_muki 0:1eb068a97a7f 35 ipe[mode][2] = tmp[0]%10; tmp[0]=tmp[0]/10; // 1keta
_muki 0:1eb068a97a7f 36 ipe[mode][1] = tmp[0]%10; tmp[0]=tmp[0]/10; // 2keta
_muki 0:1eb068a97a7f 37 ipe[mode][0] = tmp[0]%10; tmp[0]=tmp[0]/10; // 3keta
_muki 0:1eb068a97a7f 38
_muki 0:1eb068a97a7f 39 ipe[mode][5] = tmp[1]%10; tmp[1]=tmp[1]/10; // 1keta
_muki 0:1eb068a97a7f 40 ipe[mode][4] = tmp[1]%10; tmp[1]=tmp[1]/10; // 2keta
_muki 0:1eb068a97a7f 41 ipe[mode][3] = tmp[1]%10; tmp[1]=tmp[1]/10; // 3keta
_muki 0:1eb068a97a7f 42
_muki 0:1eb068a97a7f 43 ipe[mode][8] = tmp[2]%10; tmp[2]=tmp[2]/10; // 1keta
_muki 0:1eb068a97a7f 44 ipe[mode][7] = tmp[2]%10; tmp[2]=tmp[2]/10; // 2keta
_muki 0:1eb068a97a7f 45 ipe[mode][6] = tmp[2]%10; tmp[2]=tmp[2]/10; // 3keta
_muki 0:1eb068a97a7f 46
_muki 0:1eb068a97a7f 47 ipe[mode][11] = tmp[3]%10; tmp[3]=tmp[3]/10; // 1keta
_muki 0:1eb068a97a7f 48 ipe[mode][10] = tmp[3]%10; tmp[3]=tmp[3]/10; // 2keta
_muki 0:1eb068a97a7f 49 ipe[mode][9] = tmp[3]%10; tmp[3]=tmp[3]/10; // 3keta
_muki 0:1eb068a97a7f 50
_muki 0:1eb068a97a7f 51 }
_muki 0:1eb068a97a7f 52
_muki 0:1eb068a97a7f 53
_muki 0:1eb068a97a7f 54 int config_write(char filename[32]){
_muki 0:1eb068a97a7f 55 FILE *conf_fp;
_muki 0:1eb068a97a7f 56 int i, j;
_muki 0:1eb068a97a7f 57 int ip;
_muki 0:1eb068a97a7f 58 char str[32];
_muki 0:1eb068a97a7f 59
_muki 0:1eb068a97a7f 60 sprintf(str,"/local/%s",filename);
_muki 0:1eb068a97a7f 61 conf_fp = fopen(str,"w");
_muki 0:1eb068a97a7f 62
_muki 0:1eb068a97a7f 63 if(NULL == conf_fp){
_muki 0:1eb068a97a7f 64 lcd.printf("File access error");
_muki 0:1eb068a97a7f 65 return -1;
_muki 0:1eb068a97a7f 66 }
_muki 0:1eb068a97a7f 67
_muki 0:1eb068a97a7f 68 for(i=0; i<4; i++){
_muki 0:1eb068a97a7f 69 fprintf(conf_fp,"%s ",word[i]);
_muki 0:1eb068a97a7f 70
_muki 0:1eb068a97a7f 71 for(j=0; j<12; j= j+3){
_muki 0:1eb068a97a7f 72 ip = 100*ipe[i][j] + 10*ipe[i][j+1] + ipe[i][j+2];
_muki 0:1eb068a97a7f 73 fprintf(conf_fp,"%3d,",ip);
_muki 0:1eb068a97a7f 74 }
_muki 0:1eb068a97a7f 75 fprintf(conf_fp,"\n");
_muki 0:1eb068a97a7f 76 }
_muki 0:1eb068a97a7f 77
_muki 0:1eb068a97a7f 78 fclose(conf_fp);
_muki 0:1eb068a97a7f 79 return 0;
_muki 0:1eb068a97a7f 80 }
_muki 0:1eb068a97a7f 81
_muki 0:1eb068a97a7f 82
_muki 0:1eb068a97a7f 83
_muki 0:1eb068a97a7f 84 int config_read(char filename[32]){
_muki 0:1eb068a97a7f 85 FILE *conf_fp;
_muki 0:1eb068a97a7f 86 char buf[80], name[16];
_muki 0:1eb068a97a7f 87 char str[32];
_muki 0:1eb068a97a7f 88 int ip0, ip1, ip2, ip3;
_muki 0:1eb068a97a7f 89
_muki 0:1eb068a97a7f 90 sprintf(str,"/local/%s",filename);
_muki 0:1eb068a97a7f 91 conf_fp = fopen(str,"r");
_muki 0:1eb068a97a7f 92
_muki 0:1eb068a97a7f 93 if(NULL == conf_fp){
_muki 0:1eb068a97a7f 94 lcd.printf("File access error");
_muki 0:1eb068a97a7f 95 wait(2);
_muki 0:1eb068a97a7f 96 return -1;
_muki 0:1eb068a97a7f 97 }else{;}
_muki 0:1eb068a97a7f 98
_muki 0:1eb068a97a7f 99 while(fgets(buf,sizeof(buf),conf_fp) != NULL){
_muki 0:1eb068a97a7f 100 lcd.cls(); //debug
_muki 0:1eb068a97a7f 101 if(sscanf(buf, "%s %d,%d,%d,%d", name, &ip0, &ip1, &ip2, &ip3) == 0){
_muki 0:1eb068a97a7f 102 lcd.printf("error...");
_muki 0:1eb068a97a7f 103 return -1;
_muki 0:1eb068a97a7f 104 }else{;}
_muki 0:1eb068a97a7f 105
_muki 0:1eb068a97a7f 106 if(strcmp(name,word[0])==0){
_muki 0:1eb068a97a7f 107 /* debug */
_muki 0:1eb068a97a7f 108 lcd.printf("IP Address\n");
_muki 0:1eb068a97a7f 109 lcd.printf("%d.%d.%d.%d.",ip0, ip1, ip2, ip3);
_muki 0:1eb068a97a7f 110 ipaddr = IpAddr(ip0, ip1, ip2, ip3);
_muki 0:1eb068a97a7f 111 ipe_input( 0, ip0, ip1, ip2, ip3);
_muki 0:1eb068a97a7f 112 }else{;}
_muki 0:1eb068a97a7f 113
_muki 0:1eb068a97a7f 114 if(strcmp(name,word[1])==0){
_muki 0:1eb068a97a7f 115 /* debug */
_muki 0:1eb068a97a7f 116 lcd.printf("NetworkMask\n");
_muki 0:1eb068a97a7f 117 lcd.printf("%d.%d.%d.%d.",ip0, ip1, ip2, ip3);
_muki 0:1eb068a97a7f 118 netmask = IpAddr(ip0, ip1, ip2, ip3);
_muki 0:1eb068a97a7f 119 ipe_input( 1, ip0, ip1, ip2, ip3);
_muki 0:1eb068a97a7f 120 }else{;}
_muki 0:1eb068a97a7f 121
_muki 0:1eb068a97a7f 122 if(strcmp(name,word[2])==0){
_muki 0:1eb068a97a7f 123 /* debug */
_muki 0:1eb068a97a7f 124 lcd.printf("Gateway\n");
_muki 0:1eb068a97a7f 125 lcd.printf("%d.%d.%d.%d.",ip0, ip1, ip2, ip3);
_muki 0:1eb068a97a7f 126 gateway = IpAddr(ip0, ip1, ip2, ip3);
_muki 0:1eb068a97a7f 127 ipe_input( 2, ip0, ip1, ip2, ip3);
_muki 0:1eb068a97a7f 128
_muki 0:1eb068a97a7f 129 }else{;}
_muki 0:1eb068a97a7f 130
_muki 0:1eb068a97a7f 131 if(strcmp(name,word[3])==0){
_muki 0:1eb068a97a7f 132 /* debug */
_muki 0:1eb068a97a7f 133 lcd.printf("Domain Name\n");
_muki 0:1eb068a97a7f 134 lcd.printf("%d.%d.%d.%d.",ip0, ip1, ip2, ip3);
_muki 0:1eb068a97a7f 135 nameserver = IpAddr(ip0, ip1, ip2, ip3);
_muki 0:1eb068a97a7f 136 ipe_input( 3, ip0, ip1, ip2, ip3);
_muki 0:1eb068a97a7f 137 }else{;}
_muki 0:1eb068a97a7f 138 };
_muki 0:1eb068a97a7f 139
_muki 0:1eb068a97a7f 140 fclose(conf_fp);
_muki 0:1eb068a97a7f 141 return 0;
_muki 0:1eb068a97a7f 142 }
_muki 0:1eb068a97a7f 143
_muki 0:1eb068a97a7f 144
_muki 0:1eb068a97a7f 145 int ip_setup(){
_muki 0:1eb068a97a7f 146 lcd.cls();
_muki 0:1eb068a97a7f 147 lcd.printf("Setup...\n");
_muki 0:1eb068a97a7f 148 /* debug */
_muki 0:1eb068a97a7f 149 lcd.cls(); lcd.locate(0,0);
_muki 0:1eb068a97a7f 150 lcd.printf("ipaddr\n");
_muki 0:1eb068a97a7f 151 lcd.printf("%3d,%3d,%3d,%3d", (int)ipaddr[0], (int)ipaddr[1], (int)ipaddr[2], (int)ipaddr[3]);
_muki 0:1eb068a97a7f 152 wait(2);
_muki 0:1eb068a97a7f 153 lcd.cls(); lcd.locate(0,0);
_muki 0:1eb068a97a7f 154 lcd.printf("netmask\n");
_muki 0:1eb068a97a7f 155 lcd.printf("%3d,%3d,%3d,%3d", (int)netmask[0], (int)netmask[1], (int)netmask[2], (int)netmask[3]);
_muki 0:1eb068a97a7f 156 wait(2);
_muki 0:1eb068a97a7f 157 lcd.cls(); lcd.locate(0,0);
_muki 0:1eb068a97a7f 158 lcd.printf("gateway\n");
_muki 0:1eb068a97a7f 159 lcd.printf("%3d,%3d,%3d,%3d", (int)gateway[0], (int)gateway[1], (int)gateway[2], (int)gateway[3]);
_muki 0:1eb068a97a7f 160 wait(2);
_muki 0:1eb068a97a7f 161 lcd.cls(); lcd.locate(0,0);
_muki 0:1eb068a97a7f 162 lcd.printf("nameserver\n");
_muki 0:1eb068a97a7f 163 lcd.printf("%3d,%3d,%3d,%3d", (int)nameserver[0], (int)nameserver[1], (int)nameserver[2], (int)nameserver[3]);
_muki 0:1eb068a97a7f 164 wait(2);
_muki 0:1eb068a97a7f 165
_muki 0:1eb068a97a7f 166
_muki 0:1eb068a97a7f 167 if (ipaddr[0] == 255) {
_muki 0:1eb068a97a7f 168 // dhcp ip address
_muki 0:1eb068a97a7f 169 eth = new EthernetNetIf;
_muki 0:1eb068a97a7f 170 }else{
_muki 0:1eb068a97a7f 171 // static ip address
_muki 0:1eb068a97a7f 172 eth = new EthernetNetIf(ipaddr, netmask, gateway, nameserver);
_muki 0:1eb068a97a7f 173 }
_muki 0:1eb068a97a7f 174 EthernetErr ethErr = eth->setup();
_muki 0:1eb068a97a7f 175
_muki 0:1eb068a97a7f 176 if(ethErr){
_muki 0:1eb068a97a7f 177 lcd.cls();
_muki 0:1eb068a97a7f 178 lcd.printf("Error %d in setup.", ethErr);
_muki 0:1eb068a97a7f 179 return -1;
_muki 0:1eb068a97a7f 180 }else{;}
_muki 0:1eb068a97a7f 181 return 0;
_muki 0:1eb068a97a7f 182
_muki 0:1eb068a97a7f 183 }
_muki 0:1eb068a97a7f 184
_muki 0:1eb068a97a7f 185
_muki 0:1eb068a97a7f 186 int edit(){
_muki 0:1eb068a97a7f 187 int mode = -1;
_muki 0:1eb068a97a7f 188 int i = 0, j= 0;
_muki 0:1eb068a97a7f 189 int mode_buf,i_buf;
_muki 0:1eb068a97a7f 190
_muki 0:1eb068a97a7f 191 Leftkey.rise(&LeftClick);
_muki 0:1eb068a97a7f 192 Downkey.rise(&DownClick);
_muki 0:1eb068a97a7f 193 Upkey.rise(&UpClick);
_muki 0:1eb068a97a7f 194 Rightkey.rise(&RightClick);
_muki 0:1eb068a97a7f 195
_muki 0:1eb068a97a7f 196
_muki 0:1eb068a97a7f 197 while(Set.num > 0 ){
_muki 0:1eb068a97a7f 198 mode_buf = mode;
_muki 0:1eb068a97a7f 199 i_buf = i;
_muki 0:1eb068a97a7f 200
_muki 0:1eb068a97a7f 201 lcd.cls();
_muki 0:1eb068a97a7f 202 lcd.locate(15,0); lcd.printf("%d",Set.num);
_muki 0:1eb068a97a7f 203 mode = Set.num - 1;
_muki 0:1eb068a97a7f 204 if(mode != mode_buf){
_muki 0:1eb068a97a7f 205 Right.num = 0;
_muki 0:1eb068a97a7f 206 Left.num = 0;
_muki 0:1eb068a97a7f 207 }else{;}
_muki 0:1eb068a97a7f 208
_muki 0:1eb068a97a7f 209 i = (Right.num - Left.num)%12;
_muki 0:1eb068a97a7f 210 if(i < 0){
_muki 0:1eb068a97a7f 211 i = 12 +i;
_muki 0:1eb068a97a7f 212 }else{;}
_muki 0:1eb068a97a7f 213 if(mode != mode_buf || i != i_buf){
_muki 0:1eb068a97a7f 214 Down.num =0;
_muki 0:1eb068a97a7f 215 Up.num = ipe[mode][i];
_muki 0:1eb068a97a7f 216 }else{;}
_muki 0:1eb068a97a7f 217
_muki 0:1eb068a97a7f 218 j = (Up.num - Down.num)%10;
_muki 0:1eb068a97a7f 219 if(j < 0){
_muki 0:1eb068a97a7f 220 j = 10 +j;
_muki 0:1eb068a97a7f 221 }else{;}
_muki 0:1eb068a97a7f 222
_muki 0:1eb068a97a7f 223 if(mode == 0){
_muki 0:1eb068a97a7f 224 lcd.locate(0,0); lcd.printf("IP Address");
_muki 0:1eb068a97a7f 225 ipe[mode][i] = j;
_muki 0:1eb068a97a7f 226 }else if(mode == 1){
_muki 0:1eb068a97a7f 227 lcd.locate(0,0); lcd.printf("Network Mask");
_muki 0:1eb068a97a7f 228 ipe[mode][i] = j;
_muki 0:1eb068a97a7f 229 }else if(mode == 2){
_muki 0:1eb068a97a7f 230 lcd.locate(0,0); lcd.printf("Gateway");
_muki 0:1eb068a97a7f 231 ipe[mode][i] = j;
_muki 0:1eb068a97a7f 232 }else if(mode == 3){
_muki 0:1eb068a97a7f 233 lcd.locate(0,0); lcd.printf("Domain Name");
_muki 0:1eb068a97a7f 234 ipe[mode][i] = j;
_muki 0:1eb068a97a7f 235 }else{
_muki 0:1eb068a97a7f 236 Set.num = 0;
_muki 0:1eb068a97a7f 237 break;
_muki 0:1eb068a97a7f 238 }
_muki 0:1eb068a97a7f 239
_muki 0:1eb068a97a7f 240 ipe_print(mode);
_muki 0:1eb068a97a7f 241 wait(0.1);
_muki 0:1eb068a97a7f 242 }
_muki 0:1eb068a97a7f 243 /* debug */
_muki 0:1eb068a97a7f 244 lcd.locate(0,0); lcd.printf("Edit done");
_muki 0:1eb068a97a7f 245 wait(1);
_muki 0:1eb068a97a7f 246 return 0;
_muki 0:1eb068a97a7f 247 }
_muki 0:1eb068a97a7f 248
_muki 0:1eb068a97a7f 249
_muki 0:1eb068a97a7f 250 int main() {
_muki 0:1eb068a97a7f 251 int i=0;
_muki 0:1eb068a97a7f 252 char filename[32];
_muki 0:1eb068a97a7f 253
_muki 0:1eb068a97a7f 254
_muki 0:1eb068a97a7f 255 lcd.printf("Setting up...");
_muki 0:1eb068a97a7f 256 Set.num = 0;
_muki 0:1eb068a97a7f 257 Left.num = 0;
_muki 0:1eb068a97a7f 258 Right.num = 0;
_muki 0:1eb068a97a7f 259 Down.num = 0;
_muki 0:1eb068a97a7f 260 Up.num = 0;
_muki 0:1eb068a97a7f 261 power = 1;
_muki 0:1eb068a97a7f 262
_muki 0:1eb068a97a7f 263 sprintf(filename,"IPCONFIG.TXT");
_muki 0:1eb068a97a7f 264 if(config_read(filename) != 0){
_muki 0:1eb068a97a7f 265 return -1;
_muki 0:1eb068a97a7f 266 };
_muki 0:1eb068a97a7f 267
_muki 0:1eb068a97a7f 268 if(ip_setup() != 0){
_muki 0:1eb068a97a7f 269 return -1;
_muki 0:1eb068a97a7f 270 }else{;}
_muki 0:1eb068a97a7f 271
_muki 0:1eb068a97a7f 272 lcd.cls();
_muki 0:1eb068a97a7f 273 lcd.printf("Setup OK");
_muki 0:1eb068a97a7f 274
_muki 0:1eb068a97a7f 275 IpAddr ip = eth->getIp() ;
_muki 0:1eb068a97a7f 276
_muki 0:1eb068a97a7f 277 lcd.cls();
_muki 0:1eb068a97a7f 278 lcd.printf("IP Address\n");
_muki 0:1eb068a97a7f 279 lcd.printf("%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
_muki 0:1eb068a97a7f 280
_muki 0:1eb068a97a7f 281 Setkey.rise(&SetClick);
_muki 0:1eb068a97a7f 282
_muki 0:1eb068a97a7f 283 //Listen indefinitely
_muki 0:1eb068a97a7f 284 do{
_muki 0:1eb068a97a7f 285 Net::poll();
_muki 0:1eb068a97a7f 286 if(i>5){
_muki 0:1eb068a97a7f 287 led1=!led1; //Show that we are alive
_muki 0:1eb068a97a7f 288 i = 0;
_muki 0:1eb068a97a7f 289 }else{
_muki 0:1eb068a97a7f 290 i++;
_muki 0:1eb068a97a7f 291 }
_muki 0:1eb068a97a7f 292
_muki 0:1eb068a97a7f 293 /* Settei mode*/
_muki 0:1eb068a97a7f 294 if(Set.num >= 1){
_muki 0:1eb068a97a7f 295 led2 = 1;
_muki 0:1eb068a97a7f 296 if(edit()!= 0){
_muki 0:1eb068a97a7f 297 return -1;
_muki 0:1eb068a97a7f 298 }else{;}
_muki 0:1eb068a97a7f 299
_muki 0:1eb068a97a7f 300 if(config_write(filename) != 0){
_muki 0:1eb068a97a7f 301 return -1;
_muki 0:1eb068a97a7f 302 }else{;}
_muki 0:1eb068a97a7f 303
_muki 0:1eb068a97a7f 304 break;
_muki 0:1eb068a97a7f 305 }
_muki 0:1eb068a97a7f 306 wait(0.1);
_muki 0:1eb068a97a7f 307 }while(1);
_muki 0:1eb068a97a7f 308
_muki 0:1eb068a97a7f 309 led2 = 0;
_muki 0:1eb068a97a7f 310 lcd.cls(); lcd.locate(0,0);
_muki 0:1eb068a97a7f 311 lcd.printf("Please restart.\n");
_muki 0:1eb068a97a7f 312
_muki 0:1eb068a97a7f 313 return 0;
_muki 0:1eb068a97a7f 314 }