This software is a test tool for the XBee Library 'XBee Coord API'. I'll check to pass the test when release the library.

Dependencies:   TextLCD mbed xbee

Please refer to the following site for the details:

Committer:
bokunimowakaru
Date:
Sun Sep 21 10:15:44 2014 +0000
Revision:
0:60ca8c579d80
The first release of aging tester for XBee Library 'XBee Coord API' Version 1.90

Who changed what in which revision?

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