An XBee ZB Coordinator on a Nucleo Board controls LEDs on the other XBee ZB device.
Please refer to the following site for the details:
- http://developer.mbed.org/users/bokunimowakaru/code/xbee/wiki/Homepage (English)
- http://www.geocities.jp/bokunimowakaru/diy/xbee/xbee-nucleo.html (Japanese)
Revision 1:67097b312238, committed 2014-09-21
- Comitter:
- bokunimowakaru
- Date:
- Sun Sep 21 02:30:40 2014 +0000
- Parent:
- 0:56f4884d346b
- Child:
- 2:8429eb562bbe
- Commit message:
- App. Example fot XBee Lib. Ver. 1.90.
Changed in this revision
xbee/xbee.cpp | Show annotated file Show diff for this revision Revisions of this file |
xbee/xbee.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/xbee/xbee.cpp Sun Jun 22 06:13:19 2014 +0000 +++ b/xbee/xbee.cpp Sun Sep 21 02:30:40 2014 +0000 @@ -18,11 +18,12 @@ 正しい値を応答しない場合がある。上記と似た症状かもしれない。 一度、XBee Smart PlugのACコンセントを抜いて挿しなおせば治る。 (Smart Plug側のファームウェア「XBP24-ZB_2264」の問題と思われる) + ・Ver 1.90でLITEモードの仕様を変更。(濱崎氏によるBeeBee Lite) - ★XBee Wi-FiでRAT実行してもXBee Wi-Fiから応答のパケットが無い場合がある。 + ★XBee Wi-FiでのRAT実行時にXBeeから応答のパケットが無い場合がある。 IP_PINGは通る。 - 再現方法、動作中にXBeeをリセットして、その後にArduinoをリセットする。 - その後にモジュール側をリセットすると治る。 + 再現方法、動作中にXBeeをリセットし、その後にArduinoをリセット。 + XBeeモジュールをリセットすると治る。 Arduino版で発覚。PC版は未確認。 [パソコン用] @@ -30,9 +31,7 @@ [Arduino用] ・標準SDライブラリ使用時にメモリ不足になる場合があります。 - そのような場合は#define LITEを定義してLITEモードで動作させてください。 - ・標準ライブラリの液晶を使用する場合は#define ADAFRUITを解除してください。 - 液晶の接続はハードウェアの説明の欄に従う、もしくは書き換えてください。 + そのような場合はxbee_liteをincludeし、LITEモードにしてください。 [ARM mbed用] ・試作品です。バグ多数かもしれません。 @@ -42,29 +41,26 @@ 「SB14」をオープンにします(抵抗を取り外します。) 「SB62」をショートします。(半田で接続します。) 「SB63」をショートします。(半田で接続します。) - ・液晶を使用したサンプルはDF ROBOT製 LCD Keypad Shieldで動作確認しています。 + ・液晶はDF ROBOT製 LCD Keypad Shieldで動作確認しています。 [H8マイコン用] ・Ver1.52以降は動作確認をしておらず、動作しない恐れがあります。 - お使いになる方は連絡していただければ動作確認版を個別リリースいたします。 + お使いになる方は連絡ください。動作確認版を個別リリースいたします。 制限事項 - ・ソースはPC/H8/Arduino用で共通ですが文字コードと拡張子が異なります。 - PC/H8は(xbee.c)をArduino用はxbee_arduinoフォルダ内のライブラリ(xbee.cpp)を - インストールしてください。 - ・コマンド発行後の応答待ち中に他の受信パケットをキャッシュするかどうかを - #define CACHE_RES で設定しています。 - ※xbee_forceでの指示を出してxbee_rx_callで待ち受ける使い方を推奨します。 - ※H8版ではデフォルトでCACHE_RESをOFFにしていますのでパケットを破棄します。 - ・受信パケットのAPIフレーム長は最大255バイト等に制限しています。(仕様は64KB) - ・複数のXBeeデバイスの切替はアプリでIEEEアドレスを指定して対応してください。 - ・ショートアドレスは使っていません(IEEEアドレスで相手を特定してください) - ・各種センサで温度測定を行う場合は内部発熱分を減算して補正する必要があります。 - Digi純正のWall RouterやSmart Plugも同様に内部発熱の4℃を考慮して測定値から - 減算必要があります。 - ・送信者アドレスを得る命令xbee_fromは、xbee_rx_callで受信した時の送信者を - 正しく得ることが出来ない場合があります(受信キャッシュが保持されている時)。 - したがってxbee_rx_callに渡したxbee_result.FROM[8]から送信者を得てください。 + ・ソースはPC/H8/Arduino/ARM mbed用で共通ですが拡張子が異なります。 + PC/H8「xbee.c」をArduino用は「xbee_arduino」フォルダ内のライブラリ + 「xbee.h」をincludeしてください。 + ・xbee_forceで指示を出してxbee_rx_callで待ち受ける用法を推奨します。 + ・受信パケットの最大APIフレーム長は255Bytes等に制限されます。(64KB) + ・複数のXBeeデバイスの選択はアプリでIEEEアドレスを指定してください。 + ・ショートアドレスは使っていません(IEEEアドレスで指定してください) + ・温度測定を行う場合は内部発熱分を補正(減算)する必要があります。 + Digi純正のWall RouterやSmart Plugの場合は内部発熱の4℃を考慮して + 測定値から減算必要があります。 + ・送信者アドレスを得る関数xbee_fromは、xbee_rx_callで受信した場合に + 正しく得られない場合があります。(受信キャッシュが保持されている時) + xbee_rx_callに渡したxbee_result.FROM[8]から送信者を得てください。 アプリ向け提供関数 @@ -78,7 +74,7 @@ byte xbee_rat(const byte *address, const char *in); byte xbee_rat_force(const byte *address, const char *in); byte xbee_uart(const byte *address, const char *in); - byte xbee_bytes(const byte *address, const byte *in, const byte len); + byte xbee_bytes(const byte *address, const byte *in, byte len); byte xbee_atvr( void ); byte xbee_atai( void ); byte xbee_atcb( byte cb ); @@ -104,112 +100,131 @@ byte xbee_rx_call( XBEE_RESULT *xbee_result ); void xbee_clear_cache(void); xbee_sensor(const byte *address, const enum xbee_sensor_type type ); //(EASY) - void xbee_init( const byte port ); + byte xbee_init( const byte port ); + byte xbee_reset( void ); byte xbee_end_device(const byte *address, byte sp, byte ir, const byte pin); byte xbee_i2c_read(const byte *address, byte adr, byte *rx, byte len); byte xbee_i2c_write(const byte *address, byte adr, byte *rx, byte len); + byte xbee_delay(unsigned int ms); void lcd_disp( char *s ); -バージョン - - */ - #ifndef VERSION - #define VERSION "1.87" - #endif - /* - 主要な変更履歴 2010/08/15 0.10 - 初回の公開版をリリース 基本動作部分の実験用 2011/08/14 0.30 - ライブラリ化のためにAPI関数の内容を全面見直し 2012/04/07 0.80 - 総合試験の実施とバグ修正、仕様見直しなど 2012/04/22 0.91 - パソコン(cygwin)への移植 - 2012/07/15 1.00 - 基本機能(sample1~8)のデバッグを完了。正式版リリース + 2012/07/15 1.00 - 基本機能(sample1~8)のデバッグ完了。正式版 2012/08/25 1.15 - Arduino用へ移植 - enum xbee_port_typeのADCをAINに変更 - - 起動時にシリアル速度が設定されない不具合を修正(PC用) + - 起動時にシリアル速度が設定されない不具合を修正 2012/11/25 1.20 - 電池電圧確認用コマンドを非同期型に変更 - xbee_batt -> xbee_batt_force 応答はxbee_rx_call - 2012/12/09 1.30 - 液晶なしコンパイルオプション(#define LCD_H)の追加 - - ライトモード(#define LITE)の追加。ARDUINO版のみ検証 - - PC版で使用するシリアルポートをcom1~com10に拡張 - - 自分自身のアドレスのグローバル変数ADR_MYとSADR_MYを廃止 - 2012/12/16 1.50 - Arduino版のライブラリ化(要Arduino IDEへのインストール) + xbee_batt⇒xbee_batt_force。応答はxbee_rx_call + 2012/12/09 1.30 - 液晶なしオプション(#define LCD_H)の追加 + - Liteモード(#define LITE)の追加。ARDUINO版のみ + - PC版シリアルポートをcom1~com10に拡張 + - グローバル変数アドレスのADR_MYとSADR_MYを廃止 + 2012/12/16 1.50 - Arduino版のライブラリ化 - コマンド応答待ち時に他のパケットをキャッシュ - (#define CACHE_RES 10でキャッシュ10個が有効になる) + (#define CACHE_RES 10でキャッシュが有効になる) 2012/12/17 1.51 - リモートATの応答確認にAT値からMODE値に変更 - - H8コンパイルエラー対策(lcd_h8.cの2重呼び出し対策等) + - H8のバグ対応(lcd_h8.cの2重呼び出し対策等) 2012/12/18 1.52 - [重要] 関数lcd()をlcd_disp()に変更。 - - Arduino版ではライブラリ側のハード(LCD,LED,SW)をオフに - 2012/12/22 1.53 - [重要] atnjとratnjの戻り値を失敗時255に変更。 - - ATコマンドを送信する関数を追加。 - 2012/12/23 1.54 - テスト用のprintfが残っていたことによるエンバグの修正 - 2012/12/30 1.55 - LEONARDO対応、Arduino標準LCDの配線変更(DF ROBOT互換に) - 2013/01/12 1.56 - xbee_result.GPI[0]とGPI[1]の戻り値を入れ替え。 - 2013/01/14 1.57 - xbee_gpio_configで自分アドレス取得失敗時のバグ修正 - 2013/01/20 1.58 - xbeeの状態取得 xbee_ataiとxbee_atopコマンドの追加 - 2013/04/03 1.60 - xbee_initによるXBeeリセット時の応答を読み取り廃棄 + - Arduino版ライブラリ側ハードLCD,LED,SWの無効化 + 2012/12/22 1.53 - [重要] atnjとratnjの戻り値を失敗時255に変更 + - ATコマンドを送信する関数を追加 + 2012/12/23 1.54 - 1.53のエンバグの修正(テスト用printfの残留) + 2012/12/30 1.55 - Arduino LEONARDOへの対応 + - Arduino標準LCDの配線変更(DF ROBOT互換に) + 2013/01/12 1.56 - xbee_result.GPI[0]とGPI[1]の戻り値を入れ替え + 2013/01/14 1.57 - xbee_gpio_configでアドレス取得失敗時のバグ修正 + 2013/01/20 1.58 - xbee状態取得 xbee_ataiとxbee_atopコマンド追加 + 2013/04/03 1.60 - xbee_initによるXBeeリセット時の応答の廃棄処理 - エラー出力を stderrに変更PC用(のみ) - - xbee_result.GPI.PORT.Dnのエンバグ(Ver1.56~)修正 - 2013/04/08 1.71 - [重要] Arduino用xbee_rx_callをPC版と同じ構造体に変更 - - [重要] xbee_rx_callの特定パケットの選択受信機能を削除 - - [重要] Arduino用xbee_sensor_resultの引数を構造体に変更 - - [重要] PC/H8用 xbee_result.ADCをxbee_result.ADCINに変更 + - xbee_result.GPI.PORT.Dnのエンバグ(1.56~)修正 + 2013/04/08 1.71 - [重要] Arduino xbee_rx_callを構造体受取に変更 + - [重要] Arduino xbee_sensor_resultの引数の同上 + - [重要] xbee_rx_callパケット選択受信機能を削除 + - [重要] PC/H8 xbee_result.ADCをADCINに変更 - xbee_atに16進数のテキスト引数の処理のバグ修正 - - xbee_atnjでjoin後にatnj=0x05を設定(5秒間のJOIN有効) + - xbee_atnjでjoin後にatnj=5を設定(5秒Join有効) - PC/H8/Arduinoでライブラリを共通ソースに統合 - 2013/04/21 1.72 - PC版のみのリリース(Arduino版は動作確認後にリリース予定) - - ratコマンド応答をxbee_rx_callで得るxbee_rat_forceの追加 + 2013/04/21 1.72 - コマンド応答をxbee_rx_callで得るxbee_rat_force - テキストをシリアル送信するxbee_uartの追加 - ZigBeeデバイスタイプを取得するxbee_atvrの追加 - ネットワーク参加状況を確認するxbee_ataiの追加 - コミッショニング操作を行うxbee_atcbの追加 - ネットワークIDを取得するxbee_atopの追加 - - 暗号化を行うxbee_atee_onと停止するxbee_atee_offの追加 + - 暗号化xbee_atee_onと解除xbee_atee_offの追加 2013/04/30 1.73 - PC版&Arduino版リリース - - 受信キャッシュ容量オーバー時はパケット廃棄に仕様変更 + - 受信キャッシュオーバー時パケット廃棄(仕様変更) 2013/05/09 1.74 - 初期化時にAPモード1の設定を追加 - #define LCD_H有効時以外のログ呼び出し停止 - - 子機に本機アドレスを設定する関数追加 xbee_set_myaddress - 2013/05/10 1.75 - End Deviceにスリープを設定する関数追加 xbee_end_device - 2013/05/18 1.76 - [重要] 下記の戻り値を送信パケット番号(PACKET_ID)に変更 - 対象=xbee_gpo、xbee_force、xbee_batt/rat_force、xbee_uart - - [重要] Arduino用のxbee_resultにxbee_result.IDを追加 - 2013/05/25 1.77 - XBee Wi-FiのXBee IPを使ったリモートAT制御に対応(PC版のみ) - 2013/06/30 1.78 - GPIO入力が全マスク時のxbee_result.GPI.BYTE値を0xFFFFに + - 子機に本機アドレスを設定するxbee_set_myaddress + 2013/05/10 1.75 - End Deviceにスリープを設定するxbee_end_device + 2013/05/18 1.76 - [重要] 戻り値を送信パケット番号PACKET_IDに変更 + xbee_gpo,同_force,同_batt,同_rat_force,同_uart + - [重要] Arduino xbee_resultにxbee_result.ID追加 + 2013/05/25 1.77 - XBee Wi-Fi XBee IPによるリモートAT制御に対応 + 2013/06/30 1.78 - 全マスクGPIO入力時xbee_result.GPI.BYTEを0xFFFF - GPIO出力(xbee_gpo)の利用可能ポート範囲を拡大 - 2013/08/28 1.79 - XBee Sensorのデバイス名(define)の追加、説明文の修正 + 2013/08/28 1.79 - XBee Sensorのデバイス名(define)の追加 - xbee_end_deviceの親機のSP値を28秒固定に変更 - 2013/09/28 1.80 - xbee_end_deviceを変更。Router時でも自動送信設定が可能に - - xbee_resultのGPINに電池電圧ADC[0]にmV値を応答(有効時のみ) - - xbee_atnjでjoin後にatnj=0x05を実行していたのを0x00に変更 - - リモートAT応答の送信元がxbee_fromで取得できないバグ修正 - - XBee Wi-Fiでxbee_gpoを送信すると応答が返ってくるバグ修正 - 2013/10/14 1.81 - Arduino版XBee Wi-Fi対応。XBee ZBは未テストでリリース - - xbee_atdの追加(End DeviceのFlashに宛先アドレスを保存する) - - xbee_ratdの追加(自分のアドレス以外も設定できるように) - - xbee_ratd_myaddressに関数名変更(旧xbee_set_myaddress) - - XBee Wi-Fiの3バイト以下のUART受信ができないバグを修正 - - ATDDでXBee Wi-Fiモジュールが不適切な値を応答するバグ対策 + 2013/09/28 1.80 - xbee_end_device Router時の自動送信設定を可能に + - xbee_resultのGPINに電池電圧ADC[0]にmV値を応答 + - xbee_atnjでjoin後のatnj=5設定をatnj=0に変更 + - リモートAT応答の送信元が取得できないバグ修正 + - XBee Wi-Fi xbee_gpoを送信時の応答バグ修正 + 2013/10/14 1.81 - Arduino版XBee Wi-Fi対応。XBee ZBは未テスト + - xbee_atd追加(End Device時に宛先アドレスを保存) + - xbee_ratd追加(親機アドレス以外も設定可能に) + - xbee_set_myaddress⇒xbee_ratd_myaddress名変更 + - XBee Wi-Fi 3バイト以下UART受信不具合の修正 + - XBee Wi-Fi ATDDで不適切な値を応答するバグ対策 - XBee Wi-Fiのフレーム受信でメモリーリーク対策 - 2014/01/14 1.82 - ATmega32U4マイコンが使われている時はLEONARDOを自動定義 - - シリアルポートが無くなった時のSegFault不具合の修正(PC用) - - XBEE_ERROR_TIME定義にてエラーログ出力時に日時を出力(PC用) - 2014/02/17 1.83 - XBee Wi-Fi用サンプルを修正(最新ライブラリでの動作確認) - - XBee Wi-Fi S2B対応検討の開始(動作するかどうかは未確認) - - バイナリデータを子機UARTへ送信するxbee_bytesを追加 - - I2Cインタフェースで測定値を読み取るxbee_i2c_readを追加 - - I2Cインタフェースでデータを書き込むxbee_i2c_writeを追加 - - 受信キャッシュをクリアする xbee_clear_cache を追加 - - 特定向けリリース版(I2C接続LCD用、XBee Wi-Fi S2B用ほか) - 2014/02/23 1.84 - 細かなメモリの無駄使い修正、表示の調整、累積バグ修正 - - ATコマンド解析ツールxbee_test.cのhelpコマンド対応 + 2014/01/14 1.82 - ATmega32U4が使われている時はLEONARDOを自動定義 + - シリアルポート異常時のSegFault不具合の修正 + - 日時付エラーログ出力(PC用XBEE_ERROR_TIME定義) + 2014/02/17 1.83 - XBee Wi-Fi サンプルの各種不具合修正 + - XBee Wi-Fi S2B対応(机上検討による実装) + - バイナリデータを子機UARTへ送信するxbee_bytes + - I2Cインタフェースを読み取るxbee_i2c_readの追加 + - I2Cインタフェースで書き込むxbee_i2c_write追加 + - 受信キャッシュをクリアするxbee_clear_cache追加 + - 特定者向けリリース(I2C接続LCD,XBee Wi-Fi S2B) + 2014/02/23 1.84 - 無駄使いメモリの修正、表示の調整、累積バグ修正 + - ATコマンド解析ツールxbee_test.cのhelpコマンド - README内のバージョン齟齬に関する修正 - 2014/03/01 1.85 - XBee WiFi S6B Ver.20xx対応(従来のVer.10xxとは自動切替) + 2014/03/01 1.85 - XBee WiFi S6B Ver.20xx対応(Ver.10xxと自動切替) 対応モジュール XBee WiFi S6 Ver.102D XBee WiFi S6B Ver.2021 - 2014/03/17 1.86 - CQ出版様向けサンプルソフトウェアのテスト済リリース + 2014/03/17 1.86 - CQ出版様向けサンプルソフトウェアの正式リリース 2014/06/21 1.87 - ARM mbed対応(試作品) - + 2014/08/02 1.88 - シリアルCOMポート拡張(ポート番号1~64に対応) + - Arduino xbee_initでリトライ回数指定に。0で永久 + - xbee_initに戻り値。異常時0。正常時リトライ数 + - 受信しながら時間待ちするxbee_delay関数の追加 + - 宛先ショートアドレス指定関数xbee_short_address + - ZigBee ZCL使用時(PC用)に関するバグ修正 + 2014/08/24 1.89 - 内部関数xbee_resetの公開(ヘッダファイルへ追加) + - xbee_init 失敗時の戻り値の不具合を修正 + - PC版 GCC Ver 4.7対応,最適化オプション-O1の付与 + - 戻り値が不定になる内部関数の不具合修正 + 2014/09/15 1.90 - 有志によるライブラリBeeBee Liteの一部機能採用 + ・試験ツールxbee_agingを通過しない項目の調整 + ・効果はArduino上でSD使用時のメモリ確保など + - xbee_bytesで規定サイズを超えた場合のリーク対策 + - 下位マスク0x00のGPIN受信時にエラー出力バグ修正 + +*********************************************************************/ +/* +本ライブラリのバージョン +*/ +#ifndef VERSION + + #define VERSION "1.90" // 1.XX 4バイト形式 XXは半角文字 + +#endif +/* 参考文献 (1) Digi International Inc. @@ -221,21 +236,23 @@ H8/3664F I/O address definition Release 3.5 2005-11-08 (3694.h) (4) 粕谷友章 PC-UNIX関連ドキュメント「シリアルポートプログラミング」 - http://www006.upp.so-net.ne.jp/kasuya/linux/serial_io_programing.html + www006.upp.so-net.ne.jp/kasuya/linux/serial_io_programing.html (5) JM Project Linux Programmer's Manual Linux man-pages プロジェクト リリース 3.52 (GPL V2) - http://linuxjm.sourceforge.jp/html/LDP_man-pages/man2/select.2.html + linuxjm.sourceforge.jp/html/LDP_man-pages/man2/select.2.html (6) mbed Handbook - http://mbed.org/handbook/Homepage + mbed.org/handbook/Homepage ライセンスについて - 本ソースコードはライセンスフリーですが、参考文献の情報についてはそれぞれの - 権利者にお問い合わせください。 + 本ソースコードはライセンスフリーですが、参考文献の情報については + それぞれの権利者にお問い合わせください。 注意点 - 本ソフトの利用でいかなる損害が発生しても、当方は一切の補償をいたしません。 + 本ソフトの利用による損害について当方は一切の補償をいたしません。 + 全て自己責任で利用ください。 */ + /********************************************************************* ライブラリ使用説明書 @@ -248,8 +265,8 @@ ・XBee Series 2 (ZB) モジュール Arduino 以下のハードが必要です。 - ・Arduinoマイコンボード - ・XBee Shield + ・Arduinoマイコンボード Arduino UNO Arduino Leonardo等 + ・XBee Shield (Arduino Wireless SD Shieldなど) ・XBee Series 2 (ZB) モジュール ・LCDキャラクタディスプレイモジュール[20×4行] SC2004CS-B @@ -368,6 +385,7 @@ // #define LITE // ライトモード(メモリ節約・機能制限)の時に定義する #define EASY_GPI // xbee_gpi関数(リモートGPIO)を使用するときに定義する #define EASY_ADC // xbee_adc関数(リモートADC)を使用するときに定義する +// ##define EASY_SENSOR #endif #ifndef XB_IMPORT_H @@ -469,7 +487,13 @@ #ifndef XB_DEFINE_H #define XB_DEFINE_H #ifndef NAME - #define NAME "ZB Coord" + #ifdef LITE // BeeBee Lite by 蘭 + #define NAME "BeeBee Lite" + #define COPYRIGHT "by Wataru & Ran" + #else + #define NAME "ZB Coord" + #define COPYRIGHT "by Wataru KUNINO" + #endif #endif #ifdef H3694 @@ -480,24 +504,24 @@ #define BUTN IO.PDR8.BIT.B2 // ボタンの接続ポート #define SCI_SIZE 256 // シリアルデータ長(大きすぎるとRAMが不足する) #define API_SIZE 128 // 受信用APIデータ長(32~255) - #define API_TXSIZE 64 // 送信用APIデータ長(32~255)兼シリアル送信最大長 - #define CALL_SIZE 32 // xbee_rx_call用戻りデータ(9~256) + #define API_TXSIZE 64 // 送信用APIデータ長(32~255) シリアル送信最大長=API_TXSIZE-18バイト + #define CALL_SIZE 32 // xbee_rx_call用戻りデータ(10~256) #define XB_AT_SIZE 32 // ATコマンドの最大長 #elif ARDUINO // #define LED1_OUT 15 // 赤色LED(エラー用)用デジタルポート(15=analog 1) // #define LED2_OUT 16 // 緑色LED(動作確認用)用デジタルポート(16=analog 2) // #define LCD_EN 6 // 液晶用電源デジタルポート // #define BUTN 14 // ボタンの接続ポート(14 = analog 0) - #ifdef LITE + #ifdef LITE // BeeBee Lite by 蘭 #define API_SIZE 48 // 受信用APIデータ長(32~255) - #define API_TXSIZE 24 // 送信用APIデータ長(32~255) - #define CALL_SIZE 16 // xbee_rx_call用戻りデータ(9~256) + #define API_TXSIZE 34 // 送信用APIデータ長(32~255) シリアル送信最大長=API_TXSIZE-18バイト + #define CALL_SIZE 16 // xbee_rx_call用戻りデータ(10~256) #define XB_AT_SIZE 16 // ATコマンドの最大長 #else #define CACHE_RES 2 // 応答時のキャッシュ数(無効にするには定義を消す) #define API_SIZE 64 // 受信用APIデータ長(32~255) #define API_TXSIZE 64 // 送信用APIデータ長(32~255) - #define CALL_SIZE 32 // xbee_rx_call用戻りデータ(9~256) + #define CALL_SIZE 32 // xbee_rx_call用戻りデータ(10~256) #define XB_AT_SIZE 32 // ATコマンドの最大長 #endif #define LIGHT 1 @@ -516,7 +540,7 @@ #define CACHE_RES 3 // 応答時のキャッシュ数(無効にするには定義を消す) #define API_SIZE 64 // 受信用APIデータ長(32~255) #define API_TXSIZE 64 // 送信用APIデータ長(32~255) - #define CALL_SIZE 32 // xbee_rx_call用戻りデータ(9~256) + #define CALL_SIZE 32 // xbee_rx_call用戻りデータ(10~256) #define XB_AT_SIZE 32 // ATコマンドの最大長 #define delay(ms) wait_millisec(ms) // 関数名の複製 #define LIGHT 1 @@ -534,14 +558,21 @@ // #define DEBUG // デバッグモード // #define DEBUG_TX // 送信パケットの表示 // #define DEBUG_RX // 受信パケットの表示 - #define CACHE_RES 5 // 応答時のキャッシュ数(無効にするには定義を消す) #define ERRLOG // エラー時にログを出力 // #define XBEE_ERROR_TIME // エラー時のログに日時を付与 - #define API_SIZE 128 // 受信用APIデータ長(32~255) - #define API_TXSIZE 64 // 送信用APIデータ長(32~255) - #define CALL_SIZE 64 // xbee_rx_call用戻りデータ(9~256) - #define XB_AT_SIZE 32 // ATコマンドの最大長 - #define delay(ms) wait_millisec(ms) // 関数名の複製 + #ifdef LITE // BeeBee Lite by 蘭 + #define API_SIZE 48 // 受信用APIデータ長(32~255) + #define API_TXSIZE 34 // 送信用APIデータ長(32~255) + #define CALL_SIZE 16 // xbee_rx_call用戻りデータ(10~256) + #define XB_AT_SIZE 16 // ATコマンドの最大長 + #else + #define CACHE_RES 5 // 応答時のキャッシュ数(無効にするには定義を消す) + #define API_SIZE 128 // 受信用APIデータ長(32~255) + #define API_TXSIZE 64 // 送信用APIデータ長(32~255) + #define CALL_SIZE 64 // xbee_rx_call用戻りデータ(10~256) + #define XB_AT_SIZE 32 // ATコマンドの最大長 + #define delay(ms) wait_millisec(ms) // 関数名の複製 + #endif #endif #endif #define TIME_DEL 3 // デリミタ検出のタイムアウト時間(秒) @@ -608,9 +639,9 @@ #define TIMER_SEC time1s256() #else // PC #define TIMER_SEC time1s256() // TIMER_SECのカウントアップの代わり - byte LED1_OUT; - byte LED2_OUT; - byte LCD_EN; + volatile byte LED1_OUT; + volatile byte LED2_OUT; + volatile byte LCD_EN; #endif #endif @@ -735,7 +766,7 @@ static byte ADR_DEST[]= {0x00,0x13,0xA2,0x00,0x00,0x00,0x00,0x00}; //宛先のIEEEアドレス(変更可) /* ショートアドレス/本ライブラリでの宛先指定はIEEEのみを使う */ -static const byte SADR_BC[]= {0xFF,0xFE}; //ブロード(ショート)アドレス +static byte SADR_DEST[]= {0xFF,0xFE}; //ブロード(ショート)アドレス static byte PACKET_ID = 0; //送信パケット番号 /* XBeeのデバイスタイプ ATVRの上2ケタ */ @@ -871,6 +902,7 @@ } /* ミリ秒待ち(250ms以下の高精度用) 入力範囲=4~250 ms */ +#ifndef ARDUINO // BeeBee Lite by 蘭 void wait_millisec_250( byte ms ){ #ifdef H3694 byte counter; @@ -887,6 +919,7 @@ #endif #endif } +#endif /* ミリ秒待ち(30秒までの広範囲版) 入力範囲=4~30,000 ms */ void wait_millisec( const unsigned int ms ){ @@ -978,7 +1011,6 @@ #else // XBEE_WIFI(arduino除く) int open_serial_port_tx(const byte *address){ // modem_dev=IPアドレスのポインタ byte i; - int ret; in_addr_t ip=0; // 送信アドレス for(i=0;i<4;i++){ @@ -995,7 +1027,7 @@ #ifdef DEBUG printf("IP(TX)=%s\n", inet_ntoa( xbeeT_addr.sin_addr ) ); #endif - return(ret); + return 0; } int open_serial_port_rx( void ){ // modem_dev=IPアドレスのポインタ /* 受信アドレス設定 */ @@ -1016,7 +1048,7 @@ bind(xbeeUSFd, (struct sockaddr *)&xbeeU_addr, sizeof(xbeeU_addr)) ); } - int open_serial_port(const char *modem_dev){ // modem_dev=IPアドレスのポインタ + int open_serial_port(const byte *modem_dev){ // modem_dev=IPアドレスのポインタ /* UDPソケットを生成する。戻り値:0=成功、-1=エラー 入力はcharだけど中ではbyteとして扱う。byteアドレス→char入力→byte使用なので変換は不要 */ open_serial_port_tx( modem_dev ); @@ -1116,25 +1148,29 @@ _xbee_debug.baud(38400); #endif return(1); - #else // PC の時(ZigBeeシリアルorFiFi_LAN) + #else // PC の時(ZigBeeシリアル or WiFi_LAN) #ifndef XBEE_WIFI // ZigBeeシリアル - char modem_dev[11] = "/dev/ttyS0"; + /* tasasaki様よりポート11~64の拡張対応方法を教えていただいて追加した。*/ + char modem_dev[12] = "/dev/ttyS00"; if( port <= 10){ modem_dev[9] = (char)( port - 1 + (byte)'0' ); - if( open_serial_port( modem_dev ) ){ - wait_millisec( 100 ); - close_serial_port(); // open出来ていないが念のために閉じる - wait_millisec( 100 ); - fprintf(stderr,"Failed serial COM%d (%s)\n",port,modem_dev); - port = 0; - }else{ - fprintf(stderr,"Serial port = COM%d (%s)\n",port,modem_dev); - xbee_com_port = port; - } + modem_dev[10]= '\0'; + }else if( port <= 64 ){ + snprintf(&modem_dev[9], 3, "%d", port - 1); }else{ fprintf(stderr,"ERR:sci_init port=%d\n",port); + return(0); + } + if( open_serial_port( modem_dev ) ){ + wait_millisec( 100 ); + close_serial_port(); // open出来ていないが念のために閉じる + wait_millisec( 100 ); + fprintf(stderr,"Failed serial COM%d (%s)\n",port,modem_dev); port = 0; + }else{ + fprintf(stderr,"Serial port = COM%d (%s)\n",port,modem_dev); + xbee_com_port = port; } return( port ); #else // XBEE_WIFI PC用 @@ -1176,8 +1212,8 @@ while( _xbee_serial.readable() ) _xbee_serial.getc(); while( !_xbee_serial.writeable() ); #else //PC - #ifndef XBEE_WIFI - tcflush(xbeeComFd,TCIOFLUSH); // 正しく動いているように見えない + #ifndef XBEE_WIFI // ZigBee + tcflush(xbeeComFd,TCIOFLUSH); #else // XBEE_WIFI close_serial_port(); sci_init( 0 ); @@ -1195,29 +1231,28 @@ while( timer != timera() && SCI3_IN_DATA_CHECK() < 1 ); if( SCI3_IN_DATA_CHECK() ) ret=(byte)SCI3_IN_DATA(); return( ret ); - #elif ARDUINO - int value = 0; - byte timer; - timer = timera() + (timeout)+1; // timeout[ms] = timer/256*1000 - // led_green(0); + #elif ARDUINO // 蘭様による改良あり #ifndef XBEE_WIFI + byte timer; + timer = timera() + (timeout)+1; // timeout[ms] = timer/256*1000 + // led_green(0); #ifdef LEONARDO while( timer != timera() && Serial1.available() <= 0 ); - if( Serial1.available() > 0 ) value = Serial1.read(); + // led_green(1); + if( Serial1.available() > 0 ) return( (byte)Serial1.read() ); #else while( timer != timera() && Serial.available() <= 0 ); - if( Serial.available() > 0 ) value = Serial.read(); + // led_green(1); + if( Serial.available() > 0 ) return( (byte)Serial.read() ); #endif #else - return(0); // フレームで受信するのでバイト毎受信は不要 - #endif - // led_green(1); - return( (byte)value ); + return(0x00); // フレームで受信するのでバイト毎受信は不要 + #endif #else #ifdef ARM_MBED // http://mbed.org/users/mbed_official/code/mbed-src/docs/e8b66477f5bf/classmbed_1_1RawSerial.html int value = 0,i=0; - byte timer; + volatile byte timer; timer = timera() + (timeout)+1; @@ -1250,7 +1285,21 @@ FD_ZERO(&readfds); FD_SET( xbeeComFd , &readfds); tv.tv_sec = 0; - tv.tv_usec = timeout*1000; + #ifdef LITE // BeeBee Lite by 蘭 + /* + if( timeout > 50 ){ + tv.tv_usec = timeout*600; + }else if( timeout > 10 ){ + tv.tv_usec = timeout*750; + }else{ + tv.tv_usec = 0; + } + */ + // 今回は見送ります(本関数を呼び出す前に調整しているので不要) + tv.tv_usec = timeout*1000; + #else + tv.tv_usec = timeout*1000; + #endif if( select( (xbeeComFd+1), &readfds, NULL, NULL ,&tv ) ){ read(xbeeComFd,(char *)&c,1); }else{ @@ -1277,7 +1326,7 @@ /* 受信の有無の判断にFDの待ち受け関数selectを使用する。*/ FD_ZERO(&readfds); // FD初期化 - FD_SET(xbeeRSFd, &readfds); // 待ちソケットの登録 + FD_SET(xbeeRSFd, &readfds); // 待ちソケットの登録 tv.tv_sec = (long)0; tv.tv_usec = (long)9000; // 9ms /* データ受信 */ @@ -1374,6 +1423,7 @@ #endif /* シリアル送信バッファが空になるのを待つ */ +#ifndef LITE byte sci_write_check(void){ #ifdef H3694 byte timer; @@ -1387,13 +1437,14 @@ while( !_xbee_serial.writeable() ); return( 1 ); #else // PC - #ifndef XBEE_WIFI - tcdrain( xbeeComFd ); // 正しく動いているように見えない + #ifndef XBEE_WIFI // ZigBee + tcdrain( xbeeComFd ); #endif return( 1 ); #endif #endif } +#endif // LITE /* シリアル送信 */ byte sci_write( char *data, byte len ){ @@ -1450,6 +1501,19 @@ ret = 0; } } + #ifdef DEBUG_TX + printf("Transmitted Packet tx[%3d] to ", len); + for(i=0;i<4;i++) printf("%02X",ADR_DEST[i]); + printf(" "); + for(i=4;i<8;i++) printf("%02X",ADR_DEST[i]); + printf("\n"); + for(i=0;i<len;i++) printf("%3d,",i); + printf("\n"); + for(i=0;i<len;i++) printf(" %02X,",(byte)data[i]); // dataはchar型 + printf("\n"); + for(i=0;i<len;i++) if( (byte)data[i]>=0x20 ) printf("'%c',",data[i]); else printf("%3d,",(int)((byte)data[i])); + printf("\n"); + #endif #else // XBEE_WIFI #ifdef DEBUG_TX int i; @@ -1823,7 +1887,7 @@ if( at[0] == 'R') data_api[4]=(char)PACKET_ID; // フレームID (at="RATxx") else data_api[4]=0x00; // IDなし(at="SATxx") for( i=5 ; i<=12 ; i++) data_api[i]=(char)ADR_DEST[i-5]; - for( i=13 ; i<=14 ; i++) data_api[i]=(char)SADR_BC[i-13]; + for( i=13 ; i<=14 ; i++) data_api[i]=(char)SADR_DEST[i-13]; data_api[15]=(char)0x02; // apply changes data_api[16]=(char)at[3]; // ATコマンド上位 data_api[17]=(char)at[4]; // ATコマンド下位 @@ -1836,13 +1900,29 @@ data_api[3]=(char)0x10; // TXデータ送信モード data_api[4]=(char)0x00; // フレームIDを使用しない(no responce) for( i=5 ; i<=12 ; i++) data_api[i]=(char)ADR_DEST[i-5]; - for( i=13 ; i<=14 ; i++) data_api[i]=(char)SADR_BC[i-13]; + for( i=13 ; i<=14 ; i++) data_api[i]=(char)SADR_DEST[i-13]; data_api[15]=(char)0x00; // ZigBeeホップ数 data_api[16]=(char)0x00; // 暗号化=しない data_position=17; len=14; // サービスデータにMD+FI+ADR(8)+SAD(2)+OPT(2)が入る } break; + #ifndef ARDUINO + #ifndef ARM_MBED + case 'Z': + // [0]送信元EndPoint, [1]宛先EndPoint, [2-3]クラスタID, [4-5]プロファイルID + // [6]Radius=00 [7]Option=00 [8]Fram Ctrl [9]SeqNum [10]Command [11-12] Attribute + if( at[1]=='C' && value_len>12){ + data_api[3]=(char)0x11; // ZCL送信モード + data_api[4]=(char)PACKET_ID; // フレームID + for( i=5 ; i<=12 ; i++) data_api[i]=(char)ADR_DEST[i-5]; + for( i=13 ; i<=14 ; i++) data_api[i]=(char)SADR_DEST[i-13]; + data_position=15; + len=12; + } + break; + #endif + #endif default: break; } @@ -1859,41 +1939,46 @@ } data_api[2] =(char)len; data_api[len+3]=(char)check; - check = sci_write_check(); // 以降 checkはシリアルバッファ確認に使用する - /*シリアルデータ送信 */ - if( check > 0 ){ - if( sci_write( data_api, (byte)(len+4) ) == 0 ){ - /* シリアルリセット */ - #ifndef H3694 - #ifndef ARDUINO - #ifndef ARM_MBED // PC - wait_millisec( 100 ); - close_serial_port(); // シリアルを閉じる - wait_millisec( 300 ); - printf("RESET serial\n"); - while( sci_init( xbee_com_port )==0){ // 再度オープン - wait_millisec( 3000 ); - close_serial_port(); // シリアルを閉じる - wait_millisec( 3000 ); + #ifdef LITE // BeeBee Lite by 蘭 + sci_write( data_api, (byte)(len+4) ); + ret=len+3; + #else + check = sci_write_check(); // 以降 checkはシリアルバッファ確認に使用する + /*シリアルデータ送信 */ + if( check > 0 ){ + if( sci_write( data_api, (byte)(len+4) ) == 0 ){ + /* シリアルリセット */ + #ifndef H3694 + #ifndef ARDUINO + #ifndef ARM_MBED // PC + wait_millisec( 100 ); + close_serial_port(); // シリアルを閉じる + wait_millisec( 300 ); printf("RESET serial\n"); - } - wait_millisec( 300 ); - sci_write( data_api, (byte)(len+4) ); // 再送信 + while( sci_init( xbee_com_port )==0){ // 再度オープン + wait_millisec( 3000 ); + close_serial_port(); // シリアルを閉じる + wait_millisec( 3000 ); + printf("RESET serial\n"); + } + wait_millisec( 300 ); + sci_write( data_api, (byte)(len+4) ); // 再送信 + #endif + #endif + #endif + } + ret=len+3; + }else{ + #ifdef H3694 + led_red( 1 ); #endif + #ifdef ERRLOG + strcopy( ERR_LOG , "ERR:TX Buffer Over" ); + ERR_CODE = check; #endif - #endif + ret=0; } - ret=len+3; - }else{ - #ifdef H3694 - led_red( 1 ); - #endif - #ifdef ERRLOG - strcopy( ERR_LOG , "ERR:TX Buffer Over" ); - ERR_CODE = check; - #endif - ret=0; - } + #endif } #else // XBEE_WIFI switch( at[0] ){ @@ -1942,33 +2027,31 @@ len++; } } - #ifdef XBEE_WIFI - if(DEVICE_TYPE == XB_TYPE_WIFI20){ - #ifdef DEBUG - printf("DEBUG:TX_10(%3d):",len); - for(i=0;i<len;i++) printf("%02X,",data_api[i]); - printf("\n"); - #endif - len+=6; - if( len <= API_TXSIZE ){ - for(i=len-6; i>0; i--){ - data_api[i+5]=data_api[i-1]; - } - data_api[0]=0x42; - data_api[1]=0x42; - data_api[2]=0x0; - data_api[3]=0x0; - data_api[4]=0x0; - data_api[5]=0x0; + if(DEVICE_TYPE == XB_TYPE_WIFI20){ + #ifdef DEBUG + printf("DEBUG:TX_10(%3d):",len); + for(i=0;i<len;i++) printf("%02X,",data_api[i]); + printf("\n"); + #endif + len+=6; + if( len <= API_TXSIZE ){ + for(i=len-6; i>0; i--){ + data_api[i+5]=data_api[i-1]; } - #ifdef DEBUG - printf("DEBUG:TX_20(%3d):",len); - for(i=0;i<len;i++) printf("%02X,",data_api[i]); - printf("\n"); - #endif + data_api[0]=0x42; + data_api[1]=0x42; + data_api[2]=0x0; + data_api[3]=0x0; + data_api[4]=0x0; + data_api[5]=0x0; } - #endif - if( sci_write_check() > 0 ){ + #ifdef DEBUG + printf("DEBUG:TX_20(%3d):",len); + for(i=0;i<len;i++) printf("%02X,",data_api[i]); + printf("\n"); + #endif + } + if( sci_write_check() > 0 ){ // XBEE_WIFIなのでifdef LITEは不要 #ifdef XBEE_WIFI_DEBUG Serial.print("TX udp size="); Serial.print(len); @@ -2028,16 +2111,20 @@ byte len; // APIサービス長-3 (APIフレームの前3バイトとチェックサム1バイトを除く) #ifndef XBEE_WIFI unsigned int leni; // 実際のAPIサービス長と使用するAPIサービス長の差(データ破棄用) - byte check = 0xFF; // チェックサム + byte check = 0xFF; // チェックサム #endif byte ret=0; /* 受信処理 */ - #ifndef XBEE_WIFI + #ifndef XBEE_WIFI // ZigBee data[0] = sci_read( 1 ); // 1ms待ち受けで受信 if( data[0] == 0x7E ) { // 期待デリミタ0x7E時 for( i=1;i<=2;i++ ){ - data[i] = sci_read( 50 ); + #ifdef LITE // BeeBee Lite by 蘭 + data[i] = sci_read( 35 ); // 1割だけ緩和しました。sci_read 32⇒35(Wataru) + #else + data[i] = sci_read( 50 ); + #endif } if(data[1] == 0x00) len = data[2]; else len = 0xFF - 4; // API長が255バイトまでの制約(本来は64KB) @@ -2045,7 +2132,11 @@ leni = (unsigned int)data[1] * 256 + (unsigned int)data[2] - (unsigned int)len; // 通常は0。lenが本来の容量よりも少ない場合に不足分が代入されれる for( i=0 ; i <= len ; i++){ // i = lenはチェックサムを入力する - data[i+3] = sci_read( 50 ); + #ifdef LITE // BeeBee Lite by 蘭 + data[i+3] = sci_read( 35 ); // 1割だけ緩和しました。sci_read 32⇒35(Wataru) + #else + data[i+3] = sci_read( 50 ); + #endif if( i != len) check -= data[i+3]; // チェックサムのカウント } while( leni > 0 ){ @@ -2239,7 +2330,7 @@ /* (ドライバ)GPIO入力データの計算部 */ byte xbee_gpi_acum( byte *data ){ -/* リモート先(ADR_FROMに入力)のGPIOの入力値を応答する。 +/* リモート先(ADR_FROMに入力)のGPIOの入力値(下位バイト)を応答する。 リモート先は(こちらから呼ばなくても)GPIOの変化などで自動送信する設定にしておく必要がある。 具体的にはリモート先をATIC設定するなど。本演算関数はxbee_rx_callから呼ばれる。 port: port指定 IO名 ピン番号 USB評価ボード(XBIB-U-Dev) @@ -2256,16 +2347,18 @@ port1~7のDIOとADC1~3が全て無効で電源電圧検出ADCが有効であれば電圧を応答します。(要確認) 未対応:電源電圧ADCの範囲と単位を要確認。必要に応じて値を変換する必要がある。 mode = MODE_GPIN(0x92) GPI data + + data[17]:mask(下位) */ byte ret=0xFF; - if( ( data[3] == MODE_GPIN ) && ( data[17] != 0x00 ) ){ // data[3]:MODE_GPIN(92) data[17]:mask(下位) + if( data[3] == MODE_GPIN ){ // data[3]:MODE_GPIN(92) if( xbee_from_acum( data ) > 0 ){ // 差出人をグローバル変数へ if( (data[17]&0xFE) != 0x00 ){ // DIO(port 1~7)がある時 ret = (data[17] & data[20]); // 20:DIOデータ(下位バイト) 17:マスク }else if( (data[18]&0x8E) != 0 ){ // ADCがあるとき if( data[16] == 0x00 && data[17] == 0x00 ){ // DIOが全てマスクされているとき - ret = (data[19]<6) | (data[20]>2); // 21:ADCデータ(上位)、22:下位 + ret = (data[19]<6) | (data[20]>2); // 19:ADCデータ(上位)、20:下位 }else{ // ret = (data[21]<6) | (data[22]>2); // 21:ADCデータ(上位)、22:下位 } @@ -2285,7 +2378,7 @@ #endif #ifdef ERRLOG strcopy( ERR_LOG , "ERR:xbee_gpi mode" ); - ERR_CODE = MODE_GPIN; + ERR_CODE = data[3]; #endif } #ifdef DEBUG_RX @@ -2308,14 +2401,16 @@ */ #ifdef DEBUG_RX byte i; // DEGUG用 + byte len; #endif - byte len; byte ret=0; if( data[3] == 0x90 ){ // data[3]:データ種別=ZigBee Recieve Packet if( xbee_from_acum( data ) > 0 ){ ret = data[15]; // 15:データ1文字 ※Digi仕様書P100記載誤り - len = data[2]-0x0C; // 12バイト減算 + #ifdef DEBUG_RX + len = data[2]-0x0C; // 12バイト減算 + #endif }else{ #ifdef H3694 led_red( 1 ); @@ -2328,7 +2423,9 @@ }else if( data[3] == 0x91 ){ // data[3]:データ種別=ZigBee Explict Rx Indicator if( xbee_from_acum( data ) > 0 ){ ret = data[21]; // 14:データ1文字 - len = data[2]-0x12; // 18バイト減算 + #ifdef DEBUG_RX + len = data[2]-0x12; // 18バイト減算 + #endif }else{ #ifdef H3694 led_red( 1 ); @@ -2385,12 +2482,16 @@ byte err,retry; byte r_dat = 10; // AT=0、RAT=10、TX=未定 リモートATと通常ATの応答値dataの代入位置の差 byte r_at = 1; // AT=0、RAT=1 リモートの可否 + #ifndef XBEE_WIFI // ZigBee unsigned int wait_add = 0; + #endif #ifdef CACHE_RES byte i; #endif - sci_write_check(); + #ifndef LITE // BeeBee Lite by 蘭 + sci_write_check(); + #endif #ifdef H3694 sci_clear(); #endif @@ -2476,8 +2577,6 @@ } } } - if( at[0] == 'A' && at[1] == 'T' && at[2] == 'W' && at[3] == 'R' ) wait_add = 100; // ATWR 110~1100ms - else if ( at[0] == 'R' && at[1] == 'A' && at[2] == 'T' && at[3] == 'W' && at[4] == 'R' ) wait_add = 100; // RATWR 120~1200ms if( xbee_at_tx( at ,data ,len ) > 0){ err = 12; // 受信なしエラー for( retry = 10 ; ( retry > 0 && err != 0 ) ; retry-- ){ @@ -2583,102 +2682,6 @@ return( !err ); } -/* (ドライバ)XBeeモジュールのリセット */ -byte xbee_reset( void ){ - byte value[API_SIZE]; - value[0] = 0x00; - byte i; - byte ret; // 戻り値 0:異常終了 - - #ifndef XBEE_WIFI - sci_write_check(); - sci_clear(); // シリアル異常をクリア - DEVICE_TYPE = 0x20; // タイプ名を初期化 - #endif - wait_millisec(100); - for( i=1 ; i< 4 ; i++){ - #ifndef XBEE_WIFI // ZigBee - ret = xbee_tx_rx( "ATVR", value ,0 ); - #else - ret=1; - #endif - if( ret > 0){ - #ifndef XBEE_WIFI - DEVICE_TYPE = value[8]; - if( DEVICE_TYPE != ZB_TYPE_COORD && - DEVICE_TYPE != ZB_TYPE_ROUTER && - DEVICE_TYPE != ZB_TYPE_ENDDEV){ // VRの確認 - #ifdef LCD_H - lcd_cls(); - #ifdef H3694 - led_red( 1 ); - #endif - lcd_putstr( "EXIT:XBEE NOT IN API MODE" ); - #endif - #ifdef H3694 - while(1); - #elif ARDUINO - while(1); - #else - exit(-1); - #endif - } - #else // XBEE_WIFI - DEVICE_TYPE = XB_TYPE_NULL; - #endif - }else{ - if( i == 3 ){ - #ifdef LCD_H - lcd_cls(); - #ifdef H3694 - led_red( 1 ); - #endif - lcd_putstr( "EXIT:NO RESPONCE FROM XBEE" ); - #endif - #ifdef H3694 - while(1); - #elif ARDUINO - while(1); - #else - exit(-1); - #endif - } - wait_millisec(1000); - } - } - #ifndef XBEE_WIFI - wait_millisec(100); - ret = xbee_tx_rx( "ATFR", value ,0 ); - if( ret == 0){ - #ifdef LCD_H - lcd_cls(); - #ifdef H3694 - led_red( 1 ); - #endif - lcd_putstr( "EXIT:CANNOT RESET XBEE" ); - #endif - #ifdef H3694 - while(1); - #elif ARDUINO - while(1); - #else - exit(-1); - #endif - } - wait_millisec(3000); // リセット指示後3秒後に起動 - sci_clear(); // 再起動のメッセージをクリア - // while( xbee_at_rx( value ) == 0 ); // パケットの破棄(永久ループの懸念がある) - value[0] = 0x01; // API MODE=1に設定 - xbee_tx_rx("ATAP", value , 1 ); - value[0] = 0x05; // RSSI LEDを点灯 - xbee_tx_rx("ATP0", value , 1 ); - wait_millisec(500); - value[0] = 0x01; // RSSI LEDを受信強度に戻す - xbee_tx_rx("ATP0", value , 1 ); - #endif - return( ret ); -} - /*********************************************************************** XBee用 UART出力API byte xbee_putch( const char c ); @@ -2691,13 +2694,15 @@ void xbee_log( const byte level, const char *err , const byte x ); ***********************************************************************/ +#ifndef LITE // BeeBee Lite by 蘭 byte xbee_putch( const char c ){ byte data[2]; byte len; data[0] = (byte)c; - if( xbee_at_tx( "TX", data , 1) == 0 ) len=0; + if( xbee_at_tx( "TX", data , 1) == 0 ) len=0; else len=1; return( len ); } +#endif byte xbee_putstr( const char *s ){ /* @@ -2705,10 +2710,10 @@ 入力:char *s 出力:送信データ長を応答。0の場合は異常 */ - byte data[API_TXSIZE-17]; // 17バイトはAPIヘッダなのでデータ長は-17する + byte data[API_TXSIZE-17]; // 17バイトはAPIヘッダ+CRC1バイトなのでデータ長は[API_TXSIZE-18]+null文字で+1する-17 byte i; - for(i=0; (i< (API_TXSIZE-17) ) && (s[i] != 0x00) ; i++){ + for(i=0; (i< (API_TXSIZE-18) ) && (s[i] != 0x00) ; i++){ // データ長はAPI_TXSIZE-18 data[i] = (byte)s[i]; // テキストデータをバイナリデータ(バイト値)に変換する } data[i] = 0x00; @@ -2716,6 +2721,7 @@ return( i ); } +#ifndef LITE // BeeBee Lite by 蘭 void xbee_disp_hex( const byte i ){ byte data[3]; data[0] = i&0xF0; @@ -2790,6 +2796,7 @@ xbee_putstr( s ); }else xbee_putstr("XXXXX"); } +#endif // LITE void xbee_log(const byte level, const char *err, const byte x ){ /* @@ -2899,6 +2906,124 @@ XBee用 各種制御 入出力定義を変更した場合は履歴に記載します ***********************************************************************/ +byte xbee_reset( void ){ +/* XBeeモジュールのリセット + 戻り値:0=エラー、強制終了あり(PC版)、無限定しあり(H8版) +*/ + #ifndef LITE // BeeBee Lite by 蘭 + byte i; + #endif + byte ret=0; // 戻り値 0:異常終了 + #ifndef XBEE_WIFI // ZigBee + byte value[API_SIZE]; + value[0] = 0x00; + #endif + + #ifndef XBEE_WIFI + #ifndef LITE // BeeBee Lite by 蘭 + sci_write_check(); + #endif + sci_clear(); // シリアル異常をクリア + DEVICE_TYPE = 0x20; // タイプ名を初期化 + #endif + + #ifdef LITE // BeeBee Lite by 蘭 + ret = xbee_tx_rx( "ATVR", value ,0 ); // ZigBee 種類の取得 + if( ret == 0 ){ + #ifdef ARDUINO + return(0); + #else + exit(-1); + #endif + }else{ + DEVICE_TYPE = value[8]; + } // LITEはリセットしない + #else // normal + wait_millisec(100); + for( i=1 ; i< 4 ; i++){ + #ifndef XBEE_WIFI // ZigBee + ret = xbee_tx_rx( "ATVR", value ,0 ); + #else + ret = 1; + #endif + if( ret > 0){ + #ifndef XBEE_WIFI + DEVICE_TYPE = value[8]; + if( DEVICE_TYPE != ZB_TYPE_COORD && + DEVICE_TYPE != ZB_TYPE_ROUTER && + DEVICE_TYPE != ZB_TYPE_ENDDEV){ // VRの確認 + #ifdef LCD_H + lcd_cls(); + #ifdef H3694 + led_red( 1 ); + #endif + lcd_putstr( "EXIT:XBEE NOT IN API MODE" ); + #endif + #ifdef H3694 + return(0); + #elif ARDUINO + return(0); + #else + exit(-1); + #endif + } + #else // XBEE_WIFI + DEVICE_TYPE = XB_TYPE_NULL; + #endif + }else{ + if( i == 3 ){ + #ifdef LCD_H + lcd_cls(); + #ifdef H3694 + led_red( 1 ); + #endif + lcd_putstr( "EXIT:NO RESPONCE FROM XBEE" ); + #endif + #ifdef H3694 + return(0); + #elif ARDUINO + return(0); + #else + exit(-1); + #endif + } + wait_millisec(1000); + } + } + #ifndef XBEE_WIFI // ZigBee + wait_millisec(100); + ret = xbee_tx_rx( "ATFR", value ,0 ); + if( ret == 0){ + #ifdef LCD_H + lcd_cls(); + #ifdef H3694 + led_red( 1 ); + #endif + lcd_putstr( "EXIT:CANNOT RESET XBEE" ); + #endif + #ifdef H3694 + return(0); + #elif ARDUINO + return(0); + #else + exit(-1); + #endif + } + wait_millisec(3000); // リセット指示後3秒後に起動 + sci_clear(); // 再起動のメッセージをクリア + // while( xbee_at_rx( value ) == 0 ); // パケットの破棄(永久ループの懸念がある) + value[0] = 0x01; // API MODE=1に設定 + xbee_tx_rx("ATAP", value , 1 ); + value[0] = 0x05; // RSSI LEDを点灯 + xbee_tx_rx("ATP0", value , 1 ); + wait_millisec(500); + value[0] = 0x01; // RSSI LEDを受信強度に戻す + xbee_tx_rx("ATP0", value , 1 ); + #endif + #endif // LITE + return( ret ); +} + byte xbee_myaddress( byte *address ){ /* 自分自身のIEEEアドレスを取得する / XBee Wifi(PC)の場合は設定する @@ -2966,8 +3091,14 @@ */ byte i; - #ifndef XBEE_WIFI + #ifndef XBEE_WIFI // XBee ZB用 for(i=0; i< 8 ;i++ ) ADR_DEST[i] = address[i]; + #ifndef ARDUINO + #ifndef ARM_MBED + SADR_DEST[0] = 0xFF; + SADR_DEST[1] = 0xFE; + #endif + #endif #else // XBEE_WIFI #ifdef ARDUINO for( i=0;i<4;i++) ADR_DEST[i] = address[i]; @@ -2999,6 +3130,17 @@ #endif } +#ifndef XBEE_WIFI +#ifndef ARDUINO +#ifndef ARM_MBED +void xbee_short_address(const byte *address){ + SADR_DEST[0] = address[0]; + SADR_DEST[1] = address[1]; +} +#endif +#endif +#endif + byte xbee_atd( const byte *address ){ /* 送信用の宛先アドレス設定用の関数 XBeeへの設定 @@ -3239,7 +3381,6 @@ char *in = 入力するATコマンド 例: ATDL0000FFFF 最大文字数は XB_AT_SIZE-1 出力:ATコマンドの結果 STATUS_OK / STATUS_ERR / STATUS_ERR_AT / STATUS_ERR_PARM / STATUS_ERR_AIR 0xFFで送信失敗もしくはデータ異常 - ratはエラーが複数あるので正常時がNULL */ byte i; char at[6]; @@ -3251,7 +3392,7 @@ if( in[0]=='A' && in[1]=='T' ){ if( bytecmp(null_adr,address,8) == 0 ){ - // xbee_atから呼ばれた場合 ATxx_ + // xbee_atから呼ばれた場合 ATxx_;ローカルAT com_len = 4; // 入力ATコマンド長 ATxx 4 at[0]='A'; at[1]='T'; if( in[2] == '\0' ){ @@ -3261,7 +3402,7 @@ } at[4]='\0'; }else{ - // リモートat(xbee_rat)指定で呼び出された場合 RATxx_ + // リモートat(xbee_rat)指定で呼び出された場合 RATxx_;実際のリモートAT com_len = 4; // 入力ATコマンド長 ATxx 4 at[0]='R'; at[1]='A'; at[2]='T'; // アプリ呼び出しにつき、ATの後に何もない場合が想定される。その時はATDDとみなす @@ -3271,21 +3412,32 @@ at[3]=in[2]; at[4]=in[3]; } at[5]='\0'; - xbee_address(address); } }else if( in[0]=='R' && in[1]=='A' && in[2]=='T' ){ com_len = 5; // 入力ATコマンド長 RATxx 5 at[0]='R'; at[1]='A'; at[2]='T'; at[3]=in[3]; at[4]=in[4]; at[5]='\0'; - xbee_address(address); }else if( in[0]=='T' && in[1]=='X' ){ com_len = 2; // 入力ATコマンド長 TX 2 at[0]='T'; at[1]='X'; at[2]='\0'; - xbee_address(address); } + #ifndef ARDUINO + #ifndef ARM_MBED + else if(in[0]=='Z' && in[1]=='C'){ + com_len = 2; // 入力ATコマンド長 TX 2 + at[0]='Z'; at[1]='C'; + at[2]='\0'; + if( SADR_DEST[0]==0xFF && SADR_DEST[1] == 0xFE) xbee_address(address); + len = text2hex4data( data, in , com_len); + if( xbee_at_tx( at, data ,len ) > 0 ) ret=0; + com_len = 0; + } + #endif + #endif if( com_len > 0 ){ + if( at[0] != 'A' && SADR_DEST[0] == 0xFF && SADR_DEST[1] == 0xFE) xbee_address(address); len = text2hex4data( data, in , com_len); // test // printf("xbee_tx_rx %s len=%d\n",at,len); @@ -3398,7 +3550,7 @@ return( ret ); } -byte xbee_bytes(const byte *address, const byte *in, const byte len){ +byte xbee_bytes(const byte *address, const byte *in, byte len){ /* 入力:byte *address = 宛先(子機)アドレス byte *in = 送信するバイナリ情報。最大文字数はAPI_TXSIZE-1 @@ -3409,9 +3561,14 @@ #ifdef LCD_H xbee_log( 1, "started:xbee_bytes" , 1 ); - if(len > API_TXSIZE-17 ) xbee_log( 3, "CAUTION:xbee_bytes length" , len ); #endif xbee_address( address ); // 宛先のアドレスを設定 + if(len > API_TXSIZE-18 ){ + #ifdef LCD_H + xbee_log( 3, "CAUTION:xbee_bytes length" , len ); + #endif + len = API_TXSIZE-18; + } if( xbee_at_tx( "TX", in , len) > 0 ) ret = PACKET_ID; #ifdef LCD_H xbee_log( 1, "done:xbee_bytes" , 1 ); @@ -3422,11 +3579,11 @@ byte xbee_atvr( void ){ /* XBeeのデバイスタイプを取得するコマンド - 出力:戻り値= define値 ZB_TYPE_COORD、ZB_TYPE_ROUTER、ZB_TYPE_ENDDEV + 出力:戻り値= define値 ZB_TYPE_COORD、ZB_TYPE_ROUTER、ZB_TYPE_ENDDEV、0xFF=エラー */ #ifndef XBEE_WIFI byte data[API_SIZE]; - byte ret; + byte ret=0xFF; if( xbee_tx_rx( "ATVR", data ,0 ) > 0){ DEVICE_TYPE = data[8]; @@ -3537,7 +3694,7 @@ #ifndef XBEE_WIFI byte data[API_SIZE]; byte i; - unsigned short pan_id_s; + unsigned short pan_id_s=0xFFFF; for( i=0 ; i<8 ; i++ ) pan_id[i] = 0x00; #ifdef LCD_H @@ -3758,7 +3915,9 @@ xbee_log( 1, "Found device " , ret ); #endif for(i=0;i<8;i++) ADR_DEST[i]=ADR_FROM[i]; // 宛先を発見デバイスに設定 - sci_write_check(); + #ifndef LITE // BeeBee Lite by 蘭 + sci_write_check(); + #endif sci_clear(); }else ret=0x00; } @@ -4047,6 +4206,7 @@ /* 子機XBeeデバイス(リモート先)のGPIOへ出力する関数 portは1~4と11~12が指定できる→port0~7と10~12に拡大 +出力:byte 戻り値 = 送信パケット番号PACKET_ID。0x00は失敗。 port: port指定 IO名 ピン番号 USB評価ボード(XBIB-U-Dev) port= 0 DIO0 XBee_pin 20 (Cms) SW1 Commision port= 1 DIO1 XBee_pin 19 (AD1) SW2 @@ -4056,7 +4216,6 @@ port=10 DIO10 XBee_pin 6 RSSI port=11 DIO11 XBee_pin 7 LED2 ※port11がLED2 port=12 DIO12 XBee_pin 4 LED1 ※port12がLED1 - out: out=0 L出力 out=1 H出力 */ char at[6]; byte data[API_SIZE]; @@ -4403,7 +4562,7 @@ #endif xbee_reset(); // リセットに約3秒がかかる #ifdef LCD_H - xbee_log( 3, "XBee Restarted\r\n" , 0 ); + xbee_log( 3, "XBee Restarted" , TIMER_ERR ); #endif #ifdef H3694 led_red( 0 ); @@ -4421,9 +4580,11 @@ for( i=0 ; i<2 ; i++ ) xbee_result->SHORT[i] = 0x00; #endif #endif - for( i=0 ; i<2 ; i++ ) xbee_result->AT[i] = 0xFF; + for( i=0 ; i<2 ; i++ ){ + xbee_result->AT[i] = 0xFF; + xbee_result->GPI.BYTE[i] = 0xFF; + } xbee_result->STATUS = 0xFF; - for( i=0 ; i<2 ; i++ ) xbee_result->GPI.BYTE[i] = 0xFF; for( i=1 ; i<4 ; i++ ) xbee_result->ADCIN[i] = (unsigned int)(0xFFFF); xbee_result->ADCIN[0] = 0; #ifndef ARDUINO @@ -4464,7 +4625,9 @@ for(i=0;i<2;i++) xbee_result->SHORT[i] = data[13+i];// アドレスはdata[13]から #endif #endif - for( i=0 ; i<2 ; i++ ) xbee_result->AT[i] = data[15+i]; // ATはdata[15]から + // for( i=0 ; i<2 ; i++ ) xbee_result->AT[i] = data[15+i]; // ATはdata[15]から + xbee_result->AT[0] = data[15]; + xbee_result->AT[1] = data[16]; xbee_result->ID = data[4]; // PACKET_ID xbee_result->STATUS = data[17]; // statusはdata[17] ret = data[17]; @@ -4536,7 +4699,7 @@ if( (data[18]>>7) & 0x01 ){ xbee_result->ADCIN[0] = xbee_batt_acum(data[29-2*j],data[30-2*j]); } - + // xbee_result->DATA[10]=data[2]; // 仮(受信バイト数を確認するため) break; case MODE_UART: // 0x90 UART data を受信するモード 戻り値はlength for(i=0;i<8;i++) xbee_result->FROM[i] = data[4+i]; // アドレスはdata[4]から @@ -4554,6 +4717,7 @@ xbee_result->STATUS = data[14]; } break; + #ifndef LITE // BeeBee Lite by 蘭 case MODE_UAR2: // 0x91 UART data 2を受信するモード for(i=0;i<8;i++) xbee_result->FROM[i] = data[4+i]; // アドレスはdata[4]から #ifndef ARDUINO @@ -4570,6 +4734,8 @@ // xbee_result->DATA[i] = 0x00; } break; + #endif // LITE + #ifndef LITE // BeeBee Lite by 蘭 case MODE_SENS: // 0x94 XB Sensor(1-wire)を受信するモード(未確認) for(i=0;i<8;i++) xbee_result->FROM[i] = data[4+i]; // アドレスはdata[4]から #ifndef ARDUINO @@ -4584,14 +4750,28 @@ for( i=0; i<10 ; i++ ) xbee_result->DATA[i] = data[16+i]; xbee_result->DATA[10] = data[16+i]; // sensor 01:ADC 02:Temp. 60:water present break; - case MODE_IDNT: // 0x95 Node Identifyを受信するモード(モードのみ応答) + #endif // LITE + case MODE_IDNT: // 0x95 Node Identifyを受信するモード for(i=0;i<8;i++) xbee_result->FROM[i] = data[4+i]; // アドレスはdata[4]から #ifndef ARDUINO #ifndef ARM_MBED for(i=0;i<2;i++) xbee_result->SHORT[i] = data[12+i]; // アドレスはdata[12]から + for(i=0;i<CALL_SIZE && i<20;i++){ + xbee_result->DATA[i] = data[15+i]; + /* + 0 15 Source 16-bit address + 2 17 64-bit Network address + 10 25 NI Strings + 12 27 Parent address + 14 29 Device Type + 15 30 Source Event + 16 31 Profile ID C1 05 + 18 33 Manufacture ID 10 1F + */ + } #endif #endif - xbee_result->STATUS = data[14]; // statusはdata[14] + xbee_result->STATUS = data[14]; // // statusはdata[14] 0x01=Ack 0x02=broadcast ret = data[14]; switch(data[29]){ case 0x00: ret=ZB_TYPE_COORD; break; @@ -4600,7 +4780,9 @@ } break; case MODE_RES: // 0x88 ローカルATコマンドの結果を受信(モードのみ応答) - for( i=0 ; i<2 ; i++ ) xbee_result->AT[i] = data[5+i]; // ATはdata[15]から + // for( i=0 ; i<2 ; i++ ) xbee_result->AT[i] = data[5+i]; // ATはdata[15]から + xbee_result->AT[0] = data[5]; + xbee_result->AT[1] = data[6]; xbee_result->ID = data[4]; // Frame ID xbee_result->STATUS = data[7]; // statusはdata[7] ret = data[7]; @@ -4612,6 +4794,12 @@ case MODE_TXST: // 0x8B UART Transmit Status を受信 xbee_result->STATUS = data[8]; // delivery statusはdata[8] 0x00=Success ret = data[9]; // Discovery status data[9] + #ifndef ARDUINO + #ifndef ARM_MBED + case 0x00: + break; + #endif + #endif default: #ifdef LCD_H xbee_log( 3, "CAUTION:recieved unknown pckt" , xbee_result->MODE ); @@ -4628,7 +4816,9 @@ } void xbee_clear_cache(void){ - CACHE_COUNTER=0; + #ifdef CACHE_RES + CACHE_COUNTER=0; + #endif } #ifdef EASY_SENSOR @@ -4664,9 +4854,9 @@ if( xbee_tx_rx("RATIS", data , 0) > 0 ){ if( data[3]==MODE_RESP ){ // d[3] flame ID = 97(RAT応答) if( data[19] == 0x00 && data[20] == 0x00 ) j = 0; else j = 2; - xbee_result.ADC[1] = (unsigned int)data[22+j] * 256 + (unsigned int)data[23+j]; - xbee_result.ADC[2] = (unsigned int)data[24+j] * 256 + (unsigned int)data[25+j]; - xbee_result.ADC[3] = (unsigned int)data[26+j] * 256 + (unsigned int)data[27+j]; + xbee_result.ADCIN[1] = (unsigned int)data[22+j] * 256 + (unsigned int)data[23+j]; + xbee_result.ADCIN[2] = (unsigned int)data[24+j] * 256 + (unsigned int)data[25+j]; + xbee_result.ADCIN[3] = (unsigned int)data[26+j] * 256 + (unsigned int)data[27+j]; ret = xbee_sensor_result( &xbee_result, type ); } } @@ -4677,16 +4867,16 @@ } #endif // EASY_SENSOR -void xbee_init( const byte port ){ - #ifdef LCD_H - byte i; - #endif - #ifndef H3694 - #ifndef ARDUINO - byte j,k; - #endif - #endif - +byte xbee_init( const byte port ){ +/* + port:PCの場合、オープンするシリアルポート番号 + Arduinoの場合リトライ回数、0で永久にリトライを繰り返す + 戻り値:0=エラー 1=成功までのトライ回数 + Arduino版 portが0で無い時は、portの指定回数リトライしてエラーでもreturnする +*/ + byte i=1; // iはリセット実行リトライ回数、0で成功するまで永久 + byte j; // jは色々 + byte k=0; // kはリセット成功可否フラグ,戻り値 #ifndef LITE #ifndef XBEE_WIFI byte address[8]; //={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; @@ -4707,12 +4897,15 @@ #ifdef H3694 sci_init( 0 ); // シリアル初期化 + i=port; #elif ARDUINO sci_init( 0 ); // シリアル初期化 + i=port; #else #ifdef ARM_MBED sci_init( 0 ); // シリアル初期化 _xbee_time_init(); // Initialize Timer + i=port; #else // PC if( port != 0 ){ j = sci_init( port ); // シリアル初期化 @@ -4730,6 +4923,7 @@ fprintf(stderr,"EXIT:Serial Open Error\n"); exit(-1); } + i=1; #endif #endif @@ -4737,12 +4931,12 @@ #ifndef ARDUINO #ifdef H3694 lcd_enable( 1 ); // 液晶の電源投入 - wait_millisec_250(15); // 起動待ち + wait_millisec(15); // 起動待ち lcd_init(); // 液晶制御ICのプレ初期化 #endif #endif - wait_millisec_250(15); // 初期化待ち - lcd_init(); // 2回目の初期化(確実な初期化) + wait_millisec(15); // 初期化待ち + lcd_init(); // 2回目の初期化(確実な初期化) #ifndef ARDUINO lcd_control(1,0,0); // 液晶制御 表示ON,カーソルOFF,点滅OFF #endif @@ -4758,66 +4952,94 @@ #else lcd_putch('\n'); #endif - lcd_putstr("by Wataru KUNINO"); + #ifdef LITE + lcd_putstr(COPYRIGHT); + lcd_putch('\n'); + #else + lcd_putstr(COPYRIGHT); + #endif xbee_log( 1, "xbee_reset" , 0 ); #endif - xbee_reset(); - #ifdef LCD_H - #ifdef H3694 - lcd_cls(); - lcd_goto(LCD_ROW_1); - #else - lcd_putstr("\n--------------------\n"); + #ifdef LITE // by 蘭 + k = xbee_reset(); + #ifndef H3694 + #ifndef ARDUINO + #ifndef ARM_MBED // PC + if(k==0){ + #ifdef LCD_H + xbee_log( 5, "EXIT:xbee_init:myaddress" , 0 ); + #endif + exit(-1); + } + #endif + #endif #endif - #endif - #ifndef LITE - #ifdef LCD_H - xbee_log( 1, "xbee_init:myaddress" , port ); - #endif - if( xbee_myaddress( address ) == 0 ){ // 自分のアドレスの取得 + #else // Normal mode + k=1; + if(i==0) while( !xbee_reset() ) wait_millisec(1000); + else for(j=0;j<i;j++){ + k=xbee_reset(); // 0だとシリアル異常 + if( k ) break; + wait_millisec(1000); + } + if(k==0){ + #ifndef H3694 + #ifndef ARDUINO + #ifndef ARM_MBED // PC + #ifdef LCD_H + xbee_log( 5, "EXIT:xbee_init:myaddress" , 0 ); + #endif + exit(-1); + #endif + #endif + #endif + }else{ // k>0 すなわち reset成功時 以下、kは使用しないこと(戻り値にする) + #ifdef LCD_H + #ifdef H3694 + lcd_cls(); + lcd_goto(LCD_ROW_1); + #else + lcd_putstr("\n--------------------\n"); + #endif + #endif #ifdef LCD_H - xbee_log( 5, "EXIT:xbee_init:myaddress" , 0 ); + xbee_log( 1, "xbee_init:myaddress" , port ); #endif - #ifdef H3694 - while(1); - #elif ARDUINO - while(1); - #else // PC - exit(-1); + xbee_myaddress( address ); // 自分自身のアドレスを取得 + #ifdef LCD_H + for(i=0;i<4;i++){ + #ifndef XBEE_WIFI + lcd_disp_hex(address[4+i]); + #else // XBEE_WIFI + /* + printf("%d",address[i]); + if(i<3)printf("."); + */ + lcd_disp_hex(address[i]); + #endif + } + switch( DEVICE_TYPE ){ + #ifndef XBEE_WIFI + case ZB_TYPE_COORD: lcd_putstr( " COORD."); break; + case ZB_TYPE_ROUTER: lcd_putstr( " ROUTER"); break; + case ZB_TYPE_ENDDEV: lcd_putstr( " ENDDEV"); break; + #else + case XB_TYPE_NULL: lcd_putstr( " XBee Wi-Fi"); break; + case XB_TYPE_WIFI10: lcd_putstr( " XBee Wi-Fi Ver 1.0"); break; + case XB_TYPE_WIFI20: lcd_putstr( " XBee Wi-Fi Ver 2.0"); break; + #endif + default: lcd_putstr( " UNKNWON"); break; + } + #ifdef H3694 + lcd_goto(LCD_ROW_1); + #else + lcd_putstr("\n\n"); + #endif + xbee_log( 1, "done:xbee_init" , 0 ); #endif } - #ifdef LCD_H - for(i=0;i<4;i++){ - #ifndef XBEE_WIFI - lcd_disp_hex(address[4+i]); - #else // XBEE_WIFI - /* - printf("%d",address[i]); - if(i<3)printf("."); - */ - lcd_disp_hex(address[i]); - #endif - } - switch( DEVICE_TYPE ){ - #ifndef XBEE_WIFI - case ZB_TYPE_COORD: lcd_putstr( " COORD."); break; - case ZB_TYPE_ROUTER: lcd_putstr( " ROUTER"); break; - case ZB_TYPE_ENDDEV: lcd_putstr( " ENDDEV"); break; - #else - case XB_TYPE_NULL: lcd_putstr( " XBee Wi-Fi"); break; - case XB_TYPE_WIFI10: lcd_putstr( " XBee Wi-Fi Ver 1.0"); break; - case XB_TYPE_WIFI20: lcd_putstr( " XBee Wi-Fi Ver 2.0"); break; - #endif - default: lcd_putstr( " UNKNWON"); break; - } - #ifdef H3694 - lcd_goto(LCD_ROW_1); - #else - lcd_putstr("\n\n"); - #endif - xbee_log( 1, "done:xbee_init" , 0 ); - #endif #endif + return(k); } @@ -4893,6 +5115,7 @@ return( ret ); } +#ifndef LITE byte _xbee_i2c(byte dio,byte level,byte *data){ /* dio = 11:SCL 12:SDA level = 0:L 1:Open @@ -5102,4 +5325,44 @@ } return(ret); } +#endif // LITE +byte xbee_delay(unsigned int ms){ +/* +待ち時間。受信値はバッファへ保存します。 +入力:unsigned int(shortを想定) ms = 時間[ms] +戻り値:受信パケット数 +*/ + #ifdef LITE // BeeBee Lite by 蘭 + wait_millisec( ms ); + return 0; + #else + byte i,ret=0; + byte data[API_SIZE]; + + while(ms>0){ + #ifdef CACHE_RES + if( CACHE_COUNTER < CACHE_RES ){ + if( xbee_at_rx( data ) > 0){ + for( i=0 ; i < API_SIZE ; i++) CACHE_MEM[CACHE_COUNTER][i] = data[i]; + CACHE_COUNTER++; + ret++; + #ifdef DEBUG + lcd_putstr("### CACHE_RES ### <- "); // DEBUG + lcd_disp_hex( CACHE_COUNTER ); + lcd_putch('\n'); + #endif + } + } + #endif + if( ms > 100 ){ + wait_millisec( 100 ); + ms -= 100; + }else{ + wait_millisec( ms ); + ms = 0; + } + } + return(ret); + #endif +}
--- a/xbee/xbee.h Sun Jun 22 06:13:19 2014 +0000 +++ b/xbee/xbee.h Sun Sep 21 02:30:40 2014 +0000 @@ -1,4 +1,5 @@ #define ARM_MBED +//#define ARM_MBED /********************************************************************* 本ソースリストおよびソフトウェアは、ライセンスフリーです。 利用、編集、再配布等が自由に行えますが、著作権表示の改変は禁止します。 @@ -132,7 +133,13 @@ #ifndef XB_DEFINE_H #define XB_DEFINE_H #ifndef NAME - #define NAME "ZB Coord" + #ifdef LITE // BeeBee Lite by 蘭 + #define NAME "BeeBee Lite" + #define COPYRIGHT "by Wataru & Ran" + #else + #define NAME "ZB Coord" + #define COPYRIGHT "by Wataru KUNINO" + #endif #endif #ifdef H3694 @@ -144,7 +151,7 @@ #define SCI_SIZE 256 // シリアルデータ長(大きすぎるとRAMが不足する) #define API_SIZE 128 // 受信用APIデータ長(32~255) #define API_TXSIZE 64 // 送信用APIデータ長(32~255)兼シリアル送信最大長 - #define CALL_SIZE 32 // xbee_rx_call用戻りデータ(9~256) + #define CALL_SIZE 32 // xbee_rx_call用戻りデータ(10~256) #define XB_AT_SIZE 32 // ATコマンドの最大長 #elif ARDUINO // #define LED1_OUT 15 // 赤色LED(エラー用)用デジタルポート(15=analog 1) @@ -153,14 +160,14 @@ // #define BUTN 14 // ボタンの接続ポート(14 = analog 0) #ifdef LITE #define API_SIZE 48 // 受信用APIデータ長(32~255) - #define API_TXSIZE 24 // 送信用APIデータ長(32~255) - #define CALL_SIZE 16 // xbee_rx_call用戻りデータ(9~256) + #define API_TXSIZE 34 // 送信用APIデータ長(32~255) + #define CALL_SIZE 16 // xbee_rx_call用戻りデータ(10~256) #define XB_AT_SIZE 16 // ATコマンドの最大長 #else #define CACHE_RES 2 // 応答時のキャッシュ数(無効にするには定義を消す) #define API_SIZE 64 // 受信用APIデータ長(32~255) #define API_TXSIZE 64 // 送信用APIデータ長(32~255) - #define CALL_SIZE 32 // xbee_rx_call用戻りデータ(9~256) + #define CALL_SIZE 32 // xbee_rx_call用戻りデータ(10~256) #define XB_AT_SIZE 32 // ATコマンドの最大長 #endif #define LIGHT 1 @@ -179,7 +186,7 @@ #define CACHE_RES 3 // 応答時のキャッシュ数(無効にするには定義を消す) #define API_SIZE 64 // 受信用APIデータ長(32~255) #define API_TXSIZE 64 // 送信用APIデータ長(32~255) - #define CALL_SIZE 32 // xbee_rx_call用戻りデータ(9~256) + #define CALL_SIZE 32 // xbee_rx_call用戻りデータ(10~256) #define XB_AT_SIZE 32 // ATコマンドの最大長 #define delay(ms) wait_millisec(ms) // 関数名の複製 #define LIGHT 1 @@ -197,14 +204,21 @@ // #define DEBUG // デバッグモード // #define DEBUG_TX // 送信パケットの表示 // #define DEBUG_RX // 受信パケットの表示 - #define CACHE_RES 5 // 応答時のキャッシュ数(無効にするには定義を消す) #define ERRLOG // エラー時にログを出力 // #define XBEE_ERROR_TIME // エラー時のログに日時を付与 - #define API_SIZE 128 // 受信用APIデータ長(32~255) - #define API_TXSIZE 64 // 送信用APIデータ長(32~255) - #define CALL_SIZE 64 // xbee_rx_call用戻りデータ(9~256) - #define XB_AT_SIZE 32 // ATコマンドの最大長 - #define delay(ms) wait_millisec(ms) // 関数名の複製 + #ifdef LITE + #define API_SIZE 48 // 受信用APIデータ長(32~255) + #define API_TXSIZE 34 // 送信用APIデータ長(32~255) + #define CALL_SIZE 16 // xbee_rx_call用戻りデータ(10~256) + #define XB_AT_SIZE 16 // ATコマンドの最大長 + #else + #define CACHE_RES 5 // 応答時のキャッシュ数(無効にするには定義を消す) + #define API_SIZE 128 // 受信用APIデータ長(32~255) + #define API_TXSIZE 64 // 送信用APIデータ長(32~255) + #define CALL_SIZE 64 // xbee_rx_call用戻りデータ(10~256) + #define XB_AT_SIZE 32 // ATコマンドの最大長 + #define delay(ms) wait_millisec(ms) // 関数名の複製 + #endif #endif #endif #define TIME_DEL 3 // デリミタ検出のタイムアウト時間(秒) @@ -371,13 +385,17 @@ */ /* XBee用 UART出力API */ - byte xbee_putch( const char c ); + #ifndef LITE + byte xbee_putch( const char c ); + #endif byte xbee_putstr( const char *s ); - void xbee_disp_hex( const unsigned char i ); - void xbee_disp_1( const unsigned int x ); - void xbee_disp_2( unsigned int x ); - void xbee_disp_3(unsigned int x); - void xbee_disp_5(unsigned int x); + #ifndef LITE + void xbee_disp_hex( const unsigned char i ); + void xbee_disp_1( const unsigned int x ); + void xbee_disp_2( unsigned int x ); + void xbee_disp_3(unsigned int x); + void xbee_disp_5(unsigned int x); + #endif void xbee_log( byte level, const char *err , const byte x ); /********************************************************************* @@ -395,7 +413,7 @@ byte xbee_rat(const byte *address, const char *in); byte xbee_rat_force(const byte *address, const char *in); byte xbee_uart(const byte *address, const char *in); - byte xbee_bytes(const byte *address, const byte *in, const byte len); + byte xbee_bytes(const byte *address, const byte *in, byte len); byte xbee_atvr( void ); byte xbee_atai( void ); byte xbee_atcb( byte cb ); @@ -428,21 +446,27 @@ #endif byte xbee_force( const byte *address ); #ifdef ARDUINO // Arduino用 - byte xbee_gpio_config(const byte *address, const byte port, const byte type ); + float xbee_sensor_result( XBEE_RESULT *xbee_result, const byte type); #else #ifdef ARM_MBED float xbee_sensor_result( XBEE_RESULT *xbee_result, const byte type); #else // PC/H8用 float xbee_sensor_result( XBEE_RESULT *xbee_result, const enum xbee_sensor_type type ); + #ifdef EASY_SENSOR + xbee_sensor(const byte *address, const enum xbee_sensor_type type ); + #endif #endif #endif byte xbee_rx_call( XBEE_RESULT *xbee_result ); void xbee_clear_cache(void); - #ifdef EASY_SENSOR - xbee_sensor(const byte *address, const enum xbee_sensor_type type ); + byte xbee_init( const byte port ); + byte xbee_reset( void ); + byte xbee_end_device(const byte *address, byte sp, byte ir, const byte pin); + #ifndef LITE + byte xbee_i2c_init(const byte *address); + byte xbee_i2c_read(const byte *address, byte adr, byte *rx, byte len); + byte xbee_i2c_write(const byte *address, byte adr, byte *rx, byte len); #endif - void xbee_init( const byte port ); - byte xbee_end_device(const byte *address, byte sp, byte ir, const byte pin); - byte xbee_i2c_read(const byte *address, byte adr, byte *rx, byte len); - byte xbee_i2c_write(const byte *address, byte adr, byte *rx, byte len); + byte xbee_delay(unsigned int ms); #endif // XBEE_H +