ZB Coord API for XBee: This XBee library drives Digi XBee ZB Modules in API Operation mode. Most commands include remote communication's are supported by the functions of this library. You can control XBee devices through the API software modules in this, without using any AT commands. Please refer to the following page and some of sample codes:

Dependents:   sample02_sw xbee_aging sample01_led sample04_sens

XBee library 'ZB Coord API'

/media/uploads/bokunimowakaru/nucleoboard.jpg

Nucleo Board + Arduino Wireless Shield + XBee ZB Module + LCD

This XBee liblary is developed for Digi XBee ZB Modules on Nucleo F401RE Micro Computer Board through Arduino Wireless Shield.

Quote:

When you will use this liblary for anything other than Nucleo microcomputer board, please change the 4th line of xbee/xbee.cpp. The above code is only for STM32 Nucleo board.

  • RawSerial _xbee_serial(SERIAL_TX, SERIAL_RX);

/media/uploads/bokunimowakaru/nucleo_xbee.jpg

Hardware Jumper Settings

The hardware soldering jumper setting for the serial ports is necessary for Nucleo board.

  • Set OPEN for SB14(TX)
  • Set SHORT jumper for SB62
  • Set SHORT jumper for SB63

/media/uploads/bokunimowakaru/nucleo_jp.jpg

Examples

Sample Code 01 LED

An XBee ZB Coordinator on a Nucleo Board controls LEDs on the other XBee ZB device.

#include "xbee.h"
DigitalOut myled(LED1);
 
int main(){
    // Please set MAC Address to access your remote XBee device.
    byte dev_gpio[]   = {0x00,0x13,0xA2,0x00,0x40,0x30,0xC1,0x6F};
    
    myled = 1;                          // set Higher Level(3.3V) for LED port on NUCLEO
    xbee_init( 0 );                     // Initialize XBee COM Port Settings
    xbee_atnj( 0xFF );                  // Enable Network Join
    myled = 0;                          // set Lower Level(0.0V) for LED port on NUCLEO
    
    while(1){ 
        myled = 1;                      // set Higher Level(3.3V) for LED port on NUCLEO
        xbee_gpo(dev_gpio,11,1);        // set H Level for GPO port 11 on remote xbee
        xbee_gpo(dev_gpio,12,1);        // set H Level for GPO port 12 on remote xbee
        wait(1);
        myled = 0;                      // set Lower Level(0.0V) for LED port on NUCLEO
        xbee_gpo(dev_gpio,11,0);        // set L Level for GPO port 11 on remote xbee
        xbee_gpo(dev_gpio,12,0);        // set L Level for GPO port 12 on remote xbee
        wait(1);
    }
}

http://mbed.org/users/bokunimowakaru/code/sample01_led/

Sample Code 02 Switch

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

#include "xbee.h"
#include "TextLCD.h"
TextLCD lcd(PA_9, PC_7, PB_5, PB_4, PB_10, PA_8); // rs, e, d4-d7
  
int main(){
    byte data;
    int i;
    XBEE_RESULT xbee_result;
    byte dev_gpio[]   = {0x00,0x13,0xA2,0x00,0x40,0x30,0xC1,0x6F};
    
    lcd.cls(); lcd.printf("Sample 2 SW");
    xbee_init( 0x00 ); 
    lcd.cls(); lcd.printf("ATNJ");
    xbee_atnj( 0xFF ); 
    lcd.cls(); lcd.printf("gpio init");
    xbee_gpio_init(dev_gpio);           // Send GPIO mode settings to remote device.
    lcd.cls(); lcd.printf("DONE");
    
    while(1){
        data = xbee_rx_call( &xbee_result );
        if( xbee_result.MODE == MODE_GPIN){     // When a GPIO packet is recieved,
            lcd.cls();
            for( i=7; i>=0 ; i--) lcd.printf( "%c",(char)( (int)'0' + ((data>>i) & 0x01) ) );
                                        // Display the recieved data.
        }
    }
}

http://mbed.org/users/bokunimowakaru/code/sample02_sw/

Sample Code 04 Sensor

Measured results of an XBee wireless sensor device are displayed a LCD on Nucleo board with an XBee coordinator which is in API mode.

#include <xbee.h>
#include "TextLCD.h"
#define FORCE_INTERVAL  100
TextLCD lcd(PA_9, PC_7, PB_5, PB_4, PB_10, PA_8); // rs, e, d4-d7
byte dev_sens[8];   // IEEE Address
 
int main(){
    int i;
    int dev_en = 0;                 // Device Detection Flag
    XBEE_RESULT xbee_result;            // Stracture for recieved data
    int trig=0;
    float value;

    lcd.cls(); lcd.printf("Sample 4 SENS");
    xbee_init( 0x00 ); 
    lcd.cls(); lcd.printf("Searching:SENSOR");
    if( xbee_atnj(10) ){                // Enable Network Join during 10 seconds.
        lcd.cls(); lcd.printf("Found a device");
        xbee_from( dev_sens );          // Get address of remote device. 
        dev_en = 1;
        xbee_gpio_config( dev_sens, 1 , AIN ); // Analog Input mode to port 1 on remote device
        xbee_gpio_config( dev_sens, 2 , AIN ); // Analog Input mode to port 2 on remote device
    }else{
        lcd.cls(); lcd.printf("Failed:no dev.");
    }
    wait(1);
    lcd.cls();
    
    while(1){
        if(dev_en){ 
            if(trig<=0){
                lcd.locate(12,0); lcd.printf("Trig"); wait(0.1);
                xbee_force(dev_sens);           // Send a request command to remote device.
                trig = FORCE_INTERVAL;
                lcd.locate(12,0); lcd.printf("    ");
            }
        }else{
            lcd.cls(); lcd.printf("Waiting for XBee");
            wait(0.5);
            lcd.cls();
        }
        trig--;
 
        xbee_rx_call( &xbee_result );       // Check a recieved packet.
        switch( xbee_result.MODE ){         // Check the packet type.
            case MODE_RESP:                 // the responce for the request in xbee_force().
            case MODE_GPIN:                 // Report data from remote xbee device.
                if( bytecmp( dev_sens , &(xbee_result.FROM[0]) ,8 ) == 0 && xbee_result.STATUS == STATUS_OK ){
                    value = xbee_sensor_result( &xbee_result, LIGHT);
                    lcd.locate(0,0); lcd.printf( "%.1f Lux   ",value);
                    value = xbee_sensor_result( &xbee_result, TEMP);
                    lcd.locate(0,1); lcd.printf( "%.1f C   ",value);
                }
                break;
            case MODE_IDNT:             // Commissioning Button Report is recieved.
                lcd.cls(); lcd.printf("found a new dev");
                for( i=0;i<8;i++ ) dev_sens[i]=xbee_result.FROM[i];
                                        // Save MAC address of reported device.
                dev_en = 1;             // Flag on (A sensor is detected.)
                trig = 0;
                xbee_gpio_config( dev_sens, 1 , AIN ); // Set Analog Mode to port 1 on remote XBee
                xbee_gpio_config( dev_sens, 2 , AIN ); // Set Analog Mode to port 2 on remote XBee
                lcd.cls();
                break;
            default:
                break;
        }
    }
}

http://mbed.org/users/bokunimowakaru/code/sample04_sens/

Committer:
bokunimowakaru
Date:
Sat Oct 04 01:24:07 2014 +0000
Revision:
5:6ce45b34d3f0
Parent:
4:0ca33b5953d0
Child:
8:ddded5d4f96c
Serial setting code is moved to 4th line on xbee.cpp.

Who changed what in which revision?

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