//----------------------------------------------------------------------------------------------------- // 文字列読み取り関数,改行がきたら区切る void recvStr(char *buf) { int i = 0; char c; while (1) { if (Serial.available()) { c = Serial.read(); // Serial.print(c); buf[i] = c; if (c == 13) break; i++; } } buf[i] = '\0'; // \0: end of string }
//----------------------------------------------------------------------------------------------------- // 文字列読み取り関数,バッファ読み出しが終わったら区切る,1文字入力も可 void recvStr2(char *buf) { int i = 0; char c; while (Serial.available()) { c = Serial.read(); buf[i] = c; i++; } buf[i] = '\0'; // 文字列終わり }
//----------------------------------------------------------------------------------------------------- // Commandコントロール void command() { char c; int i;
// キー入力の確認,モータ回転 if (Serial.available()){ c = Serial.read(); //Serial.flush(); // フラッシュじゃバッファクリアがうまく働かなかった while( Serial.available() && Serial.read()==c); // 連続入力をキャンセル switch (c){ // 1文字でも文字列として読取るので,最初の1字を抜き出して分岐 case 'w': if (form[mf][0]<90) form[mf][0] +=5; dispState(); break; case 'q': if (form[mf][0]>-90) form[mf][0] -=5; dispState(); break; case 's': if (form[mf][1]<90) form[mf][1] +=5; dispState(); break; case 'a': if (form[mf][1]>-90) form[mf][1] -=5; dispState(); break; case 'x': if (form[mf][2]<90) form[mf][2] +=5; dispState(); break; case 'z': if (form[mf][2]>-90) form[mf][2] -=5; dispState(); break; case 'r': if (form[mf][3]<90) form[mf][3] +=5; dispState(); break; case 'e': if (form[mf][3]>-90) form[mf][3] -=5; dispState(); break; case 'f': if (form[mf][4]<90) form[mf][4] +=5; dispState(); break; case 'd': if (form[mf][4]>-90) form[mf][4] -=5; dispState(); break; case 'v': if (form[mf][5]<90) form[mf][5] +=5; dispState(); break; case 'c': if (form[mf][5]>-90) form[mf][5] -=5; dispState(); break; case 'y': if (form[mf][6]<90) form[mf][6] +=5; dispState(); break; case 't': if (form[mf][6]>-90) form[mf][6] -=5; dispState(); break; case 'h': if (form[mf][7]<90) form[mf][7] +=5; dispState(); break; case 'g': if (form[mf][7]>-90) form[mf][7] -=5; dispState(); break; case 'n': if (form[mf][8]<90) form[mf][8] +=5; dispState(); break; case 'b': if (form[mf][8]>-90) form[mf][8] -=5; dispState(); break; case 'i': if (form[mf][9]<90) form[mf][9] +=5; dispState(); break; case 'u': if (form[mf][9]>-90) form[mf][9] -=5; dispState(); break; case 'k': if (form[mf][10]<90) form[mf][10]+=5; dispState(); break; case 'j': if (form[mf][10]>-90) form[mf][10]-=5; dispState(); break; case ',': if (form[mf][11]<90) form[mf][11]+=5; dispState(); break; case 'm': if (form[mf][11]>-90) form[mf][11]-=5; dispState(); break; case 'p': if (form[mf][12]<200) form[mf][12]+=5; dispState(); break; case 'o': if (form[mf][12]>5) form[mf][12]-=5; dispState(); break;
case '1': mfi=1; mf=mfi+mfb; dispState(); break; case '2': mfi=2; mf=mfi+mfb; dispState(); break; case '3': mfi=3; mf=mfi+mfb; dispState(); break; case '4': mfi=4; mf=mfi+mfb; dispState(); break; case '5': mfi=5; mf=mfi+mfb; dispState(); break; case '6': mfi=6; mf=mfi+mfb; dispState(); break; case '7': mfi=7; mf=mfi+mfb; dispState(); break; case '8': mfi=8; mf=mfi+mfb; dispState(); break; case '9': mfi=9; mf=mfi+mfb; dispState(); break; case '0': mfi=0; mf=mfi+mfb; dispState(); break; case '-': if (mfb>0) mfb-=10; mf=mfi+mfb; dispState(); break; case '^': if (mfb<20) mfb+=10; mf=mfi+mfb; dispState(); break;
case '!': mo=1; doMotion(mo); break; case '"': mo=2; doMotion(mo); break; case '#': mo=3; doMotion(mo); break; case '$': mo=4; doMotion(mo); break; case '%': mo=5; doMotion(mo); break; case '&': mo=6; doMotion(mo); break; case 39: mo=7; doMotion(mo); break; // ' シフト7 case '(': mo=8; doMotion(mo); break; case ')': mo=9; doMotion(mo); break;
case 'P': dispOut(); break; // ポーズとモーションデータを表示用出力 case 'L': Serial.println("upload form and motion"); loadAll(); Serial.println("done!"); break; // ファイルから全データ書込み case 'S': saveAll(); break; // ポーズとモーションの全データをファイルに書き出し case 'W': formWrite(); Serial.println("Save form and motion to EEPROM."); break; // ポーズをEEPROMに書込み case 'R': formRead(); Serial.println("Load form and motion from EEPROM."); break; // ポーズをEEPROMに書込み case 'C': motionReset(); formReset(); Serial.println("Clear all form and motion."); break; // ポーズのクリア(配列で定義された初期値をセット) case 'N': if (mf<29){ // 現在のポーズを次のポーズにコピー for(i=0;i<13;i++) form[mf+1][i]=form[mf][i]; mf++; dispState(); } break; case 'B': if (mf>0){ // 現在のポーズを前のポーズにコピー for( i=0;i<13;i++) form[mf-1][i]=form[mf][i]; mf--; dispState(); } break; case 'A': for(i=0;i<10;i++) if (motion[mo][i]==99 && i<10) { motion[mo][i]=mf; break; } // 現在のモーション番号に現在のポーズを追加 doMotion(mo); break; case 'D': for(i=0;i<10;i++) if (motion[mo][i]==99 && i>0) { motion[mo][i-1]=99; break; } // 現在のモーション番号のポーズを1つ削除 doMotion(mo); break; } } }