/*********************************************************************************************************** WiFi Adapter NS-700 2015,6/12 -- (C) 2015 NS_KIKAKU Ver1.00 7/23 - 7/28 "WiFi Adapter NS-700 Ver1.0" に変更する。 7/24 Networkモードのリクエスト、レスポンス処理の不具合を修正した。 7/25 リクエスト、レスポンス処理の冗長な部分を削除した。 7/26 DHT11 温度、湿度コマンドを追加した。 7/28 NetworkモードにEscapeコマンドを追加した。 //**** NS5000v3_LAN_Adapter_2015_7_23 Ver1.0 2015,6/12--7/23 LAN関係コマンド作成。7/13 NS700関係コマンドを作った。 7/16 networkコマンド,7/23 共有メモリ関係コマンド作成した。 ***********************************************************************************************************/ #include #include #include #include #include #include //********************************* // 定義 #define VERSION "WiFi Adapter NS-700 Ver1.0#" #define GVP "NS700#" #define GVN "1.00#" #define OK 1 #define NG 0 #define String_MAX_SIZE 15 //ssid,networkKey...最大文字列長を決める #define OFF_MODE 1 //無線LAN off #define AP_MODE 2 // AP モード #define STA_MODE 3 // STAモード #define NotFOUND -1 //********************************* // EEPROMメモリアドレス定義 #define ROM_sw 0x0000 //1byte true(0x01):EEPROM登録済・有効 それ以外:未使用・未登録である #define ROM_Mode 0x0001 //1byte Mode 起動モードを設定する。1:未接続 2:AP 3:STA #define ROM_machine_Type 0x0002 //1byte 導入機器の種類 0:NS-5000 1:EZEUS 2:TEMMA 3:その他 #define ROM_Baudrate 0x0003 //1byte 3:4800 4:9600 6:19200 bps #define ROM_Response_Time 0x0004 //1byte Response時間 10ms * Response_Time #define ROM_ssid 0x0010 //16byte ssid STA 接続先 無線LANシンボル #define ROM_networkKey 0x0020 //16byte networkKey STA 接続先 キーワード #define ROM_Establish_networkKey 0x0030 //16byte Establish_networkKey  AP 接続キーワード #define ROM_YourID 0x0040 //16byte YourID  シンボルの重複を避けるため(暫定) #define ROM_NS700_Master_code 0x0050 //16byte NS700_networkKey (暫定) #define ROM_Your_networkKey 0x0060 //16byte Your_networkKey (暫定) //********************************* // マクロ // TLED #define bsetTLED PORTB |= _BV(1); //PB1 #define bclrTLED PORTB &= ~_BV(1); //PB1 #define okLED tledtimerz =20; // 出力ポート #define bsetPD7 PORTD |= _BV(7); //PD7 #define bclrPD7 PORTD &= ~_BV(7); //PD7 #define bsetPD6 PORTD |= _BV(6); //PD6 #define bclrPD6 PORTD &= ~_BV(6); //PD6 #define bsetPD5 PORTD |= _BV(5); //PD5 #define bclrPD5 PORTD &= ~_BV(5); //PD5 #define bsetPD4 PORTD |= _BV(4); //PD4 #define bclrPD4 PORTD &= ~_BV(4); //PD4 //********************************* // port #define TLED 9 //確認用LED #define STATUS 8 //ステータス(未定) #define PD7 7 //出力ポート  LED7が付いている 1->点灯 #define PD6 6 // #define PD5 5 // #define PD4 4 // #define IN1 3 //PD3/INT1 入力ポート #define IN0 2 //PD2/INT0 #define AN3 3 //アナログ入力ポート #define AN2 2 // #define AN1 1 // #define AN0 0 // //********************************* // SDカード、無線LAN・・ const int chipSelectPin =10; Sd2CardExt card; uint8_t buffer[512]; uint32_t nextSequenceId =0; char ssid[16] ="***********"; char networkKey[16] ="***********"; char NS5000[] ="NS5000-"; char Establish_ssid[24] =""; // "NS5000- + yourID" char Establish_networkKey[16] ="12345678"; char YourID[16] ="yourID"; // 識別名(デバイス番号相当)Establish_ssid に追加する char current_ssid[24] =""; //iSDIO_status()を実行して確認する。 //ssid または Establish_ssid のどちらかになる。 char IPaddress[24] =""; //iSDIO_status()を実行して確認する。 char NS700_Master_code[16] ="12345678"; char Your_networkKey[16] ="12345678"; uint8_t APs =0; //検出AP数を保存する byte Mode =AP_MODE; //起動時の無線LANモードを決める 1:未接続  2:AP 3:STA byte NS700_status =OFF_MODE; //NS700のstatus 1:未接続  2:APである 3:STA外部接続している byte machine_Type =0; //自動導入機器 0:NS-5000 1:EZEUS 2:TEMMA 3:その他 byte Baudrate =4; //3:4800 4:9600 6:19200 bps int analog0; //Analog 0 int analog1; //Analog 1 int analog2; //Analog 2 int analog3; //Analog 3 //********************************* // グローバル変数 int _pcflag; int _pcsw; char* p; byte result =NG; //コマンドの実行結果を入れる OK or NG //********************************* // TLED int tledtimerz; //点滅時間 ledtimer *10ms ダウンカウンタ ->0 byte tledstate; //0:消灯 1:点灯 #define TLEDBLINK_TIME 5 //点滅周期を決める byte blinkz; //点滅 working 10ms byte tledstate_off_time; //点滅以外の状態を指定する //********************************* // Timer int timer10ms; // 10ms upタイマ int timer1s; // 1s upタイマ byte t10; // working //********************************* // Terminalモード byte usw; #define CMD_BUF_SIZE 32 //受信したコマンドをcopyしておく。@___#+NULL 終端に0を付ける。 #define Network_BUF_SIZE 32 //Request_buf ,Response_buf サイズを決める char cbuf[CMD_BUF_SIZE+1]; //1文字+する。NULL文字用、文字列の終端 int cbuf_pnt; int cbuf_cnt; //cbuf コマンド文字数 #を含む char rxdt; //受信文字 #define TIMEOUT 500 //コマンド Timeout * 10ms int timeoutz; //Timeout working //********************************* // Terminal/Network で共用する byte Network_Terminal_sw =0; // 0:Networkモード 1:Terminalモード(RS232C側からコントロール) "+++" で切替える。 byte Network_Terminal_cnt =0; // "+++" '+' 3個連続で Terminalモードに切替える int value; //int 数値 read_buf_addr()の結果が入る byte Response_Time =10; //Response時間 約10ms + 10ms*Response_Time int Q_buf_addr =128; // 0x0080 Q_buf 共有メモリ上のリクエストアドレスである int R_buf_addr =256; // 0x0100 R_buf 共有メモリ上のレスポンスアドレスである //********************************* // Networkモード byte nsw =0; //0:setup 1:Request処理  2:Response処理 byte Q_sw; byte R_sw; byte Q_timerz =0; //Request プロセス実行時間を調整する byte R_timerz =0; //Response プロセス実行時間を調整する //********************************* // DHT11温度、湿度センサー dht11 DHT11; //******************************************************************************************* // // Networkモード // // 電源投入直後は、必ずNetworkモードになる。 // ブラウザ(クライアント)とNS-700サーバー間の通信を実現する。 // これによりブラウザからNS-5000をコントロール、自動導入できる。 // // RS232C側(NS-5000)から、 "+++" を送信すれば、Terminalモードへ移行できる。 // //******************************************************************************************* //********************************* // リクエスト、レスポンスを処理する //********************************* void _Network() { switch (nsw) { //0:setup 1:Request処理  2:Response処理 case 0: Q_sw =0; Q_timerz =5; R_sw =0; R_timerz =10; nsw =1; break; case 1: if (exe_Request() == false) nsw=2; break; case 2: if (exe_Response() == false) nsw=1; break; default: nsw =0; break; } } //******************************************************************************************* // リクエストを処理する。 リクエストバッファ Q_buf ---> RS232バッファ  へ送信する //******************************************************************************************* boolean exe_Request() { if (Q_timerz != 0) return false; //Request プロセス実行時間を調整する switch (Q_sw) { case 0: //inz Q_sw =1; break; case 1: // リクエストバッファQ_buf に文字があるか調べる。 if (peek_Q_buf() == false) { Q_timerz =8; //80ms delay break; //なし }else { if (( buffer[Q_buf_addr + 0] == '\\' ) && ( buffer[Q_buf_addr + 1] == '\\' ) && ( buffer[Q_buf_addr + 2] == '\\' )) { // peek_Q_buf()は32byte readしている、リクエストバッファの先頭1文字のみNULLにする。 buffer[Q_buf_addr + 0] = NULL; if (!card.writeExtMemory(1, 1, 0x1000 + Q_buf_addr, 0x0002, buffer + Q_buf_addr)) return false; // NG exe_Escape_command(); //escapeコマンドを実行する。アンサはレスポンスバッファに出力する。 Q_sw =0; break; } Q_timerz =2; //あり 20ms delay Q_sw =2; return true; } break; case 2: //リクエストバッファ Q_buf から文字列+\0 をreadする。 Read_Q_buf_in_ExtMemory(); //Q_buf ---> RS232 へ送信する okLED; Q_timerz =5; Q_sw =0; break; default: Q_sw =0; break; } return false; } //******************************************************************************************* // Escapeコマンドを実行する。アンサはレスポンスバッファに出力する。 //******************************************************************************************* void exe_Escape_command() { char s; byte c=0; byte i=3; //escapeコマンドの文字列をcbufへコピーする do { s = buffer[Q_buf_addr + i]; cbuf[c] = s; if (s == NULL) goto next; i++; c++; } while(c <32); return; //文字数が32文字を越えた、何もしない。 next: //cbufの文字列をコマンドとして実行する。 cbuf_pnt =0; if (getdt() != ':') return; if (getdt() != '@') return; switch (getdt()) { case 'p': Escape_exe_Port_command(); // :@p_# 出力ポートコマンドを実行する okLED; break; case 'i': Escape_exe_Input_command(); // :@i_# 入力ポートコマンドを実行する okLED; break; case 'a': Escape_exe_Analog_command(); // :@a_# アナログポートコマンドを実行する break; case 'd': Escape_exe_DHT11_command(); // :@dht11# 温度、湿度を確認する。センサーDHT11はオプション。 break; case 'V': // :@V# タイトル、バージョン if (getdt() != '\\') break; okLED; //Serial.print(F(VERSION)); writeResponse32(VERSION); break; case 'P': // :@P# 製品名を表示する。 if (getdt() != '\\') break; okLED; //Serial.print(F(GVP)); writeResponse32(GVP); break; case 'W': // :@W# バージョンを表示する。 if (getdt() != '\\') break; okLED; //Serial.print(F(GVN)); writeResponse32(GVN); break; case 'c': // :@c# 著作権を表示する。 if (getdt() != '\\') break; okLED; //Serial.print(F("(C) 2015 NS_KIKAKU#")); writeResponse32("(C) 2015 NS_KIKAKU#"); break; case 'L': // :@L# TLEDランプを点滅させる Lチカ if (getdt() != '\\') break; tledtimerz =70; break; //case 'R': // :@R# NS700を再起動する // exe_Reboot_command(); // break; case 'I': // :@IP# IPアドレス確認 192.168.0.1# <カードステータスを取得> Escape_exe_IPAddress_command(); break; case 'T': // :@T(....)# レスポンス時間を指定する ”1”〜”999”   10ms-9990ms Escape_exe_ResponseTime_command(); break; default: break; } return; } //************************************************************************* // :@p_# 出力ポートコマンドを実行する //************************************************************************* void Escape_exe_Port_command() { char pn; char b; pn = getdt(); if (getdt() != '=') return; b = getdt(); if (getdt() != '\\') return; switch (pn) { case '7': // PD7 if (b == '1') { bsetPD7; break; }else if (b == '0') { bclrPD7; break; } return; break; case '6': // PD6 if (b == '1') { bsetPD6; break; }else if (b == '0') { bclrPD6; break; } return; break; case '5': // PD5 if (b == '1') { bsetPD5; break; }else if (b == '0') { bclrPD5; break; } return; break; case '4': // PD4 if (b == '1') { bsetPD4; break; }else if (b == '0') { bclrPD4; break; } return; break; default: return; break; } //Serial.print(F("OK#")); writeResponse32("OK#"); okLED; } //************************************************************************* // :@i_# 入力ポートコマンドを実行する //************************************************************************* void Escape_exe_Input_command() { char p; p = getdt(); if (getdt() != '\\') return; switch (p) { case '1': // IN1 if (digitalRead(IN1) == HIGH) { //Serial.print(F("1#")); writeResponse32("1#"); }else { //Serial.print(F("0#")); writeResponse32("0#"); } break; //case '0': // IN0 //削除 2015,7/27 この端子にDHT11センサーを繋いだから。 // if (digitalRead(IN0) == HIGH) { // Serial.print(F("1#")); // }else { // Serial.print(F("0#")); // } // break; default: return; break; } okLED; } //************************************************************************* // :@a_# アナログポートコマンドを実行する //************************************************************************* void Escape_exe_Analog_command() { char p; char buf[6]; p = getdt(); if (getdt() != '\\') return; switch (p) { case '0': // IN0 analog0 = analogRead(AN0); // アナログピンを読み取る //Serial.print(analog0); //Serial.print(F("#")); int_to_ascii(analog0); writeResponse32(cbuf); break; case '1': // IN1 analog1 = analogRead(AN1); // アナログピンを読み取る //Serial.print(analog0); //Serial.print(F("#")); int_to_ascii(analog1); writeResponse32(cbuf); break; case '2': // IN2 analog2 = analogRead(AN2); // アナログピンを読み取る //Serial.print(analog0); //Serial.print(F("#")); int_to_ascii(analog2); writeResponse32(cbuf); break; case '3': // IN3 analog3 = analogRead(AN3); // アナログピンを読み取る //Serial.print(analog0); //Serial.print(F("#")); int_to_ascii(analog3); writeResponse32(cbuf); break; default: return; break; } okLED; } //************************************************************************* // :@dht11# 温度、湿度を確認する。センサーDHT11はオプション。 //************************************************************************* void Escape_exe_DHT11_command(){ char s[3]=""; if (getdt() != 'h') return; if (getdt() != 't') return; if (getdt() != '1') return; if (getdt() != '1') return; if (getdt() != '\\') return; int chk = DHT11.read(); switch (chk) { case 0: break; //case -1: Serial.print(F("-1NG#")); break; //"Checksum error" //case -2: Serial.print(F("-2NG#")); break; //"Time out error" //default: Serial.print(F("NG#")); break; //"Unknown error" case -1: writeResponse32("-1NG#"); break; //"Checksum error" case -2: writeResponse32("-2NG#"); break; //"Time out error" default: writeResponse32("NG#"); break; //"Unknown error" } //Serial.print( DHT11.temperature, DEC); // //Serial.print(F(",")); //Serial.print( DHT11.humidity, DEC); // //Serial.print(F("#")); itoa(DHT11.temperature,cbuf,10); strcat(cbuf,","); itoa(DHT11.humidity,s,10); strcat(cbuf,s); strcat(cbuf,"#"); writeResponse32(cbuf); okLED; } //************************************************************************* // :@IP# IPアドレス確認 192.168.0.1# <カードステータスを取得> //************************************************************************* void Escape_exe_IPAddress_command() { if (getdt() != 'P') return; if (getdt() != '\\') return; if (!iSDIO_status()) return; //Serial.print(IPaddress); //Serial.print('#'); strcpy(cbuf,IPaddress); strcat(cbuf,"#"); writeResponse32(cbuf); okLED; return; } //************************************************************************* // :@T(....)# レスポンス時間を指定する ”1”〜”999”   10ms-9990ms //************************************************************************* void Escape_exe_ResponseTime_command() { if (getdt() == '\\') { //Serial.print(Response_Time); //Serial.print(F("#")); int_to_ascii(Response_Time); writeResponse32(cbuf); }else { cbuf_pnt--; if (read_buf_addr() == false) return; Response_Time = value; //Serial.print(F("OK#")); int_to_ascii(Response_Time); writeResponse32(cbuf); } okLED; } //*************************************************** // アンサをレスポンスバッファへ書き出す 32byte //*************************************************** void writeResponse32(char *p){ for (int i=0; i < 32 ; i++){ buffer[R_buf_addr + i] = *(p + i); } if (!card.writeExtMemory(1, 1, 0x1000 + R_buf_addr, 0x0020, buffer + R_buf_addr)) return; // NG } //*************************************************** // int型数値をchar型数字に変換する。末尾に'#'を付加する。 // cbuf[] char型数字 //*************************************************** void int_to_ascii(int i){ itoa(i,cbuf,10); strcat(cbuf,"#"); } //******************************************************************************************* // レスポンスを処理する。 RS232バッファ ---> レスポンスバッファ R_buf へ送信する //******************************************************************************************* boolean exe_Response() { if (R_timerz != 0) return false; //Request プロセス実行時間を調整する switch (R_sw) { case 0: //inz R_sw =1; break; case 1: // リクエストバッファQ_buf に文字があるか調べる。 if (Serial.available() == 0) { R_timerz =2; break; //なし }else { R_timerz = Response_Time; //あり Response_Time 分 delay する R_sw++; return true; } break; case 2: //RS232バッファ ---> レスポンスバッファ R_buf へ送信する  abcde #は無い Write_R_buf_in_ExtMemory(); okLED; R_timerz =2; R_sw =0; break; default: R_sw =0; break; } return false; } //****************************************************************** // レスポンスを書き込む。 RS232バッファ ---> レスポンスバッファ R_buf へ送信する  abcde #は無い   Terminalモード  void Write_R_buf_in_ExtMemory() { byte i=0; char s; while (i < 32){ if (Serial.available() != 0) { //RS232バッファに文字があるか? rxdt =Serial.read(); //受信1文字を読む buffer[R_buf_addr + i] = rxdt; if (rxdt == '+') { Network_Terminal_cnt++; if (Network_Terminal_cnt == 3) { // Terminalモードに切替える Network_Terminal_sw =1; // 0:Networkモード 1:Terminalモード(RS232C側からコントロール) "+++" で切替える。 usw =0; tledtimerz =200; //点滅  ledtimerz *10ms return; } }else{ Network_Terminal_cnt =0; } }else { buffer[R_buf_addr + i] = NULL; if (!card.writeExtMemory(1, 1, 0x1000 + R_buf_addr, 0x0020, buffer + R_buf_addr)) return; // NG return; } delay(1); i++; } } //******************************************************************************************* // // Terminalモード // // コマンドを受信(RS232C)してから実行する。 :@network# コマンドで、Networkモードへ移行できる。 // //******************************************************************************************* //********************************* // コマンドを受信する //********************************* void _muart() { switch (usw) { case 0: //:を検出する if (Serial.available() == 0) return; //受信なし rxdt =Serial.read(); //受信1文字を読む if (rxdt != ':') return; cbuf_pnt =0; //cbuf ポインタを設定する 0,1,2... cbuf_cnt =0; //cbuf コマンド文字数 0 #を含む timeoutz =TIMEOUT; //Timeout usw =1; return; break; case 1: //コマンドをcbufに全て格納する。:は含まない。#を含む if (timeoutz == 0) { usw =0; //timeoutエラーである。 //Serial.print('T');////////// return; } if (Serial.available() == 0) return; //受信なし rxdt =Serial.read(); //受信1文字を読む if (! isascii(rxdt)){ //文字を検査する 文字が0x00〜0x7Fならtrue usw =0; //ASCII文字ではない return; } cbuf[cbuf_pnt] =rxdt; //cbufに受信文字を入れる if (rxdt == '#') { cbuf[cbuf_pnt+1] =NULL; //終端にNULL(0)を付ける usw =2; //コマンドを格納終了、次は実行する return; } cbuf_pnt++; cbuf_cnt++; if (cbuf_cnt == CMD_BUF_SIZE) { usw =0; //コマンドがcbufサイズをオーバした。不正コマンドである return; } break; case 2: exe_command(); //コマンドを実行する usw =0; break; default: break; } } //******************************************************************************************* // コマンドを実行する //******************************************************************************************* void exe_command(){ cbuf_pnt =0; if (getdt() != '@') { // コマンド書式は、 :@______# とする。 //Serial.print('?');////////// usw =0; // ng_led; return; } switch (getdt()){ case '#': //コマンドが空である。無効 //Serial.print('#');/////////// break; // 基本コマンド Terminalモード case 'V': // :@V# タイトル、バージョン if (getdt() != '#') break; okLED; Serial.print(F(VERSION)); break; case 'P': // :@P# 製品名を表示する。 if (getdt() != '#') break; okLED; Serial.print(F(GVP)); break; case 'W': // :@W# バージョンを表示する。 if (getdt() != '#') break; okLED; Serial.print(F(GVN)); break; case 'c': // :@c# 著作権を表示する。 if (getdt() != '#') break; okLED; Serial.print(F("(C) 2015 NS_KIKAKU#")); break; case 'L': // :@L# TLEDランプを点滅させる Lチカ if (getdt() != '#') break; tledtimerz =70; break; // LAN関係コマンド  Terminalモード case '0': // :@0# カードステータスを取得する。 exe_get_card_status_command(); break; case 'x': // :@x# カードステータスリストを表示する。 exe_get_card_status_List_command(); break; case '1': // :@1# 切断 Disconnect exe_Disconnect_command (); break; case '2': // :@2# APモード 親機 Establish アクセスポイント exe_AP_Establish_command(); break; case '3': // :@3# STAモード 子機 Connect  外部ルータに接続する exe_STA_Connect_command(); break; case '4': // :@4# Scan exe_Scan_command(); break; case '5': // :@5# HTTP Get exe_HTTP_command(); break; case '-': // :@-...# ssid STA 接続先 無線LANシンボル exe_ssid_command(); break; case '+': // :@+...# networkKey STA 接続先 キーワード exe_networkKey_command(); break; case '%': // :@%...# Establish_ssid STA 接続先 無線LANシンボル exe_Establish_ssid_command(); break; case '*': // :@*...# Establish_networkKey STA 接続先 キーワード exe_Establish_networkKey_command(); break; case '/': // :@/...# YourID  シンボルの重複を避けるため(暫定) exe_YourID_command(); break; case '(': // :@(...# NS700_Master_code (暫定) exe_NS700_Master_code_command(); break; case '&': // :@&...# Your_networkKey (暫定) exe_Your_networkKey_command(); break; case 'I': // :@IP# IPアドレス確認 192.168.0.1# ,カードステータスを取得 exe_IPAddress_command(); break; case '"': // :@"# current_ssidを確認する ,カードステータスを取得 exe_current_ssid_command(); break; case 's': // :@S# NS700_statusを確認する <カードステータスを取得> exe_NS700_status_command(); break; case 'M': // :@M# 起動モードを設定する。  0:未接続 2:AP 3:STA exe_Mode_command(); break; case 'R': // :@R# NS700を再起動する exe_Reboot_command(); break; case 'r': // :@reset# NS700パラメータをリセットする exe_reset_command(); break; case 'N': // :@NEW# 所定のパラメータをROMに記録する exe_NEW_command(); break; case 'n': // :@network# Networkモードへ切替える。 exe_network_command(); break; // NS700関係コマンド case 'A': // :@A_# 自動導入機器を指定する exe_machine_Type_command(); break; case 'B': // :@B_# ボーレイトを設定する exe_Baudrate_command(); break; case 'p': // :@p_# 出力ポートをコントロールする exe_Port_command(); break; case 'i': // :@i_# 入力ポートを確認する exe_Input_command(); break; case 'a': // :@AN_# アナログポートを確認する exe_Analog_command(); break; case 'd': // :@dht11# 温度、湿度を確認する。センサーDHT11はオプション。 exe_DHT11_command(); break; // 共有メモリ関係コマンド case '?': exe_ReadExtMemory_command(); // :@?# リクエストバッファ Q_buf から 文字列+\0 を read する。 abcde#  文字列に#を付ける break; case '<': exe_WriteExtMemory_command(); // :@<.....# レスポンスバッファ R_buf ヘ 文字列+\0 を write する。 #は削除する。 break; case 'T': exe_ResponseTime_command(); // :@T(....)# レスポンス時間を指定する ”1”〜”999”   10ms-9990ms break; case '!': exe_R_buf_addr_command(); // :@!R(....)# R_buf アドレスを変更する。 ”0”〜”511” break; //**************************************************** case 'f': // buffer print p =(char *)buffer; Serial.println(p); tledtimerz =1; break; default: break; } } //************************************************************************* // :@?# リクエストバッファ Q_buf から文字列+\0 をreadする。 abcde# 文字列に#を付ける //************************************************************************* void exe_ReadExtMemory_command() { Read_Q_buf_in_ExtMemory(); Serial.print(F("#")); okLED; } void Read_Q_buf_in_ExtMemory() { byte i=0; byte s; if (!card.readExtMemory(1, 1, 0x1000 + Q_buf_addr, 0x0020, buffer + Q_buf_addr)) return; // NG while (i < 32){ s= buffer[Q_buf_addr + i]; if (s == NULL) break; Serial.write(s); i++; } // readしたから リクエストバッファの文字列を空(先頭の1文字のみNULL)にする。 buffer[Q_buf_addr + 0] = NULL; if (!card.writeExtMemory(1, 1, 0x1000 + Q_buf_addr, 0x0002, buffer + Q_buf_addr)) return; // NG } //************************************************************************* // :@<......# レスポンスバッファ R_buf ヘ 文字列+\0 を write する。 #は削除する。 //************************************************************************* void exe_WriteExtMemory_command() { byte i=0; char s; memset(buffer, 0, 0x200); //bufferクリア if (!card.readExtMemory(1, 1, 0x1000, 0x200, buffer)) return; // NG while (i < 32){ s =getdt(); if ( s == '#') { buffer[R_buf_addr + i] = NULL; if (!card.writeExtMemory(1, 1, 0x1000, 0x200, buffer)) return; // NG Serial.print(F("OK#")); okLED; return; }else { buffer[R_buf_addr + i] = s; } i++; } } //************************************************************************* // :@T(....)# レスポンス時間を指定する ”1”〜”999”   10ms-9990ms //************************************************************************* void exe_ResponseTime_command() { if (getdt() == '#') { Serial.print(Response_Time); Serial.print(F("#")); }else { cbuf_pnt--; if (read_buf_addr() == false) return; Response_Time = value; Serial.print(F("OK#")); } okLED; } //************************************************************************* // :@!R(....)# R_buf アドレスを変更する。 ”0”〜”511” //************************************************************************* void exe_R_buf_addr_command() { if (getdt() != 'R') return; if (getdt() == '#') { Serial.print(R_buf_addr); Serial.print(F("#")); }else { cbuf_pnt--; if (read_buf_addr() == false) return; R_buf_addr = value; Serial.print(F("OK#")); } okLED; } //************************************************************************* // :@network# Networkモードへ切替える。 //************************************************************************* void exe_network_command() { if (getdt() != 'e') return; if (getdt() != 't') return; if (getdt() != 'w') return; if (getdt() != 'o') return; if (getdt() != 'r') return; if (getdt() != 'k') return; if (getdt() != '#') return; Network_Terminal_sw = 0; // 0:Networkモード 1:Terminalモード(RS232C側からコントロール) nsw = 0; //0:setup 1:Request処理  2:Response処理 Serial.print(F(">")); tledtimerz =200; //点滅  ledtimerz *10ms return; } //******************************************************************************************* //************************************************************************* // :@-# :@-...# ssid STA 接続先 無線LANシンボル //************************************************************************* void exe_ssid_command() { if (getdt() == '#') { Serial.print(ssid); Serial.print('#'); okLED; return; } if (!check_string_In_s_cbuf(String_MAX_SIZE)) return; //s_cbuf コマンド文字列が正しいか調べる strcpy(ssid, cbuf); okLED; return; } //************************************************************************* // :@+# :@+...# networkKey  STA 接続先 キーワード //************************************************************************* void exe_networkKey_command() { if (getdt() == '#') { Serial.print(networkKey); Serial.print('#'); okLED; return; } if (!check_string_In_s_cbuf(String_MAX_SIZE)) return; //s_cbuf コマンド文字列が正しいか調べる strcpy(networkKey, cbuf); okLED; return; } //************************************************************************* // :@%# :@%...# Establish_ssid  AP 接続キーワード //************************************************************************* void exe_Establish_ssid_command() { if (getdt() == '#') { Serial.print(Establish_ssid); Serial.print('#'); } okLED; return; } //************************************************************************* // :@*# :@*...# Establish_networkKey  AP 接続キーワード //************************************************************************* void exe_Establish_networkKey_command() { if (getdt() == '#') { Serial.print(Establish_networkKey); Serial.print('#'); okLED; return; } if (!check_string_In_s_cbuf(String_MAX_SIZE)) return; //s_cbuf コマンド文字列が正しいか調べる strcpy(Establish_networkKey, cbuf); okLED; return; } //************************************************************************* // :@/# :@/...# YourID  シンボルの重複を避けるため(暫定) //************************************************************************* void exe_YourID_command() { if (getdt() == '#') { Serial.print(YourID); Serial.print('#'); okLED; return; } if (!check_string_In_s_cbuf(String_MAX_SIZE)) return; //s_cbuf コマンド文字列が正しいか調べる strcpy(YourID, cbuf); strcpy(Establish_ssid,NS5000); //"NS5000-"をコピー strcat(Establish_ssid,YourID); okLED; return; } //************************************************************************* // :@(...# NS700_Master_code (暫定) //************************************************************************* void exe_NS700_Master_code_command() { if (getdt() == '#') { Serial.print(NS700_Master_code); Serial.print('#'); okLED; return; } if (!check_string_In_s_cbuf(String_MAX_SIZE)) return; //s_cbuf コマンド文字列が正しいか調べる strcpy(NS700_Master_code, cbuf); okLED; return; } //************************************************************************* // :@&...# Your_networkKey (暫定) //************************************************************************* void exe_Your_networkKey_command() { if (getdt() == '#') { Serial.print(Your_networkKey); Serial.print('#'); okLED; return; } if (!check_string_In_s_cbuf(String_MAX_SIZE)) return; //s_cbuf コマンド文字列が正しいか調べる strcpy(Your_networkKey, cbuf); okLED; return; } //************************************************************************* // :@IP# IPアドレス確認 192.168.0.1# <カードステータスを取得> //************************************************************************* void exe_IPAddress_command() { if (getdt() != 'P') return; if (getdt() != '#') return; if (!iSDIO_status()) return; Serial.print(IPaddress); Serial.print('#'); okLED; return; } //************************************************************************* // :@"# current_ssidを確認する <カードステータスを取得> //************************************************************************* void exe_current_ssid_command() { if (getdt() != '#') return; if (!iSDIO_status()) return; Serial.print(current_ssid); Serial.print('#'); okLED; return; } //************************************************************************* // :@R# NS700を再起動する // //#include //#define wdt_reset() __asm__ __volatile__ ("wdr") //#define wdt_enable(value) //#define wdt_disable() //#define WDTO_15MS 0 //#define WDTO_30MS 1 //#define WDTO_60MS 2 //#define WDTO_120MS 3 //#define WDTO_250MS 4 //#define WDTO_500MS 5 //#define WDTO_1S 6 //#define WDTO_2S 7 //#define WDTO_4S 8 //#define WDTO_8S 9 //************************************************************************* void exe_Reboot_command() { if (getdt() == '#') { wdt_enable(WDTO_500MS); // WDTを有効にする、時間設定後にRebootする。 okLED; return; } } //************************************************************************* // :@reset# NS700パラメータをリセットする //************************************************************************* void exe_reset_command() { if (getdt() != 'e') return; if (getdt() != 's') return; if (getdt() != 'e') return; if (getdt() != 't') return; if (getdt() != '#') return; EEPROM.write(ROM_sw, false); //1byte true(0x01):EEPROM登録済・有効  false:未使用・未登録である Serial.print(F("OK#")); okLED; return; } //************************************************************************* // :@NEW# パラメータをEEPROMに記録する //************************************************************************* void exe_NEW_command() { if (getdt() != 'E') return; if (getdt() != 'W') return; if (getdt() != '#') return; // パラメータ一式をEEPROMへ書き込む write_EEPROM(); Serial.print(F("OK#")); okLED; return; } //***************************************************** // パラメータ一式をEEPROMへ書き込む、変数を記憶する、またEEPROMを初期化するのに使う void write_EEPROM() { EEPROM.write(ROM_sw, true); //1byte true(0x01):EEPROM登録済・有効 それ以外:未使用・未登録である EEPROM.write(ROM_Mode, Mode); //1byte Mode 起動モードを設定する。1:未接続 2:AP 3:STA EEPROM.write(ROM_machine_Type, machine_Type); //1byte 導入機器の種類 0:NS-5000 1:EZEUS 2:TEMMA 3:その他 EEPROM.write(ROM_Baudrate, Baudrate); //1byte 3:4800 4:9600 6:19200 bps EEPROM.write(ROM_Response_Time,Response_Time); //1byte Response時間 10ms * Response_Time str_EEPROMwrite(ROM_ssid, ssid); //16byte ssid STA 接続先 無線LANシンボル str_EEPROMwrite(ROM_networkKey, networkKey); //16byte networkKey STA 接続先 キーワード str_EEPROMwrite(ROM_Establish_networkKey, Establish_networkKey); //16byte Establish_networkKey  AP 接続キーワード str_EEPROMwrite(ROM_YourID, YourID); //16byte YourID  シンボルの重複を避けるため(暫定) str_EEPROMwrite(ROM_NS700_Master_code, NS700_Master_code); //16byte NS700_networkKey (暫定) str_EEPROMwrite(ROM_Your_networkKey, Your_networkKey); //16byte Your_networkKey (暫定) return; } //***************************************************** // EEPROMからパラメータ一式を読み出し、変数を初期化する void read_EEPROM() { Mode = EEPROM.read(ROM_Mode); //1byte Mode 起動モードを設定する。1:未接続 2:AP 3:STA machine_Type = EEPROM.read(ROM_machine_Type); //1byte 導入機器の種類 0:NS-5000 1:EZEUS 2:TEMMA 3:その他 Baudrate = EEPROM.read(ROM_Baudrate); //1byte 3:4800 4:9600 6:19200 bps Response_Time = EEPROM.read(ROM_Response_Time); //1byte Response時間 10ms * Response_Time str_EEPROMread(ssid, ROM_ssid); //16byte ssid STA 接続先 無線LANシンボル str_EEPROMread(networkKey, ROM_networkKey); //16byte networkKey STA 接続先 キーワード str_EEPROMread(Establish_networkKey, ROM_Establish_networkKey); //16byte Establish_networkKey  AP 接続キーワード str_EEPROMread(YourID, ROM_YourID); //16byte YourID  シンボルの重複を避けるため(暫定) str_EEPROMread(NS700_Master_code, ROM_NS700_Master_code); //16byte NS700_networkKey (暫定) str_EEPROMread(Your_networkKey, ROM_Your_networkKey); //16byte Your_networkKey (暫定) return; } //************************************************************************* // :@M# :@M_# 無線LAN モード確認 1:未接続 2:AP 3:STA //************************************************************************* void exe_Mode_command() { char s; byte b; s = getdt(); if (s == '#') { switch (Mode){ case OFF_MODE: //未接続 Serial.print(F("1#")); break; case AP_MODE: // APモード Serial.print(F("2#")); break; case STA_MODE: // STAモード Serial.print(F("3#")); break; default: return; break; } okLED; return; } if (getdt() != '#') return; switch (s) { case '1': //未接続 b =OFF_MODE; break; case '2': // APモード b =AP_MODE; break; case '3': // STAモード b =STA_MODE; break; default: return; break; } Mode =b; //EEPROM.write(ROM_Mode, Mode); //EEPROMに保存する。 Serial.print(F("OK#")); okLED; return; } //************************************************************************* // :@S# NS700_statusを確認する <カードステータスを取得> 1:未接続 2:AP 3:STA //************************************************************************* void exe_NS700_status_command() { if (getdt() != '#') return; if (!iSDIO_status()) return; okLED; switch (NS700_status) { case 1: //未接続 Serial.print(F("1#")); break; case 2: // APモード Serial.print(F("2#")); break; case 3: // STAモード Serial.print(F("3#")); break; default: return; break; } okLED; } //************************************************************************* // :@A_# 自動導入機器を指定する //************************************************************************* void exe_machine_Type_command() { char s; s = getdt(); if (s == '#') { switch (machine_Type){ case 0: // NS5000 Serial.print(F("0#")); break; case 1: // EZEUS Serial.print(F("1#")); break; case 2: // TEMMA Serial.print(F("2#")); break; default: Serial.print(F("3#")); break; } okLED; return; } if (getdt() != '#') return; switch (s){ case '0': // NS5000 machine_Type =0; break; case '1': // EZEUS machine_Type =1; break; case '2': // TEMMA machine_Type =2; break; default: machine_Type =3; break; } Serial.print(F("OK#")); okLED; } //************************************************************************* // :@B_# ボーレイトを設定する 3:4800 4:9600 6:19200 bps //************************************************************************* void exe_Baudrate_command() { char s; s = getdt(); if (s == '#') { switch (Baudrate){ case 3: // 4800bps Serial.print(F("3#")); break; case 4: // 9600 Serial.print(F("4#")); break; case 6: // 19200 Serial.print(F("6#")); break; default: return; break; } okLED; return; } if (getdt() != '#') return; switch (s){ case '3': // 4800bps Baudrate =3; break; case '4': // 9600 Baudrate =4; break; case '6': // 19200 Baudrate =6; break; default: return; break; } Serial.print(F("OK#")); okLED; } //************************************************************************* // :@p_# 出力ポートをコントロールする //************************************************************************* void exe_Port_command() { char pn; char b; pn = getdt(); if (pn == '#') return; if (getdt() != '=') return; b = getdt(); if (b == '#') return; if (getdt() != '#') return; switch (pn) { case '7': // PD7 if (b == '1') { bsetPD7; break; }else if (b == '0') { bclrPD7; break; } return; break; case '6': // PD6 if (b == '1') { bsetPD6; break; }else if (b == '0') { bclrPD6; break; } return; break; case '5': // PD5 if (b == '1') { bsetPD5; break; }else if (b == '0') { bclrPD5; break; } return; break; case '4': // PD4 if (b == '1') { bsetPD4; break; }else if (b == '0') { bclrPD4; break; } return; break; default: return; break; } Serial.print(F("OK#")); okLED; } //************************************************************************* // :@i_# 入力ポートを確認する //************************************************************************* void exe_Input_command() { char p; p = getdt(); if (getdt() != '#') return; switch (p) { case '1': // IN1 if (digitalRead(IN1) == HIGH) { Serial.print(F("1#")); }else { Serial.print(F("0#")); } break; //case '0': // IN0 //削除 2015,7/27 この端子にDHT11センサーを繋いだから。 // if (digitalRead(IN0) == HIGH) { // Serial.print(F("1#")); // }else { // Serial.print(F("0#")); // } // break; default: return; break; } okLED; } //************************************************************************* // :@a_# アナログポートを確認する //************************************************************************* void exe_Analog_command() { char p; p = getdt(); if (getdt() != '#') return; switch (p) { case '0': // IN0 analog0 = analogRead(AN0); // アナログピンを読み取る Serial.print(analog0); Serial.print(F("#")); break; case '1': // IN1 analog1 = analogRead(AN1); // アナログピンを読み取る Serial.print(analog0); Serial.print(F("#")); break; case '2': // IN2 analog2 = analogRead(AN2); // アナログピンを読み取る Serial.print(analog0); Serial.print(F("#")); break; case '3': // IN3 analog3 = analogRead(AN3); // アナログピンを読み取る Serial.print(analog0); Serial.print(F("#")); break; default: return; break; } okLED; } //************************************************************************* // // :@dht11# 温度、湿度を確認する。センサーDHT11はオプション。 //************************************************************************* void exe_DHT11_command(){ if (getdt() != 'h') return; if (getdt() != 't') return; if (getdt() != '1') return; if (getdt() != '1') return; if (getdt() != '#') return; int chk = DHT11.read(); switch (chk) { case 0: break; case -1: Serial.print(F("-1NG#")); break; //"Checksum error" case -2: Serial.print(F("-2NG#")); break; //"Time out error" default: Serial.print(F("NG#")); break; //"Unknown error" } Serial.print( DHT11.temperature, DEC); // Serial.print(F(",")); Serial.print( DHT11.humidity, DEC); // Serial.print(F("#")); okLED; } //************************************************ // :@0# カードステータスを取得する。 //************************************************ void exe_get_card_status_command(){ if (getdt() != '#') return; iSDIO_status(); Serial.print(F("OK#")); okLED; } //************************************************ // :@x# カードステータスリストを表示する。 システム確認用 //************************************************ void exe_get_card_status_List_command(){ if (getdt() != '#') return; read_iSDIO_status(); //iSDIO_status(); okLED; } //************************************************ // :@1# 切断 Disconnect //************************************************ void exe_Disconnect_command(){ if (getdt() != '#') return; if (iSDIO_disconnect(nextSequenceId) && iSDIO_waitResponse(nextSequenceId)) { Serial.print(F("OK#")); okLED; } else { //Serial.print(F("\nFailed or waiting. errorCode=")); //Serial.println(card.errorCode(), HEX); //strcpy(str_buffer,"Failed or waiting error#"); Serial.print(F("NG#")); NS700_status =1; } nextSequenceId++; iSDIO_status(); /* if (iSDIO_status()) { //Serial.print(F("\nOK")); } else { //Serial.println(F("\nFailed to read status.")); }*/ } // disconnect メッセージ無し void exe_Disconnect_command2(){ if (iSDIO_disconnect(nextSequenceId) && iSDIO_waitResponse(nextSequenceId)) { result = OK; NS700_status =1; } else { result = NG; } nextSequenceId++; iSDIO_status(); } //************************************************ // :@2# APモード 親機 Establish アクセスポイント //************************************************ void exe_AP_Establish_command(){ if (getdt() != '#') return; if (iSDIO_establish(nextSequenceId) && iSDIO_waitResponse(nextSequenceId)) { Serial.print(F("OK#")); okLED; NS700_status =2; } else { //Serial.print(F("\nFailed or waiting. errorCode=")); //Serial.println(card.errorCode(), HEX); //strcpy(str_buffer,"Failed or waiting error#"); Serial.print(F("NG#")); } nextSequenceId++; iSDIO_status(); /* if (iSDIO_status()) { //Serial.print(F("\nOK")); } else { //Serial.println(F("\nFailed to read status.")); }*/ } // Establish_command メッセージ無し void exe_AP_Establish_command2(){ if (iSDIO_establish(nextSequenceId) && iSDIO_waitResponse(nextSequenceId)) { result = OK; NS700_status =2; } else { result = NG; } nextSequenceId++; iSDIO_status(); } //************************************************ // :@3# STAモード 子機 Connect  外部ルータに接続する //************************************************ void exe_STA_Connect_command(){ // Serial.print(F("SSID? ")); // inputText(ssid, sizeof(ssid)); // Serial.print(F("Network Key? ")); // inputText(networkKey, sizeof(networkKey)); if (getdt() != '#') return; if (iSDIO_connect(nextSequenceId, ssid, networkKey) && iSDIO_waitResponse(nextSequenceId)) { Serial.print(F("OK#")); okLED; NS700_status =3; } else { //Serial.print(F("\nFailed or waiting. errorCode=")); //Serial.println(card.errorCode(), HEX); //strcpy(str_buffer,"Failed or waiting error#"); Serial.print(F("NG#")); } nextSequenceId++; iSDIO_status(); /* if (iSDIO_status()) { //Serial.print(F("\nOK")); } else { //Serial.println(F("\nFailed to read status.")); }*/ } // Connect_command メッセージ無し void exe_STA_Connect_command2(){ if (iSDIO_connect(nextSequenceId, ssid, networkKey) && iSDIO_waitResponse(nextSequenceId)) { result = OK; NS700_status =3; } else { result = NG; } nextSequenceId++; iSDIO_status(); } //************************************************ // :@4# Scan //************************************************ void exe_Scan_command(){ if (getdt() != '#') return; if (iSDIO_scan(nextSequenceId) && iSDIO_waitResponse(nextSequenceId) && iSDIO_showScanResult()) { //Serial.println(F("\nSuccess.")); Serial.print(F("#")); okLED; } else { //Serial.print(F("\nFailed or waiting. errorCode=")); //Serial.println(card.errorCode(), HEX); Serial.print(F("NG#")); } nextSequenceId++; iSDIO_status(); /* if (iSDIO_status()) { //Serial.print(F("\nOK")); } else { //Serial.println(F("\nFailed to read status.")); }*/ } //************************************************ // :@5# HTTP Get //************************************************ void exe_HTTP_command(){ if (getdt() != '#') return; if (iSDIO_http(nextSequenceId) && iSDIO_waitResponse(nextSequenceId)) { iSDIO_httpResponse(); //Serial.println(F("\nSuccess.")); Serial.print(F("OK#")); okLED; } else { //Serial.print(F("\nFailed or waiting. errorCode=")); //Serial.println(card.errorCode(), HEX); } nextSequenceId++; iSDIO_status(); /* if (iSDIO_status()) { //Serial.print(F("\nOK")); } else { //Serial.println(F("\nFailed to read status.")); }*/ } //******************************************************************************************* //******************************************************************************************* // 初期設定 //******************************************************************************************* void setup(){ int i; // Initialize UART for message print. Serial.begin(9600); while (!Serial) { ; } //*********************************************************** // portを初期化する pinMode(TLED,OUTPUT); pinMode(STATUS,OUTPUT); // OUTPUT 暫定 < 未定 2015,7/26現在> pinMode(PD7,OUTPUT); pinMode(PD6,OUTPUT); pinMode(PD5,OUTPUT); pinMode(PD4,OUTPUT); pinMode(IN1,INPUT); //PD2/INT1 pinMode(IN0,INPUT); //PD2/INT0 DHT11.attach(2); //DHT11 温度、湿度センサー用として割り当てる。 //*********************************************************** // TLED tledstate =LOW; //0:消灯 1:点灯 tledstate_off_time =HIGH; //点滅以外の状態を指定する AP,STAの時は点灯させる。 //*********************************************************** // _muartを初期化する usw =0; //*********************************************************** // _Networkを初期化する nsw =0; //*********************************************************** // Timer割り込み _inz_mtimer(); MsTimer2::set(10, _mtimer); // Timer割り込みを起動する 10ms MsTimer2::start(); //*********************************************************** // SDカードを初期化する。 //Serial.print(F("\nInitializing SD card...")); if (card.init(SPI_HALF_SPEED, chipSelectPin)) { //Serial.print(F("OK#")); } else { Serial.print(F("\n Initialize SD card...Failed#")); bsetTLED; abort(); } //*********************************************************** // Read the previous sequence ID. if (card.readExtMemory(1, 1, 0x420, 0x34, buffer)) { if (buffer[0x20] == 0x01) { nextSequenceId = get_u32(buffer + 0x24); iSDIO_waitResponse(nextSequenceId); nextSequenceId++; } else { nextSequenceId = 0; } } else { //Serial.println(F("\nFailed to read status#")); nextSequenceId = 0; } //*********************************************************** // 共有メモリをクリアする。512byte を\0(NULL)で埋める memset(buffer, 0, 0x200); if (!card.writeExtMemory(1, 1, 0x1000, 0x200, buffer)) { Serial.print(F("ExtMemory_Failed#")); }else { Serial.print(F("ExtMemory_OK#")); okLED; } //*********************************************************** // TLEDを点滅表示する。動作確認用 i=0; while(i < 2){ tledstate_off_time =HIGH; delay(500); // flashairにsetup時間を与える、また、動作を示す(TLED 確認用) tledstate_off_time =LOW; delay(500); i++; } tledstate_off_time =HIGH; //*********************************************************** // パラメータを初期化する。 // デフォルトパラメータは設定済みの状態である。 // これにEEPROMのパラメータを上書きする。 if (EEPROM.read(ROM_sw) == true) { read_EEPROM(); }else { write_EEPROM(); } //Establish_ssid  AP "NS5000-YourID" を初期化する strcpy(Establish_ssid,NS5000); //"NS5000-"をコピー strcat(Establish_ssid,YourID); //************************************************************************* // ボーレイトを設定する 3:4800 4:9600 6:19200 bps switch (Baudrate){ case 3: // 4800bps Serial.begin(4800); break; case 4: // 9600 Serial.begin(9600); break; case 6: // 19200 Serial.begin(19200,SERIAL_8E1); break; default: Serial.begin(9600); break; } NS700_status =1; result = NG; //*********************************************************** // Modeを参照して、NS-700を起動する。 exe_Disconnect_command2(); // startup disconnect を実行する。 // Serial.print("first_disconect:");///////////////////////////// // Serial.print(result);///////////////////////////// switch (Mode) { case 1: // 未接続、切断 NS700_status =1; tledstate_off_time =LOW; //0:消灯 1:点灯 tledtimerz =100; //点滅  ledtimerz *10ms break; case 2: // APモード 親機 Establish アクセスポイント i=0; while(i < 2){ exe_AP_Establish_command2(); if (result == OK) { Serial.print("AP#"); tledtimerz =100; //点滅  ledtimerz *10ms break; } delay(1000); i++; } break; case 3: // STAモード 子機 Connect  外部ルータに接続する exe_STA_Connect_command2(); if (result == OK) { Serial.print("STA#"); tledtimerz =500; //点滅  ledtimerz *10ms break; } i=0; while(i < 2){ exe_AP_Establish_command2(); if (result == OK) { Serial.print("AP#"); tledtimerz =100; //点滅  ledtimerz *10ms break; } delay(1000); i++; } break; default: break; } _pcflag =0; _pcsw =0; } //******************************************************************************************* //******************************************************************************************* // main loop //******************************************************************************************* void loop(){ if (Network_Terminal_sw == 0) { // 0:Networkモード 1:Terminalモード(RS232C側からコントロール) _Network(); // ブラウザ(クライアント)と自動導入機器間の通信を実現する。 0:Networkモード  }else { _muart(); // RS232C側からコントロールする。コマンドを受信し、実行する 1:Terminalモード } } //***************************************** // Timer割り込み 10ms //****************************************** // timer10ms++;  10ms upタイマー // timer1s++;   1s upタイマー //********************************* // 初期化 void _inz_mtimer(){ timer10ms =0; // 10ms upタイマ timer1s =0; // 1s upタイマ t10 =0; blinkz =TLEDBLINK_TIME; //点滅周期 10ms } //********************************* // Timer割り込み void _mtimer(){ // 10ms upタイマ timer10ms++; t10++; //**** タイムアウト->0 if (timeoutz !=0) timeoutz--; //Request プロセス実行時間を調整する if (Q_timerz !=0) Q_timerz--; //Response プロセス実行時間を調整する if (R_timerz !=0) R_timerz--; //**** blink時間 if (tledtimerz !=0) { tledtimerz--; blinkz--; if (blinkz == 0){ blinkz =TLEDBLINK_TIME; //点滅周期 10ms tledstate = !tledstate; //**** TLED 点滅コントロール //dspTLED(tledstate); } }else{ tledstate = tledstate_off_time; //dspTLED(tledstate); } // TLEDを表示する if (tledstate == 1) { bsetTLED; }else{ bclrTLED; } // 1秒タイマ upタイマ if (t10 == 100) { timer1s++; t10 =0; } } /* //****************************************** // TLEDを表示する タイマー割り込みで使う void dspTLED(byte ledstate){ if (ledstate == 1) { bsetTLED; return; }else{ bclrTLED; } } */ //******************************************************************************************* // サブルーチン //******************************************************************************************* //****************************************************************** // コマンドの文字アドレス3桁を取出し、int 整数に変換する。 // // entry getdt() : 文字アドレス[0-511]の先頭を指すこと 例123/ // exit int_value; int 数値 // boolean read_buf_addr(){ char s_value[5]="\0\0\0\0"; //数字(アドレス、数値を表す) char a; if (getdt() != '(') return false; //最初は、'(' である。 a =getdt(); if (isdigit(a) != true) return false; // 1桁 s_value[0] = a; a =getdt(); if (a == ')') goto exit; // アドレスの後に'/'が付く if (a == '#') goto exit; if (isdigit(a) != true) return false; // 2桁 s_value[1] = a; a =getdt(); if (a == ')') goto exit; // アドレスの後に'/'が付く if (a == '#') goto exit; if (isdigit(a) != true) return false; // 3桁 s_value[2] = a; if (getdt() != ')') return false; //最後尾は、')' である。 exit: value = atoi(s_value); // return true; } //****************************************************************** // コマンドbufから、文字を取り出す。アドレス3桁(10進、数値)を取出し、int 整数に変換する。 char getdt(){ rxdt = cbuf[cbuf_pnt]; cbuf_pnt++; return rxdt; } //********************************* // s_cbuf コマンド文字列が正しいか調べる //  文字列長さを調べる // 不正な文字がないか調べる、A~Z a~z 0~9 が有効 // 文字列のみ残す、他は削除する。 //********************************* boolean check_string_In_s_cbuf(int string_max){ int c,i; String s_cbuf =cbuf; c =s_cbuf.length(); s_cbuf =s_cbuf.substring(2,c-1); //文字列のみ残す、他は削除する。 c =s_cbuf.length(); if ((c < 4 ) || (c > string_max)) return false; //文字列長を調べる。4文字以下、または、lengthを超える場合はfalse //for (int i=0; i < c; i++){ //不正な文字がないか調べる、A~Z a~z 0~9 が有効 // if ( !isalnum(s_cbuf.charAt(i))) return false; //} s_cbuf.toCharArray(cbuf, 16); Serial.print(F("OK#")); return true; } //********************************* // EEPROM //********************************* // int型整数をEEPROMへ書き込む void int_EEPROMwrite(int addr,int data) { unsigned char *p = (unsigned char *)&data; EEPROM.write(addr, *(p+0)); EEPROM.write(addr+1, *(p+1)); } // int型整数を読み出す unsigned int int_EEPROMread(int addr) { unsigned int r; unsigned char *p = (unsigned char*)&r; *(p+0) = EEPROM.read(addr+0); *(p+1) = EEPROM.read(addr+1); return r; } // 文字列をEEPROMに書き込む void str_EEPROMwrite(int addr,char *p) { char c; int i=0; do { c =*(p+i); EEPROM.write(addr+i, c); i++; } while (c != 0); } // EEPROから文字列をコピーする void str_EEPROMread(char *p ,int addr) { char c; int i=0; do { c = EEPROM.read(addr+i); *(p+i) = c; i++; } while (c != 0); } //************************************************************************* // リクエストバッファQ_buf をbufferにcopyして、文字があるか調べる。  // true :あり   false: なし boolean peek_Q_buf(){ if (!card.readExtMemory(1, 1, 0x1000 + Q_buf_addr, 0x20, buffer + Q_buf_addr)) return false; // NG if (buffer[Q_buf_addr] == NULL) { return false; }else{ return true; } }