witchの日記: (ROBO)(作業メモ) X-8 無線データ形式&インタプリタ外からコマンド列を渡す方法
日記 by
witch
二ヶ月前に自分で書いたコードを理解できないなんて最低…。
無線モジュールで受けたデータ(ジョイパッドのボタン、スティックの状態)を、インタプリタへのコマンドとして渡す方法についての検討状況
- 無線データのフレーム形式
- 1byte目: CTL(コントロール)ビット:1、スタートビット:1、データ長[3bit]、通番[3bit]
- 2byte目: CTLビット:0、ボタンのON/OFFを1/0で表したビット列[7bit]
- 3byte目: CTLビット:0、ボタンのON/OFFを1/0で表したビット列[7bit]
- 4byte目: CTLビット:0、スティック1の状態を表すビット列[3bit×2(前後左右)+1(ボタン)]
- 5byte目: CTLビット:0、スティック2の状態を表すビット列[3bit×2(前後左右)+1(ボタン)]
- 6byte目: CTLビット:1、スタートビット:0、データ部チェックsum[6bit]
- ジョイパッドの状態とインタプリタコマンドの対応付け
- 無線コマンド(ジョイパッドの状態ビットを1/0の文字に直した文字列)と、インタプリタに渡すコマンド文字列の対応は事前にハッシュに入れておく。
- 無線データ受信〜インタプリタコマンドへの変換
- 1フレーム受信したら、データ部を取り出し、前回データと比較。
- 変化していればデータを保存、変化が無ければ無視。
- ハッシュからコマンド列を取り出して、インタプリタ呼び出し。
- インタプリタ呼出し方法
- command.c: command_parse_and_exec() にコマンド文字列を渡す。
- 現在のインタプリタの仕様上、プログラムカウンタ、ステータスレジスタ(演算結果保持変数)に影響を与える命令は実行できないので注意。
- 使えるのは S(Substitute), F(Free), P(Pause) , R(Run) 程度。
- Sコマンドで変数の値を書換えることで、モーションスクリプトの分岐を制御するのが妥当。
命令を保持する変数として思いつくのは、
移動方向、移動速度、上半身バランス、姿勢(腰高さ)変更、攻撃、防御、全サーボフリー
くらい…かな
ジョイパッドの各ボタン、スティックの状態を変数に入れて、モーションスクリプト側で命令を判断するほうが良さそうな気が…
ロボ側からACK/NACKを返しての無線エラー率チェックや、バッテリー電圧監視とかは先送りだね。
---
あれ…?ジョイパッドのデータ、全部の状態を送るよりも、状態が変化したボタン・スティックの情報だけを送る方がいい…かな
…って、無線部分でパケット落ちする可能性があるから全部送るようにしたのでした。
(ROBO)(作業メモ) X-8 無線データ形式&インタプリタ外からコマンド列を渡す方法 More ログイン