To push buttons (or switches) on an XBee ZB device report the conditions of input ports on it to a Nucleo board, and display them on a LCD.

Dependencies:   TextLCD mbed xbee

Please refer to the following site for the details:

Committer:
bokunimowakaru
Date:
Sun Sep 21 02:31:36 2014 +0000
Revision:
3:d7263b5155bf
App. Example for XBee Lib. Ver. 1.90.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bokunimowakaru 3:d7263b5155bf 1 #define ARM_MBED
bokunimowakaru 3:d7263b5155bf 2 //#define DEBUG // D8(PA_9)からログをUART(38400baud)出力します
bokunimowakaru 3:d7263b5155bf 3 //#define DEBUG_RX
bokunimowakaru 3:d7263b5155bf 4 /*********************************************************************
bokunimowakaru 3:d7263b5155bf 5 本ソースリストおよびソフトウェアは、ライセンスフリーです。(詳細は別記)
bokunimowakaru 3:d7263b5155bf 6 利用、編集、再配布等が自由に行えますが、著作権表示の改変は禁止します。
bokunimowakaru 3:d7263b5155bf 7
bokunimowakaru 3:d7263b5155bf 8 Copyright (c) 2010-2014 Wataru KUNINO
bokunimowakaru 3:d7263b5155bf 9 http://www.geocities.jp/bokunimowakaru/
bokunimowakaru 3:d7263b5155bf 10 *********************************************************************/
bokunimowakaru 3:d7263b5155bf 11 /*
bokunimowakaru 3:d7263b5155bf 12 既知のバグ
bokunimowakaru 3:d7263b5155bf 13 [PC用/H8用/Arduino共通]
bokunimowakaru 3:d7263b5155bf 14 ・xbee_force/ATISでERRORもしくは正しい値が得られない場合がある。
bokunimowakaru 3:d7263b5155bf 15  一度、xbee_gpo/ATP104などで子機のGPIOなどに出力すると治る。
bokunimowakaru 3:d7263b5155bf 16   (XBeeモジュールの不具合と思われる)
bokunimowakaru 3:d7263b5155bf 17 ・XBee Smart Plug/XBee Sensor等でネットワーク参加直後、
bokunimowakaru 3:d7263b5155bf 18  正しい値を応答しない場合がある。上記と似た症状かもしれない。
bokunimowakaru 3:d7263b5155bf 19  一度、XBee Smart PlugのACコンセントを抜いて挿しなおせば治る。
bokunimowakaru 3:d7263b5155bf 20   (Smart Plug側のファームウェア「XBP24-ZB_2264」の問題と思われる)
bokunimowakaru 3:d7263b5155bf 21 ・Ver 1.90でLITEモードの仕様を変更。(濱崎氏によるBeeBee Lite)
bokunimowakaru 3:d7263b5155bf 22
bokunimowakaru 3:d7263b5155bf 23 ★XBee Wi-FiでのRAT実行時にXBeeから応答のパケットが無い場合がある。
bokunimowakaru 3:d7263b5155bf 24 IP_PINGは通る。
bokunimowakaru 3:d7263b5155bf 25 再現方法、動作中にXBeeをリセットし、その後にArduinoをリセット。
bokunimowakaru 3:d7263b5155bf 26 XBeeモジュールをリセットすると治る。
bokunimowakaru 3:d7263b5155bf 27 Arduino版で発覚。PC版は未確認。
bokunimowakaru 3:d7263b5155bf 28
bokunimowakaru 3:d7263b5155bf 29 [パソコン用]
bokunimowakaru 3:d7263b5155bf 30 ・おかげさまで特記事項なし。安定して動作します。
bokunimowakaru 3:d7263b5155bf 31
bokunimowakaru 3:d7263b5155bf 32 [Arduino用]
bokunimowakaru 3:d7263b5155bf 33 ・標準SDライブラリ使用時にメモリ不足になる場合があります。
bokunimowakaru 3:d7263b5155bf 34  そのような場合はxbee_liteをincludeし、LITEモードにしてください。
bokunimowakaru 3:d7263b5155bf 35
bokunimowakaru 3:d7263b5155bf 36 [ARM mbed用]
bokunimowakaru 3:d7263b5155bf 37 ・試作品です。バグ多数かもしれません。
bokunimowakaru 3:d7263b5155bf 38 ・STマイクロ製 Nucleo Board STM32F401で動作確認しています。
bokunimowakaru 3:d7263b5155bf 39 ・XBeeとの接続にはArduino用Wireless SD Shieldを使用します。
bokunimowakaru 3:d7263b5155bf 40  ※Nucleoボードの裏側のジャンパー抵抗の変更が必要です。
bokunimowakaru 3:d7263b5155bf 41 「SB14」をオープンにします(抵抗を取り外します。)
bokunimowakaru 3:d7263b5155bf 42 「SB62」をショートします。(半田で接続します。)
bokunimowakaru 3:d7263b5155bf 43 「SB63」をショートします。(半田で接続します。)
bokunimowakaru 3:d7263b5155bf 44 ・液晶はDF ROBOT製 LCD Keypad Shieldで動作確認しています。
bokunimowakaru 3:d7263b5155bf 45
bokunimowakaru 3:d7263b5155bf 46 [H8マイコン用]
bokunimowakaru 3:d7263b5155bf 47 ・Ver1.52以降は動作確認をしておらず、動作しない恐れがあります。
bokunimowakaru 3:d7263b5155bf 48  お使いになる方は連絡ください。動作確認版を個別リリースいたします。
bokunimowakaru 3:d7263b5155bf 49
bokunimowakaru 3:d7263b5155bf 50 制限事項
bokunimowakaru 3:d7263b5155bf 51 ・ソースはPC/H8/Arduino/ARM mbed用で共通ですが拡張子が異なります。
bokunimowakaru 3:d7263b5155bf 52  PC/H8「xbee.c」をArduino用は「xbee_arduino」フォルダ内のライブラリ
bokunimowakaru 3:d7263b5155bf 53  「xbee.h」をincludeしてください。
bokunimowakaru 3:d7263b5155bf 54 ・xbee_forceで指示を出してxbee_rx_callで待ち受ける用法を推奨します。
bokunimowakaru 3:d7263b5155bf 55 ・受信パケットの最大APIフレーム長は255Bytes等に制限されます。(64KB)
bokunimowakaru 3:d7263b5155bf 56 ・複数のXBeeデバイスの選択はアプリでIEEEアドレスを指定してください。
bokunimowakaru 3:d7263b5155bf 57 ・ショートアドレスは使っていません(IEEEアドレスで指定してください)
bokunimowakaru 3:d7263b5155bf 58 ・温度測定を行う場合は内部発熱分を補正(減算)する必要があります。
bokunimowakaru 3:d7263b5155bf 59  Digi純正のWall RouterやSmart Plugの場合は内部発熱の4℃を考慮して
bokunimowakaru 3:d7263b5155bf 60  測定値から減算必要があります。
bokunimowakaru 3:d7263b5155bf 61 ・送信者アドレスを得る関数xbee_fromは、xbee_rx_callで受信した場合に
bokunimowakaru 3:d7263b5155bf 62  正しく得られない場合があります。(受信キャッシュが保持されている時)
bokunimowakaru 3:d7263b5155bf 63  xbee_rx_callに渡したxbee_result.FROM[8]から送信者を得てください。
bokunimowakaru 3:d7263b5155bf 64
bokunimowakaru 3:d7263b5155bf 65 アプリ向け提供関数
bokunimowakaru 3:d7263b5155bf 66
bokunimowakaru 3:d7263b5155bf 67 byte xbee_myaddress( byte *address );
bokunimowakaru 3:d7263b5155bf 68 void xbee_address( const byte *address );
bokunimowakaru 3:d7263b5155bf 69 byte xbee_atd( const byte *address );
bokunimowakaru 3:d7263b5155bf 70 byte xbee_ratd(const byte *dev_address, const byte *set_address );
bokunimowakaru 3:d7263b5155bf 71 byte xbee_ratd_myaddress(const byte *address);
bokunimowakaru 3:d7263b5155bf 72 void xbee_from( byte *address );
bokunimowakaru 3:d7263b5155bf 73 byte xbee_at(const char *in);
bokunimowakaru 3:d7263b5155bf 74 byte xbee_rat(const byte *address, const char *in);
bokunimowakaru 3:d7263b5155bf 75 byte xbee_rat_force(const byte *address, const char *in);
bokunimowakaru 3:d7263b5155bf 76 byte xbee_uart(const byte *address, const char *in);
bokunimowakaru 3:d7263b5155bf 77 byte xbee_bytes(const byte *address, const byte *in, byte len);
bokunimowakaru 3:d7263b5155bf 78 byte xbee_atvr( void );
bokunimowakaru 3:d7263b5155bf 79 byte xbee_atai( void );
bokunimowakaru 3:d7263b5155bf 80 byte xbee_atcb( byte cb );
bokunimowakaru 3:d7263b5155bf 81 unsigned short xbee_atop(byte *pan_id);
bokunimowakaru 3:d7263b5155bf 82 byte xbee_atee_on(const char *key );
bokunimowakaru 3:d7263b5155bf 83 byte xbee_atee_off( void );
bokunimowakaru 3:d7263b5155bf 84 byte xbee_atnc( void );
bokunimowakaru 3:d7263b5155bf 85 byte xbee_ratnc( const byte *address );
bokunimowakaru 3:d7263b5155bf 86 byte xbee_atnj( const byte timeout );
bokunimowakaru 3:d7263b5155bf 87 byte xbee_ratnj( const byte *address, const byte timeout );
bokunimowakaru 3:d7263b5155bf 88 byte xbee_ping( const byte *address );
bokunimowakaru 3:d7263b5155bf 89 int xbee_batt(const byte *address );
bokunimowakaru 3:d7263b5155bf 90 byte xbee_batt_force(const byte *address );
bokunimowakaru 3:d7263b5155bf 91 byte xbee_gpio_config(const byte *address, const byte port, const enum xbee_port_type type ); //(PC/H8)
bokunimowakaru 3:d7263b5155bf 92 byte xbee_gpio_config(const byte *address, const byte port, const byte type ); //(arduino)
bokunimowakaru 3:d7263b5155bf 93 byte xbee_gpio_init( const byte *address );
bokunimowakaru 3:d7263b5155bf 94 byte xbee_gpo( const byte *address, const byte port,const byte out );
bokunimowakaru 3:d7263b5155bf 95 byte xbee_gpi(const byte *address, const byte port); //(EASY)
bokunimowakaru 3:d7263b5155bf 96 unsigned int xbee_adc(const byte *address, const byte port); //(EASY)
bokunimowakaru 3:d7263b5155bf 97 byte xbee_force( const byte *address );
bokunimowakaru 3:d7263b5155bf 98 float xbee_sensor_result( XBEE_RESULT *xbee_result, const enum xbee_sensor_type type ); //(PC/H8)
bokunimowakaru 3:d7263b5155bf 99 float xbee_sensor_result( XBEE_RESULT *xbee_result, const byte type); //(arduino)
bokunimowakaru 3:d7263b5155bf 100 byte xbee_rx_call( XBEE_RESULT *xbee_result );
bokunimowakaru 3:d7263b5155bf 101 void xbee_clear_cache(void);
bokunimowakaru 3:d7263b5155bf 102 xbee_sensor(const byte *address, const enum xbee_sensor_type type ); //(EASY)
bokunimowakaru 3:d7263b5155bf 103 byte xbee_init( const byte port );
bokunimowakaru 3:d7263b5155bf 104 byte xbee_reset( void );
bokunimowakaru 3:d7263b5155bf 105 byte xbee_end_device(const byte *address, byte sp, byte ir, const byte pin);
bokunimowakaru 3:d7263b5155bf 106 byte xbee_i2c_read(const byte *address, byte adr, byte *rx, byte len);
bokunimowakaru 3:d7263b5155bf 107 byte xbee_i2c_write(const byte *address, byte adr, byte *rx, byte len);
bokunimowakaru 3:d7263b5155bf 108 byte xbee_delay(unsigned int ms);
bokunimowakaru 3:d7263b5155bf 109 void lcd_disp( char *s );
bokunimowakaru 3:d7263b5155bf 110
bokunimowakaru 3:d7263b5155bf 111 主要な変更履歴
bokunimowakaru 3:d7263b5155bf 112 2010/08/15 0.10 - 初回の公開版をリリース 基本動作部分の実験用
bokunimowakaru 3:d7263b5155bf 113 2011/08/14 0.30 - ライブラリ化のためにAPI関数の内容を全面見直し
bokunimowakaru 3:d7263b5155bf 114 2012/04/07 0.80 - 総合試験の実施とバグ修正、仕様見直しなど
bokunimowakaru 3:d7263b5155bf 115 2012/04/22 0.91 - パソコン(cygwin)への移植
bokunimowakaru 3:d7263b5155bf 116 2012/07/15 1.00 - 基本機能(sample1~8)のデバッグ完了。正式版
bokunimowakaru 3:d7263b5155bf 117 2012/08/25 1.15 - Arduino用へ移植
bokunimowakaru 3:d7263b5155bf 118 - enum xbee_port_typeのADCをAINに変更
bokunimowakaru 3:d7263b5155bf 119 - 起動時にシリアル速度が設定されない不具合を修正
bokunimowakaru 3:d7263b5155bf 120 2012/11/25 1.20 - 電池電圧確認用コマンドを非同期型に変更
bokunimowakaru 3:d7263b5155bf 121 xbee_batt⇒xbee_batt_force。応答はxbee_rx_call
bokunimowakaru 3:d7263b5155bf 122 2012/12/09 1.30 - 液晶なしオプション(#define LCD_H)の追加
bokunimowakaru 3:d7263b5155bf 123 - Liteモード(#define LITE)の追加。ARDUINO版のみ
bokunimowakaru 3:d7263b5155bf 124 - PC版シリアルポートをcom1~com10に拡張
bokunimowakaru 3:d7263b5155bf 125 - グローバル変数アドレスのADR_MYとSADR_MYを廃止
bokunimowakaru 3:d7263b5155bf 126 2012/12/16 1.50 - Arduino版のライブラリ化
bokunimowakaru 3:d7263b5155bf 127 - コマンド応答待ち時に他のパケットをキャッシュ
bokunimowakaru 3:d7263b5155bf 128 (#define CACHE_RES 10でキャッシュが有効になる)
bokunimowakaru 3:d7263b5155bf 129 2012/12/17 1.51 - リモートATの応答確認にAT値からMODE値に変更
bokunimowakaru 3:d7263b5155bf 130 - H8のバグ対応(lcd_h8.cの2重呼び出し対策等)
bokunimowakaru 3:d7263b5155bf 131 2012/12/18 1.52 - [重要] 関数lcd()をlcd_disp()に変更。
bokunimowakaru 3:d7263b5155bf 132 - Arduino版ライブラリ側ハードLCD,LED,SWの無効化
bokunimowakaru 3:d7263b5155bf 133 2012/12/22 1.53 - [重要] atnjとratnjの戻り値を失敗時255に変更
bokunimowakaru 3:d7263b5155bf 134 - ATコマンドを送信する関数を追加
bokunimowakaru 3:d7263b5155bf 135 2012/12/23 1.54 - 1.53のエンバグの修正(テスト用printfの残留)
bokunimowakaru 3:d7263b5155bf 136 2012/12/30 1.55 - Arduino LEONARDOへの対応
bokunimowakaru 3:d7263b5155bf 137 - Arduino標準LCDの配線変更(DF ROBOT互換に)
bokunimowakaru 3:d7263b5155bf 138 2013/01/12 1.56 - xbee_result.GPI[0]とGPI[1]の戻り値を入れ替え
bokunimowakaru 3:d7263b5155bf 139 2013/01/14 1.57 - xbee_gpio_configでアドレス取得失敗時のバグ修正
bokunimowakaru 3:d7263b5155bf 140 2013/01/20 1.58 - xbee状態取得 xbee_ataiとxbee_atopコマンド追加
bokunimowakaru 3:d7263b5155bf 141 2013/04/03 1.60 - xbee_initによるXBeeリセット時の応答の廃棄処理
bokunimowakaru 3:d7263b5155bf 142 - エラー出力を stderrに変更PC用(のみ)
bokunimowakaru 3:d7263b5155bf 143 - xbee_result.GPI.PORT.Dnのエンバグ(1.56~)修正
bokunimowakaru 3:d7263b5155bf 144 2013/04/08 1.71 - [重要] Arduino xbee_rx_callを構造体受取に変更
bokunimowakaru 3:d7263b5155bf 145 - [重要] Arduino xbee_sensor_resultの引数の同上
bokunimowakaru 3:d7263b5155bf 146 - [重要] xbee_rx_callパケット選択受信機能を削除
bokunimowakaru 3:d7263b5155bf 147 - [重要] PC/H8 xbee_result.ADCをADCINに変更
bokunimowakaru 3:d7263b5155bf 148 - xbee_atに16進数のテキスト引数の処理のバグ修正
bokunimowakaru 3:d7263b5155bf 149 - xbee_atnjでjoin後にatnj=5を設定(5秒Join有効)
bokunimowakaru 3:d7263b5155bf 150 - PC/H8/Arduinoでライブラリを共通ソースに統合
bokunimowakaru 3:d7263b5155bf 151 2013/04/21 1.72 - コマンド応答をxbee_rx_callで得るxbee_rat_force
bokunimowakaru 3:d7263b5155bf 152 - テキストをシリアル送信するxbee_uartの追加
bokunimowakaru 3:d7263b5155bf 153 - ZigBeeデバイスタイプを取得するxbee_atvrの追加
bokunimowakaru 3:d7263b5155bf 154 - ネットワーク参加状況を確認するxbee_ataiの追加
bokunimowakaru 3:d7263b5155bf 155 - コミッショニング操作を行うxbee_atcbの追加
bokunimowakaru 3:d7263b5155bf 156 - ネットワークIDを取得するxbee_atopの追加
bokunimowakaru 3:d7263b5155bf 157 - 暗号化xbee_atee_onと解除xbee_atee_offの追加
bokunimowakaru 3:d7263b5155bf 158 2013/04/30 1.73 - PC版&Arduino版リリース
bokunimowakaru 3:d7263b5155bf 159 - 受信キャッシュオーバー時パケット廃棄(仕様変更)
bokunimowakaru 3:d7263b5155bf 160 2013/05/09 1.74 - 初期化時にAPモード1の設定を追加
bokunimowakaru 3:d7263b5155bf 161 - #define LCD_H有効時以外のログ呼び出し停止
bokunimowakaru 3:d7263b5155bf 162 - 子機に本機アドレスを設定するxbee_set_myaddress
bokunimowakaru 3:d7263b5155bf 163 2013/05/10 1.75 - End Deviceにスリープを設定するxbee_end_device
bokunimowakaru 3:d7263b5155bf 164 2013/05/18 1.76 - [重要] 戻り値を送信パケット番号PACKET_IDに変更
bokunimowakaru 3:d7263b5155bf 165 xbee_gpo,同_force,同_batt,同_rat_force,同_uart
bokunimowakaru 3:d7263b5155bf 166 - [重要] Arduino xbee_resultにxbee_result.ID追加
bokunimowakaru 3:d7263b5155bf 167 2013/05/25 1.77 - XBee Wi-Fi XBee IPによるリモートAT制御に対応
bokunimowakaru 3:d7263b5155bf 168 2013/06/30 1.78 - 全マスクGPIO入力時xbee_result.GPI.BYTEを0xFFFF
bokunimowakaru 3:d7263b5155bf 169 - GPIO出力(xbee_gpo)の利用可能ポート範囲を拡大
bokunimowakaru 3:d7263b5155bf 170 2013/08/28 1.79 - XBee Sensorのデバイス名(define)の追加
bokunimowakaru 3:d7263b5155bf 171 - xbee_end_deviceの親機のSP値を28秒固定に変更
bokunimowakaru 3:d7263b5155bf 172 2013/09/28 1.80 - xbee_end_device Router時の自動送信設定を可能に
bokunimowakaru 3:d7263b5155bf 173 - xbee_resultのGPINに電池電圧ADC[0]にmV値を応答
bokunimowakaru 3:d7263b5155bf 174 - xbee_atnjでjoin後のatnj=5設定をatnj=0に変更
bokunimowakaru 3:d7263b5155bf 175 - リモートAT応答の送信元が取得できないバグ修正
bokunimowakaru 3:d7263b5155bf 176 - XBee Wi-Fi xbee_gpoを送信時の応答バグ修正
bokunimowakaru 3:d7263b5155bf 177 2013/10/14 1.81 - Arduino版XBee Wi-Fi対応。XBee ZBは未テスト
bokunimowakaru 3:d7263b5155bf 178 - xbee_atd追加(End Device時に宛先アドレスを保存)
bokunimowakaru 3:d7263b5155bf 179 - xbee_ratd追加(親機アドレス以外も設定可能に)
bokunimowakaru 3:d7263b5155bf 180 - xbee_set_myaddress⇒xbee_ratd_myaddress名変更
bokunimowakaru 3:d7263b5155bf 181 - XBee Wi-Fi 3バイト以下UART受信不具合の修正
bokunimowakaru 3:d7263b5155bf 182 - XBee Wi-Fi ATDDで不適切な値を応答するバグ対策
bokunimowakaru 3:d7263b5155bf 183 - XBee Wi-Fiのフレーム受信でメモリーリーク対策
bokunimowakaru 3:d7263b5155bf 184 2014/01/14 1.82 - ATmega32U4が使われている時はLEONARDOを自動定義
bokunimowakaru 3:d7263b5155bf 185 - シリアルポート異常時のSegFault不具合の修正
bokunimowakaru 3:d7263b5155bf 186 - 日時付エラーログ出力(PC用XBEE_ERROR_TIME定義)
bokunimowakaru 3:d7263b5155bf 187 2014/02/17 1.83 - XBee Wi-Fi サンプルの各種不具合修正
bokunimowakaru 3:d7263b5155bf 188 - XBee Wi-Fi S2B対応(机上検討による実装)
bokunimowakaru 3:d7263b5155bf 189 - バイナリデータを子機UARTへ送信するxbee_bytes
bokunimowakaru 3:d7263b5155bf 190 - I2Cインタフェースを読み取るxbee_i2c_readの追加
bokunimowakaru 3:d7263b5155bf 191 - I2Cインタフェースで書き込むxbee_i2c_write追加
bokunimowakaru 3:d7263b5155bf 192 - 受信キャッシュをクリアするxbee_clear_cache追加
bokunimowakaru 3:d7263b5155bf 193 - 特定者向けリリース(I2C接続LCD,XBee Wi-Fi S2B)
bokunimowakaru 3:d7263b5155bf 194 2014/02/23 1.84 - 無駄使いメモリの修正、表示の調整、累積バグ修正
bokunimowakaru 3:d7263b5155bf 195 - ATコマンド解析ツールxbee_test.cのhelpコマンド
bokunimowakaru 3:d7263b5155bf 196 - README内のバージョン齟齬に関する修正
bokunimowakaru 3:d7263b5155bf 197 2014/03/01 1.85 - XBee WiFi S6B Ver.20xx対応(Ver.10xxと自動切替)
bokunimowakaru 3:d7263b5155bf 198  対応モジュール XBee WiFi S6 Ver.102D
bokunimowakaru 3:d7263b5155bf 199          XBee WiFi S6B Ver.2021
bokunimowakaru 3:d7263b5155bf 200 2014/03/17 1.86 - CQ出版様向けサンプルソフトウェアの正式リリース
bokunimowakaru 3:d7263b5155bf 201 2014/06/21 1.87 - ARM mbed対応(試作品)
bokunimowakaru 3:d7263b5155bf 202 2014/08/02 1.88 - シリアルCOMポート拡張(ポート番号1~64に対応)
bokunimowakaru 3:d7263b5155bf 203 - Arduino xbee_initでリトライ回数指定に。0で永久
bokunimowakaru 3:d7263b5155bf 204 - xbee_initに戻り値。異常時0。正常時リトライ数
bokunimowakaru 3:d7263b5155bf 205 - 受信しながら時間待ちするxbee_delay関数の追加
bokunimowakaru 3:d7263b5155bf 206 - 宛先ショートアドレス指定関数xbee_short_address
bokunimowakaru 3:d7263b5155bf 207 - ZigBee ZCL使用時(PC用)に関するバグ修正
bokunimowakaru 3:d7263b5155bf 208 2014/08/24 1.89 - 内部関数xbee_resetの公開(ヘッダファイルへ追加)
bokunimowakaru 3:d7263b5155bf 209 - xbee_init 失敗時の戻り値の不具合を修正
bokunimowakaru 3:d7263b5155bf 210 - PC版 GCC Ver 4.7対応,最適化オプション-O1の付与
bokunimowakaru 3:d7263b5155bf 211 - 戻り値が不定になる内部関数の不具合修正
bokunimowakaru 3:d7263b5155bf 212 2014/09/15 1.90 - 有志によるライブラリBeeBee Liteの一部機能採用
bokunimowakaru 3:d7263b5155bf 213  ・試験ツールxbee_agingを通過しない項目の調整
bokunimowakaru 3:d7263b5155bf 214  ・効果はArduino上でSD使用時のメモリ確保など
bokunimowakaru 3:d7263b5155bf 215 - xbee_bytesで規定サイズを超えた場合のリーク対策
bokunimowakaru 3:d7263b5155bf 216 - 下位マスク0x00のGPIN受信時にエラー出力バグ修正
bokunimowakaru 3:d7263b5155bf 217
bokunimowakaru 3:d7263b5155bf 218 *********************************************************************/
bokunimowakaru 3:d7263b5155bf 219 /*
bokunimowakaru 3:d7263b5155bf 220 本ライブラリのバージョン
bokunimowakaru 3:d7263b5155bf 221 */
bokunimowakaru 3:d7263b5155bf 222 #ifndef VERSION
bokunimowakaru 3:d7263b5155bf 223
bokunimowakaru 3:d7263b5155bf 224 #define VERSION "1.90" // 1.XX 4バイト形式 XXは半角文字
bokunimowakaru 3:d7263b5155bf 225
bokunimowakaru 3:d7263b5155bf 226 #endif
bokunimowakaru 3:d7263b5155bf 227 /*
bokunimowakaru 3:d7263b5155bf 228 参考文献
bokunimowakaru 3:d7263b5155bf 229
bokunimowakaru 3:d7263b5155bf 230 (1) Digi International Inc.
bokunimowakaru 3:d7263b5155bf 231 XBee ZB RF Modules 90000976_D 8/18/2009
bokunimowakaru 3:d7263b5155bf 232 XBee Wi-Fi RF Module 90002124_F 2011
bokunimowakaru 3:d7263b5155bf 233 (2) Massimo Banzi著 船田功訳
bokunimowakaru 3:d7263b5155bf 234 Arduinoをはじめよう (オライリージャパン)
bokunimowakaru 3:d7263b5155bf 235 (3) BestTechnology CO.,LTD.
bokunimowakaru 3:d7263b5155bf 236 H8/3664F I/O address definition Release 3.5 2005-11-08 (3694.h)
bokunimowakaru 3:d7263b5155bf 237 (4) 粕谷友章
bokunimowakaru 3:d7263b5155bf 238 PC-UNIX関連ドキュメント「シリアルポートプログラミング」
bokunimowakaru 3:d7263b5155bf 239 www006.upp.so-net.ne.jp/kasuya/linux/serial_io_programing.html
bokunimowakaru 3:d7263b5155bf 240 (5) JM Project Linux Programmer's Manual
bokunimowakaru 3:d7263b5155bf 241 Linux man-pages プロジェクト リリース 3.52 (GPL V2)
bokunimowakaru 3:d7263b5155bf 242 linuxjm.sourceforge.jp/html/LDP_man-pages/man2/select.2.html
bokunimowakaru 3:d7263b5155bf 243 (6) mbed Handbook
bokunimowakaru 3:d7263b5155bf 244 mbed.org/handbook/Homepage
bokunimowakaru 3:d7263b5155bf 245
bokunimowakaru 3:d7263b5155bf 246 ライセンスについて
bokunimowakaru 3:d7263b5155bf 247
bokunimowakaru 3:d7263b5155bf 248 本ソースコードはライセンスフリーですが、参考文献の情報については
bokunimowakaru 3:d7263b5155bf 249 それぞれの権利者にお問い合わせください。
bokunimowakaru 3:d7263b5155bf 250
bokunimowakaru 3:d7263b5155bf 251 注意点
bokunimowakaru 3:d7263b5155bf 252 本ソフトの利用による損害について当方は一切の補償をいたしません。
bokunimowakaru 3:d7263b5155bf 253 全て自己責任で利用ください。
bokunimowakaru 3:d7263b5155bf 254 */
bokunimowakaru 3:d7263b5155bf 255
bokunimowakaru 3:d7263b5155bf 256 /*********************************************************************
bokunimowakaru 3:d7263b5155bf 257 ライブラリ使用説明書
bokunimowakaru 3:d7263b5155bf 258
bokunimowakaru 3:d7263b5155bf 259 ハードウェア
bokunimowakaru 3:d7263b5155bf 260
bokunimowakaru 3:d7263b5155bf 261 PC用 以下のハードが必要です。
bokunimowakaru 3:d7263b5155bf 262 ・USBを搭載したIBM PC/AT互換機(通常のWindows PC)
bokunimowakaru 3:d7263b5155bf 263 ・XBee USBエクスプローラ、XBee-Fly USB または 純正XBIB-U-DEVなど
bokunimowakaru 3:d7263b5155bf 264  (http://www.geocities.jp/bokunimowakaru/diy/xbee/xbee-usb.html)
bokunimowakaru 3:d7263b5155bf 265 ・XBee Series 2 (ZB) モジュール
bokunimowakaru 3:d7263b5155bf 266
bokunimowakaru 3:d7263b5155bf 267 Arduino 以下のハードが必要です。
bokunimowakaru 3:d7263b5155bf 268 ・Arduinoマイコンボード Arduino UNO Arduino Leonardo等
bokunimowakaru 3:d7263b5155bf 269 ・XBee Shield (Arduino Wireless SD Shieldなど)
bokunimowakaru 3:d7263b5155bf 270 ・XBee Series 2 (ZB) モジュール
bokunimowakaru 3:d7263b5155bf 271 ・LCDキャラクタディスプレイモジュール[20×4行] SC2004CS-B
bokunimowakaru 3:d7263b5155bf 272
bokunimowakaru 3:d7263b5155bf 273  キャラクタ液晶は以下のように接続する
bokunimowakaru 3:d7263b5155bf 274
bokunimowakaru 3:d7263b5155bf 275   rs rw en d0 d1 d2 d3
bokunimowakaru 3:d7263b5155bf 276  // LiquidCrystal xbee_ardlcd( 8, 7, 6, 5, 4, 3, 2)
bokunimowakaru 3:d7263b5155bf 277  
bokunimowakaru 3:d7263b5155bf 278 ARM mbed用
bokunimowakaru 3:d7263b5155bf 279 ・STマイクロ製 Nucleo Board STM32F401で動作確認しています。
bokunimowakaru 3:d7263b5155bf 280 ・XBeeとの接続にはArduino用Wireless SD Shieldを使用します。
bokunimowakaru 3:d7263b5155bf 281  ※Nucleoボードの裏側のジャンパー抵抗の変更が必要です。
bokunimowakaru 3:d7263b5155bf 282 「SB14」をオープンにします(抵抗を取り外します。)
bokunimowakaru 3:d7263b5155bf 283 「SB62」をショートします。(半田で接続します。)
bokunimowakaru 3:d7263b5155bf 284 「SB63」をショートします。(半田で接続します。)
bokunimowakaru 3:d7263b5155bf 285 ・液晶を使用したサンプルはDF ROBOT製 LCD Keypad Shieldで
bokunimowakaru 3:d7263b5155bf 286  動作確認しています。
bokunimowakaru 3:d7263b5155bf 287
bokunimowakaru 3:d7263b5155bf 288 H3694用 秋月電子通商で販売されている以下のハードウェアが必要です。
bokunimowakaru 3:d7263b5155bf 289 ・AKI-H8/3694F(QFP) タイニーマイコンキット
bokunimowakaru 3:d7263b5155bf 290 ・H8タイニーI/O(アイ・オー)ボード
bokunimowakaru 3:d7263b5155bf 291 ・小型スライドスイッチ 1回路2接点 SS12D01G4
bokunimowakaru 3:d7263b5155bf 292 ・LCDキャラクタディスプレイモジュール[20×4行] SC2004CS-B
bokunimowakaru 3:d7263b5155bf 293 ・XBeeモジュールをRS-232Cに接続する基板(純正XBIB-R-DEVなど)
bokunimowakaru 3:d7263b5155bf 294  (http://www.geocities.jp/bokunimowakaru/pict/xbee-cord_sch.gif)
bokunimowakaru 3:d7263b5155bf 295 ・RS-232Cケーブル
bokunimowakaru 3:d7263b5155bf 296 ・XBee Series 2 (ZB) モジュール
bokunimowakaru 3:d7263b5155bf 297
bokunimowakaru 3:d7263b5155bf 298  キャラクタ液晶はH8/3694のCN1の14~19ピンの各出力と電源、
bokunimowakaru 3:d7263b5155bf 299  GNDを液晶モジュールのDB4~7およびE、RSの各入力、および
bokunimowakaru 3:d7263b5155bf 300  電源に接続して製作します(下図参照)。
bokunimowakaru 3:d7263b5155bf 301
bokunimowakaru 3:d7263b5155bf 302 AKI-H8      液晶モジュール
bokunimowakaru 3:d7263b5155bf 303 (CN1)       (HD44780搭載)
bokunimowakaru 3:d7263b5155bf 304 ━━┓      ┏━━━━━┓    ┯ 5V
bokunimowakaru 3:d7263b5155bf 305   ┃P50     ┃     ┃    |
bokunimowakaru 3:d7263b5155bf 306  14┠──────┨DB4  Vdd┠───●┘
bokunimowakaru 3:d7263b5155bf 307   ┃P51     ┃     ┃   |
bokunimowakaru 3:d7263b5155bf 308  15┠──────┨DB5    ┃   <
bokunimowakaru 3:d7263b5155bf 309   ┃P52     ┃     ┃ ┌→>
bokunimowakaru 3:d7263b5155bf 310  16┠──────┨DB6  VLC┠─┘ < 10k
bokunimowakaru 3:d7263b5155bf 311   ┃P53     ┃     ┃   |
bokunimowakaru 3:d7263b5155bf 312  17┠──────┨DB7 DB0-3┠─┐ |
bokunimowakaru 3:d7263b5155bf 313   ┃P54     ┃     ┃ | |
bokunimowakaru 3:d7263b5155bf 314  18┠──────┨E   R/W┠─● |
bokunimowakaru 3:d7263b5155bf 315   ┃P55     ┃     ┃ | |
bokunimowakaru 3:d7263b5155bf 316  19┠──────┨RS   Vss┠─●─●┐
bokunimowakaru 3:d7263b5155bf 317   ┃      ┗━━━━━┛   ┯┿┯
bokunimowakaru 3:d7263b5155bf 318   
bokunimowakaru 3:d7263b5155bf 319
bokunimowakaru 3:d7263b5155bf 320 port: port指定 IO名 ピン番号 共用 主な用途
bokunimowakaru 3:d7263b5155bf 321 port= 0 DIO0 XBee_pin 20 (Cms) Commision コミッションボタン
bokunimowakaru 3:d7263b5155bf 322 port= 1 DIO1 XBee_pin 19 (AD1) 汎用入力用(DIN or AIN)
bokunimowakaru 3:d7263b5155bf 323 port= 2 DIO2 XBee_pin 18 (AD2) 汎用入力用(DIN or AIN)
bokunimowakaru 3:d7263b5155bf 324 port= 3 DIO3 XBee_pin 17 (AD3) 汎用入力用(DIN or AIN)
bokunimowakaru 3:d7263b5155bf 325 port= 4 DIO4 XBee_pin 11 汎用出力用
bokunimowakaru 3:d7263b5155bf 326 port= 5 DIO5 XBee_pin 15 (Ass) ASSOSIATE indication
bokunimowakaru 3:d7263b5155bf 327 port= 6 DIO6 XBee_pin 16 (RTS) 汎用出力用
bokunimowakaru 3:d7263b5155bf 328 port=10 DIO10 XBee_pin 6 (RSSI) RSSI indication (PWM)
bokunimowakaru 3:d7263b5155bf 329 port=11 DIO11 XBee_pin 7 汎用出力用
bokunimowakaru 3:d7263b5155bf 330 port=12 DIO12 XBee_pin 4 汎用出力用
bokunimowakaru 3:d7263b5155bf 331
bokunimowakaru 3:d7263b5155bf 332 ソフト開発環境
bokunimowakaru 3:d7263b5155bf 333
bokunimowakaru 3:d7263b5155bf 334 共通
bokunimowakaru 3:d7263b5155bf 335 ・X-CTU (Digi社)
bokunimowakaru 3:d7263b5155bf 336  PCもしくはH3694、Arduinoに接続する親機側のXBeeモジュールへ
bokunimowakaru 3:d7263b5155bf 337  Coordinatorのファームウェアを書き込むのに必要です。
bokunimowakaru 3:d7263b5155bf 338
bokunimowakaru 3:d7263b5155bf 339 Device Type XBee Firmware Ver. ハードウェア
bokunimowakaru 3:d7263b5155bf 340 -----------------------------------------------------
bokunimowakaru 3:d7263b5155bf 341 Coordinator COORDINATOR API 2141 パソコンのシリアル端子
bokunimowakaru 3:d7263b5155bf 342 または秋月H8Tiny IO BOARD
bokunimowakaru 3:d7263b5155bf 343 またはArduino側に接続
bokunimowakaru 3:d7263b5155bf 344 End Device END DEVICE AT 2841 単体で駆動
bokunimowakaru 3:d7263b5155bf 345
bokunimowakaru 3:d7263b5155bf 346 Arduino用
bokunimowakaru 3:d7263b5155bf 347 ・Arduino IDE
bokunimowakaru 3:d7263b5155bf 348
bokunimowakaru 3:d7263b5155bf 349 ARM mbed用
bokunimowakaru 3:d7263b5155bf 350 ・https://mbed.org/compiler/
bokunimowakaru 3:d7263b5155bf 351
bokunimowakaru 3:d7263b5155bf 352 PC用
bokunimowakaru 3:d7263b5155bf 353 ・cygwin (http://www.cygwin.com/)
bokunimowakaru 3:d7263b5155bf 354 ・インストール時にdevl内のgcc coreとmakeを選択すること
bokunimowakaru 3:d7263b5155bf 355
bokunimowakaru 3:d7263b5155bf 356 H3694用
bokunimowakaru 3:d7263b5155bf 357 ・GCC Developer Lite(株式会社ベストテクノロジー)
bokunimowakaru 3:d7263b5155bf 358  http://www.besttechnology.co.jp/modules/knowledge/
bokunimowakaru 3:d7263b5155bf 359
bokunimowakaru 3:d7263b5155bf 360 上記ホームページの「ナレッジベース」より、技術情報/ソフト
bokunimowakaru 3:d7263b5155bf 361 ウェア/GCC Developer Liteからダウンロードできます。
bokunimowakaru 3:d7263b5155bf 362 この開発環境に含まれるH3694用のターゲットファイルを使用し
bokunimowakaru 3:d7263b5155bf 363 ていますので、他の環境で開発する場合は注意が必要です。
bokunimowakaru 3:d7263b5155bf 364 */
bokunimowakaru 3:d7263b5155bf 365
bokunimowakaru 3:d7263b5155bf 366 /*********************************************************************
bokunimowakaru 3:d7263b5155bf 367 インポート処理
bokunimowakaru 3:d7263b5155bf 368 *********************************************************************/
bokunimowakaru 3:d7263b5155bf 369
bokunimowakaru 3:d7263b5155bf 370 #ifndef LCD_TYPE_H
bokunimowakaru 3:d7263b5155bf 371 #define LCD_TYPE_H
bokunimowakaru 3:d7263b5155bf 372 #ifdef ARDUINO
bokunimowakaru 3:d7263b5155bf 373 #if defined(__AVR_ATmega32U4__)
bokunimowakaru 3:d7263b5155bf 374 #define LEONARDO // Arduino LEONARDを使用する場合に自動的に定義されます。
bokunimowakaru 3:d7263b5155bf 375 #endif
bokunimowakaru 3:d7263b5155bf 376 // #define LCD_H // 本ライブラリ動作を液晶表示する場合に定義する
bokunimowakaru 3:d7263b5155bf 377 // #define ADAFRUIT // 使用する液晶が Adafruit LCD Sheild の時に定義する
bokunimowakaru 3:d7263b5155bf 378 #else // H8 or ARM or PC
bokunimowakaru 3:d7263b5155bf 379 #ifndef ARM_MBED // H8 or PC
bokunimowakaru 3:d7263b5155bf 380 #define LCD_H
bokunimowakaru 3:d7263b5155bf 381 #endif
bokunimowakaru 3:d7263b5155bf 382 #endif
bokunimowakaru 3:d7263b5155bf 383 // #define XBEE_WIFI // XBee Wi-Fiを使用するときに定義する
bokunimowakaru 3:d7263b5155bf 384 // #define XBEE_WIFI_DEBUG
bokunimowakaru 3:d7263b5155bf 385 // #define LITE // ライトモード(メモリ節約・機能制限)の時に定義する
bokunimowakaru 3:d7263b5155bf 386 #define EASY_GPI // xbee_gpi関数(リモートGPIO)を使用するときに定義する
bokunimowakaru 3:d7263b5155bf 387 #define EASY_ADC // xbee_adc関数(リモートADC)を使用するときに定義する
bokunimowakaru 3:d7263b5155bf 388 // ##define EASY_SENSOR
bokunimowakaru 3:d7263b5155bf 389 #endif
bokunimowakaru 3:d7263b5155bf 390
bokunimowakaru 3:d7263b5155bf 391 #ifndef XB_IMPORT_H
bokunimowakaru 3:d7263b5155bf 392 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 393 #ifndef __3694_H__
bokunimowakaru 3:d7263b5155bf 394 #include <3694.h>
bokunimowakaru 3:d7263b5155bf 395 #endif
bokunimowakaru 3:d7263b5155bf 396 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 397 #ifndef LCD_ROW_1
bokunimowakaru 3:d7263b5155bf 398 #include "lcd_h8.c"
bokunimowakaru 3:d7263b5155bf 399 #endif
bokunimowakaru 3:d7263b5155bf 400 #endif
bokunimowakaru 3:d7263b5155bf 401 /* // lcd_h8ライブラリの関数
bokunimowakaru 3:d7263b5155bf 402 void lcd_delay(unsigned int data);
bokunimowakaru 3:d7263b5155bf 403 void lcd_toggle_E(void);
bokunimowakaru 3:d7263b5155bf 404 void lcd_cls(void);
bokunimowakaru 3:d7263b5155bf 405 void lcd_home(void);
bokunimowakaru 3:d7263b5155bf 406 void lcd_control(unsigned char disonoff, unsigned char curonoff, unsigned char curblink);
bokunimowakaru 3:d7263b5155bf 407 void lcd_goto(unsigned char mesto);
bokunimowakaru 3:d7263b5155bf 408 void lcd_shift(unsigned char data);
bokunimowakaru 3:d7263b5155bf 409 void lcd_putch(char data);
bokunimowakaru 3:d7263b5155bf 410 void lcd_putstr(const char *data);
bokunimowakaru 3:d7263b5155bf 411 void lcd_disp_bin(unsigned char x);
bokunimowakaru 3:d7263b5155bf 412 void lcd_disp_hex(unsigned char i);
bokunimowakaru 3:d7263b5155bf 413 void lcd_disp_1(unsigned int x);
bokunimowakaru 3:d7263b5155bf 414 void lcd_disp_2(unsigned int x);
bokunimowakaru 3:d7263b5155bf 415 void lcd_disp_3(unsigned int x);
bokunimowakaru 3:d7263b5155bf 416 void lcd_disp_5(unsigned int x);
bokunimowakaru 3:d7263b5155bf 417 void lcd_init(void);
bokunimowakaru 3:d7263b5155bf 418 */
bokunimowakaru 3:d7263b5155bf 419 #elif ARDUINO
bokunimowakaru 3:d7263b5155bf 420 // #include <inttypes.h>
bokunimowakaru 3:d7263b5155bf 421 #include "Arduino.h"
bokunimowakaru 3:d7263b5155bf 422 // #include "WProgram.h" // #if ARDUINO < 100
bokunimowakaru 3:d7263b5155bf 423 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 424 #ifndef ADAFRUIT
bokunimowakaru 3:d7263b5155bf 425 // 通常のキャラクタLCDの場合
bokunimowakaru 3:d7263b5155bf 426 #include <LiquidCrystal.h>
bokunimowakaru 3:d7263b5155bf 427 #else
bokunimowakaru 3:d7263b5155bf 428 // Adafruit I2C接続LCDの場合(Adafruit_RGBLCDShieldライブラリが必要)
bokunimowakaru 3:d7263b5155bf 429 #include <Wire.h>
bokunimowakaru 3:d7263b5155bf 430 #include <Adafruit_MCP23017.h>
bokunimowakaru 3:d7263b5155bf 431 #include <Adafruit_RGBLCDShield.h>
bokunimowakaru 3:d7263b5155bf 432 #endif
bokunimowakaru 3:d7263b5155bf 433 #endif
bokunimowakaru 3:d7263b5155bf 434 #ifdef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 435 #include <SPI.h>
bokunimowakaru 3:d7263b5155bf 436 #include <Ethernet.h>
bokunimowakaru 3:d7263b5155bf 437 #include <EthernetUdp.h>
bokunimowakaru 3:d7263b5155bf 438 #endif
bokunimowakaru 3:d7263b5155bf 439 #ifndef LCD_ROW_1
bokunimowakaru 3:d7263b5155bf 440 #define LCD_ROW_1 0x00 //1行目先頭アドレス
bokunimowakaru 3:d7263b5155bf 441 #define LCD_ROW_2 0x40 //2行目先頭アドレス
bokunimowakaru 3:d7263b5155bf 442 #define LCD_ROW_3 0x14 //3行目先頭アドレス
bokunimowakaru 3:d7263b5155bf 443 #define LCD_ROW_4 0x54 //4行目先頭アドレス
bokunimowakaru 3:d7263b5155bf 444 #endif
bokunimowakaru 3:d7263b5155bf 445 #else
bokunimowakaru 3:d7263b5155bf 446 #ifdef ARM_MBED // ARM
bokunimowakaru 3:d7263b5155bf 447 #include "mbed.h"
bokunimowakaru 3:d7263b5155bf 448 #ifdef DEBUG
bokunimowakaru 3:d7263b5155bf 449 #define LCD_H
bokunimowakaru 3:d7263b5155bf 450 #define ERRLOG
bokunimowakaru 3:d7263b5155bf 451 #define LCD_ROW_1 0x00 //1行目先頭アドレス
bokunimowakaru 3:d7263b5155bf 452 #define LCD_ROW_2 0x40 //2行目先頭アドレス
bokunimowakaru 3:d7263b5155bf 453 #define LCD_ROW_3 0x14 //3行目先頭アドレス
bokunimowakaru 3:d7263b5155bf 454 #define LCD_ROW_4 0x54 //4行目先頭アドレス
bokunimowakaru 3:d7263b5155bf 455 #endif
bokunimowakaru 3:d7263b5155bf 456 #else // PC
bokunimowakaru 3:d7263b5155bf 457 #include <stdio.h>
bokunimowakaru 3:d7263b5155bf 458 #include <stdlib.h>
bokunimowakaru 3:d7263b5155bf 459 #include <string.h>
bokunimowakaru 3:d7263b5155bf 460 #include <termios.h>
bokunimowakaru 3:d7263b5155bf 461 #include <sys/signal.h>
bokunimowakaru 3:d7263b5155bf 462 #include <sys/time.h>
bokunimowakaru 3:d7263b5155bf 463 #include <fcntl.h>
bokunimowakaru 3:d7263b5155bf 464 #include <unistd.h>
bokunimowakaru 3:d7263b5155bf 465 #include <arpa/inet.h>
bokunimowakaru 3:d7263b5155bf 466 #ifdef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 467 #include <sys/types.h>
bokunimowakaru 3:d7263b5155bf 468 #include <sys/socket.h>
bokunimowakaru 3:d7263b5155bf 469 #include <netinet/in.h>
bokunimowakaru 3:d7263b5155bf 470 #include <ctype.h>
bokunimowakaru 3:d7263b5155bf 471 #include <sys/ioctl.h>
bokunimowakaru 3:d7263b5155bf 472 #include <string.h>
bokunimowakaru 3:d7263b5155bf 473 #endif
bokunimowakaru 3:d7263b5155bf 474 #define BAUDRATE B9600
bokunimowakaru 3:d7263b5155bf 475 #ifndef LCD_ROW_1
bokunimowakaru 3:d7263b5155bf 476 #include "lcd_pc.c"
bokunimowakaru 3:d7263b5155bf 477 #endif
bokunimowakaru 3:d7263b5155bf 478 #include <time.h> // クロックタイマー用
bokunimowakaru 3:d7263b5155bf 479 #endif
bokunimowakaru 3:d7263b5155bf 480 #endif
bokunimowakaru 3:d7263b5155bf 481 #define xbee_set_myaddress(adr) xbee_ratd_myaddress(adr)
bokunimowakaru 3:d7263b5155bf 482 #endif
bokunimowakaru 3:d7263b5155bf 483
bokunimowakaru 3:d7263b5155bf 484 /*********************************************************************
bokunimowakaru 3:d7263b5155bf 485 定数の設定
bokunimowakaru 3:d7263b5155bf 486 *********************************************************************/
bokunimowakaru 3:d7263b5155bf 487 #ifndef XB_DEFINE_H
bokunimowakaru 3:d7263b5155bf 488 #define XB_DEFINE_H
bokunimowakaru 3:d7263b5155bf 489 #ifndef NAME
bokunimowakaru 3:d7263b5155bf 490 #ifdef LITE // BeeBee Lite by 蘭
bokunimowakaru 3:d7263b5155bf 491 #define NAME "BeeBee Lite"
bokunimowakaru 3:d7263b5155bf 492 #define COPYRIGHT "by Wataru & Ran"
bokunimowakaru 3:d7263b5155bf 493 #else
bokunimowakaru 3:d7263b5155bf 494 #define NAME "ZB Coord"
bokunimowakaru 3:d7263b5155bf 495 #define COPYRIGHT "by Wataru KUNINO"
bokunimowakaru 3:d7263b5155bf 496 #endif
bokunimowakaru 3:d7263b5155bf 497 #endif
bokunimowakaru 3:d7263b5155bf 498
bokunimowakaru 3:d7263b5155bf 499 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 500 #define ERRLOG
bokunimowakaru 3:d7263b5155bf 501 #define LED1_OUT IO.PDR8.BIT.B0 // LED赤の接続ポート(エラー用)
bokunimowakaru 3:d7263b5155bf 502 #define LED2_OUT IO.PDR8.BIT.B1 // LED緑の接続ポート(動作確認用)
bokunimowakaru 3:d7263b5155bf 503 #define LCD_EN IO.PDR8.BIT.B6 // 液晶用電源
bokunimowakaru 3:d7263b5155bf 504 #define BUTN IO.PDR8.BIT.B2 // ボタンの接続ポート
bokunimowakaru 3:d7263b5155bf 505 #define SCI_SIZE 256 // シリアルデータ長(大きすぎるとRAMが不足する)
bokunimowakaru 3:d7263b5155bf 506 #define API_SIZE 128 // 受信用APIデータ長(32~255)
bokunimowakaru 3:d7263b5155bf 507 #define API_TXSIZE 64 // 送信用APIデータ長(32~255) シリアル送信最大長=API_TXSIZE-18バイト
bokunimowakaru 3:d7263b5155bf 508 #define CALL_SIZE 32 // xbee_rx_call用戻りデータ(10~256)
bokunimowakaru 3:d7263b5155bf 509 #define XB_AT_SIZE 32 // ATコマンドの最大長
bokunimowakaru 3:d7263b5155bf 510 #elif ARDUINO
bokunimowakaru 3:d7263b5155bf 511 // #define LED1_OUT 15 // 赤色LED(エラー用)用デジタルポート(15=analog 1)
bokunimowakaru 3:d7263b5155bf 512 // #define LED2_OUT 16 // 緑色LED(動作確認用)用デジタルポート(16=analog 2)
bokunimowakaru 3:d7263b5155bf 513 // #define LCD_EN 6 // 液晶用電源デジタルポート
bokunimowakaru 3:d7263b5155bf 514 // #define BUTN 14 // ボタンの接続ポート(14 = analog 0)
bokunimowakaru 3:d7263b5155bf 515 #ifdef LITE // BeeBee Lite by 蘭
bokunimowakaru 3:d7263b5155bf 516 #define API_SIZE 48 // 受信用APIデータ長(32~255)
bokunimowakaru 3:d7263b5155bf 517 #define API_TXSIZE 34 // 送信用APIデータ長(32~255) シリアル送信最大長=API_TXSIZE-18バイト
bokunimowakaru 3:d7263b5155bf 518 #define CALL_SIZE 16 // xbee_rx_call用戻りデータ(10~256)
bokunimowakaru 3:d7263b5155bf 519 #define XB_AT_SIZE 16 // ATコマンドの最大長
bokunimowakaru 3:d7263b5155bf 520 #else
bokunimowakaru 3:d7263b5155bf 521 #define CACHE_RES 2 // 応答時のキャッシュ数(無効にするには定義を消す)
bokunimowakaru 3:d7263b5155bf 522 #define API_SIZE 64 // 受信用APIデータ長(32~255)
bokunimowakaru 3:d7263b5155bf 523 #define API_TXSIZE 64 // 送信用APIデータ長(32~255)
bokunimowakaru 3:d7263b5155bf 524 #define CALL_SIZE 32 // xbee_rx_call用戻りデータ(10~256)
bokunimowakaru 3:d7263b5155bf 525 #define XB_AT_SIZE 32 // ATコマンドの最大長
bokunimowakaru 3:d7263b5155bf 526 #endif
bokunimowakaru 3:d7263b5155bf 527 #define LIGHT 1
bokunimowakaru 3:d7263b5155bf 528 #define TEMP 2
bokunimowakaru 3:d7263b5155bf 529 #define HUMIDITY 3
bokunimowakaru 3:d7263b5155bf 530 #define WATT 4
bokunimowakaru 3:d7263b5155bf 531 #define BATT 5
bokunimowakaru 3:d7263b5155bf 532 #define DISABLE 0
bokunimowakaru 3:d7263b5155bf 533 #define VENDER 1
bokunimowakaru 3:d7263b5155bf 534 #define AIN 2
bokunimowakaru 3:d7263b5155bf 535 #define DIN 3
bokunimowakaru 3:d7263b5155bf 536 #define DOUT_L 4
bokunimowakaru 3:d7263b5155bf 537 #define DOUT_H 5
bokunimowakaru 3:d7263b5155bf 538 #else
bokunimowakaru 3:d7263b5155bf 539 #ifdef ARM_MBED // ARM <条件は調整していない。ほぼArduinoのまま>
bokunimowakaru 3:d7263b5155bf 540 #define CACHE_RES 3 // 応答時のキャッシュ数(無効にするには定義を消す)
bokunimowakaru 3:d7263b5155bf 541 #define API_SIZE 64 // 受信用APIデータ長(32~255)
bokunimowakaru 3:d7263b5155bf 542 #define API_TXSIZE 64 // 送信用APIデータ長(32~255)
bokunimowakaru 3:d7263b5155bf 543 #define CALL_SIZE 32 // xbee_rx_call用戻りデータ(10~256)
bokunimowakaru 3:d7263b5155bf 544 #define XB_AT_SIZE 32 // ATコマンドの最大長
bokunimowakaru 3:d7263b5155bf 545 #define delay(ms) wait_millisec(ms) // 関数名の複製
bokunimowakaru 3:d7263b5155bf 546 #define LIGHT 1
bokunimowakaru 3:d7263b5155bf 547 #define TEMP 2
bokunimowakaru 3:d7263b5155bf 548 #define HUMIDITY 3
bokunimowakaru 3:d7263b5155bf 549 #define WATT 4
bokunimowakaru 3:d7263b5155bf 550 #define BATT 5
bokunimowakaru 3:d7263b5155bf 551 #define DISABLE 0
bokunimowakaru 3:d7263b5155bf 552 #define VENDER 1
bokunimowakaru 3:d7263b5155bf 553 #define AIN 2
bokunimowakaru 3:d7263b5155bf 554 #define DIN 3
bokunimowakaru 3:d7263b5155bf 555 #define DOUT_L 4
bokunimowakaru 3:d7263b5155bf 556 #define DOUT_H 5
bokunimowakaru 3:d7263b5155bf 557 #else // PC
bokunimowakaru 3:d7263b5155bf 558 // #define DEBUG // デバッグモード
bokunimowakaru 3:d7263b5155bf 559 // #define DEBUG_TX // 送信パケットの表示
bokunimowakaru 3:d7263b5155bf 560 // #define DEBUG_RX // 受信パケットの表示
bokunimowakaru 3:d7263b5155bf 561 #define ERRLOG // エラー時にログを出力
bokunimowakaru 3:d7263b5155bf 562 // #define XBEE_ERROR_TIME // エラー時のログに日時を付与
bokunimowakaru 3:d7263b5155bf 563 #ifdef LITE // BeeBee Lite by 蘭
bokunimowakaru 3:d7263b5155bf 564 #define API_SIZE 48 // 受信用APIデータ長(32~255)
bokunimowakaru 3:d7263b5155bf 565 #define API_TXSIZE 34 // 送信用APIデータ長(32~255)
bokunimowakaru 3:d7263b5155bf 566 #define CALL_SIZE 16 // xbee_rx_call用戻りデータ(10~256)
bokunimowakaru 3:d7263b5155bf 567 #define XB_AT_SIZE 16 // ATコマンドの最大長
bokunimowakaru 3:d7263b5155bf 568 #else
bokunimowakaru 3:d7263b5155bf 569 #define CACHE_RES 5 // 応答時のキャッシュ数(無効にするには定義を消す)
bokunimowakaru 3:d7263b5155bf 570 #define API_SIZE 128 // 受信用APIデータ長(32~255)
bokunimowakaru 3:d7263b5155bf 571 #define API_TXSIZE 64 // 送信用APIデータ長(32~255)
bokunimowakaru 3:d7263b5155bf 572 #define CALL_SIZE 64 // xbee_rx_call用戻りデータ(10~256)
bokunimowakaru 3:d7263b5155bf 573 #define XB_AT_SIZE 32 // ATコマンドの最大長
bokunimowakaru 3:d7263b5155bf 574 #define delay(ms) wait_millisec(ms) // 関数名の複製
bokunimowakaru 3:d7263b5155bf 575 #endif
bokunimowakaru 3:d7263b5155bf 576 #endif
bokunimowakaru 3:d7263b5155bf 577 #endif
bokunimowakaru 3:d7263b5155bf 578 #define TIME_DEL 3 // デリミタ検出のタイムアウト時間(秒)
bokunimowakaru 3:d7263b5155bf 579 #define MODE_AUTO 0x00 // 自動受信モード
bokunimowakaru 3:d7263b5155bf 580 #define MODE_GPIN 0x92 // GPI data を受信するモード
bokunimowakaru 3:d7263b5155bf 581 #define MODE_UART 0x90 // UART data を受信するモード
bokunimowakaru 3:d7263b5155bf 582 #define MODE_UAR2 0x91 // UART data を受信するモード2(AO=1)
bokunimowakaru 3:d7263b5155bf 583 #define MODE_SENS 0x94 // XB Sensorを受信するモード(1wire専用→通常のSensorはATISを使用)
bokunimowakaru 3:d7263b5155bf 584 #define MODE_IDNT 0x95 // Node Identifyを受信するモード
bokunimowakaru 3:d7263b5155bf 585 #define MODE_RES 0x88 // ローカルATコマンドの結果を受信
bokunimowakaru 3:d7263b5155bf 586 #define MODE_RESP 0x97 // リモートATコマンドの結果を受信(仕様書はATNDで説明ATISもこれ)
bokunimowakaru 3:d7263b5155bf 587 #define MODE_MODM 0x8A // Modem Statusを受信
bokunimowakaru 3:d7263b5155bf 588 #define MODE_TXST 0x8B // UART Transmit Status を受信
bokunimowakaru 3:d7263b5155bf 589 #define MODE_BATT 0xE1 // (独自定義)バッテリステータス RAT%Vの応答時
bokunimowakaru 3:d7263b5155bf 590 // XBeeのFrame Typeに準拠する。
bokunimowakaru 3:d7263b5155bf 591 // 注意:モードを増やしたときはxbee_from_acumとxbee_rx_call内の対応を追加すること
bokunimowakaru 3:d7263b5155bf 592 // 独自定義の時はxbee_rx_call内のみ。
bokunimowakaru 3:d7263b5155bf 593 // MODE値はenum定義にしない。
bokunimowakaru 3:d7263b5155bf 594
bokunimowakaru 3:d7263b5155bf 595 #define STATUS_OK 0x00 // ATコマンドの結果がOK
bokunimowakaru 3:d7263b5155bf 596 #define STATUS_ERR 0x01 // ATコマンドの結果がERROR
bokunimowakaru 3:d7263b5155bf 597 #define STATUS_ERR_AT 0x02 // 指定されたATコマンドに誤りがある
bokunimowakaru 3:d7263b5155bf 598 #define STATUS_ERR_PARM 0x03 // 指定されたパラメータに誤りがある
bokunimowakaru 3:d7263b5155bf 599 #define STATUS_ERR_AIR 0x04 // リモートATコマンドの送信の失敗(相手が応答しない)
bokunimowakaru 3:d7263b5155bf 600
bokunimowakaru 3:d7263b5155bf 601 #define MODM_RESET 0x01 // ローカルのXBeeがリセットした
bokunimowakaru 3:d7263b5155bf 602 #define MODM_WATCHDOG 0x02 // ローカルのXBeeがWatch dogタイマーによってリセットした
bokunimowakaru 3:d7263b5155bf 603 #define MODM_JOINED 0x03 // (RouterまたはEnd Deviceで使用しているときに)ネットワークJoinした
bokunimowakaru 3:d7263b5155bf 604 #define MODM_LEFT 0x04 // ネットワークからdis_assosiateした
bokunimowakaru 3:d7263b5155bf 605 #define MODM_STARTED 0x06 // (coordinatorで使用しているときに)Coordinatorを開始した
bokunimowakaru 3:d7263b5155bf 606
bokunimowakaru 3:d7263b5155bf 607 #define DEV_TYPE_XBEE 0x00 // XBeeモジュール
bokunimowakaru 3:d7263b5155bf 608 #define DEV_TYPE_RS232 0x05 // RS-232Cアダプタ
bokunimowakaru 3:d7263b5155bf 609 #define DEV_TYPE_SENS 0x07 // Sensor (1wire専用)
bokunimowakaru 3:d7263b5155bf 610 #define DEV_TYPE_WALL 0x08 // Wall Router
bokunimowakaru 3:d7263b5155bf 611 #define DEV_TYPE_SEN_LT 0x0E // Sensor (照度・温度)
bokunimowakaru 3:d7263b5155bf 612 #define DEV_TYPE_SEN_LTH 0x0D // Sensor (照度・温度・湿度)
bokunimowakaru 3:d7263b5155bf 613 #define DEV_TYPE_PLUG 0x0F // Smart Plug
bokunimowakaru 3:d7263b5155bf 614
bokunimowakaru 3:d7263b5155bf 615 #define ZB_TYPE_COORD 0x21 // ZigBee Coordinator
bokunimowakaru 3:d7263b5155bf 616 #define ZB_TYPE_ROUTER 0x23 // ZigBee Router
bokunimowakaru 3:d7263b5155bf 617 #define ZB_TYPE_ENDDEV 0x29 // ZigBee End Device
bokunimowakaru 3:d7263b5155bf 618 #define XB_TYPE_NULL 0x00 // XBee Wi-Fi バージョン未取得
bokunimowakaru 3:d7263b5155bf 619 #define XB_TYPE_WIFI10 0x10 // XBee Wi-Fi Ver. 10xx
bokunimowakaru 3:d7263b5155bf 620 #define XB_TYPE_WIFI20 0x20 // XBee Wi-Fi Ver. 20xx
bokunimowakaru 3:d7263b5155bf 621
bokunimowakaru 3:d7263b5155bf 622 #define NET_ADR FFFE // ネットワークアドレス
bokunimowakaru 3:d7263b5155bf 623 #endif
bokunimowakaru 3:d7263b5155bf 624
bokunimowakaru 3:d7263b5155bf 625 /*********************************************************************
bokunimowakaru 3:d7263b5155bf 626 型の定義とグローバル変数の宣言
bokunimowakaru 3:d7263b5155bf 627 *********************************************************************/
bokunimowakaru 3:d7263b5155bf 628 #ifndef XB_GLOBAL_H
bokunimowakaru 3:d7263b5155bf 629 #define XB_GLOBAL_H
bokunimowakaru 3:d7263b5155bf 630 typedef unsigned char byte; // Arduinoでも必要
bokunimowakaru 3:d7263b5155bf 631 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 632 byte TIMER_SEC = 0 ; //RTCカウント用1秒単位
bokunimowakaru 3:d7263b5155bf 633 char sci_tx[SCI_SIZE]; // シリアル用
bokunimowakaru 3:d7263b5155bf 634 char sci_rx[SCI_SIZE];
bokunimowakaru 3:d7263b5155bf 635 #elif ARDUINO
bokunimowakaru 3:d7263b5155bf 636 #define TIMER_SEC time1s256()
bokunimowakaru 3:d7263b5155bf 637 #else
bokunimowakaru 3:d7263b5155bf 638 #ifdef ARM_MBED
bokunimowakaru 3:d7263b5155bf 639 #define TIMER_SEC time1s256()
bokunimowakaru 3:d7263b5155bf 640 #else // PC
bokunimowakaru 3:d7263b5155bf 641 #define TIMER_SEC time1s256() // TIMER_SECのカウントアップの代わり
bokunimowakaru 3:d7263b5155bf 642 volatile byte LED1_OUT;
bokunimowakaru 3:d7263b5155bf 643 volatile byte LED2_OUT;
bokunimowakaru 3:d7263b5155bf 644 volatile byte LCD_EN;
bokunimowakaru 3:d7263b5155bf 645 #endif
bokunimowakaru 3:d7263b5155bf 646 #endif
bokunimowakaru 3:d7263b5155bf 647
bokunimowakaru 3:d7263b5155bf 648 #ifdef ARDUINO
bokunimowakaru 3:d7263b5155bf 649 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 650 #ifndef ADAFRUIT
bokunimowakaru 3:d7263b5155bf 651 // 通常のキャラクタLCDの場合
bokunimowakaru 3:d7263b5155bf 652 LiquidCrystal xbee_ardlcd(8, 9, 4, 5, 6, 7);
bokunimowakaru 3:d7263b5155bf 653 //LCD設定 rs en d0 d1 d2 d3
bokunimowakaru 3:d7263b5155bf 654 #else
bokunimowakaru 3:d7263b5155bf 655 // Adafruit I2C接続LCDの場合(Adafruit_RGBLCDShieldライブラリが必要)
bokunimowakaru 3:d7263b5155bf 656 Adafruit_RGBLCDShield xbee_ardlcd = Adafruit_RGBLCDShield();
bokunimowakaru 3:d7263b5155bf 657 #endif
bokunimowakaru 3:d7263b5155bf 658 #endif
bokunimowakaru 3:d7263b5155bf 659
bokunimowakaru 3:d7263b5155bf 660 // 構造体の宣言
bokunimowakaru 3:d7263b5155bf 661 typedef struct{
bokunimowakaru 3:d7263b5155bf 662 byte MODE; // 受信モード(Frame Type)
bokunimowakaru 3:d7263b5155bf 663 byte FROM[8]; // 送信元IEEEアドレス
bokunimowakaru 3:d7263b5155bf 664 byte AT[2]; // ATコマンド
bokunimowakaru 3:d7263b5155bf 665 byte ID; // 応答パケットID(Frame ID)
bokunimowakaru 3:d7263b5155bf 666 byte STATUS; // 応答結果(0:OK 1:ERROR)/AT結果/UART状態
bokunimowakaru 3:d7263b5155bf 667 union { // GPIOデータ
bokunimowakaru 3:d7263b5155bf 668 byte BYTE[2];
bokunimowakaru 3:d7263b5155bf 669 struct { // バイト毎に下位ビットから代入(リトルエンディアン)
bokunimowakaru 3:d7263b5155bf 670 byte D0 :1; byte D1 :1; byte D2 :1; byte D3 :1; // BYTE[1]
bokunimowakaru 3:d7263b5155bf 671 byte D4 :1; byte D5 :1; byte D6 :1; byte D7 :1;
bokunimowakaru 3:d7263b5155bf 672 byte :1; byte :1; byte D10:1; byte D11:1; // BYTE[0]
bokunimowakaru 3:d7263b5155bf 673 byte D12:1; byte :1; byte :1; byte :1;
bokunimowakaru 3:d7263b5155bf 674 } PORT;
bokunimowakaru 3:d7263b5155bf 675 } GPI;
bokunimowakaru 3:d7263b5155bf 676 // byte GPI[2]; // GPIOデータ
bokunimowakaru 3:d7263b5155bf 677 unsigned int ADCIN[4]; // ADCデータ
bokunimowakaru 3:d7263b5155bf 678 byte DATA[CALL_SIZE]; // 受信データ
bokunimowakaru 3:d7263b5155bf 679 } XBEE_RESULT; // 構造体の型名
bokunimowakaru 3:d7263b5155bf 680 #else
bokunimowakaru 3:d7263b5155bf 681 #ifdef ARM_MBED // ARM
bokunimowakaru 3:d7263b5155bf 682 // 構造体の宣言
bokunimowakaru 3:d7263b5155bf 683 typedef struct{
bokunimowakaru 3:d7263b5155bf 684 byte MODE; // 受信モード(Frame Type)
bokunimowakaru 3:d7263b5155bf 685 byte FROM[8]; // 送信元IEEEアドレス
bokunimowakaru 3:d7263b5155bf 686 byte AT[2]; // ATコマンド
bokunimowakaru 3:d7263b5155bf 687 byte ID; // 応答パケットID(Frame ID)
bokunimowakaru 3:d7263b5155bf 688 byte STATUS; // 応答結果(0:OK 1:ERROR)/AT結果/UART状態
bokunimowakaru 3:d7263b5155bf 689 union { // GPIOデータ
bokunimowakaru 3:d7263b5155bf 690 byte BYTE[2];
bokunimowakaru 3:d7263b5155bf 691 struct { // バイト毎に下位ビットから代入(リトルエンディアン)
bokunimowakaru 3:d7263b5155bf 692 byte D0 :1; byte D1 :1; byte D2 :1; byte D3 :1; // BYTE[1]
bokunimowakaru 3:d7263b5155bf 693 byte D4 :1; byte D5 :1; byte D6 :1; byte D7 :1;
bokunimowakaru 3:d7263b5155bf 694 byte :1; byte :1; byte D10:1; byte D11:1; // BYTE[0]
bokunimowakaru 3:d7263b5155bf 695 byte D12:1; byte :1; byte :1; byte :1;
bokunimowakaru 3:d7263b5155bf 696 } PORT;
bokunimowakaru 3:d7263b5155bf 697 } GPI;
bokunimowakaru 3:d7263b5155bf 698 // byte GPI[2]; // GPIOデータ
bokunimowakaru 3:d7263b5155bf 699 unsigned int ADCIN[4]; // ADCデータ
bokunimowakaru 3:d7263b5155bf 700 byte DATA[CALL_SIZE]; // 受信データ
bokunimowakaru 3:d7263b5155bf 701 } XBEE_RESULT; // 構造体の型名
bokunimowakaru 3:d7263b5155bf 702 #else // PC
bokunimowakaru 3:d7263b5155bf 703 enum xbee_sensor_type{ LIGHT,TEMP,HUMIDITY,WATT,BATT,PRESS,VALUE,TIMES,NA }; // センサタイプの型
bokunimowakaru 3:d7263b5155bf 704 enum xbee_port_type{ DISABLE=0, VENDER=1, AIN=2, DIN=3, DOUT_L=4, DOUT_H=5 };
bokunimowakaru 3:d7263b5155bf 705 // GPIOの設定の型
bokunimowakaru 3:d7263b5155bf 706 typedef struct{
bokunimowakaru 3:d7263b5155bf 707 byte MODE; // 受信モード(Frame Type)
bokunimowakaru 3:d7263b5155bf 708 byte FROM[8]; // 送信元IEEEアドレス
bokunimowakaru 3:d7263b5155bf 709 byte SHORT[2]; // 送信元ショートアドレス
bokunimowakaru 3:d7263b5155bf 710 byte AT[2]; // ATコマンド
bokunimowakaru 3:d7263b5155bf 711 byte ID; // 応答パケットID(Frame ID)
bokunimowakaru 3:d7263b5155bf 712 byte STATUS; // 応答結果(0:OK 1:ERROR)/AT結果/UART状態
bokunimowakaru 3:d7263b5155bf 713 union { // GPIOデータ
bokunimowakaru 3:d7263b5155bf 714 byte BYTE[2];
bokunimowakaru 3:d7263b5155bf 715 struct {
bokunimowakaru 3:d7263b5155bf 716 #ifdef H3694 // H8ではバイト毎に上位ビットから代入(ビッグエンディアン)
bokunimowakaru 3:d7263b5155bf 717 byte D7 :1; byte D6 :1; byte D5 :1; byte D4 :1; // BYTE[1]
bokunimowakaru 3:d7263b5155bf 718 byte D3 :1; byte D2 :1; byte D1 :1; byte D0 :1;
bokunimowakaru 3:d7263b5155bf 719 byte :1; byte :1; byte :1; byte D12:1; // BYTE[0]
bokunimowakaru 3:d7263b5155bf 720 byte D11:1; byte D10:1; byte :1; byte :1;
bokunimowakaru 3:d7263b5155bf 721 #else // PCではバイト毎に下位ビットから代入(リトルエンディアン)
bokunimowakaru 3:d7263b5155bf 722 byte D0 :1; byte D1 :1; byte D2 :1; byte D3 :1; // BYTE[1]
bokunimowakaru 3:d7263b5155bf 723 byte D4 :1; byte D5 :1; byte D6 :1; byte D7 :1;
bokunimowakaru 3:d7263b5155bf 724 byte :1; byte :1; byte D10:1; byte D11:1; // BYTE[0]
bokunimowakaru 3:d7263b5155bf 725 byte D12:1; byte :1; byte :1; byte :1;
bokunimowakaru 3:d7263b5155bf 726 #endif
bokunimowakaru 3:d7263b5155bf 727 } PORT;
bokunimowakaru 3:d7263b5155bf 728 } GPI;
bokunimowakaru 3:d7263b5155bf 729 unsigned int ADCIN[4]; // ADCデータ
bokunimowakaru 3:d7263b5155bf 730 byte ZCL[6]; // [0]送信元EndPoint, [1]宛先EndPoint, [2-3]クラスタID, [4-5]プロファイルID
bokunimowakaru 3:d7263b5155bf 731 byte DATA[CALL_SIZE]; // ペイロードデータ/ZCLヘッダ+受信データ
bokunimowakaru 3:d7263b5155bf 732 } XBEE_RESULT;
bokunimowakaru 3:d7263b5155bf 733 #endif
bokunimowakaru 3:d7263b5155bf 734 #endif
bokunimowakaru 3:d7263b5155bf 735 #ifdef CACHE_RES
bokunimowakaru 3:d7263b5155bf 736 byte CACHE_MEM[CACHE_RES][API_SIZE];
bokunimowakaru 3:d7263b5155bf 737 byte CACHE_COUNTER = 0;
bokunimowakaru 3:d7263b5155bf 738 #endif
bokunimowakaru 3:d7263b5155bf 739 #endif
bokunimowakaru 3:d7263b5155bf 740
bokunimowakaru 3:d7263b5155bf 741 #ifdef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 742 byte ADR_MY[] = {0xFF,0xFF,0xFF,0xFF};
bokunimowakaru 3:d7263b5155bf 743 #ifdef ARDUINO
bokunimowakaru 3:d7263b5155bf 744 extern byte mac[6];
bokunimowakaru 3:d7263b5155bf 745 EthernetUDP UdpXBeeR;
bokunimowakaru 3:d7263b5155bf 746 EthernetUDP UdpXBeeT;
bokunimowakaru 3:d7263b5155bf 747 EthernetUDP UdpXBeeU;
bokunimowakaru 3:d7263b5155bf 748 #endif
bokunimowakaru 3:d7263b5155bf 749 #endif
bokunimowakaru 3:d7263b5155bf 750
bokunimowakaru 3:d7263b5155bf 751 /*********************************************************************
bokunimowakaru 3:d7263b5155bf 752 スタティック変数の宣言
bokunimowakaru 3:d7263b5155bf 753 *********************************************************************/
bokunimowakaru 3:d7263b5155bf 754
bokunimowakaru 3:d7263b5155bf 755 /* エラーログ用 */
bokunimowakaru 3:d7263b5155bf 756 #ifdef ERRLOG
bokunimowakaru 3:d7263b5155bf 757 static byte TIMER_ERR = 0 ; //エラー経過時間1秒単位
bokunimowakaru 3:d7263b5155bf 758 static char ERR_LOG[API_TXSIZE-18];
bokunimowakaru 3:d7263b5155bf 759 static byte ERR_CODE=0x00;
bokunimowakaru 3:d7263b5155bf 760 #endif
bokunimowakaru 3:d7263b5155bf 761
bokunimowakaru 3:d7263b5155bf 762 /* IEEEアドレス(最小限の通信対象をライブラリ側で保持する)/複数のデバイスへの対応はアプリ側で行う*/
bokunimowakaru 3:d7263b5155bf 763 static byte ADR_FROM[]= {0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF}; //差出人のIEEEアドレス(変更可)
bokunimowakaru 3:d7263b5155bf 764
bokunimowakaru 3:d7263b5155bf 765 // 以下にお手持ちのXBeeのアドレスを予め設定しておくと毎回の検索が不要です。
bokunimowakaru 3:d7263b5155bf 766 static byte ADR_DEST[]= {0x00,0x13,0xA2,0x00,0x00,0x00,0x00,0x00}; //宛先のIEEEアドレス(変更可)
bokunimowakaru 3:d7263b5155bf 767
bokunimowakaru 3:d7263b5155bf 768 /* ショートアドレス/本ライブラリでの宛先指定はIEEEのみを使う */
bokunimowakaru 3:d7263b5155bf 769 static byte SADR_DEST[]= {0xFF,0xFE}; //ブロード(ショート)アドレス
bokunimowakaru 3:d7263b5155bf 770 static byte PACKET_ID = 0; //送信パケット番号
bokunimowakaru 3:d7263b5155bf 771
bokunimowakaru 3:d7263b5155bf 772 /* XBeeのデバイスタイプ ATVRの上2ケタ */
bokunimowakaru 3:d7263b5155bf 773 static byte DEVICE_TYPE = ZB_TYPE_COORD; // Coord=0x21 Router=23 ED=29 Wi-Fi=10
bokunimowakaru 3:d7263b5155bf 774
bokunimowakaru 3:d7263b5155bf 775 #ifndef H3694
bokunimowakaru 3:d7263b5155bf 776 #ifndef ARDUINO
bokunimowakaru 3:d7263b5155bf 777 #ifndef ARM_MBED // PC
bokunimowakaru 3:d7263b5155bf 778 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 779 static byte xbee_com_port;
bokunimowakaru 3:d7263b5155bf 780 static int xbeeComFd;
bokunimowakaru 3:d7263b5155bf 781 static struct termios oldtio; /* current serial port settings (現在のシリアルポートの設定を待避)*/
bokunimowakaru 3:d7263b5155bf 782 // static byte *receive_buffer;
bokunimowakaru 3:d7263b5155bf 783 #else // XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 784 int xbeeTSFd; // XBee Wi-Fi 送信ソケット用 ディスクリプタ
bokunimowakaru 3:d7263b5155bf 785 int xbeeRSFd; // XBee Wi-Fi 受信ソケット用 ディスクリプタ
bokunimowakaru 3:d7263b5155bf 786 int xbeeUSFd; // XBee Wi-Fi UARTソケット用 ディスクリプタ
bokunimowakaru 3:d7263b5155bf 787 struct sockaddr_in xbeeT_addr; // XBee Wi-Fi 送信アドレス構造体変数
bokunimowakaru 3:d7263b5155bf 788 struct sockaddr_in xbeeR_addr; // XBee Wi-Fi 受信アドレス構造体変数
bokunimowakaru 3:d7263b5155bf 789 struct sockaddr_in xbeeU_addr; // XBee Wi-Fi UARTアドレス構造体変数
bokunimowakaru 3:d7263b5155bf 790 #endif
bokunimowakaru 3:d7263b5155bf 791 #endif
bokunimowakaru 3:d7263b5155bf 792 #endif
bokunimowakaru 3:d7263b5155bf 793 #endif
bokunimowakaru 3:d7263b5155bf 794
bokunimowakaru 3:d7263b5155bf 795 /*********************************************************************
bokunimowakaru 3:d7263b5155bf 796 ハードウェア
bokunimowakaru 3:d7263b5155bf 797 *********************************************************************/
bokunimowakaru 3:d7263b5155bf 798
bokunimowakaru 3:d7263b5155bf 799 /* H8タイニーマイコン H3694用のタイマー設定、GPIOポート設定 */
bokunimowakaru 3:d7263b5155bf 800 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 801 void port_init(void){
bokunimowakaru 3:d7263b5155bf 802
bokunimowakaru 3:d7263b5155bf 803 /*ポート1 76543210*/
bokunimowakaru 3:d7263b5155bf 804 IO.PMR1.BYTE = 0b00000000; // モード(P1,5) 入出力=0 その他=1
bokunimowakaru 3:d7263b5155bf 805 IO.PCR1 = 0b11110110; // 入出力設定 入力 =0 出力 =1 B3=リザーブ
bokunimowakaru 3:d7263b5155bf 806 IO.PUCR1.BYTE = 0b00000000; // プルアップ(P1,5) しない=0 する =1
bokunimowakaru 3:d7263b5155bf 807 IO.PDR1.BYTE = 0b00000000; // アクセス L出力=0 H出力=1
bokunimowakaru 3:d7263b5155bf 808
bokunimowakaru 3:d7263b5155bf 809 /*ポート8 76543210*/ // 秋月 H8 Tiny I/O BOARD TERA2 [K-00207]用
bokunimowakaru 3:d7263b5155bf 810 IO.PCR8 = 0b11111011; // 入出力設定 入力 =0 出力 =1
bokunimowakaru 3:d7263b5155bf 811 IO.PDR8.BYTE = 0b00000000; // アクセス L出力=0 H出力=1
bokunimowakaru 3:d7263b5155bf 812 }
bokunimowakaru 3:d7263b5155bf 813
bokunimowakaru 3:d7263b5155bf 814 /* タイマー初期化 */
bokunimowakaru 3:d7263b5155bf 815 void timer_sec_init(void){
bokunimowakaru 3:d7263b5155bf 816 DI;
bokunimowakaru 3:d7263b5155bf 817 TA.TMA.BYTE =0b00001000; /* 時計用クロック */
bokunimowakaru 3:d7263b5155bf 818 /* | |||-|__ 分周比 000~111(高速時) 000~011(低即時)
bokunimowakaru 3:d7263b5155bf 819 固定値 ___|--|| 000:0.5120 sec. 000 1000 msec.
bokunimowakaru 3:d7263b5155bf 820 | 001:0.2560 sec. 001 500 msec.
bokunimowakaru 3:d7263b5155bf 821 高速=0, 低速=1 _______| 100:0.0160 sec. 010 250 msec.
bokunimowakaru 3:d7263b5155bf 822 111:0.0005 sec. 011 31.25 msec.*/
bokunimowakaru 3:d7263b5155bf 823
bokunimowakaru 3:d7263b5155bf 824 IRR1.BIT.IRRTA =0; /* タイマーA割込みフラグのリセット */
bokunimowakaru 3:d7263b5155bf 825 IENR1.BIT.IENTA =1; /* タイマーA割込みを利用可能にする */
bokunimowakaru 3:d7263b5155bf 826 EI;
bokunimowakaru 3:d7263b5155bf 827 }
bokunimowakaru 3:d7263b5155bf 828
bokunimowakaru 3:d7263b5155bf 829 /* AKI H8 TINY IO BOARD TERA2 用/PC用の接続デバイス設定*/
bokunimowakaru 3:d7263b5155bf 830 byte led_red( const byte in ){
bokunimowakaru 3:d7263b5155bf 831 if ( in == 0 ) LED1_OUT=0;
bokunimowakaru 3:d7263b5155bf 832 else if ( in == 1 ) LED1_OUT=1;
bokunimowakaru 3:d7263b5155bf 833 return( LED1_OUT );
bokunimowakaru 3:d7263b5155bf 834 }
bokunimowakaru 3:d7263b5155bf 835 byte led_green( const byte in ){
bokunimowakaru 3:d7263b5155bf 836 if ( in == 0 ) LED2_OUT=0;
bokunimowakaru 3:d7263b5155bf 837 else if ( in == 1 ) LED2_OUT=1;
bokunimowakaru 3:d7263b5155bf 838 return( LED2_OUT );
bokunimowakaru 3:d7263b5155bf 839 }
bokunimowakaru 3:d7263b5155bf 840 byte button( void ){
bokunimowakaru 3:d7263b5155bf 841 return( BUTN );
bokunimowakaru 3:d7263b5155bf 842 }
bokunimowakaru 3:d7263b5155bf 843 void lcd_enable( const byte in ){
bokunimowakaru 3:d7263b5155bf 844 LCD_EN = in;
bokunimowakaru 3:d7263b5155bf 845 }
bokunimowakaru 3:d7263b5155bf 846 #endif
bokunimowakaru 3:d7263b5155bf 847
bokunimowakaru 3:d7263b5155bf 848 /* ARM mbed 用 のタイマー設定 */
bokunimowakaru 3:d7263b5155bf 849 #ifdef ARM_MBED // http://mbed.org/handbook/Timer
bokunimowakaru 3:d7263b5155bf 850 Timer _xbee_time; // http://mbed.org/teams/Aerodyne/code/Timer/file/1d3fd5616c0a/Timer.cpp
bokunimowakaru 3:d7263b5155bf 851 void _xbee_time_init(){
bokunimowakaru 3:d7263b5155bf 852 _xbee_time.start();
bokunimowakaru 3:d7263b5155bf 853 }
bokunimowakaru 3:d7263b5155bf 854 #endif
bokunimowakaru 3:d7263b5155bf 855
bokunimowakaru 3:d7263b5155bf 856 /* RTC使用1秒カウント */
bokunimowakaru 3:d7263b5155bf 857 byte time1s256(){
bokunimowakaru 3:d7263b5155bf 858 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 859 return(0x00);
bokunimowakaru 3:d7263b5155bf 860 #elif ARDUINO
bokunimowakaru 3:d7263b5155bf 861 return( (byte)(millis()/1000) );
bokunimowakaru 3:d7263b5155bf 862 #else
bokunimowakaru 3:d7263b5155bf 863 #ifdef ARM_MBED
bokunimowakaru 3:d7263b5155bf 864 return( (byte)(_xbee_time.read()) );
bokunimowakaru 3:d7263b5155bf 865 // return(0);
bokunimowakaru 3:d7263b5155bf 866 #else //PC
bokunimowakaru 3:d7263b5155bf 867 // char c='\0';
bokunimowakaru 3:d7263b5155bf 868 // if (kbhit()) c = getch();
bokunimowakaru 3:d7263b5155bf 869 time_t sec;
bokunimowakaru 3:d7263b5155bf 870 time( &sec );
bokunimowakaru 3:d7263b5155bf 871 return( (byte)sec );
bokunimowakaru 3:d7263b5155bf 872 #endif
bokunimowakaru 3:d7263b5155bf 873 #endif
bokunimowakaru 3:d7263b5155bf 874 }
bokunimowakaru 3:d7263b5155bf 875
bokunimowakaru 3:d7263b5155bf 876 /* RTCによる割り込み処理(1秒毎) */
bokunimowakaru 3:d7263b5155bf 877 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 878 void int_timera(void){
bokunimowakaru 3:d7263b5155bf 879 led_green( TIMER_SEC & 0x01 ); // LEDの正常点滅
bokunimowakaru 3:d7263b5155bf 880 #ifdef ERRLOG
bokunimowakaru 3:d7263b5155bf 881 if( led_red( 0xFF ) == 1 ) TIMER_ERR++; // エラー秒数(LED_赤でエラー検出)
bokunimowakaru 3:d7263b5155bf 882 #endif
bokunimowakaru 3:d7263b5155bf 883 TIMER_SEC++; // タイマーのカウントアップ
bokunimowakaru 3:d7263b5155bf 884 IRR1.BIT.IRRTA=0; // タイマーA割込フラグのリセット
bokunimowakaru 3:d7263b5155bf 885 }
bokunimowakaru 3:d7263b5155bf 886 #endif
bokunimowakaru 3:d7263b5155bf 887
bokunimowakaru 3:d7263b5155bf 888 /* シリアル待ち時間の時間カウント用、RTC使用1秒間に256カウント */
bokunimowakaru 3:d7263b5155bf 889 byte timera(void){
bokunimowakaru 3:d7263b5155bf 890 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 891 return( (byte)TA.TCA );
bokunimowakaru 3:d7263b5155bf 892 #elif ARDUINO
bokunimowakaru 3:d7263b5155bf 893 return( (byte)( (millis()/4)%256 ) );
bokunimowakaru 3:d7263b5155bf 894 #else
bokunimowakaru 3:d7263b5155bf 895 #ifdef ARM_MBED
bokunimowakaru 3:d7263b5155bf 896 return( (byte)(_xbee_time.read()*256) );
bokunimowakaru 3:d7263b5155bf 897 // return(0);
bokunimowakaru 3:d7263b5155bf 898 #else //PC
bokunimowakaru 3:d7263b5155bf 899 return( (byte)(clock()/(CLOCKS_PER_SEC/256)) );
bokunimowakaru 3:d7263b5155bf 900 #endif
bokunimowakaru 3:d7263b5155bf 901 #endif
bokunimowakaru 3:d7263b5155bf 902 }
bokunimowakaru 3:d7263b5155bf 903
bokunimowakaru 3:d7263b5155bf 904 /* ミリ秒待ち(250ms以下の高精度用) 入力範囲=4~250 ms */
bokunimowakaru 3:d7263b5155bf 905 #ifndef ARDUINO // BeeBee Lite by 蘭
bokunimowakaru 3:d7263b5155bf 906 void wait_millisec_250( byte ms ){
bokunimowakaru 3:d7263b5155bf 907 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 908 byte counter;
bokunimowakaru 3:d7263b5155bf 909
bokunimowakaru 3:d7263b5155bf 910 if( ms < 0x04 ) ms = 0x04;
bokunimowakaru 3:d7263b5155bf 911 counter = timera() + (byte)( ms>>2 );
bokunimowakaru 3:d7263b5155bf 912 if( counter == timera() ) counter++;
bokunimowakaru 3:d7263b5155bf 913 while( counter != timera() );
bokunimowakaru 3:d7263b5155bf 914 #elif ARDUINO
bokunimowakaru 3:d7263b5155bf 915 delay( (unsigned long) ms );
bokunimowakaru 3:d7263b5155bf 916 #else
bokunimowakaru 3:d7263b5155bf 917 #ifdef ARM_MBED
bokunimowakaru 3:d7263b5155bf 918 wait((float)ms/1000);
bokunimowakaru 3:d7263b5155bf 919 #endif
bokunimowakaru 3:d7263b5155bf 920 #endif
bokunimowakaru 3:d7263b5155bf 921 }
bokunimowakaru 3:d7263b5155bf 922 #endif
bokunimowakaru 3:d7263b5155bf 923
bokunimowakaru 3:d7263b5155bf 924 /* ミリ秒待ち(30秒までの広範囲版) 入力範囲=4~30,000 ms */
bokunimowakaru 3:d7263b5155bf 925 void wait_millisec( const unsigned int ms ){
bokunimowakaru 3:d7263b5155bf 926 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 927 byte loops;
bokunimowakaru 3:d7263b5155bf 928 if( ms < 250 ){
bokunimowakaru 3:d7263b5155bf 929 wait_millisec_250( (byte)ms );
bokunimowakaru 3:d7263b5155bf 930 }else{
bokunimowakaru 3:d7263b5155bf 931 loops = (byte)( ms / 250);
bokunimowakaru 3:d7263b5155bf 932 wait_millisec_250( (byte)(ms-loops*250) );
bokunimowakaru 3:d7263b5155bf 933 while( loops > 0x00 ){
bokunimowakaru 3:d7263b5155bf 934 wait_millisec_250( 0xFA );
bokunimowakaru 3:d7263b5155bf 935 loops--;
bokunimowakaru 3:d7263b5155bf 936 }
bokunimowakaru 3:d7263b5155bf 937 }
bokunimowakaru 3:d7263b5155bf 938 #elif ARDUINO
bokunimowakaru 3:d7263b5155bf 939 delay( (unsigned long) ms );
bokunimowakaru 3:d7263b5155bf 940 #else
bokunimowakaru 3:d7263b5155bf 941 #ifdef ARM_MBED
bokunimowakaru 3:d7263b5155bf 942 wait((float)ms/1000);
bokunimowakaru 3:d7263b5155bf 943 #else // PC
bokunimowakaru 3:d7263b5155bf 944 time_t target;
bokunimowakaru 3:d7263b5155bf 945
bokunimowakaru 3:d7263b5155bf 946 target = (time_t)(clock()/(CLOCKS_PER_SEC/1000)) + (time_t)ms;
bokunimowakaru 3:d7263b5155bf 947 if( target >= (time_t)ms ){
bokunimowakaru 3:d7263b5155bf 948 while( (time_t)(clock()/(CLOCKS_PER_SEC/1000)) <= target );
bokunimowakaru 3:d7263b5155bf 949 }else{
bokunimowakaru 3:d7263b5155bf 950 while( (time_t)(clock()/(CLOCKS_PER_SEC/1000)) > (time_t)ms ); // クロックがリセットされるまで待つ
bokunimowakaru 3:d7263b5155bf 951 while( (time_t)(clock()/(CLOCKS_PER_SEC/1000)) <= target );
bokunimowakaru 3:d7263b5155bf 952 }
bokunimowakaru 3:d7263b5155bf 953 #endif
bokunimowakaru 3:d7263b5155bf 954 #endif
bokunimowakaru 3:d7263b5155bf 955 }
bokunimowakaru 3:d7263b5155bf 956
bokunimowakaru 3:d7263b5155bf 957 /* 経過時間測定=4~1000 ms 以内 単位は1/256秒毎 */
bokunimowakaru 3:d7263b5155bf 958 byte past_time(const byte time_from){
bokunimowakaru 3:d7263b5155bf 959 return( timera() - time_from );
bokunimowakaru 3:d7263b5155bf 960 }
bokunimowakaru 3:d7263b5155bf 961
bokunimowakaru 3:d7263b5155bf 962 /* XBeeのADCの有効ポート数を調べる ADC1~3のみ 入力=バイトデータ 応答0~3個 */
bokunimowakaru 3:d7263b5155bf 963 byte xbee_adc_count( byte d ){
bokunimowakaru 3:d7263b5155bf 964 return( ((d>>1)&0x01)+((d>>2)&0x01)+((d>>3)&0x01) );
bokunimowakaru 3:d7263b5155bf 965 }
bokunimowakaru 3:d7263b5155bf 966
bokunimowakaru 3:d7263b5155bf 967 /* XBee用シリアル通信ドライバ */
bokunimowakaru 3:d7263b5155bf 968 #ifndef ARDUINO
bokunimowakaru 3:d7263b5155bf 969 #ifndef H3694
bokunimowakaru 3:d7263b5155bf 970 #ifndef ARM_MBED
bokunimowakaru 3:d7263b5155bf 971 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 972 int open_serial_port(char *modem_dev){
bokunimowakaru 3:d7263b5155bf 973 /*
bokunimowakaru 3:d7263b5155bf 974 PC-UNIX関連ドキュメント
bokunimowakaru 3:d7263b5155bf 975 「シリアルポートプログラミング」
bokunimowakaru 3:d7263b5155bf 976 http://www006.upp.so-net.ne.jp/kasuya/linux/serial_io_programing.html
bokunimowakaru 3:d7263b5155bf 977 writer:粕谷友章 kasuya@pd5.so-net.ne.jp
bokunimowakaru 3:d7263b5155bf 978 */
bokunimowakaru 3:d7263b5155bf 979 struct termios newtio;
bokunimowakaru 3:d7263b5155bf 980 speed_t speed = B9600;
bokunimowakaru 3:d7263b5155bf 981 xbeeComFd=open(modem_dev,O_RDWR);
bokunimowakaru 3:d7263b5155bf 982 if(xbeeComFd < 0){
bokunimowakaru 3:d7263b5155bf 983 perror(modem_dev);
bokunimowakaru 3:d7263b5155bf 984 return -1;
bokunimowakaru 3:d7263b5155bf 985 }else{
bokunimowakaru 3:d7263b5155bf 986 tcgetattr(xbeeComFd,&oldtio);
bokunimowakaru 3:d7263b5155bf 987 newtio.c_iflag = 0;
bokunimowakaru 3:d7263b5155bf 988 newtio.c_oflag = 0;
bokunimowakaru 3:d7263b5155bf 989 newtio.c_cflag = 0;
bokunimowakaru 3:d7263b5155bf 990 newtio.c_lflag = 0;
bokunimowakaru 3:d7263b5155bf 991 newtio.c_line = 0;
bokunimowakaru 3:d7263b5155bf 992 bzero(newtio.c_cc,sizeof(newtio.c_cc));
bokunimowakaru 3:d7263b5155bf 993 cfsetispeed( &newtio, speed );
bokunimowakaru 3:d7263b5155bf 994 cfsetospeed( &newtio, speed );
bokunimowakaru 3:d7263b5155bf 995 newtio.c_cflag = BAUDRATE | CLOCAL | CREAD ;
bokunimowakaru 3:d7263b5155bf 996 newtio.c_cflag &= ~CSIZE;
bokunimowakaru 3:d7263b5155bf 997 newtio.c_cflag |= CS8;
bokunimowakaru 3:d7263b5155bf 998 newtio.c_oflag = 0;
bokunimowakaru 3:d7263b5155bf 999 newtio.c_lflag = 0;
bokunimowakaru 3:d7263b5155bf 1000 newtio.c_cc[VMIN] = 0;
bokunimowakaru 3:d7263b5155bf 1001 newtio.c_cc[VTIME] = 0;
bokunimowakaru 3:d7263b5155bf 1002 tcflush(xbeeComFd,TCIFLUSH);
bokunimowakaru 3:d7263b5155bf 1003 tcsetattr(xbeeComFd,TCSANOW,&newtio);
bokunimowakaru 3:d7263b5155bf 1004 }
bokunimowakaru 3:d7263b5155bf 1005 return 0;
bokunimowakaru 3:d7263b5155bf 1006 }
bokunimowakaru 3:d7263b5155bf 1007 void close_serial_port(void){
bokunimowakaru 3:d7263b5155bf 1008 tcsetattr(xbeeComFd,TCSANOW,&oldtio);
bokunimowakaru 3:d7263b5155bf 1009 close(xbeeComFd);
bokunimowakaru 3:d7263b5155bf 1010 }
bokunimowakaru 3:d7263b5155bf 1011 #else // XBEE_WIFI(arduino除く)
bokunimowakaru 3:d7263b5155bf 1012 int open_serial_port_tx(const byte *address){ // modem_dev=IPアドレスのポインタ
bokunimowakaru 3:d7263b5155bf 1013 byte i;
bokunimowakaru 3:d7263b5155bf 1014 in_addr_t ip=0; // 送信アドレス
bokunimowakaru 3:d7263b5155bf 1015
bokunimowakaru 3:d7263b5155bf 1016 for(i=0;i<4;i++){
bokunimowakaru 3:d7263b5155bf 1017 ip *= 256;
bokunimowakaru 3:d7263b5155bf 1018 ip += (in_addr_t)(byte)address[3-i]; // アドレス順序は反転する
bokunimowakaru 3:d7263b5155bf 1019 }
bokunimowakaru 3:d7263b5155bf 1020 /* 送信アドレス設定 */
bokunimowakaru 3:d7263b5155bf 1021 memset(&xbeeT_addr, 0, sizeof(xbeeT_addr)); // xbeeT_addrの初期化
bokunimowakaru 3:d7263b5155bf 1022 xbeeT_addr.sin_family = AF_INET; // アドレスファミリー AF_INET
bokunimowakaru 3:d7263b5155bf 1023 xbeeT_addr.sin_port = htons( 0xBEE ); // 送信ポート番号
bokunimowakaru 3:d7263b5155bf 1024 xbeeT_addr.sin_addr.s_addr = ip; // 送信IPアドレス
bokunimowakaru 3:d7263b5155bf 1025 /* ソケット生成 */
bokunimowakaru 3:d7263b5155bf 1026 xbeeTSFd = socket(AF_INET, SOCK_DGRAM, 0); // 送信用ソケットの生成
bokunimowakaru 3:d7263b5155bf 1027 #ifdef DEBUG
bokunimowakaru 3:d7263b5155bf 1028 printf("IP(TX)=%s\n", inet_ntoa( xbeeT_addr.sin_addr ) );
bokunimowakaru 3:d7263b5155bf 1029 #endif
bokunimowakaru 3:d7263b5155bf 1030 return 0;
bokunimowakaru 3:d7263b5155bf 1031 }
bokunimowakaru 3:d7263b5155bf 1032 int open_serial_port_rx( void ){ // modem_dev=IPアドレスのポインタ
bokunimowakaru 3:d7263b5155bf 1033 /* 受信アドレス設定 */
bokunimowakaru 3:d7263b5155bf 1034 memset(&xbeeR_addr, 0, sizeof(xbeeR_addr)); // xbeeR_addrの初期化
bokunimowakaru 3:d7263b5155bf 1035 memset(&xbeeU_addr, 0, sizeof(xbeeU_addr)); // xbeeU_addrの初期化
bokunimowakaru 3:d7263b5155bf 1036 xbeeR_addr.sin_family = AF_INET; // アドレスファミリー AF_INET
bokunimowakaru 3:d7263b5155bf 1037 xbeeU_addr.sin_family = AF_INET; // アドレスファミリー AF_INET
bokunimowakaru 3:d7263b5155bf 1038 xbeeR_addr.sin_port = htons( 0xBEE ); // 受信ポート番号(3054)
bokunimowakaru 3:d7263b5155bf 1039 xbeeU_addr.sin_port = htons( 0x2616 ); // 受信ポート番号(9750 board-voip)
bokunimowakaru 3:d7263b5155bf 1040 xbeeR_addr.sin_addr.s_addr = htonl(INADDR_ANY); // 受信IPアドレス(ANY)
bokunimowakaru 3:d7263b5155bf 1041 xbeeU_addr.sin_addr.s_addr = htonl(INADDR_ANY); // 受信IPアドレス(ANY)
bokunimowakaru 3:d7263b5155bf 1042 /* ソケット生成 */
bokunimowakaru 3:d7263b5155bf 1043 xbeeRSFd = socket(AF_INET, SOCK_DGRAM, 0); // 受信用ソケットの生成
bokunimowakaru 3:d7263b5155bf 1044 xbeeUSFd = socket(AF_INET, SOCK_DGRAM, 0); // 受信用ソケットの生成
bokunimowakaru 3:d7263b5155bf 1045 /* バインド */
bokunimowakaru 3:d7263b5155bf 1046 return(
bokunimowakaru 3:d7263b5155bf 1047 bind(xbeeRSFd, (struct sockaddr *)&xbeeR_addr, sizeof(xbeeR_addr)) +
bokunimowakaru 3:d7263b5155bf 1048 bind(xbeeUSFd, (struct sockaddr *)&xbeeU_addr, sizeof(xbeeU_addr))
bokunimowakaru 3:d7263b5155bf 1049 );
bokunimowakaru 3:d7263b5155bf 1050 }
bokunimowakaru 3:d7263b5155bf 1051 int open_serial_port(const byte *modem_dev){ // modem_dev=IPアドレスのポインタ
bokunimowakaru 3:d7263b5155bf 1052 /* UDPソケットを生成する。戻り値:0=成功、-1=エラー
bokunimowakaru 3:d7263b5155bf 1053 入力はcharだけど中ではbyteとして扱う。byteアドレス→char入力→byte使用なので変換は不要 */
bokunimowakaru 3:d7263b5155bf 1054 open_serial_port_tx( modem_dev );
bokunimowakaru 3:d7263b5155bf 1055 return( open_serial_port_rx( ) );
bokunimowakaru 3:d7263b5155bf 1056 }
bokunimowakaru 3:d7263b5155bf 1057 void close_serial_port_tx(void){
bokunimowakaru 3:d7263b5155bf 1058 close(xbeeTSFd);
bokunimowakaru 3:d7263b5155bf 1059 #ifdef DEBUG
bokunimowakaru 3:d7263b5155bf 1060 printf("DEBUG:close xbee tx sock\n");
bokunimowakaru 3:d7263b5155bf 1061 #endif
bokunimowakaru 3:d7263b5155bf 1062 }
bokunimowakaru 3:d7263b5155bf 1063 void close_serial_port(void){
bokunimowakaru 3:d7263b5155bf 1064 close(xbeeTSFd);
bokunimowakaru 3:d7263b5155bf 1065 close(xbeeRSFd);
bokunimowakaru 3:d7263b5155bf 1066 close(xbeeUSFd);
bokunimowakaru 3:d7263b5155bf 1067 #ifdef DEBUG
bokunimowakaru 3:d7263b5155bf 1068 printf("DEBUG:close xbee tx and rx sock\n");
bokunimowakaru 3:d7263b5155bf 1069 #endif
bokunimowakaru 3:d7263b5155bf 1070 }
bokunimowakaru 3:d7263b5155bf 1071 #endif
bokunimowakaru 3:d7263b5155bf 1072 #endif // not ARM
bokunimowakaru 3:d7263b5155bf 1073 #endif // not H3694
bokunimowakaru 3:d7263b5155bf 1074 #endif // not ARDUINO
bokunimowakaru 3:d7263b5155bf 1075
bokunimowakaru 3:d7263b5155bf 1076 #ifdef ARDUINO
bokunimowakaru 3:d7263b5155bf 1077 #ifdef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 1078 int open_serial_port(void){
bokunimowakaru 3:d7263b5155bf 1079 Ethernet.begin(mac);
bokunimowakaru 3:d7263b5155bf 1080 delay(1000);
bokunimowakaru 3:d7263b5155bf 1081 UdpXBeeU.begin(0x2616); // UART受信用のUDP開始
bokunimowakaru 3:d7263b5155bf 1082 UdpXBeeR.begin(0xBEE); // URAT リモートATコマンド受信用のUDPの開始
bokunimowakaru 3:d7263b5155bf 1083 UdpXBeeT.begin(0xBEE); // URAT リモートATコマンド送信用のUDPの開始
bokunimowakaru 3:d7263b5155bf 1084 return( 0 );
bokunimowakaru 3:d7263b5155bf 1085 }
bokunimowakaru 3:d7263b5155bf 1086 #endif // XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 1087 #endif // ARDUINO
bokunimowakaru 3:d7263b5155bf 1088
bokunimowakaru 3:d7263b5155bf 1089 /* シリアルの初期化 */
bokunimowakaru 3:d7263b5155bf 1090 #ifdef ARM_MBED
bokunimowakaru 3:d7263b5155bf 1091 Serial _xbee_serial(SERIAL_TX, SERIAL_RX); // USART2
bokunimowakaru 3:d7263b5155bf 1092 // Serial _xbee_serial(D1, D0); //
bokunimowakaru 3:d7263b5155bf 1093 #ifdef DEBUG
bokunimowakaru 3:d7263b5155bf 1094 Serial _xbee_debug(PA_9, PA_10); // USART1
bokunimowakaru 3:d7263b5155bf 1095 #endif
bokunimowakaru 3:d7263b5155bf 1096 #endif
bokunimowakaru 3:d7263b5155bf 1097
bokunimowakaru 3:d7263b5155bf 1098 /* シリアル受信用コールバック(ARM専用) */
bokunimowakaru 3:d7263b5155bf 1099 /* Serial.readableで確認してからSerial.getcする方法だと、連続した2バイト以上の
bokunimowakaru 3:d7263b5155bf 1100  データ列を受信できなかった。STマイクロの問題なのかmbedの問題かは不明だが、
bokunimowakaru 3:d7263b5155bf 1101  ハードウェアの受信バッファ内のデータをうまく読めないものと思う。
bokunimowakaru 3:d7263b5155bf 1102  したがって、割込みで取り込んでソフト受信バッファを実装することにした。
bokunimowakaru 3:d7263b5155bf 1103  バッファサイズはとりあえず64バイト */
bokunimowakaru 3:d7263b5155bf 1104 #ifdef ARM_MBED
bokunimowakaru 3:d7263b5155bf 1105 volatile byte _xbee_serial_buf[64];
bokunimowakaru 3:d7263b5155bf 1106 volatile byte _xbee_serial_bp=0;
bokunimowakaru 3:d7263b5155bf 1107 volatile byte _xbee_serial_rp=0;
bokunimowakaru 3:d7263b5155bf 1108 void _xbee_serial_callback(){
bokunimowakaru 3:d7263b5155bf 1109 _xbee_serial_buf[_xbee_serial_bp] = _xbee_serial.getc();
bokunimowakaru 3:d7263b5155bf 1110 _xbee_serial_bp++;
bokunimowakaru 3:d7263b5155bf 1111 if(_xbee_serial_bp>63){
bokunimowakaru 3:d7263b5155bf 1112 _xbee_serial_bp=63;
bokunimowakaru 3:d7263b5155bf 1113 #ifdef DEBUG
bokunimowakaru 3:d7263b5155bf 1114 _xbee_debug.printf("ERR:Buffer Full(%d)\r\n",_xbee_serial_bp);
bokunimowakaru 3:d7263b5155bf 1115 #endif
bokunimowakaru 3:d7263b5155bf 1116 }
bokunimowakaru 3:d7263b5155bf 1117 }
bokunimowakaru 3:d7263b5155bf 1118 #endif
bokunimowakaru 3:d7263b5155bf 1119
bokunimowakaru 3:d7263b5155bf 1120 /* シリアルの初期化 */
bokunimowakaru 3:d7263b5155bf 1121 byte sci_init( byte port ){
bokunimowakaru 3:d7263b5155bf 1122 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 1123 SCI3_INIT(br9600, sci_tx, SCI_SIZE, sci_tx, SCI_SIZE);
bokunimowakaru 3:d7263b5155bf 1124 EI; // 割り込み許可
bokunimowakaru 3:d7263b5155bf 1125 return(1);
bokunimowakaru 3:d7263b5155bf 1126 #elif ARDUINO
bokunimowakaru 3:d7263b5155bf 1127 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 1128 #ifdef LEONARDO
bokunimowakaru 3:d7263b5155bf 1129 Serial1.begin(9600);
bokunimowakaru 3:d7263b5155bf 1130 #else
bokunimowakaru 3:d7263b5155bf 1131 Serial.begin(9600);
bokunimowakaru 3:d7263b5155bf 1132 #endif
bokunimowakaru 3:d7263b5155bf 1133 return(1);
bokunimowakaru 3:d7263b5155bf 1134 #else // Arduino XBee_WIFI
bokunimowakaru 3:d7263b5155bf 1135 byte i;
bokunimowakaru 3:d7263b5155bf 1136 #ifdef XBEE_WIFI_DEBUG
bokunimowakaru 3:d7263b5155bf 1137 Serial.begin(9600); // TEST用
bokunimowakaru 3:d7263b5155bf 1138 Serial.println("Hello!");
bokunimowakaru 3:d7263b5155bf 1139 #endif
bokunimowakaru 3:d7263b5155bf 1140 open_serial_port();
bokunimowakaru 3:d7263b5155bf 1141 return(1);
bokunimowakaru 3:d7263b5155bf 1142 #endif
bokunimowakaru 3:d7263b5155bf 1143 #else
bokunimowakaru 3:d7263b5155bf 1144 #ifdef ARM_MBED
bokunimowakaru 3:d7263b5155bf 1145 _xbee_serial.baud(9600);
bokunimowakaru 3:d7263b5155bf 1146 _xbee_serial.attach(&_xbee_serial_callback);
bokunimowakaru 3:d7263b5155bf 1147 #ifdef DEBUG
bokunimowakaru 3:d7263b5155bf 1148 _xbee_debug.baud(38400);
bokunimowakaru 3:d7263b5155bf 1149 #endif
bokunimowakaru 3:d7263b5155bf 1150 return(1);
bokunimowakaru 3:d7263b5155bf 1151 #else // PC の時(ZigBeeシリアル or WiFi_LAN)
bokunimowakaru 3:d7263b5155bf 1152 #ifndef XBEE_WIFI // ZigBeeシリアル
bokunimowakaru 3:d7263b5155bf 1153 /* tasasaki様よりポート11~64の拡張対応方法を教えていただいて追加した。*/
bokunimowakaru 3:d7263b5155bf 1154 char modem_dev[12] = "/dev/ttyS00";
bokunimowakaru 3:d7263b5155bf 1155
bokunimowakaru 3:d7263b5155bf 1156 if( port <= 10){
bokunimowakaru 3:d7263b5155bf 1157 modem_dev[9] = (char)( port - 1 + (byte)'0' );
bokunimowakaru 3:d7263b5155bf 1158 modem_dev[10]= '\0';
bokunimowakaru 3:d7263b5155bf 1159 }else if( port <= 64 ){
bokunimowakaru 3:d7263b5155bf 1160 snprintf(&modem_dev[9], 3, "%d", port - 1);
bokunimowakaru 3:d7263b5155bf 1161 }else{
bokunimowakaru 3:d7263b5155bf 1162 fprintf(stderr,"ERR:sci_init port=%d\n",port);
bokunimowakaru 3:d7263b5155bf 1163 return(0);
bokunimowakaru 3:d7263b5155bf 1164 }
bokunimowakaru 3:d7263b5155bf 1165 if( open_serial_port( modem_dev ) ){
bokunimowakaru 3:d7263b5155bf 1166 wait_millisec( 100 );
bokunimowakaru 3:d7263b5155bf 1167 close_serial_port(); // open出来ていないが念のために閉じる
bokunimowakaru 3:d7263b5155bf 1168 wait_millisec( 100 );
bokunimowakaru 3:d7263b5155bf 1169 fprintf(stderr,"Failed serial COM%d (%s)\n",port,modem_dev);
bokunimowakaru 3:d7263b5155bf 1170 port = 0;
bokunimowakaru 3:d7263b5155bf 1171 }else{
bokunimowakaru 3:d7263b5155bf 1172 fprintf(stderr,"Serial port = COM%d (%s)\n",port,modem_dev);
bokunimowakaru 3:d7263b5155bf 1173 xbee_com_port = port;
bokunimowakaru 3:d7263b5155bf 1174 }
bokunimowakaru 3:d7263b5155bf 1175 return( port );
bokunimowakaru 3:d7263b5155bf 1176 #else // XBEE_WIFI PC用
bokunimowakaru 3:d7263b5155bf 1177 byte i,j;
bokunimowakaru 3:d7263b5155bf 1178 for(i=0;i<3;i++){
bokunimowakaru 3:d7263b5155bf 1179 if( open_serial_port( ADR_DEST ) < 0 ){
bokunimowakaru 3:d7263b5155bf 1180 fprintf(stderr,"Failed UDP[%d/3]:",i+1);
bokunimowakaru 3:d7263b5155bf 1181 for(j=0;j<4;j++) fprintf(stderr,"%d.",(int)ADR_DEST[j]);
bokunimowakaru 3:d7263b5155bf 1182 fprintf(stderr,"\b\n");
bokunimowakaru 3:d7263b5155bf 1183 wait_millisec( 100 );
bokunimowakaru 3:d7263b5155bf 1184 close_serial_port(); // open出来ていないが念のために閉じる
bokunimowakaru 3:d7263b5155bf 1185 wait_millisec( 900 );
bokunimowakaru 3:d7263b5155bf 1186 }else break;
bokunimowakaru 3:d7263b5155bf 1187 }
bokunimowakaru 3:d7263b5155bf 1188 #ifdef DEBUG
bokunimowakaru 3:d7263b5155bf 1189 printf("DEBUG:SCI init for WiFi done\n");
bokunimowakaru 3:d7263b5155bf 1190 #endif
bokunimowakaru 3:d7263b5155bf 1191 return( 3-i );
bokunimowakaru 3:d7263b5155bf 1192 #endif // Wifi
bokunimowakaru 3:d7263b5155bf 1193 #endif // ARM/PC
bokunimowakaru 3:d7263b5155bf 1194 #endif
bokunimowakaru 3:d7263b5155bf 1195 }
bokunimowakaru 3:d7263b5155bf 1196
bokunimowakaru 3:d7263b5155bf 1197 /* シリアル送受信バッファクリア */
bokunimowakaru 3:d7263b5155bf 1198 void sci_clear(void){
bokunimowakaru 3:d7263b5155bf 1199 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 1200 SCI3_IN_DATA_CLEAR();
bokunimowakaru 3:d7263b5155bf 1201 SCI3_OUT_DATA_CLEAR();
bokunimowakaru 3:d7263b5155bf 1202 #elif ARDUINO
bokunimowakaru 3:d7263b5155bf 1203 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 1204 #ifdef LEONARDO
bokunimowakaru 3:d7263b5155bf 1205 Serial1.flush();
bokunimowakaru 3:d7263b5155bf 1206 #else
bokunimowakaru 3:d7263b5155bf 1207 Serial.flush();
bokunimowakaru 3:d7263b5155bf 1208 #endif
bokunimowakaru 3:d7263b5155bf 1209 #endif
bokunimowakaru 3:d7263b5155bf 1210 #else
bokunimowakaru 3:d7263b5155bf 1211 #ifdef ARM_MBED
bokunimowakaru 3:d7263b5155bf 1212 while( _xbee_serial.readable() ) _xbee_serial.getc();
bokunimowakaru 3:d7263b5155bf 1213 while( !_xbee_serial.writeable() );
bokunimowakaru 3:d7263b5155bf 1214 #else //PC
bokunimowakaru 3:d7263b5155bf 1215 #ifndef XBEE_WIFI // ZigBee
bokunimowakaru 3:d7263b5155bf 1216 tcflush(xbeeComFd,TCIOFLUSH);
bokunimowakaru 3:d7263b5155bf 1217 #else // XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 1218 close_serial_port();
bokunimowakaru 3:d7263b5155bf 1219 sci_init( 0 );
bokunimowakaru 3:d7263b5155bf 1220 #endif
bokunimowakaru 3:d7263b5155bf 1221 #endif
bokunimowakaru 3:d7263b5155bf 1222 #endif
bokunimowakaru 3:d7263b5155bf 1223 }
bokunimowakaru 3:d7263b5155bf 1224
bokunimowakaru 3:d7263b5155bf 1225 /* シリアル受信(1バイト) */
bokunimowakaru 3:d7263b5155bf 1226 byte sci_read(byte timeout){
bokunimowakaru 3:d7263b5155bf 1227 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 1228 byte timer;
bokunimowakaru 3:d7263b5155bf 1229 byte ret=0;
bokunimowakaru 3:d7263b5155bf 1230 timer = timera() + (timeout)+1; // timeout[ms] = timer/256*1000
bokunimowakaru 3:d7263b5155bf 1231 while( timer != timera() && SCI3_IN_DATA_CHECK() < 1 );
bokunimowakaru 3:d7263b5155bf 1232 if( SCI3_IN_DATA_CHECK() ) ret=(byte)SCI3_IN_DATA();
bokunimowakaru 3:d7263b5155bf 1233 return( ret );
bokunimowakaru 3:d7263b5155bf 1234 #elif ARDUINO // 蘭様による改良あり
bokunimowakaru 3:d7263b5155bf 1235 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 1236 byte timer;
bokunimowakaru 3:d7263b5155bf 1237 timer = timera() + (timeout)+1; // timeout[ms] = timer/256*1000
bokunimowakaru 3:d7263b5155bf 1238 // led_green(0);
bokunimowakaru 3:d7263b5155bf 1239 #ifdef LEONARDO
bokunimowakaru 3:d7263b5155bf 1240 while( timer != timera() && Serial1.available() <= 0 );
bokunimowakaru 3:d7263b5155bf 1241 // led_green(1);
bokunimowakaru 3:d7263b5155bf 1242 if( Serial1.available() > 0 ) return( (byte)Serial1.read() );
bokunimowakaru 3:d7263b5155bf 1243 #else
bokunimowakaru 3:d7263b5155bf 1244 while( timer != timera() && Serial.available() <= 0 );
bokunimowakaru 3:d7263b5155bf 1245 // led_green(1);
bokunimowakaru 3:d7263b5155bf 1246 if( Serial.available() > 0 ) return( (byte)Serial.read() );
bokunimowakaru 3:d7263b5155bf 1247 #endif
bokunimowakaru 3:d7263b5155bf 1248 #else
bokunimowakaru 3:d7263b5155bf 1249 return(0x00); // フレームで受信するのでバイト毎受信は不要
bokunimowakaru 3:d7263b5155bf 1250 #endif
bokunimowakaru 3:d7263b5155bf 1251 #else
bokunimowakaru 3:d7263b5155bf 1252 #ifdef ARM_MBED
bokunimowakaru 3:d7263b5155bf 1253 // http://mbed.org/users/mbed_official/code/mbed-src/docs/e8b66477f5bf/classmbed_1_1RawSerial.html
bokunimowakaru 3:d7263b5155bf 1254 int value = 0,i=0;
bokunimowakaru 3:d7263b5155bf 1255 volatile byte timer;
bokunimowakaru 3:d7263b5155bf 1256
bokunimowakaru 3:d7263b5155bf 1257 timer = timera() + (timeout)+1;
bokunimowakaru 3:d7263b5155bf 1258
bokunimowakaru 3:d7263b5155bf 1259 // while( timer != timera() && i == 0 ) i=_xbee_serial.readable();
bokunimowakaru 3:d7263b5155bf 1260 while( timer != timera() && i == 0 ) i=_xbee_serial_bp;
bokunimowakaru 3:d7263b5155bf 1261 if( i > 0 ){
bokunimowakaru 3:d7263b5155bf 1262 // value = _xbee_serial.getc();
bokunimowakaru 3:d7263b5155bf 1263 value = _xbee_serial_buf[_xbee_serial_rp];
bokunimowakaru 3:d7263b5155bf 1264 _xbee_serial_rp++;
bokunimowakaru 3:d7263b5155bf 1265 if(_xbee_serial_bp <= _xbee_serial_rp ){
bokunimowakaru 3:d7263b5155bf 1266 _xbee_serial_bp=0;
bokunimowakaru 3:d7263b5155bf 1267 _xbee_serial_rp=0;
bokunimowakaru 3:d7263b5155bf 1268 }
bokunimowakaru 3:d7263b5155bf 1269 // #ifdef DEBUG_RX
bokunimowakaru 3:d7263b5155bf 1270 // _xbee_debug.printf("%c(%02X) ",value,value);
bokunimowakaru 3:d7263b5155bf 1271 // #endif
bokunimowakaru 3:d7263b5155bf 1272 }
bokunimowakaru 3:d7263b5155bf 1273 if(value<0 || value>255) value=0;
bokunimowakaru 3:d7263b5155bf 1274 return( (byte)value );
bokunimowakaru 3:d7263b5155bf 1275 #else // PC
bokunimowakaru 3:d7263b5155bf 1276 /* 受信の有無の判断にFDの待ち受け関数selectを使用する。
bokunimowakaru 3:d7263b5155bf 1277 参考文献
bokunimowakaru 3:d7263b5155bf 1278 http://linuxjm.sourceforge.jp/html/LDP_man-pages/man2/select.2.html
bokunimowakaru 3:d7263b5155bf 1279 */
bokunimowakaru 3:d7263b5155bf 1280 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 1281 byte c;
bokunimowakaru 3:d7263b5155bf 1282 struct timeval tv;
bokunimowakaru 3:d7263b5155bf 1283 fd_set readfds;
bokunimowakaru 3:d7263b5155bf 1284
bokunimowakaru 3:d7263b5155bf 1285 FD_ZERO(&readfds);
bokunimowakaru 3:d7263b5155bf 1286 FD_SET( xbeeComFd , &readfds);
bokunimowakaru 3:d7263b5155bf 1287 tv.tv_sec = 0;
bokunimowakaru 3:d7263b5155bf 1288 #ifdef LITE // BeeBee Lite by 蘭
bokunimowakaru 3:d7263b5155bf 1289 /*
bokunimowakaru 3:d7263b5155bf 1290 if( timeout > 50 ){
bokunimowakaru 3:d7263b5155bf 1291 tv.tv_usec = timeout*600;
bokunimowakaru 3:d7263b5155bf 1292 }else if( timeout > 10 ){
bokunimowakaru 3:d7263b5155bf 1293 tv.tv_usec = timeout*750;
bokunimowakaru 3:d7263b5155bf 1294 }else{
bokunimowakaru 3:d7263b5155bf 1295 tv.tv_usec = 0;
bokunimowakaru 3:d7263b5155bf 1296 }
bokunimowakaru 3:d7263b5155bf 1297 */
bokunimowakaru 3:d7263b5155bf 1298 // 今回は見送ります(本関数を呼び出す前に調整しているので不要)
bokunimowakaru 3:d7263b5155bf 1299 tv.tv_usec = timeout*1000;
bokunimowakaru 3:d7263b5155bf 1300 #else
bokunimowakaru 3:d7263b5155bf 1301 tv.tv_usec = timeout*1000;
bokunimowakaru 3:d7263b5155bf 1302 #endif
bokunimowakaru 3:d7263b5155bf 1303 if( select( (xbeeComFd+1), &readfds, NULL, NULL ,&tv ) ){
bokunimowakaru 3:d7263b5155bf 1304 read(xbeeComFd,(char *)&c,1);
bokunimowakaru 3:d7263b5155bf 1305 }else{
bokunimowakaru 3:d7263b5155bf 1306 c = 0x00;
bokunimowakaru 3:d7263b5155bf 1307 }
bokunimowakaru 3:d7263b5155bf 1308 return( c );
bokunimowakaru 3:d7263b5155bf 1309 #else // XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 1310 return(0); // フレームで受信するのでバイト毎受信は不要
bokunimowakaru 3:d7263b5155bf 1311 #endif
bokunimowakaru 3:d7263b5155bf 1312 #endif
bokunimowakaru 3:d7263b5155bf 1313 #endif
bokunimowakaru 3:d7263b5155bf 1314 }
bokunimowakaru 3:d7263b5155bf 1315
bokunimowakaru 3:d7263b5155bf 1316 #ifdef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 1317 /* シリアル受信(1フレーム) 始めの4バイトは送信元のアドレス */
bokunimowakaru 3:d7263b5155bf 1318 byte sci_read_frame(byte *data){
bokunimowakaru 3:d7263b5155bf 1319 #ifndef H3694
bokunimowakaru 3:d7263b5155bf 1320 #ifndef ARDUINO // XBEE_WIFI PC受信
bokunimowakaru 3:d7263b5155bf 1321 byte i,ret;
bokunimowakaru 3:d7263b5155bf 1322 int len=0;
bokunimowakaru 3:d7263b5155bf 1323 struct sockaddr_in xbeeF_addr; // FROMアドレス入力用
bokunimowakaru 3:d7263b5155bf 1324 struct timeval tv; // タイムアウト用
bokunimowakaru 3:d7263b5155bf 1325 fd_set readfds;
bokunimowakaru 3:d7263b5155bf 1326
bokunimowakaru 3:d7263b5155bf 1327 /* 受信の有無の判断にFDの待ち受け関数selectを使用する。*/
bokunimowakaru 3:d7263b5155bf 1328 FD_ZERO(&readfds); // FD初期化
bokunimowakaru 3:d7263b5155bf 1329 FD_SET(xbeeRSFd, &readfds); // 待ちソケットの登録
bokunimowakaru 3:d7263b5155bf 1330 tv.tv_sec = (long)0;
bokunimowakaru 3:d7263b5155bf 1331 tv.tv_usec = (long)9000; // 9ms
bokunimowakaru 3:d7263b5155bf 1332 /* データ受信 */
bokunimowakaru 3:d7263b5155bf 1333 if( select( (xbeeRSFd+1), &readfds, NULL, NULL, &tv) > 0 ){
bokunimowakaru 3:d7263b5155bf 1334 len = sizeof(xbeeF_addr);
bokunimowakaru 3:d7263b5155bf 1335 len = recvfrom(xbeeRSFd, &(data[4]), (API_SIZE-14), 0, (struct sockaddr *)&xbeeF_addr, &len );
bokunimowakaru 3:d7263b5155bf 1336 if( len > 0 ){
bokunimowakaru 3:d7263b5155bf 1337 len += 4;
bokunimowakaru 3:d7263b5155bf 1338 #ifdef DEBUG
bokunimowakaru 3:d7263b5155bf 1339 printf("IP(RX)=%s\n", inet_ntoa( xbeeF_addr.sin_addr ) );
bokunimowakaru 3:d7263b5155bf 1340 #endif
bokunimowakaru 3:d7263b5155bf 1341 for(i=0;i<4;i++){
bokunimowakaru 3:d7263b5155bf 1342 data[i]=(byte)(xbeeF_addr.sin_addr.s_addr % (long)256);
bokunimowakaru 3:d7263b5155bf 1343 xbeeF_addr.sin_addr.s_addr /= (long)256;
bokunimowakaru 3:d7263b5155bf 1344 }
bokunimowakaru 3:d7263b5155bf 1345 }
bokunimowakaru 3:d7263b5155bf 1346 }else{ // 受信データが無い時はUARTを受信する
bokunimowakaru 3:d7263b5155bf 1347 FD_ZERO(&readfds); // FD初期化
bokunimowakaru 3:d7263b5155bf 1348 FD_SET(xbeeUSFd, &readfds); // 待ちソケットの登録
bokunimowakaru 3:d7263b5155bf 1349 tv.tv_usec = (long)1000; // 1ms
bokunimowakaru 3:d7263b5155bf 1350 if( select( (xbeeUSFd+1), &readfds, NULL, NULL, &tv) > 0 ){
bokunimowakaru 3:d7263b5155bf 1351 len = sizeof(xbeeU_addr);
bokunimowakaru 3:d7263b5155bf 1352 len = recvfrom(xbeeUSFd, &(data[6]), (API_SIZE-16), 0, (struct sockaddr *)&xbeeU_addr, &len );
bokunimowakaru 3:d7263b5155bf 1353 if( len > 0 ){ // データはdata[6]以降に入る
bokunimowakaru 3:d7263b5155bf 1354 data[4] = 0x00; // UART受信を示す。
bokunimowakaru 3:d7263b5155bf 1355 data[5] = len; // UART長を示す(data[]長では無い)。
bokunimowakaru 3:d7263b5155bf 1356 len += 6;
bokunimowakaru 3:d7263b5155bf 1357 #ifdef DEBUG
bokunimowakaru 3:d7263b5155bf 1358 printf("IP(UART)=%s\n", inet_ntoa( xbeeU_addr.sin_addr ) );
bokunimowakaru 3:d7263b5155bf 1359 #endif
bokunimowakaru 3:d7263b5155bf 1360 for(i=0;i<4;i++){
bokunimowakaru 3:d7263b5155bf 1361 data[i]=(byte)(xbeeU_addr.sin_addr.s_addr % (long)256);
bokunimowakaru 3:d7263b5155bf 1362 xbeeU_addr.sin_addr.s_addr /= (long)256;
bokunimowakaru 3:d7263b5155bf 1363 }
bokunimowakaru 3:d7263b5155bf 1364 }
bokunimowakaru 3:d7263b5155bf 1365 }
bokunimowakaru 3:d7263b5155bf 1366 }
bokunimowakaru 3:d7263b5155bf 1367 if( len < 0 ) ret = 0; else if( len>255 ) ret = 0xFF; else ret =(byte)len;
bokunimowakaru 3:d7263b5155bf 1368 #ifdef DEBUG_RX
bokunimowakaru 3:d7263b5155bf 1369 if( ret ){
bokunimowakaru 3:d7263b5155bf 1370 printf("Recieved Packet rx[%3d]\nip0,ip1,ip2,ip3,urt,len,", len);
bokunimowakaru 3:d7263b5155bf 1371 for(i=6;i<len;i++) printf("%3d,",i);
bokunimowakaru 3:d7263b5155bf 1372 printf("\n");
bokunimowakaru 3:d7263b5155bf 1373 for(i=0;i<len;i++) printf(" %02X,",data[i]); // dataはbyte型
bokunimowakaru 3:d7263b5155bf 1374 printf("\n");
bokunimowakaru 3:d7263b5155bf 1375 for(i=0;i<len;i++) if( isgraph(data[i]) ) printf("'%c',",data[i]); else printf("%3d,",(int)data[i]);
bokunimowakaru 3:d7263b5155bf 1376 printf("\n");
bokunimowakaru 3:d7263b5155bf 1377 }
bokunimowakaru 3:d7263b5155bf 1378 #endif
bokunimowakaru 3:d7263b5155bf 1379 return( ret );
bokunimowakaru 3:d7263b5155bf 1380 #else // XBEE_WIFI ARDUINO受信
bokunimowakaru 3:d7263b5155bf 1381 int packetSize;
bokunimowakaru 3:d7263b5155bf 1382 IPAddress remote;
bokunimowakaru 3:d7263b5155bf 1383 byte i;
bokunimowakaru 3:d7263b5155bf 1384 byte ret=0;
bokunimowakaru 3:d7263b5155bf 1385
bokunimowakaru 3:d7263b5155bf 1386 /* UdpXBeeR受信 */
bokunimowakaru 3:d7263b5155bf 1387 packetSize = UdpXBeeR.parsePacket();
bokunimowakaru 3:d7263b5155bf 1388 if(packetSize){
bokunimowakaru 3:d7263b5155bf 1389 remote = UdpXBeeR.remoteIP();
bokunimowakaru 3:d7263b5155bf 1390 for(i=0;i<4;i++) data[i]=(byte)remote[i];
bokunimowakaru 3:d7263b5155bf 1391 if( packetSize > (API_SIZE-14) ) ret = API_SIZE-14; //API_SIZEはIPのため-4で良いと思ったが、ZBフォーマット移行の-9-1-4が上限)
bokunimowakaru 3:d7263b5155bf 1392 else ret = (byte)packetSize;
bokunimowakaru 3:d7263b5155bf 1393 UdpXBeeR.read(&(data[4]), ret);
bokunimowakaru 3:d7263b5155bf 1394 ret += 4;
bokunimowakaru 3:d7263b5155bf 1395 }else{
bokunimowakaru 3:d7263b5155bf 1396 /* UdpXBeeU受信 */
bokunimowakaru 3:d7263b5155bf 1397 packetSize = UdpXBeeU.parsePacket();
bokunimowakaru 3:d7263b5155bf 1398 if(packetSize){
bokunimowakaru 3:d7263b5155bf 1399 remote = UdpXBeeU.remoteIP();
bokunimowakaru 3:d7263b5155bf 1400 for(i=0;i<4;i++) data[i]=(byte)remote[i];
bokunimowakaru 3:d7263b5155bf 1401 if( packetSize > (API_SIZE-16) ) ret = API_SIZE-16; //API_SIZEはIPのため-6で良いと思ったが、ZBフォーマット移行の-9-1-6が上限)
bokunimowakaru 3:d7263b5155bf 1402 else ret = (byte)packetSize; // Ver 1.80で抜けていた(バグ)
bokunimowakaru 3:d7263b5155bf 1403 data[4] = 0x00; // UART受信を示す。
bokunimowakaru 3:d7263b5155bf 1404 data[5] = ret; // UART長を示す(data[]長では無い)。
bokunimowakaru 3:d7263b5155bf 1405 UdpXBeeU.read(&(data[6]), ret);
bokunimowakaru 3:d7263b5155bf 1406 ret += 6;
bokunimowakaru 3:d7263b5155bf 1407 }
bokunimowakaru 3:d7263b5155bf 1408 }
bokunimowakaru 3:d7263b5155bf 1409 #ifdef XBEE_WIFI_DEBUG
bokunimowakaru 3:d7263b5155bf 1410 Serial.print("RX udp size=");
bokunimowakaru 3:d7263b5155bf 1411 Serial.print(ret);
bokunimowakaru 3:d7263b5155bf 1412 Serial.print(", ");
bokunimowakaru 3:d7263b5155bf 1413 for(i=0;i<ret;i++){
bokunimowakaru 3:d7263b5155bf 1414 Serial.print(data[i],HEX);
bokunimowakaru 3:d7263b5155bf 1415 Serial.print(" ");
bokunimowakaru 3:d7263b5155bf 1416 }
bokunimowakaru 3:d7263b5155bf 1417 Serial.println("");
bokunimowakaru 3:d7263b5155bf 1418 #endif
bokunimowakaru 3:d7263b5155bf 1419 return( ret );
bokunimowakaru 3:d7263b5155bf 1420 #endif
bokunimowakaru 3:d7263b5155bf 1421 #endif
bokunimowakaru 3:d7263b5155bf 1422 }
bokunimowakaru 3:d7263b5155bf 1423 #endif
bokunimowakaru 3:d7263b5155bf 1424
bokunimowakaru 3:d7263b5155bf 1425 /* シリアル送信バッファが空になるのを待つ */
bokunimowakaru 3:d7263b5155bf 1426 #ifndef LITE
bokunimowakaru 3:d7263b5155bf 1427 byte sci_write_check(void){
bokunimowakaru 3:d7263b5155bf 1428 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 1429 byte timer;
bokunimowakaru 3:d7263b5155bf 1430 timer = timera() + 0x7F; // timeout = 500ms
bokunimowakaru 3:d7263b5155bf 1431 while( (timer != timera()) && ( SCI3_OUT_DATA_CHECK() < 1 ) );
bokunimowakaru 3:d7263b5155bf 1432 return( (byte)SCI3_OUT_DATA_CHECK() );
bokunimowakaru 3:d7263b5155bf 1433 #elif ARDUINO
bokunimowakaru 3:d7263b5155bf 1434 return( 1 ); // 関数があるかもしれないので、そのうち要調査&確認
bokunimowakaru 3:d7263b5155bf 1435 #else
bokunimowakaru 3:d7263b5155bf 1436 #ifdef ARM_MBED
bokunimowakaru 3:d7263b5155bf 1437 while( !_xbee_serial.writeable() );
bokunimowakaru 3:d7263b5155bf 1438 return( 1 );
bokunimowakaru 3:d7263b5155bf 1439 #else // PC
bokunimowakaru 3:d7263b5155bf 1440 #ifndef XBEE_WIFI // ZigBee
bokunimowakaru 3:d7263b5155bf 1441 tcdrain( xbeeComFd );
bokunimowakaru 3:d7263b5155bf 1442 #endif
bokunimowakaru 3:d7263b5155bf 1443 return( 1 );
bokunimowakaru 3:d7263b5155bf 1444 #endif
bokunimowakaru 3:d7263b5155bf 1445 #endif
bokunimowakaru 3:d7263b5155bf 1446 }
bokunimowakaru 3:d7263b5155bf 1447 #endif // LITE
bokunimowakaru 3:d7263b5155bf 1448
bokunimowakaru 3:d7263b5155bf 1449 /* シリアル送信 */
bokunimowakaru 3:d7263b5155bf 1450 byte sci_write( char *data, byte len ){
bokunimowakaru 3:d7263b5155bf 1451 byte ret=1; // 戻り値 0でエラー
bokunimowakaru 3:d7263b5155bf 1452
bokunimowakaru 3:d7263b5155bf 1453 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 1454 SCI3_OUT_STRINGB( data , (short)len ); // 戻り値なし
bokunimowakaru 3:d7263b5155bf 1455 #elif ARDUINO
bokunimowakaru 3:d7263b5155bf 1456 byte i;
bokunimowakaru 3:d7263b5155bf 1457 #ifdef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 1458 UdpXBeeT.beginPacket(ADR_DEST, 0xBEE );
bokunimowakaru 3:d7263b5155bf 1459 #endif
bokunimowakaru 3:d7263b5155bf 1460 for(i=0;i<len;i++){
bokunimowakaru 3:d7263b5155bf 1461 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 1462 #ifdef LEONARDO
bokunimowakaru 3:d7263b5155bf 1463 ret = Serial1.write( data[i] ); // 戻り値は書き込みバイト数
bokunimowakaru 3:d7263b5155bf 1464 #else
bokunimowakaru 3:d7263b5155bf 1465 ret = Serial.write( data[i] ); // 戻り値は書き込みバイト数
bokunimowakaru 3:d7263b5155bf 1466 #endif
bokunimowakaru 3:d7263b5155bf 1467 #else // XBEE_WIFI ARDUINO
bokunimowakaru 3:d7263b5155bf 1468 ret = UdpXBeeT.write( data[i] ); // 戻り値は書き込みバイト数
bokunimowakaru 3:d7263b5155bf 1469 /*
bokunimowakaru 3:d7263b5155bf 1470 Serial.print("TX udp size=");
bokunimowakaru 3:d7263b5155bf 1471 Serial.print(len,DEC);
bokunimowakaru 3:d7263b5155bf 1472 Serial.print(", ");
bokunimowakaru 3:d7263b5155bf 1473 for(i=0;i<len;i++){
bokunimowakaru 3:d7263b5155bf 1474 Serial.print(data[i],HEX);
bokunimowakaru 3:d7263b5155bf 1475 Serial.print(" ");
bokunimowakaru 3:d7263b5155bf 1476 }
bokunimowakaru 3:d7263b5155bf 1477 Serial.println("");
bokunimowakaru 3:d7263b5155bf 1478 */
bokunimowakaru 3:d7263b5155bf 1479 #endif
bokunimowakaru 3:d7263b5155bf 1480 if( ret == 0 ){
bokunimowakaru 3:d7263b5155bf 1481 i = len; // break;
bokunimowakaru 3:d7263b5155bf 1482 }
bokunimowakaru 3:d7263b5155bf 1483 }
bokunimowakaru 3:d7263b5155bf 1484 #ifdef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 1485 UdpXBeeT.endPacket();
bokunimowakaru 3:d7263b5155bf 1486 #endif
bokunimowakaru 3:d7263b5155bf 1487 #else
bokunimowakaru 3:d7263b5155bf 1488 #ifdef ARM_MBED
bokunimowakaru 3:d7263b5155bf 1489 byte i;
bokunimowakaru 3:d7263b5155bf 1490 for(i=0;i<len;i++){
bokunimowakaru 3:d7263b5155bf 1491 while( !_xbee_serial.writeable() );
bokunimowakaru 3:d7263b5155bf 1492 if( _xbee_serial.putc((int)data[i]) < 0 ) ret=0;
bokunimowakaru 3:d7263b5155bf 1493 }
bokunimowakaru 3:d7263b5155bf 1494 if(ret) ret=len;
bokunimowakaru 3:d7263b5155bf 1495 #else // PC
bokunimowakaru 3:d7263b5155bf 1496 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 1497 byte i;
bokunimowakaru 3:d7263b5155bf 1498 for(i=0;i<len;i++){
bokunimowakaru 3:d7263b5155bf 1499 if(write(xbeeComFd,&data[i],1) != 1){
bokunimowakaru 3:d7263b5155bf 1500 fprintf(stderr,"sci_write ERR:d[%02d]=0x%02x\n",i,(byte)data[i]);
bokunimowakaru 3:d7263b5155bf 1501 ret = 0;
bokunimowakaru 3:d7263b5155bf 1502 }
bokunimowakaru 3:d7263b5155bf 1503 }
bokunimowakaru 3:d7263b5155bf 1504 #ifdef DEBUG_TX
bokunimowakaru 3:d7263b5155bf 1505 printf("Transmitted Packet tx[%3d] to ", len);
bokunimowakaru 3:d7263b5155bf 1506 for(i=0;i<4;i++) printf("%02X",ADR_DEST[i]);
bokunimowakaru 3:d7263b5155bf 1507 printf(" ");
bokunimowakaru 3:d7263b5155bf 1508 for(i=4;i<8;i++) printf("%02X",ADR_DEST[i]);
bokunimowakaru 3:d7263b5155bf 1509 printf("\n");
bokunimowakaru 3:d7263b5155bf 1510 for(i=0;i<len;i++) printf("%3d,",i);
bokunimowakaru 3:d7263b5155bf 1511 printf("\n");
bokunimowakaru 3:d7263b5155bf 1512 for(i=0;i<len;i++) printf(" %02X,",(byte)data[i]); // dataはchar型
bokunimowakaru 3:d7263b5155bf 1513 printf("\n");
bokunimowakaru 3:d7263b5155bf 1514 for(i=0;i<len;i++) if( (byte)data[i]>=0x20 ) printf("'%c',",data[i]); else printf("%3d,",(int)((byte)data[i]));
bokunimowakaru 3:d7263b5155bf 1515 printf("\n");
bokunimowakaru 3:d7263b5155bf 1516 #endif
bokunimowakaru 3:d7263b5155bf 1517 #else // XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 1518 #ifdef DEBUG_TX
bokunimowakaru 3:d7263b5155bf 1519 int i;
bokunimowakaru 3:d7263b5155bf 1520 #endif
bokunimowakaru 3:d7263b5155bf 1521 int ret_i; // 戻り値 0でエラー
bokunimowakaru 3:d7263b5155bf 1522 ret_i = sendto(xbeeTSFd, data, len, 0, (struct sockaddr *)&xbeeT_addr, sizeof(xbeeT_addr));
bokunimowakaru 3:d7263b5155bf 1523 if( ret_i<0 ) ret=0; else if( ret_i>255 ) ret = 0xFF; else ret = (byte)ret_i;
bokunimowakaru 3:d7263b5155bf 1524 #ifdef DEBUG_TX
bokunimowakaru 3:d7263b5155bf 1525 printf("Transmitted Packet tx[%3d] to ", len);
bokunimowakaru 3:d7263b5155bf 1526 for(i=0;i<4;i++) printf("%d.",ADR_DEST[i]);
bokunimowakaru 3:d7263b5155bf 1527 printf(":0xBEE\n");
bokunimowakaru 3:d7263b5155bf 1528 for(i=0;i<len;i++) printf("%3d,",i);
bokunimowakaru 3:d7263b5155bf 1529 printf("\n");
bokunimowakaru 3:d7263b5155bf 1530 for(i=0;i<len;i++) printf(" %02X,",(byte)data[i]); // dataはchar型
bokunimowakaru 3:d7263b5155bf 1531 printf("\n");
bokunimowakaru 3:d7263b5155bf 1532 for(i=0;i<len;i++) if( isgraph((byte)data[i]) ) printf("'%c',",data[i]); else printf("%3d,",(int)((byte)data[i]));
bokunimowakaru 3:d7263b5155bf 1533 printf("\n");
bokunimowakaru 3:d7263b5155bf 1534 #endif
bokunimowakaru 3:d7263b5155bf 1535 #endif
bokunimowakaru 3:d7263b5155bf 1536 #endif // ARM/PC
bokunimowakaru 3:d7263b5155bf 1537 #endif
bokunimowakaru 3:d7263b5155bf 1538 #ifdef DEBUG
bokunimowakaru 3:d7263b5155bf 1539 #ifdef ARM_MBED
bokunimowakaru 3:d7263b5155bf 1540 _xbee_debug.printf("DEBUG:TX OUT DONE(%d)\r\n",ret);
bokunimowakaru 3:d7263b5155bf 1541 #else
bokunimowakaru 3:d7263b5155bf 1542 printf("DEBUG:TX OUT DONE(%d)\n",ret);
bokunimowakaru 3:d7263b5155bf 1543 #endif
bokunimowakaru 3:d7263b5155bf 1544 #endif
bokunimowakaru 3:d7263b5155bf 1545 return( ret );
bokunimowakaru 3:d7263b5155bf 1546 }
bokunimowakaru 3:d7263b5155bf 1547
bokunimowakaru 3:d7263b5155bf 1548 /* string byte操作 */
bokunimowakaru 3:d7263b5155bf 1549 void strcopy(char *s1, const char *s2){ // string.hのstrcpyの真似版
bokunimowakaru 3:d7263b5155bf 1550 while( *s2 != 0x00 ) *s1++ = *s2++;
bokunimowakaru 3:d7263b5155bf 1551 *s1 = 0x00;
bokunimowakaru 3:d7263b5155bf 1552 }
bokunimowakaru 3:d7263b5155bf 1553 void bytecpy(byte *s1, const byte *s2, byte size){ // strcpyのバイト長可変版
bokunimowakaru 3:d7263b5155bf 1554 byte i;
bokunimowakaru 3:d7263b5155bf 1555 for(i=0; i< size ;i++ ){
bokunimowakaru 3:d7263b5155bf 1556 s1[i] = s2[i];
bokunimowakaru 3:d7263b5155bf 1557 }
bokunimowakaru 3:d7263b5155bf 1558 }
bokunimowakaru 3:d7263b5155bf 1559 byte bytecmp(byte *s1, const byte *s2, byte size){ // strcmpの簡易版(大小比較なし)
bokunimowakaru 3:d7263b5155bf 1560 /*バイトデータの比較
bokunimowakaru 3:d7263b5155bf 1561 入力:byte *s1 = 比較データ1
bokunimowakaru 3:d7263b5155bf 1562 入力:byte *s2 = 比較データ2
bokunimowakaru 3:d7263b5155bf 1563 入力:byte size = 比較データ長
bokunimowakaru 3:d7263b5155bf 1564 出力:戻り値 = 0:一致 1:不一致
bokunimowakaru 3:d7263b5155bf 1565 */
bokunimowakaru 3:d7263b5155bf 1566 byte i=0; // 同一なら0を応答
bokunimowakaru 3:d7263b5155bf 1567 for(i=0; i< size ;i++ ){
bokunimowakaru 3:d7263b5155bf 1568 if( s1[i] != s2[i] ) return(1);
bokunimowakaru 3:d7263b5155bf 1569 }
bokunimowakaru 3:d7263b5155bf 1570 return(0);
bokunimowakaru 3:d7263b5155bf 1571 }
bokunimowakaru 3:d7263b5155bf 1572
bokunimowakaru 3:d7263b5155bf 1573 /* LCD用関数 for ARDUINO */ // H8版とPC版は別ファイル lcd_h8.c lcd_pc.c
bokunimowakaru 3:d7263b5155bf 1574 #ifdef ARDUINO
bokunimowakaru 3:d7263b5155bf 1575 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 1576 void lcd_cls(void){
bokunimowakaru 3:d7263b5155bf 1577 xbee_ardlcd.clear();
bokunimowakaru 3:d7263b5155bf 1578 }
bokunimowakaru 3:d7263b5155bf 1579 void lcd_home(void){
bokunimowakaru 3:d7263b5155bf 1580 xbee_ardlcd.home();
bokunimowakaru 3:d7263b5155bf 1581 }
bokunimowakaru 3:d7263b5155bf 1582 void lcd_control(byte disonoff, byte curonoff, byte curblink){
bokunimowakaru 3:d7263b5155bf 1583 }
bokunimowakaru 3:d7263b5155bf 1584 void lcd_goto(const byte mesto){
bokunimowakaru 3:d7263b5155bf 1585 byte row=0;
bokunimowakaru 3:d7263b5155bf 1586
bokunimowakaru 3:d7263b5155bf 1587 switch( mesto ){
bokunimowakaru 3:d7263b5155bf 1588 case LCD_ROW_1: row=0; break;
bokunimowakaru 3:d7263b5155bf 1589 case LCD_ROW_2: row=1; break;
bokunimowakaru 3:d7263b5155bf 1590 case LCD_ROW_3: row=2; break;
bokunimowakaru 3:d7263b5155bf 1591 case LCD_ROW_4: row=3; break;
bokunimowakaru 3:d7263b5155bf 1592 }
bokunimowakaru 3:d7263b5155bf 1593 xbee_ardlcd.setCursor(0,(int)row);
bokunimowakaru 3:d7263b5155bf 1594 }
bokunimowakaru 3:d7263b5155bf 1595 void lcd_shift(const byte data){
bokunimowakaru 3:d7263b5155bf 1596 xbee_ardlcd.write(' ');
bokunimowakaru 3:d7263b5155bf 1597 }
bokunimowakaru 3:d7263b5155bf 1598 void lcd_putch(const char data){
bokunimowakaru 3:d7263b5155bf 1599 xbee_ardlcd.write( data );
bokunimowakaru 3:d7263b5155bf 1600 }
bokunimowakaru 3:d7263b5155bf 1601 void lcd_putstr(const char *data){
bokunimowakaru 3:d7263b5155bf 1602 while(*data != 0) {
bokunimowakaru 3:d7263b5155bf 1603 xbee_ardlcd.write(*data);
bokunimowakaru 3:d7263b5155bf 1604 data++;
bokunimowakaru 3:d7263b5155bf 1605 }
bokunimowakaru 3:d7263b5155bf 1606 }
bokunimowakaru 3:d7263b5155bf 1607 void lcd_disp_bin(const byte x){
bokunimowakaru 3:d7263b5155bf 1608 // xbee_ardlcd.print( x, BIN );
bokunimowakaru 3:d7263b5155bf 1609 byte i;
bokunimowakaru 3:d7263b5155bf 1610 for (i=128;i>0;i>>=1){
bokunimowakaru 3:d7263b5155bf 1611 if ((x&i)==0){
bokunimowakaru 3:d7263b5155bf 1612 lcd_putch('0');
bokunimowakaru 3:d7263b5155bf 1613 }else{
bokunimowakaru 3:d7263b5155bf 1614 lcd_putch('1');
bokunimowakaru 3:d7263b5155bf 1615 }
bokunimowakaru 3:d7263b5155bf 1616 }
bokunimowakaru 3:d7263b5155bf 1617 }
bokunimowakaru 3:d7263b5155bf 1618 void lcd_disp_hex(const byte i){
bokunimowakaru 3:d7263b5155bf 1619 // xbee_ardlcd.print( i, HEX );
bokunimowakaru 3:d7263b5155bf 1620 byte hi,lo;
bokunimowakaru 3:d7263b5155bf 1621 hi=i&0xF0; // High nibble
bokunimowakaru 3:d7263b5155bf 1622 hi=hi>>4;
bokunimowakaru 3:d7263b5155bf 1623 hi=hi+'0';
bokunimowakaru 3:d7263b5155bf 1624 if (hi>'9'){
bokunimowakaru 3:d7263b5155bf 1625 hi=hi+7;
bokunimowakaru 3:d7263b5155bf 1626 }
bokunimowakaru 3:d7263b5155bf 1627 lo=(i&0x0F)+'0'; // Low nibble
bokunimowakaru 3:d7263b5155bf 1628 if (lo>'9'){
bokunimowakaru 3:d7263b5155bf 1629 lo=lo+7;
bokunimowakaru 3:d7263b5155bf 1630 }
bokunimowakaru 3:d7263b5155bf 1631 lcd_putch((char)hi);
bokunimowakaru 3:d7263b5155bf 1632 lcd_putch((char)lo);
bokunimowakaru 3:d7263b5155bf 1633 }
bokunimowakaru 3:d7263b5155bf 1634 void lcd_disp_1(const unsigned int x){
bokunimowakaru 3:d7263b5155bf 1635 if (x<10){
bokunimowakaru 3:d7263b5155bf 1636 xbee_ardlcd.write((char)(x+0x30));
bokunimowakaru 3:d7263b5155bf 1637 }else if (x<16){
bokunimowakaru 3:d7263b5155bf 1638 xbee_ardlcd.write((char)(x-10+'A'));
bokunimowakaru 3:d7263b5155bf 1639 }else{
bokunimowakaru 3:d7263b5155bf 1640 xbee_ardlcd.write('X');
bokunimowakaru 3:d7263b5155bf 1641 }
bokunimowakaru 3:d7263b5155bf 1642 }
bokunimowakaru 3:d7263b5155bf 1643 void lcd_disp_2(unsigned int x){
bokunimowakaru 3:d7263b5155bf 1644 unsigned int y;
bokunimowakaru 3:d7263b5155bf 1645 if (x<100){
bokunimowakaru 3:d7263b5155bf 1646 y=x/10;
bokunimowakaru 3:d7263b5155bf 1647 xbee_ardlcd.write((char)(y+0x30));
bokunimowakaru 3:d7263b5155bf 1648 x-=(y*10);
bokunimowakaru 3:d7263b5155bf 1649 xbee_ardlcd.write((char)(x+0x30));
bokunimowakaru 3:d7263b5155bf 1650 }else{
bokunimowakaru 3:d7263b5155bf 1651 xbee_ardlcd.print("XX");
bokunimowakaru 3:d7263b5155bf 1652 }
bokunimowakaru 3:d7263b5155bf 1653 }
bokunimowakaru 3:d7263b5155bf 1654 void lcd_disp_3(unsigned int x){
bokunimowakaru 3:d7263b5155bf 1655 unsigned int y;
bokunimowakaru 3:d7263b5155bf 1656 if (x<1000){
bokunimowakaru 3:d7263b5155bf 1657 y=x/100;
bokunimowakaru 3:d7263b5155bf 1658 xbee_ardlcd.write((char)(y+0x30));
bokunimowakaru 3:d7263b5155bf 1659 x-=(y*100);
bokunimowakaru 3:d7263b5155bf 1660 y=x/10;
bokunimowakaru 3:d7263b5155bf 1661 xbee_ardlcd.write((char)(y+0x30));
bokunimowakaru 3:d7263b5155bf 1662 x-=(y*10);
bokunimowakaru 3:d7263b5155bf 1663 xbee_ardlcd.write((char)(x+0x30));
bokunimowakaru 3:d7263b5155bf 1664 }else{
bokunimowakaru 3:d7263b5155bf 1665 xbee_ardlcd.print("XXX");
bokunimowakaru 3:d7263b5155bf 1666 }
bokunimowakaru 3:d7263b5155bf 1667 }
bokunimowakaru 3:d7263b5155bf 1668 void lcd_disp_5(unsigned int x){
bokunimowakaru 3:d7263b5155bf 1669 unsigned int y;
bokunimowakaru 3:d7263b5155bf 1670 if (x<=65535){
bokunimowakaru 3:d7263b5155bf 1671 y=x/10000;
bokunimowakaru 3:d7263b5155bf 1672 xbee_ardlcd.write((char)(y+0x30));
bokunimowakaru 3:d7263b5155bf 1673 x-=(y*10000);
bokunimowakaru 3:d7263b5155bf 1674 y=x/1000;
bokunimowakaru 3:d7263b5155bf 1675 xbee_ardlcd.write((char)(y+0x30));
bokunimowakaru 3:d7263b5155bf 1676 x-=(y*1000);
bokunimowakaru 3:d7263b5155bf 1677 y=x/100;
bokunimowakaru 3:d7263b5155bf 1678 xbee_ardlcd.write((char)(y+0x30));
bokunimowakaru 3:d7263b5155bf 1679 x-=(y*100);
bokunimowakaru 3:d7263b5155bf 1680 y=x/10;
bokunimowakaru 3:d7263b5155bf 1681 xbee_ardlcd.write((char)(y+0x30));
bokunimowakaru 3:d7263b5155bf 1682 x-=(y*10);
bokunimowakaru 3:d7263b5155bf 1683 xbee_ardlcd.write((char)(x+0x30));
bokunimowakaru 3:d7263b5155bf 1684 }else{
bokunimowakaru 3:d7263b5155bf 1685 xbee_ardlcd.print("XXXXX");
bokunimowakaru 3:d7263b5155bf 1686 }
bokunimowakaru 3:d7263b5155bf 1687 }
bokunimowakaru 3:d7263b5155bf 1688 void lcd_init(void){
bokunimowakaru 3:d7263b5155bf 1689 xbee_ardlcd.begin(20, 4); // 液晶の桁数×行数の設定
bokunimowakaru 3:d7263b5155bf 1690 xbee_ardlcd.clear(); // 表示クリア
bokunimowakaru 3:d7263b5155bf 1691 }
bokunimowakaru 3:d7263b5155bf 1692 #endif
bokunimowakaru 3:d7263b5155bf 1693 #endif
bokunimowakaru 3:d7263b5155bf 1694
bokunimowakaru 3:d7263b5155bf 1695 /* LCD用関数 for ARM_MBED */ // 注意=液晶では無くシリアルに出力する
bokunimowakaru 3:d7263b5155bf 1696 #ifdef ARM_MBED // D8(PA_9)からログをUART(38400baud)出力します
bokunimowakaru 3:d7263b5155bf 1697 #ifdef DEBUG
bokunimowakaru 3:d7263b5155bf 1698 void lcd_cls(void){
bokunimowakaru 3:d7263b5155bf 1699 _xbee_debug.printf("----------------\r\n");
bokunimowakaru 3:d7263b5155bf 1700 }
bokunimowakaru 3:d7263b5155bf 1701 void lcd_home(void){
bokunimowakaru 3:d7263b5155bf 1702 _xbee_debug.printf("\r\n");
bokunimowakaru 3:d7263b5155bf 1703 }
bokunimowakaru 3:d7263b5155bf 1704 void lcd_control(byte disonoff, byte curonoff, byte curblink){
bokunimowakaru 3:d7263b5155bf 1705 }
bokunimowakaru 3:d7263b5155bf 1706 void lcd_goto(const byte mesto){
bokunimowakaru 3:d7263b5155bf 1707 lcd_home();
bokunimowakaru 3:d7263b5155bf 1708 }
bokunimowakaru 3:d7263b5155bf 1709 void lcd_shift(const byte data){
bokunimowakaru 3:d7263b5155bf 1710 _xbee_debug.putc(' ');
bokunimowakaru 3:d7263b5155bf 1711 }
bokunimowakaru 3:d7263b5155bf 1712 void lcd_putch(const char data){
bokunimowakaru 3:d7263b5155bf 1713 _xbee_debug.putc( data );
bokunimowakaru 3:d7263b5155bf 1714 }
bokunimowakaru 3:d7263b5155bf 1715 void lcd_putstr(const char *data){
bokunimowakaru 3:d7263b5155bf 1716 while(*data != 0) {
bokunimowakaru 3:d7263b5155bf 1717 _xbee_debug.putc(*data);
bokunimowakaru 3:d7263b5155bf 1718 data++;
bokunimowakaru 3:d7263b5155bf 1719 }
bokunimowakaru 3:d7263b5155bf 1720 }
bokunimowakaru 3:d7263b5155bf 1721 void lcd_disp_bin(const byte x){
bokunimowakaru 3:d7263b5155bf 1722 byte i;
bokunimowakaru 3:d7263b5155bf 1723 for (i=128;i>0;i>>=1){
bokunimowakaru 3:d7263b5155bf 1724 if ((x&i)==0){
bokunimowakaru 3:d7263b5155bf 1725 lcd_putch('0');
bokunimowakaru 3:d7263b5155bf 1726 }else{
bokunimowakaru 3:d7263b5155bf 1727 lcd_putch('1');
bokunimowakaru 3:d7263b5155bf 1728 }
bokunimowakaru 3:d7263b5155bf 1729 }
bokunimowakaru 3:d7263b5155bf 1730 }
bokunimowakaru 3:d7263b5155bf 1731 void lcd_disp_hex(const byte i){
bokunimowakaru 3:d7263b5155bf 1732 byte hi,lo;
bokunimowakaru 3:d7263b5155bf 1733 hi=i&0xF0; // High nibble
bokunimowakaru 3:d7263b5155bf 1734 hi=hi>>4;
bokunimowakaru 3:d7263b5155bf 1735 hi=hi+'0';
bokunimowakaru 3:d7263b5155bf 1736 if (hi>'9'){
bokunimowakaru 3:d7263b5155bf 1737 hi=hi+7;
bokunimowakaru 3:d7263b5155bf 1738 }
bokunimowakaru 3:d7263b5155bf 1739 lo=(i&0x0F)+'0'; // Low nibble
bokunimowakaru 3:d7263b5155bf 1740 if (lo>'9'){
bokunimowakaru 3:d7263b5155bf 1741 lo=lo+7;
bokunimowakaru 3:d7263b5155bf 1742 }
bokunimowakaru 3:d7263b5155bf 1743 lcd_putch((char)hi);
bokunimowakaru 3:d7263b5155bf 1744 lcd_putch((char)lo);
bokunimowakaru 3:d7263b5155bf 1745 }
bokunimowakaru 3:d7263b5155bf 1746 void lcd_disp_1(const unsigned int x){
bokunimowakaru 3:d7263b5155bf 1747 if (x<10){
bokunimowakaru 3:d7263b5155bf 1748 _xbee_debug.putc((char)(x+0x30));
bokunimowakaru 3:d7263b5155bf 1749 }else if (x<16){
bokunimowakaru 3:d7263b5155bf 1750 _xbee_debug.putc((char)(x-10+'A'));
bokunimowakaru 3:d7263b5155bf 1751 }else{
bokunimowakaru 3:d7263b5155bf 1752 _xbee_debug.putc('X');
bokunimowakaru 3:d7263b5155bf 1753 }
bokunimowakaru 3:d7263b5155bf 1754 }
bokunimowakaru 3:d7263b5155bf 1755 void lcd_disp_2(unsigned int x){
bokunimowakaru 3:d7263b5155bf 1756 unsigned int y;
bokunimowakaru 3:d7263b5155bf 1757 if (x<100){
bokunimowakaru 3:d7263b5155bf 1758 y=x/10;
bokunimowakaru 3:d7263b5155bf 1759 _xbee_debug.putc((char)(y+0x30));
bokunimowakaru 3:d7263b5155bf 1760 x-=(y*10);
bokunimowakaru 3:d7263b5155bf 1761 _xbee_debug.putc((char)(x+0x30));
bokunimowakaru 3:d7263b5155bf 1762 }else{
bokunimowakaru 3:d7263b5155bf 1763 _xbee_debug.printf("XX");
bokunimowakaru 3:d7263b5155bf 1764 }
bokunimowakaru 3:d7263b5155bf 1765 }
bokunimowakaru 3:d7263b5155bf 1766 void lcd_disp_3(unsigned int x){
bokunimowakaru 3:d7263b5155bf 1767 unsigned int y;
bokunimowakaru 3:d7263b5155bf 1768 if (x<1000){
bokunimowakaru 3:d7263b5155bf 1769 y=x/100;
bokunimowakaru 3:d7263b5155bf 1770 _xbee_debug.putc((char)(y+0x30));
bokunimowakaru 3:d7263b5155bf 1771 x-=(y*100);
bokunimowakaru 3:d7263b5155bf 1772 y=x/10;
bokunimowakaru 3:d7263b5155bf 1773 _xbee_debug.putc((char)(y+0x30));
bokunimowakaru 3:d7263b5155bf 1774 x-=(y*10);
bokunimowakaru 3:d7263b5155bf 1775 _xbee_debug.putc((char)(x+0x30));
bokunimowakaru 3:d7263b5155bf 1776 }else{
bokunimowakaru 3:d7263b5155bf 1777 _xbee_debug.printf("XXX");
bokunimowakaru 3:d7263b5155bf 1778 }
bokunimowakaru 3:d7263b5155bf 1779 }
bokunimowakaru 3:d7263b5155bf 1780 void lcd_disp_5(unsigned int x){
bokunimowakaru 3:d7263b5155bf 1781 unsigned int y;
bokunimowakaru 3:d7263b5155bf 1782 if (x<=65535){
bokunimowakaru 3:d7263b5155bf 1783 y=x/10000;
bokunimowakaru 3:d7263b5155bf 1784 _xbee_debug.putc((char)(y+0x30));
bokunimowakaru 3:d7263b5155bf 1785 x-=(y*10000);
bokunimowakaru 3:d7263b5155bf 1786 y=x/1000;
bokunimowakaru 3:d7263b5155bf 1787 _xbee_debug.putc((char)(y+0x30));
bokunimowakaru 3:d7263b5155bf 1788 x-=(y*1000);
bokunimowakaru 3:d7263b5155bf 1789 y=x/100;
bokunimowakaru 3:d7263b5155bf 1790 _xbee_debug.putc((char)(y+0x30));
bokunimowakaru 3:d7263b5155bf 1791 x-=(y*100);
bokunimowakaru 3:d7263b5155bf 1792 y=x/10;
bokunimowakaru 3:d7263b5155bf 1793 _xbee_debug.putc((char)(y+0x30));
bokunimowakaru 3:d7263b5155bf 1794 x-=(y*10);
bokunimowakaru 3:d7263b5155bf 1795 _xbee_debug.putc((char)(x+0x30));
bokunimowakaru 3:d7263b5155bf 1796 }else{
bokunimowakaru 3:d7263b5155bf 1797 _xbee_debug.printf("XXXXX");
bokunimowakaru 3:d7263b5155bf 1798 }
bokunimowakaru 3:d7263b5155bf 1799 }
bokunimowakaru 3:d7263b5155bf 1800 void lcd_init(void){
bokunimowakaru 3:d7263b5155bf 1801 _xbee_debug.printf("-----\r\n");
bokunimowakaru 3:d7263b5155bf 1802 }
bokunimowakaru 3:d7263b5155bf 1803 #endif
bokunimowakaru 3:d7263b5155bf 1804 #endif
bokunimowakaru 3:d7263b5155bf 1805
bokunimowakaru 3:d7263b5155bf 1806 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 1807 void lcd_disp(const char *s){
bokunimowakaru 3:d7263b5155bf 1808 lcd_cls();
bokunimowakaru 3:d7263b5155bf 1809 lcd_goto(LCD_ROW_1);
bokunimowakaru 3:d7263b5155bf 1810 lcd_putstr( s );
bokunimowakaru 3:d7263b5155bf 1811 #ifndef H3694
bokunimowakaru 3:d7263b5155bf 1812 #ifndef ARDUINO
bokunimowakaru 3:d7263b5155bf 1813 #ifdef ARM_MBED
bokunimowakaru 3:d7263b5155bf 1814 _xbee_debug.printf("\r\n");
bokunimowakaru 3:d7263b5155bf 1815 #else // PC
bokunimowakaru 3:d7263b5155bf 1816 lcd_putch( '\n' );
bokunimowakaru 3:d7263b5155bf 1817 #endif
bokunimowakaru 3:d7263b5155bf 1818 #endif
bokunimowakaru 3:d7263b5155bf 1819 #endif
bokunimowakaru 3:d7263b5155bf 1820 }
bokunimowakaru 3:d7263b5155bf 1821 #endif
bokunimowakaru 3:d7263b5155bf 1822
bokunimowakaru 3:d7263b5155bf 1823 /*********************************************************************
bokunimowakaru 3:d7263b5155bf 1824 XBeeドライバ関数
bokunimowakaru 3:d7263b5155bf 1825 *********************************************************************/
bokunimowakaru 3:d7263b5155bf 1826
bokunimowakaru 3:d7263b5155bf 1827 /*
bokunimowakaru 3:d7263b5155bf 1828 00 01 02 03 04 05 06 07 08....
bokunimowakaru 3:d7263b5155bf 1829 ATNJ = 7E 00 05 08 01 4E 4A FF 5F
bokunimowakaru 3:d7263b5155bf 1830 | | len |mo|FI| NJ=0xFF|CS|
bokunimowakaru 3:d7263b5155bf 1831 | | |de| | |__|___ Check Sum
bokunimowakaru 3:d7263b5155bf 1832 | | | | |________|______ AT コマンド
bokunimowakaru 3:d7263b5155bf 1833 | | | |__|_______________ Frame ID
bokunimowakaru 3:d7263b5155bf 1834 | | |__|__________________ AT=0x08 Remote=0x17
bokunimowakaru 3:d7263b5155bf 1835 | |_____|_____________________ Data Lengrh (ATコマンド+2文字)
bokunimowakaru 3:d7263b5155bf 1836 |__|___________________________ 固定値
bokunimowakaru 3:d7263b5155bf 1837
bokunimowakaru 3:d7263b5155bf 1838 char *at "AT" ATコマンド len=4バイト~最大255 (フレーム8バイト~)
bokunimowakaru 3:d7263b5155bf 1839 "RAT" リモートATコマンド len=15バイト~最大255 (フレーム19バイト~)
bokunimowakaru 3:d7263b5155bf 1840 "TX" データ送信コマンド len=15バイト~最大255 (フレーム19バイト~)
bokunimowakaru 3:d7263b5155bf 1841 ※API_SIZE=32の時valueは12バイトまで
bokunimowakaru 3:d7263b5155bf 1842 */
bokunimowakaru 3:d7263b5155bf 1843
bokunimowakaru 3:d7263b5155bf 1844 /* (ドライバ)ATコマンド送信 */
bokunimowakaru 3:d7263b5155bf 1845 byte xbee_at_tx(const char *at, const byte *value, const byte value_len){
bokunimowakaru 3:d7263b5155bf 1846 /*
bokunimowakaru 3:d7263b5155bf 1847 処理:リモートATコマンドの送信を行うXBeeドライバ部
bokunimowakaru 3:d7263b5155bf 1848 入力:ATコマンドat[] = "AT**"はローカルATで、"RAT***"がリモートAT
bokunimowakaru 3:d7263b5155bf 1849             TXがデータ送信モード
bokunimowakaru 3:d7263b5155bf 1850    データvalue[] = 各ATコマンドで引き渡すデータ値
bokunimowakaru 3:d7263b5155bf 1851    value_len   = その長さ
bokunimowakaru 3:d7263b5155bf 1852 戻り値:送信したAPIサービス長。送信しなかった場合は0
bokunimowakaru 3:d7263b5155bf 1853 */
bokunimowakaru 3:d7263b5155bf 1854 char data_api[API_TXSIZE];
bokunimowakaru 3:d7263b5155bf 1855 byte i;
bokunimowakaru 3:d7263b5155bf 1856 byte len; // APIサービス長
bokunimowakaru 3:d7263b5155bf 1857 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 1858 byte check=0xFF; // チェックサム
bokunimowakaru 3:d7263b5155bf 1859 byte data_position=5; // 送信データdata_api[]の何処にvalue[]を入れるか
bokunimowakaru 3:d7263b5155bf 1860 #endif
bokunimowakaru 3:d7263b5155bf 1861 byte ret=0;
bokunimowakaru 3:d7263b5155bf 1862
bokunimowakaru 3:d7263b5155bf 1863 if( PACKET_ID == 0xFF ){
bokunimowakaru 3:d7263b5155bf 1864 PACKET_ID=0x01;
bokunimowakaru 3:d7263b5155bf 1865 }else{
bokunimowakaru 3:d7263b5155bf 1866 PACKET_ID++;
bokunimowakaru 3:d7263b5155bf 1867 }
bokunimowakaru 3:d7263b5155bf 1868 len=0;
bokunimowakaru 3:d7263b5155bf 1869 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 1870 switch( at[0] ){
bokunimowakaru 3:d7263b5155bf 1871 case 'A':
bokunimowakaru 3:d7263b5155bf 1872 case 'F':
bokunimowakaru 3:d7263b5155bf 1873 if( at[1]=='T'){
bokunimowakaru 3:d7263b5155bf 1874 data_api[3]=(char)0x08; // ATコマンドモード
bokunimowakaru 3:d7263b5155bf 1875 if( at[0] == 'A') data_api[4]=(char)PACKET_ID; // フレームID (at="ATxx")
bokunimowakaru 3:d7263b5155bf 1876 else data_api[4]=0x00; // IDなし(at="FTxx")
bokunimowakaru 3:d7263b5155bf 1877 data_api[5]=(char)at[2]; // ATコマンド上位
bokunimowakaru 3:d7263b5155bf 1878 data_api[6]=(char)at[3]; // ATコマンド下位
bokunimowakaru 3:d7263b5155bf 1879 data_position=7;
bokunimowakaru 3:d7263b5155bf 1880 len=4; // サービスデータにMD+FI+AT(2)バイトが入る
bokunimowakaru 3:d7263b5155bf 1881 }
bokunimowakaru 3:d7263b5155bf 1882 break;
bokunimowakaru 3:d7263b5155bf 1883 case 'R':
bokunimowakaru 3:d7263b5155bf 1884 case 'S':
bokunimowakaru 3:d7263b5155bf 1885 if( at[1]=='A' && at[2]=='T'){
bokunimowakaru 3:d7263b5155bf 1886 data_api[3]=(char)0x17; // リモートATコマンドモード
bokunimowakaru 3:d7263b5155bf 1887 if( at[0] == 'R') data_api[4]=(char)PACKET_ID; // フレームID (at="RATxx")
bokunimowakaru 3:d7263b5155bf 1888 else data_api[4]=0x00; // IDなし(at="SATxx")
bokunimowakaru 3:d7263b5155bf 1889 for( i=5 ; i<=12 ; i++) data_api[i]=(char)ADR_DEST[i-5];
bokunimowakaru 3:d7263b5155bf 1890 for( i=13 ; i<=14 ; i++) data_api[i]=(char)SADR_DEST[i-13];
bokunimowakaru 3:d7263b5155bf 1891 data_api[15]=(char)0x02; // apply changes
bokunimowakaru 3:d7263b5155bf 1892 data_api[16]=(char)at[3]; // ATコマンド上位
bokunimowakaru 3:d7263b5155bf 1893 data_api[17]=(char)at[4]; // ATコマンド下位
bokunimowakaru 3:d7263b5155bf 1894 data_position=18; // value[]を入れる場所
bokunimowakaru 3:d7263b5155bf 1895 len=15; // サービスデータにMD+FI+ADR(8)+SAD(2)+OPT+AT(2)が入る
bokunimowakaru 3:d7263b5155bf 1896 }
bokunimowakaru 3:d7263b5155bf 1897 break;
bokunimowakaru 3:d7263b5155bf 1898 case 'T':
bokunimowakaru 3:d7263b5155bf 1899 if( at[1]=='X'){
bokunimowakaru 3:d7263b5155bf 1900 data_api[3]=(char)0x10; // TXデータ送信モード
bokunimowakaru 3:d7263b5155bf 1901 data_api[4]=(char)0x00; // フレームIDを使用しない(no responce)
bokunimowakaru 3:d7263b5155bf 1902 for( i=5 ; i<=12 ; i++) data_api[i]=(char)ADR_DEST[i-5];
bokunimowakaru 3:d7263b5155bf 1903 for( i=13 ; i<=14 ; i++) data_api[i]=(char)SADR_DEST[i-13];
bokunimowakaru 3:d7263b5155bf 1904 data_api[15]=(char)0x00; // ZigBeeホップ数
bokunimowakaru 3:d7263b5155bf 1905 data_api[16]=(char)0x00; // 暗号化=しない
bokunimowakaru 3:d7263b5155bf 1906 data_position=17;
bokunimowakaru 3:d7263b5155bf 1907 len=14; // サービスデータにMD+FI+ADR(8)+SAD(2)+OPT(2)が入る
bokunimowakaru 3:d7263b5155bf 1908 }
bokunimowakaru 3:d7263b5155bf 1909 break;
bokunimowakaru 3:d7263b5155bf 1910 #ifndef ARDUINO
bokunimowakaru 3:d7263b5155bf 1911 #ifndef ARM_MBED
bokunimowakaru 3:d7263b5155bf 1912 case 'Z':
bokunimowakaru 3:d7263b5155bf 1913 // [0]送信元EndPoint, [1]宛先EndPoint, [2-3]クラスタID, [4-5]プロファイルID
bokunimowakaru 3:d7263b5155bf 1914 // [6]Radius=00 [7]Option=00 [8]Fram Ctrl [9]SeqNum [10]Command [11-12] Attribute
bokunimowakaru 3:d7263b5155bf 1915 if( at[1]=='C' && value_len>12){
bokunimowakaru 3:d7263b5155bf 1916 data_api[3]=(char)0x11; // ZCL送信モード
bokunimowakaru 3:d7263b5155bf 1917 data_api[4]=(char)PACKET_ID; // フレームID
bokunimowakaru 3:d7263b5155bf 1918 for( i=5 ; i<=12 ; i++) data_api[i]=(char)ADR_DEST[i-5];
bokunimowakaru 3:d7263b5155bf 1919 for( i=13 ; i<=14 ; i++) data_api[i]=(char)SADR_DEST[i-13];
bokunimowakaru 3:d7263b5155bf 1920 data_position=15;
bokunimowakaru 3:d7263b5155bf 1921 len=12;
bokunimowakaru 3:d7263b5155bf 1922 }
bokunimowakaru 3:d7263b5155bf 1923 break;
bokunimowakaru 3:d7263b5155bf 1924 #endif
bokunimowakaru 3:d7263b5155bf 1925 #endif
bokunimowakaru 3:d7263b5155bf 1926 default:
bokunimowakaru 3:d7263b5155bf 1927 break;
bokunimowakaru 3:d7263b5155bf 1928 }
bokunimowakaru 3:d7263b5155bf 1929 if( len ){
bokunimowakaru 3:d7263b5155bf 1930 data_api[0]=(char)0x7E; // デリミタ
bokunimowakaru 3:d7263b5155bf 1931 data_api[1]=(char)0x00; // パケット長の上位(送らない前程)
bokunimowakaru 3:d7263b5155bf 1932 for( i=3 ; i < data_position ; i++) check -= (byte)data_api[i];
bokunimowakaru 3:d7263b5155bf 1933 if( value_len > 0 ){
bokunimowakaru 3:d7263b5155bf 1934 for( i=0 ; i<value_len; i++){
bokunimowakaru 3:d7263b5155bf 1935 data_api[data_position + i] = (char)value[i];
bokunimowakaru 3:d7263b5155bf 1936 check -= (byte)data_api[data_position + i];
bokunimowakaru 3:d7263b5155bf 1937 len++;
bokunimowakaru 3:d7263b5155bf 1938 }
bokunimowakaru 3:d7263b5155bf 1939 }
bokunimowakaru 3:d7263b5155bf 1940 data_api[2] =(char)len;
bokunimowakaru 3:d7263b5155bf 1941 data_api[len+3]=(char)check;
bokunimowakaru 3:d7263b5155bf 1942 #ifdef LITE // BeeBee Lite by 蘭
bokunimowakaru 3:d7263b5155bf 1943 sci_write( data_api, (byte)(len+4) );
bokunimowakaru 3:d7263b5155bf 1944 ret=len+3;
bokunimowakaru 3:d7263b5155bf 1945 #else
bokunimowakaru 3:d7263b5155bf 1946 check = sci_write_check(); // 以降 checkはシリアルバッファ確認に使用する
bokunimowakaru 3:d7263b5155bf 1947 /*シリアルデータ送信 */
bokunimowakaru 3:d7263b5155bf 1948 if( check > 0 ){
bokunimowakaru 3:d7263b5155bf 1949 if( sci_write( data_api, (byte)(len+4) ) == 0 ){
bokunimowakaru 3:d7263b5155bf 1950 /* シリアルリセット */
bokunimowakaru 3:d7263b5155bf 1951 #ifndef H3694
bokunimowakaru 3:d7263b5155bf 1952 #ifndef ARDUINO
bokunimowakaru 3:d7263b5155bf 1953 #ifndef ARM_MBED // PC
bokunimowakaru 3:d7263b5155bf 1954 wait_millisec( 100 );
bokunimowakaru 3:d7263b5155bf 1955 close_serial_port(); // シリアルを閉じる
bokunimowakaru 3:d7263b5155bf 1956 wait_millisec( 300 );
bokunimowakaru 3:d7263b5155bf 1957 printf("RESET serial\n");
bokunimowakaru 3:d7263b5155bf 1958 while( sci_init( xbee_com_port )==0){ // 再度オープン
bokunimowakaru 3:d7263b5155bf 1959 wait_millisec( 3000 );
bokunimowakaru 3:d7263b5155bf 1960 close_serial_port(); // シリアルを閉じる
bokunimowakaru 3:d7263b5155bf 1961 wait_millisec( 3000 );
bokunimowakaru 3:d7263b5155bf 1962 printf("RESET serial\n");
bokunimowakaru 3:d7263b5155bf 1963 }
bokunimowakaru 3:d7263b5155bf 1964 wait_millisec( 300 );
bokunimowakaru 3:d7263b5155bf 1965 sci_write( data_api, (byte)(len+4) ); // 再送信
bokunimowakaru 3:d7263b5155bf 1966 #endif
bokunimowakaru 3:d7263b5155bf 1967 #endif
bokunimowakaru 3:d7263b5155bf 1968 #endif
bokunimowakaru 3:d7263b5155bf 1969 }
bokunimowakaru 3:d7263b5155bf 1970 ret=len+3;
bokunimowakaru 3:d7263b5155bf 1971 }else{
bokunimowakaru 3:d7263b5155bf 1972 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 1973 led_red( 1 );
bokunimowakaru 3:d7263b5155bf 1974 #endif
bokunimowakaru 3:d7263b5155bf 1975 #ifdef ERRLOG
bokunimowakaru 3:d7263b5155bf 1976 strcopy( ERR_LOG , "ERR:TX Buffer Over" );
bokunimowakaru 3:d7263b5155bf 1977 ERR_CODE = check;
bokunimowakaru 3:d7263b5155bf 1978 #endif
bokunimowakaru 3:d7263b5155bf 1979 ret=0;
bokunimowakaru 3:d7263b5155bf 1980 }
bokunimowakaru 3:d7263b5155bf 1981 #endif
bokunimowakaru 3:d7263b5155bf 1982 }
bokunimowakaru 3:d7263b5155bf 1983 #else // XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 1984 switch( at[0] ){
bokunimowakaru 3:d7263b5155bf 1985 case 'A':
bokunimowakaru 3:d7263b5155bf 1986 case 'F':
bokunimowakaru 3:d7263b5155bf 1987 if( at[1]=='T' ){
bokunimowakaru 3:d7263b5155bf 1988 data_api[0]=(char)0x02; // ATコマンドモード
bokunimowakaru 3:d7263b5155bf 1989 data_api[1]=(char)0x00; // 固定
bokunimowakaru 3:d7263b5155bf 1990 if( at[0] == 'A' ) data_api[2]=(char)PACKET_ID; // フレームID
bokunimowakaru 3:d7263b5155bf 1991 data_api[3]=(char)0x02;
bokunimowakaru 3:d7263b5155bf 1992 data_api[4]=(char)at[2]; // ATコマンド上位
bokunimowakaru 3:d7263b5155bf 1993 data_api[5]=(char)at[3]; // ATコマンド下位
bokunimowakaru 3:d7263b5155bf 1994 len=6;
bokunimowakaru 3:d7263b5155bf 1995 }
bokunimowakaru 3:d7263b5155bf 1996 break;
bokunimowakaru 3:d7263b5155bf 1997 case 'R':
bokunimowakaru 3:d7263b5155bf 1998 case 'S':
bokunimowakaru 3:d7263b5155bf 1999 if( at[1]=='A' && at[2]=='T' ){
bokunimowakaru 3:d7263b5155bf 2000 data_api[0]=(char)0x02; // ATコマンドモード
bokunimowakaru 3:d7263b5155bf 2001 data_api[1]=(char)0x00; // 固定
bokunimowakaru 3:d7263b5155bf 2002 if( at[0] == 'R'){
bokunimowakaru 3:d7263b5155bf 2003 data_api[2]=(char)PACKET_ID; // フレームID
bokunimowakaru 3:d7263b5155bf 2004 data_api[3]=(char)0x02;
bokunimowakaru 3:d7263b5155bf 2005 }else{
bokunimowakaru 3:d7263b5155bf 2006 data_api[2]=(char)0x00;
bokunimowakaru 3:d7263b5155bf 2007 data_api[3]=(char)0x00;
bokunimowakaru 3:d7263b5155bf 2008 }
bokunimowakaru 3:d7263b5155bf 2009 data_api[4]=(char)at[3]; // ATコマンド上位
bokunimowakaru 3:d7263b5155bf 2010 data_api[5]=(char)at[4]; // ATコマンド下位
bokunimowakaru 3:d7263b5155bf 2011 len=6;
bokunimowakaru 3:d7263b5155bf 2012 }
bokunimowakaru 3:d7263b5155bf 2013 case 'T':
bokunimowakaru 3:d7263b5155bf 2014 if( at[1]=='X'){
bokunimowakaru 3:d7263b5155bf 2015 data_api[0]=(char)0x00; // シリアルデータモード
bokunimowakaru 3:d7263b5155bf 2016 data_api[1]=(char)0x00; // ackが必要なときは01
bokunimowakaru 3:d7263b5155bf 2017 len=2; // datasheetでは3だが誤り。実装は2
bokunimowakaru 3:d7263b5155bf 2018 }
bokunimowakaru 3:d7263b5155bf 2019 break;
bokunimowakaru 3:d7263b5155bf 2020 default:
bokunimowakaru 3:d7263b5155bf 2021 break;
bokunimowakaru 3:d7263b5155bf 2022 }
bokunimowakaru 3:d7263b5155bf 2023 if( len ){
bokunimowakaru 3:d7263b5155bf 2024 if( value_len > 0 ){
bokunimowakaru 3:d7263b5155bf 2025 for( i=0 ; i<value_len; i++){
bokunimowakaru 3:d7263b5155bf 2026 data_api[len] = (char)value[i];
bokunimowakaru 3:d7263b5155bf 2027 len++;
bokunimowakaru 3:d7263b5155bf 2028 }
bokunimowakaru 3:d7263b5155bf 2029 }
bokunimowakaru 3:d7263b5155bf 2030 if(DEVICE_TYPE == XB_TYPE_WIFI20){
bokunimowakaru 3:d7263b5155bf 2031 #ifdef DEBUG
bokunimowakaru 3:d7263b5155bf 2032 printf("DEBUG:TX_10(%3d):",len);
bokunimowakaru 3:d7263b5155bf 2033 for(i=0;i<len;i++) printf("%02X,",data_api[i]);
bokunimowakaru 3:d7263b5155bf 2034 printf("\n");
bokunimowakaru 3:d7263b5155bf 2035 #endif
bokunimowakaru 3:d7263b5155bf 2036 len+=6;
bokunimowakaru 3:d7263b5155bf 2037 if( len <= API_TXSIZE ){
bokunimowakaru 3:d7263b5155bf 2038 for(i=len-6; i>0; i--){
bokunimowakaru 3:d7263b5155bf 2039 data_api[i+5]=data_api[i-1];
bokunimowakaru 3:d7263b5155bf 2040 }
bokunimowakaru 3:d7263b5155bf 2041 data_api[0]=0x42;
bokunimowakaru 3:d7263b5155bf 2042 data_api[1]=0x42;
bokunimowakaru 3:d7263b5155bf 2043 data_api[2]=0x0;
bokunimowakaru 3:d7263b5155bf 2044 data_api[3]=0x0;
bokunimowakaru 3:d7263b5155bf 2045 data_api[4]=0x0;
bokunimowakaru 3:d7263b5155bf 2046 data_api[5]=0x0;
bokunimowakaru 3:d7263b5155bf 2047 }
bokunimowakaru 3:d7263b5155bf 2048 #ifdef DEBUG
bokunimowakaru 3:d7263b5155bf 2049 printf("DEBUG:TX_20(%3d):",len);
bokunimowakaru 3:d7263b5155bf 2050 for(i=0;i<len;i++) printf("%02X,",data_api[i]);
bokunimowakaru 3:d7263b5155bf 2051 printf("\n");
bokunimowakaru 3:d7263b5155bf 2052 #endif
bokunimowakaru 3:d7263b5155bf 2053 }
bokunimowakaru 3:d7263b5155bf 2054 if( sci_write_check() > 0 ){ // XBEE_WIFIなのでifdef LITEは不要
bokunimowakaru 3:d7263b5155bf 2055 #ifdef XBEE_WIFI_DEBUG
bokunimowakaru 3:d7263b5155bf 2056 Serial.print("TX udp size=");
bokunimowakaru 3:d7263b5155bf 2057 Serial.print(len);
bokunimowakaru 3:d7263b5155bf 2058 Serial.print(", ");
bokunimowakaru 3:d7263b5155bf 2059 for(i=0;i<len;i++){
bokunimowakaru 3:d7263b5155bf 2060 Serial.print(data_api[i],HEX);
bokunimowakaru 3:d7263b5155bf 2061 Serial.print(" ");
bokunimowakaru 3:d7263b5155bf 2062 }
bokunimowakaru 3:d7263b5155bf 2063 Serial.println("");
bokunimowakaru 3:d7263b5155bf 2064 #endif
bokunimowakaru 3:d7263b5155bf 2065 #ifdef DEBUG
bokunimowakaru 3:d7263b5155bf 2066 printf("TX udp size=%d\n",len);
bokunimowakaru 3:d7263b5155bf 2067 #endif
bokunimowakaru 3:d7263b5155bf 2068 if( sci_write( data_api, len ) == 0 ){
bokunimowakaru 3:d7263b5155bf 2069 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 2070 led_red( 1 );
bokunimowakaru 3:d7263b5155bf 2071 #endif
bokunimowakaru 3:d7263b5155bf 2072 #ifdef ERRLOG
bokunimowakaru 3:d7263b5155bf 2073 strcopy( ERR_LOG , "ERR:TX Write Error" );
bokunimowakaru 3:d7263b5155bf 2074 ERR_CODE = 0x00;
bokunimowakaru 3:d7263b5155bf 2075 #endif
bokunimowakaru 3:d7263b5155bf 2076 #ifdef XBEE_WIFI_DEBUG
bokunimowakaru 3:d7263b5155bf 2077 Serial.println("ERR:TX Write Error" );
bokunimowakaru 3:d7263b5155bf 2078 #endif
bokunimowakaru 3:d7263b5155bf 2079 #ifdef DEBUG
bokunimowakaru 3:d7263b5155bf 2080 printf("ERR:TX Write Error\n");
bokunimowakaru 3:d7263b5155bf 2081 #endif
bokunimowakaru 3:d7263b5155bf 2082 ret=0;
bokunimowakaru 3:d7263b5155bf 2083 }else ret = len;
bokunimowakaru 3:d7263b5155bf 2084 }else{
bokunimowakaru 3:d7263b5155bf 2085 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 2086 led_red( 1 );
bokunimowakaru 3:d7263b5155bf 2087 #endif
bokunimowakaru 3:d7263b5155bf 2088 #ifdef ERRLOG
bokunimowakaru 3:d7263b5155bf 2089 strcopy( ERR_LOG , "ERR:TX Buffer Over" );
bokunimowakaru 3:d7263b5155bf 2090 ERR_CODE = 0x00;
bokunimowakaru 3:d7263b5155bf 2091 #endif
bokunimowakaru 3:d7263b5155bf 2092 #ifdef DEBUG
bokunimowakaru 3:d7263b5155bf 2093 printf("ERR:TX Buffer Over\n");
bokunimowakaru 3:d7263b5155bf 2094 #endif
bokunimowakaru 3:d7263b5155bf 2095 ret=0;
bokunimowakaru 3:d7263b5155bf 2096 }
bokunimowakaru 3:d7263b5155bf 2097 }
bokunimowakaru 3:d7263b5155bf 2098 #endif
bokunimowakaru 3:d7263b5155bf 2099 return( ret );
bokunimowakaru 3:d7263b5155bf 2100 }
bokunimowakaru 3:d7263b5155bf 2101
bokunimowakaru 3:d7263b5155bf 2102 /* (ドライバ)ATコマンド受信 */
bokunimowakaru 3:d7263b5155bf 2103 byte xbee_at_rx(byte *data){
bokunimowakaru 3:d7263b5155bf 2104 /*
bokunimowakaru 3:d7263b5155bf 2105 リモートATコマンドの応答を受信するXBeeドライバ部
bokunimowakaru 3:d7263b5155bf 2106 処理:XBeeからの受信データをdata[]へ代入(応答)する
bokunimowakaru 3:d7263b5155bf 2107 入出力:APIデータdata[] 前3バイトは'7E'+len(2) data[0]が0x00の場合はタイムアウト
bokunimowakaru 3:d7263b5155bf 2108 リターン:APIサービス長、0はタイムアウト
bokunimowakaru 3:d7263b5155bf 2109 */
bokunimowakaru 3:d7263b5155bf 2110 byte i;
bokunimowakaru 3:d7263b5155bf 2111 byte len; // APIサービス長-3 (APIフレームの前3バイトとチェックサム1バイトを除く)
bokunimowakaru 3:d7263b5155bf 2112 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 2113 unsigned int leni; // 実際のAPIサービス長と使用するAPIサービス長の差(データ破棄用)
bokunimowakaru 3:d7263b5155bf 2114 byte check = 0xFF; // チェックサム
bokunimowakaru 3:d7263b5155bf 2115 #endif
bokunimowakaru 3:d7263b5155bf 2116 byte ret=0;
bokunimowakaru 3:d7263b5155bf 2117
bokunimowakaru 3:d7263b5155bf 2118 /* 受信処理 */
bokunimowakaru 3:d7263b5155bf 2119 #ifndef XBEE_WIFI // ZigBee
bokunimowakaru 3:d7263b5155bf 2120 data[0] = sci_read( 1 ); // 1ms待ち受けで受信
bokunimowakaru 3:d7263b5155bf 2121 if( data[0] == 0x7E ) { // 期待デリミタ0x7E時
bokunimowakaru 3:d7263b5155bf 2122 for( i=1;i<=2;i++ ){
bokunimowakaru 3:d7263b5155bf 2123 #ifdef LITE // BeeBee Lite by 蘭
bokunimowakaru 3:d7263b5155bf 2124 data[i] = sci_read( 35 ); // 1割だけ緩和しました。sci_read 32⇒35(Wataru)
bokunimowakaru 3:d7263b5155bf 2125 #else
bokunimowakaru 3:d7263b5155bf 2126 data[i] = sci_read( 50 );
bokunimowakaru 3:d7263b5155bf 2127 #endif
bokunimowakaru 3:d7263b5155bf 2128 }
bokunimowakaru 3:d7263b5155bf 2129 if(data[1] == 0x00) len = data[2];
bokunimowakaru 3:d7263b5155bf 2130 else len = 0xFF - 4; // API長が255バイトまでの制約(本来は64KB)
bokunimowakaru 3:d7263b5155bf 2131 if( len > (API_SIZE-4) ) len = API_SIZE-4;
bokunimowakaru 3:d7263b5155bf 2132 leni = (unsigned int)data[1] * 256 + (unsigned int)data[2] - (unsigned int)len;
bokunimowakaru 3:d7263b5155bf 2133 // 通常は0。lenが本来の容量よりも少ない場合に不足分が代入されれる
bokunimowakaru 3:d7263b5155bf 2134 for( i=0 ; i <= len ; i++){ // i = lenはチェックサムを入力する
bokunimowakaru 3:d7263b5155bf 2135 #ifdef LITE // BeeBee Lite by 蘭
bokunimowakaru 3:d7263b5155bf 2136 data[i+3] = sci_read( 35 ); // 1割だけ緩和しました。sci_read 32⇒35(Wataru)
bokunimowakaru 3:d7263b5155bf 2137 #else
bokunimowakaru 3:d7263b5155bf 2138 data[i+3] = sci_read( 50 );
bokunimowakaru 3:d7263b5155bf 2139 #endif
bokunimowakaru 3:d7263b5155bf 2140 if( i != len) check -= data[i+3]; // チェックサムのカウント
bokunimowakaru 3:d7263b5155bf 2141 }
bokunimowakaru 3:d7263b5155bf 2142 while( leni > 0 ){
bokunimowakaru 3:d7263b5155bf 2143 data[len+3] = sci_read( 50 ); // データの空読み(lenは固定)
bokunimowakaru 3:d7263b5155bf 2144 if( leni != 1 ) {
bokunimowakaru 3:d7263b5155bf 2145 check -= data[len+3]; // leni=0の時はCheck sumなので減算しない
bokunimowakaru 3:d7263b5155bf 2146 }
bokunimowakaru 3:d7263b5155bf 2147 leni--;
bokunimowakaru 3:d7263b5155bf 2148 }
bokunimowakaru 3:d7263b5155bf 2149 if( check == data[len+3] ) ret = len +3;
bokunimowakaru 3:d7263b5155bf 2150 else ret = 0;
bokunimowakaru 3:d7263b5155bf 2151 #ifdef DEBUG_RX
bokunimowakaru 3:d7263b5155bf 2152 lcd_cls(); lcd_goto(LCD_ROW_1);
bokunimowakaru 3:d7263b5155bf 2153 lcd_putstr("->");
bokunimowakaru 3:d7263b5155bf 2154 for( i=0 ; i <= len+3 ; i++){
bokunimowakaru 3:d7263b5155bf 2155 lcd_disp_hex( data[i] );
bokunimowakaru 3:d7263b5155bf 2156 if( i == 8 ) lcd_goto(LCD_ROW_2);
bokunimowakaru 3:d7263b5155bf 2157 if( i == 18 ) lcd_goto(LCD_ROW_3);
bokunimowakaru 3:d7263b5155bf 2158 if( i == 28 ) lcd_goto(LCD_ROW_4);
bokunimowakaru 3:d7263b5155bf 2159 if( i == 38 ) lcd_goto(LCD_ROW_1);
bokunimowakaru 3:d7263b5155bf 2160 }
bokunimowakaru 3:d7263b5155bf 2161 lcd_goto(LCD_ROW_4);
bokunimowakaru 3:d7263b5155bf 2162 lcd_putstr("ID=");
bokunimowakaru 3:d7263b5155bf 2163 lcd_disp_hex( PACKET_ID );
bokunimowakaru 3:d7263b5155bf 2164 lcd_putstr(":");
bokunimowakaru 3:d7263b5155bf 2165 lcd_disp_hex( data[4] );
bokunimowakaru 3:d7263b5155bf 2166 if( check != data[len+3]){
bokunimowakaru 3:d7263b5155bf 2167 lcd_putstr(" ER=");
bokunimowakaru 3:d7263b5155bf 2168 }else{
bokunimowakaru 3:d7263b5155bf 2169 lcd_putstr(" OK=");
bokunimowakaru 3:d7263b5155bf 2170 }
bokunimowakaru 3:d7263b5155bf 2171 lcd_disp_hex( check );
bokunimowakaru 3:d7263b5155bf 2172 lcd_putstr(":");
bokunimowakaru 3:d7263b5155bf 2173 lcd_disp_hex( data[len+3] );
bokunimowakaru 3:d7263b5155bf 2174 #endif
bokunimowakaru 3:d7263b5155bf 2175 }
bokunimowakaru 3:d7263b5155bf 2176 #else // XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 2177 ret = sci_read_frame( data );
bokunimowakaru 3:d7263b5155bf 2178
bokunimowakaru 3:d7263b5155bf 2179 if( ret >= 7){ // もともと10バイト以上にしていたけどUARTは最低7バイトからなので変更
bokunimowakaru 3:d7263b5155bf 2180 #ifdef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 2181 if(DEVICE_TYPE == XB_TYPE_WIFI20 && data[4] != 0x00){ // UARTのときは処理不要
bokunimowakaru 3:d7263b5155bf 2182 #ifdef DEBUG
bokunimowakaru 3:d7263b5155bf 2183 printf("DEBUG:RX_10(%3d):",ret);
bokunimowakaru 3:d7263b5155bf 2184 for(i=0;i<ret;i++) printf("%02X,",data[i]);
bokunimowakaru 3:d7263b5155bf 2185 printf("\n");
bokunimowakaru 3:d7263b5155bf 2186 #endif
bokunimowakaru 3:d7263b5155bf 2187 if( ret > 10 ){
bokunimowakaru 3:d7263b5155bf 2188 for(i=10; i<ret; i++)data[i-6]=data[i];
bokunimowakaru 3:d7263b5155bf 2189 ret -=6;
bokunimowakaru 3:d7263b5155bf 2190 }
bokunimowakaru 3:d7263b5155bf 2191 #ifdef DEBUG
bokunimowakaru 3:d7263b5155bf 2192 printf("DEBUG:RX_20(%3d):",ret);
bokunimowakaru 3:d7263b5155bf 2193 for(i=0;i<ret;i++) printf("%02X,",data[i]);
bokunimowakaru 3:d7263b5155bf 2194 printf("\n");
bokunimowakaru 3:d7263b5155bf 2195 #endif
bokunimowakaru 3:d7263b5155bf 2196 }
bokunimowakaru 3:d7263b5155bf 2197 #endif
bokunimowakaru 3:d7263b5155bf 2198 switch( data[4] ){
bokunimowakaru 3:d7263b5155bf 2199 case 0x82: // Remote AT Resp. アドレス4バイト+基本レスポンス6バイト+オプション0バイト以上
bokunimowakaru 3:d7263b5155bf 2200 if(ret >= 10){
bokunimowakaru 3:d7263b5155bf 2201 for(i=ret;i>=10; i--){
bokunimowakaru 3:d7263b5155bf 2202 data[i+8] = data[i]; // 破壊 18以降全て ※メモリリークするのでUdpXBeeR受信で制限している
bokunimowakaru 3:d7263b5155bf 2203 }
bokunimowakaru 3:d7263b5155bf 2204 data[17] = data[9]; // AT Command status
bokunimowakaru 3:d7263b5155bf 2205 data[16] = data[8]; // AT Command LSB
bokunimowakaru 3:d7263b5155bf 2206 data[15] = data[7]; // AT Command MSB
bokunimowakaru 3:d7263b5155bf 2207 data[14] = 0xFE;
bokunimowakaru 3:d7263b5155bf 2208 data[13] = 0xFF;
bokunimowakaru 3:d7263b5155bf 2209 data[4]=data[6]; // Frame ID 破壊 4
bokunimowakaru 3:d7263b5155bf 2210 for(i=0;i<4;i++){ // IPアドレス
bokunimowakaru 3:d7263b5155bf 2211 data[5+i]=data[i]; // 破壊 5,6,7,8
bokunimowakaru 3:d7263b5155bf 2212 data[9+i]=0x00; // 破壊 9,10,11,12
bokunimowakaru 3:d7263b5155bf 2213 }
bokunimowakaru 3:d7263b5155bf 2214 data[3]=0x97; // rat res
bokunimowakaru 3:d7263b5155bf 2215 data[0]=0x7E; // 受信成功
bokunimowakaru 3:d7263b5155bf 2216 ret += 9;
bokunimowakaru 3:d7263b5155bf 2217 data[1]=0x00; // length上位
bokunimowakaru 3:d7263b5155bf 2218 data[2]=ret-3; // length下位
bokunimowakaru 3:d7263b5155bf 2219 }
bokunimowakaru 3:d7263b5155bf 2220 break;
bokunimowakaru 3:d7263b5155bf 2221 case 0x04: // IO RX Sample アドレス4バイト+基本レスポンス6バイト+オプション0バイト以上
bokunimowakaru 3:d7263b5155bf 2222 if(ret >= 10){
bokunimowakaru 3:d7263b5155bf 2223 for(i=ret;i>=6; i--){ // datasheetの誤り Number SamplesのOffsetはdatesheetでは3だが実際は2
bokunimowakaru 3:d7263b5155bf 2224 // これにIPの4バイトが追加されるので6
bokunimowakaru 3:d7263b5155bf 2225 data[i+9] = data[i]; // 破壊 15以降全て ※メモリリークするのでUdpXBeeR受信で制限している
bokunimowakaru 3:d7263b5155bf 2226 }
bokunimowakaru 3:d7263b5155bf 2227 data[14] = 0x02; // Packet was a broadcast
bokunimowakaru 3:d7263b5155bf 2228 data[13] = 0xFE;
bokunimowakaru 3:d7263b5155bf 2229 data[12] = 0xFF;
bokunimowakaru 3:d7263b5155bf 2230 for(i=0;i<4;i++){ // IPアドレス
bokunimowakaru 3:d7263b5155bf 2231 data[4+i]=data[i]; // 破壊 5,6,7,8
bokunimowakaru 3:d7263b5155bf 2232 data[8+i]=0x00; // 破壊 9,10,11,12
bokunimowakaru 3:d7263b5155bf 2233 }
bokunimowakaru 3:d7263b5155bf 2234 data[3]=0x92; // io sample
bokunimowakaru 3:d7263b5155bf 2235 data[0]=0x7E; // 受信成功
bokunimowakaru 3:d7263b5155bf 2236 ret += 10;
bokunimowakaru 3:d7263b5155bf 2237 data[1]=0x00; // length上位
bokunimowakaru 3:d7263b5155bf 2238 data[2]=ret-3; // length下位
bokunimowakaru 3:d7263b5155bf 2239 }
bokunimowakaru 3:d7263b5155bf 2240 break;
bokunimowakaru 3:d7263b5155bf 2241 case 0x00: // UART
bokunimowakaru 3:d7263b5155bf 2242 len = data[5]; // 破壊されるのでUART長はバックアップ
bokunimowakaru 3:d7263b5155bf 2243 for(i=ret;i>=6; i--){
bokunimowakaru 3:d7263b5155bf 2244 data[i+9] = data[i]; // 破壊 15以降全て ※メモリリークするのでUdpXBeeU受信で制限している
bokunimowakaru 3:d7263b5155bf 2245 }
bokunimowakaru 3:d7263b5155bf 2246 data[14] = 0x02; // Packet was a broadcast
bokunimowakaru 3:d7263b5155bf 2247 data[13] = 0xFE;
bokunimowakaru 3:d7263b5155bf 2248 data[12] = 0xFF;
bokunimowakaru 3:d7263b5155bf 2249 for(i=0;i<4;i++){ // IPアドレス
bokunimowakaru 3:d7263b5155bf 2250 data[4+i]=data[i]; // 破壊 5,6,7,8
bokunimowakaru 3:d7263b5155bf 2251 data[8+i]=0x00; // 破壊 9,10,11,12
bokunimowakaru 3:d7263b5155bf 2252 }
bokunimowakaru 3:d7263b5155bf 2253 data[1]=0x00; // 243バイトまでしか考慮しない
bokunimowakaru 3:d7263b5155bf 2254 data[2]=len + 0x0C; // 243バイトまでしか考慮しない
bokunimowakaru 3:d7263b5155bf 2255 data[3]=0x90; // UART
bokunimowakaru 3:d7263b5155bf 2256 data[0]=0x7E; // 受信成功
bokunimowakaru 3:d7263b5155bf 2257 ret += 10;
bokunimowakaru 3:d7263b5155bf 2258 break;
bokunimowakaru 3:d7263b5155bf 2259 default:
bokunimowakaru 3:d7263b5155bf 2260 for(i=ret;i>=7; i--){
bokunimowakaru 3:d7263b5155bf 2261 data[i+8] = data[i]; // 破壊 18以降全て ※メモリリークするのでUdpXBeeR受信で制限している
bokunimowakaru 3:d7263b5155bf 2262 }
bokunimowakaru 3:d7263b5155bf 2263 data[4]=data[6]; // Frame ID 破壊 4
bokunimowakaru 3:d7263b5155bf 2264 for(i=0;i<4;i++){ // IPアドレス
bokunimowakaru 3:d7263b5155bf 2265 data[5+i]=data[i]; // 破壊 5,6,7,8
bokunimowakaru 3:d7263b5155bf 2266 data[9+i]=0x00; // 破壊 9,10,11,12
bokunimowakaru 3:d7263b5155bf 2267 }
bokunimowakaru 3:d7263b5155bf 2268 data[3]=data[4];
bokunimowakaru 3:d7263b5155bf 2269 ret=0;
bokunimowakaru 3:d7263b5155bf 2270 }
bokunimowakaru 3:d7263b5155bf 2271 #ifdef DEBUG
bokunimowakaru 3:d7263b5155bf 2272 printf("DEBUG:RX_ZB(%3d):",ret);
bokunimowakaru 3:d7263b5155bf 2273 for(i=0;i<ret;i++) printf("%02X,",data[i]);
bokunimowakaru 3:d7263b5155bf 2274 printf("\n");
bokunimowakaru 3:d7263b5155bf 2275 #endif
bokunimowakaru 3:d7263b5155bf 2276 }else ret=0;
bokunimowakaru 3:d7263b5155bf 2277 #ifdef XBEE_WIFI_DEBUG
bokunimowakaru 3:d7263b5155bf 2278 Serial.print("RX api size=");
bokunimowakaru 3:d7263b5155bf 2279 Serial.print(ret);
bokunimowakaru 3:d7263b5155bf 2280 Serial.print(", ");
bokunimowakaru 3:d7263b5155bf 2281 for(i=0;i<ret;i++){
bokunimowakaru 3:d7263b5155bf 2282 Serial.print(data[i],HEX);
bokunimowakaru 3:d7263b5155bf 2283 Serial.print(" ");
bokunimowakaru 3:d7263b5155bf 2284 }
bokunimowakaru 3:d7263b5155bf 2285 Serial.println("");
bokunimowakaru 3:d7263b5155bf 2286 #endif
bokunimowakaru 3:d7263b5155bf 2287 #endif
bokunimowakaru 3:d7263b5155bf 2288 return( ret );
bokunimowakaru 3:d7263b5155bf 2289 }
bokunimowakaru 3:d7263b5155bf 2290
bokunimowakaru 3:d7263b5155bf 2291 /* (ドライバ)パケット差出人の抽出 */
bokunimowakaru 3:d7263b5155bf 2292 byte xbee_from_acum( const byte *data ){
bokunimowakaru 3:d7263b5155bf 2293 /*
bokunimowakaru 3:d7263b5155bf 2294 処理:受信データの差出人をグローバル変数へ登録 ※xbee_at_rxでは登録しない
bokunimowakaru 3:d7263b5155bf 2295 入力:data[] APIデータ
bokunimowakaru 3:d7263b5155bf 2296 出力:byte 受信データの種別mode値を戻り値に代入
bokunimowakaru 3:d7263b5155bf 2297    受信データの差出人をグローバル変数ADR_FROMに代入
bokunimowakaru 3:d7263b5155bf 2298 再起動で8Aのモード応答あり
bokunimowakaru 3:d7263b5155bf 2299 */
bokunimowakaru 3:d7263b5155bf 2300 byte i;
bokunimowakaru 3:d7263b5155bf 2301 byte ret=0;
bokunimowakaru 3:d7263b5155bf 2302
bokunimowakaru 3:d7263b5155bf 2303 if( data[3]==MODE_UART // 0x90 UART Receive
bokunimowakaru 3:d7263b5155bf 2304 || data[3]==MODE_UAR2 // 0x91 UART AO=0
bokunimowakaru 3:d7263b5155bf 2305 || data[3]==MODE_GPIN // 0x92 GPI data
bokunimowakaru 3:d7263b5155bf 2306 || data[3]==MODE_SENS // 0x94 XB Sensor
bokunimowakaru 3:d7263b5155bf 2307 || data[3]==MODE_IDNT){ // 0x95 Node Identify
bokunimowakaru 3:d7263b5155bf 2308 for(i=0;i<8;i++) ADR_FROM[i]=data[4+i];
bokunimowakaru 3:d7263b5155bf 2309 ret = data[3]; // mode値
bokunimowakaru 3:d7263b5155bf 2310 }else if(
bokunimowakaru 3:d7263b5155bf 2311 data[3]==MODE_RESP){ // 0x97 リモートATコマンドの結果
bokunimowakaru 3:d7263b5155bf 2312 for(i=0;i<8;i++) ADR_FROM[i]=data[5+i];
bokunimowakaru 3:d7263b5155bf 2313 ret = data[3]; // mode値
bokunimowakaru 3:d7263b5155bf 2314 }else if(
bokunimowakaru 3:d7263b5155bf 2315 data[3]==MODE_RES // 0x88 ローカルATコマンドの結果
bokunimowakaru 3:d7263b5155bf 2316 || data[3]==MODE_MODM){ // 0x8A Modem Statusを受信
bokunimowakaru 3:d7263b5155bf 2317 ret = data[3]; // mode値
bokunimowakaru 3:d7263b5155bf 2318 }else{
bokunimowakaru 3:d7263b5155bf 2319 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 2320 led_red( 1 );
bokunimowakaru 3:d7263b5155bf 2321 #endif
bokunimowakaru 3:d7263b5155bf 2322 #ifdef ERRLOG
bokunimowakaru 3:d7263b5155bf 2323 strcopy( ERR_LOG , "ERR:xbee_from" );
bokunimowakaru 3:d7263b5155bf 2324 ERR_CODE = data[3];
bokunimowakaru 3:d7263b5155bf 2325 #endif
bokunimowakaru 3:d7263b5155bf 2326 ret = 0;
bokunimowakaru 3:d7263b5155bf 2327 }
bokunimowakaru 3:d7263b5155bf 2328 return( ret );
bokunimowakaru 3:d7263b5155bf 2329 }
bokunimowakaru 3:d7263b5155bf 2330
bokunimowakaru 3:d7263b5155bf 2331 /* (ドライバ)GPIO入力データの計算部 */
bokunimowakaru 3:d7263b5155bf 2332 byte xbee_gpi_acum( byte *data ){
bokunimowakaru 3:d7263b5155bf 2333 /* リモート先(ADR_FROMに入力)のGPIOの入力値(下位バイト)を応答する。
bokunimowakaru 3:d7263b5155bf 2334 リモート先は(こちらから呼ばなくても)GPIOの変化などで自動送信する設定にしておく必要がある。
bokunimowakaru 3:d7263b5155bf 2335 具体的にはリモート先をATIC設定するなど。本演算関数はxbee_rx_callから呼ばれる。
bokunimowakaru 3:d7263b5155bf 2336 port: port指定 IO名 ピン番号 USB評価ボード(XBIB-U-Dev)
bokunimowakaru 3:d7263b5155bf 2337 port= 1 DIO1 XBee_pin 19 (AD1) SW2
bokunimowakaru 3:d7263b5155bf 2338 port= 2 DIO2 XBee_pin 18 (AD2) SW3
bokunimowakaru 3:d7263b5155bf 2339 port= 3 DIO3 XBee_pin 17 (AD3) SW4
bokunimowakaru 3:d7263b5155bf 2340 out: port 1~7の入力値をバイトで応答。
bokunimowakaru 3:d7263b5155bf 2341 上位バイトのポートには対応しない
bokunimowakaru 3:d7263b5155bf 2342 DIOのport1~7がオフでかつADCが有効の場合は有効ADC(1~3の最も若い番号)のAD変換結果を応答する。
bokunimowakaru 3:d7263b5155bf 2343 ADC結果は8ビットに間引かれる。電圧は0~1.2Vに対応する。以下でADC電圧を得ることが可能。
bokunimowakaru 3:d7263b5155bf 2344 (unsigned int)xbee_gpi_acum(data)/255*1200 [mV]
bokunimowakaru 3:d7263b5155bf 2345 注意1:DIO/ADCの切り換え方法:DIOのport1~7が一つでも有効であればDIOとして動作します。
bokunimowakaru 3:d7263b5155bf 2346 port1~7のDIOが全て無効でADCが有効であれば有効なADC(1~3の最も若い番号)が動作します。
bokunimowakaru 3:d7263b5155bf 2347 port1~7のDIOとADC1~3が全て無効で電源電圧検出ADCが有効であれば電圧を応答します。(要確認)
bokunimowakaru 3:d7263b5155bf 2348 未対応:電源電圧ADCの範囲と単位を要確認。必要に応じて値を変換する必要がある。
bokunimowakaru 3:d7263b5155bf 2349 mode = MODE_GPIN(0x92) GPI data
bokunimowakaru 3:d7263b5155bf 2350
bokunimowakaru 3:d7263b5155bf 2351 data[17]:mask(下位)
bokunimowakaru 3:d7263b5155bf 2352 */
bokunimowakaru 3:d7263b5155bf 2353 byte ret=0xFF;
bokunimowakaru 3:d7263b5155bf 2354
bokunimowakaru 3:d7263b5155bf 2355 if( data[3] == MODE_GPIN ){ // data[3]:MODE_GPIN(92)
bokunimowakaru 3:d7263b5155bf 2356 if( xbee_from_acum( data ) > 0 ){ // 差出人をグローバル変数へ
bokunimowakaru 3:d7263b5155bf 2357 if( (data[17]&0xFE) != 0x00 ){ // DIO(port 1~7)がある時
bokunimowakaru 3:d7263b5155bf 2358 ret = (data[17] & data[20]); // 20:DIOデータ(下位バイト) 17:マスク
bokunimowakaru 3:d7263b5155bf 2359 }else if( (data[18]&0x8E) != 0 ){ // ADCがあるとき
bokunimowakaru 3:d7263b5155bf 2360 if( data[16] == 0x00 && data[17] == 0x00 ){ // DIOが全てマスクされているとき
bokunimowakaru 3:d7263b5155bf 2361 ret = (data[19]<6) | (data[20]>2); // 19:ADCデータ(上位)、20:下位
bokunimowakaru 3:d7263b5155bf 2362 }else{ //
bokunimowakaru 3:d7263b5155bf 2363 ret = (data[21]<6) | (data[22]>2); // 21:ADCデータ(上位)、22:下位
bokunimowakaru 3:d7263b5155bf 2364 }
bokunimowakaru 3:d7263b5155bf 2365 }
bokunimowakaru 3:d7263b5155bf 2366 }else{
bokunimowakaru 3:d7263b5155bf 2367 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 2368 led_red( 1 );
bokunimowakaru 3:d7263b5155bf 2369 #endif
bokunimowakaru 3:d7263b5155bf 2370 #ifdef ERRLOG
bokunimowakaru 3:d7263b5155bf 2371 strcopy( ERR_LOG , "ERR:xbee_gpi acum" );
bokunimowakaru 3:d7263b5155bf 2372 ERR_CODE = xbee_from_acum( data );
bokunimowakaru 3:d7263b5155bf 2373 #endif
bokunimowakaru 3:d7263b5155bf 2374 }
bokunimowakaru 3:d7263b5155bf 2375 }else{
bokunimowakaru 3:d7263b5155bf 2376 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 2377 led_red( 1 );
bokunimowakaru 3:d7263b5155bf 2378 #endif
bokunimowakaru 3:d7263b5155bf 2379 #ifdef ERRLOG
bokunimowakaru 3:d7263b5155bf 2380 strcopy( ERR_LOG , "ERR:xbee_gpi mode" );
bokunimowakaru 3:d7263b5155bf 2381 ERR_CODE = data[3];
bokunimowakaru 3:d7263b5155bf 2382 #endif
bokunimowakaru 3:d7263b5155bf 2383 }
bokunimowakaru 3:d7263b5155bf 2384 #ifdef DEBUG_RX
bokunimowakaru 3:d7263b5155bf 2385 lcd_goto(LCD_ROW_2);
bokunimowakaru 3:d7263b5155bf 2386 lcd_putstr(" M:"); // MASK表示
bokunimowakaru 3:d7263b5155bf 2387 lcd_disp_hex( data[16] );
bokunimowakaru 3:d7263b5155bf 2388 lcd_disp_hex( data[17] );
bokunimowakaru 3:d7263b5155bf 2389 lcd_putstr(" D:"); // デジタルサンプル値
bokunimowakaru 3:d7263b5155bf 2390 lcd_disp_hex( data[19] );
bokunimowakaru 3:d7263b5155bf 2391 lcd_disp_hex( data[20] );
bokunimowakaru 3:d7263b5155bf 2392 #endif
bokunimowakaru 3:d7263b5155bf 2393 return(ret);
bokunimowakaru 3:d7263b5155bf 2394 }
bokunimowakaru 3:d7263b5155bf 2395
bokunimowakaru 3:d7263b5155bf 2396 /* (ドライバ)UART入力データの計算部 */
bokunimowakaru 3:d7263b5155bf 2397 byte xbee_uart_acum( byte *data ){
bokunimowakaru 3:d7263b5155bf 2398 /*
bokunimowakaru 3:d7263b5155bf 2399 mode =MODE_UART(0x90) UART Receive
bokunimowakaru 3:d7263b5155bf 2400 mode =MODE_UAR2(0x91) UART AO=0
bokunimowakaru 3:d7263b5155bf 2401 */
bokunimowakaru 3:d7263b5155bf 2402 #ifdef DEBUG_RX
bokunimowakaru 3:d7263b5155bf 2403 byte i; // DEGUG用
bokunimowakaru 3:d7263b5155bf 2404 byte len;
bokunimowakaru 3:d7263b5155bf 2405 #endif
bokunimowakaru 3:d7263b5155bf 2406 byte ret=0;
bokunimowakaru 3:d7263b5155bf 2407
bokunimowakaru 3:d7263b5155bf 2408 if( data[3] == 0x90 ){ // data[3]:データ種別=ZigBee Recieve Packet
bokunimowakaru 3:d7263b5155bf 2409 if( xbee_from_acum( data ) > 0 ){
bokunimowakaru 3:d7263b5155bf 2410 ret = data[15]; // 15:データ1文字 ※Digi仕様書P100記載誤り
bokunimowakaru 3:d7263b5155bf 2411 #ifdef DEBUG_RX
bokunimowakaru 3:d7263b5155bf 2412 len = data[2]-0x0C; // 12バイト減算
bokunimowakaru 3:d7263b5155bf 2413 #endif
bokunimowakaru 3:d7263b5155bf 2414 }else{
bokunimowakaru 3:d7263b5155bf 2415 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 2416 led_red( 1 );
bokunimowakaru 3:d7263b5155bf 2417 #endif
bokunimowakaru 3:d7263b5155bf 2418 #ifdef ERRLOG
bokunimowakaru 3:d7263b5155bf 2419 strcopy( ERR_LOG , "ERR:xbee_uart from" );
bokunimowakaru 3:d7263b5155bf 2420 ERR_CODE = xbee_from_acum( data );
bokunimowakaru 3:d7263b5155bf 2421 #endif
bokunimowakaru 3:d7263b5155bf 2422 }
bokunimowakaru 3:d7263b5155bf 2423 }else if( data[3] == 0x91 ){ // data[3]:データ種別=ZigBee Explict Rx Indicator
bokunimowakaru 3:d7263b5155bf 2424 if( xbee_from_acum( data ) > 0 ){
bokunimowakaru 3:d7263b5155bf 2425 ret = data[21]; // 14:データ1文字
bokunimowakaru 3:d7263b5155bf 2426 #ifdef DEBUG_RX
bokunimowakaru 3:d7263b5155bf 2427 len = data[2]-0x12; // 18バイト減算
bokunimowakaru 3:d7263b5155bf 2428 #endif
bokunimowakaru 3:d7263b5155bf 2429 }else{
bokunimowakaru 3:d7263b5155bf 2430 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 2431 led_red( 1 );
bokunimowakaru 3:d7263b5155bf 2432 #endif
bokunimowakaru 3:d7263b5155bf 2433 #ifdef ERRLOG
bokunimowakaru 3:d7263b5155bf 2434 strcopy( ERR_LOG , "ERR:xbee_uart2 from" );
bokunimowakaru 3:d7263b5155bf 2435 ERR_CODE = xbee_from_acum( data );
bokunimowakaru 3:d7263b5155bf 2436 #endif
bokunimowakaru 3:d7263b5155bf 2437 }
bokunimowakaru 3:d7263b5155bf 2438 }else{
bokunimowakaru 3:d7263b5155bf 2439 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 2440 led_red( 1 );
bokunimowakaru 3:d7263b5155bf 2441 #endif
bokunimowakaru 3:d7263b5155bf 2442 #ifdef ERRLOG
bokunimowakaru 3:d7263b5155bf 2443 strcopy( ERR_LOG , "ERR:xbee_uart mode" );
bokunimowakaru 3:d7263b5155bf 2444 ERR_CODE = data[3];
bokunimowakaru 3:d7263b5155bf 2445 #endif
bokunimowakaru 3:d7263b5155bf 2446 }
bokunimowakaru 3:d7263b5155bf 2447 #ifdef DEBUG_RX
bokunimowakaru 3:d7263b5155bf 2448 lcd_goto(LCD_ROW_3);
bokunimowakaru 3:d7263b5155bf 2449 lcd_putstr("[");
bokunimowakaru 3:d7263b5155bf 2450 if( data[3]==0x90 && len>1 ) for(i=0; i< len ; i++) lcd_putch( data[15+i] );
bokunimowakaru 3:d7263b5155bf 2451 else if( data[3]==0x91 && len>1 ) for(i=0; i< len ; i++) lcd_putch( data[21+i] );
bokunimowakaru 3:d7263b5155bf 2452 else lcd_putch( ret );
bokunimowakaru 3:d7263b5155bf 2453 lcd_putstr( "](0x" );
bokunimowakaru 3:d7263b5155bf 2454 lcd_disp_hex( ret );
bokunimowakaru 3:d7263b5155bf 2455 lcd_putstr( ") l=" );
bokunimowakaru 3:d7263b5155bf 2456 lcd_disp_hex( len );
bokunimowakaru 3:d7263b5155bf 2457 if( data[3]==0x91 ){
bokunimowakaru 3:d7263b5155bf 2458 lcd_putstr(" CI:");
bokunimowakaru 3:d7263b5155bf 2459 lcd_disp_hex( data[16] );
bokunimowakaru 3:d7263b5155bf 2460 lcd_disp_hex( data[17] );
bokunimowakaru 3:d7263b5155bf 2461 lcd_putstr(".");
bokunimowakaru 3:d7263b5155bf 2462 lcd_disp_hex( data[18] );
bokunimowakaru 3:d7263b5155bf 2463 lcd_disp_hex( data[19] );
bokunimowakaru 3:d7263b5155bf 2464 }
bokunimowakaru 3:d7263b5155bf 2465 #endif
bokunimowakaru 3:d7263b5155bf 2466 return(ret);
bokunimowakaru 3:d7263b5155bf 2467 }
bokunimowakaru 3:d7263b5155bf 2468
bokunimowakaru 3:d7263b5155bf 2469 /* (ドライバ)ATコマンドの送信+受信 */
bokunimowakaru 3:d7263b5155bf 2470 byte xbee_tx_rx(const char *at, byte *data, byte len){
bokunimowakaru 3:d7263b5155bf 2471 /*
bokunimowakaru 3:d7263b5155bf 2472 コマンド送信と受信がセットになったAPI(受信コマンドの簡単なチェックも実施)
bokunimowakaru 3:d7263b5155bf 2473 at: ATコマンド(文字列)
bokunimowakaru 3:d7263b5155bf 2474 data[API_SIZE]: 入力データ/出力データ(共用)
bokunimowakaru 3:d7263b5155bf 2475 ※本コマンドの処理中に受信した他のパケット(送信IDとATコマンド名で判定)は破棄する。
bokunimowakaru 3:d7263b5155bf 2476 (始めに受信キャッシュクリアしている)
bokunimowakaru 3:d7263b5155bf 2477 戻り値:エラー時 0x00
bokunimowakaru 3:d7263b5155bf 2478
bokunimowakaru 3:d7263b5155bf 2479 注意:本コマンドは応答待ちを行うので干渉によるパケット損失があります。
bokunimowakaru 3:d7263b5155bf 2480 */
bokunimowakaru 3:d7263b5155bf 2481
bokunimowakaru 3:d7263b5155bf 2482 byte err,retry;
bokunimowakaru 3:d7263b5155bf 2483 byte r_dat = 10; // AT=0、RAT=10、TX=未定 リモートATと通常ATの応答値dataの代入位置の差
bokunimowakaru 3:d7263b5155bf 2484 byte r_at = 1; // AT=0、RAT=1 リモートの可否
bokunimowakaru 3:d7263b5155bf 2485 #ifndef XBEE_WIFI // ZigBee
bokunimowakaru 3:d7263b5155bf 2486 unsigned int wait_add = 0;
bokunimowakaru 3:d7263b5155bf 2487 #endif
bokunimowakaru 3:d7263b5155bf 2488 #ifdef CACHE_RES
bokunimowakaru 3:d7263b5155bf 2489 byte i;
bokunimowakaru 3:d7263b5155bf 2490 #endif
bokunimowakaru 3:d7263b5155bf 2491
bokunimowakaru 3:d7263b5155bf 2492 #ifndef LITE // BeeBee Lite by 蘭
bokunimowakaru 3:d7263b5155bf 2493 sci_write_check();
bokunimowakaru 3:d7263b5155bf 2494 #endif
bokunimowakaru 3:d7263b5155bf 2495 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 2496 sci_clear();
bokunimowakaru 3:d7263b5155bf 2497 #endif
bokunimowakaru 3:d7263b5155bf 2498
bokunimowakaru 3:d7263b5155bf 2499 #ifndef XBEE_WIFI // ZigBee
bokunimowakaru 3:d7263b5155bf 2500 if( at[0] == 'A' && at[1] == 'T' ){
bokunimowakaru 3:d7263b5155bf 2501 r_dat = 0; r_at=0;
bokunimowakaru 3:d7263b5155bf 2502 if( at[2] == 'W' && at[3] == 'R' ) wait_add = 100; // ATWR 110~1100ms
bokunimowakaru 3:d7263b5155bf 2503 } else if ( at[0] == 'R' && at[1] == 'A' && at[2] == 'T' ){
bokunimowakaru 3:d7263b5155bf 2504 r_dat = 10; r_at=1;
bokunimowakaru 3:d7263b5155bf 2505 if( at[3] == 'W' && at[4] == 'R' ) wait_add = 100; // RATWR 120~1200ms
bokunimowakaru 3:d7263b5155bf 2506 }
bokunimowakaru 3:d7263b5155bf 2507 if( xbee_at_tx( at ,data ,len ) > 0){
bokunimowakaru 3:d7263b5155bf 2508 err = 12; // 受信なしエラー
bokunimowakaru 3:d7263b5155bf 2509 for( retry = 10 ; ( retry > 0 && err != 0 ) ; retry-- ){
bokunimowakaru 3:d7263b5155bf 2510 wait_millisec( 10 + (unsigned int)r_dat ); // 応答時間待ち AT 10~100ms / RAT 20~200ms
bokunimowakaru 3:d7263b5155bf 2511 if( wait_add != 0 ){
bokunimowakaru 3:d7263b5155bf 2512 wait_millisec( wait_add ); // 追加ウェイト
bokunimowakaru 3:d7263b5155bf 2513 }
bokunimowakaru 3:d7263b5155bf 2514 if( xbee_at_rx( data ) > 0){
bokunimowakaru 3:d7263b5155bf 2515 if( (
bokunimowakaru 3:d7263b5155bf 2516 ( data[3] == MODE_RES && r_at == 0 ) || ( data[3] == MODE_RESP && r_at == 1 )
bokunimowakaru 3:d7263b5155bf 2517 ) && (
bokunimowakaru 3:d7263b5155bf 2518 data[4] == PACKET_ID
bokunimowakaru 3:d7263b5155bf 2519 )
bokunimowakaru 3:d7263b5155bf 2520 ){
bokunimowakaru 3:d7263b5155bf 2521 /* ATコマンドが正しいかどうかの確認を削除(Ver 1.51)
bokunimowakaru 3:d7263b5155bf 2522 ※MODE_RESPの条件を追加したので不要のはず。
bokunimowakaru 3:d7263b5155bf 2523 && data[5+r_dat] == (byte)at[2+r_at] && data[6+r_dat] == (byte)at[3+r_at]
bokunimowakaru 3:d7263b5155bf 2524 */
bokunimowakaru 3:d7263b5155bf 2525 if( data[7+r_dat] == 0x00 ){
bokunimowakaru 3:d7263b5155bf 2526 err=0;
bokunimowakaru 3:d7263b5155bf 2527 }else err = data[7+r_dat]; // ATのERRORコード (AT:data[7] RAT:data[17])
bokunimowakaru 3:d7263b5155bf 2528 }else{ // 受信したパケットIDまたはATコマンドが相違しているとき
bokunimowakaru 3:d7263b5155bf 2529 #ifdef CACHE_RES
bokunimowakaru 3:d7263b5155bf 2530 if( CACHE_COUNTER < CACHE_RES ){
bokunimowakaru 3:d7263b5155bf 2531 for( i=0 ; i < API_SIZE ; i++) CACHE_MEM[CACHE_COUNTER][i] = data[i];
bokunimowakaru 3:d7263b5155bf 2532 CACHE_COUNTER++;
bokunimowakaru 3:d7263b5155bf 2533 #ifdef DEBUG
bokunimowakaru 3:d7263b5155bf 2534 lcd_putstr("### CACHE_RES ### <- "); // DEBUG
bokunimowakaru 3:d7263b5155bf 2535 lcd_disp_hex( CACHE_COUNTER );
bokunimowakaru 3:d7263b5155bf 2536 lcd_putch('\n');
bokunimowakaru 3:d7263b5155bf 2537 #endif
bokunimowakaru 3:d7263b5155bf 2538 }
bokunimowakaru 3:d7263b5155bf 2539 #endif
bokunimowakaru 3:d7263b5155bf 2540 // キャッシュ容量が無い場合は受信データを保持せずにリトライする
bokunimowakaru 3:d7263b5155bf 2541 }
bokunimowakaru 3:d7263b5155bf 2542 }
bokunimowakaru 3:d7263b5155bf 2543 }
bokunimowakaru 3:d7263b5155bf 2544 //printf("\nretry=%d\n",retry);
bokunimowakaru 3:d7263b5155bf 2545 }else err = 11; // 送信失敗
bokunimowakaru 3:d7263b5155bf 2546 #else // XBEE_WIFI (PC + Arduino)
bokunimowakaru 3:d7263b5155bf 2547 #ifdef XBEE_WIFI_DEBUG
bokunimowakaru 3:d7263b5155bf 2548 for(i=0;i<(5+len);i++) Serial.print(at[i]);
bokunimowakaru 3:d7263b5155bf 2549 Serial.print('(');
bokunimowakaru 3:d7263b5155bf 2550 Serial.print(PACKET_ID,HEX);
bokunimowakaru 3:d7263b5155bf 2551 Serial.println(')');
bokunimowakaru 3:d7263b5155bf 2552 #endif
bokunimowakaru 3:d7263b5155bf 2553
bokunimowakaru 3:d7263b5155bf 2554 if(DEVICE_TYPE == XB_TYPE_NULL){
bokunimowakaru 3:d7263b5155bf 2555 #ifdef DEBUG
bokunimowakaru 3:d7263b5155bf 2556 printf("DEBUG:check DEVICE_TYPE = XB_TYPE_WIFI20\n");
bokunimowakaru 3:d7263b5155bf 2557 #endif
bokunimowakaru 3:d7263b5155bf 2558 DEVICE_TYPE = XB_TYPE_WIFI20;
bokunimowakaru 3:d7263b5155bf 2559 if( xbee_tx_rx(at, data, len) > 0 ){
bokunimowakaru 3:d7263b5155bf 2560 return(1);
bokunimowakaru 3:d7263b5155bf 2561 }else{
bokunimowakaru 3:d7263b5155bf 2562 #ifdef DEBUG
bokunimowakaru 3:d7263b5155bf 2563 printf("DEBUG:check DEVICE_TYPE = XB_TYPE_WIFI10\n");
bokunimowakaru 3:d7263b5155bf 2564 #endif
bokunimowakaru 3:d7263b5155bf 2565 DEVICE_TYPE = XB_TYPE_WIFI10;
bokunimowakaru 3:d7263b5155bf 2566 if( xbee_tx_rx(at, data, len) > 0 ) return(1);
bokunimowakaru 3:d7263b5155bf 2567 else{
bokunimowakaru 3:d7263b5155bf 2568 #ifdef DEBUG
bokunimowakaru 3:d7263b5155bf 2569 printf("DEBUG:no Response at check DEVICE_TYPE\n");
bokunimowakaru 3:d7263b5155bf 2570 #endif
bokunimowakaru 3:d7263b5155bf 2571 DEVICE_TYPE = XB_TYPE_NULL;
bokunimowakaru 3:d7263b5155bf 2572 #ifdef ERRLOG
bokunimowakaru 3:d7263b5155bf 2573 ERR_CODE=12;
bokunimowakaru 3:d7263b5155bf 2574 strcopy( ERR_LOG ,"ERR:tx_rx no Rx Res. wifi check");
bokunimowakaru 3:d7263b5155bf 2575 #endif
bokunimowakaru 3:d7263b5155bf 2576 return(0); // エラー終了
bokunimowakaru 3:d7263b5155bf 2577 }
bokunimowakaru 3:d7263b5155bf 2578 }
bokunimowakaru 3:d7263b5155bf 2579 }
bokunimowakaru 3:d7263b5155bf 2580 if( xbee_at_tx( at ,data ,len ) > 0){
bokunimowakaru 3:d7263b5155bf 2581 err = 12; // 受信なしエラー
bokunimowakaru 3:d7263b5155bf 2582 for( retry = 10 ; ( retry > 0 && err != 0 ) ; retry-- ){
bokunimowakaru 3:d7263b5155bf 2583 if( xbee_at_rx( data ) > 0){
bokunimowakaru 3:d7263b5155bf 2584 if( (
bokunimowakaru 3:d7263b5155bf 2585 ( data[3] == MODE_RES && r_at == 0 ) || ( data[3] == MODE_RESP && r_at == 1 )
bokunimowakaru 3:d7263b5155bf 2586 ) && (
bokunimowakaru 3:d7263b5155bf 2587 data[4] == PACKET_ID
bokunimowakaru 3:d7263b5155bf 2588 )
bokunimowakaru 3:d7263b5155bf 2589 ){
bokunimowakaru 3:d7263b5155bf 2590 /* ATコマンドが正しいかどうかの確認を削除(Ver 1.51)
bokunimowakaru 3:d7263b5155bf 2591 ※MODE_RESPの条件を追加したので不要のはず。
bokunimowakaru 3:d7263b5155bf 2592 && data[5+r_dat] == (byte)at[2+r_at] && data[6+r_dat] == (byte)at[3+r_at]
bokunimowakaru 3:d7263b5155bf 2593 */
bokunimowakaru 3:d7263b5155bf 2594 if( data[7+r_dat] == 0x00 ){
bokunimowakaru 3:d7263b5155bf 2595 err=0;
bokunimowakaru 3:d7263b5155bf 2596 }else err = data[7+r_dat]; // ATのERRORコード (AT:data[7] RAT:data[17])
bokunimowakaru 3:d7263b5155bf 2597 }else{ // 受信したパケットIDまたはATコマンドが相違しているとき
bokunimowakaru 3:d7263b5155bf 2598 #ifdef CACHE_RES
bokunimowakaru 3:d7263b5155bf 2599 if( CACHE_COUNTER < CACHE_RES ){
bokunimowakaru 3:d7263b5155bf 2600 for( i=0 ; i < API_SIZE ; i++) CACHE_MEM[CACHE_COUNTER][i] = data[i];
bokunimowakaru 3:d7263b5155bf 2601 CACHE_COUNTER++;
bokunimowakaru 3:d7263b5155bf 2602 #ifdef DEBUG
bokunimowakaru 3:d7263b5155bf 2603 lcd_putstr("### CACHE_RES ### <- "); // DEBUG
bokunimowakaru 3:d7263b5155bf 2604 lcd_disp_hex( CACHE_COUNTER );
bokunimowakaru 3:d7263b5155bf 2605 lcd_putch('\n');
bokunimowakaru 3:d7263b5155bf 2606 #endif
bokunimowakaru 3:d7263b5155bf 2607 }
bokunimowakaru 3:d7263b5155bf 2608 #endif
bokunimowakaru 3:d7263b5155bf 2609 // キャッシュ容量が無い場合は受信データを保持せずにリトライする
bokunimowakaru 3:d7263b5155bf 2610 }
bokunimowakaru 3:d7263b5155bf 2611 }else{ // 受信データが無い時(リトライ前)
bokunimowakaru 3:d7263b5155bf 2612 wait_millisec(50); // 50msの待ち時間
bokunimowakaru 3:d7263b5155bf 2613 }
bokunimowakaru 3:d7263b5155bf 2614 }
bokunimowakaru 3:d7263b5155bf 2615 }else err = 11; // 送信失敗
bokunimowakaru 3:d7263b5155bf 2616 delay(1); // 直前のコマンド応答がすぐに返った時にキャッシュに貯めれないことを防止する
bokunimowakaru 3:d7263b5155bf 2617
bokunimowakaru 3:d7263b5155bf 2618 #endif
bokunimowakaru 3:d7263b5155bf 2619
bokunimowakaru 3:d7263b5155bf 2620 if( err ){
bokunimowakaru 3:d7263b5155bf 2621 wait_millisec( 1000 ); // 応答待ち状態で、次々にコマンドを送るとXBeeモジュールが非応答になる対策
bokunimowakaru 3:d7263b5155bf 2622 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 2623 led_red( 1 );
bokunimowakaru 3:d7263b5155bf 2624 #endif
bokunimowakaru 3:d7263b5155bf 2625 #ifdef ERRLOG
bokunimowakaru 3:d7263b5155bf 2626 ERR_CODE=err;
bokunimowakaru 3:d7263b5155bf 2627 switch(err){
bokunimowakaru 3:d7263b5155bf 2628 case 2: // 01234567890123456789
bokunimowakaru 3:d7263b5155bf 2629 strcopy( ERR_LOG ,"ERR:tx_rx AT Command");
bokunimowakaru 3:d7263b5155bf 2630 break;
bokunimowakaru 3:d7263b5155bf 2631 case 3:
bokunimowakaru 3:d7263b5155bf 2632 strcopy( ERR_LOG ,"ERR:tx_rx AT Param. ");
bokunimowakaru 3:d7263b5155bf 2633 break;
bokunimowakaru 3:d7263b5155bf 2634 case 4:
bokunimowakaru 3:d7263b5155bf 2635 strcopy( ERR_LOG ,"ERR:tx_rx AT Commu. ");
bokunimowakaru 3:d7263b5155bf 2636 break;
bokunimowakaru 3:d7263b5155bf 2637 case 10:
bokunimowakaru 3:d7263b5155bf 2638 strcopy( ERR_LOG ,"ERR:tx_rx not AT CMD");
bokunimowakaru 3:d7263b5155bf 2639 break;
bokunimowakaru 3:d7263b5155bf 2640 case 11:
bokunimowakaru 3:d7263b5155bf 2641 strcopy( ERR_LOG ,"ERR:tx_rx TX Failed ");
bokunimowakaru 3:d7263b5155bf 2642 break;
bokunimowakaru 3:d7263b5155bf 2643 case 12:
bokunimowakaru 3:d7263b5155bf 2644 strcopy( ERR_LOG ,"ERR:tx_rx no Rx Res.");
bokunimowakaru 3:d7263b5155bf 2645 break;
bokunimowakaru 3:d7263b5155bf 2646 case 13:
bokunimowakaru 3:d7263b5155bf 2647 strcopy( ERR_LOG ,"ERR:tx_rx AT Pckt ID");
bokunimowakaru 3:d7263b5155bf 2648 break;
bokunimowakaru 3:d7263b5155bf 2649 case 14:
bokunimowakaru 3:d7263b5155bf 2650 strcopy( ERR_LOG ,"ERR:tx_rx Diff.Adrs.");
bokunimowakaru 3:d7263b5155bf 2651 break;
bokunimowakaru 3:d7263b5155bf 2652 default:
bokunimowakaru 3:d7263b5155bf 2653 strcopy( ERR_LOG ,"ERR:tx_rx AT unknown");
bokunimowakaru 3:d7263b5155bf 2654 break;
bokunimowakaru 3:d7263b5155bf 2655 }
bokunimowakaru 3:d7263b5155bf 2656 ERR_LOG[20] = ':';
bokunimowakaru 3:d7263b5155bf 2657 if( at[0] == 'A' ){
bokunimowakaru 3:d7263b5155bf 2658 ERR_LOG[21] = at[2];
bokunimowakaru 3:d7263b5155bf 2659 ERR_LOG[22] = at[3];
bokunimowakaru 3:d7263b5155bf 2660 }else{
bokunimowakaru 3:d7263b5155bf 2661 ERR_LOG[21] = at[3];
bokunimowakaru 3:d7263b5155bf 2662 ERR_LOG[22] = at[4];
bokunimowakaru 3:d7263b5155bf 2663 }
bokunimowakaru 3:d7263b5155bf 2664 #endif
bokunimowakaru 3:d7263b5155bf 2665 }
bokunimowakaru 3:d7263b5155bf 2666 #ifdef XBEE_WIFI_DEBUG
bokunimowakaru 3:d7263b5155bf 2667 if( err ){
bokunimowakaru 3:d7263b5155bf 2668 Serial.print("ERR in tx_rx ");
bokunimowakaru 3:d7263b5155bf 2669 Serial.println(err,DEC);
bokunimowakaru 3:d7263b5155bf 2670 }
bokunimowakaru 3:d7263b5155bf 2671 #endif
bokunimowakaru 3:d7263b5155bf 2672 #ifdef DEBUG
bokunimowakaru 3:d7263b5155bf 2673 #ifdef ARM_MBED
bokunimowakaru 3:d7263b5155bf 2674 if( err ){
bokunimowakaru 3:d7263b5155bf 2675 _xbee_debug.printf("DEBUG: %s ", ERR_LOG);
bokunimowakaru 3:d7263b5155bf 2676 _xbee_debug.printf("(err=%d)\r\n", err);
bokunimowakaru 3:d7263b5155bf 2677 }
bokunimowakaru 3:d7263b5155bf 2678 #else
bokunimowakaru 3:d7263b5155bf 2679 if( err ) fprintf(stderr,"DEBUG: %s (err=%d)\n", ERR_LOG,err);
bokunimowakaru 3:d7263b5155bf 2680 #endif
bokunimowakaru 3:d7263b5155bf 2681 #endif
bokunimowakaru 3:d7263b5155bf 2682 return( !err );
bokunimowakaru 3:d7263b5155bf 2683 }
bokunimowakaru 3:d7263b5155bf 2684
bokunimowakaru 3:d7263b5155bf 2685 /***********************************************************************
bokunimowakaru 3:d7263b5155bf 2686 XBee用 UART出力API
bokunimowakaru 3:d7263b5155bf 2687 byte xbee_putch( const char c );
bokunimowakaru 3:d7263b5155bf 2688 byte xbee_putstr( const char *s );
bokunimowakaru 3:d7263b5155bf 2689 void xbee_disp_hex( const unsigned char i );
bokunimowakaru 3:d7263b5155bf 2690 void xbee_disp_1( const unsigned int x );
bokunimowakaru 3:d7263b5155bf 2691 void xbee_disp_2( unsigned int x );
bokunimowakaru 3:d7263b5155bf 2692 void xbee_disp_3(unsigned int x);
bokunimowakaru 3:d7263b5155bf 2693 void xbee_disp_5(unsigned int x);
bokunimowakaru 3:d7263b5155bf 2694 void xbee_log( const byte level, const char *err , const byte x );
bokunimowakaru 3:d7263b5155bf 2695 ***********************************************************************/
bokunimowakaru 3:d7263b5155bf 2696
bokunimowakaru 3:d7263b5155bf 2697 #ifndef LITE // BeeBee Lite by 蘭
bokunimowakaru 3:d7263b5155bf 2698 byte xbee_putch( const char c ){
bokunimowakaru 3:d7263b5155bf 2699 byte data[2];
bokunimowakaru 3:d7263b5155bf 2700 byte len;
bokunimowakaru 3:d7263b5155bf 2701 data[0] = (byte)c;
bokunimowakaru 3:d7263b5155bf 2702 if( xbee_at_tx( "TX", data , 1) == 0 ) len=0; else len=1;
bokunimowakaru 3:d7263b5155bf 2703 return( len );
bokunimowakaru 3:d7263b5155bf 2704 }
bokunimowakaru 3:d7263b5155bf 2705 #endif
bokunimowakaru 3:d7263b5155bf 2706
bokunimowakaru 3:d7263b5155bf 2707 byte xbee_putstr( const char *s ){
bokunimowakaru 3:d7263b5155bf 2708 /*
bokunimowakaru 3:d7263b5155bf 2709 文字を送信する
bokunimowakaru 3:d7263b5155bf 2710 入力:char *s
bokunimowakaru 3:d7263b5155bf 2711 出力:送信データ長を応答。0の場合は異常
bokunimowakaru 3:d7263b5155bf 2712 */
bokunimowakaru 3:d7263b5155bf 2713 byte data[API_TXSIZE-17]; // 17バイトはAPIヘッダ+CRC1バイトなのでデータ長は[API_TXSIZE-18]+null文字で+1する-17
bokunimowakaru 3:d7263b5155bf 2714 byte i;
bokunimowakaru 3:d7263b5155bf 2715
bokunimowakaru 3:d7263b5155bf 2716 for(i=0; (i< (API_TXSIZE-18) ) && (s[i] != 0x00) ; i++){ // データ長はAPI_TXSIZE-18
bokunimowakaru 3:d7263b5155bf 2717 data[i] = (byte)s[i]; // テキストデータをバイナリデータ(バイト値)に変換する
bokunimowakaru 3:d7263b5155bf 2718 }
bokunimowakaru 3:d7263b5155bf 2719 data[i] = 0x00;
bokunimowakaru 3:d7263b5155bf 2720 if( xbee_at_tx( "TX", data , i) == 0) i=0;
bokunimowakaru 3:d7263b5155bf 2721 return( i );
bokunimowakaru 3:d7263b5155bf 2722 }
bokunimowakaru 3:d7263b5155bf 2723
bokunimowakaru 3:d7263b5155bf 2724 #ifndef LITE // BeeBee Lite by 蘭
bokunimowakaru 3:d7263b5155bf 2725 void xbee_disp_hex( const byte i ){
bokunimowakaru 3:d7263b5155bf 2726 byte data[3];
bokunimowakaru 3:d7263b5155bf 2727 data[0] = i&0xF0;
bokunimowakaru 3:d7263b5155bf 2728 data[0] = data[0]>>4;
bokunimowakaru 3:d7263b5155bf 2729 data[0] += '0';
bokunimowakaru 3:d7263b5155bf 2730 if (data[0]>'9') data[0] += 7;
bokunimowakaru 3:d7263b5155bf 2731 data[1]=(i&0x0F)+'0';
bokunimowakaru 3:d7263b5155bf 2732 if (data[1]>'9') data[1]+=7;
bokunimowakaru 3:d7263b5155bf 2733 xbee_at_tx( "TX", data , 2);
bokunimowakaru 3:d7263b5155bf 2734 }
bokunimowakaru 3:d7263b5155bf 2735
bokunimowakaru 3:d7263b5155bf 2736 void xbee_disp_1( const unsigned int x ){
bokunimowakaru 3:d7263b5155bf 2737 if (x<10) xbee_putch((char)(x+0x30));
bokunimowakaru 3:d7263b5155bf 2738 else if (x<16) xbee_putch((char)(x-10+'A'));
bokunimowakaru 3:d7263b5155bf 2739 else xbee_putch('X');
bokunimowakaru 3:d7263b5155bf 2740 }
bokunimowakaru 3:d7263b5155bf 2741
bokunimowakaru 3:d7263b5155bf 2742 void xbee_disp_2( unsigned int x ){
bokunimowakaru 3:d7263b5155bf 2743 char s[3];
bokunimowakaru 3:d7263b5155bf 2744 unsigned int y;
bokunimowakaru 3:d7263b5155bf 2745 if (x<100){
bokunimowakaru 3:d7263b5155bf 2746 y=x/10; s[0]=(char)(y+0x30); x-=(y*10);
bokunimowakaru 3:d7263b5155bf 2747 s[1]=(char)(x+0x30);
bokunimowakaru 3:d7263b5155bf 2748 s[2]='\0';
bokunimowakaru 3:d7263b5155bf 2749 if( s[0]=='0' ){
bokunimowakaru 3:d7263b5155bf 2750 s[0]=' ';
bokunimowakaru 3:d7263b5155bf 2751 }
bokunimowakaru 3:d7263b5155bf 2752 xbee_putstr( s );
bokunimowakaru 3:d7263b5155bf 2753 }else xbee_putstr("XX");
bokunimowakaru 3:d7263b5155bf 2754 }
bokunimowakaru 3:d7263b5155bf 2755
bokunimowakaru 3:d7263b5155bf 2756 void xbee_disp_3(unsigned int x){
bokunimowakaru 3:d7263b5155bf 2757 char s[4];
bokunimowakaru 3:d7263b5155bf 2758 unsigned int y;
bokunimowakaru 3:d7263b5155bf 2759 if (x<1000){
bokunimowakaru 3:d7263b5155bf 2760 y=x/100; s[0]=(char)(y+0x30); x-=(y*100);
bokunimowakaru 3:d7263b5155bf 2761 y=x/10; s[1]=(char)(y+0x30); x-= (y*10);
bokunimowakaru 3:d7263b5155bf 2762 s[2]=(char)(x+0x30);
bokunimowakaru 3:d7263b5155bf 2763 s[3]='\0';
bokunimowakaru 3:d7263b5155bf 2764 if( s[0]=='0' ){
bokunimowakaru 3:d7263b5155bf 2765 s[0]=' ';
bokunimowakaru 3:d7263b5155bf 2766 if( s[1]=='0' ){
bokunimowakaru 3:d7263b5155bf 2767 s[1]=' ';
bokunimowakaru 3:d7263b5155bf 2768 }
bokunimowakaru 3:d7263b5155bf 2769 }
bokunimowakaru 3:d7263b5155bf 2770 xbee_putstr( s );
bokunimowakaru 3:d7263b5155bf 2771 }else xbee_putstr("XXX");
bokunimowakaru 3:d7263b5155bf 2772 }
bokunimowakaru 3:d7263b5155bf 2773
bokunimowakaru 3:d7263b5155bf 2774 void xbee_disp_5(unsigned int x){
bokunimowakaru 3:d7263b5155bf 2775 char s[6];
bokunimowakaru 3:d7263b5155bf 2776 unsigned int y;
bokunimowakaru 3:d7263b5155bf 2777 if (x<=65535){
bokunimowakaru 3:d7263b5155bf 2778 y=x/10000; s[0]=(char)(y+0x30); x-=(y*10000);
bokunimowakaru 3:d7263b5155bf 2779 y=x/1000; s[1]=(char)(y+0x30); x-= (y*1000);
bokunimowakaru 3:d7263b5155bf 2780 y=x/100; s[2]=(char)(y+0x30); x-= (y*100);
bokunimowakaru 3:d7263b5155bf 2781 y=x/10; s[3]=(char)(y+0x30); x-= (y*10);
bokunimowakaru 3:d7263b5155bf 2782 s[4]=(char)(x+0x30);
bokunimowakaru 3:d7263b5155bf 2783 s[5]='\0';
bokunimowakaru 3:d7263b5155bf 2784 if( s[0]=='0' ){
bokunimowakaru 3:d7263b5155bf 2785 s[0]=' ';
bokunimowakaru 3:d7263b5155bf 2786 if( s[1]=='0' ){
bokunimowakaru 3:d7263b5155bf 2787 s[1]=' ';
bokunimowakaru 3:d7263b5155bf 2788 if( s[2]=='0' ){
bokunimowakaru 3:d7263b5155bf 2789 s[2]=' ';
bokunimowakaru 3:d7263b5155bf 2790 if( s[3]=='0' ){
bokunimowakaru 3:d7263b5155bf 2791 s[3]=' ';
bokunimowakaru 3:d7263b5155bf 2792 }
bokunimowakaru 3:d7263b5155bf 2793 }
bokunimowakaru 3:d7263b5155bf 2794 }
bokunimowakaru 3:d7263b5155bf 2795 }
bokunimowakaru 3:d7263b5155bf 2796 xbee_putstr( s );
bokunimowakaru 3:d7263b5155bf 2797 }else xbee_putstr("XXXXX");
bokunimowakaru 3:d7263b5155bf 2798 }
bokunimowakaru 3:d7263b5155bf 2799 #endif // LITE
bokunimowakaru 3:d7263b5155bf 2800
bokunimowakaru 3:d7263b5155bf 2801 void xbee_log(const byte level, const char *err, const byte x ){
bokunimowakaru 3:d7263b5155bf 2802 /*
bokunimowakaru 3:d7263b5155bf 2803 エラーログ用レベルガイド
bokunimowakaru 3:d7263b5155bf 2804 LEVEL 5 ERROR 致命的なエラー、バグ発生
bokunimowakaru 3:d7263b5155bf 2805 LEVEL 4 ERR 通信エラー等のうち不具合動作を伴う懸念のあるもの。500ms待ち挿入
bokunimowakaru 3:d7263b5155bf 2806 LEVEL 3 CAUTION 通信エラー、使い方の問題など
bokunimowakaru 3:d7263b5155bf 2807 LEVEL 2 未定義
bokunimowakaru 3:d7263b5155bf 2808 LEVEL 1 LOG 各関数の動作確認用
bokunimowakaru 3:d7263b5155bf 2809 */
bokunimowakaru 3:d7263b5155bf 2810 #ifdef ERRLOG
bokunimowakaru 3:d7263b5155bf 2811 /* PCの場合 */
bokunimowakaru 3:d7263b5155bf 2812 #ifndef ARDUINO
bokunimowakaru 3:d7263b5155bf 2813 #ifndef H3694
bokunimowakaru 3:d7263b5155bf 2814 #ifdef XBEE_ERROR_TIME
bokunimowakaru 3:d7263b5155bf 2815 time_t error_time;
bokunimowakaru 3:d7263b5155bf 2816 struct tm *error_time_st;
bokunimowakaru 3:d7263b5155bf 2817
bokunimowakaru 3:d7263b5155bf 2818 time(&error_time);
bokunimowakaru 3:d7263b5155bf 2819 error_time_st = localtime(&error_time);
bokunimowakaru 3:d7263b5155bf 2820 #endif
bokunimowakaru 3:d7263b5155bf 2821 #endif
bokunimowakaru 3:d7263b5155bf 2822 #endif
bokunimowakaru 3:d7263b5155bf 2823
bokunimowakaru 3:d7263b5155bf 2824 #ifdef DEBUG
bokunimowakaru 3:d7263b5155bf 2825 if( level >= 1 ){
bokunimowakaru 3:d7263b5155bf 2826 #else
bokunimowakaru 3:d7263b5155bf 2827 if( level >= 3 ){
bokunimowakaru 3:d7263b5155bf 2828 #endif
bokunimowakaru 3:d7263b5155bf 2829 /* マイコンの場合 */
bokunimowakaru 3:d7263b5155bf 2830 #ifdef ARDUINO
bokunimowakaru 3:d7263b5155bf 2831 lcd_goto(LCD_ROW_4);
bokunimowakaru 3:d7263b5155bf 2832 lcd_putch('[');
bokunimowakaru 3:d7263b5155bf 2833 lcd_disp_hex( TIMER_SEC );
bokunimowakaru 3:d7263b5155bf 2834 lcd_putch(':');
bokunimowakaru 3:d7263b5155bf 2835 lcd_disp_hex( timera() );
bokunimowakaru 3:d7263b5155bf 2836 lcd_putch(']');
bokunimowakaru 3:d7263b5155bf 2837 lcd_putstr( err );
bokunimowakaru 3:d7263b5155bf 2838 lcd_putch('(');
bokunimowakaru 3:d7263b5155bf 2839 lcd_disp_hex( x );
bokunimowakaru 3:d7263b5155bf 2840 lcd_putch(')');
bokunimowakaru 3:d7263b5155bf 2841 #endif
bokunimowakaru 3:d7263b5155bf 2842 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 2843 lcd_goto(LCD_ROW_4);
bokunimowakaru 3:d7263b5155bf 2844 lcd_putch('[');
bokunimowakaru 3:d7263b5155bf 2845 lcd_disp_hex( TIMER_SEC );
bokunimowakaru 3:d7263b5155bf 2846 lcd_putch(':');
bokunimowakaru 3:d7263b5155bf 2847 lcd_disp_hex( timera() );
bokunimowakaru 3:d7263b5155bf 2848 lcd_putch(']');
bokunimowakaru 3:d7263b5155bf 2849 lcd_putstr( err );
bokunimowakaru 3:d7263b5155bf 2850 lcd_putch('(');
bokunimowakaru 3:d7263b5155bf 2851 lcd_disp_hex( x );
bokunimowakaru 3:d7263b5155bf 2852 lcd_putch(')');
bokunimowakaru 3:d7263b5155bf 2853 #endif
bokunimowakaru 3:d7263b5155bf 2854 #ifdef ARM_MBED
bokunimowakaru 3:d7263b5155bf 2855 lcd_goto(LCD_ROW_4);
bokunimowakaru 3:d7263b5155bf 2856 lcd_putch('[');
bokunimowakaru 3:d7263b5155bf 2857 lcd_disp_hex( TIMER_SEC );
bokunimowakaru 3:d7263b5155bf 2858 lcd_putch(':');
bokunimowakaru 3:d7263b5155bf 2859 lcd_disp_hex( timera() );
bokunimowakaru 3:d7263b5155bf 2860 lcd_putch(']');
bokunimowakaru 3:d7263b5155bf 2861 lcd_putstr( err );
bokunimowakaru 3:d7263b5155bf 2862 lcd_putch('(');
bokunimowakaru 3:d7263b5155bf 2863 lcd_disp_hex( x );
bokunimowakaru 3:d7263b5155bf 2864 lcd_putch(')');
bokunimowakaru 3:d7263b5155bf 2865 lcd_putch( 0x0D ); // CR(\r)
bokunimowakaru 3:d7263b5155bf 2866 lcd_putch( 0x0A ); // LF(\n)
bokunimowakaru 3:d7263b5155bf 2867 #endif
bokunimowakaru 3:d7263b5155bf 2868
bokunimowakaru 3:d7263b5155bf 2869 /*
bokunimowakaru 3:d7263b5155bf 2870 lcd_putch( 0x0D ); // CR(\r)
bokunimowakaru 3:d7263b5155bf 2871 lcd_putch( 0x0A ); // LF(\n)
bokunimowakaru 3:d7263b5155bf 2872 */
bokunimowakaru 3:d7263b5155bf 2873 /* PCの場合 */
bokunimowakaru 3:d7263b5155bf 2874 #ifndef ARDUINO
bokunimowakaru 3:d7263b5155bf 2875 #ifndef H3694
bokunimowakaru 3:d7263b5155bf 2876 #ifndef ARM_MBED
bokunimowakaru 3:d7263b5155bf 2877 #ifdef XBEE_ERROR_TIME
bokunimowakaru 3:d7263b5155bf 2878 fprintf(stderr,"%4d/%02d/%02d %02d:%02d:%02d[%02X:%02X]%s(%02X)\n",
bokunimowakaru 3:d7263b5155bf 2879 error_time_st->tm_year+1900,
bokunimowakaru 3:d7263b5155bf 2880 error_time_st->tm_mon+1,
bokunimowakaru 3:d7263b5155bf 2881 error_time_st->tm_mday,
bokunimowakaru 3:d7263b5155bf 2882 error_time_st->tm_hour,
bokunimowakaru 3:d7263b5155bf 2883 error_time_st->tm_min,
bokunimowakaru 3:d7263b5155bf 2884 error_time_st->tm_sec,
bokunimowakaru 3:d7263b5155bf 2885 TIMER_SEC,
bokunimowakaru 3:d7263b5155bf 2886 timera(),
bokunimowakaru 3:d7263b5155bf 2887 err,
bokunimowakaru 3:d7263b5155bf 2888 x);
bokunimowakaru 3:d7263b5155bf 2889 #else
bokunimowakaru 3:d7263b5155bf 2890 fprintf(stderr,"[%02X:%02X]%s(%02X)\n",
bokunimowakaru 3:d7263b5155bf 2891 TIMER_SEC,
bokunimowakaru 3:d7263b5155bf 2892 timera(),
bokunimowakaru 3:d7263b5155bf 2893 err,
bokunimowakaru 3:d7263b5155bf 2894 x);
bokunimowakaru 3:d7263b5155bf 2895 #endif
bokunimowakaru 3:d7263b5155bf 2896 #endif
bokunimowakaru 3:d7263b5155bf 2897 #endif
bokunimowakaru 3:d7263b5155bf 2898 #endif
bokunimowakaru 3:d7263b5155bf 2899 }
bokunimowakaru 3:d7263b5155bf 2900 if( level > 3 ) wait_millisec( 500 ); // LEVEL 4以上に対して待ち時間を設定
bokunimowakaru 3:d7263b5155bf 2901 #endif
bokunimowakaru 3:d7263b5155bf 2902 }
bokunimowakaru 3:d7263b5155bf 2903
bokunimowakaru 3:d7263b5155bf 2904 /***********************************************************************
bokunimowakaru 3:d7263b5155bf 2905 アプリ向け提供関数
bokunimowakaru 3:d7263b5155bf 2906 XBee用 各種制御 入出力定義を変更した場合は履歴に記載します
bokunimowakaru 3:d7263b5155bf 2907 ***********************************************************************/
bokunimowakaru 3:d7263b5155bf 2908
bokunimowakaru 3:d7263b5155bf 2909 byte xbee_reset( void ){
bokunimowakaru 3:d7263b5155bf 2910 /* XBeeモジュールのリセット
bokunimowakaru 3:d7263b5155bf 2911 戻り値:0=エラー、強制終了あり(PC版)、無限定しあり(H8版)
bokunimowakaru 3:d7263b5155bf 2912 */
bokunimowakaru 3:d7263b5155bf 2913 #ifndef LITE // BeeBee Lite by 蘭
bokunimowakaru 3:d7263b5155bf 2914 byte i;
bokunimowakaru 3:d7263b5155bf 2915 #endif
bokunimowakaru 3:d7263b5155bf 2916 byte ret=0; // 戻り値 0:異常終了
bokunimowakaru 3:d7263b5155bf 2917 #ifndef XBEE_WIFI // ZigBee
bokunimowakaru 3:d7263b5155bf 2918 byte value[API_SIZE];
bokunimowakaru 3:d7263b5155bf 2919 value[0] = 0x00;
bokunimowakaru 3:d7263b5155bf 2920 #endif
bokunimowakaru 3:d7263b5155bf 2921
bokunimowakaru 3:d7263b5155bf 2922 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 2923 #ifndef LITE // BeeBee Lite by 蘭
bokunimowakaru 3:d7263b5155bf 2924 sci_write_check();
bokunimowakaru 3:d7263b5155bf 2925 #endif
bokunimowakaru 3:d7263b5155bf 2926 sci_clear(); // シリアル異常をクリア
bokunimowakaru 3:d7263b5155bf 2927 DEVICE_TYPE = 0x20; // タイプ名を初期化
bokunimowakaru 3:d7263b5155bf 2928 #endif
bokunimowakaru 3:d7263b5155bf 2929
bokunimowakaru 3:d7263b5155bf 2930 #ifdef LITE // BeeBee Lite by 蘭
bokunimowakaru 3:d7263b5155bf 2931 ret = xbee_tx_rx( "ATVR", value ,0 ); // ZigBee 種類の取得
bokunimowakaru 3:d7263b5155bf 2932 if( ret == 0 ){
bokunimowakaru 3:d7263b5155bf 2933 #ifdef ARDUINO
bokunimowakaru 3:d7263b5155bf 2934 return(0);
bokunimowakaru 3:d7263b5155bf 2935 #else
bokunimowakaru 3:d7263b5155bf 2936 exit(-1);
bokunimowakaru 3:d7263b5155bf 2937 #endif
bokunimowakaru 3:d7263b5155bf 2938 }else{
bokunimowakaru 3:d7263b5155bf 2939 DEVICE_TYPE = value[8];
bokunimowakaru 3:d7263b5155bf 2940 } // LITEはリセットしない
bokunimowakaru 3:d7263b5155bf 2941 #else // normal
bokunimowakaru 3:d7263b5155bf 2942 wait_millisec(100);
bokunimowakaru 3:d7263b5155bf 2943 for( i=1 ; i< 4 ; i++){
bokunimowakaru 3:d7263b5155bf 2944 #ifndef XBEE_WIFI // ZigBee
bokunimowakaru 3:d7263b5155bf 2945 ret = xbee_tx_rx( "ATVR", value ,0 );
bokunimowakaru 3:d7263b5155bf 2946 #else
bokunimowakaru 3:d7263b5155bf 2947 ret = 1;
bokunimowakaru 3:d7263b5155bf 2948 #endif
bokunimowakaru 3:d7263b5155bf 2949 if( ret > 0){
bokunimowakaru 3:d7263b5155bf 2950 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 2951 DEVICE_TYPE = value[8];
bokunimowakaru 3:d7263b5155bf 2952 if( DEVICE_TYPE != ZB_TYPE_COORD &&
bokunimowakaru 3:d7263b5155bf 2953 DEVICE_TYPE != ZB_TYPE_ROUTER &&
bokunimowakaru 3:d7263b5155bf 2954 DEVICE_TYPE != ZB_TYPE_ENDDEV){ // VRの確認
bokunimowakaru 3:d7263b5155bf 2955 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 2956 lcd_cls();
bokunimowakaru 3:d7263b5155bf 2957 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 2958 led_red( 1 );
bokunimowakaru 3:d7263b5155bf 2959 #endif
bokunimowakaru 3:d7263b5155bf 2960 lcd_putstr( "EXIT:XBEE NOT IN API MODE" );
bokunimowakaru 3:d7263b5155bf 2961 #endif
bokunimowakaru 3:d7263b5155bf 2962 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 2963 return(0);
bokunimowakaru 3:d7263b5155bf 2964 #elif ARDUINO
bokunimowakaru 3:d7263b5155bf 2965 return(0);
bokunimowakaru 3:d7263b5155bf 2966 #else
bokunimowakaru 3:d7263b5155bf 2967 exit(-1);
bokunimowakaru 3:d7263b5155bf 2968 #endif
bokunimowakaru 3:d7263b5155bf 2969 }
bokunimowakaru 3:d7263b5155bf 2970 #else // XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 2971 DEVICE_TYPE = XB_TYPE_NULL;
bokunimowakaru 3:d7263b5155bf 2972 #endif
bokunimowakaru 3:d7263b5155bf 2973 }else{
bokunimowakaru 3:d7263b5155bf 2974 if( i == 3 ){
bokunimowakaru 3:d7263b5155bf 2975 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 2976 lcd_cls();
bokunimowakaru 3:d7263b5155bf 2977 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 2978 led_red( 1 );
bokunimowakaru 3:d7263b5155bf 2979 #endif
bokunimowakaru 3:d7263b5155bf 2980 lcd_putstr( "EXIT:NO RESPONCE FROM XBEE" );
bokunimowakaru 3:d7263b5155bf 2981 #endif
bokunimowakaru 3:d7263b5155bf 2982 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 2983 return(0);
bokunimowakaru 3:d7263b5155bf 2984 #elif ARDUINO
bokunimowakaru 3:d7263b5155bf 2985 return(0);
bokunimowakaru 3:d7263b5155bf 2986 #else
bokunimowakaru 3:d7263b5155bf 2987 exit(-1);
bokunimowakaru 3:d7263b5155bf 2988 #endif
bokunimowakaru 3:d7263b5155bf 2989 }
bokunimowakaru 3:d7263b5155bf 2990 wait_millisec(1000);
bokunimowakaru 3:d7263b5155bf 2991 }
bokunimowakaru 3:d7263b5155bf 2992 }
bokunimowakaru 3:d7263b5155bf 2993 #ifndef XBEE_WIFI // ZigBee
bokunimowakaru 3:d7263b5155bf 2994 wait_millisec(100);
bokunimowakaru 3:d7263b5155bf 2995 ret = xbee_tx_rx( "ATFR", value ,0 );
bokunimowakaru 3:d7263b5155bf 2996 if( ret == 0){
bokunimowakaru 3:d7263b5155bf 2997 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 2998 lcd_cls();
bokunimowakaru 3:d7263b5155bf 2999 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 3000 led_red( 1 );
bokunimowakaru 3:d7263b5155bf 3001 #endif
bokunimowakaru 3:d7263b5155bf 3002 lcd_putstr( "EXIT:CANNOT RESET XBEE" );
bokunimowakaru 3:d7263b5155bf 3003 #endif
bokunimowakaru 3:d7263b5155bf 3004 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 3005 return(0);
bokunimowakaru 3:d7263b5155bf 3006 #elif ARDUINO
bokunimowakaru 3:d7263b5155bf 3007 return(0);
bokunimowakaru 3:d7263b5155bf 3008 #else
bokunimowakaru 3:d7263b5155bf 3009 exit(-1);
bokunimowakaru 3:d7263b5155bf 3010 #endif
bokunimowakaru 3:d7263b5155bf 3011 }
bokunimowakaru 3:d7263b5155bf 3012 wait_millisec(3000); // リセット指示後3秒後に起動
bokunimowakaru 3:d7263b5155bf 3013 sci_clear(); // 再起動のメッセージをクリア
bokunimowakaru 3:d7263b5155bf 3014 // while( xbee_at_rx( value ) == 0 ); // パケットの破棄(永久ループの懸念がある)
bokunimowakaru 3:d7263b5155bf 3015 value[0] = 0x01; // API MODE=1に設定
bokunimowakaru 3:d7263b5155bf 3016 xbee_tx_rx("ATAP", value , 1 );
bokunimowakaru 3:d7263b5155bf 3017 value[0] = 0x05; // RSSI LEDを点灯
bokunimowakaru 3:d7263b5155bf 3018 xbee_tx_rx("ATP0", value , 1 );
bokunimowakaru 3:d7263b5155bf 3019 wait_millisec(500);
bokunimowakaru 3:d7263b5155bf 3020 value[0] = 0x01; // RSSI LEDを受信強度に戻す
bokunimowakaru 3:d7263b5155bf 3021 xbee_tx_rx("ATP0", value , 1 );
bokunimowakaru 3:d7263b5155bf 3022 #endif
bokunimowakaru 3:d7263b5155bf 3023 #endif // LITE
bokunimowakaru 3:d7263b5155bf 3024 return( ret );
bokunimowakaru 3:d7263b5155bf 3025 }
bokunimowakaru 3:d7263b5155bf 3026
bokunimowakaru 3:d7263b5155bf 3027 byte xbee_myaddress( byte *address ){
bokunimowakaru 3:d7263b5155bf 3028 /*
bokunimowakaru 3:d7263b5155bf 3029 自分自身のIEEEアドレスを取得する / XBee Wifi(PC)の場合は設定する
bokunimowakaru 3:d7263b5155bf 3030 byte *address : IEEEアドレスを代入する
bokunimowakaru 3:d7263b5155bf 3031 戻り値=1で正常読み込み、2は書き込み。0は異常
bokunimowakaru 3:d7263b5155bf 3032 */
bokunimowakaru 3:d7263b5155bf 3033 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 3034 byte data[API_SIZE];
bokunimowakaru 3:d7263b5155bf 3035 byte i=0;
bokunimowakaru 3:d7263b5155bf 3036 byte ret=0;
bokunimowakaru 3:d7263b5155bf 3037
bokunimowakaru 3:d7263b5155bf 3038 data[0]=0x00;
bokunimowakaru 3:d7263b5155bf 3039 /* ショートアドレスの取得はしないことにする。(Coordinatorは常に00)
bokunimowakaru 3:d7263b5155bf 3040 if( xbee_tx_rx( "ATMY",data,0) ){
bokunimowakaru 3:d7263b5155bf 3041 for(i=0;i<2;i++){
bokunimowakaru 3:d7263b5155bf 3042 SADR_MY[i]=data[8+i];
bokunimowakaru 3:d7263b5155bf 3043 }
bokunimowakaru 3:d7263b5155bf 3044 }
bokunimowakaru 3:d7263b5155bf 3045 */
bokunimowakaru 3:d7263b5155bf 3046 data[0]=0x00;
bokunimowakaru 3:d7263b5155bf 3047 if( xbee_tx_rx( "ATSH",data,0) ){
bokunimowakaru 3:d7263b5155bf 3048 for(i=0;i<4;i++){
bokunimowakaru 3:d7263b5155bf 3049 address[i]=data[8+i];
bokunimowakaru 3:d7263b5155bf 3050 }
bokunimowakaru 3:d7263b5155bf 3051 data[0]=0x00;
bokunimowakaru 3:d7263b5155bf 3052 if( xbee_tx_rx( "ATSL",data,0) ){
bokunimowakaru 3:d7263b5155bf 3053 for(i=0;i<4;i++){
bokunimowakaru 3:d7263b5155bf 3054 address[4+i]=data[8+i];
bokunimowakaru 3:d7263b5155bf 3055 }
bokunimowakaru 3:d7263b5155bf 3056 ret=1;
bokunimowakaru 3:d7263b5155bf 3057 }
bokunimowakaru 3:d7263b5155bf 3058 }
bokunimowakaru 3:d7263b5155bf 3059 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3060 if( ret==0 ) xbee_log( 5, "ERROR: at at_my" , 0 );
bokunimowakaru 3:d7263b5155bf 3061 xbee_log( 1, "done:xbee_myaddress" , ret );
bokunimowakaru 3:d7263b5155bf 3062 #endif
bokunimowakaru 3:d7263b5155bf 3063 return( ret );
bokunimowakaru 3:d7263b5155bf 3064 #else // XBEE_WIFI /******* ADR_MYに登録されているIPアドレスを設定する **********/
bokunimowakaru 3:d7263b5155bf 3065 #ifdef ARDUINO
bokunimowakaru 3:d7263b5155bf 3066 byte i=0;
bokunimowakaru 3:d7263b5155bf 3067 IPAddress ip = Ethernet.localIP();
bokunimowakaru 3:d7263b5155bf 3068 for(i=0;i<4;i++) ADR_MY[i] = ip[i];
bokunimowakaru 3:d7263b5155bf 3069 for(i=0;i<4;i++) address[i] = ADR_MY[i];
bokunimowakaru 3:d7263b5155bf 3070 return( 1 );
bokunimowakaru 3:d7263b5155bf 3071 #else // PC
bokunimowakaru 3:d7263b5155bf 3072 byte i;
bokunimowakaru 3:d7263b5155bf 3073 byte ret=2;
bokunimowakaru 3:d7263b5155bf 3074 for(i=0;i<4;i++) if( ADR_MY[i] != 0xFF ) ret=1;
bokunimowakaru 3:d7263b5155bf 3075 if(ret==1) for(i=0;i<4;i++) address[i]=ADR_MY[i]; // ADR_MYが設定されているときは読み込む
bokunimowakaru 3:d7263b5155bf 3076 else for(i=0;i<4;i++) ADR_MY[i]=address[i]; // ADR_MYが全てFFの時は入力addressを設定する。
bokunimowakaru 3:d7263b5155bf 3077 #ifdef DEBUG
bokunimowakaru 3:d7263b5155bf 3078 printf("ADR_MY=");
bokunimowakaru 3:d7263b5155bf 3079 for(i=0;i<4;i++) printf("%d.",(int)ADR_MY[i]);
bokunimowakaru 3:d7263b5155bf 3080 printf("\b\n");
bokunimowakaru 3:d7263b5155bf 3081 #endif
bokunimowakaru 3:d7263b5155bf 3082 return( ret );
bokunimowakaru 3:d7263b5155bf 3083 #endif
bokunimowakaru 3:d7263b5155bf 3084 #endif
bokunimowakaru 3:d7263b5155bf 3085 }
bokunimowakaru 3:d7263b5155bf 3086
bokunimowakaru 3:d7263b5155bf 3087 void xbee_address(const byte *address){
bokunimowakaru 3:d7263b5155bf 3088 /*
bokunimowakaru 3:d7263b5155bf 3089 送信用の宛先アドレス設定用の関数
bokunimowakaru 3:d7263b5155bf 3090 入力:byte *address = 宛先(子機)アドレス
bokunimowakaru 3:d7263b5155bf 3091 */
bokunimowakaru 3:d7263b5155bf 3092 byte i;
bokunimowakaru 3:d7263b5155bf 3093
bokunimowakaru 3:d7263b5155bf 3094 #ifndef XBEE_WIFI // XBee ZB用
bokunimowakaru 3:d7263b5155bf 3095 for(i=0; i< 8 ;i++ ) ADR_DEST[i] = address[i];
bokunimowakaru 3:d7263b5155bf 3096 #ifndef ARDUINO
bokunimowakaru 3:d7263b5155bf 3097 #ifndef ARM_MBED
bokunimowakaru 3:d7263b5155bf 3098 SADR_DEST[0] = 0xFF;
bokunimowakaru 3:d7263b5155bf 3099 SADR_DEST[1] = 0xFE;
bokunimowakaru 3:d7263b5155bf 3100 #endif
bokunimowakaru 3:d7263b5155bf 3101 #endif
bokunimowakaru 3:d7263b5155bf 3102 #else // XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 3103 #ifdef ARDUINO
bokunimowakaru 3:d7263b5155bf 3104 for( i=0;i<4;i++) ADR_DEST[i] = address[i];
bokunimowakaru 3:d7263b5155bf 3105 #else
bokunimowakaru 3:d7263b5155bf 3106 if( bytecmp(ADR_DEST,address,4) != 0 ){
bokunimowakaru 3:d7263b5155bf 3107 close_serial_port_tx();
bokunimowakaru 3:d7263b5155bf 3108 open_serial_port_tx( address );
bokunimowakaru 3:d7263b5155bf 3109 for( i=0;i<4;i++) ADR_DEST[i] = address[i];
bokunimowakaru 3:d7263b5155bf 3110 }else{
bokunimowakaru 3:d7263b5155bf 3111 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3112 xbee_log( 2, "same address" , address[7] );
bokunimowakaru 3:d7263b5155bf 3113 #endif
bokunimowakaru 3:d7263b5155bf 3114 }
bokunimowakaru 3:d7263b5155bf 3115 #endif
bokunimowakaru 3:d7263b5155bf 3116 #endif
bokunimowakaru 3:d7263b5155bf 3117
bokunimowakaru 3:d7263b5155bf 3118 #ifdef DEBUG
bokunimowakaru 3:d7263b5155bf 3119 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 3120 lcd_cls(); lcd_goto(LCD_ROW_1); lcd_putstr("DEST=");
bokunimowakaru 3:d7263b5155bf 3121 for(i=4;i<8;i++){ lcd_disp_hex( ADR_DEST[i] ); lcd_putstr(" "); }
bokunimowakaru 3:d7263b5155bf 3122 #else // XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 3123 printf("DEST=");
bokunimowakaru 3:d7263b5155bf 3124 for(i=0;i<4;i++) printf("%d.",(int)ADR_DEST[i]);
bokunimowakaru 3:d7263b5155bf 3125 printf("\b\n");
bokunimowakaru 3:d7263b5155bf 3126 #endif
bokunimowakaru 3:d7263b5155bf 3127 #endif
bokunimowakaru 3:d7263b5155bf 3128 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3129 xbee_log( 1, "done:xbee_address" , address[7] );
bokunimowakaru 3:d7263b5155bf 3130 #endif
bokunimowakaru 3:d7263b5155bf 3131 }
bokunimowakaru 3:d7263b5155bf 3132
bokunimowakaru 3:d7263b5155bf 3133 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 3134 #ifndef ARDUINO
bokunimowakaru 3:d7263b5155bf 3135 #ifndef ARM_MBED
bokunimowakaru 3:d7263b5155bf 3136 void xbee_short_address(const byte *address){
bokunimowakaru 3:d7263b5155bf 3137 SADR_DEST[0] = address[0];
bokunimowakaru 3:d7263b5155bf 3138 SADR_DEST[1] = address[1];
bokunimowakaru 3:d7263b5155bf 3139 }
bokunimowakaru 3:d7263b5155bf 3140 #endif
bokunimowakaru 3:d7263b5155bf 3141 #endif
bokunimowakaru 3:d7263b5155bf 3142 #endif
bokunimowakaru 3:d7263b5155bf 3143
bokunimowakaru 3:d7263b5155bf 3144 byte xbee_atd( const byte *address ){
bokunimowakaru 3:d7263b5155bf 3145 /*
bokunimowakaru 3:d7263b5155bf 3146 送信用の宛先アドレス設定用の関数 XBeeへの設定
bokunimowakaru 3:d7263b5155bf 3147 入力:byte *address = 宛先(子機)アドレス
bokunimowakaru 3:d7263b5155bf 3148 戻り値:戻り値=1で正常、0は異常
bokunimowakaru 3:d7263b5155bf 3149 */
bokunimowakaru 3:d7263b5155bf 3150 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 3151 byte data[API_SIZE];
bokunimowakaru 3:d7263b5155bf 3152 byte i;
bokunimowakaru 3:d7263b5155bf 3153 byte ret=0;
bokunimowakaru 3:d7263b5155bf 3154
bokunimowakaru 3:d7263b5155bf 3155 for(i=0;i<4;i++)data[i]=address[i];
bokunimowakaru 3:d7263b5155bf 3156 if( xbee_tx_rx( "ATDH",data,4) ){
bokunimowakaru 3:d7263b5155bf 3157 for(i=0;i<4;i++)data[i]=address[i+4];
bokunimowakaru 3:d7263b5155bf 3158 if( xbee_tx_rx( "ATDL",data,4) ){
bokunimowakaru 3:d7263b5155bf 3159 ret=1;
bokunimowakaru 3:d7263b5155bf 3160 }
bokunimowakaru 3:d7263b5155bf 3161 }
bokunimowakaru 3:d7263b5155bf 3162 return( ret );
bokunimowakaru 3:d7263b5155bf 3163 #else // XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 3164 return( 0 );
bokunimowakaru 3:d7263b5155bf 3165 #endif
bokunimowakaru 3:d7263b5155bf 3166 }
bokunimowakaru 3:d7263b5155bf 3167
bokunimowakaru 3:d7263b5155bf 3168 byte xbee_ratd(const byte *dev_address, const byte *set_address ){
bokunimowakaru 3:d7263b5155bf 3169 /*
bokunimowakaru 3:d7263b5155bf 3170 指定したアドレスのXBee子機に任意のアドレスを(宛先として)設定する
bokunimowakaru 3:d7263b5155bf 3171 byte *dev_address : 設定先のXBeeデバイスのアドレス
bokunimowakaru 3:d7263b5155bf 3172 byte *set_address : 設定するアドレス
bokunimowakaru 3:d7263b5155bf 3173 戻り値=XBeeデバイス名。0xFFは異常
bokunimowakaru 3:d7263b5155bf 3174 */
bokunimowakaru 3:d7263b5155bf 3175 byte i=0;
bokunimowakaru 3:d7263b5155bf 3176 #ifdef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 3177 byte len=0;
bokunimowakaru 3:d7263b5155bf 3178 #endif
bokunimowakaru 3:d7263b5155bf 3179 byte data[API_SIZE];
bokunimowakaru 3:d7263b5155bf 3180 byte dd=0xFF; // デバイス名
bokunimowakaru 3:d7263b5155bf 3181
bokunimowakaru 3:d7263b5155bf 3182 xbee_address(dev_address); // 宛先のアドレスを設定
bokunimowakaru 3:d7263b5155bf 3183 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 3184 for( i=0;i<4;i++) data[i]=set_address[i]; // 上位4バイトをdataに代入
bokunimowakaru 3:d7263b5155bf 3185 if( xbee_tx_rx( "RATDH", data ,4 ) > 0 ){ // 上位4バイトを設定
bokunimowakaru 3:d7263b5155bf 3186 for( i=0;i<4;i++) data[i]=set_address[i+4]; // 下位4バイトをdataに代入
bokunimowakaru 3:d7263b5155bf 3187 if( xbee_tx_rx( "RATDL", data ,4 ) > 0 ){ // 下位4バイトを設定
bokunimowakaru 3:d7263b5155bf 3188 if( xbee_tx_rx( "RATDD", data ,0 ) > 0 ){ // デバイス名を取得
bokunimowakaru 3:d7263b5155bf 3189 if( data[18]==0x00 && data[19]==0x03 && data[20]==0x00 ){ // XBeeデバイス
bokunimowakaru 3:d7263b5155bf 3190 dd=data[21]; // デバイス名をddに代入
bokunimowakaru 3:d7263b5155bf 3191 }
bokunimowakaru 3:d7263b5155bf 3192 }else{
bokunimowakaru 3:d7263b5155bf 3193 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3194 xbee_log( 4, "ERR:tx_rx RATDD at ratd" , 1 );
bokunimowakaru 3:d7263b5155bf 3195 #endif
bokunimowakaru 3:d7263b5155bf 3196 }
bokunimowakaru 3:d7263b5155bf 3197 }else{
bokunimowakaru 3:d7263b5155bf 3198 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3199 xbee_log( 4, "ERR:tx_rx RATDL at ratd" , 1 );
bokunimowakaru 3:d7263b5155bf 3200 #endif
bokunimowakaru 3:d7263b5155bf 3201 }
bokunimowakaru 3:d7263b5155bf 3202 }else{
bokunimowakaru 3:d7263b5155bf 3203 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3204 xbee_log( 4, "ERR:tx_rx RATDH at ratd" , 1 );
bokunimowakaru 3:d7263b5155bf 3205 #endif
bokunimowakaru 3:d7263b5155bf 3206 }
bokunimowakaru 3:d7263b5155bf 3207 #else // XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 3208 for( i=0;i<4;i++){
bokunimowakaru 3:d7263b5155bf 3209 if(set_address[i] >= 100){
bokunimowakaru 3:d7263b5155bf 3210 data[len] = (byte)(set_address[i]/100);
bokunimowakaru 3:d7263b5155bf 3211 data[len+1] = (byte)(set_address[i]/10)-10*data[len]+(byte)'0';
bokunimowakaru 3:d7263b5155bf 3212 data[len] += (byte)'0';
bokunimowakaru 3:d7263b5155bf 3213 len += 2;
bokunimowakaru 3:d7263b5155bf 3214 }else if(set_address[i] >= 10){
bokunimowakaru 3:d7263b5155bf 3215 data[len] = (byte)(set_address[i]/10)+(byte)'0';
bokunimowakaru 3:d7263b5155bf 3216 len += 1;
bokunimowakaru 3:d7263b5155bf 3217 }
bokunimowakaru 3:d7263b5155bf 3218 data[len] = (byte)(set_address[i]%10)+(byte)'0';
bokunimowakaru 3:d7263b5155bf 3219 data[len+1] = (byte)'.'; // 最後のデータdata[len]に「.」が入るが
bokunimowakaru 3:d7263b5155bf 3220 len += 2;
bokunimowakaru 3:d7263b5155bf 3221 }
bokunimowakaru 3:d7263b5155bf 3222 len--; // 最後の「.」は送信しない。
bokunimowakaru 3:d7263b5155bf 3223 if( xbee_tx_rx( "RATDL", data ,len ) > 0 ){ // 下位4バイトを設定
bokunimowakaru 3:d7263b5155bf 3224 dd = 0x00;
bokunimowakaru 3:d7263b5155bf 3225 }else{
bokunimowakaru 3:d7263b5155bf 3226 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3227 xbee_log( 4, "ERR:tx_rx RATDL at ratd" , 1 );
bokunimowakaru 3:d7263b5155bf 3228 #endif
bokunimowakaru 3:d7263b5155bf 3229 }
bokunimowakaru 3:d7263b5155bf 3230 #endif
bokunimowakaru 3:d7263b5155bf 3231 return(dd);
bokunimowakaru 3:d7263b5155bf 3232 }
bokunimowakaru 3:d7263b5155bf 3233
bokunimowakaru 3:d7263b5155bf 3234 byte xbee_ratd_myaddress(const byte *address){
bokunimowakaru 3:d7263b5155bf 3235 /*
bokunimowakaru 3:d7263b5155bf 3236 指定したアドレスのXBee子機に本機のアドレスを(宛先として)設定する
bokunimowakaru 3:d7263b5155bf 3237 byte *address : 設定先のXBeeデバイスのアドレス
bokunimowakaru 3:d7263b5155bf 3238 戻り値=XBeeデバイス名。0xFFは異常
bokunimowakaru 3:d7263b5155bf 3239
bokunimowakaru 3:d7263b5155bf 3240 */
bokunimowakaru 3:d7263b5155bf 3241 byte i=0;
bokunimowakaru 3:d7263b5155bf 3242 #ifdef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 3243 byte len=0;
bokunimowakaru 3:d7263b5155bf 3244 #endif
bokunimowakaru 3:d7263b5155bf 3245 byte data[API_SIZE];
bokunimowakaru 3:d7263b5155bf 3246 byte adr_my[8];
bokunimowakaru 3:d7263b5155bf 3247 byte dd=0xFF; // デバイス名
bokunimowakaru 3:d7263b5155bf 3248
bokunimowakaru 3:d7263b5155bf 3249 if( xbee_myaddress(adr_my) ){ // 自分のアドレスを取得
bokunimowakaru 3:d7263b5155bf 3250 #ifdef DEBUG
bokunimowakaru 3:d7263b5155bf 3251 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 3252 #ifdef ARM_MBED
bokunimowakaru 3:d7263b5155bf 3253 _xbee_debug.printf("adr_my =");
bokunimowakaru 3:d7263b5155bf 3254 for( i=0 ; i<8 ; i++) _xbee_debug.printf("%02x ",adr_my[i]);
bokunimowakaru 3:d7263b5155bf 3255 _xbee_debug.printf("\b\n");
bokunimowakaru 3:d7263b5155bf 3256 #else // PC
bokunimowakaru 3:d7263b5155bf 3257 printf("adr_my =");
bokunimowakaru 3:d7263b5155bf 3258 for( i=0 ; i<8 ; i++) printf("%02x ",adr_my[i]);
bokunimowakaru 3:d7263b5155bf 3259 printf("\b\n");
bokunimowakaru 3:d7263b5155bf 3260 #endif
bokunimowakaru 3:d7263b5155bf 3261 #else // XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 3262 printf("adr_my =");
bokunimowakaru 3:d7263b5155bf 3263 for( i=0 ; i<4 ; i++) printf("%d.",adr_my[i]);
bokunimowakaru 3:d7263b5155bf 3264 printf("\b\n");
bokunimowakaru 3:d7263b5155bf 3265 #endif
bokunimowakaru 3:d7263b5155bf 3266 #endif
bokunimowakaru 3:d7263b5155bf 3267 xbee_address(address); // 宛先のアドレスを設定
bokunimowakaru 3:d7263b5155bf 3268 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 3269 for( i=0;i<4;i++) data[i]=adr_my[i]; // 上位4バイトをdataに代入
bokunimowakaru 3:d7263b5155bf 3270 if( xbee_tx_rx( "RATDH", data ,4 ) > 0 ){ // 上位4バイトを設定
bokunimowakaru 3:d7263b5155bf 3271 for( i=0;i<4;i++) data[i]=adr_my[i+4]; // 下位4バイトをdataに代入
bokunimowakaru 3:d7263b5155bf 3272 if( xbee_tx_rx( "RATDL", data ,4 ) > 0 ){ // 下位4バイトを設定
bokunimowakaru 3:d7263b5155bf 3273 if( xbee_tx_rx( "RATDD", data ,0 ) > 0 ){ // デバイス名を取得
bokunimowakaru 3:d7263b5155bf 3274 if( data[18]==0x00 && data[19]==0x03 && data[20]==0x00 ){ // XBeeデバイス
bokunimowakaru 3:d7263b5155bf 3275 dd=data[21]; // デバイス名をddに代入
bokunimowakaru 3:d7263b5155bf 3276 }
bokunimowakaru 3:d7263b5155bf 3277 }else{
bokunimowakaru 3:d7263b5155bf 3278 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3279 xbee_log( 4, "ERR:tx_rx RATDD at set_myadd" , 1 );
bokunimowakaru 3:d7263b5155bf 3280 #endif
bokunimowakaru 3:d7263b5155bf 3281 }
bokunimowakaru 3:d7263b5155bf 3282 }else{
bokunimowakaru 3:d7263b5155bf 3283 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3284 xbee_log( 4, "ERR:tx_rx RATDL at set_myadd" , 1 );
bokunimowakaru 3:d7263b5155bf 3285 #endif
bokunimowakaru 3:d7263b5155bf 3286 }
bokunimowakaru 3:d7263b5155bf 3287 }else{
bokunimowakaru 3:d7263b5155bf 3288 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3289 xbee_log( 4, "ERR:tx_rx RATDH at set_myadd" , 1 );
bokunimowakaru 3:d7263b5155bf 3290 #endif
bokunimowakaru 3:d7263b5155bf 3291 }
bokunimowakaru 3:d7263b5155bf 3292 #else // XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 3293 for( i=0;i<4;i++){
bokunimowakaru 3:d7263b5155bf 3294 if(adr_my[i] >= 100){
bokunimowakaru 3:d7263b5155bf 3295 data[len] = (byte)(adr_my[i]/100);
bokunimowakaru 3:d7263b5155bf 3296 data[len+1] = (byte)(adr_my[i]/10)-10*data[len]+(byte)'0';
bokunimowakaru 3:d7263b5155bf 3297 data[len] += (byte)'0';
bokunimowakaru 3:d7263b5155bf 3298 len += 2;
bokunimowakaru 3:d7263b5155bf 3299 }else if(adr_my[i] >= 10){
bokunimowakaru 3:d7263b5155bf 3300 data[len] = (byte)(adr_my[i]/10)+(byte)'0';
bokunimowakaru 3:d7263b5155bf 3301 len += 1;
bokunimowakaru 3:d7263b5155bf 3302 }
bokunimowakaru 3:d7263b5155bf 3303 data[len] = (byte)(adr_my[i]%10)+(byte)'0';
bokunimowakaru 3:d7263b5155bf 3304 data[len+1] = (byte)'.'; // 最後のデータdata[len]に「.」が入るが
bokunimowakaru 3:d7263b5155bf 3305 len += 2;
bokunimowakaru 3:d7263b5155bf 3306 }
bokunimowakaru 3:d7263b5155bf 3307 len--; // 最後の「.」は送信しない。
bokunimowakaru 3:d7263b5155bf 3308 if( xbee_tx_rx( "RATDL", data ,len ) > 0 ){ // 下位4バイトを設定
bokunimowakaru 3:d7263b5155bf 3309 dd = 0x00;
bokunimowakaru 3:d7263b5155bf 3310 }else{
bokunimowakaru 3:d7263b5155bf 3311 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3312 xbee_log( 4, "ERR:tx_rx RATDL at set_myadd" , 1 );
bokunimowakaru 3:d7263b5155bf 3313 #endif
bokunimowakaru 3:d7263b5155bf 3314 }
bokunimowakaru 3:d7263b5155bf 3315 // XBee Wi-Fi 2.0だと情報をクラウドに送信してしまう。LAN内に送信するように変更する
bokunimowakaru 3:d7263b5155bf 3316 if(DEVICE_TYPE == XB_TYPE_WIFI20){
bokunimowakaru 3:d7263b5155bf 3317 data[0]=0x00; xbee_tx_rx( "RATDO", data ,1 ); // DO: XBee WiFi 2.0用 Device Option=0
bokunimowakaru 3:d7263b5155bf 3318 }
bokunimowakaru 3:d7263b5155bf 3319 #endif
bokunimowakaru 3:d7263b5155bf 3320 }else{
bokunimowakaru 3:d7263b5155bf 3321 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3322 xbee_log( 4, "ERR:at_my at set_myadd" , 1 );
bokunimowakaru 3:d7263b5155bf 3323 #endif
bokunimowakaru 3:d7263b5155bf 3324 }
bokunimowakaru 3:d7263b5155bf 3325 return(dd);
bokunimowakaru 3:d7263b5155bf 3326 }
bokunimowakaru 3:d7263b5155bf 3327
bokunimowakaru 3:d7263b5155bf 3328 void xbee_from(byte *address){
bokunimowakaru 3:d7263b5155bf 3329 /*
bokunimowakaru 3:d7263b5155bf 3330 最後に受信したデバイスの送信元アドレスの読み込み。
bokunimowakaru 3:d7263b5155bf 3331 但し、xbee_rx_callで受信した場合の送信元アドレスは
bokunimowakaru 3:d7263b5155bf 3332 「構造体XBEE_RESULT変数.FROM」で読むこと。
bokunimowakaru 3:d7263b5155bf 3333 (キャッシュ値での受信の場合があるので)
bokunimowakaru 3:d7263b5155bf 3334 出力:byte *address IEEEアドレス
bokunimowakaru 3:d7263b5155bf 3335 */
bokunimowakaru 3:d7263b5155bf 3336 byte i;
bokunimowakaru 3:d7263b5155bf 3337
bokunimowakaru 3:d7263b5155bf 3338 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 3339 for(i=0; i< 8 ;i++ ) address[i] = ADR_FROM[i];
bokunimowakaru 3:d7263b5155bf 3340 #else // XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 3341 for(i=0; i< 4 ;i++ ) address[i] = ADR_FROM[i];
bokunimowakaru 3:d7263b5155bf 3342 #endif
bokunimowakaru 3:d7263b5155bf 3343 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3344 xbee_log( 1, "done:xbee_from" , 0 );
bokunimowakaru 3:d7263b5155bf 3345 #endif
bokunimowakaru 3:d7263b5155bf 3346 }
bokunimowakaru 3:d7263b5155bf 3347
bokunimowakaru 3:d7263b5155bf 3348 byte text2hex4data( byte *data, const char *in , const byte com_len){
bokunimowakaru 3:d7263b5155bf 3349 /*
bokunimowakaru 3:d7263b5155bf 3350 data 出力:変換後の数値データ(バイナリデータ)
bokunimowakaru 3:d7263b5155bf 3351 in 入力:文字としての16進数(テキストデータ)
bokunimowakaru 3:d7263b5155bf 3352 com_len 入力:ATコマンドの文字数(ATを含む)。16進数に変換する部分以外の先頭文字数
bokunimowakaru 3:d7263b5155bf 3353 戻り値 出力:変換したバイト数
bokunimowakaru 3:d7263b5155bf 3354 */
bokunimowakaru 3:d7263b5155bf 3355 byte i, j, len, val;
bokunimowakaru 3:d7263b5155bf 3356
bokunimowakaru 3:d7263b5155bf 3357 /* ATコマンドに続く16進数の引数入力 */
bokunimowakaru 3:d7263b5155bf 3358 for( len = 0 ; len < API_SIZE ; len++ ){
bokunimowakaru 3:d7263b5155bf 3359 j = (byte)in[len * 2 + com_len];
bokunimowakaru 3:d7263b5155bf 3360 i = (byte)in[len * 2 + com_len + 1];
bokunimowakaru 3:d7263b5155bf 3361 if( j == (byte)'\0' || i == (byte)'\0' )break;
bokunimowakaru 3:d7263b5155bf 3362 // 16進数の文字を数字にしてdataに代入。1桁は考慮。奇数桁は考慮せずに処理。
bokunimowakaru 3:d7263b5155bf 3363 if( (j >= (byte)'0' && j <= (byte)'9') || (j >= (byte)'A' && j <= (byte)'F') ){
bokunimowakaru 3:d7263b5155bf 3364 if( j > '9' ) data[len] = j - (byte)'A' + 10;
bokunimowakaru 3:d7263b5155bf 3365 else data[len] = j - (byte)'0';
bokunimowakaru 3:d7263b5155bf 3366 if( (i >= (byte)'0' && i <= (byte)'9') || (i >= (byte)'A' && i <= (byte)'F') ){
bokunimowakaru 3:d7263b5155bf 3367 if( i > '9' ) val = i - (byte)'A' + 10;
bokunimowakaru 3:d7263b5155bf 3368 else val = i - (byte)'0';
bokunimowakaru 3:d7263b5155bf 3369 data[len] *= 16;
bokunimowakaru 3:d7263b5155bf 3370 data[len] += val;
bokunimowakaru 3:d7263b5155bf 3371 }
bokunimowakaru 3:d7263b5155bf 3372 }else break;
bokunimowakaru 3:d7263b5155bf 3373 }
bokunimowakaru 3:d7263b5155bf 3374 return( len );
bokunimowakaru 3:d7263b5155bf 3375 }
bokunimowakaru 3:d7263b5155bf 3376
bokunimowakaru 3:d7263b5155bf 3377 byte xbee_rat(const byte *address, const char *in){
bokunimowakaru 3:d7263b5155bf 3378 /*
bokunimowakaru 3:d7263b5155bf 3379 リモートATコマンドを送信するユーザ提供関数
bokunimowakaru 3:d7263b5155bf 3380 入力:byte *address = 宛先(子機)アドレス
bokunimowakaru 3:d7263b5155bf 3381    char *in = 入力するATコマンド 例: ATDL0000FFFF 最大文字数は XB_AT_SIZE-1
bokunimowakaru 3:d7263b5155bf 3382 出力:ATコマンドの結果 STATUS_OK / STATUS_ERR / STATUS_ERR_AT / STATUS_ERR_PARM / STATUS_ERR_AIR
bokunimowakaru 3:d7263b5155bf 3383    0xFFで送信失敗もしくはデータ異常
bokunimowakaru 3:d7263b5155bf 3384 */
bokunimowakaru 3:d7263b5155bf 3385 byte i;
bokunimowakaru 3:d7263b5155bf 3386 char at[6];
bokunimowakaru 3:d7263b5155bf 3387 byte data[API_SIZE];
bokunimowakaru 3:d7263b5155bf 3388 byte len;
bokunimowakaru 3:d7263b5155bf 3389 byte ret = 0xFF;
bokunimowakaru 3:d7263b5155bf 3390 byte com_len =0;
bokunimowakaru 3:d7263b5155bf 3391 byte null_adr[] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
bokunimowakaru 3:d7263b5155bf 3392
bokunimowakaru 3:d7263b5155bf 3393 if( in[0]=='A' && in[1]=='T' ){
bokunimowakaru 3:d7263b5155bf 3394 if( bytecmp(null_adr,address,8) == 0 ){
bokunimowakaru 3:d7263b5155bf 3395 // xbee_atから呼ばれた場合 ATxx_;ローカルAT
bokunimowakaru 3:d7263b5155bf 3396 com_len = 4; // 入力ATコマンド長 ATxx 4
bokunimowakaru 3:d7263b5155bf 3397 at[0]='A'; at[1]='T';
bokunimowakaru 3:d7263b5155bf 3398 if( in[2] == '\0' ){
bokunimowakaru 3:d7263b5155bf 3399 at[2]='D'; at[3]='D';
bokunimowakaru 3:d7263b5155bf 3400 }else{
bokunimowakaru 3:d7263b5155bf 3401 at[2]=in[2]; at[3]=in[3];
bokunimowakaru 3:d7263b5155bf 3402 }
bokunimowakaru 3:d7263b5155bf 3403 at[4]='\0';
bokunimowakaru 3:d7263b5155bf 3404 }else{
bokunimowakaru 3:d7263b5155bf 3405 // リモートat(xbee_rat)指定で呼び出された場合 RATxx_;実際のリモートAT
bokunimowakaru 3:d7263b5155bf 3406 com_len = 4; // 入力ATコマンド長 ATxx 4
bokunimowakaru 3:d7263b5155bf 3407 at[0]='R'; at[1]='A'; at[2]='T';
bokunimowakaru 3:d7263b5155bf 3408 // アプリ呼び出しにつき、ATの後に何もない場合が想定される。その時はATDDとみなす
bokunimowakaru 3:d7263b5155bf 3409 if( in[2] == '\0' ){
bokunimowakaru 3:d7263b5155bf 3410 at[3]='D'; at[4]='D';
bokunimowakaru 3:d7263b5155bf 3411 }else{
bokunimowakaru 3:d7263b5155bf 3412 at[3]=in[2]; at[4]=in[3];
bokunimowakaru 3:d7263b5155bf 3413 }
bokunimowakaru 3:d7263b5155bf 3414 at[5]='\0';
bokunimowakaru 3:d7263b5155bf 3415 }
bokunimowakaru 3:d7263b5155bf 3416 }else if( in[0]=='R' && in[1]=='A' && in[2]=='T' ){
bokunimowakaru 3:d7263b5155bf 3417 com_len = 5; // 入力ATコマンド長 RATxx 5
bokunimowakaru 3:d7263b5155bf 3418 at[0]='R'; at[1]='A'; at[2]='T';
bokunimowakaru 3:d7263b5155bf 3419 at[3]=in[3]; at[4]=in[4];
bokunimowakaru 3:d7263b5155bf 3420 at[5]='\0';
bokunimowakaru 3:d7263b5155bf 3421 }else if( in[0]=='T' && in[1]=='X' ){
bokunimowakaru 3:d7263b5155bf 3422 com_len = 2; // 入力ATコマンド長 TX 2
bokunimowakaru 3:d7263b5155bf 3423 at[0]='T'; at[1]='X';
bokunimowakaru 3:d7263b5155bf 3424 at[2]='\0';
bokunimowakaru 3:d7263b5155bf 3425 }
bokunimowakaru 3:d7263b5155bf 3426 #ifndef ARDUINO
bokunimowakaru 3:d7263b5155bf 3427 #ifndef ARM_MBED
bokunimowakaru 3:d7263b5155bf 3428 else if(in[0]=='Z' && in[1]=='C'){
bokunimowakaru 3:d7263b5155bf 3429 com_len = 2; // 入力ATコマンド長 TX 2
bokunimowakaru 3:d7263b5155bf 3430 at[0]='Z'; at[1]='C';
bokunimowakaru 3:d7263b5155bf 3431 at[2]='\0';
bokunimowakaru 3:d7263b5155bf 3432 if( SADR_DEST[0]==0xFF && SADR_DEST[1] == 0xFE) xbee_address(address);
bokunimowakaru 3:d7263b5155bf 3433 len = text2hex4data( data, in , com_len);
bokunimowakaru 3:d7263b5155bf 3434 if( xbee_at_tx( at, data ,len ) > 0 ) ret=0;
bokunimowakaru 3:d7263b5155bf 3435 com_len = 0;
bokunimowakaru 3:d7263b5155bf 3436 }
bokunimowakaru 3:d7263b5155bf 3437 #endif
bokunimowakaru 3:d7263b5155bf 3438 #endif
bokunimowakaru 3:d7263b5155bf 3439 if( com_len > 0 ){
bokunimowakaru 3:d7263b5155bf 3440 if( at[0] != 'A' && SADR_DEST[0] == 0xFF && SADR_DEST[1] == 0xFE) xbee_address(address);
bokunimowakaru 3:d7263b5155bf 3441 len = text2hex4data( data, in , com_len);
bokunimowakaru 3:d7263b5155bf 3442 // test
bokunimowakaru 3:d7263b5155bf 3443 // printf("xbee_tx_rx %s len=%d\n",at,len);
bokunimowakaru 3:d7263b5155bf 3444 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3445 xbee_log( 1, "started:xbee_rat" , len );
bokunimowakaru 3:d7263b5155bf 3446 #endif
bokunimowakaru 3:d7263b5155bf 3447 if( xbee_tx_rx( at, data ,len ) > 0 ){
bokunimowakaru 3:d7263b5155bf 3448 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3449 xbee_log( 1, "done:rat" , len );
bokunimowakaru 3:d7263b5155bf 3450 #endif
bokunimowakaru 3:d7263b5155bf 3451 if( data[3] == MODE_RES ){
bokunimowakaru 3:d7263b5155bf 3452 ret = data[7];
bokunimowakaru 3:d7263b5155bf 3453 }else if( data[3] == MODE_RESP ){
bokunimowakaru 3:d7263b5155bf 3454 for(i=0;i<8;i++) ADR_FROM[i]=data[5+i]; // 2013.9.15 追加
bokunimowakaru 3:d7263b5155bf 3455 ret = data[17];
bokunimowakaru 3:d7263b5155bf 3456 }else{
bokunimowakaru 3:d7263b5155bf 3457 ret = 0xFF;
bokunimowakaru 3:d7263b5155bf 3458 }
bokunimowakaru 3:d7263b5155bf 3459 }else{
bokunimowakaru 3:d7263b5155bf 3460 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3461 xbee_log( 4, "ERR:tx_rx at xbee_rat" , 1 );
bokunimowakaru 3:d7263b5155bf 3462 #endif
bokunimowakaru 3:d7263b5155bf 3463 }
bokunimowakaru 3:d7263b5155bf 3464 }
bokunimowakaru 3:d7263b5155bf 3465 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3466 xbee_log( 1, "done:xbee_rat" , ret );
bokunimowakaru 3:d7263b5155bf 3467 #endif
bokunimowakaru 3:d7263b5155bf 3468 return( ret );
bokunimowakaru 3:d7263b5155bf 3469 }
bokunimowakaru 3:d7263b5155bf 3470
bokunimowakaru 3:d7263b5155bf 3471 byte xbee_rat_force(const byte *address, const char *in){
bokunimowakaru 3:d7263b5155bf 3472 /*
bokunimowakaru 3:d7263b5155bf 3473 リモートATコマンドを送信するユーザ提供関数。応答値をxbee_rx_callで得る。
bokunimowakaru 3:d7263b5155bf 3474 入力:byte *address = 宛先(子機)アドレス
bokunimowakaru 3:d7263b5155bf 3475    char *in = 入力するATコマンド 例: ATDL0000FFFF 最大文字数は XB_AT_SIZE-1
bokunimowakaru 3:d7263b5155bf 3476 出力:0x00で送信失敗もしくはデータ異常
bokunimowakaru 3:d7263b5155bf 3477 */
bokunimowakaru 3:d7263b5155bf 3478 char at[6];
bokunimowakaru 3:d7263b5155bf 3479 byte data[API_SIZE];
bokunimowakaru 3:d7263b5155bf 3480 byte len;
bokunimowakaru 3:d7263b5155bf 3481 byte ret = 0x00;
bokunimowakaru 3:d7263b5155bf 3482
bokunimowakaru 3:d7263b5155bf 3483 if( in[0]=='A' && in[1]=='T' ){
bokunimowakaru 3:d7263b5155bf 3484 at[0]='S'; at[1]='A'; at[2]='T';
bokunimowakaru 3:d7263b5155bf 3485 at[3]=in[3]; at[4]=in[4];
bokunimowakaru 3:d7263b5155bf 3486 at[5]='\0';
bokunimowakaru 3:d7263b5155bf 3487 xbee_address(address);
bokunimowakaru 3:d7263b5155bf 3488 len = text2hex4data( data, in , 5 );
bokunimowakaru 3:d7263b5155bf 3489 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3490 xbee_log( 1, "started:xbee_ratf" , len );
bokunimowakaru 3:d7263b5155bf 3491 #endif
bokunimowakaru 3:d7263b5155bf 3492 if( xbee_at_tx( at, data ,len ) > 0 ){
bokunimowakaru 3:d7263b5155bf 3493 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3494 xbee_log( 1, "done:ratf" , len );
bokunimowakaru 3:d7263b5155bf 3495 #endif
bokunimowakaru 3:d7263b5155bf 3496 ret = PACKET_ID;
bokunimowakaru 3:d7263b5155bf 3497 }
bokunimowakaru 3:d7263b5155bf 3498 #ifdef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 3499 if(ret){ // 送信データを即確定する
bokunimowakaru 3:d7263b5155bf 3500 at[0]='S'; at[1]='A'; at[2]='T';
bokunimowakaru 3:d7263b5155bf 3501 at[3]='A'; at[4]='C';
bokunimowakaru 3:d7263b5155bf 3502 xbee_at_tx( at, data ,0 );
bokunimowakaru 3:d7263b5155bf 3503 }
bokunimowakaru 3:d7263b5155bf 3504 #endif
bokunimowakaru 3:d7263b5155bf 3505 }
bokunimowakaru 3:d7263b5155bf 3506 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3507 xbee_log( 1, "done:xbee_rat_force" , 1 );
bokunimowakaru 3:d7263b5155bf 3508 #endif
bokunimowakaru 3:d7263b5155bf 3509 return( ret );
bokunimowakaru 3:d7263b5155bf 3510 }
bokunimowakaru 3:d7263b5155bf 3511
bokunimowakaru 3:d7263b5155bf 3512 byte xbee_at(const char *in){
bokunimowakaru 3:d7263b5155bf 3513 /*
bokunimowakaru 3:d7263b5155bf 3514 ローカルATコマンドを送信するユーザ提供関数。
bokunimowakaru 3:d7263b5155bf 3515 入力:char *in = 入力するATコマンド 例: ATDL0000FFFF 最大文字数は XB_AT_SIZE-1
bokunimowakaru 3:d7263b5155bf 3516 出力:ATコマンドの結果 STATUS_OK / STATUS_ERR / STATUS_ERR_AT / STATUS_ERR_PARM / STATUS_ERR_AIR
bokunimowakaru 3:d7263b5155bf 3517    0xFFで送信失敗もしくはデータ異常
bokunimowakaru 3:d7263b5155bf 3518    別関数xbee_atnjとエラー時の戻り値が異なる。
bokunimowakaru 3:d7263b5155bf 3519    atnjは正常が複数あるので異常時がNULL、atはエラーが複数あるので正常時がNULL
bokunimowakaru 3:d7263b5155bf 3520 */
bokunimowakaru 3:d7263b5155bf 3521 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 3522 byte address[] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
bokunimowakaru 3:d7263b5155bf 3523 byte ret;
bokunimowakaru 3:d7263b5155bf 3524 ret = xbee_rat( address, in);
bokunimowakaru 3:d7263b5155bf 3525 #else // XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 3526 byte ret;
bokunimowakaru 3:d7263b5155bf 3527 ret = xbee_rat( ADR_DEST, in);
bokunimowakaru 3:d7263b5155bf 3528 #endif
bokunimowakaru 3:d7263b5155bf 3529
bokunimowakaru 3:d7263b5155bf 3530 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3531 if( ret == 0xFF ) xbee_log( 4, "ERR:tx_rx at xbee_at" , ret );
bokunimowakaru 3:d7263b5155bf 3532 xbee_log( 1, "done:xbee_at" , 1 );
bokunimowakaru 3:d7263b5155bf 3533 #endif
bokunimowakaru 3:d7263b5155bf 3534 return( ret );
bokunimowakaru 3:d7263b5155bf 3535 }
bokunimowakaru 3:d7263b5155bf 3536
bokunimowakaru 3:d7263b5155bf 3537 byte xbee_uart(const byte *address, const char *in){
bokunimowakaru 3:d7263b5155bf 3538 /*
bokunimowakaru 3:d7263b5155bf 3539 入力:byte *address = 宛先(子機)アドレス
bokunimowakaru 3:d7263b5155bf 3540    char *in = 送信するテキスト文字。最大文字数はAPI_TXSIZE-1
bokunimowakaru 3:d7263b5155bf 3541 出力:戻り値 = 送信パケット番号PACKET_ID。0x00は失敗。
bokunimowakaru 3:d7263b5155bf 3542 */
bokunimowakaru 3:d7263b5155bf 3543 byte ret=0;
bokunimowakaru 3:d7263b5155bf 3544
bokunimowakaru 3:d7263b5155bf 3545 xbee_address( address ); // 宛先のアドレスを設定
bokunimowakaru 3:d7263b5155bf 3546 if( xbee_putstr( in ) > 0 ) ret = PACKET_ID;
bokunimowakaru 3:d7263b5155bf 3547 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3548 xbee_log( 1, "done:xbee_uart" , 1 );
bokunimowakaru 3:d7263b5155bf 3549 #endif
bokunimowakaru 3:d7263b5155bf 3550 return( ret );
bokunimowakaru 3:d7263b5155bf 3551 }
bokunimowakaru 3:d7263b5155bf 3552
bokunimowakaru 3:d7263b5155bf 3553 byte xbee_bytes(const byte *address, const byte *in, byte len){
bokunimowakaru 3:d7263b5155bf 3554 /*
bokunimowakaru 3:d7263b5155bf 3555 入力:byte *address = 宛先(子機)アドレス
bokunimowakaru 3:d7263b5155bf 3556    byte *in = 送信するバイナリ情報。最大文字数はAPI_TXSIZE-1
bokunimowakaru 3:d7263b5155bf 3557    byte len = バイト数
bokunimowakaru 3:d7263b5155bf 3558 出力:戻り値 = 送信パケット番号PACKET_ID。0x00は失敗。
bokunimowakaru 3:d7263b5155bf 3559 */
bokunimowakaru 3:d7263b5155bf 3560 byte ret=0;
bokunimowakaru 3:d7263b5155bf 3561
bokunimowakaru 3:d7263b5155bf 3562 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3563 xbee_log( 1, "started:xbee_bytes" , 1 );
bokunimowakaru 3:d7263b5155bf 3564 #endif
bokunimowakaru 3:d7263b5155bf 3565 xbee_address( address ); // 宛先のアドレスを設定
bokunimowakaru 3:d7263b5155bf 3566 if(len > API_TXSIZE-18 ){
bokunimowakaru 3:d7263b5155bf 3567 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3568 xbee_log( 3, "CAUTION:xbee_bytes length" , len );
bokunimowakaru 3:d7263b5155bf 3569 #endif
bokunimowakaru 3:d7263b5155bf 3570 len = API_TXSIZE-18;
bokunimowakaru 3:d7263b5155bf 3571 }
bokunimowakaru 3:d7263b5155bf 3572 if( xbee_at_tx( "TX", in , len) > 0 ) ret = PACKET_ID;
bokunimowakaru 3:d7263b5155bf 3573 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3574 xbee_log( 1, "done:xbee_bytes" , 1 );
bokunimowakaru 3:d7263b5155bf 3575 #endif
bokunimowakaru 3:d7263b5155bf 3576 return( ret );
bokunimowakaru 3:d7263b5155bf 3577 }
bokunimowakaru 3:d7263b5155bf 3578
bokunimowakaru 3:d7263b5155bf 3579 byte xbee_atvr( void ){
bokunimowakaru 3:d7263b5155bf 3580 /*
bokunimowakaru 3:d7263b5155bf 3581 XBeeのデバイスタイプを取得するコマンド
bokunimowakaru 3:d7263b5155bf 3582 出力:戻り値= define値 ZB_TYPE_COORD、ZB_TYPE_ROUTER、ZB_TYPE_ENDDEV、0xFF=エラー
bokunimowakaru 3:d7263b5155bf 3583 */
bokunimowakaru 3:d7263b5155bf 3584 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 3585 byte data[API_SIZE];
bokunimowakaru 3:d7263b5155bf 3586 byte ret=0xFF;
bokunimowakaru 3:d7263b5155bf 3587
bokunimowakaru 3:d7263b5155bf 3588 if( xbee_tx_rx( "ATVR", data ,0 ) > 0){
bokunimowakaru 3:d7263b5155bf 3589 DEVICE_TYPE = data[8];
bokunimowakaru 3:d7263b5155bf 3590 if( DEVICE_TYPE != ZB_TYPE_COORD &&
bokunimowakaru 3:d7263b5155bf 3591 DEVICE_TYPE != ZB_TYPE_ROUTER &&
bokunimowakaru 3:d7263b5155bf 3592 DEVICE_TYPE != ZB_TYPE_ENDDEV) ret = 0xFF;
bokunimowakaru 3:d7263b5155bf 3593 else ret = DEVICE_TYPE;
bokunimowakaru 3:d7263b5155bf 3594 }
bokunimowakaru 3:d7263b5155bf 3595 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3596 xbee_log( 1, "done:xbee_atvr" , ret );
bokunimowakaru 3:d7263b5155bf 3597 #endif
bokunimowakaru 3:d7263b5155bf 3598 return( ret );
bokunimowakaru 3:d7263b5155bf 3599 #else
bokunimowakaru 3:d7263b5155bf 3600 return( DEVICE_TYPE );
bokunimowakaru 3:d7263b5155bf 3601 #endif
bokunimowakaru 3:d7263b5155bf 3602 }
bokunimowakaru 3:d7263b5155bf 3603
bokunimowakaru 3:d7263b5155bf 3604 byte xbee_atcb( byte cb ){
bokunimowakaru 3:d7263b5155bf 3605 /*
bokunimowakaru 3:d7263b5155bf 3606 XBeeのコミッション制御
bokunimowakaru 3:d7263b5155bf 3607 入力:コミッションボタンの押下数(1:ジョイン開始、2:ジョイン許可、4:初期化)
bokunimowakaru 3:d7263b5155bf 3608 出力:戻り値= 0xFF 異常終了、 0x00 指示成功
bokunimowakaru 3:d7263b5155bf 3609 */
bokunimowakaru 3:d7263b5155bf 3610 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 3611 byte data[API_SIZE];
bokunimowakaru 3:d7263b5155bf 3612 byte ret = 0xFF;
bokunimowakaru 3:d7263b5155bf 3613
bokunimowakaru 3:d7263b5155bf 3614 data[0] = cb;
bokunimowakaru 3:d7263b5155bf 3615 if( cb == 1 || cb == 2 ){
bokunimowakaru 3:d7263b5155bf 3616 if( xbee_tx_rx( "ATCB", data ,1 ) > 0) ret = 0x00;
bokunimowakaru 3:d7263b5155bf 3617 }else if( cb == 4){
bokunimowakaru 3:d7263b5155bf 3618 if( xbee_tx_rx( "ATCB", data ,1 ) > 0){
bokunimowakaru 3:d7263b5155bf 3619 if( DEVICE_TYPE == ZB_TYPE_COORD ){
bokunimowakaru 3:d7263b5155bf 3620 wait_millisec(1000);
bokunimowakaru 3:d7263b5155bf 3621 sci_clear();
bokunimowakaru 3:d7263b5155bf 3622 wait_millisec(5000);
bokunimowakaru 3:d7263b5155bf 3623 xbee_at_rx( data );
bokunimowakaru 3:d7263b5155bf 3624 if( data[3] == MODE_MODM && data[4] == MODM_STARTED ){
bokunimowakaru 3:d7263b5155bf 3625 ret = 0x00;
bokunimowakaru 3:d7263b5155bf 3626 }
bokunimowakaru 3:d7263b5155bf 3627 }else ret = 0x00;
bokunimowakaru 3:d7263b5155bf 3628 }
bokunimowakaru 3:d7263b5155bf 3629 }
bokunimowakaru 3:d7263b5155bf 3630 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3631 xbee_log( 1, "done:xbee_atcb" , ret );
bokunimowakaru 3:d7263b5155bf 3632 #endif
bokunimowakaru 3:d7263b5155bf 3633 return( ret );
bokunimowakaru 3:d7263b5155bf 3634 #else
bokunimowakaru 3:d7263b5155bf 3635 return( 0xFF );
bokunimowakaru 3:d7263b5155bf 3636 #endif
bokunimowakaru 3:d7263b5155bf 3637 }
bokunimowakaru 3:d7263b5155bf 3638
bokunimowakaru 3:d7263b5155bf 3639 byte xbee_atai(void){
bokunimowakaru 3:d7263b5155bf 3640 /*
bokunimowakaru 3:d7263b5155bf 3641 XBeeモジュールの状態を確認するコマンド AT Association Indication
bokunimowakaru 3:d7263b5155bf 3642 出力:
bokunimowakaru 3:d7263b5155bf 3643 0x00 - Successfully formed or joined a network. (Coordinators form a network, routers
bokunimowakaru 3:d7263b5155bf 3644 and end devices join a network.)
bokunimowakaru 3:d7263b5155bf 3645 ※Routerに対して実行すると01が返ってくる場合があるが仕様書には記載なし。
bokunimowakaru 3:d7263b5155bf 3646 0x21 - Scan found no PANs
bokunimowakaru 3:d7263b5155bf 3647 0x22 - Scan found no valid PANs based on current SC and ID settings
bokunimowakaru 3:d7263b5155bf 3648 0x23 - Valid Coordinator or Routers found, but they are not allowing joining (NJ expired)
bokunimowakaru 3:d7263b5155bf 3649 0x24 - No joinable beacons were found
bokunimowakaru 3:d7263b5155bf 3650 0x25 - Unexpected state, node should not be attempting to join at this time
bokunimowakaru 3:d7263b5155bf 3651 0x27 - Node Joining attempt failed (typically due to incompatible security settings)
bokunimowakaru 3:d7263b5155bf 3652 0x2A - Coordinator Start attempt failed‘
bokunimowakaru 3:d7263b5155bf 3653 0x2B - Checking for an existing coordinator
bokunimowakaru 3:d7263b5155bf 3654 0x2C - Attempt to leave the network failed
bokunimowakaru 3:d7263b5155bf 3655 0xAB - Attempted to join a device that did not respond.
bokunimowakaru 3:d7263b5155bf 3656 0xAC - Secure join error - network security key received unsecured
bokunimowakaru 3:d7263b5155bf 3657 0xAD - Secure join error - network security key not received
bokunimowakaru 3:d7263b5155bf 3658 0xAF - Secure join error - joining device does not have the right preconfigured link key
bokunimowakaru 3:d7263b5155bf 3659 0xFF - Scanning for a ZigBee network (routers and end devices)
bokunimowakaru 3:d7263b5155bf 3660
bokunimowakaru 3:d7263b5155bf 3661 注意:本コマンドは応答待ちを行うので干渉によるパケット損失があります。
bokunimowakaru 3:d7263b5155bf 3662    本コマンドをXBeeに送ると、XBeeからの応答用キャッシュがクリアされる場合があります。
bokunimowakaru 3:d7263b5155bf 3663    例えば、xbee_forceなどの応答を後から得るコマンドを実行後に本コマンドを実行すると
bokunimowakaru 3:d7263b5155bf 3664    xbee_rx_callで応答が受け取れなくなる場合があります。
bokunimowakaru 3:d7263b5155bf 3665    このような場合、xbee_ataiを実行してからxbee_forceを実行するような手順にしてください。
bokunimowakaru 3:d7263b5155bf 3666 */
bokunimowakaru 3:d7263b5155bf 3667 byte data[API_SIZE];
bokunimowakaru 3:d7263b5155bf 3668 byte ret=0xFF;
bokunimowakaru 3:d7263b5155bf 3669
bokunimowakaru 3:d7263b5155bf 3670 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3671 xbee_log( 1, "started:xbee_atai" , 0x00 );
bokunimowakaru 3:d7263b5155bf 3672 #endif
bokunimowakaru 3:d7263b5155bf 3673 if( xbee_tx_rx( "ATAI", data ,0 ) > 0 ){
bokunimowakaru 3:d7263b5155bf 3674 // wait_millisec(100);
bokunimowakaru 3:d7263b5155bf 3675 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 3676 if( data[7] == 0x00 ) ret = data[8];
bokunimowakaru 3:d7263b5155bf 3677 #else
bokunimowakaru 3:d7263b5155bf 3678 if( data[17] == 0x00 ) ret = data[18];
bokunimowakaru 3:d7263b5155bf 3679 #endif
bokunimowakaru 3:d7263b5155bf 3680 }
bokunimowakaru 3:d7263b5155bf 3681 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3682 xbee_log( 1, "done:xbee_atai" , ret );
bokunimowakaru 3:d7263b5155bf 3683 #endif
bokunimowakaru 3:d7263b5155bf 3684 return( ret );
bokunimowakaru 3:d7263b5155bf 3685 }
bokunimowakaru 3:d7263b5155bf 3686
bokunimowakaru 3:d7263b5155bf 3687 unsigned short xbee_atop(byte *pan_id){
bokunimowakaru 3:d7263b5155bf 3688 /*
bokunimowakaru 3:d7263b5155bf 3689 PAN Idを求めるコマンド(書き込めないD
bokunimowakaru 3:d7263b5155bf 3690 出力:byte pan_id[8] PAN_ID 64bit (8bytes)
bokunimowakaru 3:d7263b5155bf 3691    unsigned short 戻り値 = PAN_ID 16bit
bokunimowakaru 3:d7263b5155bf 3692 注意:本コマンドは応答待ちを行うので干渉によるパケット損失があります。
bokunimowakaru 3:d7263b5155bf 3693 */
bokunimowakaru 3:d7263b5155bf 3694 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 3695 byte data[API_SIZE];
bokunimowakaru 3:d7263b5155bf 3696 byte i;
bokunimowakaru 3:d7263b5155bf 3697 unsigned short pan_id_s=0xFFFF;
bokunimowakaru 3:d7263b5155bf 3698
bokunimowakaru 3:d7263b5155bf 3699 for( i=0 ; i<8 ; i++ ) pan_id[i] = 0x00;
bokunimowakaru 3:d7263b5155bf 3700 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3701 xbee_log( 1, "started:xbee_atop" , 0x00 );
bokunimowakaru 3:d7263b5155bf 3702 #endif
bokunimowakaru 3:d7263b5155bf 3703 if( xbee_tx_rx( "ATOP", data ,0 ) > 0 ){
bokunimowakaru 3:d7263b5155bf 3704 wait_millisec(100);
bokunimowakaru 3:d7263b5155bf 3705 if( data[7] == 0x00 ){
bokunimowakaru 3:d7263b5155bf 3706 for( i=0 ; i<8 ; i++ ) pan_id[i] = data[8+i];
bokunimowakaru 3:d7263b5155bf 3707 }
bokunimowakaru 3:d7263b5155bf 3708 xbee_tx_rx( "ATOI", data ,0 );
bokunimowakaru 3:d7263b5155bf 3709 if( data[7] == 0x00 ){
bokunimowakaru 3:d7263b5155bf 3710 pan_id_s = (unsigned short)data[8] * 16 + (unsigned short)data[9];
bokunimowakaru 3:d7263b5155bf 3711 }
bokunimowakaru 3:d7263b5155bf 3712 // wait_millisec(100);
bokunimowakaru 3:d7263b5155bf 3713 }
bokunimowakaru 3:d7263b5155bf 3714 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3715 xbee_log( 1, "done:xbee_atop" , 0x00 );
bokunimowakaru 3:d7263b5155bf 3716 #endif
bokunimowakaru 3:d7263b5155bf 3717 return( pan_id_s );
bokunimowakaru 3:d7263b5155bf 3718 #else
bokunimowakaru 3:d7263b5155bf 3719 return( 0x00 );
bokunimowakaru 3:d7263b5155bf 3720 #endif
bokunimowakaru 3:d7263b5155bf 3721 }
bokunimowakaru 3:d7263b5155bf 3722
bokunimowakaru 3:d7263b5155bf 3723 byte xbee_atee_on(const char *key ){
bokunimowakaru 3:d7263b5155bf 3724 /*
bokunimowakaru 3:d7263b5155bf 3725 暗号化通信の設定(コーディネータ、ルータ共用)
bokunimowakaru 3:d7263b5155bf 3726 入力:const char *key セキュリティ共通キー16文字まで
bokunimowakaru 3:d7263b5155bf 3727 出力:byte 戻り値 = 0xFF失敗 0x00書き込み 0x01何もせず(設定されていた)
bokunimowakaru 3:d7263b5155bf 3728 */
bokunimowakaru 3:d7263b5155bf 3729 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 3730 byte i;
bokunimowakaru 3:d7263b5155bf 3731 byte ret = 0xFF;
bokunimowakaru 3:d7263b5155bf 3732 byte data[API_SIZE];
bokunimowakaru 3:d7263b5155bf 3733
bokunimowakaru 3:d7263b5155bf 3734 /* 現在のモードを確認(あとでATWRする。フラッシュ書き換え回数低減のため) */
bokunimowakaru 3:d7263b5155bf 3735 // xbee_tx_rx( "ATVR", data ,0 );
bokunimowakaru 3:d7263b5155bf 3736 // vr = data[8]; // xbee VRを取得
bokunimowakaru 3:d7263b5155bf 3737 if( xbee_tx_rx( "ATEE", data ,0 ) > 0 ){
bokunimowakaru 3:d7263b5155bf 3738 if( data[8] == 0x00 ){ // ATEEの応答が00の時
bokunimowakaru 3:d7263b5155bf 3739 data[0] = 0x01; // ATEE = 0x01に設定
bokunimowakaru 3:d7263b5155bf 3740 if( xbee_tx_rx( "ATEE", data ,1 ) > 0 ){
bokunimowakaru 3:d7263b5155bf 3741 if( DEVICE_TYPE == ZB_TYPE_COORD ){
bokunimowakaru 3:d7263b5155bf 3742 wait_millisec(1000);
bokunimowakaru 3:d7263b5155bf 3743 sci_clear();
bokunimowakaru 3:d7263b5155bf 3744 wait_millisec(5000);
bokunimowakaru 3:d7263b5155bf 3745 xbee_at_rx( data );
bokunimowakaru 3:d7263b5155bf 3746 if( data[3] == MODE_MODM && data[4] == MODM_STARTED ){
bokunimowakaru 3:d7263b5155bf 3747 data[0] = 0x00; // ATNK = 0x00 random network key
bokunimowakaru 3:d7263b5155bf 3748 ret = xbee_tx_rx( "ATNK", data ,1 );
bokunimowakaru 3:d7263b5155bf 3749 }
bokunimowakaru 3:d7263b5155bf 3750 }else ret = 0x01;
bokunimowakaru 3:d7263b5155bf 3751 /* KY 設定 */
bokunimowakaru 3:d7263b5155bf 3752 for(i=0;i<16;i++){
bokunimowakaru 3:d7263b5155bf 3753 if( key[i] == '\0' ) break;
bokunimowakaru 3:d7263b5155bf 3754 data[i] = (byte)key[i];
bokunimowakaru 3:d7263b5155bf 3755 } // ここで使ったiはキーの文字数として使用する
bokunimowakaru 3:d7263b5155bf 3756 if( i == 0 ){
bokunimowakaru 3:d7263b5155bf 3757 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3758 xbee_log( 3, "CAUTION:ATKY=" , 0 );
bokunimowakaru 3:d7263b5155bf 3759 #endif
bokunimowakaru 3:d7263b5155bf 3760 data[0] = 0x00;
bokunimowakaru 3:d7263b5155bf 3761 i = 1;
bokunimowakaru 3:d7263b5155bf 3762 }
bokunimowakaru 3:d7263b5155bf 3763 if( xbee_tx_rx( "ATKY", data ,i ) > 0 ){
bokunimowakaru 3:d7263b5155bf 3764 if( xbee_tx_rx( "ATWR", data ,0 ) > 0 ){
bokunimowakaru 3:d7263b5155bf 3765 if( ret != 0xFF ) ret = 0x00;
bokunimowakaru 3:d7263b5155bf 3766 }
bokunimowakaru 3:d7263b5155bf 3767 }
bokunimowakaru 3:d7263b5155bf 3768 }
bokunimowakaru 3:d7263b5155bf 3769 }else ret = 0x01;
bokunimowakaru 3:d7263b5155bf 3770 }
bokunimowakaru 3:d7263b5155bf 3771 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3772 xbee_log( 1, "done:xbee_atee_on" , ret );
bokunimowakaru 3:d7263b5155bf 3773 #endif
bokunimowakaru 3:d7263b5155bf 3774 return(ret);
bokunimowakaru 3:d7263b5155bf 3775 #else
bokunimowakaru 3:d7263b5155bf 3776 return( 0x00 );
bokunimowakaru 3:d7263b5155bf 3777 #endif
bokunimowakaru 3:d7263b5155bf 3778 }
bokunimowakaru 3:d7263b5155bf 3779
bokunimowakaru 3:d7263b5155bf 3780 byte xbee_atee_off( void ){
bokunimowakaru 3:d7263b5155bf 3781 /*
bokunimowakaru 3:d7263b5155bf 3782 暗号化通信のオフ(コーディネータ、ルータ共用)
bokunimowakaru 3:d7263b5155bf 3783 出力:byte 戻り値 = 0xFF失敗 0x00書き込み 0x01何もせず(設定されていた)
bokunimowakaru 3:d7263b5155bf 3784 */
bokunimowakaru 3:d7263b5155bf 3785 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 3786 byte data[API_SIZE];
bokunimowakaru 3:d7263b5155bf 3787 byte ret = 0xFF;
bokunimowakaru 3:d7263b5155bf 3788
bokunimowakaru 3:d7263b5155bf 3789 if( xbee_tx_rx( "ATEE", data ,0 ) > 0 ){
bokunimowakaru 3:d7263b5155bf 3790 if( data[8] == 0x01 ){ // ATEEの応答が01(enable)の時
bokunimowakaru 3:d7263b5155bf 3791 data[0] = 0x00; // ATEE = 0x00に設定
bokunimowakaru 3:d7263b5155bf 3792 if( xbee_tx_rx( "ATEE", data ,1 ) > 0 ){
bokunimowakaru 3:d7263b5155bf 3793 if( DEVICE_TYPE == ZB_TYPE_COORD ){ // ZigBeeコーディネータの場合は再起動がある
bokunimowakaru 3:d7263b5155bf 3794 wait_millisec(1000);
bokunimowakaru 3:d7263b5155bf 3795 sci_clear();
bokunimowakaru 3:d7263b5155bf 3796 wait_millisec(5000);
bokunimowakaru 3:d7263b5155bf 3797 xbee_at_rx( data );
bokunimowakaru 3:d7263b5155bf 3798 if( data[3] == MODE_MODM && data[4] == MODM_STARTED ){
bokunimowakaru 3:d7263b5155bf 3799 data[0] = 0x00; // ATNK = 0x00 random network key
bokunimowakaru 3:d7263b5155bf 3800 ret = xbee_tx_rx( "ATNK", data ,1 );
bokunimowakaru 3:d7263b5155bf 3801 }
bokunimowakaru 3:d7263b5155bf 3802 }else ret = 0x01;
bokunimowakaru 3:d7263b5155bf 3803 if( xbee_tx_rx( "ATWR", data ,0 ) > 0 ){
bokunimowakaru 3:d7263b5155bf 3804 if( ret != 0xFF ) ret = 0x00;
bokunimowakaru 3:d7263b5155bf 3805 }
bokunimowakaru 3:d7263b5155bf 3806 }
bokunimowakaru 3:d7263b5155bf 3807 }else ret= 0x01;
bokunimowakaru 3:d7263b5155bf 3808 }
bokunimowakaru 3:d7263b5155bf 3809 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3810 xbee_log( 1, "done:xbee_atee_off" , ret );
bokunimowakaru 3:d7263b5155bf 3811 #endif
bokunimowakaru 3:d7263b5155bf 3812 return(ret);
bokunimowakaru 3:d7263b5155bf 3813 #else
bokunimowakaru 3:d7263b5155bf 3814 return( 0x00 );
bokunimowakaru 3:d7263b5155bf 3815 #endif
bokunimowakaru 3:d7263b5155bf 3816 }
bokunimowakaru 3:d7263b5155bf 3817
bokunimowakaru 3:d7263b5155bf 3818 byte xbee_atnc(void){
bokunimowakaru 3:d7263b5155bf 3819 /*
bokunimowakaru 3:d7263b5155bf 3820 XBeeモジュールのEnd Device子機のジョイン可能な台数を取得するコマンドです。
bokunimowakaru 3:d7263b5155bf 3821 出力:ジョイン可能数(0~)、0xFFで取得エラー
bokunimowakaru 3:d7263b5155bf 3822
bokunimowakaru 3:d7263b5155bf 3823 注意:本コマンドは応答待ちを行うので干渉によるパケット損失があります。
bokunimowakaru 3:d7263b5155bf 3824 */
bokunimowakaru 3:d7263b5155bf 3825 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 3826 byte data[API_SIZE];
bokunimowakaru 3:d7263b5155bf 3827 byte ret=0xFF;
bokunimowakaru 3:d7263b5155bf 3828 if( xbee_tx_rx( "ATNC", data ,0 ) > 0 ){
bokunimowakaru 3:d7263b5155bf 3829 if( data[7] == 0x00 ) ret = data[8];
bokunimowakaru 3:d7263b5155bf 3830 }
bokunimowakaru 3:d7263b5155bf 3831 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3832 if(ret<3) xbee_log( 3, "CAUTION:Many Children" , ret );
bokunimowakaru 3:d7263b5155bf 3833 if(ret==0) xbee_log( 3, "CAUTION:Cannot Join More" , ret );
bokunimowakaru 3:d7263b5155bf 3834 xbee_log( 1, "done:xbee_atnc" , ret );
bokunimowakaru 3:d7263b5155bf 3835 #endif
bokunimowakaru 3:d7263b5155bf 3836 return( ret );
bokunimowakaru 3:d7263b5155bf 3837 #else
bokunimowakaru 3:d7263b5155bf 3838 return( 0 );
bokunimowakaru 3:d7263b5155bf 3839 #endif
bokunimowakaru 3:d7263b5155bf 3840 }
bokunimowakaru 3:d7263b5155bf 3841
bokunimowakaru 3:d7263b5155bf 3842 byte xbee_ratnc( const byte *address ){
bokunimowakaru 3:d7263b5155bf 3843 /*
bokunimowakaru 3:d7263b5155bf 3844 XBeeモジュールのEnd Device子機のジョイン可能な台数を取得するコマンドです。
bokunimowakaru 3:d7263b5155bf 3845 出力:ジョイン可能数(0~)、0xFFで取得エラー
bokunimowakaru 3:d7263b5155bf 3846
bokunimowakaru 3:d7263b5155bf 3847 注意:本コマンドは応答待ちを行うので干渉によるパケット損失があります。
bokunimowakaru 3:d7263b5155bf 3848    本コマンドをXBeeに送ると、XBeeからの応答用キャッシュがクリアされる場合があります。
bokunimowakaru 3:d7263b5155bf 3849 */
bokunimowakaru 3:d7263b5155bf 3850 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 3851 byte data[API_SIZE];
bokunimowakaru 3:d7263b5155bf 3852 byte ret=0xFF;
bokunimowakaru 3:d7263b5155bf 3853
bokunimowakaru 3:d7263b5155bf 3854 xbee_address(address); // 宛先のアドレスを設定
bokunimowakaru 3:d7263b5155bf 3855 if( xbee_tx_rx( "RATNC", data ,0 ) > 0 ){
bokunimowakaru 3:d7263b5155bf 3856 if( data[17] == 0x00 ) ret = data[18];
bokunimowakaru 3:d7263b5155bf 3857 }
bokunimowakaru 3:d7263b5155bf 3858 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3859 if(ret<3) xbee_log( 3, "CAUTION:Many Children" , ret );
bokunimowakaru 3:d7263b5155bf 3860 xbee_log( 1, "done:xbee_ratnc" , ret );
bokunimowakaru 3:d7263b5155bf 3861 #endif
bokunimowakaru 3:d7263b5155bf 3862 return( ret );
bokunimowakaru 3:d7263b5155bf 3863 #else
bokunimowakaru 3:d7263b5155bf 3864 return( 0 );
bokunimowakaru 3:d7263b5155bf 3865 #endif
bokunimowakaru 3:d7263b5155bf 3866 }
bokunimowakaru 3:d7263b5155bf 3867
bokunimowakaru 3:d7263b5155bf 3868 byte xbee_atnj(const byte timeout){
bokunimowakaru 3:d7263b5155bf 3869 /*
bokunimowakaru 3:d7263b5155bf 3870 制限時間timeoutで設定した間にネットワークに参加したデバイスを通信相手に設定する関数
bokunimowakaru 3:d7263b5155bf 3871 AT Node Join Time
bokunimowakaru 3:d7263b5155bf 3872 入力:timeout = 時間(6~254秒)、0x00で参加拒否、0xFFの場合は常に参加許可
bokunimowakaru 3:d7263b5155bf 3873 出力:byte 戻り値 = 0x00失敗、成功時はMODE_IDNT(0x95)が代入される
bokunimowakaru 3:d7263b5155bf 3874    xbee_atとエラー時の戻り値が異なる。
bokunimowakaru 3:d7263b5155bf 3875    atnjは正常が複数あるので異常時がNULL
bokunimowakaru 3:d7263b5155bf 3876    また、atnjはfopenと似た記述になるので、特殊な応答でもない(と思う)
bokunimowakaru 3:d7263b5155bf 3877
bokunimowakaru 3:d7263b5155bf 3878 注意:本コマンドは応答待ちを行うので干渉によるパケット損失があります。
bokunimowakaru 3:d7263b5155bf 3879 */
bokunimowakaru 3:d7263b5155bf 3880 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 3881 byte data[API_SIZE];
bokunimowakaru 3:d7263b5155bf 3882 byte i=0, ret, timer;
bokunimowakaru 3:d7263b5155bf 3883
bokunimowakaru 3:d7263b5155bf 3884 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3885 xbee_log( 1, "started:xbee_atnj" , timeout );
bokunimowakaru 3:d7263b5155bf 3886 #endif
bokunimowakaru 3:d7263b5155bf 3887 data[0]=timeout;
bokunimowakaru 3:d7263b5155bf 3888 ret = xbee_tx_rx( "ATNJ", data ,1 );
bokunimowakaru 3:d7263b5155bf 3889 if( ret > 0 ){
bokunimowakaru 3:d7263b5155bf 3890 wait_millisec(100);
bokunimowakaru 3:d7263b5155bf 3891 if( timeout == 0xFF ){
bokunimowakaru 3:d7263b5155bf 3892 /*常に参加待ち受けするテスト専用(非実用)*/
bokunimowakaru 3:d7263b5155bf 3893 ret=0xFF;
bokunimowakaru 3:d7263b5155bf 3894 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3895 xbee_log( 3, "CAUTION:ATNJ=" , timeout );
bokunimowakaru 3:d7263b5155bf 3896 #endif
bokunimowakaru 3:d7263b5155bf 3897 wait_millisec(1000); // NJ値の書込み時間待ち
bokunimowakaru 3:d7263b5155bf 3898 }else{
bokunimowakaru 3:d7263b5155bf 3899 if( timeout > 0x09 ){
bokunimowakaru 3:d7263b5155bf 3900 /*参加待ち受けの開始*/
bokunimowakaru 3:d7263b5155bf 3901 timer = TIMER_SEC + timeout + 0x01 ;
bokunimowakaru 3:d7263b5155bf 3902 ret = 0x00;
bokunimowakaru 3:d7263b5155bf 3903 while( timer != TIMER_SEC && ret != MODE_IDNT){ // MODE_IDNT(0x95)はネットワーク参加
bokunimowakaru 3:d7263b5155bf 3904 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 3905 if( (timera()>>6)&0x01 ){
bokunimowakaru 3:d7263b5155bf 3906 led_green( 0 ); // LEDのトグル1秒に4回
bokunimowakaru 3:d7263b5155bf 3907 } else {
bokunimowakaru 3:d7263b5155bf 3908 led_green( 1 );
bokunimowakaru 3:d7263b5155bf 3909 }
bokunimowakaru 3:d7263b5155bf 3910 #endif
bokunimowakaru 3:d7263b5155bf 3911 if( xbee_at_rx( data ) > 0x00 ){ // データの受信(戻り値は受信種別mode値)
bokunimowakaru 3:d7263b5155bf 3912 ret = xbee_from_acum(data);
bokunimowakaru 3:d7263b5155bf 3913 if( ret == MODE_IDNT ){ // 受信モードがMODE_IDNT(0x95) Node Identifyの場合
bokunimowakaru 3:d7263b5155bf 3914 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3915 xbee_log( 1, "Found device " , ret );
bokunimowakaru 3:d7263b5155bf 3916 #endif
bokunimowakaru 3:d7263b5155bf 3917 for(i=0;i<8;i++) ADR_DEST[i]=ADR_FROM[i]; // 宛先を発見デバイスに設定
bokunimowakaru 3:d7263b5155bf 3918 #ifndef LITE // BeeBee Lite by 蘭
bokunimowakaru 3:d7263b5155bf 3919 sci_write_check();
bokunimowakaru 3:d7263b5155bf 3920 #endif
bokunimowakaru 3:d7263b5155bf 3921 sci_clear();
bokunimowakaru 3:d7263b5155bf 3922 }else ret=0x00;
bokunimowakaru 3:d7263b5155bf 3923 }
bokunimowakaru 3:d7263b5155bf 3924 }
bokunimowakaru 3:d7263b5155bf 3925 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3926 if( ret == 0x00 ) xbee_log( 1, "no new device" , ret );
bokunimowakaru 3:d7263b5155bf 3927 #endif
bokunimowakaru 3:d7263b5155bf 3928 }
bokunimowakaru 3:d7263b5155bf 3929 /*ジョイン拒否設定*/
bokunimowakaru 3:d7263b5155bf 3930 data[0]=0x00;
bokunimowakaru 3:d7263b5155bf 3931 xbee_tx_rx( "ATNJ", data ,1 );
bokunimowakaru 3:d7263b5155bf 3932 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3933 xbee_log( 1, "done:atnj=0x00" , 0x00 );
bokunimowakaru 3:d7263b5155bf 3934 #endif
bokunimowakaru 3:d7263b5155bf 3935 }
bokunimowakaru 3:d7263b5155bf 3936 }else{
bokunimowakaru 3:d7263b5155bf 3937 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3938 xbee_log( 5, "ERROR:xbee_atnj" , ret );
bokunimowakaru 3:d7263b5155bf 3939 #endif
bokunimowakaru 3:d7263b5155bf 3940 }
bokunimowakaru 3:d7263b5155bf 3941 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3942 xbee_log( 1, "done:xbee_atnj" , ret );
bokunimowakaru 3:d7263b5155bf 3943 #endif
bokunimowakaru 3:d7263b5155bf 3944 return( ret );
bokunimowakaru 3:d7263b5155bf 3945 #else
bokunimowakaru 3:d7263b5155bf 3946 return( 0x95 );
bokunimowakaru 3:d7263b5155bf 3947 #endif
bokunimowakaru 3:d7263b5155bf 3948 }
bokunimowakaru 3:d7263b5155bf 3949
bokunimowakaru 3:d7263b5155bf 3950 byte xbee_ratnj(const byte *address, const byte timeout){
bokunimowakaru 3:d7263b5155bf 3951 /*
bokunimowakaru 3:d7263b5155bf 3952 前記xbee_atnjをリモート先(子機)に対して設定する関数
bokunimowakaru 3:d7263b5155bf 3953 入力:byte *address = 宛先(子機)アドレス
bokunimowakaru 3:d7263b5155bf 3954 入力:timeout = 0でジョイン拒否、1~254で待ち秒数、255で常時ジョイン許可
bokunimowakaru 3:d7263b5155bf 3955 出力:byte 戻り値 = 0x00失敗、0xFF成功
bokunimowakaru 3:d7263b5155bf 3956
bokunimowakaru 3:d7263b5155bf 3957 注意:本コマンドは応答待ちを行うので干渉によるパケット損失があります。
bokunimowakaru 3:d7263b5155bf 3958 */
bokunimowakaru 3:d7263b5155bf 3959 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 3960 byte data[API_SIZE];
bokunimowakaru 3:d7263b5155bf 3961 byte ret=0x00;
bokunimowakaru 3:d7263b5155bf 3962
bokunimowakaru 3:d7263b5155bf 3963 xbee_address(address); // 宛先のアドレスを設定
bokunimowakaru 3:d7263b5155bf 3964 data[0]=timeout;
bokunimowakaru 3:d7263b5155bf 3965 if( xbee_tx_rx( "RATNJ", data ,1 ) > 0 ){
bokunimowakaru 3:d7263b5155bf 3966 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3967 xbee_log( 1, "done:ratnj" , xbee_tx_rx( "ATAC", data ,0 ) );
bokunimowakaru 3:d7263b5155bf 3968 #endif
bokunimowakaru 3:d7263b5155bf 3969 ret=0xFF;
bokunimowakaru 3:d7263b5155bf 3970 }
bokunimowakaru 3:d7263b5155bf 3971 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 3972 xbee_log( 1, "done:xbee_ratnj" , ret );
bokunimowakaru 3:d7263b5155bf 3973 #endif
bokunimowakaru 3:d7263b5155bf 3974 return( ret );
bokunimowakaru 3:d7263b5155bf 3975 #else
bokunimowakaru 3:d7263b5155bf 3976 return( 0x95 );
bokunimowakaru 3:d7263b5155bf 3977 #endif
bokunimowakaru 3:d7263b5155bf 3978 }
bokunimowakaru 3:d7263b5155bf 3979
bokunimowakaru 3:d7263b5155bf 3980 byte xbee_ping(const byte *address ){
bokunimowakaru 3:d7263b5155bf 3981 /*
bokunimowakaru 3:d7263b5155bf 3982 入力:IEEEアドレスaddress
bokunimowakaru 3:d7263b5155bf 3983 出力: 0xFF エラー
bokunimowakaru 3:d7263b5155bf 3984 DEV_TYPE_XBEE 0x00 // XBeeモジュール
bokunimowakaru 3:d7263b5155bf 3985 DEV_TYPE_RS232 0x05 // RS-232Cアダプタ
bokunimowakaru 3:d7263b5155bf 3986 DEV_TYPE_SENS 0x07 // Sensor (1wire専用)
bokunimowakaru 3:d7263b5155bf 3987 DEV_TYPE_PLUG 0x0F // SmartPlug
bokunimowakaru 3:d7263b5155bf 3988
bokunimowakaru 3:d7263b5155bf 3989 byte 戻り値 = 0xFF失敗、成功時は0x00などのデバイス名(ATDD)の下2桁
bokunimowakaru 3:d7263b5155bf 3990
bokunimowakaru 3:d7263b5155bf 3991 注意:本コマンドは応答待ちを行うので干渉によるパケット損失があります。
bokunimowakaru 3:d7263b5155bf 3992 */
bokunimowakaru 3:d7263b5155bf 3993 byte i;
bokunimowakaru 3:d7263b5155bf 3994 byte ret=0xFF; // デバイス名
bokunimowakaru 3:d7263b5155bf 3995 byte data[API_SIZE];
bokunimowakaru 3:d7263b5155bf 3996
bokunimowakaru 3:d7263b5155bf 3997 xbee_address(address); // 宛先のアドレスを設定
bokunimowakaru 3:d7263b5155bf 3998 if( xbee_tx_rx( "RATDD", data ,0 ) > 0 ){ // デバイス名を取得
bokunimowakaru 3:d7263b5155bf 3999 #ifdef XBEE_WIFI // Device Type Identifier. Stores a device type value
bokunimowakaru 3:d7263b5155bf 4000 // 20 00 20 24 ← 電源投入した後は、こんな応答がある。モジュールによらず。
bokunimowakaru 3:d7263b5155bf 4001 // 00 90 00 00 仕様書に書かれていないと思う
bokunimowakaru 3:d7263b5155bf 4002 if( (data[18]==0x00 && data[19]==0x09 && data[20]==0x00 && data[21]==0x00) ||
bokunimowakaru 3:d7263b5155bf 4003 (data[18]==0x20 && data[19]==0x00 && data[20]==0x20 && data[21]==0x24) ){ // XBee WiFiデバイス
bokunimowakaru 3:d7263b5155bf 4004 data[21]=0x00;
bokunimowakaru 3:d7263b5155bf 4005 #else
bokunimowakaru 3:d7263b5155bf 4006 if( data[18]==0x00 && data[19]==0x03 && data[20]==0x00 ){ // XBeeデバイス
bokunimowakaru 3:d7263b5155bf 4007 #endif
bokunimowakaru 3:d7263b5155bf 4008 for(i=0;i<8;i++) ADR_FROM[i]=data[5+i]; // 2013.9.15 追加
bokunimowakaru 3:d7263b5155bf 4009 ret=data[21]; // デバイス名をddに代入
bokunimowakaru 3:d7263b5155bf 4010 }
bokunimowakaru 3:d7263b5155bf 4011 #ifdef DEBUG
bokunimowakaru 3:d7263b5155bf 4012 #ifdef ARM_MBED
bokunimowakaru 3:d7263b5155bf 4013 for(i=18;i<=21;i++) _xbee_debug.printf("%2X ",data[i]);
bokunimowakaru 3:d7263b5155bf 4014 _xbee_debug.printf("\n");
bokunimowakaru 3:d7263b5155bf 4015 #else //PC
bokunimowakaru 3:d7263b5155bf 4016 for(i=18;i<=21;i++) printf("%2X ",data[i]);
bokunimowakaru 3:d7263b5155bf 4017 printf("\n");
bokunimowakaru 3:d7263b5155bf 4018 #endif
bokunimowakaru 3:d7263b5155bf 4019 #endif
bokunimowakaru 3:d7263b5155bf 4020 }
bokunimowakaru 3:d7263b5155bf 4021 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 4022 xbee_log( 1, "done:xbee_ping" , ret );
bokunimowakaru 3:d7263b5155bf 4023 #endif
bokunimowakaru 3:d7263b5155bf 4024 #ifdef XBEE_WIFI_DEBUG
bokunimowakaru 3:d7263b5155bf 4025 Serial.print("DD=");
bokunimowakaru 3:d7263b5155bf 4026 for(i=18;i<=21;i++){
bokunimowakaru 3:d7263b5155bf 4027 Serial.print(data[i],HEX);
bokunimowakaru 3:d7263b5155bf 4028 Serial.print(" ");
bokunimowakaru 3:d7263b5155bf 4029 }
bokunimowakaru 3:d7263b5155bf 4030 Serial.println("");
bokunimowakaru 3:d7263b5155bf 4031 #endif
bokunimowakaru 3:d7263b5155bf 4032 return( ret );
bokunimowakaru 3:d7263b5155bf 4033 }
bokunimowakaru 3:d7263b5155bf 4034
bokunimowakaru 3:d7263b5155bf 4035 int xbee_batt(const byte *address ){
bokunimowakaru 3:d7263b5155bf 4036 /*
bokunimowakaru 3:d7263b5155bf 4037 電池電圧の確認
bokunimowakaru 3:d7263b5155bf 4038 入力:IEEEアドレスaddress
bokunimowakaru 3:d7263b5155bf 4039 出力:約2100~3600[mV]、-1=エラー
bokunimowakaru 3:d7263b5155bf 4040 注意:本コマンドは応答待ちを行うので干渉によるパケット損失があります。
bokunimowakaru 3:d7263b5155bf 4041 */
bokunimowakaru 3:d7263b5155bf 4042 int ret=-1;
bokunimowakaru 3:d7263b5155bf 4043 byte data[API_SIZE];
bokunimowakaru 3:d7263b5155bf 4044
bokunimowakaru 3:d7263b5155bf 4045 xbee_address(address); // 宛先のアドレスを設定
bokunimowakaru 3:d7263b5155bf 4046 if( xbee_tx_rx( "RAT%V", data ,0 ) > 0 ){ // 電池電圧を取得
bokunimowakaru 3:d7263b5155bf 4047 ret = (int)(((float)data[18] * 256. + (float)data[19] ) * 1.17);
bokunimowakaru 3:d7263b5155bf 4048 }
bokunimowakaru 3:d7263b5155bf 4049 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 4050 xbee_log( 1, "done:xbee_batt" , (byte)(ret/100) );
bokunimowakaru 3:d7263b5155bf 4051 #endif
bokunimowakaru 3:d7263b5155bf 4052 return( ret );
bokunimowakaru 3:d7263b5155bf 4053 }
bokunimowakaru 3:d7263b5155bf 4054
bokunimowakaru 3:d7263b5155bf 4055 byte xbee_batt_force(const byte *address ){
bokunimowakaru 3:d7263b5155bf 4056 /*
bokunimowakaru 3:d7263b5155bf 4057 電池電圧の確認
bokunimowakaru 3:d7263b5155bf 4058 入力:IEEEアドレスaddress
bokunimowakaru 3:d7263b5155bf 4059 xbee_batt_forceで測定指示を出して、xbee_rx_callで受け取ります。
bokunimowakaru 3:d7263b5155bf 4060 XBEE_RESULT.MODEに「MODE_BATT(0xE1)」が設定されるので他のリモートATレスポンスと区別することが出来ます。
bokunimowakaru 3:d7263b5155bf 4061 電圧値はXBEE_RESULT.ADC[0]に約2100~3600[mV]の範囲で応答します。
bokunimowakaru 3:d7263b5155bf 4062 */
bokunimowakaru 3:d7263b5155bf 4063 byte data[XB_AT_SIZE];
bokunimowakaru 3:d7263b5155bf 4064 byte ret = 0x00;
bokunimowakaru 3:d7263b5155bf 4065
bokunimowakaru 3:d7263b5155bf 4066 xbee_address( address ); // 送信先を指定
bokunimowakaru 3:d7263b5155bf 4067 ret = xbee_at_tx("RAT%V", data , 0); // ATISを送信
bokunimowakaru 3:d7263b5155bf 4068 if( ret > 0 ) ret = PACKET_ID;
bokunimowakaru 3:d7263b5155bf 4069 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 4070 xbee_log( 1, "done:xbee_batt_force" , ret );
bokunimowakaru 3:d7263b5155bf 4071 #endif
bokunimowakaru 3:d7263b5155bf 4072 return ( ret );
bokunimowakaru 3:d7263b5155bf 4073 }
bokunimowakaru 3:d7263b5155bf 4074
bokunimowakaru 3:d7263b5155bf 4075 #ifdef ARDUINO
bokunimowakaru 3:d7263b5155bf 4076 byte xbee_gpio_config(const byte *address, const byte port, byte type ){
bokunimowakaru 3:d7263b5155bf 4077 #else
bokunimowakaru 3:d7263b5155bf 4078 #ifdef ARM_MBED
bokunimowakaru 3:d7263b5155bf 4079 byte xbee_gpio_config(const byte *address, const byte port, byte type ){
bokunimowakaru 3:d7263b5155bf 4080 #else
bokunimowakaru 3:d7263b5155bf 4081 byte xbee_gpio_config(const byte *address, const byte port, const enum xbee_port_type type ){
bokunimowakaru 3:d7263b5155bf 4082 #endif
bokunimowakaru 3:d7263b5155bf 4083 #endif
bokunimowakaru 3:d7263b5155bf 4084 /*
bokunimowakaru 3:d7263b5155bf 4085 入力:IEEEアドレスaddress、GPIOポート番号port、設定値type
bokunimowakaru 3:d7263b5155bf 4086 enum xbee_port_type{ DISABLE=0, VENDER=1, AIN=2, DIN=3, DOUT_L=4, DOUT_H=5 };
bokunimowakaru 3:d7263b5155bf 4087
bokunimowakaru 3:d7263b5155bf 4088 port: port指定 IO名 ピン番号 共用 USB評価ボード(XBIB-U-Dev)
bokunimowakaru 3:d7263b5155bf 4089 port= 0 DIO0 XBee_pin 20 (Cms) SW Commision コミッションボタン
bokunimowakaru 3:d7263b5155bf 4090 port= 1 DIO1 XBee_pin 19 (AD1) SW2 汎用入力用(DIN or AIN)
bokunimowakaru 3:d7263b5155bf 4091 port= 2 DIO2 XBee_pin 18 (AD2) SW3 汎用入力用(DIN or AIN)
bokunimowakaru 3:d7263b5155bf 4092 port= 3 DIO3 XBee_pin 17 (AD3) SW4 汎用入力用(DIN or AIN)
bokunimowakaru 3:d7263b5155bf 4093 port= 4 DIO4 XBee_pin 16 (RTS) LED3 汎用出力用
bokunimowakaru 3:d7263b5155bf 4094 port= 5 DIO5 XBee_pin 15 (Ass) ASSOSIATE indication
bokunimowakaru 3:d7263b5155bf 4095 port=10 DIO10 XBee_pin 6 (RSSI) RSSI indication (PWM)
bokunimowakaru 3:d7263b5155bf 4096 port=11 DIO11 XBee_pin 7 LED2 汎用出力用
bokunimowakaru 3:d7263b5155bf 4097 port=12 DIO12 XBee_pin 4 LED1 汎用出力用
bokunimowakaru 3:d7263b5155bf 4098
bokunimowakaru 3:d7263b5155bf 4099 注意:本コマンドは応答待ちを行うので干渉によるパケット損失があります。
bokunimowakaru 3:d7263b5155bf 4100 */
bokunimowakaru 3:d7263b5155bf 4101 byte ret=0xFF;
bokunimowakaru 3:d7263b5155bf 4102 byte data[API_SIZE];
bokunimowakaru 3:d7263b5155bf 4103 char at[] = "RATD0" ; // ATコマンド
bokunimowakaru 3:d7263b5155bf 4104 byte dd=0xFF; // デバイス名
bokunimowakaru 3:d7263b5155bf 4105
bokunimowakaru 3:d7263b5155bf 4106 switch( type ){
bokunimowakaru 3:d7263b5155bf 4107 case DISABLE:
bokunimowakaru 3:d7263b5155bf 4108 if( (port >= 1 && port <= 5) || (port >= 10 && port <= 12) ) {
bokunimowakaru 3:d7263b5155bf 4109 at[4] = '0' + port;
bokunimowakaru 3:d7263b5155bf 4110 ret=0;
bokunimowakaru 3:d7263b5155bf 4111 }
bokunimowakaru 3:d7263b5155bf 4112 break;
bokunimowakaru 3:d7263b5155bf 4113 case VENDER:
bokunimowakaru 3:d7263b5155bf 4114 if( port == 0 || port == 5 || port == 10) ret=0;
bokunimowakaru 3:d7263b5155bf 4115 break;
bokunimowakaru 3:d7263b5155bf 4116 case AIN:
bokunimowakaru 3:d7263b5155bf 4117 if( port >= 1 && port <= 4 ){
bokunimowakaru 3:d7263b5155bf 4118 at[4] = '0' + port;
bokunimowakaru 3:d7263b5155bf 4119 ret=0;
bokunimowakaru 3:d7263b5155bf 4120 }else if( port == 0xFF ){
bokunimowakaru 3:d7263b5155bf 4121 ret=0;
bokunimowakaru 3:d7263b5155bf 4122 }
bokunimowakaru 3:d7263b5155bf 4123 break;
bokunimowakaru 3:d7263b5155bf 4124 case DIN:
bokunimowakaru 3:d7263b5155bf 4125 case DOUT_L:
bokunimowakaru 3:d7263b5155bf 4126 case DOUT_H:
bokunimowakaru 3:d7263b5155bf 4127 if( port >= 1 && port <= 5 ){
bokunimowakaru 3:d7263b5155bf 4128 at[4] = '0' + port;
bokunimowakaru 3:d7263b5155bf 4129 ret=0;
bokunimowakaru 3:d7263b5155bf 4130 }else if( port >= 10 && port <= 12 ){
bokunimowakaru 3:d7263b5155bf 4131 at[3] = 'P';
bokunimowakaru 3:d7263b5155bf 4132 at[4] = '0' + (port - 10);
bokunimowakaru 3:d7263b5155bf 4133 ret=0;
bokunimowakaru 3:d7263b5155bf 4134 }else if( port == 0xFF ){
bokunimowakaru 3:d7263b5155bf 4135 ret=0;
bokunimowakaru 3:d7263b5155bf 4136 }
bokunimowakaru 3:d7263b5155bf 4137 break;
bokunimowakaru 3:d7263b5155bf 4138 default:
bokunimowakaru 3:d7263b5155bf 4139 break;
bokunimowakaru 3:d7263b5155bf 4140 }
bokunimowakaru 3:d7263b5155bf 4141 if( ret==0 ){
bokunimowakaru 3:d7263b5155bf 4142 dd = xbee_ratd_myaddress(address);
bokunimowakaru 3:d7263b5155bf 4143 if( dd != 0xFF ){ // アドレス設定が正常に実施された時
bokunimowakaru 3:d7263b5155bf 4144 /*
bokunimowakaru 3:d7263b5155bf 4145 入力されたtypeがDINの時にRATICを変更する処理に対応予定(将来)
bokunimowakaru 3:d7263b5155bf 4146 RATICで状態を取得して状態or設定を追加(ポート1~5と10~12)
bokunimowakaru 3:d7263b5155bf 4147 */
bokunimowakaru 3:d7263b5155bf 4148 data[0]=(byte)type;
bokunimowakaru 3:d7263b5155bf 4149 xbee_tx_rx( at , data ,1 );
bokunimowakaru 3:d7263b5155bf 4150 }
bokunimowakaru 3:d7263b5155bf 4151 }
bokunimowakaru 3:d7263b5155bf 4152 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 4153 xbee_log( 1, "done:xbee_gpio_config" , dd );
bokunimowakaru 3:d7263b5155bf 4154 #endif
bokunimowakaru 3:d7263b5155bf 4155 return( dd );
bokunimowakaru 3:d7263b5155bf 4156 }
bokunimowakaru 3:d7263b5155bf 4157
bokunimowakaru 3:d7263b5155bf 4158 byte xbee_gpio_init(const byte *address){
bokunimowakaru 3:d7263b5155bf 4159 /*
bokunimowakaru 3:d7263b5155bf 4160 子機XBeeデバイス(リモート先)のGPIOを入力に設定する関数
bokunimowakaru 3:d7263b5155bf 4161 リモート端末の宛先を本機アドレスに設定(リモート側のボタンで親機に送信するために)
bokunimowakaru 3:d7263b5155bf 4162 入力:なし
bokunimowakaru 3:d7263b5155bf 4163 出力:デバイス名(ATDDの下2桁)、FFでエラー
bokunimowakaru 3:d7263b5155bf 4164 注意:本コマンドは応答待ちを行うので干渉によるパケット損失があります。
bokunimowakaru 3:d7263b5155bf 4165 */
bokunimowakaru 3:d7263b5155bf 4166 byte data[API_SIZE];
bokunimowakaru 3:d7263b5155bf 4167 byte dd; // デバイス名
bokunimowakaru 3:d7263b5155bf 4168
bokunimowakaru 3:d7263b5155bf 4169 dd = xbee_ratd_myaddress(address);
bokunimowakaru 3:d7263b5155bf 4170 if( dd != 0xFF){
bokunimowakaru 3:d7263b5155bf 4171 data[0]=0x01; xbee_tx_rx( "RATD0", data ,1 ); // ポート0をコミッションボタンに設定
bokunimowakaru 3:d7263b5155bf 4172 switch(dd){
bokunimowakaru 3:d7263b5155bf 4173 case DEV_TYPE_XBEE:
bokunimowakaru 3:d7263b5155bf 4174 data[0]=0x03; xbee_tx_rx( "RATD1", data ,1 ); // ポート1をデジタル入力に設定
bokunimowakaru 3:d7263b5155bf 4175 data[0]=0x03; xbee_tx_rx( "RATD2", data ,1 ); // ポート2をデジタル入力に設定
bokunimowakaru 3:d7263b5155bf 4176 data[0]=0x03; xbee_tx_rx( "RATD3", data ,1 ); // ポート3をデジタル入力に設定
bokunimowakaru 3:d7263b5155bf 4177 data[0]=0x05; xbee_tx_rx( "RATD4", data ,1 ); // ポート4をデジタル出力に設定
bokunimowakaru 3:d7263b5155bf 4178 data[0]=0x05; xbee_tx_rx( "RATP1", data ,1 ); // ポート11をデジタル出力に設定
bokunimowakaru 3:d7263b5155bf 4179 data[0]=0x05; xbee_tx_rx( "RATP2", data ,1 ); // ポート12をデジタル出力に設定
bokunimowakaru 3:d7263b5155bf 4180 data[0]=0x00;
bokunimowakaru 3:d7263b5155bf 4181 data[1]=0x0E; // ポート1~3の↓
bokunimowakaru 3:d7263b5155bf 4182 xbee_tx_rx( "RATIC", data ,2 ); // 入力値が変化したら通知するIC設定
bokunimowakaru 3:d7263b5155bf 4183 break;
bokunimowakaru 3:d7263b5155bf 4184 case DEV_TYPE_PLUG:
bokunimowakaru 3:d7263b5155bf 4185 data[0]=0x02; xbee_tx_rx( "RATD3", data ,1 ); // ポート3をアナログ入力に設定
bokunimowakaru 3:d7263b5155bf 4186 data[0]=0x04; xbee_tx_rx( "RATD4", data ,1 ); // ポート4をデジタル出力に設定
bokunimowakaru 3:d7263b5155bf 4187 // breakしない
bokunimowakaru 3:d7263b5155bf 4188 case DEV_TYPE_WALL:
bokunimowakaru 3:d7263b5155bf 4189 data[0]=0x02; xbee_tx_rx( "RATD1", data ,1 ); // ポート1をアナログ入力に設定
bokunimowakaru 3:d7263b5155bf 4190 data[0]=0x02; xbee_tx_rx( "RATD2", data ,1 ); // ポート2をアナログ入力に設定
bokunimowakaru 3:d7263b5155bf 4191 break;
bokunimowakaru 3:d7263b5155bf 4192 default:
bokunimowakaru 3:d7263b5155bf 4193 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 4194 xbee_log( 4, "ERR:gpio_init DD" , dd );
bokunimowakaru 3:d7263b5155bf 4195 #endif
bokunimowakaru 3:d7263b5155bf 4196 break;
bokunimowakaru 3:d7263b5155bf 4197 }
bokunimowakaru 3:d7263b5155bf 4198 }
bokunimowakaru 3:d7263b5155bf 4199 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 4200 xbee_log( 1, "done:gpio init" , dd );
bokunimowakaru 3:d7263b5155bf 4201 #endif
bokunimowakaru 3:d7263b5155bf 4202 return( dd );
bokunimowakaru 3:d7263b5155bf 4203 }
bokunimowakaru 3:d7263b5155bf 4204
bokunimowakaru 3:d7263b5155bf 4205 byte xbee_gpo(const byte *address, const byte port,const byte out){
bokunimowakaru 3:d7263b5155bf 4206 /*
bokunimowakaru 3:d7263b5155bf 4207 子機XBeeデバイス(リモート先)のGPIOへ出力する関数
bokunimowakaru 3:d7263b5155bf 4208 portは1~4と11~12が指定できる→port0~7と10~12に拡大
bokunimowakaru 3:d7263b5155bf 4209 出力:byte 戻り値 = 送信パケット番号PACKET_ID。0x00は失敗。
bokunimowakaru 3:d7263b5155bf 4210 port: port指定 IO名 ピン番号 USB評価ボード(XBIB-U-Dev)
bokunimowakaru 3:d7263b5155bf 4211 port= 0 DIO0 XBee_pin 20 (Cms) SW1 Commision
bokunimowakaru 3:d7263b5155bf 4212 port= 1 DIO1 XBee_pin 19 (AD1) SW2
bokunimowakaru 3:d7263b5155bf 4213 port= 2 DIO2 XBee_pin 18 (AD2) SW3
bokunimowakaru 3:d7263b5155bf 4214 port= 3 DIO3 XBee_pin 17 (AD3) SW4
bokunimowakaru 3:d7263b5155bf 4215 port= 4 DIO4 XBee_pin 11 LED3 ※port4 がLED3
bokunimowakaru 3:d7263b5155bf 4216 port=10 DIO10 XBee_pin 6 RSSI
bokunimowakaru 3:d7263b5155bf 4217 port=11 DIO11 XBee_pin 7 LED2 ※port11がLED2
bokunimowakaru 3:d7263b5155bf 4218 port=12 DIO12 XBee_pin 4 LED1 ※port12がLED1
bokunimowakaru 3:d7263b5155bf 4219 */
bokunimowakaru 3:d7263b5155bf 4220 char at[6];
bokunimowakaru 3:d7263b5155bf 4221 byte data[API_SIZE];
bokunimowakaru 3:d7263b5155bf 4222 // byte i=0;
bokunimowakaru 3:d7263b5155bf 4223 byte ret=0;
bokunimowakaru 3:d7263b5155bf 4224
bokunimowakaru 3:d7263b5155bf 4225 xbee_address(address); // 宛先のアドレスを設定
bokunimowakaru 3:d7263b5155bf 4226 at[0]='S'; at[1]='A'; at[2]='T'; at[3]=0; at[5]='\0';
bokunimowakaru 3:d7263b5155bf 4227 // at[0]='R'; // RAT(応答待ち)の場合は本行のコメントを外してRATに変更する(かなり遅くなる)
bokunimowakaru 3:d7263b5155bf 4228 if( port <= 7 ){ // port >= 0 &&
bokunimowakaru 3:d7263b5155bf 4229 at[3] = 'D';
bokunimowakaru 3:d7263b5155bf 4230 at[4] = '0' + port;
bokunimowakaru 3:d7263b5155bf 4231 }else if( port >= 10 && port <= 12 ){
bokunimowakaru 3:d7263b5155bf 4232 at[3] = 'P';
bokunimowakaru 3:d7263b5155bf 4233 at[4] = '0' + (port - 10);
bokunimowakaru 3:d7263b5155bf 4234 }
bokunimowakaru 3:d7263b5155bf 4235 if( at[3] ){
bokunimowakaru 3:d7263b5155bf 4236 data[0]=0x05; // output = H
bokunimowakaru 3:d7263b5155bf 4237 if( out == 0 ) data[0]=0x04; // output = L
bokunimowakaru 3:d7263b5155bf 4238 data[1]=0x00;
bokunimowakaru 3:d7263b5155bf 4239 ret = xbee_at_tx( at, data ,1 );
bokunimowakaru 3:d7263b5155bf 4240 if( ret > 0 ) ret = PACKET_ID;
bokunimowakaru 3:d7263b5155bf 4241 // ret = xbee_tx_rx( at, data ,1 ); // RAT(応答待ち)の場合にコメントを外す
bokunimowakaru 3:d7263b5155bf 4242 #ifdef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 4243 if( DEVICE_TYPE == XB_TYPE_WIFI20) delay(10);
bokunimowakaru 3:d7263b5155bf 4244 // S6Bで安定動作させるために必要(理由は不明)
bokunimowakaru 3:d7263b5155bf 4245 /*
bokunimowakaru 3:d7263b5155bf 4246 XBee Wi-Fiの場合はPACKET IDを0にしても応答がある。
bokunimowakaru 3:d7263b5155bf 4247 したがってSATでは応答なしATコマンドを明示して送信している。
bokunimowakaru 3:d7263b5155bf 4248 ところが、その場合ACを受信するまでコマンドが確定しない。
bokunimowakaru 3:d7263b5155bf 4249 その対策としてATACを追加で送信する。
bokunimowakaru 3:d7263b5155bf 4250 XBee ZBでもATACで応答遅延が無くなる利点があるが、パケット増加で
bokunimowakaru 3:d7263b5155bf 4251 かえって高速動作が出来なくなるので、Wi-Fiのみの対応とする。
bokunimowakaru 3:d7263b5155bf 4252 */
bokunimowakaru 3:d7263b5155bf 4253 if(ret){ // 送信データを即確定する
bokunimowakaru 3:d7263b5155bf 4254 at[0]='S'; at[1]='A'; at[2]='T';
bokunimowakaru 3:d7263b5155bf 4255 at[3]='A'; at[4]='C';
bokunimowakaru 3:d7263b5155bf 4256 xbee_at_tx( at, data ,0 );
bokunimowakaru 3:d7263b5155bf 4257 }
bokunimowakaru 3:d7263b5155bf 4258 #endif
bokunimowakaru 3:d7263b5155bf 4259 }
bokunimowakaru 3:d7263b5155bf 4260 #ifdef DEBUG
bokunimowakaru 3:d7263b5155bf 4261 lcd_goto(LCD_ROW_3);
bokunimowakaru 3:d7263b5155bf 4262 if( ret==0 ){
bokunimowakaru 3:d7263b5155bf 4263 lcd_putstr("GPO ERR:");
bokunimowakaru 3:d7263b5155bf 4264 }else{
bokunimowakaru 3:d7263b5155bf 4265 lcd_putstr("GPO OK:");
bokunimowakaru 3:d7263b5155bf 4266 }
bokunimowakaru 3:d7263b5155bf 4267 lcd_disp_hex( data[17] );
bokunimowakaru 3:d7263b5155bf 4268 #endif
bokunimowakaru 3:d7263b5155bf 4269 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 4270 xbee_log( 1, "done:xbee_gpo" , ret );
bokunimowakaru 3:d7263b5155bf 4271 #endif
bokunimowakaru 3:d7263b5155bf 4272 return(ret);
bokunimowakaru 3:d7263b5155bf 4273 }
bokunimowakaru 3:d7263b5155bf 4274
bokunimowakaru 3:d7263b5155bf 4275 #ifdef EASY_GPI
bokunimowakaru 3:d7263b5155bf 4276 byte xbee_gpi(const byte *address, const byte port){
bokunimowakaru 3:d7263b5155bf 4277 /* リモート先(ADR_FROMに入力)のGPIOの入力値を応答するAPI
bokunimowakaru 3:d7263b5155bf 4278
bokunimowakaru 3:d7263b5155bf 4279 ★注意:本コマンドは応答待ちを行うので干渉によるパケット損失があります。
bokunimowakaru 3:d7263b5155bf 4280 本コマンドでは無くxbee_forceとxbee_rx_callの組み合わせでの利用を推奨します。
bokunimowakaru 3:d7263b5155bf 4281
bokunimowakaru 3:d7263b5155bf 4282 portは1~4と11~12と0xFFが指定できる。
bokunimowakaru 3:d7263b5155bf 4283 port=0xFFでポート0~7をHEXで応答する。
bokunimowakaru 3:d7263b5155bf 4284 AINはxbee_adcを使用する。
bokunimowakaru 3:d7263b5155bf 4285 port: port指定 IO名 ピン番号 USB評価ボード(XBIB-U-Dev)
bokunimowakaru 3:d7263b5155bf 4286 port= 1 DIO1 XBee_pin 19 (AD1) SW2
bokunimowakaru 3:d7263b5155bf 4287 port= 2 DIO2 XBee_pin 18 (AD2) SW3
bokunimowakaru 3:d7263b5155bf 4288 port= 3 DIO3 XBee_pin 17 (AD3) SW4
bokunimowakaru 3:d7263b5155bf 4289 out: 指定ポートの状態 0または1、エラー時は0xFF
bokunimowakaru 3:d7263b5155bf 4290
bokunimowakaru 3:d7263b5155bf 4291 設計情報
bokunimowakaru 3:d7263b5155bf 4292 リターン信号例
bokunimowakaru 3:d7263b5155bf 4293 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
bokunimowakaru 3:d7263b5155bf 4294 7E 00 15 97 01 00 13 A2 00 -- -- -- -- -- -- 49 53 00 01 18 1E 00 00 0E 8A
bokunimowakaru 3:d7263b5155bf 4295 | len |mo|FI|送信元IEEEアドレス |Short|AT(IS) |01|MASK |AD|DATA |CS|
bokunimowakaru 3:d7263b5155bf 4296 | |de|
bokunimowakaru 3:d7263b5155bf 4297 | |__|__________________ MODE_RESP(0x97)= ATIS応答
bokunimowakaru 3:d7263b5155bf 4298 |_____|_____________________ Data Length
bokunimowakaru 3:d7263b5155bf 4299 */
bokunimowakaru 3:d7263b5155bf 4300 byte data[API_SIZE];
bokunimowakaru 3:d7263b5155bf 4301 byte ret=0xFF;
bokunimowakaru 3:d7263b5155bf 4302
bokunimowakaru 3:d7263b5155bf 4303 xbee_address(address); // 宛先のアドレスを設定
bokunimowakaru 3:d7263b5155bf 4304 if( xbee_tx_rx("RATIS", data , 0) > 0 ){
bokunimowakaru 3:d7263b5155bf 4305 // if( data[3]==MODE_RESP ){ // d[3] flame ID = 97(RAT応答)
bokunimowakaru 3:d7263b5155bf 4306 // tx_rxで data[3]はチェック済み
bokunimowakaru 3:d7263b5155bf 4307 if( port == 0xFF) ret = (data[23] & data[20]);
bokunimowakaru 3:d7263b5155bf 4308 else{
bokunimowakaru 3:d7263b5155bf 4309 if( (port >= 1) && (port <= 4) ){
bokunimowakaru 3:d7263b5155bf 4310 if( ((data[20]>>port)&0x01) == 0x00 ){ // MASK_L(20)の該当ビットが否の時
bokunimowakaru 3:d7263b5155bf 4311 data[0]=0x03; // リモート端末のポート1~3をデジタル入力(0x03)に設定
bokunimowakaru 3:d7263b5155bf 4312 if( port ==1 ) xbee_tx_rx( "RATD1", data ,1 );
bokunimowakaru 3:d7263b5155bf 4313 if( port ==2 ) xbee_tx_rx( "RATD2", data ,1 );
bokunimowakaru 3:d7263b5155bf 4314 if( port ==3 ) xbee_tx_rx( "RATD3", data ,1 );
bokunimowakaru 3:d7263b5155bf 4315 if( port ==4 ) xbee_tx_rx( "RATD4", data ,1 );
bokunimowakaru 3:d7263b5155bf 4316 wait_millisec(200);
bokunimowakaru 3:d7263b5155bf 4317 xbee_tx_rx("RATIS", data , 0); // 再度ISを実行
bokunimowakaru 3:d7263b5155bf 4318 }
bokunimowakaru 3:d7263b5155bf 4319 if( data[3]==MODE_RESP ) ret= ((data[23] >> port ) & 0x01); // 取得データDATA_L(23)を戻り値に
bokunimowakaru 3:d7263b5155bf 4320 } else if( (port >= 11) && (port <= 12) ){
bokunimowakaru 3:d7263b5155bf 4321 if( ((data[19]>>(port-8))&0x01) == 0x00 ){ // MASK_H(19)の該当ビットが否の時
bokunimowakaru 3:d7263b5155bf 4322 data[0]=0x03; // リモート端末のポート11~12をデジタル入力(0x03)に設定
bokunimowakaru 3:d7263b5155bf 4323 if( port ==11 ) xbee_tx_rx( "RATP1", data ,1 );
bokunimowakaru 3:d7263b5155bf 4324 if( port ==12 ) xbee_tx_rx( "RATP2", data ,1 );
bokunimowakaru 3:d7263b5155bf 4325 wait_millisec(200);
bokunimowakaru 3:d7263b5155bf 4326 xbee_tx_rx("RATIS", data , 0); // 再度ISを実行
bokunimowakaru 3:d7263b5155bf 4327 }
bokunimowakaru 3:d7263b5155bf 4328 if( data[3]==MODE_RESP ) ret= ((data[22] >> (port-8))& 0x01); // 取得データDATA_H(22)を戻り値に
bokunimowakaru 3:d7263b5155bf 4329 }
bokunimowakaru 3:d7263b5155bf 4330 }
bokunimowakaru 3:d7263b5155bf 4331 // }
bokunimowakaru 3:d7263b5155bf 4332 }
bokunimowakaru 3:d7263b5155bf 4333 #ifdef DEBUG
bokunimowakaru 3:d7263b5155bf 4334 lcd_goto(LCD_ROW_3);
bokunimowakaru 3:d7263b5155bf 4335 lcd_putstr("port"); lcd_disp_hex( port ); lcd_putstr("="); lcd_disp_hex( ret ); // 戻り値
bokunimowakaru 3:d7263b5155bf 4336 lcd_goto(LCD_ROW_4);
bokunimowakaru 3:d7263b5155bf 4337 lcd_putstr(" f:"); lcd_disp_hex( data[3]);
bokunimowakaru 3:d7263b5155bf 4338 lcd_putstr(" M:"); lcd_disp_hex( data[19] ); lcd_disp_hex( data[20] ); // MASK表示
bokunimowakaru 3:d7263b5155bf 4339 lcd_putstr(" D:"); lcd_disp_hex( data[22] ); lcd_disp_hex( data[23] ); // デジタルサンプル値
bokunimowakaru 3:d7263b5155bf 4340 #endif
bokunimowakaru 3:d7263b5155bf 4341 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 4342 xbee_log( 1, "done:xbee_gpi" , ret );
bokunimowakaru 3:d7263b5155bf 4343 #endif
bokunimowakaru 3:d7263b5155bf 4344 return( ret );
bokunimowakaru 3:d7263b5155bf 4345 }
bokunimowakaru 3:d7263b5155bf 4346 #endif // EASY_GPI
bokunimowakaru 3:d7263b5155bf 4347
bokunimowakaru 3:d7263b5155bf 4348 #ifdef EASY_ADC
bokunimowakaru 3:d7263b5155bf 4349 unsigned int xbee_adc(const byte *address, const byte port){
bokunimowakaru 3:d7263b5155bf 4350 /* リモート先(addressに入力)のADCの入力値を応答するAPI
bokunimowakaru 3:d7263b5155bf 4351 portは1~3が指定できる。指定したportがADC入力でない場合はADC入力に切り替える。
bokunimowakaru 3:d7263b5155bf 4352 port: port指定 IO名 ピン番号 USB評価ボード(XBIB-U-Dev)
bokunimowakaru 3:d7263b5155bf 4353 port= 1 DIO1 XBee_pin 19 (AD1) SW2
bokunimowakaru 3:d7263b5155bf 4354 port= 2 DIO2 XBee_pin 18 (AD2) SW3
bokunimowakaru 3:d7263b5155bf 4355 port= 3 DIO3 XBee_pin 17 (AD3) SW4
bokunimowakaru 3:d7263b5155bf 4356 out: ADC値
bokunimowakaru 3:d7263b5155bf 4357
bokunimowakaru 3:d7263b5155bf 4358 設計情報
bokunimowakaru 3:d7263b5155bf 4359 リターン信号例
bokunimowakaru 3:d7263b5155bf 4360 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
bokunimowakaru 3:d7263b5155bf 4361 7E 00 17 97 01 00 13 A2 00 -- -- -- -- -- -- 49 53 00 01 18 16 08 18 06 00 00 7A
bokunimowakaru 3:d7263b5155bf 4362 | len |mo|FI|送信元IEEEアドレス |Short|AT(IS) |01|GPIO |AD|GPIO |ADC |CS
bokunimowakaru 3:d7263b5155bf 4363 | |de| | |Adrss| |01|MASK |MS|DATA |DATA |
bokunimowakaru 3:d7263b5155bf 4364 | | | | | |
bokunimowakaru 3:d7263b5155bf 4365 | | | ADC MASK________________|__|
bokunimowakaru 3:d7263b5155bf 4366 | |__|__________________ MODE_RESP(0x97)= ATIS応答
bokunimowakaru 3:d7263b5155bf 4367 |_____|_____________________ Data Length
bokunimowakaru 3:d7263b5155bf 4368
bokunimowakaru 3:d7263b5155bf 4369 注意:本コマンドは応答待ちを行うので干渉によるパケット損失があります。
bokunimowakaru 3:d7263b5155bf 4370 */
bokunimowakaru 3:d7263b5155bf 4371 byte data[API_SIZE];
bokunimowakaru 3:d7263b5155bf 4372 byte ports=1;
bokunimowakaru 3:d7263b5155bf 4373 unsigned int ret=0xFFFF;
bokunimowakaru 3:d7263b5155bf 4374
bokunimowakaru 3:d7263b5155bf 4375 xbee_address(address); // 宛先のアドレスを設定
bokunimowakaru 3:d7263b5155bf 4376 if( xbee_tx_rx("RATIS", data , 0) > 0 ){
bokunimowakaru 3:d7263b5155bf 4377 if( data[3]==MODE_RESP ){ // d[3] flame ID = 97(MODE_RESP)
bokunimowakaru 3:d7263b5155bf 4378 if( (port >= 1) && (port <= 3) ){
bokunimowakaru 3:d7263b5155bf 4379 if( ((data[21]>>port ) & 0x01) == 0x00 ){ // MASKの該当ビットが否の時
bokunimowakaru 3:d7263b5155bf 4380 data[0]=0x02; // リモート端末のポート1~3をADC入力(0x02)に設定
bokunimowakaru 3:d7263b5155bf 4381 if( port == 1 ) xbee_tx_rx( "RATD1", data ,1 );
bokunimowakaru 3:d7263b5155bf 4382 if( port == 2 ) xbee_tx_rx( "RATD2", data ,1 );
bokunimowakaru 3:d7263b5155bf 4383 if( port == 3 ) xbee_tx_rx( "RATD3", data ,1 );
bokunimowakaru 3:d7263b5155bf 4384 wait_millisec(1000);
bokunimowakaru 3:d7263b5155bf 4385 xbee_tx_rx("RATIS", data , 0); // 再度ISを実行
bokunimowakaru 3:d7263b5155bf 4386 }
bokunimowakaru 3:d7263b5155bf 4387 if( (port == 2) && ((data[21]>>1)&0x01) ) ports =2; // port2指定でport1がADCならデータは2個
bokunimowakaru 3:d7263b5155bf 4388 else if ( port == 3 ){
bokunimowakaru 3:d7263b5155bf 4389 if( (data[21]>>2)&(data[21]>>1)&0x01 ) ports =3; // port3指定でport1と2がADCならデータは3個
bokunimowakaru 3:d7263b5155bf 4390 else if( ((data[21]>>2)|(data[21]>>1))&0x01 ) ports =2; // port3指定でport1か2の片方がADCならデータは2個
bokunimowakaru 3:d7263b5155bf 4391 }
bokunimowakaru 3:d7263b5155bf 4392 if( data[3]==MODE_RESP ) ret= (unsigned int)data[22+ports*2]*256 + (unsigned int)data[23+ports*2];
bokunimowakaru 3:d7263b5155bf 4393 // 取得データを戻り値に
bokunimowakaru 3:d7263b5155bf 4394 }
bokunimowakaru 3:d7263b5155bf 4395 }
bokunimowakaru 3:d7263b5155bf 4396 }
bokunimowakaru 3:d7263b5155bf 4397 #ifdef DEBUG
bokunimowakaru 3:d7263b5155bf 4398 lcd_goto(LCD_ROW_4); lcd_putstr("ADC "); lcd_disp_hex( port ); lcd_putstr("=");
bokunimowakaru 3:d7263b5155bf 4399 lcd_disp_hex( data[21] ); lcd_putstr(" "); lcd_disp_5( ret );
bokunimowakaru 3:d7263b5155bf 4400 #endif
bokunimowakaru 3:d7263b5155bf 4401 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 4402 xbee_log( 1, "done:xbee_adc" , ret );
bokunimowakaru 3:d7263b5155bf 4403 #endif
bokunimowakaru 3:d7263b5155bf 4404 return( ret );
bokunimowakaru 3:d7263b5155bf 4405 }
bokunimowakaru 3:d7263b5155bf 4406 #endif // EASY_ADC
bokunimowakaru 3:d7263b5155bf 4407
bokunimowakaru 3:d7263b5155bf 4408 byte xbee_force(const byte *address ){
bokunimowakaru 3:d7263b5155bf 4409 /*
bokunimowakaru 3:d7263b5155bf 4410 GPIOやXBee Sensor(XBee Sensor /L/T または /L/T/H) へ測定指示(ATIS)を送るコマンド
bokunimowakaru 3:d7263b5155bf 4411 本xbee_forceで測定指示を出して、xbee_rx_callで受け取ることを推奨します。
bokunimowakaru 3:d7263b5155bf 4412 XBee Sensor はxbee_sensor_resultでセンサー値を計算できます。
bokunimowakaru 3:d7263b5155bf 4413 入力:送信アドレス
bokunimowakaru 3:d7263b5155bf 4414 出力:送信結果(送信したAPIサービス長。送信しなかった場合は0)
bokunimowakaru 3:d7263b5155bf 4415 */
bokunimowakaru 3:d7263b5155bf 4416 byte ret = 0x00;
bokunimowakaru 3:d7263b5155bf 4417 byte null_data [] = { 0x00 };
bokunimowakaru 3:d7263b5155bf 4418
bokunimowakaru 3:d7263b5155bf 4419 xbee_address( address ); // 送信先を指定
bokunimowakaru 3:d7263b5155bf 4420 ret = xbee_at_tx("RATIS", null_data , 0); // ATISを送信
bokunimowakaru 3:d7263b5155bf 4421 if( ret > 0 ) ret = PACKET_ID;
bokunimowakaru 3:d7263b5155bf 4422 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 4423 xbee_log( 1, "done:xbee_force" , ret );
bokunimowakaru 3:d7263b5155bf 4424 #endif
bokunimowakaru 3:d7263b5155bf 4425 return ( ret );
bokunimowakaru 3:d7263b5155bf 4426 }
bokunimowakaru 3:d7263b5155bf 4427
bokunimowakaru 3:d7263b5155bf 4428 #ifdef ARDUINO
bokunimowakaru 3:d7263b5155bf 4429 float xbee_sensor_result( XBEE_RESULT *xbee_result, const byte type){
bokunimowakaru 3:d7263b5155bf 4430 #else
bokunimowakaru 3:d7263b5155bf 4431 #ifdef ARM_MBED
bokunimowakaru 3:d7263b5155bf 4432 float xbee_sensor_result( XBEE_RESULT *xbee_result, const byte type){
bokunimowakaru 3:d7263b5155bf 4433 #else
bokunimowakaru 3:d7263b5155bf 4434 float xbee_sensor_result( XBEE_RESULT *xbee_result, const enum xbee_sensor_type type ){
bokunimowakaru 3:d7263b5155bf 4435 #endif
bokunimowakaru 3:d7263b5155bf 4436 #endif
bokunimowakaru 3:d7263b5155bf 4437 /*
bokunimowakaru 3:d7263b5155bf 4438 xbee_rx_callで取得したxbee_sensorデータを値に変換するAPI(非通信)
bokunimowakaru 3:d7263b5155bf 4439 call_result情報から変換
bokunimowakaru 3:d7263b5155bf 4440 LIGHTはXBee Sensor用
bokunimowakaru 3:d7263b5155bf 4441 WATTはXBee Smart Plug用
bokunimowakaru 3:d7263b5155bf 4442
bokunimowakaru 3:d7263b5155bf 4443 入力:enum xbee_sensor_type {LIGHT,TEMP,HUMIDITY,WATT}; // センサタイプの型
bokunimowakaru 3:d7263b5155bf 4444 出力:float センサ読み取り値
bokunimowakaru 3:d7263b5155bf 4445
bokunimowakaru 3:d7263b5155bf 4446 XBee Sensor(XBee Sensor /L/T または /L/T/H) ※ 1-wire Sensor Adapterではない
bokunimowakaru 3:d7263b5155bf 4447
bokunimowakaru 3:d7263b5155bf 4448 設計情報
bokunimowakaru 3:d7263b5155bf 4449 リターン信号例
bokunimowakaru 3:d7263b5155bf 4450 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
bokunimowakaru 3:d7263b5155bf 4451 7E 00 1B 97 01 00 13 A2 00 -- -- -- -- -- -- 49 53 00 01 08 00 0E 08 00 03 E2 02 62 02 16 A1
bokunimowakaru 3:d7263b5155bf 4452 | len |mo|FI|送信元IEEEアドレス |Short|AT(IS) |01|GPIO |AD|GPIO |ADC1 |ADC2 |ADC3 |CS
bokunimowakaru 3:d7263b5155bf 4453 | |de| | |Adrss| |01|MASK |MS|DATA |DATA |DATA |DATA |
bokunimowakaru 3:d7263b5155bf 4454 | | | | | | |Light|Temp |Humidity
bokunimowakaru 3:d7263b5155bf 4455 | | | ADC MASK________________|__|
bokunimowakaru 3:d7263b5155bf 4456 | |__|__________________ MODE_RESP(0x97)= ATIS応答 [手間!]この先はMASKによって
bokunimowakaru 3:d7263b5155bf 4457 |_____|_____________________ Data Length データの無い部分は省略される
bokunimowakaru 3:d7263b5155bf 4458 */
bokunimowakaru 3:d7263b5155bf 4459
bokunimowakaru 3:d7263b5155bf 4460 float ret = -1;
bokunimowakaru 3:d7263b5155bf 4461
bokunimowakaru 3:d7263b5155bf 4462 switch(type){
bokunimowakaru 3:d7263b5155bf 4463 case LIGHT:
bokunimowakaru 3:d7263b5155bf 4464 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 4465 ret = ((float)(xbee_result->ADCIN[1]))*1.173;
bokunimowakaru 3:d7263b5155bf 4466 // (ADC1) /1023.0) * 1200
bokunimowakaru 3:d7263b5155bf 4467 #else
bokunimowakaru 3:d7263b5155bf 4468 ret = ((float)(xbee_result->ADCIN[1]))*2.444;
bokunimowakaru 3:d7263b5155bf 4469 // (ADC1) /1023.0) * 2500
bokunimowakaru 3:d7263b5155bf 4470 #endif
bokunimowakaru 3:d7263b5155bf 4471 break;
bokunimowakaru 3:d7263b5155bf 4472 case TEMP:
bokunimowakaru 3:d7263b5155bf 4473 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 4474 ret = ((float)(xbee_result->ADCIN[2]))*0.1173-50.0;
bokunimowakaru 3:d7263b5155bf 4475 // (((ADC2/1023.0) * 1200) - 500.0)/ 10.0
bokunimowakaru 3:d7263b5155bf 4476 #else
bokunimowakaru 3:d7263b5155bf 4477 ret = ((float)(xbee_result->ADCIN[2]))*0.2444-50;
bokunimowakaru 3:d7263b5155bf 4478 #endif
bokunimowakaru 3:d7263b5155bf 4479 /*
bokunimowakaru 3:d7263b5155bf 4480 XBee ルータの温度測定結果は内部温度による上昇分が加算されます。
bokunimowakaru 3:d7263b5155bf 4481 Digi社によると約4℃の上昇があるので4℃を減算して使用することを推奨している。
bokunimowakaru 3:d7263b5155bf 4482 本ライブラリでは減算していませんが、実際の温度差を測定したところ
bokunimowakaru 3:d7263b5155bf 4483 平均7.12℃の差がありました。(27.2℃~28.0℃の環境下での平均誤差)
bokunimowakaru 3:d7263b5155bf 4484 */
bokunimowakaru 3:d7263b5155bf 4485 break;
bokunimowakaru 3:d7263b5155bf 4486 case HUMIDITY:
bokunimowakaru 3:d7263b5155bf 4487 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 4488 ret = ((float)(xbee_result->ADCIN[3]))*1.173;
bokunimowakaru 3:d7263b5155bf 4489 // mVanalog = (ADC3/1023.0) * 1200
bokunimowakaru 3:d7263b5155bf 4490 #else
bokunimowakaru 3:d7263b5155bf 4491 ret = ((float)(xbee_result->ADCIN[3]))*2.444;
bokunimowakaru 3:d7263b5155bf 4492 #endif
bokunimowakaru 3:d7263b5155bf 4493 ret = (((ret * 108.2 / 33.2) / 5000 - 0.16) / 0.0062);
bokunimowakaru 3:d7263b5155bf 4494 // hum = (((mVanalog * 108.2 / 33.2) / 5000 - 0.16) / 0.0062)
bokunimowakaru 3:d7263b5155bf 4495 break;
bokunimowakaru 3:d7263b5155bf 4496 case WATT:
bokunimowakaru 3:d7263b5155bf 4497 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 4498 ret = ((float)(xbee_result->ADCIN[3]))*1.17302;
bokunimowakaru 3:d7263b5155bf 4499 #else
bokunimowakaru 3:d7263b5155bf 4500 ret = ((float)(xbee_result->ADCIN[3]))*2.44379;
bokunimowakaru 3:d7263b5155bf 4501 #endif
bokunimowakaru 3:d7263b5155bf 4502 ret = (ret * 156.0 / 47.0 - 520.0) / 180.0 * 70.71 ;
bokunimowakaru 3:d7263b5155bf 4503 if( ret < 0 ) ret = 0;
bokunimowakaru 3:d7263b5155bf 4504 // current = (mV*(156.0/47.0) - 520.0) /180.0 * .7071
bokunimowakaru 3:d7263b5155bf 4505 /* 電圧を測定していないのでワットへの変換は100Vを乗算している。*/
bokunimowakaru 3:d7263b5155bf 4506 /* XBee Smart Plugは誘導負荷が考慮されないので測定値は参考値にしかならない。
bokunimowakaru 3:d7263b5155bf 4507 (モーターなどの力率の悪いものは測れない)
bokunimowakaru 3:d7263b5155bf 4508 The XBee Smart Plug uses a hall-effect current sensor IC to detect RMS current draw
bokunimowakaru 3:d7263b5155bf 4509 from the user controlled outlet. As there is no power factor correction for inductive loads,
bokunimowakaru 3:d7263b5155bf 4510 sensor accuracy is only specified for resistive loads. Current measurements can still be
bokunimowakaru 3:d7263b5155bf 4511 made on inductive loads that fall within the product load rating, but accuracy is not
bokunimowakaru 3:d7263b5155bf 4512 guaranteed. */
bokunimowakaru 3:d7263b5155bf 4513 break;
bokunimowakaru 3:d7263b5155bf 4514 default:
bokunimowakaru 3:d7263b5155bf 4515 break;
bokunimowakaru 3:d7263b5155bf 4516 }
bokunimowakaru 3:d7263b5155bf 4517 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 4518 xbee_log( 1, "done:xbee_sensor_result" , (byte)ret );
bokunimowakaru 3:d7263b5155bf 4519 #endif
bokunimowakaru 3:d7263b5155bf 4520 return( ret );
bokunimowakaru 3:d7263b5155bf 4521 }
bokunimowakaru 3:d7263b5155bf 4522
bokunimowakaru 3:d7263b5155bf 4523 unsigned int xbee_batt_acum(byte a1, byte a2 ){
bokunimowakaru 3:d7263b5155bf 4524 return( (unsigned int)( ( (float)a1 * 256. + (float)a2 ) * 1.17 ) );
bokunimowakaru 3:d7263b5155bf 4525 }
bokunimowakaru 3:d7263b5155bf 4526
bokunimowakaru 3:d7263b5155bf 4527 byte xbee_rx_call( XBEE_RESULT *xbee_result ){
bokunimowakaru 3:d7263b5155bf 4528 /*
bokunimowakaru 3:d7263b5155bf 4529 XBeeからの受信を行うための待ち受け関数
bokunimowakaru 3:d7263b5155bf 4530 Ver 1.70以降はモード指定での待ち受け機能を削除した。
bokunimowakaru 3:d7263b5155bf 4531 mode MODE_AUTO 0x00 // 自動選択(modeに選択後のモード名が入る)
bokunimowakaru 3:d7263b5155bf 4532 mode MODE_UART 0x90 // UART Receive
bokunimowakaru 3:d7263b5155bf 4533 mode MODE_UAR2 0x91 // UART AO=0
bokunimowakaru 3:d7263b5155bf 4534 mode MODE_GPIN 0x92 // GPI data
bokunimowakaru 3:d7263b5155bf 4535 mode MODE_SENS 0x94 // XB Sensor
bokunimowakaru 3:d7263b5155bf 4536 mode MODE_IDNT 0x95 // Node Identify
bokunimowakaru 3:d7263b5155bf 4537 mode MODE_RES 0x88 // ローカルATコマンドの結果を受信
bokunimowakaru 3:d7263b5155bf 4538 mode MODE_RESP 0x97 // リモートATコマンドの結果を受信
bokunimowakaru 3:d7263b5155bf 4539 mode MODE_MODM 0x8A // Modem Statusを受信
bokunimowakaru 3:d7263b5155bf 4540 mode MODE_TXST 0x8B // UART Transmit Status を受信
bokunimowakaru 3:d7263b5155bf 4541 mode MODE_BATT 0xE1 // (独自定義)バッテリステータス RAT%Vの応答時
bokunimowakaru 3:d7263b5155bf 4542
bokunimowakaru 3:d7263b5155bf 4543 出力   :byte データ
bokunimowakaru 3:d7263b5155bf 4544 入力・出力:byte *mode モード値
bokunimowakaru 3:d7263b5155bf 4545 出力   :byte *xbee_result データの戻り値
bokunimowakaru 3:d7263b5155bf 4546       GPIデータ(無いGPIデータは0になるADCはFFFFになる)
bokunimowakaru 3:d7263b5155bf 4547        00 01 02 03 04 05 06 07 08 09 0A 0B 0C ....
bokunimowakaru 3:d7263b5155bf 4548        |GPI |ADC0 |ADC1 |ADC2 |ADC3 |\0|\0|\0|....
bokunimowakaru 3:d7263b5155bf 4549       UARTデータは最後が\0で戻り値がlength
bokunimowakaru 3:d7263b5155bf 4550 */
bokunimowakaru 3:d7263b5155bf 4551 byte data[API_SIZE];
bokunimowakaru 3:d7263b5155bf 4552 byte ret=0;
bokunimowakaru 3:d7263b5155bf 4553 byte return_MODE = 0x00;
bokunimowakaru 3:d7263b5155bf 4554 byte cache_en = 0x00;
bokunimowakaru 3:d7263b5155bf 4555 byte i, j;
bokunimowakaru 3:d7263b5155bf 4556
bokunimowakaru 3:d7263b5155bf 4557 // 各種APIによるエラー発生の解除処理
bokunimowakaru 3:d7263b5155bf 4558 #ifdef ERRLOG
bokunimowakaru 3:d7263b5155bf 4559 if( TIMER_ERR ){
bokunimowakaru 3:d7263b5155bf 4560 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 4561 xbee_log( 5, ERR_LOG , ERR_CODE ); // エラーログを出力
bokunimowakaru 3:d7263b5155bf 4562 #endif
bokunimowakaru 3:d7263b5155bf 4563 xbee_reset(); // リセットに約3秒がかかる
bokunimowakaru 3:d7263b5155bf 4564 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 4565 xbee_log( 3, "XBee Restarted" , TIMER_ERR );
bokunimowakaru 3:d7263b5155bf 4566 #endif
bokunimowakaru 3:d7263b5155bf 4567 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 4568 led_red( 0 );
bokunimowakaru 3:d7263b5155bf 4569 #endif
bokunimowakaru 3:d7263b5155bf 4570 TIMER_ERR = 0;
bokunimowakaru 3:d7263b5155bf 4571 }
bokunimowakaru 3:d7263b5155bf 4572 #endif
bokunimowakaru 3:d7263b5155bf 4573
bokunimowakaru 3:d7263b5155bf 4574 // 応答値の初期化
bokunimowakaru 3:d7263b5155bf 4575 xbee_result->MODE = 0x00; // Ver 1.70から自動受信を廃止。そのための追加
bokunimowakaru 3:d7263b5155bf 4576 xbee_result->ID = 0x00;
bokunimowakaru 3:d7263b5155bf 4577 for( i=0 ; i<8 ; i++ ) xbee_result->FROM[i] = 0x00;
bokunimowakaru 3:d7263b5155bf 4578 #ifndef ARDUINO
bokunimowakaru 3:d7263b5155bf 4579 #ifndef ARM_MBED
bokunimowakaru 3:d7263b5155bf 4580 for( i=0 ; i<2 ; i++ ) xbee_result->SHORT[i] = 0x00;
bokunimowakaru 3:d7263b5155bf 4581 #endif
bokunimowakaru 3:d7263b5155bf 4582 #endif
bokunimowakaru 3:d7263b5155bf 4583 for( i=0 ; i<2 ; i++ ){
bokunimowakaru 3:d7263b5155bf 4584 xbee_result->AT[i] = 0xFF;
bokunimowakaru 3:d7263b5155bf 4585 xbee_result->GPI.BYTE[i] = 0xFF;
bokunimowakaru 3:d7263b5155bf 4586 }
bokunimowakaru 3:d7263b5155bf 4587 xbee_result->STATUS = 0xFF;
bokunimowakaru 3:d7263b5155bf 4588 for( i=1 ; i<4 ; i++ ) xbee_result->ADCIN[i] = (unsigned int)(0xFFFF);
bokunimowakaru 3:d7263b5155bf 4589 xbee_result->ADCIN[0] = 0;
bokunimowakaru 3:d7263b5155bf 4590 #ifndef ARDUINO
bokunimowakaru 3:d7263b5155bf 4591 #ifndef ARM_MBED
bokunimowakaru 3:d7263b5155bf 4592 for( i=0 ; i<6 ; i++ ) xbee_result->ZCL[i] = 0xFF;
bokunimowakaru 3:d7263b5155bf 4593 #endif
bokunimowakaru 3:d7263b5155bf 4594 #endif
bokunimowakaru 3:d7263b5155bf 4595 for( i=0 ; i<CALL_SIZE ; i++ ) xbee_result->DATA[i] = 0x00;
bokunimowakaru 3:d7263b5155bf 4596
bokunimowakaru 3:d7263b5155bf 4597 j = 0;
bokunimowakaru 3:d7263b5155bf 4598 #ifdef CACHE_RES
bokunimowakaru 3:d7263b5155bf 4599 if( CACHE_COUNTER > 0 ){
bokunimowakaru 3:d7263b5155bf 4600 for( i=0 ; i < API_SIZE ; i++) data[i] = CACHE_MEM[0][i];
bokunimowakaru 3:d7263b5155bf 4601 /* FIFO 処理 面倒なのでメモリーをコピー */
bokunimowakaru 3:d7263b5155bf 4602 for( j=1 ; j < CACHE_COUNTER ; j++)
bokunimowakaru 3:d7263b5155bf 4603 for( i=0 ; i < API_SIZE ; i++) CACHE_MEM[j-1][i] = CACHE_MEM[j][i];
bokunimowakaru 3:d7263b5155bf 4604 CACHE_COUNTER--;
bokunimowakaru 3:d7263b5155bf 4605 return_MODE = 0xFF;
bokunimowakaru 3:d7263b5155bf 4606 cache_en = 0xFF; // キャッシュ有効 フラグ
bokunimowakaru 3:d7263b5155bf 4607 #ifdef DEBUG
bokunimowakaru 3:d7263b5155bf 4608 lcd_putstr("### CACHE_OUT ### -> "); // DEBUG
bokunimowakaru 3:d7263b5155bf 4609 lcd_disp_hex( CACHE_COUNTER );
bokunimowakaru 3:d7263b5155bf 4610 lcd_putch('\n');
bokunimowakaru 3:d7263b5155bf 4611 #endif
bokunimowakaru 3:d7263b5155bf 4612 }
bokunimowakaru 3:d7263b5155bf 4613 #endif
bokunimowakaru 3:d7263b5155bf 4614 if( cache_en == 0x00 ) return_MODE = xbee_at_rx( data ); // 受信
bokunimowakaru 3:d7263b5155bf 4615 if( return_MODE > 0x00 ){ // キャッシュがある、または受信データがある時
bokunimowakaru 3:d7263b5155bf 4616 // if( xbee_result->MODE == 0x00 || // 指定(入力)されたモード値が00(オート)
bokunimowakaru 3:d7263b5155bf 4617 // xbee_result->MODE == data[3] || // または、受信結果と一致
bokunimowakaru 3:d7263b5155bf 4618 // cache_en ){ // キャッシュ動作の時
bokunimowakaru 3:d7263b5155bf 4619 return_MODE = xbee_from_acum( data );
bokunimowakaru 3:d7263b5155bf 4620 switch( return_MODE ){
bokunimowakaru 3:d7263b5155bf 4621 case MODE_RESP: // 0x97 リモートATコマンドの結果を受信 Remote Command Response
bokunimowakaru 3:d7263b5155bf 4622 for(i=0;i<8;i++) xbee_result->FROM[i] = data[5+i]; // アドレスはdata[5]から
bokunimowakaru 3:d7263b5155bf 4623 #ifndef ARDUINO
bokunimowakaru 3:d7263b5155bf 4624 #ifndef ARM_MBED
bokunimowakaru 3:d7263b5155bf 4625 for(i=0;i<2;i++) xbee_result->SHORT[i] = data[13+i];// アドレスはdata[13]から
bokunimowakaru 3:d7263b5155bf 4626 #endif
bokunimowakaru 3:d7263b5155bf 4627 #endif
bokunimowakaru 3:d7263b5155bf 4628 // for( i=0 ; i<2 ; i++ ) xbee_result->AT[i] = data[15+i]; // ATはdata[15]から
bokunimowakaru 3:d7263b5155bf 4629 xbee_result->AT[0] = data[15];
bokunimowakaru 3:d7263b5155bf 4630 xbee_result->AT[1] = data[16];
bokunimowakaru 3:d7263b5155bf 4631 xbee_result->ID = data[4]; // PACKET_ID
bokunimowakaru 3:d7263b5155bf 4632 xbee_result->STATUS = data[17]; // statusはdata[17]
bokunimowakaru 3:d7263b5155bf 4633 ret = data[17];
bokunimowakaru 3:d7263b5155bf 4634 if( xbee_result->STATUS==0x00 ){
bokunimowakaru 3:d7263b5155bf 4635 if( xbee_result->AT[0]=='I' && xbee_result->AT[1]=='S' ){ // ATISの受信
bokunimowakaru 3:d7263b5155bf 4636 ret=(data[23] & data[20]); // GPIOの下位を受信マスクで&して応答(要約応答)
bokunimowakaru 3:d7263b5155bf 4637 if( data[19] == 0x00 && data[20] == 0x00 ){
bokunimowakaru 3:d7263b5155bf 4638 j = 1; // デジタルデータが無いとき
bokunimowakaru 3:d7263b5155bf 4639 }else{
bokunimowakaru 3:d7263b5155bf 4640 j = 0; // デジタルデータがある時
bokunimowakaru 3:d7263b5155bf 4641 xbee_result->GPI.BYTE[1] = (data[22] & data[19]); // 上位をマスクして応答
bokunimowakaru 3:d7263b5155bf 4642 xbee_result->GPI.BYTE[0] = (data[23] & data[20]); // 下位をマスクして応答
bokunimowakaru 3:d7263b5155bf 4643 for( i = 0 ; i<2 ; i++) xbee_result->DATA[i] = xbee_result->GPI.BYTE[i];
bokunimowakaru 3:d7263b5155bf 4644 }
bokunimowakaru 3:d7263b5155bf 4645 for( i=0; i < 4 ; i++ ){ // この中でjを使用している
bokunimowakaru 3:d7263b5155bf 4646 if( (data[21]>>i) & 0x01 ){ // data[21] ADCマスク
bokunimowakaru 3:d7263b5155bf 4647 xbee_result->ADCIN[i] = (unsigned int)(data[(2*i+24-2*j)]);
bokunimowakaru 3:d7263b5155bf 4648 xbee_result->ADCIN[i] *= (unsigned int)256;
bokunimowakaru 3:d7263b5155bf 4649 xbee_result->ADCIN[i] += (unsigned int)(data[2*i+25-2*j]);
bokunimowakaru 3:d7263b5155bf 4650 xbee_result->DATA[i*2+2] = data[24+2*i-2*j];
bokunimowakaru 3:d7263b5155bf 4651 xbee_result->DATA[i*2+3] = data[25+2*i-2*j];
bokunimowakaru 3:d7263b5155bf 4652 }else{
bokunimowakaru 3:d7263b5155bf 4653 xbee_result->DATA[i*2+2] = 0xFF;
bokunimowakaru 3:d7263b5155bf 4654 xbee_result->DATA[i*2+3] = 0xFF;
bokunimowakaru 3:d7263b5155bf 4655 j++;
bokunimowakaru 3:d7263b5155bf 4656 }
bokunimowakaru 3:d7263b5155bf 4657 }
bokunimowakaru 3:d7263b5155bf 4658 }else if( xbee_result->AT[0] == '%' && xbee_result->AT[1] == 'V'){ // BATTの受信
bokunimowakaru 3:d7263b5155bf 4659 return_MODE = MODE_BATT;
bokunimowakaru 3:d7263b5155bf 4660 xbee_result->GPI.BYTE[1] = data[18];
bokunimowakaru 3:d7263b5155bf 4661 xbee_result->GPI.BYTE[0] = data[19];
bokunimowakaru 3:d7263b5155bf 4662 // xbee_result->DATA[1] = data[18];
bokunimowakaru 3:d7263b5155bf 4663 // xbee_result->DATA[0] = data[19];
bokunimowakaru 3:d7263b5155bf 4664 xbee_result->ADCIN[0] = xbee_batt_acum(data[18],data[19]);
bokunimowakaru 3:d7263b5155bf 4665 }
bokunimowakaru 3:d7263b5155bf 4666 }
bokunimowakaru 3:d7263b5155bf 4667 break;
bokunimowakaru 3:d7263b5155bf 4668 case MODE_GPIN: // 0x92 GPI data を受信するモード (ZigBee IO Data Sample Ex Indicator)
bokunimowakaru 3:d7263b5155bf 4669 ret=xbee_gpi_acum( data );
bokunimowakaru 3:d7263b5155bf 4670 for(i=0;i<8;i++) xbee_result->FROM[i] = data[4+i]; // アドレスはdata[4]から
bokunimowakaru 3:d7263b5155bf 4671 #ifndef ARDUINO
bokunimowakaru 3:d7263b5155bf 4672 #ifndef ARM_MBED
bokunimowakaru 3:d7263b5155bf 4673 for(i=0;i<2;i++) xbee_result->SHORT[i] = data[12+i];// アドレスはdata[12]から
bokunimowakaru 3:d7263b5155bf 4674 #endif
bokunimowakaru 3:d7263b5155bf 4675 #endif
bokunimowakaru 3:d7263b5155bf 4676 xbee_result->STATUS = data[14]; // statusはdata[14] 0x01=Ack 0x02=broadcast
bokunimowakaru 3:d7263b5155bf 4677 if( data[16] == 0x00 && data[17] == 0x00 ){
bokunimowakaru 3:d7263b5155bf 4678 j = 1; // デジタルデータが無いとき
bokunimowakaru 3:d7263b5155bf 4679 }else{
bokunimowakaru 3:d7263b5155bf 4680 j = 0; // デジタルデータがある時
bokunimowakaru 3:d7263b5155bf 4681 xbee_result->GPI.BYTE[1] = (data[16] & data[19]); // 上位をマスクして応答
bokunimowakaru 3:d7263b5155bf 4682 xbee_result->GPI.BYTE[0] = (data[17] & data[20]); // 下位をマスクして応答
bokunimowakaru 3:d7263b5155bf 4683 for( i = 0 ; i<2 ; i++) xbee_result->DATA[i] = xbee_result->GPI.BYTE[i];
bokunimowakaru 3:d7263b5155bf 4684 }
bokunimowakaru 3:d7263b5155bf 4685 for( i=0; i < 4 ; i++ ){ // この中でjを使用している
bokunimowakaru 3:d7263b5155bf 4686 if( (data[18]>>i) & 0x01 ){
bokunimowakaru 3:d7263b5155bf 4687 xbee_result->ADCIN[i] = (unsigned int)(data[2*i+21-2*j]);
bokunimowakaru 3:d7263b5155bf 4688 xbee_result->ADCIN[i] *= (unsigned int)256;
bokunimowakaru 3:d7263b5155bf 4689 xbee_result->ADCIN[i] += (unsigned int)(data[2*i+22-2*j]);
bokunimowakaru 3:d7263b5155bf 4690 xbee_result->DATA[i*2+2] = data[21+2*i-2*j];
bokunimowakaru 3:d7263b5155bf 4691 xbee_result->DATA[i*2+3] = data[22+2*i-2*j];
bokunimowakaru 3:d7263b5155bf 4692 }else {
bokunimowakaru 3:d7263b5155bf 4693 xbee_result->DATA[i*2+2] = 0xFF;
bokunimowakaru 3:d7263b5155bf 4694 xbee_result->DATA[i*2+3] = 0xFF;
bokunimowakaru 3:d7263b5155bf 4695 j++;
bokunimowakaru 3:d7263b5155bf 4696 }
bokunimowakaru 3:d7263b5155bf 4697 //printf("ADC[%d]=%d \n",i, (int)(xbee_result->ADC[i]) );
bokunimowakaru 3:d7263b5155bf 4698 }
bokunimowakaru 3:d7263b5155bf 4699 if( (data[18]>>7) & 0x01 ){
bokunimowakaru 3:d7263b5155bf 4700 xbee_result->ADCIN[0] = xbee_batt_acum(data[29-2*j],data[30-2*j]);
bokunimowakaru 3:d7263b5155bf 4701 }
bokunimowakaru 3:d7263b5155bf 4702 // xbee_result->DATA[10]=data[2]; // 仮(受信バイト数を確認するため)
bokunimowakaru 3:d7263b5155bf 4703 break;
bokunimowakaru 3:d7263b5155bf 4704 case MODE_UART: // 0x90 UART data を受信するモード 戻り値はlength
bokunimowakaru 3:d7263b5155bf 4705 for(i=0;i<8;i++) xbee_result->FROM[i] = data[4+i]; // アドレスはdata[4]から
bokunimowakaru 3:d7263b5155bf 4706 #ifndef ARDUINO
bokunimowakaru 3:d7263b5155bf 4707 #ifndef ARM_MBED
bokunimowakaru 3:d7263b5155bf 4708 for(i=0;i<2;i++) xbee_result->SHORT[i] = data[12+i];// アドレスはdata[12]から
bokunimowakaru 3:d7263b5155bf 4709 #endif
bokunimowakaru 3:d7263b5155bf 4710 #endif
bokunimowakaru 3:d7263b5155bf 4711 xbee_result->STATUS = data[14]; // statusはdata[14]
bokunimowakaru 3:d7263b5155bf 4712 if( ( xbee_uart_acum( data )) > 0 ){ // 以上の値は仕様書に記述誤り
bokunimowakaru 3:d7263b5155bf 4713 ret = data[2]-0x0C; // 12バイト減算
bokunimowakaru 3:d7263b5155bf 4714 if( ret >= CALL_SIZE ) ret = CALL_SIZE -1;
bokunimowakaru 3:d7263b5155bf 4715 for( i=0; i<ret ; i++ ) xbee_result->DATA[i] = data[15+i];
bokunimowakaru 3:d7263b5155bf 4716 // xbee_result->DATA[i] = 0x00;
bokunimowakaru 3:d7263b5155bf 4717 xbee_result->STATUS = data[14];
bokunimowakaru 3:d7263b5155bf 4718 }
bokunimowakaru 3:d7263b5155bf 4719 break;
bokunimowakaru 3:d7263b5155bf 4720 #ifndef LITE // BeeBee Lite by 蘭
bokunimowakaru 3:d7263b5155bf 4721 case MODE_UAR2: // 0x91 UART data 2を受信するモード
bokunimowakaru 3:d7263b5155bf 4722 for(i=0;i<8;i++) xbee_result->FROM[i] = data[4+i]; // アドレスはdata[4]から
bokunimowakaru 3:d7263b5155bf 4723 #ifndef ARDUINO
bokunimowakaru 3:d7263b5155bf 4724 #ifndef ARM_MBED
bokunimowakaru 3:d7263b5155bf 4725 for(i=0;i<2;i++) xbee_result->SHORT[i] = data[12+i];// アドレスはdata[12]から
bokunimowakaru 3:d7263b5155bf 4726 for(i=0;i<6;i++) xbee_result->ZCL[i] = data[14+i]; // ZCL情報data[14]から
bokunimowakaru 3:d7263b5155bf 4727 #endif
bokunimowakaru 3:d7263b5155bf 4728 #endif
bokunimowakaru 3:d7263b5155bf 4729 xbee_result->STATUS = data[20]; // statusはdata[20]
bokunimowakaru 3:d7263b5155bf 4730 if( ( xbee_uart_acum( data )) > 0 ){
bokunimowakaru 3:d7263b5155bf 4731 ret = data[2]-0x12; // 18バイト減算
bokunimowakaru 3:d7263b5155bf 4732 if( ret >= CALL_SIZE ) ret = CALL_SIZE -1;
bokunimowakaru 3:d7263b5155bf 4733 for( i=0; i<ret ; i++ ) xbee_result->DATA[i] = data[21+i];
bokunimowakaru 3:d7263b5155bf 4734 // xbee_result->DATA[i] = 0x00;
bokunimowakaru 3:d7263b5155bf 4735 }
bokunimowakaru 3:d7263b5155bf 4736 break;
bokunimowakaru 3:d7263b5155bf 4737 #endif // LITE
bokunimowakaru 3:d7263b5155bf 4738 #ifndef LITE // BeeBee Lite by 蘭
bokunimowakaru 3:d7263b5155bf 4739 case MODE_SENS: // 0x94 XB Sensor(1-wire)を受信するモード(未確認)
bokunimowakaru 3:d7263b5155bf 4740 for(i=0;i<8;i++) xbee_result->FROM[i] = data[4+i]; // アドレスはdata[4]から
bokunimowakaru 3:d7263b5155bf 4741 #ifndef ARDUINO
bokunimowakaru 3:d7263b5155bf 4742 #ifndef ARM_MBED
bokunimowakaru 3:d7263b5155bf 4743 for(i=0;i<2;i++) xbee_result->SHORT[i] = data[12+i];// アドレスはdata[12]から
bokunimowakaru 3:d7263b5155bf 4744 #endif
bokunimowakaru 3:d7263b5155bf 4745 #endif
bokunimowakaru 3:d7263b5155bf 4746 xbee_result->STATUS = data[14]; // statusはdata[14]
bokunimowakaru 3:d7263b5155bf 4747 xbee_result->ADCIN[0] = 256*(unsigned int)data[24] + (unsigned int)data[25];
bokunimowakaru 3:d7263b5155bf 4748 for( i=1; i < 4 ; i++ ) // ADC値を代入、ただしAIN[0]へは代入しない
bokunimowakaru 3:d7263b5155bf 4749 xbee_result->ADCIN[i] = 256*(unsigned int)data[2*i+16] + (unsigned int)data[2*i+16];
bokunimowakaru 3:d7263b5155bf 4750 for( i=0; i<10 ; i++ ) xbee_result->DATA[i] = data[16+i];
bokunimowakaru 3:d7263b5155bf 4751 xbee_result->DATA[10] = data[16+i]; // sensor 01:ADC 02:Temp. 60:water present
bokunimowakaru 3:d7263b5155bf 4752 break;
bokunimowakaru 3:d7263b5155bf 4753 #endif // LITE
bokunimowakaru 3:d7263b5155bf 4754 case MODE_IDNT: // 0x95 Node Identifyを受信するモード
bokunimowakaru 3:d7263b5155bf 4755 for(i=0;i<8;i++) xbee_result->FROM[i] = data[4+i]; // アドレスはdata[4]から
bokunimowakaru 3:d7263b5155bf 4756 #ifndef ARDUINO
bokunimowakaru 3:d7263b5155bf 4757 #ifndef ARM_MBED
bokunimowakaru 3:d7263b5155bf 4758 for(i=0;i<2;i++) xbee_result->SHORT[i] = data[12+i]; // アドレスはdata[12]から
bokunimowakaru 3:d7263b5155bf 4759 for(i=0;i<CALL_SIZE && i<20;i++){
bokunimowakaru 3:d7263b5155bf 4760 xbee_result->DATA[i] = data[15+i];
bokunimowakaru 3:d7263b5155bf 4761 /*
bokunimowakaru 3:d7263b5155bf 4762 0 15 Source 16-bit address
bokunimowakaru 3:d7263b5155bf 4763 2 17 64-bit Network address
bokunimowakaru 3:d7263b5155bf 4764 10 25 NI Strings
bokunimowakaru 3:d7263b5155bf 4765 12 27 Parent address
bokunimowakaru 3:d7263b5155bf 4766 14 29 Device Type
bokunimowakaru 3:d7263b5155bf 4767 15 30 Source Event
bokunimowakaru 3:d7263b5155bf 4768 16 31 Profile ID C1 05
bokunimowakaru 3:d7263b5155bf 4769 18 33 Manufacture ID 10 1F
bokunimowakaru 3:d7263b5155bf 4770 */
bokunimowakaru 3:d7263b5155bf 4771 }
bokunimowakaru 3:d7263b5155bf 4772 #endif
bokunimowakaru 3:d7263b5155bf 4773 #endif
bokunimowakaru 3:d7263b5155bf 4774 xbee_result->STATUS = data[14]; // // statusはdata[14] 0x01=Ack 0x02=broadcast
bokunimowakaru 3:d7263b5155bf 4775 ret = data[14];
bokunimowakaru 3:d7263b5155bf 4776 switch(data[29]){
bokunimowakaru 3:d7263b5155bf 4777 case 0x00: ret=ZB_TYPE_COORD; break;
bokunimowakaru 3:d7263b5155bf 4778 case 0x01: ret=ZB_TYPE_ROUTER; break;
bokunimowakaru 3:d7263b5155bf 4779 case 0x02: ret=ZB_TYPE_ENDDEV; break;
bokunimowakaru 3:d7263b5155bf 4780 }
bokunimowakaru 3:d7263b5155bf 4781 break;
bokunimowakaru 3:d7263b5155bf 4782 case MODE_RES: // 0x88 ローカルATコマンドの結果を受信(モードのみ応答)
bokunimowakaru 3:d7263b5155bf 4783 // for( i=0 ; i<2 ; i++ ) xbee_result->AT[i] = data[5+i]; // ATはdata[15]から
bokunimowakaru 3:d7263b5155bf 4784 xbee_result->AT[0] = data[5];
bokunimowakaru 3:d7263b5155bf 4785 xbee_result->AT[1] = data[6];
bokunimowakaru 3:d7263b5155bf 4786 xbee_result->ID = data[4]; // Frame ID
bokunimowakaru 3:d7263b5155bf 4787 xbee_result->STATUS = data[7]; // statusはdata[7]
bokunimowakaru 3:d7263b5155bf 4788 ret = data[7];
bokunimowakaru 3:d7263b5155bf 4789 break;
bokunimowakaru 3:d7263b5155bf 4790 case MODE_MODM: // 0x8A Modem Statusを受信
bokunimowakaru 3:d7263b5155bf 4791 xbee_result->STATUS = data[4]; // statusはdata[4]
bokunimowakaru 3:d7263b5155bf 4792 ret = data[4];
bokunimowakaru 3:d7263b5155bf 4793 break;
bokunimowakaru 3:d7263b5155bf 4794 case MODE_TXST: // 0x8B UART Transmit Status を受信
bokunimowakaru 3:d7263b5155bf 4795 xbee_result->STATUS = data[8]; // delivery statusはdata[8] 0x00=Success
bokunimowakaru 3:d7263b5155bf 4796 ret = data[9]; // Discovery status data[9]
bokunimowakaru 3:d7263b5155bf 4797 #ifndef ARDUINO
bokunimowakaru 3:d7263b5155bf 4798 #ifndef ARM_MBED
bokunimowakaru 3:d7263b5155bf 4799 case 0x00:
bokunimowakaru 3:d7263b5155bf 4800 break;
bokunimowakaru 3:d7263b5155bf 4801 #endif
bokunimowakaru 3:d7263b5155bf 4802 #endif
bokunimowakaru 3:d7263b5155bf 4803 default:
bokunimowakaru 3:d7263b5155bf 4804 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 4805 xbee_log( 3, "CAUTION:recieved unknown pckt" , xbee_result->MODE );
bokunimowakaru 3:d7263b5155bf 4806 #endif
bokunimowakaru 3:d7263b5155bf 4807 ret = xbee_result->MODE;
bokunimowakaru 3:d7263b5155bf 4808 break;
bokunimowakaru 3:d7263b5155bf 4809 }
bokunimowakaru 3:d7263b5155bf 4810 xbee_result->MODE = return_MODE;
bokunimowakaru 3:d7263b5155bf 4811 }
bokunimowakaru 3:d7263b5155bf 4812 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 4813 // xbee_log( 1, "done:xbee_rx_call" , ret );
bokunimowakaru 3:d7263b5155bf 4814 #endif
bokunimowakaru 3:d7263b5155bf 4815 return( ret );
bokunimowakaru 3:d7263b5155bf 4816 }
bokunimowakaru 3:d7263b5155bf 4817
bokunimowakaru 3:d7263b5155bf 4818 void xbee_clear_cache(void){
bokunimowakaru 3:d7263b5155bf 4819 #ifdef CACHE_RES
bokunimowakaru 3:d7263b5155bf 4820 CACHE_COUNTER=0;
bokunimowakaru 3:d7263b5155bf 4821 #endif
bokunimowakaru 3:d7263b5155bf 4822 }
bokunimowakaru 3:d7263b5155bf 4823
bokunimowakaru 3:d7263b5155bf 4824 #ifdef EASY_SENSOR
bokunimowakaru 3:d7263b5155bf 4825 float xbee_sensor(const byte *address, const enum xbee_sensor_type type ){
bokunimowakaru 3:d7263b5155bf 4826 /* XBee Sensor(XBee Sensor /L/T または /L/T/H) の測定API (1-wire Sensor Adapterではない)
bokunimowakaru 3:d7263b5155bf 4827
bokunimowakaru 3:d7263b5155bf 4828 注意:本コマンドは応答待ちを行うので干渉によるパケット損失があります。
bokunimowakaru 3:d7263b5155bf 4829    また、センサーがスリープになっている場合はエラーになる場合が多い(タイムアウトする)
bokunimowakaru 3:d7263b5155bf 4830
bokunimowakaru 3:d7263b5155bf 4831 これらのような場合は、xbee_forceで測定指示を出して、xbee_rx_callで受信結果を得ます。
bokunimowakaru 3:d7263b5155bf 4832 XBee Sensorはxbee_sensor_resultで受信結果を温度などに変換できます。
bokunimowakaru 3:d7263b5155bf 4833
bokunimowakaru 3:d7263b5155bf 4834 入力:enum xbee_sensor_type {LIGHT,TEMP,HUMIDITY,WATT}; // センサタイプの型
bokunimowakaru 3:d7263b5155bf 4835 出力:float センサ読み取り値
bokunimowakaru 3:d7263b5155bf 4836
bokunimowakaru 3:d7263b5155bf 4837 設計情報
bokunimowakaru 3:d7263b5155bf 4838 リターン信号例
bokunimowakaru 3:d7263b5155bf 4839 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
bokunimowakaru 3:d7263b5155bf 4840 7E 00 1B 97 01 00 13 A2 00 -- -- -- -- -- -- 49 53 00 01 08 00 0E 08 00 03 E2 02 62 02 16 A1
bokunimowakaru 3:d7263b5155bf 4841 | len |mo|FI|送信元IEEEアドレス |Short|AT(IS) |01|GPIO |AD|GPIO |ADC1 |ADC2 |ADC3 |CS
bokunimowakaru 3:d7263b5155bf 4842 | |de| | |Adrss| |01|MASK |MS|DATA |DATA |DATA |DATA |
bokunimowakaru 3:d7263b5155bf 4843 | | | | | | |Light|Temp |Humidity
bokunimowakaru 3:d7263b5155bf 4844 | | | ADC MASK________________|__|
bokunimowakaru 3:d7263b5155bf 4845 | |__|__________________ MODE_RESP(0x97)= ATIS応答
bokunimowakaru 3:d7263b5155bf 4846 |_____|_____________________ Data Length
bokunimowakaru 3:d7263b5155bf 4847 */
bokunimowakaru 3:d7263b5155bf 4848 XBEE_RESULT xbee_result;
bokunimowakaru 3:d7263b5155bf 4849 byte data[API_SIZE];
bokunimowakaru 3:d7263b5155bf 4850 byte j;
bokunimowakaru 3:d7263b5155bf 4851 float ret = -1.;
bokunimowakaru 3:d7263b5155bf 4852
bokunimowakaru 3:d7263b5155bf 4853 xbee_address(address); // 宛先のアドレスを設定
bokunimowakaru 3:d7263b5155bf 4854 if( xbee_tx_rx("RATIS", data , 0) > 0 ){
bokunimowakaru 3:d7263b5155bf 4855 if( data[3]==MODE_RESP ){ // d[3] flame ID = 97(RAT応答)
bokunimowakaru 3:d7263b5155bf 4856 if( data[19] == 0x00 && data[20] == 0x00 ) j = 0; else j = 2;
bokunimowakaru 3:d7263b5155bf 4857 xbee_result.ADCIN[1] = (unsigned int)data[22+j] * 256 + (unsigned int)data[23+j];
bokunimowakaru 3:d7263b5155bf 4858 xbee_result.ADCIN[2] = (unsigned int)data[24+j] * 256 + (unsigned int)data[25+j];
bokunimowakaru 3:d7263b5155bf 4859 xbee_result.ADCIN[3] = (unsigned int)data[26+j] * 256 + (unsigned int)data[27+j];
bokunimowakaru 3:d7263b5155bf 4860 ret = xbee_sensor_result( &xbee_result, type );
bokunimowakaru 3:d7263b5155bf 4861 }
bokunimowakaru 3:d7263b5155bf 4862 }
bokunimowakaru 3:d7263b5155bf 4863 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 4864 xbee_log( 1, "done:xbee_sensor" , ret );
bokunimowakaru 3:d7263b5155bf 4865 #endif
bokunimowakaru 3:d7263b5155bf 4866 return( ret );
bokunimowakaru 3:d7263b5155bf 4867 }
bokunimowakaru 3:d7263b5155bf 4868 #endif // EASY_SENSOR
bokunimowakaru 3:d7263b5155bf 4869
bokunimowakaru 3:d7263b5155bf 4870 byte xbee_init( const byte port ){
bokunimowakaru 3:d7263b5155bf 4871 /*
bokunimowakaru 3:d7263b5155bf 4872 port:PCの場合、オープンするシリアルポート番号
bokunimowakaru 3:d7263b5155bf 4873  Arduinoの場合リトライ回数、0で永久にリトライを繰り返す
bokunimowakaru 3:d7263b5155bf 4874 戻り値:0=エラー 1=成功までのトライ回数
bokunimowakaru 3:d7263b5155bf 4875 Arduino版 portが0で無い時は、portの指定回数リトライしてエラーでもreturnする
bokunimowakaru 3:d7263b5155bf 4876 */
bokunimowakaru 3:d7263b5155bf 4877 byte i=1; // iはリセット実行リトライ回数、0で成功するまで永久
bokunimowakaru 3:d7263b5155bf 4878 byte j; // jは色々
bokunimowakaru 3:d7263b5155bf 4879 byte k=0; // kはリセット成功可否フラグ,戻り値
bokunimowakaru 3:d7263b5155bf 4880 #ifndef LITE
bokunimowakaru 3:d7263b5155bf 4881 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 4882 byte address[8]; //={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
bokunimowakaru 3:d7263b5155bf 4883 #else // XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 4884 byte address[8]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
bokunimowakaru 3:d7263b5155bf 4885 // xbee_address(address);
bokunimowakaru 3:d7263b5155bf 4886 #endif
bokunimowakaru 3:d7263b5155bf 4887 #endif
bokunimowakaru 3:d7263b5155bf 4888
bokunimowakaru 3:d7263b5155bf 4889 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 4890 xbee_log( 1, "started:xbee_init" , port );
bokunimowakaru 3:d7263b5155bf 4891 #endif
bokunimowakaru 3:d7263b5155bf 4892 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 4893 port_init(); // 汎用入出力ポートの初期化
bokunimowakaru 3:d7263b5155bf 4894 timer_sec_init(); // 秒タイマー初期化
bokunimowakaru 3:d7263b5155bf 4895 led_green( 1 );
bokunimowakaru 3:d7263b5155bf 4896 #endif
bokunimowakaru 3:d7263b5155bf 4897
bokunimowakaru 3:d7263b5155bf 4898 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 4899 sci_init( 0 ); // シリアル初期化
bokunimowakaru 3:d7263b5155bf 4900 i=port;
bokunimowakaru 3:d7263b5155bf 4901 #elif ARDUINO
bokunimowakaru 3:d7263b5155bf 4902 sci_init( 0 ); // シリアル初期化
bokunimowakaru 3:d7263b5155bf 4903 i=port;
bokunimowakaru 3:d7263b5155bf 4904 #else
bokunimowakaru 3:d7263b5155bf 4905 #ifdef ARM_MBED
bokunimowakaru 3:d7263b5155bf 4906 sci_init( 0 ); // シリアル初期化
bokunimowakaru 3:d7263b5155bf 4907 _xbee_time_init(); // Initialize Timer
bokunimowakaru 3:d7263b5155bf 4908 i=port;
bokunimowakaru 3:d7263b5155bf 4909 #else // PC
bokunimowakaru 3:d7263b5155bf 4910 if( port != 0 ){
bokunimowakaru 3:d7263b5155bf 4911 j = sci_init( port ); // シリアル初期化
bokunimowakaru 3:d7263b5155bf 4912 }else{
bokunimowakaru 3:d7263b5155bf 4913 // ポート検索
bokunimowakaru 3:d7263b5155bf 4914 for( i=10 ; i>0; i--){
bokunimowakaru 3:d7263b5155bf 4915 j = sci_init( i );
bokunimowakaru 3:d7263b5155bf 4916 if( j != 0 ){
bokunimowakaru 3:d7263b5155bf 4917 k = xbee_reset();
bokunimowakaru 3:d7263b5155bf 4918 if( k > 0 ) i = 1; else j = 0;
bokunimowakaru 3:d7263b5155bf 4919 }
bokunimowakaru 3:d7263b5155bf 4920 }
bokunimowakaru 3:d7263b5155bf 4921 }
bokunimowakaru 3:d7263b5155bf 4922 if( j == 0 ){
bokunimowakaru 3:d7263b5155bf 4923 fprintf(stderr,"EXIT:Serial Open Error\n");
bokunimowakaru 3:d7263b5155bf 4924 exit(-1);
bokunimowakaru 3:d7263b5155bf 4925 }
bokunimowakaru 3:d7263b5155bf 4926 i=1;
bokunimowakaru 3:d7263b5155bf 4927 #endif
bokunimowakaru 3:d7263b5155bf 4928 #endif
bokunimowakaru 3:d7263b5155bf 4929
bokunimowakaru 3:d7263b5155bf 4930 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 4931 #ifndef ARDUINO
bokunimowakaru 3:d7263b5155bf 4932 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 4933 lcd_enable( 1 ); // 液晶の電源投入
bokunimowakaru 3:d7263b5155bf 4934 wait_millisec(15); // 起動待ち
bokunimowakaru 3:d7263b5155bf 4935 lcd_init(); // 液晶制御ICのプレ初期化
bokunimowakaru 3:d7263b5155bf 4936 #endif
bokunimowakaru 3:d7263b5155bf 4937 #endif
bokunimowakaru 3:d7263b5155bf 4938 wait_millisec(15); // 初期化待ち
bokunimowakaru 3:d7263b5155bf 4939 lcd_init(); // 2回目の初期化(確実な初期化)
bokunimowakaru 3:d7263b5155bf 4940 #ifndef ARDUINO
bokunimowakaru 3:d7263b5155bf 4941 lcd_control(1,0,0); // 液晶制御 表示ON,カーソルOFF,点滅OFF
bokunimowakaru 3:d7263b5155bf 4942 #endif
bokunimowakaru 3:d7263b5155bf 4943 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 4944 lcd_cls(); // 液晶消去
bokunimowakaru 3:d7263b5155bf 4945 lcd_goto(LCD_ROW_1);
bokunimowakaru 3:d7263b5155bf 4946 #endif
bokunimowakaru 3:d7263b5155bf 4947 lcd_putstr( NAME );
bokunimowakaru 3:d7263b5155bf 4948 lcd_putstr(" ");
bokunimowakaru 3:d7263b5155bf 4949 lcd_putstr( VERSION );
bokunimowakaru 3:d7263b5155bf 4950 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 4951 lcd_goto(LCD_ROW_2);
bokunimowakaru 3:d7263b5155bf 4952 #else
bokunimowakaru 3:d7263b5155bf 4953 lcd_putch('\n');
bokunimowakaru 3:d7263b5155bf 4954 #endif
bokunimowakaru 3:d7263b5155bf 4955 #ifdef LITE
bokunimowakaru 3:d7263b5155bf 4956 lcd_putstr(COPYRIGHT);
bokunimowakaru 3:d7263b5155bf 4957 lcd_putch('\n');
bokunimowakaru 3:d7263b5155bf 4958 #else
bokunimowakaru 3:d7263b5155bf 4959 lcd_putstr(COPYRIGHT);
bokunimowakaru 3:d7263b5155bf 4960 #endif
bokunimowakaru 3:d7263b5155bf 4961 xbee_log( 1, "xbee_reset" , 0 );
bokunimowakaru 3:d7263b5155bf 4962 #endif
bokunimowakaru 3:d7263b5155bf 4963 #ifdef LITE // by 蘭
bokunimowakaru 3:d7263b5155bf 4964 k = xbee_reset();
bokunimowakaru 3:d7263b5155bf 4965 #ifndef H3694
bokunimowakaru 3:d7263b5155bf 4966 #ifndef ARDUINO
bokunimowakaru 3:d7263b5155bf 4967 #ifndef ARM_MBED // PC
bokunimowakaru 3:d7263b5155bf 4968 if(k==0){
bokunimowakaru 3:d7263b5155bf 4969 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 4970 xbee_log( 5, "EXIT:xbee_init:myaddress" , 0 );
bokunimowakaru 3:d7263b5155bf 4971 #endif
bokunimowakaru 3:d7263b5155bf 4972 exit(-1);
bokunimowakaru 3:d7263b5155bf 4973 }
bokunimowakaru 3:d7263b5155bf 4974 #endif
bokunimowakaru 3:d7263b5155bf 4975 #endif
bokunimowakaru 3:d7263b5155bf 4976 #endif
bokunimowakaru 3:d7263b5155bf 4977 #else // Normal mode
bokunimowakaru 3:d7263b5155bf 4978 k=1;
bokunimowakaru 3:d7263b5155bf 4979 if(i==0) while( !xbee_reset() ) wait_millisec(1000);
bokunimowakaru 3:d7263b5155bf 4980 else for(j=0;j<i;j++){
bokunimowakaru 3:d7263b5155bf 4981 k=xbee_reset(); // 0だとシリアル異常
bokunimowakaru 3:d7263b5155bf 4982 if( k ) break;
bokunimowakaru 3:d7263b5155bf 4983 wait_millisec(1000);
bokunimowakaru 3:d7263b5155bf 4984 }
bokunimowakaru 3:d7263b5155bf 4985 if(k==0){
bokunimowakaru 3:d7263b5155bf 4986 #ifndef H3694
bokunimowakaru 3:d7263b5155bf 4987 #ifndef ARDUINO
bokunimowakaru 3:d7263b5155bf 4988 #ifndef ARM_MBED // PC
bokunimowakaru 3:d7263b5155bf 4989 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 4990 xbee_log( 5, "EXIT:xbee_init:myaddress" , 0 );
bokunimowakaru 3:d7263b5155bf 4991 #endif
bokunimowakaru 3:d7263b5155bf 4992 exit(-1);
bokunimowakaru 3:d7263b5155bf 4993 #endif
bokunimowakaru 3:d7263b5155bf 4994 #endif
bokunimowakaru 3:d7263b5155bf 4995 #endif
bokunimowakaru 3:d7263b5155bf 4996 }else{ // k>0 すなわち reset成功時 以下、kは使用しないこと(戻り値にする)
bokunimowakaru 3:d7263b5155bf 4997 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 4998 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 4999 lcd_cls();
bokunimowakaru 3:d7263b5155bf 5000 lcd_goto(LCD_ROW_1);
bokunimowakaru 3:d7263b5155bf 5001 #else
bokunimowakaru 3:d7263b5155bf 5002 lcd_putstr("\n--------------------\n");
bokunimowakaru 3:d7263b5155bf 5003 #endif
bokunimowakaru 3:d7263b5155bf 5004 #endif
bokunimowakaru 3:d7263b5155bf 5005 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 5006 xbee_log( 1, "xbee_init:myaddress" , port );
bokunimowakaru 3:d7263b5155bf 5007 #endif
bokunimowakaru 3:d7263b5155bf 5008 xbee_myaddress( address ); // 自分自身のアドレスを取得
bokunimowakaru 3:d7263b5155bf 5009 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 5010 for(i=0;i<4;i++){
bokunimowakaru 3:d7263b5155bf 5011 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 5012 lcd_disp_hex(address[4+i]);
bokunimowakaru 3:d7263b5155bf 5013 #else // XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 5014 /*
bokunimowakaru 3:d7263b5155bf 5015 printf("%d",address[i]);
bokunimowakaru 3:d7263b5155bf 5016 if(i<3)printf(".");
bokunimowakaru 3:d7263b5155bf 5017 */
bokunimowakaru 3:d7263b5155bf 5018 lcd_disp_hex(address[i]);
bokunimowakaru 3:d7263b5155bf 5019 #endif
bokunimowakaru 3:d7263b5155bf 5020 }
bokunimowakaru 3:d7263b5155bf 5021 switch( DEVICE_TYPE ){
bokunimowakaru 3:d7263b5155bf 5022 #ifndef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 5023 case ZB_TYPE_COORD: lcd_putstr( " COORD."); break;
bokunimowakaru 3:d7263b5155bf 5024 case ZB_TYPE_ROUTER: lcd_putstr( " ROUTER"); break;
bokunimowakaru 3:d7263b5155bf 5025 case ZB_TYPE_ENDDEV: lcd_putstr( " ENDDEV"); break;
bokunimowakaru 3:d7263b5155bf 5026 #else
bokunimowakaru 3:d7263b5155bf 5027 case XB_TYPE_NULL: lcd_putstr( " XBee Wi-Fi"); break;
bokunimowakaru 3:d7263b5155bf 5028 case XB_TYPE_WIFI10: lcd_putstr( " XBee Wi-Fi Ver 1.0"); break;
bokunimowakaru 3:d7263b5155bf 5029 case XB_TYPE_WIFI20: lcd_putstr( " XBee Wi-Fi Ver 2.0"); break;
bokunimowakaru 3:d7263b5155bf 5030 #endif
bokunimowakaru 3:d7263b5155bf 5031 default: lcd_putstr( " UNKNWON"); break;
bokunimowakaru 3:d7263b5155bf 5032 }
bokunimowakaru 3:d7263b5155bf 5033 #ifdef H3694
bokunimowakaru 3:d7263b5155bf 5034 lcd_goto(LCD_ROW_1);
bokunimowakaru 3:d7263b5155bf 5035 #else
bokunimowakaru 3:d7263b5155bf 5036 lcd_putstr("\n\n");
bokunimowakaru 3:d7263b5155bf 5037 #endif
bokunimowakaru 3:d7263b5155bf 5038 xbee_log( 1, "done:xbee_init" , 0 );
bokunimowakaru 3:d7263b5155bf 5039 #endif
bokunimowakaru 3:d7263b5155bf 5040 }
bokunimowakaru 3:d7263b5155bf 5041 #endif
bokunimowakaru 3:d7263b5155bf 5042 return(k);
bokunimowakaru 3:d7263b5155bf 5043 }
bokunimowakaru 3:d7263b5155bf 5044
bokunimowakaru 3:d7263b5155bf 5045
bokunimowakaru 3:d7263b5155bf 5046 byte xbee_end_device(const byte *address, byte sp, byte ir, const byte pin){
bokunimowakaru 3:d7263b5155bf 5047 /*
bokunimowakaru 3:d7263b5155bf 5048 XBee子機(エンドデバイス)をスリープモードに設定する
bokunimowakaru 3:d7263b5155bf 5049 入力:byte *address = 宛先(子機)アドレス
bokunimowakaru 3:d7263b5155bf 5050 入力:byte sp = 1~28:スリープ間隔(秒)
bokunimowakaru 3:d7263b5155bf 5051 入力:byte ir = 0:自動送信切、1~65:自動送信間隔(秒)
bokunimowakaru 3:d7263b5155bf 5052 入力:byte pin = 0:通常のスリープ、 1:SLEEP_RQ端子を有効に設定
bokunimowakaru 3:d7263b5155bf 5053 出力:戻り値 = 0x00 指示成功、 その他=エラー理由
bokunimowakaru 3:d7263b5155bf 5054 1: 対応デバイス(ZigBee End Deviceなど)以外に設定しようとした
bokunimowakaru 3:d7263b5155bf 5055 2: スリープ解除しようとしたのに失敗した
bokunimowakaru 3:d7263b5155bf 5056 4: スリープ移行待ち時間ST設定の失敗
bokunimowakaru 3:d7263b5155bf 5057 8: スリープ間隔SP設定の失敗
bokunimowakaru 3:d7263b5155bf 5058 16: ローカル親機へのスリープ時間SP設定の失敗
bokunimowakaru 3:d7263b5155bf 5059 32: データ取得間隔IR設定の失敗
bokunimowakaru 3:d7263b5155bf 5060 64: スリープ状態設定の失敗
bokunimowakaru 3:d7263b5155bf 5061 128: スリープオプション設定の失敗
bokunimowakaru 3:d7263b5155bf 5062 */
bokunimowakaru 3:d7263b5155bf 5063 byte ret=0x00;
bokunimowakaru 3:d7263b5155bf 5064 byte data[API_SIZE];
bokunimowakaru 3:d7263b5155bf 5065 unsigned int time;
bokunimowakaru 3:d7263b5155bf 5066
bokunimowakaru 3:d7263b5155bf 5067 xbee_address( address ); // 送信先を指定
bokunimowakaru 3:d7263b5155bf 5068
bokunimowakaru 3:d7263b5155bf 5069 if( sp == 0x00 ){
bokunimowakaru 3:d7263b5155bf 5070 data[0] = 0x00;
bokunimowakaru 3:d7263b5155bf 5071 if( !xbee_tx_rx("RATSM",data,1) ) ret|=2; // スリープ解除
bokunimowakaru 3:d7263b5155bf 5072 }else{
bokunimowakaru 3:d7263b5155bf 5073 #ifdef XBEE_WIFI
bokunimowakaru 3:d7263b5155bf 5074 if(DEVICE_TYPE == XB_TYPE_WIFI20){
bokunimowakaru 3:d7263b5155bf 5075 return(1);
bokunimowakaru 3:d7263b5155bf 5076 }
bokunimowakaru 3:d7263b5155bf 5077 data[0] = 0x01;
bokunimowakaru 3:d7263b5155bf 5078 data[1] = 0x40; // スリープ時間 sleep_time
bokunimowakaru 3:d7263b5155bf 5079 if( !xbee_tx_rx("RATSO",data,2) ) ret|=128;
bokunimowakaru 3:d7263b5155bf 5080 #endif
bokunimowakaru 3:d7263b5155bf 5081
bokunimowakaru 3:d7263b5155bf 5082 #ifndef XBEE_WIFI // ZigBee
bokunimowakaru 3:d7263b5155bf 5083 /* XBee★親機★にXBee子機のデータ保持期間(28秒)を設定 */
bokunimowakaru 3:d7263b5155bf 5084 data[0] = 0x0A;
bokunimowakaru 3:d7263b5155bf 5085 data[1] = 0xF0; // スリープ時間 sleep_time
bokunimowakaru 3:d7263b5155bf 5086 if( !xbee_tx_rx("ATSP",data,2) ) ret|=16; // 保持時間 sleep_time
bokunimowakaru 3:d7263b5155bf 5087 #endif
bokunimowakaru 3:d7263b5155bf 5088
bokunimowakaru 3:d7263b5155bf 5089 /* XBee子機から自動送信する周期を設定します */
bokunimowakaru 3:d7263b5155bf 5090 if( ir > 65 ) ir = 65;
bokunimowakaru 3:d7263b5155bf 5091 time = (unsigned int)ir * 1000; // ms単位の数字に変換
bokunimowakaru 3:d7263b5155bf 5092 data[0] = (byte)(time / 256);
bokunimowakaru 3:d7263b5155bf 5093 data[1] = (byte)(time % 256); // スリープ時間 sleep_time
bokunimowakaru 3:d7263b5155bf 5094 if( !xbee_tx_rx("RATIR",data,2) ) ret|=32;
bokunimowakaru 3:d7263b5155bf 5095
bokunimowakaru 3:d7263b5155bf 5096 /* XBee子機のスリープ移行待ち時間を設定します */
bokunimowakaru 3:d7263b5155bf 5097 data[0]=0x01; data[1]=0xF4; // 保持時間 500 ms
bokunimowakaru 3:d7263b5155bf 5098 if( !xbee_tx_rx("RATST",data,2) ) ret|=4;
bokunimowakaru 3:d7263b5155bf 5099
bokunimowakaru 3:d7263b5155bf 5100 /* XBee子機のスリープ間隔を設定します */
bokunimowakaru 3:d7263b5155bf 5101 if( sp > 28 ) sp = 28;
bokunimowakaru 3:d7263b5155bf 5102 time = (unsigned int)sp * 100; // 10ms単位の数字に変換
bokunimowakaru 3:d7263b5155bf 5103 data[0] = (byte)(time / 256);
bokunimowakaru 3:d7263b5155bf 5104 data[1] = (byte)(time % 256); // スリープ時間 sleep_time
bokunimowakaru 3:d7263b5155bf 5105 if( !xbee_tx_rx("RATSP",data,2) ) ret|=8;
bokunimowakaru 3:d7263b5155bf 5106
bokunimowakaru 3:d7263b5155bf 5107 /* XBee子機をサイクリックスリープに設定します */
bokunimowakaru 3:d7263b5155bf 5108 if( pin ) data[0]=0x05; else data[0]=0x04; // 0x00:常に動作 0x04:低消費電力動作
bokunimowakaru 3:d7263b5155bf 5109 if( !xbee_tx_rx("RATSM",data,1) ) ret|=64; // 0x05:SLEEP_RQ有効
bokunimowakaru 3:d7263b5155bf 5110 }
bokunimowakaru 3:d7263b5155bf 5111
bokunimowakaru 3:d7263b5155bf 5112 #ifdef LCD_H
bokunimowakaru 3:d7263b5155bf 5113 xbee_log( 1, "done:end_device" , ret );
bokunimowakaru 3:d7263b5155bf 5114 #endif
bokunimowakaru 3:d7263b5155bf 5115 return( ret );
bokunimowakaru 3:d7263b5155bf 5116 }
bokunimowakaru 3:d7263b5155bf 5117
bokunimowakaru 3:d7263b5155bf 5118 #ifndef LITE
bokunimowakaru 3:d7263b5155bf 5119 byte _xbee_i2c(byte dio,byte level,byte *data){
bokunimowakaru 3:d7263b5155bf 5120 /* dio = 11:SCL 12:SDA
bokunimowakaru 3:d7263b5155bf 5121 level = 0:L 1:Open
bokunimowakaru 3:d7263b5155bf 5122 data ATコマンド応答用データ
bokunimowakaru 3:d7263b5155bf 5123
bokunimowakaru 3:d7263b5155bf 5124 data[0]=0x03; xbee_at_tx("SATP1",data,1); // Port 11(SCL) H Imp
bokunimowakaru 3:d7263b5155bf 5125 data[0]=0x04; xbee_at_tx("SATP1",data,1); // Port 11(SCL) L Out
bokunimowakaru 3:d7263b5155bf 5126 data[0]=0x03; xbee_at_tx("SATP2",data,1); // Port 12(SDA) H Imp
bokunimowakaru 3:d7263b5155bf 5127 data[0]=0x04; xbee_at_tx("SATP2",data,1); // Port 12(SDA) L Out
bokunimowakaru 3:d7263b5155bf 5128 */
bokunimowakaru 3:d7263b5155bf 5129 char at[6]="SATPX";
bokunimowakaru 3:d7263b5155bf 5130 if(dio>=10) dio = dio%10;
bokunimowakaru 3:d7263b5155bf 5131 if(dio>=2) dio=2; else dio=1;
bokunimowakaru 3:d7263b5155bf 5132 at[4]='0'+dio;
bokunimowakaru 3:d7263b5155bf 5133 data[0]=level;
bokunimowakaru 3:d7263b5155bf 5134 if(level>=10) data[0]=level%10;
bokunimowakaru 3:d7263b5155bf 5135 if(level==0) data[0]=4; // Out Low
bokunimowakaru 3:d7263b5155bf 5136 if(level==1) data[0]=3; // High Imp
bokunimowakaru 3:d7263b5155bf 5137 return( xbee_at_tx(at,data,1) ); // 戻り値:0ならエラー発生
bokunimowakaru 3:d7263b5155bf 5138 }
bokunimowakaru 3:d7263b5155bf 5139
bokunimowakaru 3:d7263b5155bf 5140 byte _xbee_i2c_start(byte *data){
bokunimowakaru 3:d7263b5155bf 5141 byte ret=1; // 戻り値:0ならエラー発生
bokunimowakaru 3:d7263b5155bf 5142 ret *= _xbee_i2c(1/*SCL*/,1,data); // Port 11(SCL) H Imp
bokunimowakaru 3:d7263b5155bf 5143 ret *= xbee_tx_rx("RATAC",data,0); // クロックHレベル固定
bokunimowakaru 3:d7263b5155bf 5144 ret *= _xbee_i2c(2/*SDA*/,1,data); // Port 12(SDA) H Imp
bokunimowakaru 3:d7263b5155bf 5145 ret *= _xbee_i2c(2/*SDA*/,0,data); // Port 12(SDA) L Out
bokunimowakaru 3:d7263b5155bf 5146 ret *= _xbee_i2c(1/*SCL*/,0,data); // Port 11(SCL) L Out
bokunimowakaru 3:d7263b5155bf 5147 if(ret==0) xbee_log( 5, "ERROR:Failed I2C TX Output" , ret );
bokunimowakaru 3:d7263b5155bf 5148 return(ret);
bokunimowakaru 3:d7263b5155bf 5149 }
bokunimowakaru 3:d7263b5155bf 5150
bokunimowakaru 3:d7263b5155bf 5151 byte _xbee_i2c_tx(const byte in, byte *data){
bokunimowakaru 3:d7263b5155bf 5152 byte i;
bokunimowakaru 3:d7263b5155bf 5153 for(i=0;i<8;i++){
bokunimowakaru 3:d7263b5155bf 5154 if( (in>>(7-i))&0x01 ){
bokunimowakaru 3:d7263b5155bf 5155 _xbee_i2c(2/*SDA*/,1,data); // Port 12(SDA) H Imp
bokunimowakaru 3:d7263b5155bf 5156 }else _xbee_i2c(2/*SDA*/,0,data); // Port 12(SDA) L Out
bokunimowakaru 3:d7263b5155bf 5157 /*Clock*/
bokunimowakaru 3:d7263b5155bf 5158 _xbee_i2c(1/*SCL*/,1,data); // Port 11(SCL) H Imp
bokunimowakaru 3:d7263b5155bf 5159 _xbee_i2c(1/*SCL*/,0,data); // Port 11(SCL) L Out
bokunimowakaru 3:d7263b5155bf 5160 }
bokunimowakaru 3:d7263b5155bf 5161 /* ACK受信待ち(ACKはスレーブから) */
bokunimowakaru 3:d7263b5155bf 5162 _xbee_i2c(1/*SCL*/,1,data); // Port 11(SCL) H Imp
bokunimowakaru 3:d7263b5155bf 5163 _xbee_i2c(2/*SDA*/,1,data); // Port 12(SDA) H Imp 逆
bokunimowakaru 3:d7263b5155bf 5164 // xbee_tx_rx("RATAC",data,0); // 本来は不要だがEnd Deviceの時にRATISを確実に受信するために入れてみた
bokunimowakaru 3:d7263b5155bf 5165 i=xbee_tx_rx("RATIS",data,0);
bokunimowakaru 3:d7263b5155bf 5166 if( i==0) xbee_log( 5, "ERROR:I2C no RAT RESP" , i );
bokunimowakaru 3:d7263b5155bf 5167 if( (data[22]>>4)&0x01 ){
bokunimowakaru 3:d7263b5155bf 5168 xbee_log( 5, "ERROR:I2C no ACK" , data[22] );
bokunimowakaru 3:d7263b5155bf 5169 i=0;
bokunimowakaru 3:d7263b5155bf 5170 }
bokunimowakaru 3:d7263b5155bf 5171 // printf("ACK=%d ATIS=%d\n",(data[22]>>4)&0x01,i);
bokunimowakaru 3:d7263b5155bf 5172 return(i);
bokunimowakaru 3:d7263b5155bf 5173 }
bokunimowakaru 3:d7263b5155bf 5174
bokunimowakaru 3:d7263b5155bf 5175 byte xbee_i2c_init(const byte *address){
bokunimowakaru 3:d7263b5155bf 5176 /*
bokunimowakaru 3:d7263b5155bf 5177 XBee I2Cインタフェースとして使用するための初期設定
bokunimowakaru 3:d7263b5155bf 5178 入力:byte *address リモートXBee子機のIEEEアドレス
bokunimowakaru 3:d7263b5155bf 5179 */
bokunimowakaru 3:d7263b5155bf 5180 byte data[API_SIZE];
bokunimowakaru 3:d7263b5155bf 5181 byte i;
bokunimowakaru 3:d7263b5155bf 5182 for(i=3;i>0;i--){ // リトライ3回まで
bokunimowakaru 3:d7263b5155bf 5183 xbee_address(address);
bokunimowakaru 3:d7263b5155bf 5184 _xbee_i2c(1/*SCL*/,1,data); // Port 11(SCL) H Imp
bokunimowakaru 3:d7263b5155bf 5185 _xbee_i2c(2/*SDA*/,1,data); // Port 12(SDA) H Imp
bokunimowakaru 3:d7263b5155bf 5186 if( xbee_tx_rx("RATIS",data,0) ){
bokunimowakaru 3:d7263b5155bf 5187 if( ((data[22]>>3)&0x03) == 0 ) break;
bokunimowakaru 3:d7263b5155bf 5188 }
bokunimowakaru 3:d7263b5155bf 5189 }
bokunimowakaru 3:d7263b5155bf 5190 delay(200);
bokunimowakaru 3:d7263b5155bf 5191 return(i);
bokunimowakaru 3:d7263b5155bf 5192 }
bokunimowakaru 3:d7263b5155bf 5193
bokunimowakaru 3:d7263b5155bf 5194 byte xbee_i2c_read(const byte *address, byte adr, byte *rx, byte len){
bokunimowakaru 3:d7263b5155bf 5195 /*
bokunimowakaru 3:d7263b5155bf 5196 子機XBeeデバイス(リモート先)のI2Cから指定バイトの情報を読み取る関数
bokunimowakaru 3:d7263b5155bf 5197 入力:byte *address = リモートXBee子機のIEEEアドレス
bokunimowakaru 3:d7263b5155bf 5198 入力:byte adr = I2Cアドレス /SHT 温度測定時0x01 湿度測定時0x02
bokunimowakaru 3:d7263b5155bf 5199 出力:byte *rx = 受信データ用ポインタ
bokunimowakaru 3:d7263b5155bf 5200 入力:byte len = 受信長、0の時は Sensirion SHT用2バイト受信
bokunimowakaru 3:d7263b5155bf 5201 port=11 DIO11 XBee_pin 7 SCL
bokunimowakaru 3:d7263b5155bf 5202 port=12 DIO12 XBee_pin 4 SDA
bokunimowakaru 3:d7263b5155bf 5203 ・I2Cマスタ機能のみを実装(スレーブとしては動作しない)
bokunimowakaru 3:d7263b5155bf 5204 ・7ビットアドレスのみ対応
bokunimowakaru 3:d7263b5155bf 5205 ・1バイトの受信に5秒以上かかる(かなり遅いし、多量のXBee通信が発生する)
bokunimowakaru 3:d7263b5155bf 5206 */
bokunimowakaru 3:d7263b5155bf 5207 byte data[API_SIZE];
bokunimowakaru 3:d7263b5155bf 5208 byte ret,i,sht=0;
bokunimowakaru 3:d7263b5155bf 5209
bokunimowakaru 3:d7263b5155bf 5210 xbee_address(address); // 宛先のアドレスを設定
bokunimowakaru 3:d7263b5155bf 5211 if(len){ // stop シーケンス + start シーケンス
bokunimowakaru 3:d7263b5155bf 5212 _xbee_i2c_start(data);
bokunimowakaru 3:d7263b5155bf 5213 }else{ // Sensirion SHT用 TS シーケンス
bokunimowakaru 3:d7263b5155bf 5214 _xbee_i2c(1/*SCL*/,0,data); // Port 11(SCL) L Out
bokunimowakaru 3:d7263b5155bf 5215 _xbee_i2c(1/*SCL*/,1,data); // Port 11(SCL) H Imp
bokunimowakaru 3:d7263b5155bf 5216 _xbee_i2c(2/*SDA*/,0,data); // Port 12(SDA) L Out
bokunimowakaru 3:d7263b5155bf 5217 _xbee_i2c(1/*SCL*/,0,data); // Port 11(SCL) L Out
bokunimowakaru 3:d7263b5155bf 5218 _xbee_i2c(1/*SCL*/,1,data); // Port 11(SCL) H Imp
bokunimowakaru 3:d7263b5155bf 5219 _xbee_i2c(2/*SDA*/,1,data); // Port 12(SDA) H Imp
bokunimowakaru 3:d7263b5155bf 5220 _xbee_i2c(1/*SCL*/,0,data); // Port 11(SCL) L Out
bokunimowakaru 3:d7263b5155bf 5221 _xbee_i2c(2/*SDA*/,0,data); // Port 12(SDA) L Out
bokunimowakaru 3:d7263b5155bf 5222 sht=1; len=2; // SHTモード
bokunimowakaru 3:d7263b5155bf 5223 xbee_tx_rx("RATAC",data,0);
bokunimowakaru 3:d7263b5155bf 5224 adr = adr<<1;
bokunimowakaru 3:d7263b5155bf 5225 }
bokunimowakaru 3:d7263b5155bf 5226 adr |= 0x01; // RW=1 受信モード
bokunimowakaru 3:d7263b5155bf 5227 if( _xbee_i2c_tx(adr, data)==0 ) return(0); // アドレス設定
bokunimowakaru 3:d7263b5155bf 5228 if( !sht ){ // SHTセンサで無い時
bokunimowakaru 3:d7263b5155bf 5229 _xbee_i2c(2/*SDA*/,0,data); // Port 12(SDA) L Out
bokunimowakaru 3:d7263b5155bf 5230 _xbee_i2c(1/*SCL*/,0,data); // Port 11(SCL) L Out
bokunimowakaru 3:d7263b5155bf 5231 }
bokunimowakaru 3:d7263b5155bf 5232
bokunimowakaru 3:d7263b5155bf 5233 /* スレーブ待機状態待ち */
bokunimowakaru 3:d7263b5155bf 5234 if(!sht){ // I2C
bokunimowakaru 3:d7263b5155bf 5235 /*
bokunimowakaru 3:d7263b5155bf 5236 for(i=0;i<4;i++){
bokunimowakaru 3:d7263b5155bf 5237 ret=xbee_tx_rx("RATIS",data,0);
bokunimowakaru 3:d7263b5155bf 5238 if( (((data[22]>>4)&0x01) == 1) && // ACKが解除された //data[22]b4=Port 12(SDA)
bokunimowakaru 3:d7263b5155bf 5239 (((data[22]>>3)&0x01) == 1) ) break;// スレーブがCLKホールドしていない // data[22]b3=Port 11(SCL)
bokunimowakaru 3:d7263b5155bf 5240 wait_millisec(500);
bokunimowakaru 3:d7263b5155bf 5241 }
bokunimowakaru 3:d7263b5155bf 5242 // printf("i=%d\n",i);
bokunimowakaru 3:d7263b5155bf 5243 if(i==4){
bokunimowakaru 3:d7263b5155bf 5244 xbee_log( 5, "ERROR:I2C Clock Holded" , data[22] );
bokunimowakaru 3:d7263b5155bf 5245 return(0);
bokunimowakaru 3:d7263b5155bf 5246 }
bokunimowakaru 3:d7263b5155bf 5247 */
bokunimowakaru 3:d7263b5155bf 5248 }else{ // SHT
bokunimowakaru 3:d7263b5155bf 5249 _xbee_i2c(1/*SCL*/,0,data); // Port 11(SCL) L Out
bokunimowakaru 3:d7263b5155bf 5250 for(i=0;i<4;i++){
bokunimowakaru 3:d7263b5155bf 5251 ret=xbee_tx_rx("RATIS",data,0);
bokunimowakaru 3:d7263b5155bf 5252 if( ((data[22]>>4)&0x01) == 0 ) break;// 測定完了 //data[22]b4=Port 12(SDA)
bokunimowakaru 3:d7263b5155bf 5253 } // printf("Slave Holds SDA i=%d\n",i);
bokunimowakaru 3:d7263b5155bf 5254 if(i==4){
bokunimowakaru 3:d7263b5155bf 5255 xbee_log( 5, "ERROR:I2C SDA Holded" , data[22] );
bokunimowakaru 3:d7263b5155bf 5256 return(0);
bokunimowakaru 3:d7263b5155bf 5257 }
bokunimowakaru 3:d7263b5155bf 5258 }
bokunimowakaru 3:d7263b5155bf 5259 _xbee_i2c(1/*SCL*/,0,data); // Port 11(SCL) L Out
bokunimowakaru 3:d7263b5155bf 5260
bokunimowakaru 3:d7263b5155bf 5261 /* 受信データ */
bokunimowakaru 3:d7263b5155bf 5262 for(ret=0;ret<len;ret++){
bokunimowakaru 3:d7263b5155bf 5263 if(ret){ // 初回以外の時はACKを応答する
bokunimowakaru 3:d7263b5155bf 5264 _xbee_i2c(2/*SDA*/,0,data); // Port 12(SDA) L Out
bokunimowakaru 3:d7263b5155bf 5265 _xbee_i2c(1/*SCL*/,1,data); // Port 11(SCL) H Imp
bokunimowakaru 3:d7263b5155bf 5266 _xbee_i2c(1/*SCL*/,0,data); // Port 11(SCL) L Out
bokunimowakaru 3:d7263b5155bf 5267 _xbee_i2c(2/*SDA*/,1,data); // Port 12(SDA) H Imp
bokunimowakaru 3:d7263b5155bf 5268 }
bokunimowakaru 3:d7263b5155bf 5269 rx[ret]=0x00;
bokunimowakaru 3:d7263b5155bf 5270 for(i=0;i<8;i++){
bokunimowakaru 3:d7263b5155bf 5271 _xbee_i2c(1/*SCL*/,1,data); // Port 11(SCL) H Imp
bokunimowakaru 3:d7263b5155bf 5272 // xbee_tx_rx("RATAC",data,0);
bokunimowakaru 3:d7263b5155bf 5273 if( xbee_tx_rx("RATIS",data,0)==0x00) break; // error
bokunimowakaru 3:d7263b5155bf 5274 rx[ret] |= ((data[22]>>4)&0x01)<<(7-i); //data[22] b4=Port 12(SDA)
bokunimowakaru 3:d7263b5155bf 5275 _xbee_i2c(1/*SCL*/,0,data); // Port 11(SCL) L Out
bokunimowakaru 3:d7263b5155bf 5276 }
bokunimowakaru 3:d7263b5155bf 5277 if(i!=8) break; // error
bokunimowakaru 3:d7263b5155bf 5278 }
bokunimowakaru 3:d7263b5155bf 5279 _xbee_i2c(1/*SCL*/,1,data); // Port 11(SCL) H Imp
bokunimowakaru 3:d7263b5155bf 5280 if(sht) _xbee_i2c(1/*SCL*/,0,data); // Port 11(SCL) L Out
bokunimowakaru 3:d7263b5155bf 5281 xbee_tx_rx("RATAC",data,0);
bokunimowakaru 3:d7263b5155bf 5282 return(ret);
bokunimowakaru 3:d7263b5155bf 5283 }
bokunimowakaru 3:d7263b5155bf 5284
bokunimowakaru 3:d7263b5155bf 5285 byte xbee_i2c_write(const byte *address, byte adr, byte *tx, byte len){
bokunimowakaru 3:d7263b5155bf 5286 /*
bokunimowakaru 3:d7263b5155bf 5287 子機XBeeデバイス(リモート先)のI2Cから指定バイトの情報を書き込む関数
bokunimowakaru 3:d7263b5155bf 5288 入力:byte *address = リモートXBee子機のIEEEアドレス
bokunimowakaru 3:d7263b5155bf 5289 入力:byte adr = I2Cアドレス /SHT 温度測定時0x01 湿度測定時0x02
bokunimowakaru 3:d7263b5155bf 5290 入力:byte *tx = 送信データ用ポインタ
bokunimowakaru 3:d7263b5155bf 5291 入力:byte len = 送信データ長、0の時は Sensirion SHT用2バイト受信
bokunimowakaru 3:d7263b5155bf 5292 port=11 DIO11 XBee_pin 7 SCL
bokunimowakaru 3:d7263b5155bf 5293 port=12 DIO12 XBee_pin 4 SDA
bokunimowakaru 3:d7263b5155bf 5294 */
bokunimowakaru 3:d7263b5155bf 5295 byte data[API_SIZE];
bokunimowakaru 3:d7263b5155bf 5296 byte ret;
bokunimowakaru 3:d7263b5155bf 5297
bokunimowakaru 3:d7263b5155bf 5298 xbee_address(address); // 宛先のアドレスを設定
bokunimowakaru 3:d7263b5155bf 5299 if(len) _xbee_i2c_start(data);
bokunimowakaru 3:d7263b5155bf 5300 else return(0);
bokunimowakaru 3:d7263b5155bf 5301 adr &= 0xFE; // RW=0 送信モード
bokunimowakaru 3:d7263b5155bf 5302 if( _xbee_i2c_tx(adr, data)==0 ) return(0); // アドレス設定
bokunimowakaru 3:d7263b5155bf 5303 /* スレーブ待機状態待ち */
bokunimowakaru 3:d7263b5155bf 5304 /*
bokunimowakaru 3:d7263b5155bf 5305 for(i=0;i<4;i++){
bokunimowakaru 3:d7263b5155bf 5306 ret=xbee_tx_rx("RATIS",data,0);
bokunimowakaru 3:d7263b5155bf 5307 if( (((data[22]>>4)&0x01) == 1) && // ACKが解除された //data[22]b4=Port 12(SDA)
bokunimowakaru 3:d7263b5155bf 5308 (((data[22]>>3)&0x01) == 1) ) break;// スレーブがCLKホールドしていない // data[22]b3=Port 11(SCL)
bokunimowakaru 3:d7263b5155bf 5309 wait_millisec(500);
bokunimowakaru 3:d7263b5155bf 5310 }
bokunimowakaru 3:d7263b5155bf 5311 // printf("i=%d\n",i);
bokunimowakaru 3:d7263b5155bf 5312 if(i==4){
bokunimowakaru 3:d7263b5155bf 5313 xbee_log( 5, "ERROR:I2C Clock Holded" , data[22] );
bokunimowakaru 3:d7263b5155bf 5314 return(0);
bokunimowakaru 3:d7263b5155bf 5315 }
bokunimowakaru 3:d7263b5155bf 5316 */
bokunimowakaru 3:d7263b5155bf 5317 _xbee_i2c(2/*SDA*/,0,data); // Port 12(SDA) L Out
bokunimowakaru 3:d7263b5155bf 5318 _xbee_i2c(1/*SCL*/,0,data); // Port 11(SCL) L Out
bokunimowakaru 3:d7263b5155bf 5319
bokunimowakaru 3:d7263b5155bf 5320 /* 送信データ */
bokunimowakaru 3:d7263b5155bf 5321 for(ret=0;ret<len;ret++){
bokunimowakaru 3:d7263b5155bf 5322 _xbee_i2c_tx(tx[ret],data);
bokunimowakaru 3:d7263b5155bf 5323 _xbee_i2c(2/*SDA*/,0,data); // Port 12(SDA) L Out
bokunimowakaru 3:d7263b5155bf 5324 _xbee_i2c(1/*SCL*/,0,data); // Port 11(SCL) L Out
bokunimowakaru 3:d7263b5155bf 5325 }
bokunimowakaru 3:d7263b5155bf 5326 return(ret);
bokunimowakaru 3:d7263b5155bf 5327 }
bokunimowakaru 3:d7263b5155bf 5328 #endif // LITE
bokunimowakaru 3:d7263b5155bf 5329
bokunimowakaru 3:d7263b5155bf 5330 byte xbee_delay(unsigned int ms){
bokunimowakaru 3:d7263b5155bf 5331 /*
bokunimowakaru 3:d7263b5155bf 5332 待ち時間。受信値はバッファへ保存します。
bokunimowakaru 3:d7263b5155bf 5333 入力:unsigned int(shortを想定) ms = 時間[ms]
bokunimowakaru 3:d7263b5155bf 5334 戻り値:受信パケット数
bokunimowakaru 3:d7263b5155bf 5335 */
bokunimowakaru 3:d7263b5155bf 5336 #ifdef LITE // BeeBee Lite by 蘭
bokunimowakaru 3:d7263b5155bf 5337 wait_millisec( ms );
bokunimowakaru 3:d7263b5155bf 5338 return 0;
bokunimowakaru 3:d7263b5155bf 5339 #else
bokunimowakaru 3:d7263b5155bf 5340 byte i,ret=0;
bokunimowakaru 3:d7263b5155bf 5341 byte data[API_SIZE];
bokunimowakaru 3:d7263b5155bf 5342
bokunimowakaru 3:d7263b5155bf 5343 while(ms>0){
bokunimowakaru 3:d7263b5155bf 5344 #ifdef CACHE_RES
bokunimowakaru 3:d7263b5155bf 5345 if( CACHE_COUNTER < CACHE_RES ){
bokunimowakaru 3:d7263b5155bf 5346 if( xbee_at_rx( data ) > 0){
bokunimowakaru 3:d7263b5155bf 5347 for( i=0 ; i < API_SIZE ; i++) CACHE_MEM[CACHE_COUNTER][i] = data[i];
bokunimowakaru 3:d7263b5155bf 5348 CACHE_COUNTER++;
bokunimowakaru 3:d7263b5155bf 5349 ret++;
bokunimowakaru 3:d7263b5155bf 5350 #ifdef DEBUG
bokunimowakaru 3:d7263b5155bf 5351 lcd_putstr("### CACHE_RES ### <- "); // DEBUG
bokunimowakaru 3:d7263b5155bf 5352 lcd_disp_hex( CACHE_COUNTER );
bokunimowakaru 3:d7263b5155bf 5353 lcd_putch('\n');
bokunimowakaru 3:d7263b5155bf 5354 #endif
bokunimowakaru 3:d7263b5155bf 5355 }
bokunimowakaru 3:d7263b5155bf 5356 }
bokunimowakaru 3:d7263b5155bf 5357 #endif
bokunimowakaru 3:d7263b5155bf 5358 if( ms > 100 ){
bokunimowakaru 3:d7263b5155bf 5359 wait_millisec( 100 );
bokunimowakaru 3:d7263b5155bf 5360 ms -= 100;
bokunimowakaru 3:d7263b5155bf 5361 }else{
bokunimowakaru 3:d7263b5155bf 5362 wait_millisec( ms );
bokunimowakaru 3:d7263b5155bf 5363 ms = 0;
bokunimowakaru 3:d7263b5155bf 5364 }
bokunimowakaru 3:d7263b5155bf 5365 }
bokunimowakaru 3:d7263b5155bf 5366 return(ret);
bokunimowakaru 3:d7263b5155bf 5367 #endif
bokunimowakaru 3:d7263b5155bf 5368 }