俺なりの通信プロトコル

いままでは素直にデフォルトの通信プロトコルに従ってきたわけだが、
プレンのファームを改造してしまえば、そんなもの無視して自分の好きなようにプレンと通信できる。

プレンのファーム開発環境などについては以下のエントリを参考にしてほしい。
http://d.hatena.ne.jp/plen/20071107/1194407924
http://d.hatena.ne.jp/plen/20071111/1194797864


今回の例は独自の通信プロトコルを作ってうんぬんということではなくて、
単に1文字受け取ってモーションを再生しているだけ。
応用して俺なりの通信プロトコルを作って、デフォルトの仕様とはおさらばしよう(その後どうなってもぼくは知らない)。


ファームのソースファイルは以下のようにしてみた。

#include <Pirkus_R_RE002.h>
#define UART_BAUD_RATE      	 (u32)57600

u08		rxBuffer0[1024];
u08		txBuffer0[10];

u08		rxHID[16];
u08		txHID[8];

int main()
{
	enableIRQ ();

	Rs0_Init( UART_BAUD_RATE , txBuffer0, sizeof( txBuffer0), rxBuffer0, sizeof( rxBuffer0 ) );
	HID_Init( UART_BAUD_RATE , txHID, sizeof( txHID), rxHID, sizeof( rxHID ) );

	Eeprom_Init( 500000 );

	Servo_Init( 1 );
	Servo_RTableLoad();

	KeyFrame_Init();
	MotionTask_Init();
	MotionTask_MoveToOrigin( 10 );

	Rs_DefaultChannelSet( 2 );
        // O = BT module
	// 1 = UART 1 (TTL Level)
	// 2 = USB HID Emulater

	PCLink_Init();
        u08 c;
	while(1){
//		walk();
		if( 0 < Rs0_DataIsIn() ){
			c = Rs0_CharGet();
			if ( c == '0' ) {
                            MotionTask_Start_EEPROM( 0 );
                            Rs0_Printf( "playing motion 0" );
                        }
                        else if ( c == '1' ) {
                            MotionTask_Start_EEPROM( 1 );
                            Rs0_Printf( "playing motion 1" );
                        }
                        while( MotionTask_IsRunning() );
			//BT_CommandWait();
		}
		if( 0 < Rs_DataIsIn()) {
		   PCLink_CommandWait();
	        }
	}
}


動作確認するために、さっき作ったpyplen.pyも使いもってごちゃごちゃしてみる。

下の内容でplen_operation.pyファイルを作る。

import pyplen

p = pyplen.PyPlen()
s = p.plen_connect()
p.start_listener(s)

while 1:
    c = raw_input()
    if c[0] == 'q':
        break
    else:
        s.send(c[0])

s.close


実行。

$ python plen_operation.py
1 . PLEN *** (**:**:**:**:**:**)
2 . ********* のコンピュータ (**:**:**:**:**:**)
select a device: 1
selected PLEN ***
connected
1
p
laying motion 1
0
p
laying motion 0
q
$ 


connectedが出たら接続されているので、キーボードの1キー&リターンで1番目のモーションを再生して、
0キーで0番めのモーションを再生する。
qキーで終了する。


どうやら、listenerメソッドがうまく文字列を受信していない。
例えば、

playing motion 1

となるところが

p
laying motion 1

となっている。
よくわからないので、また今度調べることにする。