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:
Fri Oct 31 10:08:36 2014 +0000
Revision:
8:ddded5d4f96c
Parent:
5:6ce45b34d3f0
Version 1.92

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bokunimowakaru 8:ddded5d4f96c 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 8:ddded5d4f96c 5 // Please set serial ports in conformity to your microcomputer board.
bokunimowakaru 8:ddded5d4f96c 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 8:ddded5d4f96c 22
bokunimowakaru 4:0ca33b5953d0 23 /*
bokunimowakaru 0:d72830877d98 24 既知のバグ
bokunimowakaru 0:d72830877d98 25 [PC用/H8用/Arduino共通]
bokunimowakaru 0:d72830877d98 26 ・xbee_force/ATISでERRORもしくは正しい値が得られない場合がある。
bokunimowakaru 0:d72830877d98 27  一度、xbee_gpo/ATP104などで子機のGPIOなどに出力すると治る。
bokunimowakaru 0:d72830877d98 28   (XBeeモジュールの不具合と思われる)
bokunimowakaru 0:d72830877d98 29 ・XBee Smart Plug/XBee Sensor等でネットワーク参加直後、
bokunimowakaru 0:d72830877d98 30  正しい値を応答しない場合がある。上記と似た症状かもしれない。
bokunimowakaru 0:d72830877d98 31  一度、XBee Smart PlugのACコンセントを抜いて挿しなおせば治る。
bokunimowakaru 0:d72830877d98 32   (Smart Plug側のファームウェア「XBP24-ZB_2264」の問題と思われる)
bokunimowakaru 0:d72830877d98 33 ・Ver 1.90でLITEモードの仕様を変更。(濱崎氏によるBeeBee Lite)
bokunimowakaru 0:d72830877d98 34
bokunimowakaru 0:d72830877d98 35 ★XBee Wi-FiでのRAT実行時にXBeeから応答のパケットが無い場合がある。
bokunimowakaru 0:d72830877d98 36 IP_PINGは通る。
bokunimowakaru 0:d72830877d98 37 再現方法、動作中にXBeeをリセットし、その後にArduinoをリセット。
bokunimowakaru 0:d72830877d98 38 XBeeモジュールをリセットすると治る。
bokunimowakaru 0:d72830877d98 39 Arduino版で発覚。PC版は未確認。
bokunimowakaru 0:d72830877d98 40
bokunimowakaru 0:d72830877d98 41 [パソコン用]
bokunimowakaru 0:d72830877d98 42 ・おかげさまで特記事項なし。安定して動作します。
bokunimowakaru 0:d72830877d98 43
bokunimowakaru 0:d72830877d98 44 [Arduino用]
bokunimowakaru 0:d72830877d98 45 ・標準SDライブラリ使用時にメモリ不足になる場合があります。
bokunimowakaru 0:d72830877d98 46  そのような場合はxbee_liteをincludeし、LITEモードにしてください。
bokunimowakaru 0:d72830877d98 47
bokunimowakaru 0:d72830877d98 48 [ARM mbed用]
bokunimowakaru 0:d72830877d98 49 ・試作品です。バグ多数かもしれません。
bokunimowakaru 0:d72830877d98 50 ・STマイクロ製 Nucleo Board STM32F401で動作確認しています。
bokunimowakaru 0:d72830877d98 51 ・XBeeとの接続にはArduino用Wireless SD Shieldを使用します。
bokunimowakaru 0:d72830877d98 52  ※Nucleoボードの裏側のジャンパー抵抗の変更が必要です。
bokunimowakaru 0:d72830877d98 53 「SB14」をオープンにします(抵抗を取り外します。)
bokunimowakaru 0:d72830877d98 54 「SB62」をショートします。(半田で接続します。)
bokunimowakaru 0:d72830877d98 55 「SB63」をショートします。(半田で接続します。)
bokunimowakaru 0:d72830877d98 56 ・液晶はDF ROBOT製 LCD Keypad Shieldで動作確認しています。
bokunimowakaru 0:d72830877d98 57
bokunimowakaru 0:d72830877d98 58 [H8マイコン用]
bokunimowakaru 0:d72830877d98 59 ・Ver1.52以降は動作確認をしておらず、動作しない恐れがあります。
bokunimowakaru 0:d72830877d98 60  お使いになる方は連絡ください。動作確認版を個別リリースいたします。
bokunimowakaru 0:d72830877d98 61
bokunimowakaru 0:d72830877d98 62 制限事項
bokunimowakaru 0:d72830877d98 63 ・ソースはPC/H8/Arduino/ARM mbed用で共通ですが拡張子が異なります。
bokunimowakaru 0:d72830877d98 64  PC/H8「xbee.c」をArduino用は「xbee_arduino」フォルダ内のライブラリ
bokunimowakaru 0:d72830877d98 65  「xbee.h」をincludeしてください。
bokunimowakaru 0:d72830877d98 66 ・xbee_forceで指示を出してxbee_rx_callで待ち受ける用法を推奨します。
bokunimowakaru 0:d72830877d98 67 ・受信パケットの最大APIフレーム長は255Bytes等に制限されます。(64KB)
bokunimowakaru 0:d72830877d98 68 ・複数のXBeeデバイスの選択はアプリでIEEEアドレスを指定してください。
bokunimowakaru 0:d72830877d98 69 ・ショートアドレスは使っていません(IEEEアドレスで指定してください)
bokunimowakaru 0:d72830877d98 70 ・温度測定を行う場合は内部発熱分を補正(減算)する必要があります。
bokunimowakaru 0:d72830877d98 71  Digi純正のWall RouterやSmart Plugの場合は内部発熱の4℃を考慮して
bokunimowakaru 0:d72830877d98 72  測定値から減算必要があります。
bokunimowakaru 0:d72830877d98 73 ・送信者アドレスを得る関数xbee_fromは、xbee_rx_callで受信した場合に
bokunimowakaru 0:d72830877d98 74  正しく得られない場合があります。(受信キャッシュが保持されている時)
bokunimowakaru 0:d72830877d98 75  xbee_rx_callに渡したxbee_result.FROM[8]から送信者を得てください。
bokunimowakaru 0:d72830877d98 76
bokunimowakaru 0:d72830877d98 77 アプリ向け提供関数
bokunimowakaru 0:d72830877d98 78
bokunimowakaru 0:d72830877d98 79 byte xbee_myaddress( byte *address );
bokunimowakaru 0:d72830877d98 80 void xbee_address( const byte *address );
bokunimowakaru 0:d72830877d98 81 byte xbee_atd( const byte *address );
bokunimowakaru 0:d72830877d98 82 byte xbee_ratd(const byte *dev_address, const byte *set_address );
bokunimowakaru 0:d72830877d98 83 byte xbee_ratd_myaddress(const byte *address);
bokunimowakaru 0:d72830877d98 84 void xbee_from( byte *address );
bokunimowakaru 0:d72830877d98 85 byte xbee_at(const char *in);
bokunimowakaru 0:d72830877d98 86 byte xbee_rat(const byte *address, const char *in);
bokunimowakaru 0:d72830877d98 87 byte xbee_rat_force(const byte *address, const char *in);
bokunimowakaru 0:d72830877d98 88 byte xbee_uart(const byte *address, const char *in);
bokunimowakaru 0:d72830877d98 89 byte xbee_bytes(const byte *address, const byte *in, byte len);
bokunimowakaru 0:d72830877d98 90 byte xbee_atvr( void );
bokunimowakaru 0:d72830877d98 91 byte xbee_atai( void );
bokunimowakaru 0:d72830877d98 92 byte xbee_atcb( byte cb );
bokunimowakaru 0:d72830877d98 93 unsigned short xbee_atop(byte *pan_id);
bokunimowakaru 0:d72830877d98 94 byte xbee_atee_on(const char *key );
bokunimowakaru 0:d72830877d98 95 byte xbee_atee_off( void );
bokunimowakaru 0:d72830877d98 96 byte xbee_atnc( void );
bokunimowakaru 0:d72830877d98 97 byte xbee_ratnc( const byte *address );
bokunimowakaru 0:d72830877d98 98 byte xbee_atnj( const byte timeout );
bokunimowakaru 0:d72830877d98 99 byte xbee_ratnj( const byte *address, const byte timeout );
bokunimowakaru 0:d72830877d98 100 byte xbee_ping( const byte *address );
bokunimowakaru 0:d72830877d98 101 int xbee_batt(const byte *address );
bokunimowakaru 0:d72830877d98 102 byte xbee_batt_force(const byte *address );
bokunimowakaru 0:d72830877d98 103 byte xbee_gpio_config(const byte *address, const byte port, const enum xbee_port_type type ); //(PC/H8)
bokunimowakaru 0:d72830877d98 104 byte xbee_gpio_config(const byte *address, const byte port, const byte type ); //(arduino)
bokunimowakaru 0:d72830877d98 105 byte xbee_gpio_init( const byte *address );
bokunimowakaru 0:d72830877d98 106 byte xbee_gpo( const byte *address, const byte port,const byte out );
bokunimowakaru 0:d72830877d98 107 byte xbee_gpi(const byte *address, const byte port); //(EASY)
bokunimowakaru 0:d72830877d98 108 unsigned int xbee_adc(const byte *address, const byte port); //(EASY)
bokunimowakaru 0:d72830877d98 109 byte xbee_force( const byte *address );
bokunimowakaru 0:d72830877d98 110 float xbee_sensor_result( XBEE_RESULT *xbee_result, const enum xbee_sensor_type type ); //(PC/H8)
bokunimowakaru 0:d72830877d98 111 float xbee_sensor_result( XBEE_RESULT *xbee_result, const byte type); //(arduino)
bokunimowakaru 0:d72830877d98 112 byte xbee_rx_call( XBEE_RESULT *xbee_result );
bokunimowakaru 0:d72830877d98 113 void xbee_clear_cache(void);
bokunimowakaru 0:d72830877d98 114 xbee_sensor(const byte *address, const enum xbee_sensor_type type ); //(EASY)
bokunimowakaru 0:d72830877d98 115 byte xbee_init( const byte port );
bokunimowakaru 0:d72830877d98 116 byte xbee_reset( void );
bokunimowakaru 0:d72830877d98 117 byte xbee_end_device(const byte *address, byte sp, byte ir, const byte pin);
bokunimowakaru 0:d72830877d98 118 byte xbee_i2c_read(const byte *address, byte adr, byte *rx, byte len);
bokunimowakaru 0:d72830877d98 119 byte xbee_i2c_write(const byte *address, byte adr, byte *rx, byte len);
bokunimowakaru 0:d72830877d98 120 byte xbee_delay(unsigned int ms);
bokunimowakaru 0:d72830877d98 121 void lcd_disp( char *s );
bokunimowakaru 0:d72830877d98 122
bokunimowakaru 0:d72830877d98 123 主要な変更履歴
bokunimowakaru 0:d72830877d98 124 2010/08/15 0.10 - 初回の公開版をリリース 基本動作部分の実験用
bokunimowakaru 0:d72830877d98 125 2011/08/14 0.30 - ライブラリ化のためにAPI関数の内容を全面見直し
bokunimowakaru 0:d72830877d98 126 2012/04/07 0.80 - 総合試験の実施とバグ修正、仕様見直しなど
bokunimowakaru 0:d72830877d98 127 2012/04/22 0.91 - パソコン(cygwin)への移植
bokunimowakaru 0:d72830877d98 128 2012/07/15 1.00 - 基本機能(sample1~8)のデバッグ完了。正式版
bokunimowakaru 0:d72830877d98 129 2012/08/25 1.15 - Arduino用へ移植
bokunimowakaru 0:d72830877d98 130 - enum xbee_port_typeのADCをAINに変更
bokunimowakaru 0:d72830877d98 131 - 起動時にシリアル速度が設定されない不具合を修正
bokunimowakaru 0:d72830877d98 132 2012/11/25 1.20 - 電池電圧確認用コマンドを非同期型に変更
bokunimowakaru 0:d72830877d98 133 xbee_batt⇒xbee_batt_force。応答はxbee_rx_call
bokunimowakaru 0:d72830877d98 134 2012/12/09 1.30 - 液晶なしオプション(#define LCD_H)の追加
bokunimowakaru 0:d72830877d98 135 - Liteモード(#define LITE)の追加。ARDUINO版のみ
bokunimowakaru 0:d72830877d98 136 - PC版シリアルポートをcom1~com10に拡張
bokunimowakaru 0:d72830877d98 137 - グローバル変数アドレスのADR_MYとSADR_MYを廃止
bokunimowakaru 0:d72830877d98 138 2012/12/16 1.50 - Arduino版のライブラリ化
bokunimowakaru 0:d72830877d98 139 - コマンド応答待ち時に他のパケットをキャッシュ
bokunimowakaru 0:d72830877d98 140 (#define CACHE_RES 10でキャッシュが有効になる)
bokunimowakaru 0:d72830877d98 141 2012/12/17 1.51 - リモートATの応答確認にAT値からMODE値に変更
bokunimowakaru 0:d72830877d98 142 - H8のバグ対応(lcd_h8.cの2重呼び出し対策等)
bokunimowakaru 0:d72830877d98 143 2012/12/18 1.52 - [重要] 関数lcd()をlcd_disp()に変更。
bokunimowakaru 0:d72830877d98 144 - Arduino版ライブラリ側ハードLCD,LED,SWの無効化
bokunimowakaru 0:d72830877d98 145 2012/12/22 1.53 - [重要] atnjとratnjの戻り値を失敗時255に変更
bokunimowakaru 0:d72830877d98 146 - ATコマンドを送信する関数を追加
bokunimowakaru 0:d72830877d98 147 2012/12/23 1.54 - 1.53のエンバグの修正(テスト用printfの残留)
bokunimowakaru 0:d72830877d98 148 2012/12/30 1.55 - Arduino LEONARDOへの対応
bokunimowakaru 0:d72830877d98 149 - Arduino標準LCDの配線変更(DF ROBOT互換に)
bokunimowakaru 0:d72830877d98 150 2013/01/12 1.56 - xbee_result.GPI[0]とGPI[1]の戻り値を入れ替え
bokunimowakaru 0:d72830877d98 151 2013/01/14 1.57 - xbee_gpio_configでアドレス取得失敗時のバグ修正
bokunimowakaru 0:d72830877d98 152 2013/01/20 1.58 - xbee状態取得 xbee_ataiとxbee_atopコマンド追加
bokunimowakaru 0:d72830877d98 153 2013/04/03 1.60 - xbee_initによるXBeeリセット時の応答の廃棄処理
bokunimowakaru 0:d72830877d98 154 - エラー出力を stderrに変更PC用(のみ)
bokunimowakaru 0:d72830877d98 155 - xbee_result.GPI.PORT.Dnのエンバグ(1.56~)修正
bokunimowakaru 0:d72830877d98 156 2013/04/08 1.71 - [重要] Arduino xbee_rx_callを構造体受取に変更
bokunimowakaru 0:d72830877d98 157 - [重要] Arduino xbee_sensor_resultの引数の同上
bokunimowakaru 0:d72830877d98 158 - [重要] xbee_rx_callパケット選択受信機能を削除
bokunimowakaru 0:d72830877d98 159 - [重要] PC/H8 xbee_result.ADCをADCINに変更
bokunimowakaru 0:d72830877d98 160 - xbee_atに16進数のテキスト引数の処理のバグ修正
bokunimowakaru 0:d72830877d98 161 - xbee_atnjでjoin後にatnj=5を設定(5秒Join有効)
bokunimowakaru 0:d72830877d98 162 - PC/H8/Arduinoでライブラリを共通ソースに統合
bokunimowakaru 0:d72830877d98 163 2013/04/21 1.72 - コマンド応答をxbee_rx_callで得るxbee_rat_force
bokunimowakaru 0:d72830877d98 164 - テキストをシリアル送信するxbee_uartの追加
bokunimowakaru 0:d72830877d98 165 - ZigBeeデバイスタイプを取得するxbee_atvrの追加
bokunimowakaru 0:d72830877d98 166 - ネットワーク参加状況を確認するxbee_ataiの追加
bokunimowakaru 0:d72830877d98 167 - コミッショニング操作を行うxbee_atcbの追加
bokunimowakaru 0:d72830877d98 168 - ネットワークIDを取得するxbee_atopの追加
bokunimowakaru 0:d72830877d98 169 - 暗号化xbee_atee_onと解除xbee_atee_offの追加
bokunimowakaru 0:d72830877d98 170 2013/04/30 1.73 - PC版&Arduino版リリース
bokunimowakaru 0:d72830877d98 171 - 受信キャッシュオーバー時パケット廃棄(仕様変更)
bokunimowakaru 0:d72830877d98 172 2013/05/09 1.74 - 初期化時にAPモード1の設定を追加
bokunimowakaru 0:d72830877d98 173 - #define LCD_H有効時以外のログ呼び出し停止
bokunimowakaru 0:d72830877d98 174 - 子機に本機アドレスを設定するxbee_set_myaddress
bokunimowakaru 0:d72830877d98 175 2013/05/10 1.75 - End Deviceにスリープを設定するxbee_end_device
bokunimowakaru 0:d72830877d98 176 2013/05/18 1.76 - [重要] 戻り値を送信パケット番号PACKET_IDに変更
bokunimowakaru 0:d72830877d98 177 xbee_gpo,同_force,同_batt,同_rat_force,同_uart
bokunimowakaru 0:d72830877d98 178 - [重要] Arduino xbee_resultにxbee_result.ID追加
bokunimowakaru 0:d72830877d98 179 2013/05/25 1.77 - XBee Wi-Fi XBee IPによるリモートAT制御に対応
bokunimowakaru 0:d72830877d98 180 2013/06/30 1.78 - 全マスクGPIO入力時xbee_result.GPI.BYTEを0xFFFF
bokunimowakaru 0:d72830877d98 181 - GPIO出力(xbee_gpo)の利用可能ポート範囲を拡大
bokunimowakaru 0:d72830877d98 182 2013/08/28 1.79 - XBee Sensorのデバイス名(define)の追加
bokunimowakaru 0:d72830877d98 183 - xbee_end_deviceの親機のSP値を28秒固定に変更
bokunimowakaru 0:d72830877d98 184 2013/09/28 1.80 - xbee_end_device Router時の自動送信設定を可能に
bokunimowakaru 0:d72830877d98 185 - xbee_resultのGPINに電池電圧ADC[0]にmV値を応答
bokunimowakaru 0:d72830877d98 186 - xbee_atnjでjoin後のatnj=5設定をatnj=0に変更
bokunimowakaru 0:d72830877d98 187 - リモートAT応答の送信元が取得できないバグ修正
bokunimowakaru 0:d72830877d98 188 - XBee Wi-Fi xbee_gpoを送信時の応答バグ修正
bokunimowakaru 0:d72830877d98 189 2013/10/14 1.81 - Arduino版XBee Wi-Fi対応。XBee ZBは未テスト
bokunimowakaru 0:d72830877d98 190 - xbee_atd追加(End Device時に宛先アドレスを保存)
bokunimowakaru 0:d72830877d98 191 - xbee_ratd追加(親機アドレス以外も設定可能に)
bokunimowakaru 0:d72830877d98 192 - xbee_set_myaddress⇒xbee_ratd_myaddress名変更
bokunimowakaru 0:d72830877d98 193 - XBee Wi-Fi 3バイト以下UART受信不具合の修正
bokunimowakaru 0:d72830877d98 194 - XBee Wi-Fi ATDDで不適切な値を応答するバグ対策
bokunimowakaru 0:d72830877d98 195 - XBee Wi-Fiのフレーム受信でメモリーリーク対策
bokunimowakaru 0:d72830877d98 196 2014/01/14 1.82 - ATmega32U4が使われている時はLEONARDOを自動定義
bokunimowakaru 0:d72830877d98 197 - シリアルポート異常時のSegFault不具合の修正
bokunimowakaru 0:d72830877d98 198 - 日時付エラーログ出力(PC用XBEE_ERROR_TIME定義)
bokunimowakaru 0:d72830877d98 199 2014/02/17 1.83 - XBee Wi-Fi サンプルの各種不具合修正
bokunimowakaru 0:d72830877d98 200 - XBee Wi-Fi S2B対応(机上検討による実装)
bokunimowakaru 0:d72830877d98 201 - バイナリデータを子機UARTへ送信するxbee_bytes
bokunimowakaru 0:d72830877d98 202 - I2Cインタフェースを読み取るxbee_i2c_readの追加
bokunimowakaru 0:d72830877d98 203 - I2Cインタフェースで書き込むxbee_i2c_write追加
bokunimowakaru 0:d72830877d98 204 - 受信キャッシュをクリアするxbee_clear_cache追加
bokunimowakaru 0:d72830877d98 205 - 特定者向けリリース(I2C接続LCD,XBee Wi-Fi S2B)
bokunimowakaru 0:d72830877d98 206 2014/02/23 1.84 - 無駄使いメモリの修正、表示の調整、累積バグ修正
bokunimowakaru 0:d72830877d98 207 - ATコマンド解析ツールxbee_test.cのhelpコマンド
bokunimowakaru 0:d72830877d98 208 - README内のバージョン齟齬に関する修正
bokunimowakaru 0:d72830877d98 209 2014/03/01 1.85 - XBee WiFi S6B Ver.20xx対応(Ver.10xxと自動切替)
bokunimowakaru 0:d72830877d98 210  対応モジュール XBee WiFi S6 Ver.102D
bokunimowakaru 0:d72830877d98 211          XBee WiFi S6B Ver.2021
bokunimowakaru 0:d72830877d98 212 2014/03/17 1.86 - CQ出版様向けサンプルソフトウェアの正式リリース
bokunimowakaru 0:d72830877d98 213 2014/06/21 1.87 - ARM mbed対応(試作品)
bokunimowakaru 0:d72830877d98 214 2014/08/02 1.88 - シリアルCOMポート拡張(ポート番号1~64に対応)
bokunimowakaru 0:d72830877d98 215 - Arduino xbee_initでリトライ回数指定に。0で永久
bokunimowakaru 0:d72830877d98 216 - xbee_initに戻り値。異常時0。正常時リトライ数
bokunimowakaru 0:d72830877d98 217 - 受信しながら時間待ちするxbee_delay関数の追加
bokunimowakaru 0:d72830877d98 218 - 宛先ショートアドレス指定関数xbee_short_address
bokunimowakaru 0:d72830877d98 219 - ZigBee ZCL使用時(PC用)に関するバグ修正
bokunimowakaru 0:d72830877d98 220 2014/08/24 1.89 - 内部関数xbee_resetの公開(ヘッダファイルへ追加)
bokunimowakaru 0:d72830877d98 221 - xbee_init 失敗時の戻り値の不具合を修正
bokunimowakaru 0:d72830877d98 222 - PC版 GCC Ver 4.7対応,最適化オプション-O1の付与
bokunimowakaru 0:d72830877d98 223 - 戻り値が不定になる内部関数の不具合修正
bokunimowakaru 0:d72830877d98 224 2014/09/15 1.90 - 有志によるライブラリBeeBee Liteの一部機能採用
bokunimowakaru 0:d72830877d98 225  ・試験ツールxbee_agingを通過しない項目の調整
bokunimowakaru 0:d72830877d98 226  ・効果はArduino上でSD使用時のメモリ確保など
bokunimowakaru 0:d72830877d98 227 - xbee_bytesで規定サイズを超えた場合のリーク対策
bokunimowakaru 0:d72830877d98 228 - 下位マスク0x00のGPIN受信時にエラー出力バグ修正
bokunimowakaru 8:ddded5d4f96c 229 2014/10/25 1.91 - CQ出版 ZigBee Arduinoプログラム全集 第2版用
bokunimowakaru 8:ddded5d4f96c 230 - ARM mbedでのシリアル受信時のロックアップ対策
bokunimowakaru 2:5dbdfe0ca04f 231 - ARM mbedを用いた時のシリアル送信タイミング調整
bokunimowakaru 8:ddded5d4f96c 232 - xbee_end_deviceでRouterへ送信時にIR値を設定
bokunimowakaru 8:ddded5d4f96c 233  (従来はエラー応答だったが、設定後に正常応答)
bokunimowakaru 8:ddded5d4f96c 234 2014/10/31 1.92 - ARM mbed対応
bokunimowakaru 0:d72830877d98 235
bokunimowakaru 0:d72830877d98 236 *********************************************************************/
bokunimowakaru 0:d72830877d98 237 /*
bokunimowakaru 0:d72830877d98 238 本ライブラリのバージョン
bokunimowakaru 0:d72830877d98 239 */
bokunimowakaru 0:d72830877d98 240 #ifndef VERSION
bokunimowakaru 0:d72830877d98 241
bokunimowakaru 0:d72830877d98 242 #define VERSION "1.91" // 1.XX 4バイト形式 XXは半角文字
bokunimowakaru 0:d72830877d98 243
bokunimowakaru 0:d72830877d98 244 #endif
bokunimowakaru 0:d72830877d98 245 /*
bokunimowakaru 0:d72830877d98 246 参考文献
bokunimowakaru 0:d72830877d98 247
bokunimowakaru 0:d72830877d98 248 (1) Digi International Inc.
bokunimowakaru 0:d72830877d98 249 XBee ZB RF Modules 90000976_D 8/18/2009
bokunimowakaru 0:d72830877d98 250 XBee Wi-Fi RF Module 90002124_F 2011
bokunimowakaru 0:d72830877d98 251 (2) Massimo Banzi著 船田功訳
bokunimowakaru 0:d72830877d98 252 Arduinoをはじめよう (オライリージャパン)
bokunimowakaru 0:d72830877d98 253 (3) BestTechnology CO.,LTD.
bokunimowakaru 0:d72830877d98 254 H8/3664F I/O address definition Release 3.5 2005-11-08 (3694.h)
bokunimowakaru 0:d72830877d98 255 (4) 粕谷友章
bokunimowakaru 0:d72830877d98 256 PC-UNIX関連ドキュメント「シリアルポートプログラミング」
bokunimowakaru 0:d72830877d98 257 www006.upp.so-net.ne.jp/kasuya/linux/serial_io_programing.html
bokunimowakaru 0:d72830877d98 258 (5) JM Project Linux Programmer's Manual
bokunimowakaru 0:d72830877d98 259 Linux man-pages プロジェクト リリース 3.52 (GPL V2)
bokunimowakaru 0:d72830877d98 260 linuxjm.sourceforge.jp/html/LDP_man-pages/man2/select.2.html
bokunimowakaru 0:d72830877d98 261 (6) mbed Handbook
bokunimowakaru 0:d72830877d98 262 mbed.org/handbook/Homepage
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 /*********************************************************************
bokunimowakaru 0:d72830877d98 275 ライブラリ使用説明書
bokunimowakaru 0:d72830877d98 276
bokunimowakaru 0:d72830877d98 277 ハードウェア
bokunimowakaru 0:d72830877d98 278
bokunimowakaru 0:d72830877d98 279 PC用 以下のハードが必要です。
bokunimowakaru 0:d72830877d98 280 ・USBを搭載したIBM PC/AT互換機(通常のWindows PC)
bokunimowakaru 0:d72830877d98 281 ・XBee USBエクスプローラ、XBee-Fly USB または 純正XBIB-U-DEVなど
bokunimowakaru 0:d72830877d98 282  (http://www.geocities.jp/bokunimowakaru/diy/xbee/xbee-usb.html)
bokunimowakaru 0:d72830877d98 283 ・XBee Series 2 (ZB) モジュール
bokunimowakaru 0:d72830877d98 284
bokunimowakaru 0:d72830877d98 285 Arduino 以下のハードが必要です。
bokunimowakaru 0:d72830877d98 286 ・Arduinoマイコンボード Arduino UNO Arduino Leonardo等
bokunimowakaru 0:d72830877d98 287 ・XBee Shield (Arduino Wireless SD Shieldなど)
bokunimowakaru 0:d72830877d98 288 ・XBee Series 2 (ZB) モジュール
bokunimowakaru 0:d72830877d98 289 ・LCDキャラクタディスプレイモジュール[20×4行] SC2004CS-B
bokunimowakaru 0:d72830877d98 290
bokunimowakaru 0:d72830877d98 291  キャラクタ液晶は以下のように接続する
bokunimowakaru 0:d72830877d98 292
bokunimowakaru 0:d72830877d98 293   rs rw en d0 d1 d2 d3
bokunimowakaru 0:d72830877d98 294  // LiquidCrystal xbee_ardlcd( 8, 7, 6, 5, 4, 3, 2)
bokunimowakaru 0:d72830877d98 295  
bokunimowakaru 0:d72830877d98 296 ARM mbed用
bokunimowakaru 0:d72830877d98 297 ・STマイクロ製 Nucleo Board STM32F401で動作確認しています。
bokunimowakaru 0:d72830877d98 298 ・XBeeとの接続にはArduino用Wireless SD Shieldを使用します。
bokunimowakaru 0:d72830877d98 299  ※Nucleoボードの裏側のジャンパー抵抗の変更が必要です。
bokunimowakaru 0:d72830877d98 300 「SB14」をオープンにします(抵抗を取り外します。)
bokunimowakaru 0:d72830877d98 301 「SB62」をショートします。(半田で接続します。)
bokunimowakaru 0:d72830877d98 302 「SB63」をショートします。(半田で接続します。)
bokunimowakaru 0:d72830877d98 303 ・液晶を使用したサンプルはDF ROBOT製 LCD Keypad Shieldで
bokunimowakaru 0:d72830877d98 304  動作確認しています。
bokunimowakaru 0:d72830877d98 305
bokunimowakaru 0:d72830877d98 306 H3694用 秋月電子通商で販売されている以下のハードウェアが必要です。
bokunimowakaru 0:d72830877d98 307 ・AKI-H8/3694F(QFP) タイニーマイコンキット
bokunimowakaru 0:d72830877d98 308 ・H8タイニーI/O(アイ・オー)ボード
bokunimowakaru 0:d72830877d98 309 ・小型スライドスイッチ 1回路2接点 SS12D01G4
bokunimowakaru 0:d72830877d98 310 ・LCDキャラクタディスプレイモジュール[20×4行] SC2004CS-B
bokunimowakaru 0:d72830877d98 311 ・XBeeモジュールをRS-232Cに接続する基板(純正XBIB-R-DEVなど)
bokunimowakaru 0:d72830877d98 312  (http://www.geocities.jp/bokunimowakaru/pict/xbee-cord_sch.gif)
bokunimowakaru 0:d72830877d98 313 ・RS-232Cケーブル
bokunimowakaru 0:d72830877d98 314 ・XBee Series 2 (ZB) モジュール
bokunimowakaru 0:d72830877d98 315
bokunimowakaru 0:d72830877d98 316  キャラクタ液晶はH8/3694のCN1の14~19ピンの各出力と電源、
bokunimowakaru 0:d72830877d98 317  GNDを液晶モジュールのDB4~7およびE、RSの各入力、および
bokunimowakaru 0:d72830877d98 318  電源に接続して製作します(下図参照)。
bokunimowakaru 0:d72830877d98 319
bokunimowakaru 0:d72830877d98 320 AKI-H8      液晶モジュール
bokunimowakaru 0:d72830877d98 321 (CN1)       (HD44780搭載)
bokunimowakaru 0:d72830877d98 322 ━━┓      ┏━━━━━┓    ┯ 5V
bokunimowakaru 0:d72830877d98 323   ┃P50     ┃     ┃    |
bokunimowakaru 0:d72830877d98 324  14┠──────┨DB4  Vdd┠───●┘
bokunimowakaru 0:d72830877d98 325   ┃P51     ┃     ┃   |
bokunimowakaru 0:d72830877d98 326  15┠──────┨DB5    ┃   <
bokunimowakaru 0:d72830877d98 327   ┃P52     ┃     ┃ ┌→>
bokunimowakaru 0:d72830877d98 328  16┠──────┨DB6  VLC┠─┘ < 10k
bokunimowakaru 0:d72830877d98 329   ┃P53     ┃     ┃   |
bokunimowakaru 0:d72830877d98 330  17┠──────┨DB7 DB0-3┠─┐ |
bokunimowakaru 0:d72830877d98 331   ┃P54     ┃     ┃ | |
bokunimowakaru 0:d72830877d98 332  18┠──────┨E   R/W┠─● |
bokunimowakaru 0:d72830877d98 333   ┃P55     ┃     ┃ | |
bokunimowakaru 0:d72830877d98 334  19┠──────┨RS   Vss┠─●─●┐
bokunimowakaru 0:d72830877d98 335   ┃      ┗━━━━━┛   ┯┿┯
bokunimowakaru 0:d72830877d98 336   
bokunimowakaru 0:d72830877d98 337
bokunimowakaru 0:d72830877d98 338 port: port指定 IO名 ピン番号 共用 主な用途
bokunimowakaru 0:d72830877d98 339 port= 0 DIO0 XBee_pin 20 (Cms) Commision コミッションボタン
bokunimowakaru 0:d72830877d98 340 port= 1 DIO1 XBee_pin 19 (AD1) 汎用入力用(DIN or AIN)
bokunimowakaru 0:d72830877d98 341 port= 2 DIO2 XBee_pin 18 (AD2) 汎用入力用(DIN or AIN)
bokunimowakaru 0:d72830877d98 342 port= 3 DIO3 XBee_pin 17 (AD3) 汎用入力用(DIN or AIN)
bokunimowakaru 0:d72830877d98 343 port= 4 DIO4 XBee_pin 11 汎用出力用
bokunimowakaru 0:d72830877d98 344 port= 5 DIO5 XBee_pin 15 (Ass) ASSOSIATE indication
bokunimowakaru 0:d72830877d98 345 port= 6 DIO6 XBee_pin 16 (RTS) 汎用出力用
bokunimowakaru 0:d72830877d98 346 port=10 DIO10 XBee_pin 6 (RSSI) RSSI indication (PWM)
bokunimowakaru 0:d72830877d98 347 port=11 DIO11 XBee_pin 7 汎用出力用
bokunimowakaru 0:d72830877d98 348 port=12 DIO12 XBee_pin 4 汎用出力用
bokunimowakaru 0:d72830877d98 349
bokunimowakaru 0:d72830877d98 350 ソフト開発環境
bokunimowakaru 0:d72830877d98 351
bokunimowakaru 0:d72830877d98 352 共通
bokunimowakaru 0:d72830877d98 353 ・X-CTU (Digi社)
bokunimowakaru 0:d72830877d98 354  PCもしくはH3694、Arduinoに接続する親機側のXBeeモジュールへ
bokunimowakaru 0:d72830877d98 355  Coordinatorのファームウェアを書き込むのに必要です。
bokunimowakaru 0:d72830877d98 356
bokunimowakaru 0:d72830877d98 357 Device Type XBee Firmware Ver. ハードウェア
bokunimowakaru 0:d72830877d98 358 -----------------------------------------------------
bokunimowakaru 0:d72830877d98 359 Coordinator COORDINATOR API 2141 パソコンのシリアル端子
bokunimowakaru 0:d72830877d98 360 または秋月H8Tiny IO BOARD
bokunimowakaru 0:d72830877d98 361 またはArduino側に接続
bokunimowakaru 0:d72830877d98 362 End Device END DEVICE AT 2841 単体で駆動
bokunimowakaru 0:d72830877d98 363
bokunimowakaru 0:d72830877d98 364 Arduino用
bokunimowakaru 0:d72830877d98 365 ・Arduino IDE
bokunimowakaru 0:d72830877d98 366
bokunimowakaru 0:d72830877d98 367 ARM mbed用
bokunimowakaru 0:d72830877d98 368 ・https://mbed.org/compiler/
bokunimowakaru 0:d72830877d98 369
bokunimowakaru 0:d72830877d98 370 PC用
bokunimowakaru 0:d72830877d98 371 ・cygwin (http://www.cygwin.com/)
bokunimowakaru 0:d72830877d98 372 ・インストール時にdevl内のgcc coreとmakeを選択すること
bokunimowakaru 0:d72830877d98 373
bokunimowakaru 0:d72830877d98 374 H3694用
bokunimowakaru 0:d72830877d98 375 ・GCC Developer Lite(株式会社ベストテクノロジー)
bokunimowakaru 0:d72830877d98 376  http://www.besttechnology.co.jp/modules/knowledge/
bokunimowakaru 0:d72830877d98 377
bokunimowakaru 0:d72830877d98 378 上記ホームページの「ナレッジベース」より、技術情報/ソフト
bokunimowakaru 0:d72830877d98 379 ウェア/GCC Developer Liteからダウンロードできます。
bokunimowakaru 0:d72830877d98 380 この開発環境に含まれるH3694用のターゲットファイルを使用し
bokunimowakaru 0:d72830877d98 381 ていますので、他の環境で開発する場合は注意が必要です。
bokunimowakaru 0:d72830877d98 382 */
bokunimowakaru 0:d72830877d98 383
bokunimowakaru 0:d72830877d98 384 /*********************************************************************
bokunimowakaru 0:d72830877d98 385 インポート処理
bokunimowakaru 0:d72830877d98 386 *********************************************************************/
bokunimowakaru 0:d72830877d98 387
bokunimowakaru 0:d72830877d98 388 #ifndef LCD_TYPE_H
bokunimowakaru 0:d72830877d98 389 #define LCD_TYPE_H
bokunimowakaru 0:d72830877d98 390 #ifdef ARDUINO
bokunimowakaru 0:d72830877d98 391 #if defined(__AVR_ATmega32U4__)
bokunimowakaru 0:d72830877d98 392 #define LEONARDO // Arduino LEONARDを使用する場合に自動的に定義されます。
bokunimowakaru 0:d72830877d98 393 #endif
bokunimowakaru 0:d72830877d98 394 // #define LCD_H // 本ライブラリ動作を液晶表示する場合に定義する
bokunimowakaru 0:d72830877d98 395 // #define ADAFRUIT // 使用する液晶が Adafruit LCD Sheild の時に定義する
bokunimowakaru 0:d72830877d98 396 #else // H8 or ARM or PC
bokunimowakaru 0:d72830877d98 397 #ifndef ARM_MBED // H8 or PC
bokunimowakaru 0:d72830877d98 398 #define LCD_H
bokunimowakaru 0:d72830877d98 399 #endif
bokunimowakaru 0:d72830877d98 400 #endif
bokunimowakaru 0:d72830877d98 401 // #define XBEE_WIFI // XBee Wi-Fiを使用するときに定義する
bokunimowakaru 0:d72830877d98 402 // #define XBEE_WIFI_DEBUG
bokunimowakaru 0:d72830877d98 403 // #define LITE // ライトモード(メモリ節約・機能制限)の時に定義する
bokunimowakaru 0:d72830877d98 404 #define EASY_GPI // xbee_gpi関数(リモートGPIO)を使用するときに定義する
bokunimowakaru 0:d72830877d98 405 #define EASY_ADC // xbee_adc関数(リモートADC)を使用するときに定義する
bokunimowakaru 0:d72830877d98 406 // ##define EASY_SENSOR
bokunimowakaru 0:d72830877d98 407 #endif
bokunimowakaru 0:d72830877d98 408
bokunimowakaru 0:d72830877d98 409 #ifndef XB_IMPORT_H
bokunimowakaru 0:d72830877d98 410 #ifdef H3694
bokunimowakaru 0:d72830877d98 411 #ifndef __3694_H__
bokunimowakaru 0:d72830877d98 412 #include <3694.h>
bokunimowakaru 0:d72830877d98 413 #endif
bokunimowakaru 0:d72830877d98 414 #ifdef LCD_H
bokunimowakaru 0:d72830877d98 415 #ifndef LCD_ROW_1
bokunimowakaru 0:d72830877d98 416 #include "lcd_h8.c"
bokunimowakaru 0:d72830877d98 417 #endif
bokunimowakaru 0:d72830877d98 418 #endif
bokunimowakaru 0:d72830877d98 419 /* // lcd_h8ライブラリの関数
bokunimowakaru 0:d72830877d98 420 void lcd_delay(unsigned int data);
bokunimowakaru 0:d72830877d98 421 void lcd_toggle_E(void);
bokunimowakaru 0:d72830877d98 422 void lcd_cls(void);
bokunimowakaru 0:d72830877d98 423 void lcd_home(void);
bokunimowakaru 0:d72830877d98 424 void lcd_control(unsigned char disonoff, unsigned char curonoff, unsigned char curblink);
bokunimowakaru 0:d72830877d98 425 void lcd_goto(unsigned char mesto);
bokunimowakaru 0:d72830877d98 426 void lcd_shift(unsigned char data);
bokunimowakaru 0:d72830877d98 427 void lcd_putch(char data);
bokunimowakaru 0:d72830877d98 428 void lcd_putstr(const char *data);
bokunimowakaru 0:d72830877d98 429 void lcd_disp_bin(unsigned char x);
bokunimowakaru 0:d72830877d98 430 void lcd_disp_hex(unsigned char i);
bokunimowakaru 0:d72830877d98 431 void lcd_disp_1(unsigned int x);
bokunimowakaru 0:d72830877d98 432 void lcd_disp_2(unsigned int x);
bokunimowakaru 0:d72830877d98 433 void lcd_disp_3(unsigned int x);
bokunimowakaru 0:d72830877d98 434 void lcd_disp_5(unsigned int x);
bokunimowakaru 0:d72830877d98 435 void lcd_init(void);
bokunimowakaru 0:d72830877d98 436 */
bokunimowakaru 0:d72830877d98 437 #elif ARDUINO
bokunimowakaru 0:d72830877d98 438 // #include <inttypes.h>
bokunimowakaru 0:d72830877d98 439 #include "Arduino.h"
bokunimowakaru 0:d72830877d98 440 // #include "WProgram.h" // #if ARDUINO < 100
bokunimowakaru 0:d72830877d98 441 #ifdef LCD_H
bokunimowakaru 0:d72830877d98 442 #ifndef ADAFRUIT
bokunimowakaru 0:d72830877d98 443 // 通常のキャラクタLCDの場合
bokunimowakaru 0:d72830877d98 444 #include <LiquidCrystal.h>
bokunimowakaru 0:d72830877d98 445 #else
bokunimowakaru 0:d72830877d98 446 // Adafruit I2C接続LCDの場合(Adafruit_RGBLCDShieldライブラリが必要)
bokunimowakaru 0:d72830877d98 447 #include <Wire.h>
bokunimowakaru 0:d72830877d98 448 #include <Adafruit_MCP23017.h>
bokunimowakaru 0:d72830877d98 449 #include <Adafruit_RGBLCDShield.h>
bokunimowakaru 0:d72830877d98 450 #endif
bokunimowakaru 0:d72830877d98 451 #endif
bokunimowakaru 0:d72830877d98 452 #ifdef XBEE_WIFI
bokunimowakaru 0:d72830877d98 453 #include <SPI.h>
bokunimowakaru 0:d72830877d98 454 #include <Ethernet.h>
bokunimowakaru 0:d72830877d98 455 #include <EthernetUdp.h>
bokunimowakaru 0:d72830877d98 456 #endif
bokunimowakaru 0:d72830877d98 457 #ifndef LCD_ROW_1
bokunimowakaru 0:d72830877d98 458 #define LCD_ROW_1 0x00 //1行目先頭アドレス
bokunimowakaru 0:d72830877d98 459 #define LCD_ROW_2 0x40 //2行目先頭アドレス
bokunimowakaru 0:d72830877d98 460 #define LCD_ROW_3 0x14 //3行目先頭アドレス
bokunimowakaru 0:d72830877d98 461 #define LCD_ROW_4 0x54 //4行目先頭アドレス
bokunimowakaru 0:d72830877d98 462 #endif
bokunimowakaru 0:d72830877d98 463 #else
bokunimowakaru 0:d72830877d98 464 #ifdef ARM_MBED // ARM
bokunimowakaru 5:6ce45b34d3f0 465 // #include "mbed.h"
bokunimowakaru 0:d72830877d98 466 #ifdef DEBUG
bokunimowakaru 0:d72830877d98 467 #define LCD_H
bokunimowakaru 0:d72830877d98 468 #define ERRLOG
bokunimowakaru 0:d72830877d98 469 #define LCD_ROW_1 0x00 //1行目先頭アドレス
bokunimowakaru 0:d72830877d98 470 #define LCD_ROW_2 0x40 //2行目先頭アドレス
bokunimowakaru 0:d72830877d98 471 #define LCD_ROW_3 0x14 //3行目先頭アドレス
bokunimowakaru 0:d72830877d98 472 #define LCD_ROW_4 0x54 //4行目先頭アドレス
bokunimowakaru 0:d72830877d98 473 #endif
bokunimowakaru 0:d72830877d98 474 #else // PC
bokunimowakaru 0:d72830877d98 475 #include <stdio.h>
bokunimowakaru 0:d72830877d98 476 #include <stdlib.h>
bokunimowakaru 0:d72830877d98 477 #include <string.h>
bokunimowakaru 0:d72830877d98 478 #include <termios.h>
bokunimowakaru 0:d72830877d98 479 #include <sys/signal.h>
bokunimowakaru 0:d72830877d98 480 #include <sys/time.h>
bokunimowakaru 0:d72830877d98 481 #include <fcntl.h>
bokunimowakaru 0:d72830877d98 482 #include <unistd.h>
bokunimowakaru 0:d72830877d98 483 #include <arpa/inet.h>
bokunimowakaru 0:d72830877d98 484 #ifdef XBEE_WIFI
bokunimowakaru 0:d72830877d98 485 #include <sys/types.h>
bokunimowakaru 0:d72830877d98 486 #include <sys/socket.h>
bokunimowakaru 0:d72830877d98 487 #include <netinet/in.h>
bokunimowakaru 0:d72830877d98 488 #include <ctype.h>
bokunimowakaru 0:d72830877d98 489 #include <sys/ioctl.h>
bokunimowakaru 0:d72830877d98 490 #include <string.h>
bokunimowakaru 0:d72830877d98 491 #endif
bokunimowakaru 0:d72830877d98 492 #define BAUDRATE B9600
bokunimowakaru 0:d72830877d98 493 #ifndef LCD_ROW_1
bokunimowakaru 0:d72830877d98 494 #include "lcd_pc.c"
bokunimowakaru 0:d72830877d98 495 #endif
bokunimowakaru 0:d72830877d98 496 #include <time.h> // クロックタイマー用
bokunimowakaru 0:d72830877d98 497 #endif
bokunimowakaru 0:d72830877d98 498 #endif
bokunimowakaru 0:d72830877d98 499 #define xbee_set_myaddress(adr) xbee_ratd_myaddress(adr)
bokunimowakaru 0:d72830877d98 500 #endif
bokunimowakaru 0:d72830877d98 501
bokunimowakaru 0:d72830877d98 502 /*********************************************************************
bokunimowakaru 0:d72830877d98 503 定数の設定
bokunimowakaru 0:d72830877d98 504 *********************************************************************/
bokunimowakaru 0:d72830877d98 505 #ifndef XB_DEFINE_H
bokunimowakaru 0:d72830877d98 506 #define XB_DEFINE_H
bokunimowakaru 0:d72830877d98 507 #ifndef NAME
bokunimowakaru 0:d72830877d98 508 #ifdef LITE // BeeBee Lite by 蘭
bokunimowakaru 0:d72830877d98 509 #define NAME "BeeBee Lite"
bokunimowakaru 0:d72830877d98 510 #define COPYRIGHT "by Wataru & Ran"
bokunimowakaru 0:d72830877d98 511 #else
bokunimowakaru 0:d72830877d98 512 #define NAME "ZB Coord"
bokunimowakaru 0:d72830877d98 513 #define COPYRIGHT "by Wataru KUNINO"
bokunimowakaru 0:d72830877d98 514 #endif
bokunimowakaru 0:d72830877d98 515 #endif
bokunimowakaru 0:d72830877d98 516
bokunimowakaru 0:d72830877d98 517 #ifdef H3694
bokunimowakaru 0:d72830877d98 518 #define ERRLOG
bokunimowakaru 0:d72830877d98 519 #define LED1_OUT IO.PDR8.BIT.B0 // LED赤の接続ポート(エラー用)
bokunimowakaru 0:d72830877d98 520 #define LED2_OUT IO.PDR8.BIT.B1 // LED緑の接続ポート(動作確認用)
bokunimowakaru 0:d72830877d98 521 #define LCD_EN IO.PDR8.BIT.B6 // 液晶用電源
bokunimowakaru 0:d72830877d98 522 #define BUTN IO.PDR8.BIT.B2 // ボタンの接続ポート
bokunimowakaru 0:d72830877d98 523 #define SCI_SIZE 256 // シリアルデータ長(大きすぎるとRAMが不足する)
bokunimowakaru 0:d72830877d98 524 #define API_SIZE 128 // 受信用APIデータ長(32~255)
bokunimowakaru 0:d72830877d98 525 #define API_TXSIZE 64 // 送信用APIデータ長(32~255) シリアル送信最大長=API_TXSIZE-18バイト
bokunimowakaru 0:d72830877d98 526 #define CALL_SIZE 32 // xbee_rx_call用戻りデータ(10~256)
bokunimowakaru 0:d72830877d98 527 #define XB_AT_SIZE 32 // ATコマンドの最大長
bokunimowakaru 0:d72830877d98 528 #elif ARDUINO
bokunimowakaru 0:d72830877d98 529 // #define LED1_OUT 15 // 赤色LED(エラー用)用デジタルポート(15=analog 1)
bokunimowakaru 0:d72830877d98 530 // #define LED2_OUT 16 // 緑色LED(動作確認用)用デジタルポート(16=analog 2)
bokunimowakaru 0:d72830877d98 531 // #define LCD_EN 6 // 液晶用電源デジタルポート
bokunimowakaru 0:d72830877d98 532 // #define BUTN 14 // ボタンの接続ポート(14 = analog 0)
bokunimowakaru 0:d72830877d98 533 #ifdef LITE // BeeBee Lite by 蘭
bokunimowakaru 0:d72830877d98 534 #define API_SIZE 48 // 受信用APIデータ長(32~255)
bokunimowakaru 0:d72830877d98 535 #define API_TXSIZE 34 // 送信用APIデータ長(32~255) シリアル送信最大長=API_TXSIZE-18バイト
bokunimowakaru 0:d72830877d98 536 #define CALL_SIZE 16 // xbee_rx_call用戻りデータ(10~256)
bokunimowakaru 0:d72830877d98 537 #define XB_AT_SIZE 16 // ATコマンドの最大長
bokunimowakaru 0:d72830877d98 538 #else
bokunimowakaru 0:d72830877d98 539 #define CACHE_RES 2 // 応答時のキャッシュ数(無効にするには定義を消す)
bokunimowakaru 0:d72830877d98 540 #define API_SIZE 64 // 受信用APIデータ長(32~255)
bokunimowakaru 0:d72830877d98 541 #define API_TXSIZE 64 // 送信用APIデータ長(32~255)
bokunimowakaru 0:d72830877d98 542 #define CALL_SIZE 32 // xbee_rx_call用戻りデータ(10~256)
bokunimowakaru 0:d72830877d98 543 #define XB_AT_SIZE 32 // ATコマンドの最大長
bokunimowakaru 0:d72830877d98 544 #endif
bokunimowakaru 0:d72830877d98 545 #define LIGHT 1
bokunimowakaru 0:d72830877d98 546 #define TEMP 2
bokunimowakaru 0:d72830877d98 547 #define HUMIDITY 3
bokunimowakaru 0:d72830877d98 548 #define WATT 4
bokunimowakaru 0:d72830877d98 549 #define BATT 5
bokunimowakaru 0:d72830877d98 550 #define DISABLE 0
bokunimowakaru 0:d72830877d98 551 #define VENDER 1
bokunimowakaru 0:d72830877d98 552 #define AIN 2
bokunimowakaru 0:d72830877d98 553 #define DIN 3
bokunimowakaru 0:d72830877d98 554 #define DOUT_L 4
bokunimowakaru 0:d72830877d98 555 #define DOUT_H 5
bokunimowakaru 0:d72830877d98 556 #else
bokunimowakaru 0:d72830877d98 557 #ifdef ARM_MBED // ARM <条件は調整していない。ほぼArduinoのまま>
bokunimowakaru 0:d72830877d98 558 #define CACHE_RES 3 // 応答時のキャッシュ数(無効にするには定義を消す)
bokunimowakaru 0:d72830877d98 559 #define API_SIZE 64 // 受信用APIデータ長(32~255)
bokunimowakaru 0:d72830877d98 560 #define API_TXSIZE 64 // 送信用APIデータ長(32~255)
bokunimowakaru 0:d72830877d98 561 #define CALL_SIZE 32 // xbee_rx_call用戻りデータ(10~256)
bokunimowakaru 0:d72830877d98 562 #define XB_AT_SIZE 32 // ATコマンドの最大長
bokunimowakaru 0:d72830877d98 563 #define delay(ms) wait_millisec(ms) // 関数名の複製
bokunimowakaru 0:d72830877d98 564 #define LIGHT 1
bokunimowakaru 0:d72830877d98 565 #define TEMP 2
bokunimowakaru 0:d72830877d98 566 #define HUMIDITY 3
bokunimowakaru 0:d72830877d98 567 #define WATT 4
bokunimowakaru 0:d72830877d98 568 #define BATT 5
bokunimowakaru 0:d72830877d98 569 #define DISABLE 0
bokunimowakaru 0:d72830877d98 570 #define VENDER 1
bokunimowakaru 0:d72830877d98 571 #define AIN 2
bokunimowakaru 0:d72830877d98 572 #define DIN 3
bokunimowakaru 0:d72830877d98 573 #define DOUT_L 4
bokunimowakaru 0:d72830877d98 574 #define DOUT_H 5
bokunimowakaru 0:d72830877d98 575 #else // PC
bokunimowakaru 0:d72830877d98 576 // #define DEBUG // デバッグモード
bokunimowakaru 0:d72830877d98 577 // #define DEBUG_TX // 送信パケットの表示
bokunimowakaru 0:d72830877d98 578 // #define DEBUG_RX // 受信パケットの表示
bokunimowakaru 0:d72830877d98 579 #define ERRLOG // エラー時にログを出力
bokunimowakaru 0:d72830877d98 580 // #define XBEE_ERROR_TIME // エラー時のログに日時を付与
bokunimowakaru 0:d72830877d98 581 #ifdef LITE // BeeBee Lite by 蘭
bokunimowakaru 0:d72830877d98 582 #define API_SIZE 48 // 受信用APIデータ長(32~255)
bokunimowakaru 0:d72830877d98 583 #define API_TXSIZE 34 // 送信用APIデータ長(32~255)
bokunimowakaru 0:d72830877d98 584 #define CALL_SIZE 16 // xbee_rx_call用戻りデータ(10~256)
bokunimowakaru 0:d72830877d98 585 #define XB_AT_SIZE 16 // ATコマンドの最大長
bokunimowakaru 0:d72830877d98 586 #else
bokunimowakaru 0:d72830877d98 587 #define CACHE_RES 5 // 応答時のキャッシュ数(無効にするには定義を消す)
bokunimowakaru 0:d72830877d98 588 #define API_SIZE 128 // 受信用APIデータ長(32~255)
bokunimowakaru 0:d72830877d98 589 #define API_TXSIZE 64 // 送信用APIデータ長(32~255)
bokunimowakaru 0:d72830877d98 590 #define CALL_SIZE 64 // xbee_rx_call用戻りデータ(10~256)
bokunimowakaru 0:d72830877d98 591 #define XB_AT_SIZE 32 // ATコマンドの最大長
bokunimowakaru 0:d72830877d98 592 #define delay(ms) wait_millisec(ms) // 関数名の複製
bokunimowakaru 0:d72830877d98 593 #endif
bokunimowakaru 0:d72830877d98 594 #endif
bokunimowakaru 0:d72830877d98 595 #endif
bokunimowakaru 0:d72830877d98 596 #define TIME_DEL 3 // デリミタ検出のタイムアウト時間(秒)
bokunimowakaru 0:d72830877d98 597 #define MODE_AUTO 0x00 // 自動受信モード
bokunimowakaru 0:d72830877d98 598 #define MODE_GPIN 0x92 // GPI data を受信するモード
bokunimowakaru 0:d72830877d98 599 #define MODE_UART 0x90 // UART data を受信するモード
bokunimowakaru 0:d72830877d98 600 #define MODE_UAR2 0x91 // UART data を受信するモード2(AO=1)
bokunimowakaru 0:d72830877d98 601 #define MODE_SENS 0x94 // XB Sensorを受信するモード(1wire専用→通常のSensorはATISを使用)
bokunimowakaru 0:d72830877d98 602 #define MODE_IDNT 0x95 // Node Identifyを受信するモード
bokunimowakaru 0:d72830877d98 603 #define MODE_RES 0x88 // ローカルATコマンドの結果を受信
bokunimowakaru 0:d72830877d98 604 #define MODE_RESP 0x97 // リモートATコマンドの結果を受信(仕様書はATNDで説明ATISもこれ)
bokunimowakaru 0:d72830877d98 605 #define MODE_MODM 0x8A // Modem Statusを受信
bokunimowakaru 0:d72830877d98 606 #define MODE_TXST 0x8B // UART Transmit Status を受信
bokunimowakaru 0:d72830877d98 607 #define MODE_BATT 0xE1 // (独自定義)バッテリステータス RAT%Vの応答時
bokunimowakaru 0:d72830877d98 608 // XBeeのFrame Typeに準拠する。
bokunimowakaru 0:d72830877d98 609 // 注意:モードを増やしたときはxbee_from_acumとxbee_rx_call内の対応を追加すること
bokunimowakaru 0:d72830877d98 610 // 独自定義の時はxbee_rx_call内のみ。
bokunimowakaru 0:d72830877d98 611 // MODE値はenum定義にしない。
bokunimowakaru 0:d72830877d98 612
bokunimowakaru 0:d72830877d98 613 #define STATUS_OK 0x00 // ATコマンドの結果がOK
bokunimowakaru 0:d72830877d98 614 #define STATUS_ERR 0x01 // ATコマンドの結果がERROR
bokunimowakaru 0:d72830877d98 615 #define STATUS_ERR_AT 0x02 // 指定されたATコマンドに誤りがある
bokunimowakaru 0:d72830877d98 616 #define STATUS_ERR_PARM 0x03 // 指定されたパラメータに誤りがある
bokunimowakaru 0:d72830877d98 617 #define STATUS_ERR_AIR 0x04 // リモートATコマンドの送信の失敗(相手が応答しない)
bokunimowakaru 0:d72830877d98 618
bokunimowakaru 0:d72830877d98 619 #define MODM_RESET 0x01 // ローカルのXBeeがリセットした
bokunimowakaru 0:d72830877d98 620 #define MODM_WATCHDOG 0x02 // ローカルのXBeeがWatch dogタイマーによってリセットした
bokunimowakaru 0:d72830877d98 621 #define MODM_JOINED 0x03 // (RouterまたはEnd Deviceで使用しているときに)ネットワークJoinした
bokunimowakaru 0:d72830877d98 622 #define MODM_LEFT 0x04 // ネットワークからdis_assosiateした
bokunimowakaru 0:d72830877d98 623 #define MODM_STARTED 0x06 // (coordinatorで使用しているときに)Coordinatorを開始した
bokunimowakaru 0:d72830877d98 624
bokunimowakaru 0:d72830877d98 625 #define DEV_TYPE_XBEE 0x00 // XBeeモジュール
bokunimowakaru 0:d72830877d98 626 #define DEV_TYPE_RS232 0x05 // RS-232Cアダプタ
bokunimowakaru 0:d72830877d98 627 #define DEV_TYPE_SENS 0x07 // Sensor (1wire専用)
bokunimowakaru 0:d72830877d98 628 #define DEV_TYPE_WALL 0x08 // Wall Router
bokunimowakaru 0:d72830877d98 629 #define DEV_TYPE_SEN_LT 0x0E // Sensor (照度・温度)
bokunimowakaru 0:d72830877d98 630 #define DEV_TYPE_SEN_LTH 0x0D // Sensor (照度・温度・湿度)
bokunimowakaru 0:d72830877d98 631 #define DEV_TYPE_PLUG 0x0F // Smart Plug
bokunimowakaru 0:d72830877d98 632
bokunimowakaru 0:d72830877d98 633 #define ZB_TYPE_COORD 0x21 // ZigBee Coordinator
bokunimowakaru 0:d72830877d98 634 #define ZB_TYPE_ROUTER 0x23 // ZigBee Router
bokunimowakaru 0:d72830877d98 635 #define ZB_TYPE_ENDDEV 0x29 // ZigBee End Device
bokunimowakaru 0:d72830877d98 636 #define XB_TYPE_NULL 0x00 // XBee Wi-Fi バージョン未取得
bokunimowakaru 0:d72830877d98 637 #define XB_TYPE_WIFI10 0x10 // XBee Wi-Fi Ver. 10xx
bokunimowakaru 0:d72830877d98 638 #define XB_TYPE_WIFI20 0x20 // XBee Wi-Fi Ver. 20xx
bokunimowakaru 0:d72830877d98 639
bokunimowakaru 0:d72830877d98 640 #define NET_ADR FFFE // ネットワークアドレス
bokunimowakaru 0:d72830877d98 641 #endif
bokunimowakaru 0:d72830877d98 642
bokunimowakaru 0:d72830877d98 643 /*********************************************************************
bokunimowakaru 0:d72830877d98 644 型の定義とグローバル変数の宣言
bokunimowakaru 0:d72830877d98 645 *********************************************************************/
bokunimowakaru 0:d72830877d98 646 #ifndef XB_GLOBAL_H
bokunimowakaru 0:d72830877d98 647 #define XB_GLOBAL_H
bokunimowakaru 0:d72830877d98 648 typedef unsigned char byte; // Arduinoでも必要
bokunimowakaru 0:d72830877d98 649 #ifdef H3694
bokunimowakaru 0:d72830877d98 650 byte TIMER_SEC = 0 ; //RTCカウント用1秒単位
bokunimowakaru 0:d72830877d98 651 char sci_tx[SCI_SIZE]; // シリアル用
bokunimowakaru 0:d72830877d98 652 char sci_rx[SCI_SIZE];
bokunimowakaru 0:d72830877d98 653 #elif ARDUINO
bokunimowakaru 0:d72830877d98 654 #define TIMER_SEC time1s256()
bokunimowakaru 0:d72830877d98 655 #else
bokunimowakaru 0:d72830877d98 656 #ifdef ARM_MBED
bokunimowakaru 0:d72830877d98 657 #define TIMER_SEC time1s256()
bokunimowakaru 0:d72830877d98 658 #else // PC
bokunimowakaru 0:d72830877d98 659 #define TIMER_SEC time1s256() // TIMER_SECのカウントアップの代わり
bokunimowakaru 0:d72830877d98 660 volatile byte LED1_OUT;
bokunimowakaru 0:d72830877d98 661 volatile byte LED2_OUT;
bokunimowakaru 0:d72830877d98 662 volatile byte LCD_EN;
bokunimowakaru 0:d72830877d98 663 #endif
bokunimowakaru 0:d72830877d98 664 #endif
bokunimowakaru 0:d72830877d98 665
bokunimowakaru 0:d72830877d98 666 #ifdef ARDUINO
bokunimowakaru 0:d72830877d98 667 #ifdef LCD_H
bokunimowakaru 0:d72830877d98 668 #ifndef ADAFRUIT
bokunimowakaru 0:d72830877d98 669 // 通常のキャラクタLCDの場合
bokunimowakaru 0:d72830877d98 670 LiquidCrystal xbee_ardlcd(8, 9, 4, 5, 6, 7);
bokunimowakaru 0:d72830877d98 671 //LCD設定 rs en d0 d1 d2 d3
bokunimowakaru 0:d72830877d98 672 #else
bokunimowakaru 0:d72830877d98 673 // Adafruit I2C接続LCDの場合(Adafruit_RGBLCDShieldライブラリが必要)
bokunimowakaru 0:d72830877d98 674 Adafruit_RGBLCDShield xbee_ardlcd = Adafruit_RGBLCDShield();
bokunimowakaru 0:d72830877d98 675 #endif
bokunimowakaru 0:d72830877d98 676 #endif
bokunimowakaru 0:d72830877d98 677
bokunimowakaru 0:d72830877d98 678 // 構造体の宣言
bokunimowakaru 0:d72830877d98 679 typedef struct{
bokunimowakaru 0:d72830877d98 680 byte MODE; // 受信モード(Frame Type)
bokunimowakaru 0:d72830877d98 681 byte FROM[8]; // 送信元IEEEアドレス
bokunimowakaru 0:d72830877d98 682 byte AT[2]; // ATコマンド
bokunimowakaru 0:d72830877d98 683 byte ID; // 応答パケットID(Frame ID)
bokunimowakaru 0:d72830877d98 684 byte STATUS; // 応答結果(0:OK 1:ERROR)/AT結果/UART状態
bokunimowakaru 0:d72830877d98 685 union { // GPIOデータ
bokunimowakaru 0:d72830877d98 686 byte BYTE[2];
bokunimowakaru 0:d72830877d98 687 struct { // バイト毎に下位ビットから代入(リトルエンディアン)
bokunimowakaru 0:d72830877d98 688 byte D0 :1; byte D1 :1; byte D2 :1; byte D3 :1; // BYTE[1]
bokunimowakaru 0:d72830877d98 689 byte D4 :1; byte D5 :1; byte D6 :1; byte D7 :1;
bokunimowakaru 0:d72830877d98 690 byte :1; byte :1; byte D10:1; byte D11:1; // BYTE[0]
bokunimowakaru 0:d72830877d98 691 byte D12:1; byte :1; byte :1; byte :1;
bokunimowakaru 0:d72830877d98 692 } PORT;
bokunimowakaru 0:d72830877d98 693 } GPI;
bokunimowakaru 0:d72830877d98 694 // byte GPI[2]; // GPIOデータ
bokunimowakaru 0:d72830877d98 695 unsigned int ADCIN[4]; // ADCデータ
bokunimowakaru 0:d72830877d98 696 byte DATA[CALL_SIZE]; // 受信データ
bokunimowakaru 0:d72830877d98 697 } XBEE_RESULT; // 構造体の型名
bokunimowakaru 0:d72830877d98 698 #else
bokunimowakaru 0:d72830877d98 699 #ifdef ARM_MBED // ARM
bokunimowakaru 0:d72830877d98 700 // 構造体の宣言
bokunimowakaru 0:d72830877d98 701 typedef struct{
bokunimowakaru 0:d72830877d98 702 byte MODE; // 受信モード(Frame Type)
bokunimowakaru 0:d72830877d98 703 byte FROM[8]; // 送信元IEEEアドレス
bokunimowakaru 0:d72830877d98 704 byte AT[2]; // ATコマンド
bokunimowakaru 0:d72830877d98 705 byte ID; // 応答パケットID(Frame ID)
bokunimowakaru 0:d72830877d98 706 byte STATUS; // 応答結果(0:OK 1:ERROR)/AT結果/UART状態
bokunimowakaru 0:d72830877d98 707 union { // GPIOデータ
bokunimowakaru 0:d72830877d98 708 byte BYTE[2];
bokunimowakaru 0:d72830877d98 709 struct { // バイト毎に下位ビットから代入(リトルエンディアン)
bokunimowakaru 0:d72830877d98 710 byte D0 :1; byte D1 :1; byte D2 :1; byte D3 :1; // BYTE[1]
bokunimowakaru 0:d72830877d98 711 byte D4 :1; byte D5 :1; byte D6 :1; byte D7 :1;
bokunimowakaru 0:d72830877d98 712 byte :1; byte :1; byte D10:1; byte D11:1; // BYTE[0]
bokunimowakaru 0:d72830877d98 713 byte D12:1; byte :1; byte :1; byte :1;
bokunimowakaru 0:d72830877d98 714 } PORT;
bokunimowakaru 0:d72830877d98 715 } GPI;
bokunimowakaru 0:d72830877d98 716 // byte GPI[2]; // GPIOデータ
bokunimowakaru 0:d72830877d98 717 unsigned int ADCIN[4]; // ADCデータ
bokunimowakaru 0:d72830877d98 718 byte DATA[CALL_SIZE]; // 受信データ
bokunimowakaru 0:d72830877d98 719 } XBEE_RESULT; // 構造体の型名
bokunimowakaru 0:d72830877d98 720 #else // PC
bokunimowakaru 0:d72830877d98 721 enum xbee_sensor_type{ LIGHT,TEMP,HUMIDITY,WATT,BATT,PRESS,VALUE,TIMES,NA }; // センサタイプの型
bokunimowakaru 0:d72830877d98 722 enum xbee_port_type{ DISABLE=0, VENDER=1, AIN=2, DIN=3, DOUT_L=4, DOUT_H=5 };
bokunimowakaru 0:d72830877d98 723 // GPIOの設定の型
bokunimowakaru 0:d72830877d98 724 typedef struct{
bokunimowakaru 0:d72830877d98 725 byte MODE; // 受信モード(Frame Type)
bokunimowakaru 0:d72830877d98 726 byte FROM[8]; // 送信元IEEEアドレス
bokunimowakaru 0:d72830877d98 727 byte SHORT[2]; // 送信元ショートアドレス
bokunimowakaru 0:d72830877d98 728 byte AT[2]; // ATコマンド
bokunimowakaru 0:d72830877d98 729 byte ID; // 応答パケットID(Frame ID)
bokunimowakaru 0:d72830877d98 730 byte STATUS; // 応答結果(0:OK 1:ERROR)/AT結果/UART状態
bokunimowakaru 0:d72830877d98 731 union { // GPIOデータ
bokunimowakaru 0:d72830877d98 732 byte BYTE[2];
bokunimowakaru 0:d72830877d98 733 struct {
bokunimowakaru 0:d72830877d98 734 #ifdef H3694 // H8ではバイト毎に上位ビットから代入(ビッグエンディアン)
bokunimowakaru 0:d72830877d98 735 byte D7 :1; byte D6 :1; byte D5 :1; byte D4 :1; // BYTE[1]
bokunimowakaru 0:d72830877d98 736 byte D3 :1; byte D2 :1; byte D1 :1; byte D0 :1;
bokunimowakaru 0:d72830877d98 737 byte :1; byte :1; byte :1; byte D12:1; // BYTE[0]
bokunimowakaru 0:d72830877d98 738 byte D11:1; byte D10:1; byte :1; byte :1;
bokunimowakaru 0:d72830877d98 739 #else // PCではバイト毎に下位ビットから代入(リトルエンディアン)
bokunimowakaru 0:d72830877d98 740 byte D0 :1; byte D1 :1; byte D2 :1; byte D3 :1; // BYTE[1]
bokunimowakaru 0:d72830877d98 741 byte D4 :1; byte D5 :1; byte D6 :1; byte D7 :1;
bokunimowakaru 0:d72830877d98 742 byte :1; byte :1; byte D10:1; byte D11:1; // BYTE[0]
bokunimowakaru 0:d72830877d98 743 byte D12:1; byte :1; byte :1; byte :1;
bokunimowakaru 0:d72830877d98 744 #endif
bokunimowakaru 0:d72830877d98 745 } PORT;
bokunimowakaru 0:d72830877d98 746 } GPI;
bokunimowakaru 0:d72830877d98 747 unsigned int ADCIN[4]; // ADCデータ
bokunimowakaru 0:d72830877d98 748 byte ZCL[6]; // [0]送信元EndPoint, [1]宛先EndPoint, [2-3]クラスタID, [4-5]プロファイルID
bokunimowakaru 0:d72830877d98 749 byte DATA[CALL_SIZE]; // ペイロードデータ/ZCLヘッダ+受信データ
bokunimowakaru 0:d72830877d98 750 } XBEE_RESULT;
bokunimowakaru 0:d72830877d98 751 #endif
bokunimowakaru 0:d72830877d98 752 #endif
bokunimowakaru 0:d72830877d98 753 #ifdef CACHE_RES
bokunimowakaru 0:d72830877d98 754 byte CACHE_MEM[CACHE_RES][API_SIZE];
bokunimowakaru 0:d72830877d98 755 byte CACHE_COUNTER = 0;
bokunimowakaru 0:d72830877d98 756 #endif
bokunimowakaru 0:d72830877d98 757 #endif
bokunimowakaru 0:d72830877d98 758
bokunimowakaru 0:d72830877d98 759 #ifdef XBEE_WIFI
bokunimowakaru 0:d72830877d98 760 byte ADR_MY[] = {0xFF,0xFF,0xFF,0xFF};
bokunimowakaru 0:d72830877d98 761 #ifdef ARDUINO
bokunimowakaru 0:d72830877d98 762 extern byte mac[6];
bokunimowakaru 0:d72830877d98 763 EthernetUDP UdpXBeeR;
bokunimowakaru 0:d72830877d98 764 EthernetUDP UdpXBeeT;
bokunimowakaru 0:d72830877d98 765 EthernetUDP UdpXBeeU;
bokunimowakaru 0:d72830877d98 766 #endif
bokunimowakaru 0:d72830877d98 767 #endif
bokunimowakaru 0:d72830877d98 768
bokunimowakaru 0:d72830877d98 769 /*********************************************************************
bokunimowakaru 0:d72830877d98 770 スタティック変数の宣言
bokunimowakaru 0:d72830877d98 771 *********************************************************************/
bokunimowakaru 0:d72830877d98 772
bokunimowakaru 0:d72830877d98 773 /* エラーログ用 */
bokunimowakaru 0:d72830877d98 774 #ifdef ERRLOG
bokunimowakaru 0:d72830877d98 775 static byte TIMER_ERR = 0 ; //エラー経過時間1秒単位
bokunimowakaru 0:d72830877d98 776 static char ERR_LOG[API_TXSIZE-18];
bokunimowakaru 0:d72830877d98 777 static byte ERR_CODE=0x00;
bokunimowakaru 0:d72830877d98 778 #endif
bokunimowakaru 0:d72830877d98 779
bokunimowakaru 0:d72830877d98 780 /* IEEEアドレス(最小限の通信対象をライブラリ側で保持する)/複数のデバイスへの対応はアプリ側で行う*/
bokunimowakaru 0:d72830877d98 781 static byte ADR_FROM[]= {0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF}; //差出人のIEEEアドレス(変更可)
bokunimowakaru 0:d72830877d98 782
bokunimowakaru 0:d72830877d98 783 // 以下にお手持ちのXBeeのアドレスを予め設定しておくと毎回の検索が不要です。
bokunimowakaru 0:d72830877d98 784 static byte ADR_DEST[]= {0x00,0x13,0xA2,0x00,0x00,0x00,0x00,0x00}; //宛先のIEEEアドレス(変更可)
bokunimowakaru 0:d72830877d98 785
bokunimowakaru 0:d72830877d98 786 /* ショートアドレス/本ライブラリでの宛先指定はIEEEのみを使う */
bokunimowakaru 0:d72830877d98 787 static byte SADR_DEST[]= {0xFF,0xFE}; //ブロード(ショート)アドレス
bokunimowakaru 0:d72830877d98 788 static byte PACKET_ID = 0; //送信パケット番号
bokunimowakaru 0:d72830877d98 789
bokunimowakaru 0:d72830877d98 790 /* XBeeのデバイスタイプ ATVRの上2ケタ */
bokunimowakaru 0:d72830877d98 791 static byte DEVICE_TYPE = ZB_TYPE_COORD; // Coord=0x21 Router=23 ED=29 Wi-Fi=10
bokunimowakaru 0:d72830877d98 792
bokunimowakaru 0:d72830877d98 793 #ifndef H3694
bokunimowakaru 0:d72830877d98 794 #ifndef ARDUINO
bokunimowakaru 0:d72830877d98 795 #ifndef ARM_MBED // PC
bokunimowakaru 0:d72830877d98 796 #ifndef XBEE_WIFI
bokunimowakaru 0:d72830877d98 797 static byte xbee_com_port;
bokunimowakaru 0:d72830877d98 798 static int xbeeComFd;
bokunimowakaru 0:d72830877d98 799 static struct termios oldtio; /* current serial port settings (現在のシリアルポートの設定を待避)*/
bokunimowakaru 0:d72830877d98 800 // static byte *receive_buffer;
bokunimowakaru 0:d72830877d98 801 #else // XBEE_WIFI
bokunimowakaru 0:d72830877d98 802 int xbeeTSFd; // XBee Wi-Fi 送信ソケット用 ディスクリプタ
bokunimowakaru 0:d72830877d98 803 int xbeeRSFd; // XBee Wi-Fi 受信ソケット用 ディスクリプタ
bokunimowakaru 0:d72830877d98 804 int xbeeUSFd; // XBee Wi-Fi UARTソケット用 ディスクリプタ
bokunimowakaru 0:d72830877d98 805 struct sockaddr_in xbeeT_addr; // XBee Wi-Fi 送信アドレス構造体変数
bokunimowakaru 0:d72830877d98 806 struct sockaddr_in xbeeR_addr; // XBee Wi-Fi 受信アドレス構造体変数
bokunimowakaru 0:d72830877d98 807 struct sockaddr_in xbeeU_addr; // XBee Wi-Fi UARTアドレス構造体変数
bokunimowakaru 0:d72830877d98 808 #endif
bokunimowakaru 0:d72830877d98 809 #endif
bokunimowakaru 0:d72830877d98 810 #endif
bokunimowakaru 0:d72830877d98 811 #endif
bokunimowakaru 0:d72830877d98 812
bokunimowakaru 0:d72830877d98 813 /*********************************************************************
bokunimowakaru 0:d72830877d98 814 ハードウェア
bokunimowakaru 0:d72830877d98 815 *********************************************************************/
bokunimowakaru 0:d72830877d98 816
bokunimowakaru 0:d72830877d98 817 /* H8タイニーマイコン H3694用のタイマー設定、GPIOポート設定 */
bokunimowakaru 0:d72830877d98 818 #ifdef H3694
bokunimowakaru 0:d72830877d98 819 void port_init(void){
bokunimowakaru 0:d72830877d98 820
bokunimowakaru 0:d72830877d98 821 /*ポート1 76543210*/
bokunimowakaru 0:d72830877d98 822 IO.PMR1.BYTE = 0b00000000; // モード(P1,5) 入出力=0 その他=1
bokunimowakaru 0:d72830877d98 823 IO.PCR1 = 0b11110110; // 入出力設定 入力 =0 出力 =1 B3=リザーブ
bokunimowakaru 0:d72830877d98 824 IO.PUCR1.BYTE = 0b00000000; // プルアップ(P1,5) しない=0 する =1
bokunimowakaru 0:d72830877d98 825 IO.PDR1.BYTE = 0b00000000; // アクセス L出力=0 H出力=1
bokunimowakaru 0:d72830877d98 826
bokunimowakaru 0:d72830877d98 827 /*ポート8 76543210*/ // 秋月 H8 Tiny I/O BOARD TERA2 [K-00207]用
bokunimowakaru 0:d72830877d98 828 IO.PCR8 = 0b11111011; // 入出力設定 入力 =0 出力 =1
bokunimowakaru 0:d72830877d98 829 IO.PDR8.BYTE = 0b00000000; // アクセス L出力=0 H出力=1
bokunimowakaru 0:d72830877d98 830 }
bokunimowakaru 0:d72830877d98 831
bokunimowakaru 0:d72830877d98 832 /* タイマー初期化 */
bokunimowakaru 0:d72830877d98 833 void timer_sec_init(void){
bokunimowakaru 0:d72830877d98 834 DI;
bokunimowakaru 0:d72830877d98 835 TA.TMA.BYTE =0b00001000; /* 時計用クロック */
bokunimowakaru 0:d72830877d98 836 /* | |||-|__ 分周比 000~111(高速時) 000~011(低即時)
bokunimowakaru 0:d72830877d98 837 固定値 ___|--|| 000:0.5120 sec. 000 1000 msec.
bokunimowakaru 0:d72830877d98 838 | 001:0.2560 sec. 001 500 msec.
bokunimowakaru 0:d72830877d98 839 高速=0, 低速=1 _______| 100:0.0160 sec. 010 250 msec.
bokunimowakaru 0:d72830877d98 840 111:0.0005 sec. 011 31.25 msec.*/
bokunimowakaru 0:d72830877d98 841
bokunimowakaru 0:d72830877d98 842 IRR1.BIT.IRRTA =0; /* タイマーA割込みフラグのリセット */
bokunimowakaru 0:d72830877d98 843 IENR1.BIT.IENTA =1; /* タイマーA割込みを利用可能にする */
bokunimowakaru 0:d72830877d98 844 EI;
bokunimowakaru 0:d72830877d98 845 }
bokunimowakaru 0:d72830877d98 846
bokunimowakaru 0:d72830877d98 847 /* AKI H8 TINY IO BOARD TERA2 用/PC用の接続デバイス設定*/
bokunimowakaru 0:d72830877d98 848 byte led_red( const byte in ){
bokunimowakaru 0:d72830877d98 849 if ( in == 0 ) LED1_OUT=0;
bokunimowakaru 0:d72830877d98 850 else if ( in == 1 ) LED1_OUT=1;
bokunimowakaru 0:d72830877d98 851 return( LED1_OUT );
bokunimowakaru 0:d72830877d98 852 }
bokunimowakaru 0:d72830877d98 853 byte led_green( const byte in ){
bokunimowakaru 0:d72830877d98 854 if ( in == 0 ) LED2_OUT=0;
bokunimowakaru 0:d72830877d98 855 else if ( in == 1 ) LED2_OUT=1;
bokunimowakaru 0:d72830877d98 856 return( LED2_OUT );
bokunimowakaru 0:d72830877d98 857 }
bokunimowakaru 0:d72830877d98 858 byte button( void ){
bokunimowakaru 0:d72830877d98 859 return( BUTN );
bokunimowakaru 0:d72830877d98 860 }
bokunimowakaru 0:d72830877d98 861 void lcd_enable( const byte in ){
bokunimowakaru 0:d72830877d98 862 LCD_EN = in;
bokunimowakaru 0:d72830877d98 863 }
bokunimowakaru 0:d72830877d98 864 #endif
bokunimowakaru 0:d72830877d98 865
bokunimowakaru 0:d72830877d98 866 /* ARM mbed 用 のタイマー設定 */
bokunimowakaru 0:d72830877d98 867 #ifdef ARM_MBED // http://mbed.org/handbook/Timer
bokunimowakaru 0:d72830877d98 868 Timer _xbee_time; // http://mbed.org/teams/Aerodyne/code/Timer/file/1d3fd5616c0a/Timer.cpp
bokunimowakaru 0:d72830877d98 869 void _xbee_time_init(){
bokunimowakaru 0:d72830877d98 870 _xbee_time.start();
bokunimowakaru 0:d72830877d98 871 }
bokunimowakaru 0:d72830877d98 872 #endif
bokunimowakaru 0:d72830877d98 873
bokunimowakaru 0:d72830877d98 874 /* RTC使用1秒カウント */
bokunimowakaru 0:d72830877d98 875 byte time1s256(){
bokunimowakaru 0:d72830877d98 876 #ifdef H3694
bokunimowakaru 0:d72830877d98 877 return(0x00);
bokunimowakaru 0:d72830877d98 878 #elif ARDUINO
bokunimowakaru 0:d72830877d98 879 return( (byte)(millis()/1000) );
bokunimowakaru 0:d72830877d98 880 #else
bokunimowakaru 0:d72830877d98 881 #ifdef ARM_MBED
bokunimowakaru 3:4d3b028779c9 882 // return( (byte)(_xbee_time.read_ms()/1024) );
bokunimowakaru 4:0ca33b5953d0 883 if(_xbee_time.read()>=262144.0f)_xbee_time.reset();
bokunimowakaru 0:d72830877d98 884 return( (byte)(_xbee_time.read()) );
bokunimowakaru 3:4d3b028779c9 885 // return(0);
bokunimowakaru 0:d72830877d98 886 #else //PC
bokunimowakaru 0:d72830877d98 887 // char c='\0';
bokunimowakaru 0:d72830877d98 888 // if (kbhit()) c = getch();
bokunimowakaru 0:d72830877d98 889 time_t sec;
bokunimowakaru 0:d72830877d98 890 time( &sec );
bokunimowakaru 0:d72830877d98 891 return( (byte)sec );
bokunimowakaru 0:d72830877d98 892 #endif
bokunimowakaru 0:d72830877d98 893 #endif
bokunimowakaru 0:d72830877d98 894 }
bokunimowakaru 0:d72830877d98 895
bokunimowakaru 0:d72830877d98 896 /* RTCによる割り込み処理(1秒毎) */
bokunimowakaru 0:d72830877d98 897 #ifdef H3694
bokunimowakaru 0:d72830877d98 898 void int_timera(void){
bokunimowakaru 0:d72830877d98 899 led_green( TIMER_SEC & 0x01 ); // LEDの正常点滅
bokunimowakaru 0:d72830877d98 900 #ifdef ERRLOG
bokunimowakaru 0:d72830877d98 901 if( led_red( 0xFF ) == 1 ) TIMER_ERR++; // エラー秒数(LED_赤でエラー検出)
bokunimowakaru 0:d72830877d98 902 #endif
bokunimowakaru 0:d72830877d98 903 TIMER_SEC++; // タイマーのカウントアップ
bokunimowakaru 0:d72830877d98 904 IRR1.BIT.IRRTA=0; // タイマーA割込フラグのリセット
bokunimowakaru 0:d72830877d98 905 }
bokunimowakaru 0:d72830877d98 906 #endif
bokunimowakaru 0:d72830877d98 907
bokunimowakaru 0:d72830877d98 908 /* シリアル待ち時間の時間カウント用、RTC使用1秒間に256カウント */
bokunimowakaru 0:d72830877d98 909 byte timera(void){
bokunimowakaru 0:d72830877d98 910 #ifdef H3694
bokunimowakaru 0:d72830877d98 911 return( (byte)TA.TCA );
bokunimowakaru 0:d72830877d98 912 #elif ARDUINO
bokunimowakaru 0:d72830877d98 913 return( (byte)( (millis()/4)%256 ) );
bokunimowakaru 0:d72830877d98 914 #else
bokunimowakaru 0:d72830877d98 915 #ifdef ARM_MBED
bokunimowakaru 3:4d3b028779c9 916 return( (byte)((_xbee_time.read_ms()/4)%256) );
bokunimowakaru 3:4d3b028779c9 917 // return( (byte)(_xbee_time.read()*256) );
bokunimowakaru 3:4d3b028779c9 918 // return(0);
bokunimowakaru 0:d72830877d98 919 #else //PC
bokunimowakaru 0:d72830877d98 920 return( (byte)(clock()/(CLOCKS_PER_SEC/256)) );
bokunimowakaru 0:d72830877d98 921 #endif
bokunimowakaru 0:d72830877d98 922 #endif
bokunimowakaru 0:d72830877d98 923 }
bokunimowakaru 0:d72830877d98 924
bokunimowakaru 0:d72830877d98 925 /* ミリ秒待ち(250ms以下の高精度用) 入力範囲=4~250 ms */
bokunimowakaru 0:d72830877d98 926 #ifndef ARDUINO // BeeBee Lite by 蘭
bokunimowakaru 0:d72830877d98 927 void wait_millisec_250( byte ms ){
bokunimowakaru 0:d72830877d98 928 #ifdef H3694
bokunimowakaru 0:d72830877d98 929 byte counter;
bokunimowakaru 0:d72830877d98 930
bokunimowakaru 0:d72830877d98 931 if( ms < 0x04 ) ms = 0x04;
bokunimowakaru 0:d72830877d98 932 counter = timera() + (byte)( ms>>2 );
bokunimowakaru 0:d72830877d98 933 if( counter == timera() ) counter++;
bokunimowakaru 0:d72830877d98 934 while( counter != timera() );
bokunimowakaru 0:d72830877d98 935 #elif ARDUINO
bokunimowakaru 0:d72830877d98 936 delay( (unsigned long) ms );
bokunimowakaru 0:d72830877d98 937 #else
bokunimowakaru 0:d72830877d98 938 #ifdef ARM_MBED
bokunimowakaru 0:d72830877d98 939 wait((float)ms/1000);
bokunimowakaru 0:d72830877d98 940 #endif
bokunimowakaru 0:d72830877d98 941 #endif
bokunimowakaru 0:d72830877d98 942 }
bokunimowakaru 0:d72830877d98 943 #endif
bokunimowakaru 0:d72830877d98 944
bokunimowakaru 0:d72830877d98 945 /* ミリ秒待ち(30秒までの広範囲版) 入力範囲=4~30,000 ms */
bokunimowakaru 0:d72830877d98 946 void wait_millisec( const unsigned int ms ){
bokunimowakaru 0:d72830877d98 947 #ifdef H3694
bokunimowakaru 0:d72830877d98 948 byte loops;
bokunimowakaru 0:d72830877d98 949 if( ms < 250 ){
bokunimowakaru 0:d72830877d98 950 wait_millisec_250( (byte)ms );
bokunimowakaru 0:d72830877d98 951 }else{
bokunimowakaru 0:d72830877d98 952 loops = (byte)( ms / 250);
bokunimowakaru 0:d72830877d98 953 wait_millisec_250( (byte)(ms-loops*250) );
bokunimowakaru 0:d72830877d98 954 while( loops > 0x00 ){
bokunimowakaru 0:d72830877d98 955 wait_millisec_250( 0xFA );
bokunimowakaru 0:d72830877d98 956 loops--;
bokunimowakaru 0:d72830877d98 957 }
bokunimowakaru 0:d72830877d98 958 }
bokunimowakaru 0:d72830877d98 959 #elif ARDUINO
bokunimowakaru 0:d72830877d98 960 delay( (unsigned long) ms );
bokunimowakaru 0:d72830877d98 961 #else
bokunimowakaru 0:d72830877d98 962 #ifdef ARM_MBED
bokunimowakaru 3:4d3b028779c9 963 wait((float)ms/1000.0f);
bokunimowakaru 0:d72830877d98 964 #else // PC
bokunimowakaru 0:d72830877d98 965 time_t target;
bokunimowakaru 0:d72830877d98 966
bokunimowakaru 0:d72830877d98 967 target = (time_t)(clock()/(CLOCKS_PER_SEC/1000)) + (time_t)ms;
bokunimowakaru 0:d72830877d98 968 if( target >= (time_t)ms ){
bokunimowakaru 0:d72830877d98 969 while( (time_t)(clock()/(CLOCKS_PER_SEC/1000)) <= target );
bokunimowakaru 0:d72830877d98 970 }else{
bokunimowakaru 0:d72830877d98 971 while( (time_t)(clock()/(CLOCKS_PER_SEC/1000)) > (time_t)ms ); // クロックがリセットされるまで待つ
bokunimowakaru 0:d72830877d98 972 while( (time_t)(clock()/(CLOCKS_PER_SEC/1000)) <= target );
bokunimowakaru 0:d72830877d98 973 }
bokunimowakaru 0:d72830877d98 974 #endif
bokunimowakaru 0:d72830877d98 975 #endif
bokunimowakaru 0:d72830877d98 976 }
bokunimowakaru 0:d72830877d98 977
bokunimowakaru 0:d72830877d98 978 /* 経過時間測定=4~1000 ms 以内 単位は1/256秒毎 */
bokunimowakaru 0:d72830877d98 979 byte past_time(const byte time_from){
bokunimowakaru 0:d72830877d98 980 return( timera() - time_from );
bokunimowakaru 0:d72830877d98 981 }
bokunimowakaru 0:d72830877d98 982
bokunimowakaru 0:d72830877d98 983 /* XBeeのADCの有効ポート数を調べる ADC1~3のみ 入力=バイトデータ 応答0~3個 */
bokunimowakaru 0:d72830877d98 984 byte xbee_adc_count( byte d ){
bokunimowakaru 0:d72830877d98 985 return( ((d>>1)&0x01)+((d>>2)&0x01)+((d>>3)&0x01) );
bokunimowakaru 0:d72830877d98 986 }
bokunimowakaru 0:d72830877d98 987
bokunimowakaru 0:d72830877d98 988 /* XBee用シリアル通信ドライバ */
bokunimowakaru 0:d72830877d98 989 #ifndef ARDUINO
bokunimowakaru 0:d72830877d98 990 #ifndef H3694
bokunimowakaru 0:d72830877d98 991 #ifndef ARM_MBED
bokunimowakaru 0:d72830877d98 992 #ifndef XBEE_WIFI
bokunimowakaru 0:d72830877d98 993 int open_serial_port(char *modem_dev){
bokunimowakaru 0:d72830877d98 994 /*
bokunimowakaru 0:d72830877d98 995 PC-UNIX関連ドキュメント
bokunimowakaru 0:d72830877d98 996 「シリアルポートプログラミング」
bokunimowakaru 0:d72830877d98 997 http://www006.upp.so-net.ne.jp/kasuya/linux/serial_io_programing.html
bokunimowakaru 0:d72830877d98 998 writer:粕谷友章 kasuya@pd5.so-net.ne.jp
bokunimowakaru 0:d72830877d98 999 */
bokunimowakaru 0:d72830877d98 1000 struct termios newtio;
bokunimowakaru 0:d72830877d98 1001 speed_t speed = B9600;
bokunimowakaru 0:d72830877d98 1002 xbeeComFd=open(modem_dev,O_RDWR);
bokunimowakaru 0:d72830877d98 1003 if(xbeeComFd < 0){
bokunimowakaru 0:d72830877d98 1004 perror(modem_dev);
bokunimowakaru 0:d72830877d98 1005 return -1;
bokunimowakaru 0:d72830877d98 1006 }else{
bokunimowakaru 0:d72830877d98 1007 tcgetattr(xbeeComFd,&oldtio);
bokunimowakaru 0:d72830877d98 1008 newtio.c_iflag = 0;
bokunimowakaru 0:d72830877d98 1009 newtio.c_oflag = 0;
bokunimowakaru 0:d72830877d98 1010 newtio.c_cflag = 0;
bokunimowakaru 0:d72830877d98 1011 newtio.c_lflag = 0;
bokunimowakaru 0:d72830877d98 1012 newtio.c_line = 0;
bokunimowakaru 0:d72830877d98 1013 bzero(newtio.c_cc,sizeof(newtio.c_cc));
bokunimowakaru 0:d72830877d98 1014 cfsetispeed( &newtio, speed );
bokunimowakaru 0:d72830877d98 1015 cfsetospeed( &newtio, speed );
bokunimowakaru 0:d72830877d98 1016 newtio.c_cflag = BAUDRATE | CLOCAL | CREAD ;
bokunimowakaru 0:d72830877d98 1017 newtio.c_cflag &= ~CSIZE;
bokunimowakaru 0:d72830877d98 1018 newtio.c_cflag |= CS8;
bokunimowakaru 0:d72830877d98 1019 newtio.c_oflag = 0;
bokunimowakaru 0:d72830877d98 1020 newtio.c_lflag = 0;
bokunimowakaru 0:d72830877d98 1021 newtio.c_cc[VMIN] = 0;
bokunimowakaru 0:d72830877d98 1022 newtio.c_cc[VTIME] = 0;
bokunimowakaru 0:d72830877d98 1023 tcflush(xbeeComFd,TCIFLUSH);
bokunimowakaru 0:d72830877d98 1024 tcsetattr(xbeeComFd,TCSANOW,&newtio);
bokunimowakaru 0:d72830877d98 1025 }
bokunimowakaru 0:d72830877d98 1026 return 0;
bokunimowakaru 0:d72830877d98 1027 }
bokunimowakaru 0:d72830877d98 1028 void close_serial_port(void){
bokunimowakaru 0:d72830877d98 1029 tcsetattr(xbeeComFd,TCSANOW,&oldtio);
bokunimowakaru 0:d72830877d98 1030 close(xbeeComFd);
bokunimowakaru 0:d72830877d98 1031 }
bokunimowakaru 0:d72830877d98 1032 #else // XBEE_WIFI(arduino除く)
bokunimowakaru 0:d72830877d98 1033 int open_serial_port_tx(const byte *address){ // modem_dev=IPアドレスのポインタ
bokunimowakaru 0:d72830877d98 1034 byte i;
bokunimowakaru 0:d72830877d98 1035 in_addr_t ip=0; // 送信アドレス
bokunimowakaru 0:d72830877d98 1036
bokunimowakaru 0:d72830877d98 1037 for(i=0;i<4;i++){
bokunimowakaru 0:d72830877d98 1038 ip *= 256;
bokunimowakaru 0:d72830877d98 1039 ip += (in_addr_t)(byte)address[3-i]; // アドレス順序は反転する
bokunimowakaru 0:d72830877d98 1040 }
bokunimowakaru 0:d72830877d98 1041 /* 送信アドレス設定 */
bokunimowakaru 0:d72830877d98 1042 memset(&xbeeT_addr, 0, sizeof(xbeeT_addr)); // xbeeT_addrの初期化
bokunimowakaru 0:d72830877d98 1043 xbeeT_addr.sin_family = AF_INET; // アドレスファミリー AF_INET
bokunimowakaru 0:d72830877d98 1044 xbeeT_addr.sin_port = htons( 0xBEE ); // 送信ポート番号
bokunimowakaru 0:d72830877d98 1045 xbeeT_addr.sin_addr.s_addr = ip; // 送信IPアドレス
bokunimowakaru 0:d72830877d98 1046 /* ソケット生成 */
bokunimowakaru 0:d72830877d98 1047 xbeeTSFd = socket(AF_INET, SOCK_DGRAM, 0); // 送信用ソケットの生成
bokunimowakaru 0:d72830877d98 1048 #ifdef DEBUG
bokunimowakaru 0:d72830877d98 1049 printf("IP(TX)=%s\n", inet_ntoa( xbeeT_addr.sin_addr ) );
bokunimowakaru 0:d72830877d98 1050 #endif
bokunimowakaru 0:d72830877d98 1051 return 0;
bokunimowakaru 0:d72830877d98 1052 }
bokunimowakaru 0:d72830877d98 1053 int open_serial_port_rx( void ){ // modem_dev=IPアドレスのポインタ
bokunimowakaru 0:d72830877d98 1054 /* 受信アドレス設定 */
bokunimowakaru 0:d72830877d98 1055 memset(&xbeeR_addr, 0, sizeof(xbeeR_addr)); // xbeeR_addrの初期化
bokunimowakaru 0:d72830877d98 1056 memset(&xbeeU_addr, 0, sizeof(xbeeU_addr)); // xbeeU_addrの初期化
bokunimowakaru 0:d72830877d98 1057 xbeeR_addr.sin_family = AF_INET; // アドレスファミリー AF_INET
bokunimowakaru 0:d72830877d98 1058 xbeeU_addr.sin_family = AF_INET; // アドレスファミリー AF_INET
bokunimowakaru 0:d72830877d98 1059 xbeeR_addr.sin_port = htons( 0xBEE ); // 受信ポート番号(3054)
bokunimowakaru 0:d72830877d98 1060 xbeeU_addr.sin_port = htons( 0x2616 ); // 受信ポート番号(9750 board-voip)
bokunimowakaru 0:d72830877d98 1061 xbeeR_addr.sin_addr.s_addr = htonl(INADDR_ANY); // 受信IPアドレス(ANY)
bokunimowakaru 0:d72830877d98 1062 xbeeU_addr.sin_addr.s_addr = htonl(INADDR_ANY); // 受信IPアドレス(ANY)
bokunimowakaru 0:d72830877d98 1063 /* ソケット生成 */
bokunimowakaru 0:d72830877d98 1064 xbeeRSFd = socket(AF_INET, SOCK_DGRAM, 0); // 受信用ソケットの生成
bokunimowakaru 0:d72830877d98 1065 xbeeUSFd = socket(AF_INET, SOCK_DGRAM, 0); // 受信用ソケットの生成
bokunimowakaru 0:d72830877d98 1066 /* バインド */
bokunimowakaru 0:d72830877d98 1067 return(
bokunimowakaru 0:d72830877d98 1068 bind(xbeeRSFd, (struct sockaddr *)&xbeeR_addr, sizeof(xbeeR_addr)) +
bokunimowakaru 0:d72830877d98 1069 bind(xbeeUSFd, (struct sockaddr *)&xbeeU_addr, sizeof(xbeeU_addr))
bokunimowakaru 0:d72830877d98 1070 );
bokunimowakaru 0:d72830877d98 1071 }
bokunimowakaru 0:d72830877d98 1072 int open_serial_port(const byte *modem_dev){ // modem_dev=IPアドレスのポインタ
bokunimowakaru 0:d72830877d98 1073 /* UDPソケットを生成する。戻り値:0=成功、-1=エラー
bokunimowakaru 0:d72830877d98 1074 入力はcharだけど中ではbyteとして扱う。byteアドレス→char入力→byte使用なので変換は不要 */
bokunimowakaru 0:d72830877d98 1075 open_serial_port_tx( modem_dev );
bokunimowakaru 0:d72830877d98 1076 return( open_serial_port_rx( ) );
bokunimowakaru 0:d72830877d98 1077 }
bokunimowakaru 0:d72830877d98 1078 void close_serial_port_tx(void){
bokunimowakaru 0:d72830877d98 1079 close(xbeeTSFd);
bokunimowakaru 0:d72830877d98 1080 #ifdef DEBUG
bokunimowakaru 0:d72830877d98 1081 printf("DEBUG:close xbee tx sock\n");
bokunimowakaru 0:d72830877d98 1082 #endif
bokunimowakaru 0:d72830877d98 1083 }
bokunimowakaru 0:d72830877d98 1084 void close_serial_port(void){
bokunimowakaru 0:d72830877d98 1085 close(xbeeTSFd);
bokunimowakaru 0:d72830877d98 1086 close(xbeeRSFd);
bokunimowakaru 0:d72830877d98 1087 close(xbeeUSFd);
bokunimowakaru 0:d72830877d98 1088 #ifdef DEBUG
bokunimowakaru 0:d72830877d98 1089 printf("DEBUG:close xbee tx and rx sock\n");
bokunimowakaru 0:d72830877d98 1090 #endif
bokunimowakaru 0:d72830877d98 1091 }
bokunimowakaru 0:d72830877d98 1092 #endif
bokunimowakaru 0:d72830877d98 1093 #endif // not ARM
bokunimowakaru 0:d72830877d98 1094 #endif // not H3694
bokunimowakaru 0:d72830877d98 1095 #endif // not ARDUINO
bokunimowakaru 0:d72830877d98 1096
bokunimowakaru 0:d72830877d98 1097 #ifdef ARDUINO
bokunimowakaru 0:d72830877d98 1098 #ifdef XBEE_WIFI
bokunimowakaru 0:d72830877d98 1099 int open_serial_port(void){
bokunimowakaru 0:d72830877d98 1100 Ethernet.begin(mac);
bokunimowakaru 0:d72830877d98 1101 delay(1000);
bokunimowakaru 0:d72830877d98 1102 UdpXBeeU.begin(0x2616); // UART受信用のUDP開始
bokunimowakaru 0:d72830877d98 1103 UdpXBeeR.begin(0xBEE); // URAT リモートATコマンド受信用のUDPの開始
bokunimowakaru 0:d72830877d98 1104 UdpXBeeT.begin(0xBEE); // URAT リモートATコマンド送信用のUDPの開始
bokunimowakaru 0:d72830877d98 1105 return( 0 );
bokunimowakaru 0:d72830877d98 1106 }
bokunimowakaru 0:d72830877d98 1107 #endif // XBEE_WIFI
bokunimowakaru 0:d72830877d98 1108 #endif // ARDUINO
bokunimowakaru 0:d72830877d98 1109
bokunimowakaru 0:d72830877d98 1110 /* シリアルの初期化 */
bokunimowakaru 5:6ce45b34d3f0 1111 /*
bokunimowakaru 0:d72830877d98 1112 #ifdef ARM_MBED
bokunimowakaru 1:ffa16e9131c6 1113 RawSerial _xbee_serial(SERIAL_TX, SERIAL_RX); // USART2
bokunimowakaru 2:5dbdfe0ca04f 1114 // RawSerial _xbee_serial(D1, D0); //
bokunimowakaru 0:d72830877d98 1115 #ifdef DEBUG
bokunimowakaru 1:ffa16e9131c6 1116 RawSerial _xbee_debug(PA_9, NC); // USART1
bokunimowakaru 2:5dbdfe0ca04f 1117 // RawSerial _xbee_debug(PA_9, PA_10); // USART1
bokunimowakaru 0:d72830877d98 1118 #endif
bokunimowakaru 0:d72830877d98 1119 #endif
bokunimowakaru 5:6ce45b34d3f0 1120 */
bokunimowakaru 0:d72830877d98 1121
bokunimowakaru 0:d72830877d98 1122 /* シリアル受信用コールバック(ARM専用) */
bokunimowakaru 0:d72830877d98 1123 /* Serial.readableで確認してからSerial.getcする方法だと、連続した2バイト以上の
bokunimowakaru 0:d72830877d98 1124  データ列を受信できなかった。STマイクロの問題なのかmbedの問題かは不明だが、
bokunimowakaru 0:d72830877d98 1125  ハードウェアの受信バッファ内のデータをうまく読めないものと思う。
bokunimowakaru 0:d72830877d98 1126  したがって、割込みで取り込んでソフト受信バッファを実装することにした。
bokunimowakaru 0:d72830877d98 1127  バッファサイズはとりあえず128バイト */
bokunimowakaru 0:d72830877d98 1128 #ifdef ARM_MBED
bokunimowakaru 0:d72830877d98 1129 #define ARM_RX_BUFFER 64
bokunimowakaru 0:d72830877d98 1130 volatile byte _xbee_serial_buf[ARM_RX_BUFFER];
bokunimowakaru 0:d72830877d98 1131 volatile byte _xbee_serial_bp=0;
bokunimowakaru 0:d72830877d98 1132 volatile byte _xbee_serial_rp=0;
bokunimowakaru 0:d72830877d98 1133 void _xbee_serial_callback(){
bokunimowakaru 0:d72830877d98 1134 _xbee_serial_buf[_xbee_serial_bp] = _xbee_serial.getc();
bokunimowakaru 0:d72830877d98 1135 if(_xbee_serial_bp < (ARM_RX_BUFFER-1))_xbee_serial_bp++;
bokunimowakaru 0:d72830877d98 1136 else{
bokunimowakaru 0:d72830877d98 1137 #ifdef DEBUG
bokunimowakaru 0:d72830877d98 1138 _xbee_debug.printf("ERR:Buffer Full(%d)\r\n",_xbee_serial_bp);
bokunimowakaru 0:d72830877d98 1139 #endif
bokunimowakaru 0:d72830877d98 1140 }
bokunimowakaru 0:d72830877d98 1141 }
bokunimowakaru 0:d72830877d98 1142 #endif
bokunimowakaru 0:d72830877d98 1143
bokunimowakaru 0:d72830877d98 1144 /* シリアルの初期化 */
bokunimowakaru 0:d72830877d98 1145 byte sci_init( byte port ){
bokunimowakaru 0:d72830877d98 1146 #ifdef H3694
bokunimowakaru 0:d72830877d98 1147 SCI3_INIT(br9600, sci_tx, SCI_SIZE, sci_tx, SCI_SIZE);
bokunimowakaru 0:d72830877d98 1148 EI; // 割り込み許可
bokunimowakaru 0:d72830877d98 1149 return(1);
bokunimowakaru 0:d72830877d98 1150 #elif ARDUINO
bokunimowakaru 0:d72830877d98 1151 #ifndef XBEE_WIFI
bokunimowakaru 0:d72830877d98 1152 #ifdef LEONARDO
bokunimowakaru 0:d72830877d98 1153 Serial1.begin(9600);
bokunimowakaru 0:d72830877d98 1154 #else
bokunimowakaru 0:d72830877d98 1155 Serial.begin(9600);
bokunimowakaru 0:d72830877d98 1156 #endif
bokunimowakaru 0:d72830877d98 1157 return(1);
bokunimowakaru 0:d72830877d98 1158 #else // Arduino XBee_WIFI
bokunimowakaru 0:d72830877d98 1159 byte i;
bokunimowakaru 0:d72830877d98 1160 #ifdef XBEE_WIFI_DEBUG
bokunimowakaru 0:d72830877d98 1161 Serial.begin(9600); // TEST用
bokunimowakaru 0:d72830877d98 1162 Serial.println("Hello!");
bokunimowakaru 0:d72830877d98 1163 #endif
bokunimowakaru 0:d72830877d98 1164 open_serial_port();
bokunimowakaru 0:d72830877d98 1165 return(1);
bokunimowakaru 0:d72830877d98 1166 #endif
bokunimowakaru 0:d72830877d98 1167 #else
bokunimowakaru 0:d72830877d98 1168 #ifdef ARM_MBED
bokunimowakaru 0:d72830877d98 1169 _xbee_serial.baud(9600);
bokunimowakaru 0:d72830877d98 1170 _xbee_serial.attach(&_xbee_serial_callback);
bokunimowakaru 0:d72830877d98 1171 #ifdef DEBUG
bokunimowakaru 0:d72830877d98 1172 _xbee_debug.baud(38400);
bokunimowakaru 0:d72830877d98 1173 #endif
bokunimowakaru 0:d72830877d98 1174 return(1);
bokunimowakaru 0:d72830877d98 1175 #else // PC の時(ZigBeeシリアル or WiFi_LAN)
bokunimowakaru 0:d72830877d98 1176 #ifndef XBEE_WIFI // ZigBeeシリアル
bokunimowakaru 0:d72830877d98 1177 /* tasasaki様よりポート11~64の拡張対応方法を教えていただいて追加した。*/
bokunimowakaru 0:d72830877d98 1178 char modem_dev[12] = "/dev/ttyS00";
bokunimowakaru 0:d72830877d98 1179
bokunimowakaru 0:d72830877d98 1180 if( port <= 10){
bokunimowakaru 0:d72830877d98 1181 modem_dev[9] = (char)( port - 1 + (byte)'0' );
bokunimowakaru 0:d72830877d98 1182 modem_dev[10]= '\0';
bokunimowakaru 0:d72830877d98 1183 }else if( port <= 64 ){
bokunimowakaru 0:d72830877d98 1184 snprintf(&modem_dev[9], 3, "%d", port - 1);
bokunimowakaru 0:d72830877d98 1185 }else{
bokunimowakaru 0:d72830877d98 1186 fprintf(stderr,"ERR:sci_init port=%d\n",port);
bokunimowakaru 0:d72830877d98 1187 return(0);
bokunimowakaru 0:d72830877d98 1188 }
bokunimowakaru 0:d72830877d98 1189 if( open_serial_port( modem_dev ) ){
bokunimowakaru 0:d72830877d98 1190 wait_millisec( 100 );
bokunimowakaru 0:d72830877d98 1191 close_serial_port(); // open出来ていないが念のために閉じる
bokunimowakaru 0:d72830877d98 1192 wait_millisec( 100 );
bokunimowakaru 0:d72830877d98 1193 fprintf(stderr,"Failed serial COM%d (%s)\n",port,modem_dev);
bokunimowakaru 0:d72830877d98 1194 port = 0;
bokunimowakaru 0:d72830877d98 1195 }else{
bokunimowakaru 0:d72830877d98 1196 fprintf(stderr,"Serial port = COM%d (%s)\n",port,modem_dev);
bokunimowakaru 0:d72830877d98 1197 xbee_com_port = port;
bokunimowakaru 0:d72830877d98 1198 }
bokunimowakaru 0:d72830877d98 1199 return( port );
bokunimowakaru 0:d72830877d98 1200 #else // XBEE_WIFI PC用
bokunimowakaru 0:d72830877d98 1201 byte i,j;
bokunimowakaru 0:d72830877d98 1202 for(i=0;i<3;i++){
bokunimowakaru 0:d72830877d98 1203 if( open_serial_port( ADR_DEST ) < 0 ){
bokunimowakaru 0:d72830877d98 1204 fprintf(stderr,"Failed UDP[%d/3]:",i+1);
bokunimowakaru 0:d72830877d98 1205 for(j=0;j<4;j++) fprintf(stderr,"%d.",(int)ADR_DEST[j]);
bokunimowakaru 0:d72830877d98 1206 fprintf(stderr,"\b\n");
bokunimowakaru 0:d72830877d98 1207 wait_millisec( 100 );
bokunimowakaru 0:d72830877d98 1208 close_serial_port(); // open出来ていないが念のために閉じる
bokunimowakaru 0:d72830877d98 1209 wait_millisec( 900 );
bokunimowakaru 0:d72830877d98 1210 }else break;
bokunimowakaru 0:d72830877d98 1211 }
bokunimowakaru 0:d72830877d98 1212 #ifdef DEBUG
bokunimowakaru 0:d72830877d98 1213 printf("DEBUG:SCI init for WiFi done\n");
bokunimowakaru 0:d72830877d98 1214 #endif
bokunimowakaru 0:d72830877d98 1215 return( 3-i );
bokunimowakaru 0:d72830877d98 1216 #endif // Wifi
bokunimowakaru 0:d72830877d98 1217 #endif // ARM/PC
bokunimowakaru 0:d72830877d98 1218 #endif
bokunimowakaru 0:d72830877d98 1219 }
bokunimowakaru 0:d72830877d98 1220
bokunimowakaru 0:d72830877d98 1221 /* シリアル送受信バッファクリア */
bokunimowakaru 0:d72830877d98 1222 void sci_clear(void){
bokunimowakaru 0:d72830877d98 1223 #ifdef H3694
bokunimowakaru 0:d72830877d98 1224 SCI3_IN_DATA_CLEAR();
bokunimowakaru 0:d72830877d98 1225 SCI3_OUT_DATA_CLEAR();
bokunimowakaru 0:d72830877d98 1226 #elif ARDUINO
bokunimowakaru 0:d72830877d98 1227 #ifndef XBEE_WIFI
bokunimowakaru 0:d72830877d98 1228 #ifdef LEONARDO
bokunimowakaru 0:d72830877d98 1229 Serial1.flush();
bokunimowakaru 0:d72830877d98 1230 #else
bokunimowakaru 0:d72830877d98 1231 Serial.flush();
bokunimowakaru 0:d72830877d98 1232 #endif
bokunimowakaru 0:d72830877d98 1233 #endif
bokunimowakaru 0:d72830877d98 1234 #else
bokunimowakaru 0:d72830877d98 1235 #ifdef ARM_MBED
bokunimowakaru 1:ffa16e9131c6 1236 while( _xbee_serial.readable() ){
bokunimowakaru 1:ffa16e9131c6 1237 _xbee_serial.getc();
bokunimowakaru 1:ffa16e9131c6 1238 wait(0.002);
bokunimowakaru 1:ffa16e9131c6 1239 }
bokunimowakaru 1:ffa16e9131c6 1240 while( !_xbee_serial.writeable() ){
bokunimowakaru 1:ffa16e9131c6 1241 _xbee_serial.send_break();
bokunimowakaru 1:ffa16e9131c6 1242 wait(1);
bokunimowakaru 1:ffa16e9131c6 1243 }
bokunimowakaru 0:d72830877d98 1244 #else //PC
bokunimowakaru 0:d72830877d98 1245 #ifndef XBEE_WIFI // ZigBee
bokunimowakaru 0:d72830877d98 1246 tcflush(xbeeComFd,TCIOFLUSH);
bokunimowakaru 0:d72830877d98 1247 #else // XBEE_WIFI
bokunimowakaru 0:d72830877d98 1248 close_serial_port();
bokunimowakaru 0:d72830877d98 1249 sci_init( 0 );
bokunimowakaru 0:d72830877d98 1250 #endif
bokunimowakaru 0:d72830877d98 1251 #endif
bokunimowakaru 0:d72830877d98 1252 #endif
bokunimowakaru 0:d72830877d98 1253 }
bokunimowakaru 0:d72830877d98 1254
bokunimowakaru 0:d72830877d98 1255 /* シリアル受信(1バイト) */
bokunimowakaru 0:d72830877d98 1256 byte sci_read(byte timeout){
bokunimowakaru 0:d72830877d98 1257 #ifdef H3694
bokunimowakaru 0:d72830877d98 1258 byte timer;
bokunimowakaru 0:d72830877d98 1259 byte ret=0;
bokunimowakaru 0:d72830877d98 1260 timer = timera() + (timeout)+1; // timeout[ms] = timer/256*1000
bokunimowakaru 0:d72830877d98 1261 while( timer != timera() && SCI3_IN_DATA_CHECK() < 1 );
bokunimowakaru 0:d72830877d98 1262 if( SCI3_IN_DATA_CHECK() ) ret=(byte)SCI3_IN_DATA();
bokunimowakaru 0:d72830877d98 1263 return( ret );
bokunimowakaru 0:d72830877d98 1264 #elif ARDUINO // 蘭様による改良あり
bokunimowakaru 0:d72830877d98 1265 #ifndef XBEE_WIFI
bokunimowakaru 0:d72830877d98 1266 byte timer;
bokunimowakaru 0:d72830877d98 1267 timer = timera() + (timeout)+1; // timeout[ms] = timer/256*1000
bokunimowakaru 0:d72830877d98 1268 // led_green(0);
bokunimowakaru 0:d72830877d98 1269 #ifdef LEONARDO
bokunimowakaru 0:d72830877d98 1270 while( timer != timera() && Serial1.available() <= 0 );
bokunimowakaru 0:d72830877d98 1271 // led_green(1);
bokunimowakaru 0:d72830877d98 1272 if( Serial1.available() > 0 ) return( (byte)Serial1.read() );
bokunimowakaru 0:d72830877d98 1273 #else
bokunimowakaru 0:d72830877d98 1274 while( timer != timera() && Serial.available() <= 0 );
bokunimowakaru 0:d72830877d98 1275 // led_green(1);
bokunimowakaru 0:d72830877d98 1276 if( Serial.available() > 0 ) return( (byte)Serial.read() );
bokunimowakaru 0:d72830877d98 1277 #endif
bokunimowakaru 0:d72830877d98 1278 #else
bokunimowakaru 0:d72830877d98 1279 return(0x00); // フレームで受信するのでバイト毎受信は不要
bokunimowakaru 0:d72830877d98 1280 #endif
bokunimowakaru 0:d72830877d98 1281 #else
bokunimowakaru 0:d72830877d98 1282 #ifdef ARM_MBED
bokunimowakaru 0:d72830877d98 1283 // http://mbed.org/users/mbed_official/code/mbed-src/docs/e8b66477f5bf/classmbed_1_1RawSerial.html
bokunimowakaru 0:d72830877d98 1284 int value = 0,i=0;
bokunimowakaru 0:d72830877d98 1285 volatile byte timer;
bokunimowakaru 0:d72830877d98 1286
bokunimowakaru 0:d72830877d98 1287 timer = timera() + (timeout)+1;
bokunimowakaru 0:d72830877d98 1288
bokunimowakaru 0:d72830877d98 1289 // while( timer != timera() && i == 0 ) i=_xbee_serial.readable();
bokunimowakaru 0:d72830877d98 1290 while( timer != timera() && i == 0 ) i=_xbee_serial_bp;
bokunimowakaru 0:d72830877d98 1291 if( i > 0 ){
bokunimowakaru 0:d72830877d98 1292 // value = _xbee_serial.getc();
bokunimowakaru 0:d72830877d98 1293 value = _xbee_serial_buf[_xbee_serial_rp];
bokunimowakaru 0:d72830877d98 1294 if(_xbee_serial_rp < (ARM_RX_BUFFER-1))_xbee_serial_rp++;
bokunimowakaru 0:d72830877d98 1295 if(_xbee_serial_bp <= _xbee_serial_rp ){
bokunimowakaru 0:d72830877d98 1296 _xbee_serial_bp=0;
bokunimowakaru 0:d72830877d98 1297 _xbee_serial_rp=0;
bokunimowakaru 0:d72830877d98 1298 }
bokunimowakaru 0:d72830877d98 1299 // #ifdef DEBUG_RX
bokunimowakaru 0:d72830877d98 1300 // _xbee_debug.printf("%c(%02X) ",value,value);
bokunimowakaru 0:d72830877d98 1301 // #endif
bokunimowakaru 0:d72830877d98 1302 }
bokunimowakaru 0:d72830877d98 1303 if(value<0 || value>255) value=0;
bokunimowakaru 0:d72830877d98 1304 return( (byte)value );
bokunimowakaru 0:d72830877d98 1305 #else // PC
bokunimowakaru 0:d72830877d98 1306 /* 受信の有無の判断にFDの待ち受け関数selectを使用する。
bokunimowakaru 0:d72830877d98 1307 参考文献
bokunimowakaru 0:d72830877d98 1308 http://linuxjm.sourceforge.jp/html/LDP_man-pages/man2/select.2.html
bokunimowakaru 0:d72830877d98 1309 */
bokunimowakaru 0:d72830877d98 1310 #ifndef XBEE_WIFI
bokunimowakaru 0:d72830877d98 1311 byte c;
bokunimowakaru 0:d72830877d98 1312 struct timeval tv;
bokunimowakaru 0:d72830877d98 1313 fd_set readfds;
bokunimowakaru 0:d72830877d98 1314
bokunimowakaru 0:d72830877d98 1315 FD_ZERO(&readfds);
bokunimowakaru 0:d72830877d98 1316 FD_SET( xbeeComFd , &readfds);
bokunimowakaru 0:d72830877d98 1317 tv.tv_sec = 0;
bokunimowakaru 0:d72830877d98 1318 #ifdef LITE // BeeBee Lite by 蘭
bokunimowakaru 0:d72830877d98 1319 /*
bokunimowakaru 0:d72830877d98 1320 if( timeout > 50 ){
bokunimowakaru 0:d72830877d98 1321 tv.tv_usec = timeout*600;
bokunimowakaru 0:d72830877d98 1322 }else if( timeout > 10 ){
bokunimowakaru 0:d72830877d98 1323 tv.tv_usec = timeout*750;
bokunimowakaru 0:d72830877d98 1324 }else{
bokunimowakaru 0:d72830877d98 1325 tv.tv_usec = 0;
bokunimowakaru 0:d72830877d98 1326 }
bokunimowakaru 0:d72830877d98 1327 */
bokunimowakaru 0:d72830877d98 1328 // 今回は見送ります(本関数を呼び出す前に調整しているので不要)
bokunimowakaru 0:d72830877d98 1329 tv.tv_usec = timeout*1000;
bokunimowakaru 0:d72830877d98 1330 #else
bokunimowakaru 0:d72830877d98 1331 tv.tv_usec = timeout*1000;
bokunimowakaru 0:d72830877d98 1332 #endif
bokunimowakaru 0:d72830877d98 1333 if( select( (xbeeComFd+1), &readfds, NULL, NULL ,&tv ) ){
bokunimowakaru 0:d72830877d98 1334 read(xbeeComFd,(char *)&c,1);
bokunimowakaru 0:d72830877d98 1335 }else{
bokunimowakaru 0:d72830877d98 1336 c = 0x00;
bokunimowakaru 0:d72830877d98 1337 }
bokunimowakaru 0:d72830877d98 1338 return( c );
bokunimowakaru 0:d72830877d98 1339 #else // XBEE_WIFI
bokunimowakaru 0:d72830877d98 1340 return(0); // フレームで受信するのでバイト毎受信は不要
bokunimowakaru 0:d72830877d98 1341 #endif
bokunimowakaru 0:d72830877d98 1342 #endif
bokunimowakaru 0:d72830877d98 1343 #endif
bokunimowakaru 0:d72830877d98 1344 }
bokunimowakaru 0:d72830877d98 1345
bokunimowakaru 0:d72830877d98 1346 #ifdef XBEE_WIFI
bokunimowakaru 0:d72830877d98 1347 /* シリアル受信(1フレーム) 始めの4バイトは送信元のアドレス */
bokunimowakaru 0:d72830877d98 1348 byte sci_read_frame(byte *data){
bokunimowakaru 0:d72830877d98 1349 #ifndef H3694
bokunimowakaru 0:d72830877d98 1350 #ifndef ARDUINO // XBEE_WIFI PC受信
bokunimowakaru 0:d72830877d98 1351 byte i,ret;
bokunimowakaru 0:d72830877d98 1352 int len=0;
bokunimowakaru 0:d72830877d98 1353 struct sockaddr_in xbeeF_addr; // FROMアドレス入力用
bokunimowakaru 0:d72830877d98 1354 struct timeval tv; // タイムアウト用
bokunimowakaru 0:d72830877d98 1355 fd_set readfds;
bokunimowakaru 0:d72830877d98 1356
bokunimowakaru 0:d72830877d98 1357 /* 受信の有無の判断にFDの待ち受け関数selectを使用する。*/
bokunimowakaru 0:d72830877d98 1358 FD_ZERO(&readfds); // FD初期化
bokunimowakaru 0:d72830877d98 1359 FD_SET(xbeeRSFd, &readfds); // 待ちソケットの登録
bokunimowakaru 0:d72830877d98 1360 tv.tv_sec = (long)0;
bokunimowakaru 0:d72830877d98 1361 tv.tv_usec = (long)9000; // 9ms
bokunimowakaru 0:d72830877d98 1362 /* データ受信 */
bokunimowakaru 0:d72830877d98 1363 if( select( (xbeeRSFd+1), &readfds, NULL, NULL, &tv) > 0 ){
bokunimowakaru 0:d72830877d98 1364 len = sizeof(xbeeF_addr);
bokunimowakaru 0:d72830877d98 1365 len = recvfrom(xbeeRSFd, &(data[4]), (API_SIZE-14), 0, (struct sockaddr *)&xbeeF_addr, &len );
bokunimowakaru 0:d72830877d98 1366 if( len > 0 ){
bokunimowakaru 0:d72830877d98 1367 len += 4;
bokunimowakaru 0:d72830877d98 1368 #ifdef DEBUG
bokunimowakaru 0:d72830877d98 1369 printf("IP(RX)=%s\n", inet_ntoa( xbeeF_addr.sin_addr ) );
bokunimowakaru 0:d72830877d98 1370 #endif
bokunimowakaru 0:d72830877d98 1371 for(i=0;i<4;i++){
bokunimowakaru 0:d72830877d98 1372 data[i]=(byte)(xbeeF_addr.sin_addr.s_addr % (long)256);
bokunimowakaru 0:d72830877d98 1373 xbeeF_addr.sin_addr.s_addr /= (long)256;
bokunimowakaru 0:d72830877d98 1374 }
bokunimowakaru 0:d72830877d98 1375 }
bokunimowakaru 0:d72830877d98 1376 }else{ // 受信データが無い時はUARTを受信する
bokunimowakaru 0:d72830877d98 1377 FD_ZERO(&readfds); // FD初期化
bokunimowakaru 0:d72830877d98 1378 FD_SET(xbeeUSFd, &readfds); // 待ちソケットの登録
bokunimowakaru 0:d72830877d98 1379 tv.tv_usec = (long)1000; // 1ms
bokunimowakaru 0:d72830877d98 1380 if( select( (xbeeUSFd+1), &readfds, NULL, NULL, &tv) > 0 ){
bokunimowakaru 0:d72830877d98 1381 len = sizeof(xbeeU_addr);
bokunimowakaru 0:d72830877d98 1382 len = recvfrom(xbeeUSFd, &(data[6]), (API_SIZE-16), 0, (struct sockaddr *)&xbeeU_addr, &len );
bokunimowakaru 0:d72830877d98 1383 if( len > 0 ){ // データはdata[6]以降に入る
bokunimowakaru 0:d72830877d98 1384 data[4] = 0x00; // UART受信を示す。
bokunimowakaru 0:d72830877d98 1385 data[5] = len; // UART長を示す(data[]長では無い)。
bokunimowakaru 0:d72830877d98 1386 len += 6;
bokunimowakaru 0:d72830877d98 1387 #ifdef DEBUG
bokunimowakaru 0:d72830877d98 1388 printf("IP(UART)=%s\n", inet_ntoa( xbeeU_addr.sin_addr ) );
bokunimowakaru 0:d72830877d98 1389 #endif
bokunimowakaru 0:d72830877d98 1390 for(i=0;i<4;i++){
bokunimowakaru 0:d72830877d98 1391 data[i]=(byte)(xbeeU_addr.sin_addr.s_addr % (long)256);
bokunimowakaru 0:d72830877d98 1392 xbeeU_addr.sin_addr.s_addr /= (long)256;
bokunimowakaru 0:d72830877d98 1393 }
bokunimowakaru 0:d72830877d98 1394 }
bokunimowakaru 0:d72830877d98 1395 }
bokunimowakaru 0:d72830877d98 1396 }
bokunimowakaru 0:d72830877d98 1397 if( len < 0 ) ret = 0; else if( len>255 ) ret = 0xFF; else ret =(byte)len;
bokunimowakaru 0:d72830877d98 1398 #ifdef DEBUG_RX
bokunimowakaru 0:d72830877d98 1399 if( ret ){
bokunimowakaru 0:d72830877d98 1400 printf("Recieved Packet rx[%3d]\nip0,ip1,ip2,ip3,urt,len,", len);
bokunimowakaru 0:d72830877d98 1401 for(i=6;i<len;i++) printf("%3d,",i);
bokunimowakaru 0:d72830877d98 1402 printf("\n");
bokunimowakaru 0:d72830877d98 1403 for(i=0;i<len;i++) printf(" %02X,",data[i]); // dataはbyte型
bokunimowakaru 0:d72830877d98 1404 printf("\n");
bokunimowakaru 0:d72830877d98 1405 for(i=0;i<len;i++) if( isgraph(data[i]) ) printf("'%c',",data[i]); else printf("%3d,",(int)data[i]);
bokunimowakaru 0:d72830877d98 1406 printf("\n");
bokunimowakaru 0:d72830877d98 1407 }
bokunimowakaru 0:d72830877d98 1408 #endif
bokunimowakaru 0:d72830877d98 1409 return( ret );
bokunimowakaru 0:d72830877d98 1410 #else // XBEE_WIFI ARDUINO受信
bokunimowakaru 0:d72830877d98 1411 int packetSize;
bokunimowakaru 0:d72830877d98 1412 IPAddress remote;
bokunimowakaru 0:d72830877d98 1413 byte i;
bokunimowakaru 0:d72830877d98 1414 byte ret=0;
bokunimowakaru 0:d72830877d98 1415
bokunimowakaru 0:d72830877d98 1416 /* UdpXBeeR受信 */
bokunimowakaru 0:d72830877d98 1417 packetSize = UdpXBeeR.parsePacket();
bokunimowakaru 0:d72830877d98 1418 if(packetSize){
bokunimowakaru 0:d72830877d98 1419 remote = UdpXBeeR.remoteIP();
bokunimowakaru 0:d72830877d98 1420 for(i=0;i<4;i++) data[i]=(byte)remote[i];
bokunimowakaru 0:d72830877d98 1421 if( packetSize > (API_SIZE-14) ) ret = API_SIZE-14; //API_SIZEはIPのため-4で良いと思ったが、ZBフォーマット移行の-9-1-4が上限)
bokunimowakaru 0:d72830877d98 1422 else ret = (byte)packetSize;
bokunimowakaru 0:d72830877d98 1423 UdpXBeeR.read(&(data[4]), ret);
bokunimowakaru 0:d72830877d98 1424 ret += 4;
bokunimowakaru 0:d72830877d98 1425 }else{
bokunimowakaru 0:d72830877d98 1426 /* UdpXBeeU受信 */
bokunimowakaru 0:d72830877d98 1427 packetSize = UdpXBeeU.parsePacket();
bokunimowakaru 0:d72830877d98 1428 if(packetSize){
bokunimowakaru 0:d72830877d98 1429 remote = UdpXBeeU.remoteIP();
bokunimowakaru 0:d72830877d98 1430 for(i=0;i<4;i++) data[i]=(byte)remote[i];
bokunimowakaru 0:d72830877d98 1431 if( packetSize > (API_SIZE-16) ) ret = API_SIZE-16; //API_SIZEはIPのため-6で良いと思ったが、ZBフォーマット移行の-9-1-6が上限)
bokunimowakaru 0:d72830877d98 1432 else ret = (byte)packetSize; // Ver 1.80で抜けていた(バグ)
bokunimowakaru 0:d72830877d98 1433 data[4] = 0x00; // UART受信を示す。
bokunimowakaru 0:d72830877d98 1434 data[5] = ret; // UART長を示す(data[]長では無い)。
bokunimowakaru 0:d72830877d98 1435 UdpXBeeU.read(&(data[6]), ret);
bokunimowakaru 0:d72830877d98 1436 ret += 6;
bokunimowakaru 0:d72830877d98 1437 }
bokunimowakaru 0:d72830877d98 1438 }
bokunimowakaru 0:d72830877d98 1439 #ifdef XBEE_WIFI_DEBUG
bokunimowakaru 0:d72830877d98 1440 Serial.print("RX udp size=");
bokunimowakaru 0:d72830877d98 1441 Serial.print(ret);
bokunimowakaru 0:d72830877d98 1442 Serial.print(", ");
bokunimowakaru 0:d72830877d98 1443 for(i=0;i<ret;i++){
bokunimowakaru 0:d72830877d98 1444 Serial.print(data[i],HEX);
bokunimowakaru 0:d72830877d98 1445 Serial.print(" ");
bokunimowakaru 0:d72830877d98 1446 }
bokunimowakaru 0:d72830877d98 1447 Serial.println("");
bokunimowakaru 0:d72830877d98 1448 #endif
bokunimowakaru 0:d72830877d98 1449 return( ret );
bokunimowakaru 0:d72830877d98 1450 #endif
bokunimowakaru 0:d72830877d98 1451 #endif
bokunimowakaru 0:d72830877d98 1452 }
bokunimowakaru 0:d72830877d98 1453 #endif
bokunimowakaru 0:d72830877d98 1454
bokunimowakaru 0:d72830877d98 1455 /* シリアル送信バッファが空になるのを待つ */
bokunimowakaru 0:d72830877d98 1456 #ifndef LITE
bokunimowakaru 0:d72830877d98 1457 byte sci_write_check(void){
bokunimowakaru 0:d72830877d98 1458 #ifdef H3694
bokunimowakaru 0:d72830877d98 1459 byte timer;
bokunimowakaru 0:d72830877d98 1460 timer = timera() + 0x7F; // timeout = 500ms
bokunimowakaru 0:d72830877d98 1461 while( (timer != timera()) && ( SCI3_OUT_DATA_CHECK() < 1 ) );
bokunimowakaru 0:d72830877d98 1462 return( (byte)SCI3_OUT_DATA_CHECK() );
bokunimowakaru 0:d72830877d98 1463 #elif ARDUINO
bokunimowakaru 0:d72830877d98 1464 return( 1 ); // 関数があるかもしれないので、そのうち要調査&確認
bokunimowakaru 0:d72830877d98 1465 #else
bokunimowakaru 0:d72830877d98 1466 #ifdef ARM_MBED
bokunimowakaru 0:d72830877d98 1467 if( !_xbee_serial.writeable() ){
bokunimowakaru 0:d72830877d98 1468 wait(0.1);
bokunimowakaru 1:ffa16e9131c6 1469 while( !_xbee_serial.writeable() ) sci_clear();
bokunimowakaru 0:d72830877d98 1470 }
bokunimowakaru 0:d72830877d98 1471 return( 1 );
bokunimowakaru 0:d72830877d98 1472 #else // PC
bokunimowakaru 0:d72830877d98 1473 #ifndef XBEE_WIFI // ZigBee
bokunimowakaru 0:d72830877d98 1474 tcdrain( xbeeComFd );
bokunimowakaru 0:d72830877d98 1475 #endif
bokunimowakaru 0:d72830877d98 1476 return( 1 );
bokunimowakaru 0:d72830877d98 1477 #endif
bokunimowakaru 0:d72830877d98 1478 #endif
bokunimowakaru 0:d72830877d98 1479 }
bokunimowakaru 0:d72830877d98 1480 #endif // LITE
bokunimowakaru 0:d72830877d98 1481
bokunimowakaru 0:d72830877d98 1482 /* シリアル送信 */
bokunimowakaru 0:d72830877d98 1483 byte sci_write( char *data, byte len ){
bokunimowakaru 0:d72830877d98 1484 byte ret=1; // 戻り値 0でエラー
bokunimowakaru 0:d72830877d98 1485
bokunimowakaru 0:d72830877d98 1486 #ifdef H3694
bokunimowakaru 0:d72830877d98 1487 SCI3_OUT_STRINGB( data , (short)len ); // 戻り値なし
bokunimowakaru 0:d72830877d98 1488 #elif ARDUINO
bokunimowakaru 0:d72830877d98 1489 byte i;
bokunimowakaru 0:d72830877d98 1490 #ifdef XBEE_WIFI
bokunimowakaru 0:d72830877d98 1491 UdpXBeeT.beginPacket(ADR_DEST, 0xBEE );
bokunimowakaru 0:d72830877d98 1492 #endif
bokunimowakaru 0:d72830877d98 1493 for(i=0;i<len;i++){
bokunimowakaru 0:d72830877d98 1494 #ifndef XBEE_WIFI
bokunimowakaru 0:d72830877d98 1495 #ifdef LEONARDO
bokunimowakaru 0:d72830877d98 1496 ret = Serial1.write( data[i] ); // 戻り値は書き込みバイト数
bokunimowakaru 0:d72830877d98 1497 #else
bokunimowakaru 0:d72830877d98 1498 ret = Serial.write( data[i] ); // 戻り値は書き込みバイト数
bokunimowakaru 0:d72830877d98 1499 #endif
bokunimowakaru 0:d72830877d98 1500 #else // XBEE_WIFI ARDUINO
bokunimowakaru 0:d72830877d98 1501 ret = UdpXBeeT.write( data[i] ); // 戻り値は書き込みバイト数
bokunimowakaru 0:d72830877d98 1502 /*
bokunimowakaru 0:d72830877d98 1503 Serial.print("TX udp size=");
bokunimowakaru 0:d72830877d98 1504 Serial.print(len,DEC);
bokunimowakaru 0:d72830877d98 1505 Serial.print(", ");
bokunimowakaru 0:d72830877d98 1506 for(i=0;i<len;i++){
bokunimowakaru 0:d72830877d98 1507 Serial.print(data[i],HEX);
bokunimowakaru 0:d72830877d98 1508 Serial.print(" ");
bokunimowakaru 0:d72830877d98 1509 }
bokunimowakaru 0:d72830877d98 1510 Serial.println("");
bokunimowakaru 0:d72830877d98 1511 */
bokunimowakaru 0:d72830877d98 1512 #endif
bokunimowakaru 0:d72830877d98 1513 if( ret == 0 ){
bokunimowakaru 0:d72830877d98 1514 i = len; // break;
bokunimowakaru 0:d72830877d98 1515 }
bokunimowakaru 0:d72830877d98 1516 }
bokunimowakaru 0:d72830877d98 1517 #ifdef XBEE_WIFI
bokunimowakaru 0:d72830877d98 1518 UdpXBeeT.endPacket();
bokunimowakaru 0:d72830877d98 1519 #endif
bokunimowakaru 0:d72830877d98 1520 #else
bokunimowakaru 0:d72830877d98 1521 #ifdef ARM_MBED
bokunimowakaru 0:d72830877d98 1522 byte i;
bokunimowakaru 0:d72830877d98 1523 sci_write_check();
bokunimowakaru 0:d72830877d98 1524 for(i=0;i<len;i++){
bokunimowakaru 0:d72830877d98 1525 if( _xbee_serial.putc((int)data[i]) < 0 ) ret=0;
bokunimowakaru 0:d72830877d98 1526 }
bokunimowakaru 0:d72830877d98 1527 if(ret) ret=len;
bokunimowakaru 0:d72830877d98 1528 #else // PC
bokunimowakaru 0:d72830877d98 1529 #ifndef XBEE_WIFI
bokunimowakaru 0:d72830877d98 1530 byte i;
bokunimowakaru 0:d72830877d98 1531 for(i=0;i<len;i++){
bokunimowakaru 0:d72830877d98 1532 if(write(xbeeComFd,&data[i],1) != 1){
bokunimowakaru 0:d72830877d98 1533 fprintf(stderr,"sci_write ERR:d[%02d]=0x%02x\n",i,(byte)data[i]);
bokunimowakaru 0:d72830877d98 1534 ret = 0;
bokunimowakaru 0:d72830877d98 1535 }
bokunimowakaru 0:d72830877d98 1536 }
bokunimowakaru 0:d72830877d98 1537 #ifdef DEBUG_TX
bokunimowakaru 0:d72830877d98 1538 printf("Transmitted Packet tx[%3d] to ", len);
bokunimowakaru 0:d72830877d98 1539 for(i=0;i<4;i++) printf("%02X",ADR_DEST[i]);
bokunimowakaru 0:d72830877d98 1540 printf(" ");
bokunimowakaru 0:d72830877d98 1541 for(i=4;i<8;i++) printf("%02X",ADR_DEST[i]);
bokunimowakaru 0:d72830877d98 1542 printf("\n");
bokunimowakaru 0:d72830877d98 1543 for(i=0;i<len;i++) printf("%3d,",i);
bokunimowakaru 0:d72830877d98 1544 printf("\n");
bokunimowakaru 0:d72830877d98 1545 for(i=0;i<len;i++) printf(" %02X,",(byte)data[i]); // dataはchar型
bokunimowakaru 0:d72830877d98 1546 printf("\n");
bokunimowakaru 0:d72830877d98 1547 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 1548 printf("\n");
bokunimowakaru 0:d72830877d98 1549 #endif
bokunimowakaru 0:d72830877d98 1550 #else // XBEE_WIFI
bokunimowakaru 0:d72830877d98 1551 #ifdef DEBUG_TX
bokunimowakaru 0:d72830877d98 1552 int i;
bokunimowakaru 0:d72830877d98 1553 #endif
bokunimowakaru 0:d72830877d98 1554 int ret_i; // 戻り値 0でエラー
bokunimowakaru 0:d72830877d98 1555 ret_i = sendto(xbeeTSFd, data, len, 0, (struct sockaddr *)&xbeeT_addr, sizeof(xbeeT_addr));
bokunimowakaru 0:d72830877d98 1556 if( ret_i<0 ) ret=0; else if( ret_i>255 ) ret = 0xFF; else ret = (byte)ret_i;
bokunimowakaru 0:d72830877d98 1557 #ifdef DEBUG_TX
bokunimowakaru 0:d72830877d98 1558 printf("Transmitted Packet tx[%3d] to ", len);
bokunimowakaru 0:d72830877d98 1559 for(i=0;i<4;i++) printf("%d.",ADR_DEST[i]);
bokunimowakaru 0:d72830877d98 1560 printf(":0xBEE\n");
bokunimowakaru 0:d72830877d98 1561 for(i=0;i<len;i++) printf("%3d,",i);
bokunimowakaru 0:d72830877d98 1562 printf("\n");
bokunimowakaru 0:d72830877d98 1563 for(i=0;i<len;i++) printf(" %02X,",(byte)data[i]); // dataはchar型
bokunimowakaru 0:d72830877d98 1564 printf("\n");
bokunimowakaru 0:d72830877d98 1565 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 1566 printf("\n");
bokunimowakaru 0:d72830877d98 1567 #endif
bokunimowakaru 0:d72830877d98 1568 #endif
bokunimowakaru 0:d72830877d98 1569 #endif // ARM/PC
bokunimowakaru 0:d72830877d98 1570 #endif
bokunimowakaru 0:d72830877d98 1571 #ifdef DEBUG
bokunimowakaru 0:d72830877d98 1572 #ifdef ARM_MBED
bokunimowakaru 0:d72830877d98 1573 _xbee_debug.printf("DEBUG:TX OUT DONE(%d)\r\n",ret);
bokunimowakaru 0:d72830877d98 1574 #else
bokunimowakaru 0:d72830877d98 1575 printf("DEBUG:TX OUT DONE(%d)\n",ret);
bokunimowakaru 0:d72830877d98 1576 #endif
bokunimowakaru 0:d72830877d98 1577 #endif
bokunimowakaru 0:d72830877d98 1578 return( ret );
bokunimowakaru 0:d72830877d98 1579 }
bokunimowakaru 0:d72830877d98 1580
bokunimowakaru 0:d72830877d98 1581 /* string byte操作 */
bokunimowakaru 0:d72830877d98 1582 void strcopy(char *s1, const char *s2){ // string.hのstrcpyの真似版
bokunimowakaru 0:d72830877d98 1583 while( *s2 != 0x00 ) *s1++ = *s2++;
bokunimowakaru 0:d72830877d98 1584 *s1 = 0x00;
bokunimowakaru 0:d72830877d98 1585 }
bokunimowakaru 0:d72830877d98 1586 void bytecpy(byte *s1, const byte *s2, byte size){ // strcpyのバイト長可変版
bokunimowakaru 0:d72830877d98 1587 byte i;
bokunimowakaru 0:d72830877d98 1588 for(i=0; i< size ;i++ ){
bokunimowakaru 0:d72830877d98 1589 s1[i] = s2[i];
bokunimowakaru 0:d72830877d98 1590 }
bokunimowakaru 0:d72830877d98 1591 }
bokunimowakaru 0:d72830877d98 1592 byte bytecmp(byte *s1, const byte *s2, byte size){ // strcmpの簡易版(大小比較なし)
bokunimowakaru 0:d72830877d98 1593 /*バイトデータの比較
bokunimowakaru 0:d72830877d98 1594 入力:byte *s1 = 比較データ1
bokunimowakaru 0:d72830877d98 1595 入力:byte *s2 = 比較データ2
bokunimowakaru 0:d72830877d98 1596 入力:byte size = 比較データ長
bokunimowakaru 0:d72830877d98 1597 出力:戻り値 = 0:一致 1:不一致
bokunimowakaru 0:d72830877d98 1598 */
bokunimowakaru 0:d72830877d98 1599 byte i=0; // 同一なら0を応答
bokunimowakaru 0:d72830877d98 1600 for(i=0; i< size ;i++ ){
bokunimowakaru 0:d72830877d98 1601 if( s1[i] != s2[i] ) return(1);
bokunimowakaru 0:d72830877d98 1602 }
bokunimowakaru 0:d72830877d98 1603 return(0);
bokunimowakaru 0:d72830877d98 1604 }
bokunimowakaru 0:d72830877d98 1605
bokunimowakaru 0:d72830877d98 1606 /* LCD用関数 for ARDUINO */ // H8版とPC版は別ファイル lcd_h8.c lcd_pc.c
bokunimowakaru 0:d72830877d98 1607 #ifdef ARDUINO
bokunimowakaru 0:d72830877d98 1608 #ifdef LCD_H
bokunimowakaru 0:d72830877d98 1609 void lcd_cls(void){
bokunimowakaru 0:d72830877d98 1610 xbee_ardlcd.clear();
bokunimowakaru 0:d72830877d98 1611 }
bokunimowakaru 0:d72830877d98 1612 void lcd_home(void){
bokunimowakaru 0:d72830877d98 1613 xbee_ardlcd.home();
bokunimowakaru 0:d72830877d98 1614 }
bokunimowakaru 0:d72830877d98 1615 void lcd_control(byte disonoff, byte curonoff, byte curblink){
bokunimowakaru 0:d72830877d98 1616 }
bokunimowakaru 0:d72830877d98 1617 void lcd_goto(const byte mesto){
bokunimowakaru 0:d72830877d98 1618 byte row=0;
bokunimowakaru 0:d72830877d98 1619
bokunimowakaru 0:d72830877d98 1620 switch( mesto ){
bokunimowakaru 0:d72830877d98 1621 case LCD_ROW_1: row=0; break;
bokunimowakaru 0:d72830877d98 1622 case LCD_ROW_2: row=1; break;
bokunimowakaru 0:d72830877d98 1623 case LCD_ROW_3: row=2; break;
bokunimowakaru 0:d72830877d98 1624 case LCD_ROW_4: row=3; break;
bokunimowakaru 0:d72830877d98 1625 }
bokunimowakaru 0:d72830877d98 1626 xbee_ardlcd.setCursor(0,(int)row);
bokunimowakaru 0:d72830877d98 1627 }
bokunimowakaru 0:d72830877d98 1628 void lcd_shift(const byte data){
bokunimowakaru 0:d72830877d98 1629 xbee_ardlcd.write(' ');
bokunimowakaru 0:d72830877d98 1630 }
bokunimowakaru 0:d72830877d98 1631 void lcd_putch(const char data){
bokunimowakaru 0:d72830877d98 1632 xbee_ardlcd.write( data );
bokunimowakaru 0:d72830877d98 1633 }
bokunimowakaru 0:d72830877d98 1634 void lcd_putstr(const char *data){
bokunimowakaru 0:d72830877d98 1635 while(*data != 0) {
bokunimowakaru 0:d72830877d98 1636 xbee_ardlcd.write(*data);
bokunimowakaru 0:d72830877d98 1637 data++;
bokunimowakaru 0:d72830877d98 1638 }
bokunimowakaru 0:d72830877d98 1639 }
bokunimowakaru 0:d72830877d98 1640 void lcd_disp_bin(const byte x){
bokunimowakaru 0:d72830877d98 1641 // xbee_ardlcd.print( x, BIN );
bokunimowakaru 0:d72830877d98 1642 byte i;
bokunimowakaru 0:d72830877d98 1643 for (i=128;i>0;i>>=1){
bokunimowakaru 0:d72830877d98 1644 if ((x&i)==0){
bokunimowakaru 0:d72830877d98 1645 lcd_putch('0');
bokunimowakaru 0:d72830877d98 1646 }else{
bokunimowakaru 0:d72830877d98 1647 lcd_putch('1');
bokunimowakaru 0:d72830877d98 1648 }
bokunimowakaru 0:d72830877d98 1649 }
bokunimowakaru 0:d72830877d98 1650 }
bokunimowakaru 0:d72830877d98 1651 void lcd_disp_hex(const byte i){
bokunimowakaru 0:d72830877d98 1652 // xbee_ardlcd.print( i, HEX );
bokunimowakaru 0:d72830877d98 1653 byte hi,lo;
bokunimowakaru 0:d72830877d98 1654 hi=i&0xF0; // High nibble
bokunimowakaru 0:d72830877d98 1655 hi=hi>>4;
bokunimowakaru 0:d72830877d98 1656 hi=hi+'0';
bokunimowakaru 0:d72830877d98 1657 if (hi>'9'){
bokunimowakaru 0:d72830877d98 1658 hi=hi+7;
bokunimowakaru 0:d72830877d98 1659 }
bokunimowakaru 0:d72830877d98 1660 lo=(i&0x0F)+'0'; // Low nibble
bokunimowakaru 0:d72830877d98 1661 if (lo>'9'){
bokunimowakaru 0:d72830877d98 1662 lo=lo+7;
bokunimowakaru 0:d72830877d98 1663 }
bokunimowakaru 0:d72830877d98 1664 lcd_putch((char)hi);
bokunimowakaru 0:d72830877d98 1665 lcd_putch((char)lo);
bokunimowakaru 0:d72830877d98 1666 }
bokunimowakaru 0:d72830877d98 1667 void lcd_disp_1(const unsigned int x){
bokunimowakaru 0:d72830877d98 1668 if (x<10){
bokunimowakaru 0:d72830877d98 1669 xbee_ardlcd.write((char)(x+0x30));
bokunimowakaru 0:d72830877d98 1670 }else if (x<16){
bokunimowakaru 0:d72830877d98 1671 xbee_ardlcd.write((char)(x-10+'A'));
bokunimowakaru 0:d72830877d98 1672 }else{
bokunimowakaru 0:d72830877d98 1673 xbee_ardlcd.write('X');
bokunimowakaru 0:d72830877d98 1674 }
bokunimowakaru 0:d72830877d98 1675 }
bokunimowakaru 0:d72830877d98 1676 void lcd_disp_2(unsigned int x){
bokunimowakaru 0:d72830877d98 1677 unsigned int y;
bokunimowakaru 0:d72830877d98 1678 if (x<100){
bokunimowakaru 0:d72830877d98 1679 y=x/10;
bokunimowakaru 0:d72830877d98 1680 xbee_ardlcd.write((char)(y+0x30));
bokunimowakaru 0:d72830877d98 1681 x-=(y*10);
bokunimowakaru 0:d72830877d98 1682 xbee_ardlcd.write((char)(x+0x30));
bokunimowakaru 0:d72830877d98 1683 }else{
bokunimowakaru 0:d72830877d98 1684 xbee_ardlcd.print("XX");
bokunimowakaru 0:d72830877d98 1685 }
bokunimowakaru 0:d72830877d98 1686 }
bokunimowakaru 0:d72830877d98 1687 void lcd_disp_3(unsigned int x){
bokunimowakaru 0:d72830877d98 1688 unsigned int y;
bokunimowakaru 0:d72830877d98 1689 if (x<1000){
bokunimowakaru 0:d72830877d98 1690 y=x/100;
bokunimowakaru 0:d72830877d98 1691 xbee_ardlcd.write((char)(y+0x30));
bokunimowakaru 0:d72830877d98 1692 x-=(y*100);
bokunimowakaru 0:d72830877d98 1693 y=x/10;
bokunimowakaru 0:d72830877d98 1694 xbee_ardlcd.write((char)(y+0x30));
bokunimowakaru 0:d72830877d98 1695 x-=(y*10);
bokunimowakaru 0:d72830877d98 1696 xbee_ardlcd.write((char)(x+0x30));
bokunimowakaru 0:d72830877d98 1697 }else{
bokunimowakaru 0:d72830877d98 1698 xbee_ardlcd.print("XXX");
bokunimowakaru 0:d72830877d98 1699 }
bokunimowakaru 0:d72830877d98 1700 }
bokunimowakaru 0:d72830877d98 1701 void lcd_disp_5(unsigned int x){
bokunimowakaru 0:d72830877d98 1702 unsigned int y;
bokunimowakaru 0:d72830877d98 1703 if (x<=65535){
bokunimowakaru 0:d72830877d98 1704 y=x/10000;
bokunimowakaru 0:d72830877d98 1705 xbee_ardlcd.write((char)(y+0x30));
bokunimowakaru 0:d72830877d98 1706 x-=(y*10000);
bokunimowakaru 0:d72830877d98 1707 y=x/1000;
bokunimowakaru 0:d72830877d98 1708 xbee_ardlcd.write((char)(y+0x30));
bokunimowakaru 0:d72830877d98 1709 x-=(y*1000);
bokunimowakaru 0:d72830877d98 1710 y=x/100;
bokunimowakaru 0:d72830877d98 1711 xbee_ardlcd.write((char)(y+0x30));
bokunimowakaru 0:d72830877d98 1712 x-=(y*100);
bokunimowakaru 0:d72830877d98 1713 y=x/10;
bokunimowakaru 0:d72830877d98 1714 xbee_ardlcd.write((char)(y+0x30));
bokunimowakaru 0:d72830877d98 1715 x-=(y*10);
bokunimowakaru 0:d72830877d98 1716 xbee_ardlcd.write((char)(x+0x30));
bokunimowakaru 0:d72830877d98 1717 }else{
bokunimowakaru 0:d72830877d98 1718 xbee_ardlcd.print("XXXXX");
bokunimowakaru 0:d72830877d98 1719 }
bokunimowakaru 0:d72830877d98 1720 }
bokunimowakaru 0:d72830877d98 1721 void lcd_init(void){
bokunimowakaru 0:d72830877d98 1722 xbee_ardlcd.begin(20, 4); // 液晶の桁数×行数の設定
bokunimowakaru 0:d72830877d98 1723 xbee_ardlcd.clear(); // 表示クリア
bokunimowakaru 0:d72830877d98 1724 }
bokunimowakaru 0:d72830877d98 1725 #endif
bokunimowakaru 0:d72830877d98 1726 #endif
bokunimowakaru 0:d72830877d98 1727
bokunimowakaru 0:d72830877d98 1728 /* LCD用関数 for ARM_MBED */ // 注意=液晶では無くシリアルに出力する
bokunimowakaru 0:d72830877d98 1729 #ifdef ARM_MBED // D8(PA_9)からログをUART(38400baud)出力します
bokunimowakaru 0:d72830877d98 1730 #ifdef DEBUG
bokunimowakaru 0:d72830877d98 1731 void lcd_cls(void){
bokunimowakaru 0:d72830877d98 1732 _xbee_debug.printf("----------------\r\n");
bokunimowakaru 0:d72830877d98 1733 }
bokunimowakaru 0:d72830877d98 1734 void lcd_home(void){
bokunimowakaru 0:d72830877d98 1735 _xbee_debug.printf("\r\n");
bokunimowakaru 0:d72830877d98 1736 }
bokunimowakaru 0:d72830877d98 1737 void lcd_control(byte disonoff, byte curonoff, byte curblink){
bokunimowakaru 0:d72830877d98 1738 }
bokunimowakaru 0:d72830877d98 1739 void lcd_goto(const byte mesto){
bokunimowakaru 0:d72830877d98 1740 lcd_home();
bokunimowakaru 0:d72830877d98 1741 }
bokunimowakaru 0:d72830877d98 1742 void lcd_shift(const byte data){
bokunimowakaru 0:d72830877d98 1743 _xbee_debug.putc(' ');
bokunimowakaru 0:d72830877d98 1744 }
bokunimowakaru 0:d72830877d98 1745 void lcd_putch(const char data){
bokunimowakaru 0:d72830877d98 1746 _xbee_debug.putc( data );
bokunimowakaru 0:d72830877d98 1747 }
bokunimowakaru 0:d72830877d98 1748 void lcd_putstr(const char *data){
bokunimowakaru 0:d72830877d98 1749 while(*data != 0) {
bokunimowakaru 0:d72830877d98 1750 _xbee_debug.putc(*data);
bokunimowakaru 0:d72830877d98 1751 data++;
bokunimowakaru 0:d72830877d98 1752 }
bokunimowakaru 0:d72830877d98 1753 }
bokunimowakaru 0:d72830877d98 1754 void lcd_disp_bin(const byte x){
bokunimowakaru 0:d72830877d98 1755 byte i;
bokunimowakaru 0:d72830877d98 1756 for (i=128;i>0;i>>=1){
bokunimowakaru 0:d72830877d98 1757 if ((x&i)==0){
bokunimowakaru 0:d72830877d98 1758 lcd_putch('0');
bokunimowakaru 0:d72830877d98 1759 }else{
bokunimowakaru 0:d72830877d98 1760 lcd_putch('1');
bokunimowakaru 0:d72830877d98 1761 }
bokunimowakaru 0:d72830877d98 1762 }
bokunimowakaru 0:d72830877d98 1763 }
bokunimowakaru 0:d72830877d98 1764 void lcd_disp_hex(const byte i){
bokunimowakaru 0:d72830877d98 1765 byte hi,lo;
bokunimowakaru 0:d72830877d98 1766 hi=i&0xF0; // High nibble
bokunimowakaru 0:d72830877d98 1767 hi=hi>>4;
bokunimowakaru 0:d72830877d98 1768 hi=hi+'0';
bokunimowakaru 0:d72830877d98 1769 if (hi>'9'){
bokunimowakaru 0:d72830877d98 1770 hi=hi+7;
bokunimowakaru 0:d72830877d98 1771 }
bokunimowakaru 0:d72830877d98 1772 lo=(i&0x0F)+'0'; // Low nibble
bokunimowakaru 0:d72830877d98 1773 if (lo>'9'){
bokunimowakaru 0:d72830877d98 1774 lo=lo+7;
bokunimowakaru 0:d72830877d98 1775 }
bokunimowakaru 0:d72830877d98 1776 lcd_putch((char)hi);
bokunimowakaru 0:d72830877d98 1777 lcd_putch((char)lo);
bokunimowakaru 0:d72830877d98 1778 }
bokunimowakaru 0:d72830877d98 1779 void lcd_disp_1(const unsigned int x){
bokunimowakaru 0:d72830877d98 1780 if (x<10){
bokunimowakaru 0:d72830877d98 1781 _xbee_debug.putc((char)(x+0x30));
bokunimowakaru 0:d72830877d98 1782 }else if (x<16){
bokunimowakaru 0:d72830877d98 1783 _xbee_debug.putc((char)(x-10+'A'));
bokunimowakaru 0:d72830877d98 1784 }else{
bokunimowakaru 0:d72830877d98 1785 _xbee_debug.putc('X');
bokunimowakaru 0:d72830877d98 1786 }
bokunimowakaru 0:d72830877d98 1787 }
bokunimowakaru 0:d72830877d98 1788 void lcd_disp_2(unsigned int x){
bokunimowakaru 0:d72830877d98 1789 unsigned int y;
bokunimowakaru 0:d72830877d98 1790 if (x<100){
bokunimowakaru 0:d72830877d98 1791 y=x/10;
bokunimowakaru 0:d72830877d98 1792 _xbee_debug.putc((char)(y+0x30));
bokunimowakaru 0:d72830877d98 1793 x-=(y*10);
bokunimowakaru 0:d72830877d98 1794 _xbee_debug.putc((char)(x+0x30));
bokunimowakaru 0:d72830877d98 1795 }else{
bokunimowakaru 0:d72830877d98 1796 _xbee_debug.printf("XX");
bokunimowakaru 0:d72830877d98 1797 }
bokunimowakaru 0:d72830877d98 1798 }
bokunimowakaru 0:d72830877d98 1799 void lcd_disp_3(unsigned int x){
bokunimowakaru 0:d72830877d98 1800 unsigned int y;
bokunimowakaru 0:d72830877d98 1801 if (x<1000){
bokunimowakaru 0:d72830877d98 1802 y=x/100;
bokunimowakaru 0:d72830877d98 1803 _xbee_debug.putc((char)(y+0x30));
bokunimowakaru 0:d72830877d98 1804 x-=(y*100);
bokunimowakaru 0:d72830877d98 1805 y=x/10;
bokunimowakaru 0:d72830877d98 1806 _xbee_debug.putc((char)(y+0x30));
bokunimowakaru 0:d72830877d98 1807 x-=(y*10);
bokunimowakaru 0:d72830877d98 1808 _xbee_debug.putc((char)(x+0x30));
bokunimowakaru 0:d72830877d98 1809 }else{
bokunimowakaru 0:d72830877d98 1810 _xbee_debug.printf("XXX");
bokunimowakaru 0:d72830877d98 1811 }
bokunimowakaru 0:d72830877d98 1812 }
bokunimowakaru 0:d72830877d98 1813 void lcd_disp_5(unsigned int x){
bokunimowakaru 0:d72830877d98 1814 unsigned int y;
bokunimowakaru 0:d72830877d98 1815 if (x<=65535){
bokunimowakaru 0:d72830877d98 1816 y=x/10000;
bokunimowakaru 0:d72830877d98 1817 _xbee_debug.putc((char)(y+0x30));
bokunimowakaru 0:d72830877d98 1818 x-=(y*10000);
bokunimowakaru 0:d72830877d98 1819 y=x/1000;
bokunimowakaru 0:d72830877d98 1820 _xbee_debug.putc((char)(y+0x30));
bokunimowakaru 0:d72830877d98 1821 x-=(y*1000);
bokunimowakaru 0:d72830877d98 1822 y=x/100;
bokunimowakaru 0:d72830877d98 1823 _xbee_debug.putc((char)(y+0x30));
bokunimowakaru 0:d72830877d98 1824 x-=(y*100);
bokunimowakaru 0:d72830877d98 1825 y=x/10;
bokunimowakaru 0:d72830877d98 1826 _xbee_debug.putc((char)(y+0x30));
bokunimowakaru 0:d72830877d98 1827 x-=(y*10);
bokunimowakaru 0:d72830877d98 1828 _xbee_debug.putc((char)(x+0x30));
bokunimowakaru 0:d72830877d98 1829 }else{
bokunimowakaru 0:d72830877d98 1830 _xbee_debug.printf("XXXXX");
bokunimowakaru 0:d72830877d98 1831 }
bokunimowakaru 0:d72830877d98 1832 }
bokunimowakaru 0:d72830877d98 1833 void lcd_init(void){
bokunimowakaru 0:d72830877d98 1834 _xbee_debug.printf("-----\r\n");
bokunimowakaru 0:d72830877d98 1835 }
bokunimowakaru 0:d72830877d98 1836 #endif
bokunimowakaru 0:d72830877d98 1837 #endif
bokunimowakaru 0:d72830877d98 1838
bokunimowakaru 0:d72830877d98 1839 #ifdef LCD_H
bokunimowakaru 0:d72830877d98 1840 void lcd_disp(const char *s){
bokunimowakaru 0:d72830877d98 1841 lcd_cls();
bokunimowakaru 0:d72830877d98 1842 lcd_goto(LCD_ROW_1);
bokunimowakaru 0:d72830877d98 1843 lcd_putstr( s );
bokunimowakaru 0:d72830877d98 1844 #ifndef H3694
bokunimowakaru 0:d72830877d98 1845 #ifndef ARDUINO
bokunimowakaru 0:d72830877d98 1846 #ifdef ARM_MBED
bokunimowakaru 0:d72830877d98 1847 _xbee_debug.printf("\r\n");
bokunimowakaru 0:d72830877d98 1848 #else // PC
bokunimowakaru 0:d72830877d98 1849 lcd_putch( '\n' );
bokunimowakaru 0:d72830877d98 1850 #endif
bokunimowakaru 0:d72830877d98 1851 #endif
bokunimowakaru 0:d72830877d98 1852 #endif
bokunimowakaru 0:d72830877d98 1853 }
bokunimowakaru 0:d72830877d98 1854 #endif
bokunimowakaru 0:d72830877d98 1855
bokunimowakaru 0:d72830877d98 1856 /*********************************************************************
bokunimowakaru 0:d72830877d98 1857 XBeeドライバ関数
bokunimowakaru 0:d72830877d98 1858 *********************************************************************/
bokunimowakaru 0:d72830877d98 1859
bokunimowakaru 0:d72830877d98 1860 /*
bokunimowakaru 0:d72830877d98 1861 00 01 02 03 04 05 06 07 08....
bokunimowakaru 0:d72830877d98 1862 ATNJ = 7E 00 05 08 01 4E 4A FF 5F
bokunimowakaru 0:d72830877d98 1863 | | len |mo|FI| NJ=0xFF|CS|
bokunimowakaru 0:d72830877d98 1864 | | |de| | |__|___ Check Sum
bokunimowakaru 0:d72830877d98 1865 | | | | |________|______ AT コマンド
bokunimowakaru 0:d72830877d98 1866 | | | |__|_______________ Frame ID
bokunimowakaru 0:d72830877d98 1867 | | |__|__________________ AT=0x08 Remote=0x17
bokunimowakaru 0:d72830877d98 1868 | |_____|_____________________ Data Lengrh (ATコマンド+2文字)
bokunimowakaru 0:d72830877d98 1869 |__|___________________________ 固定値
bokunimowakaru 0:d72830877d98 1870
bokunimowakaru 0:d72830877d98 1871 char *at "AT" ATコマンド len=4バイト~最大255 (フレーム8バイト~)
bokunimowakaru 0:d72830877d98 1872 "RAT" リモートATコマンド len=15バイト~最大255 (フレーム19バイト~)
bokunimowakaru 0:d72830877d98 1873 "TX" データ送信コマンド len=15バイト~最大255 (フレーム19バイト~)
bokunimowakaru 0:d72830877d98 1874 ※API_SIZE=32の時valueは12バイトまで
bokunimowakaru 0:d72830877d98 1875 */
bokunimowakaru 0:d72830877d98 1876
bokunimowakaru 0:d72830877d98 1877 /* (ドライバ)ATコマンド送信 */
bokunimowakaru 0:d72830877d98 1878 byte xbee_at_tx(const char *at, const byte *value, const byte value_len){
bokunimowakaru 0:d72830877d98 1879 /*
bokunimowakaru 0:d72830877d98 1880 処理:リモートATコマンドの送信を行うXBeeドライバ部
bokunimowakaru 0:d72830877d98 1881 入力:ATコマンドat[] = "AT**"はローカルATで、"RAT***"がリモートAT
bokunimowakaru 0:d72830877d98 1882             TXがデータ送信モード
bokunimowakaru 0:d72830877d98 1883    データvalue[] = 各ATコマンドで引き渡すデータ値
bokunimowakaru 0:d72830877d98 1884    value_len   = その長さ
bokunimowakaru 0:d72830877d98 1885 戻り値:送信したAPIサービス長。送信しなかった場合は0
bokunimowakaru 0:d72830877d98 1886 */
bokunimowakaru 0:d72830877d98 1887 char data_api[API_TXSIZE];
bokunimowakaru 0:d72830877d98 1888 byte i;
bokunimowakaru 0:d72830877d98 1889 byte len; // APIサービス長
bokunimowakaru 0:d72830877d98 1890 #ifndef XBEE_WIFI
bokunimowakaru 0:d72830877d98 1891 byte check=0xFF; // チェックサム
bokunimowakaru 0:d72830877d98 1892 byte data_position=5; // 送信データdata_api[]の何処にvalue[]を入れるか
bokunimowakaru 0:d72830877d98 1893 #endif
bokunimowakaru 0:d72830877d98 1894 byte ret=0;
bokunimowakaru 0:d72830877d98 1895
bokunimowakaru 0:d72830877d98 1896 if( PACKET_ID == 0xFF ){
bokunimowakaru 0:d72830877d98 1897 PACKET_ID=0x01;
bokunimowakaru 0:d72830877d98 1898 }else{
bokunimowakaru 0:d72830877d98 1899 PACKET_ID++;
bokunimowakaru 0:d72830877d98 1900 }
bokunimowakaru 0:d72830877d98 1901 len=0;
bokunimowakaru 0:d72830877d98 1902 #ifndef XBEE_WIFI
bokunimowakaru 0:d72830877d98 1903 switch( at[0] ){
bokunimowakaru 0:d72830877d98 1904 case 'A':
bokunimowakaru 0:d72830877d98 1905 case 'F':
bokunimowakaru 0:d72830877d98 1906 if( at[1]=='T'){
bokunimowakaru 0:d72830877d98 1907 data_api[3]=(char)0x08; // ATコマンドモード
bokunimowakaru 0:d72830877d98 1908 if( at[0] == 'A') data_api[4]=(char)PACKET_ID; // フレームID (at="ATxx")
bokunimowakaru 0:d72830877d98 1909 else data_api[4]=0x00; // IDなし(at="FTxx")
bokunimowakaru 0:d72830877d98 1910 data_api[5]=(char)at[2]; // ATコマンド上位
bokunimowakaru 0:d72830877d98 1911 data_api[6]=(char)at[3]; // ATコマンド下位
bokunimowakaru 0:d72830877d98 1912 data_position=7;
bokunimowakaru 0:d72830877d98 1913 len=4; // サービスデータにMD+FI+AT(2)バイトが入る
bokunimowakaru 0:d72830877d98 1914 }
bokunimowakaru 0:d72830877d98 1915 break;
bokunimowakaru 0:d72830877d98 1916 case 'R':
bokunimowakaru 0:d72830877d98 1917 case 'S':
bokunimowakaru 0:d72830877d98 1918 if( at[1]=='A' && at[2]=='T'){
bokunimowakaru 0:d72830877d98 1919 data_api[3]=(char)0x17; // リモートATコマンドモード
bokunimowakaru 0:d72830877d98 1920 if( at[0] == 'R') data_api[4]=(char)PACKET_ID; // フレームID (at="RATxx")
bokunimowakaru 0:d72830877d98 1921 else data_api[4]=0x00; // IDなし(at="SATxx")
bokunimowakaru 0:d72830877d98 1922 for( i=5 ; i<=12 ; i++) data_api[i]=(char)ADR_DEST[i-5];
bokunimowakaru 0:d72830877d98 1923 for( i=13 ; i<=14 ; i++) data_api[i]=(char)SADR_DEST[i-13];
bokunimowakaru 0:d72830877d98 1924 data_api[15]=(char)0x02; // apply changes
bokunimowakaru 0:d72830877d98 1925 data_api[16]=(char)at[3]; // ATコマンド上位
bokunimowakaru 0:d72830877d98 1926 data_api[17]=(char)at[4]; // ATコマンド下位
bokunimowakaru 0:d72830877d98 1927 data_position=18; // value[]を入れる場所
bokunimowakaru 0:d72830877d98 1928 len=15; // サービスデータにMD+FI+ADR(8)+SAD(2)+OPT+AT(2)が入る
bokunimowakaru 0:d72830877d98 1929 }
bokunimowakaru 0:d72830877d98 1930 break;
bokunimowakaru 0:d72830877d98 1931 case 'T':
bokunimowakaru 0:d72830877d98 1932 if( at[1]=='X'){
bokunimowakaru 0:d72830877d98 1933 data_api[3]=(char)0x10; // TXデータ送信モード
bokunimowakaru 0:d72830877d98 1934 data_api[4]=(char)0x00; // フレームIDを使用しない(no responce)
bokunimowakaru 0:d72830877d98 1935 for( i=5 ; i<=12 ; i++) data_api[i]=(char)ADR_DEST[i-5];
bokunimowakaru 0:d72830877d98 1936 for( i=13 ; i<=14 ; i++) data_api[i]=(char)SADR_DEST[i-13];
bokunimowakaru 0:d72830877d98 1937 data_api[15]=(char)0x00; // ZigBeeホップ数
bokunimowakaru 0:d72830877d98 1938 data_api[16]=(char)0x00; // 暗号化=しない
bokunimowakaru 0:d72830877d98 1939 data_position=17;
bokunimowakaru 0:d72830877d98 1940 len=14; // サービスデータにMD+FI+ADR(8)+SAD(2)+OPT(2)が入る
bokunimowakaru 0:d72830877d98 1941 }
bokunimowakaru 0:d72830877d98 1942 break;
bokunimowakaru 0:d72830877d98 1943 #ifndef ARDUINO
bokunimowakaru 0:d72830877d98 1944 #ifndef ARM_MBED
bokunimowakaru 0:d72830877d98 1945 case 'Z':
bokunimowakaru 0:d72830877d98 1946 // [0]送信元EndPoint, [1]宛先EndPoint, [2-3]クラスタID, [4-5]プロファイルID
bokunimowakaru 0:d72830877d98 1947 // [6]Radius=00 [7]Option=00 [8]Fram Ctrl [9]SeqNum [10]Command [11-12] Attribute
bokunimowakaru 0:d72830877d98 1948 if( at[1]=='C' && value_len>12){
bokunimowakaru 0:d72830877d98 1949 data_api[3]=(char)0x11; // ZCL送信モード
bokunimowakaru 0:d72830877d98 1950 data_api[4]=(char)PACKET_ID; // フレームID
bokunimowakaru 0:d72830877d98 1951 for( i=5 ; i<=12 ; i++) data_api[i]=(char)ADR_DEST[i-5];
bokunimowakaru 0:d72830877d98 1952 for( i=13 ; i<=14 ; i++) data_api[i]=(char)SADR_DEST[i-13];
bokunimowakaru 0:d72830877d98 1953 data_position=15;
bokunimowakaru 0:d72830877d98 1954 len=12;
bokunimowakaru 0:d72830877d98 1955 }
bokunimowakaru 0:d72830877d98 1956 break;
bokunimowakaru 0:d72830877d98 1957 #endif
bokunimowakaru 0:d72830877d98 1958 #endif
bokunimowakaru 0:d72830877d98 1959 default:
bokunimowakaru 0:d72830877d98 1960 break;
bokunimowakaru 0:d72830877d98 1961 }
bokunimowakaru 0:d72830877d98 1962 if( len ){
bokunimowakaru 0:d72830877d98 1963 data_api[0]=(char)0x7E; // デリミタ
bokunimowakaru 0:d72830877d98 1964 data_api[1]=(char)0x00; // パケット長の上位(送らない前程)
bokunimowakaru 0:d72830877d98 1965 for( i=3 ; i < data_position ; i++) check -= (byte)data_api[i];
bokunimowakaru 0:d72830877d98 1966 if( value_len > 0 ){
bokunimowakaru 0:d72830877d98 1967 for( i=0 ; i<value_len; i++){
bokunimowakaru 0:d72830877d98 1968 data_api[data_position + i] = (char)value[i];
bokunimowakaru 0:d72830877d98 1969 check -= (byte)data_api[data_position + i];
bokunimowakaru 0:d72830877d98 1970 len++;
bokunimowakaru 0:d72830877d98 1971 }
bokunimowakaru 0:d72830877d98 1972 }
bokunimowakaru 0:d72830877d98 1973 data_api[2] =(char)len;
bokunimowakaru 0:d72830877d98 1974 data_api[len+3]=(char)check;
bokunimowakaru 0:d72830877d98 1975 #ifdef LITE // BeeBee Lite by 蘭
bokunimowakaru 0:d72830877d98 1976 sci_write( data_api, (byte)(len+4) );
bokunimowakaru 0:d72830877d98 1977 ret=len+3;
bokunimowakaru 0:d72830877d98 1978 #else
bokunimowakaru 0:d72830877d98 1979 check = sci_write_check(); // 以降 checkはシリアルバッファ確認に使用する
bokunimowakaru 0:d72830877d98 1980 /*シリアルデータ送信 */
bokunimowakaru 0:d72830877d98 1981 if( check > 0 ){
bokunimowakaru 0:d72830877d98 1982 if( sci_write( data_api, (byte)(len+4) ) == 0 ){
bokunimowakaru 0:d72830877d98 1983 /* シリアルリセット */
bokunimowakaru 0:d72830877d98 1984 #ifndef H3694
bokunimowakaru 0:d72830877d98 1985 #ifndef ARDUINO
bokunimowakaru 0:d72830877d98 1986 #ifndef ARM_MBED // PC
bokunimowakaru 0:d72830877d98 1987 wait_millisec( 100 );
bokunimowakaru 0:d72830877d98 1988 close_serial_port(); // シリアルを閉じる
bokunimowakaru 0:d72830877d98 1989 wait_millisec( 300 );
bokunimowakaru 0:d72830877d98 1990 printf("RESET serial\n");
bokunimowakaru 0:d72830877d98 1991 while( sci_init( xbee_com_port )==0){ // 再度オープン
bokunimowakaru 0:d72830877d98 1992 wait_millisec( 3000 );
bokunimowakaru 0:d72830877d98 1993 close_serial_port(); // シリアルを閉じる
bokunimowakaru 0:d72830877d98 1994 wait_millisec( 3000 );
bokunimowakaru 0:d72830877d98 1995 printf("RESET serial\n");
bokunimowakaru 0:d72830877d98 1996 }
bokunimowakaru 0:d72830877d98 1997 wait_millisec( 300 );
bokunimowakaru 0:d72830877d98 1998 sci_write( data_api, (byte)(len+4) ); // 再送信
bokunimowakaru 0:d72830877d98 1999 #endif
bokunimowakaru 0:d72830877d98 2000 #endif
bokunimowakaru 0:d72830877d98 2001 #endif
bokunimowakaru 0:d72830877d98 2002 }
bokunimowakaru 0:d72830877d98 2003 ret=len+3;
bokunimowakaru 0:d72830877d98 2004 }else{
bokunimowakaru 0:d72830877d98 2005 #ifdef H3694
bokunimowakaru 0:d72830877d98 2006 led_red( 1 );
bokunimowakaru 0:d72830877d98 2007 #endif
bokunimowakaru 0:d72830877d98 2008 #ifdef ERRLOG
bokunimowakaru 0:d72830877d98 2009 strcopy( ERR_LOG , "ERR:TX Buffer Over" );
bokunimowakaru 0:d72830877d98 2010 ERR_CODE = check;
bokunimowakaru 0:d72830877d98 2011 #endif
bokunimowakaru 0:d72830877d98 2012 ret=0;
bokunimowakaru 0:d72830877d98 2013 }
bokunimowakaru 0:d72830877d98 2014 #endif
bokunimowakaru 0:d72830877d98 2015 }
bokunimowakaru 0:d72830877d98 2016 #else // XBEE_WIFI
bokunimowakaru 0:d72830877d98 2017 switch( at[0] ){
bokunimowakaru 0:d72830877d98 2018 case 'A':
bokunimowakaru 0:d72830877d98 2019 case 'F':
bokunimowakaru 0:d72830877d98 2020 if( at[1]=='T' ){
bokunimowakaru 0:d72830877d98 2021 data_api[0]=(char)0x02; // ATコマンドモード
bokunimowakaru 0:d72830877d98 2022 data_api[1]=(char)0x00; // 固定
bokunimowakaru 0:d72830877d98 2023 if( at[0] == 'A' ) data_api[2]=(char)PACKET_ID; // フレームID
bokunimowakaru 0:d72830877d98 2024 data_api[3]=(char)0x02;
bokunimowakaru 0:d72830877d98 2025 data_api[4]=(char)at[2]; // ATコマンド上位
bokunimowakaru 0:d72830877d98 2026 data_api[5]=(char)at[3]; // ATコマンド下位
bokunimowakaru 0:d72830877d98 2027 len=6;
bokunimowakaru 0:d72830877d98 2028 }
bokunimowakaru 0:d72830877d98 2029 break;
bokunimowakaru 0:d72830877d98 2030 case 'R':
bokunimowakaru 0:d72830877d98 2031 case 'S':
bokunimowakaru 0:d72830877d98 2032 if( at[1]=='A' && at[2]=='T' ){
bokunimowakaru 0:d72830877d98 2033 data_api[0]=(char)0x02; // ATコマンドモード
bokunimowakaru 0:d72830877d98 2034 data_api[1]=(char)0x00; // 固定
bokunimowakaru 0:d72830877d98 2035 if( at[0] == 'R'){
bokunimowakaru 0:d72830877d98 2036 data_api[2]=(char)PACKET_ID; // フレームID
bokunimowakaru 0:d72830877d98 2037 data_api[3]=(char)0x02;
bokunimowakaru 0:d72830877d98 2038 }else{
bokunimowakaru 0:d72830877d98 2039 data_api[2]=(char)0x00;
bokunimowakaru 0:d72830877d98 2040 data_api[3]=(char)0x00;
bokunimowakaru 0:d72830877d98 2041 }
bokunimowakaru 0:d72830877d98 2042 data_api[4]=(char)at[3]; // ATコマンド上位
bokunimowakaru 0:d72830877d98 2043 data_api[5]=(char)at[4]; // ATコマンド下位
bokunimowakaru 0:d72830877d98 2044 len=6;
bokunimowakaru 0:d72830877d98 2045 }
bokunimowakaru 0:d72830877d98 2046 case 'T':
bokunimowakaru 0:d72830877d98 2047 if( at[1]=='X'){
bokunimowakaru 0:d72830877d98 2048 data_api[0]=(char)0x00; // シリアルデータモード
bokunimowakaru 0:d72830877d98 2049 data_api[1]=(char)0x00; // ackが必要なときは01
bokunimowakaru 0:d72830877d98 2050 len=2; // datasheetでは3だが誤り。実装は2
bokunimowakaru 0:d72830877d98 2051 }
bokunimowakaru 0:d72830877d98 2052 break;
bokunimowakaru 0:d72830877d98 2053 default:
bokunimowakaru 0:d72830877d98 2054 break;
bokunimowakaru 0:d72830877d98 2055 }
bokunimowakaru 0:d72830877d98 2056 if( len ){
bokunimowakaru 0:d72830877d98 2057 if( value_len > 0 ){
bokunimowakaru 0:d72830877d98 2058 for( i=0 ; i<value_len; i++){
bokunimowakaru 0:d72830877d98 2059 data_api[len] = (char)value[i];
bokunimowakaru 0:d72830877d98 2060 len++;
bokunimowakaru 0:d72830877d98 2061 }
bokunimowakaru 0:d72830877d98 2062 }
bokunimowakaru 0:d72830877d98 2063 if(DEVICE_TYPE == XB_TYPE_WIFI20){
bokunimowakaru 0:d72830877d98 2064 #ifdef DEBUG
bokunimowakaru 0:d72830877d98 2065 printf("DEBUG:TX_10(%3d):",len);
bokunimowakaru 0:d72830877d98 2066 for(i=0;i<len;i++) printf("%02X,",data_api[i]);
bokunimowakaru 0:d72830877d98 2067 printf("\n");
bokunimowakaru 0:d72830877d98 2068 #endif
bokunimowakaru 0:d72830877d98 2069 len+=6;
bokunimowakaru 0:d72830877d98 2070 if( len <= API_TXSIZE ){
bokunimowakaru 0:d72830877d98 2071 for(i=len-6; i>0; i--){
bokunimowakaru 0:d72830877d98 2072 data_api[i+5]=data_api[i-1];
bokunimowakaru 0:d72830877d98 2073 }
bokunimowakaru 0:d72830877d98 2074 data_api[0]=0x42;
bokunimowakaru 0:d72830877d98 2075 data_api[1]=0x42;
bokunimowakaru 0:d72830877d98 2076 data_api[2]=0x0;
bokunimowakaru 0:d72830877d98 2077 data_api[3]=0x0;
bokunimowakaru 0:d72830877d98 2078 data_api[4]=0x0;
bokunimowakaru 0:d72830877d98 2079 data_api[5]=0x0;
bokunimowakaru 0:d72830877d98 2080 }
bokunimowakaru 0:d72830877d98 2081 #ifdef DEBUG
bokunimowakaru 0:d72830877d98 2082 printf("DEBUG:TX_20(%3d):",len);
bokunimowakaru 0:d72830877d98 2083 for(i=0;i<len;i++) printf("%02X,",data_api[i]);
bokunimowakaru 0:d72830877d98 2084 printf("\n");
bokunimowakaru 0:d72830877d98 2085 #endif
bokunimowakaru 0:d72830877d98 2086 }
bokunimowakaru 0:d72830877d98 2087 if( sci_write_check() > 0 ){ // XBEE_WIFIなのでifdef LITEは不要
bokunimowakaru 0:d72830877d98 2088 #ifdef XBEE_WIFI_DEBUG
bokunimowakaru 0:d72830877d98 2089 Serial.print("TX udp size=");
bokunimowakaru 0:d72830877d98 2090 Serial.print(len);
bokunimowakaru 0:d72830877d98 2091 Serial.print(", ");
bokunimowakaru 0:d72830877d98 2092 for(i=0;i<len;i++){
bokunimowakaru 0:d72830877d98 2093 Serial.print(data_api[i],HEX);
bokunimowakaru 0:d72830877d98 2094 Serial.print(" ");
bokunimowakaru 0:d72830877d98 2095 }
bokunimowakaru 0:d72830877d98 2096 Serial.println("");
bokunimowakaru 0:d72830877d98 2097 #endif
bokunimowakaru 0:d72830877d98 2098 #ifdef DEBUG
bokunimowakaru 0:d72830877d98 2099 printf("TX udp size=%d\n",len);
bokunimowakaru 0:d72830877d98 2100 #endif
bokunimowakaru 0:d72830877d98 2101 if( sci_write( data_api, len ) == 0 ){
bokunimowakaru 0:d72830877d98 2102 #ifdef H3694
bokunimowakaru 0:d72830877d98 2103 led_red( 1 );
bokunimowakaru 0:d72830877d98 2104 #endif
bokunimowakaru 0:d72830877d98 2105 #ifdef ERRLOG
bokunimowakaru 0:d72830877d98 2106 strcopy( ERR_LOG , "ERR:TX Write Error" );
bokunimowakaru 0:d72830877d98 2107 ERR_CODE = 0x00;
bokunimowakaru 0:d72830877d98 2108 #endif
bokunimowakaru 0:d72830877d98 2109 #ifdef XBEE_WIFI_DEBUG
bokunimowakaru 0:d72830877d98 2110 Serial.println("ERR:TX Write Error" );
bokunimowakaru 0:d72830877d98 2111 #endif
bokunimowakaru 0:d72830877d98 2112 #ifdef DEBUG
bokunimowakaru 0:d72830877d98 2113 printf("ERR:TX Write Error\n");
bokunimowakaru 0:d72830877d98 2114 #endif
bokunimowakaru 0:d72830877d98 2115 ret=0;
bokunimowakaru 0:d72830877d98 2116 }else ret = len;
bokunimowakaru 0:d72830877d98 2117 }else{
bokunimowakaru 0:d72830877d98 2118 #ifdef H3694
bokunimowakaru 0:d72830877d98 2119 led_red( 1 );
bokunimowakaru 0:d72830877d98 2120 #endif
bokunimowakaru 0:d72830877d98 2121 #ifdef ERRLOG
bokunimowakaru 0:d72830877d98 2122 strcopy( ERR_LOG , "ERR:TX Buffer Over" );
bokunimowakaru 0:d72830877d98 2123 ERR_CODE = 0x00;
bokunimowakaru 0:d72830877d98 2124 #endif
bokunimowakaru 0:d72830877d98 2125 #ifdef DEBUG
bokunimowakaru 0:d72830877d98 2126 printf("ERR:TX Buffer Over\n");
bokunimowakaru 0:d72830877d98 2127 #endif
bokunimowakaru 0:d72830877d98 2128 ret=0;
bokunimowakaru 0:d72830877d98 2129 }
bokunimowakaru 0:d72830877d98 2130 }
bokunimowakaru 0:d72830877d98 2131 #endif
bokunimowakaru 0:d72830877d98 2132 return( ret );
bokunimowakaru 0:d72830877d98 2133 }
bokunimowakaru 0:d72830877d98 2134
bokunimowakaru 0:d72830877d98 2135 /* (ドライバ)ATコマンド受信 */
bokunimowakaru 0:d72830877d98 2136 byte xbee_at_rx(byte *data){
bokunimowakaru 0:d72830877d98 2137 /*
bokunimowakaru 0:d72830877d98 2138 リモートATコマンドの応答を受信するXBeeドライバ部
bokunimowakaru 0:d72830877d98 2139 処理:XBeeからの受信データをdata[]へ代入(応答)する
bokunimowakaru 0:d72830877d98 2140 入出力:APIデータdata[] 前3バイトは'7E'+len(2) data[0]が0x00の場合はタイムアウト
bokunimowakaru 0:d72830877d98 2141 リターン:APIサービス長、0はタイムアウト
bokunimowakaru 0:d72830877d98 2142 */
bokunimowakaru 0:d72830877d98 2143 byte i;
bokunimowakaru 0:d72830877d98 2144 byte len; // APIサービス長-3 (APIフレームの前3バイトとチェックサム1バイトを除く)
bokunimowakaru 0:d72830877d98 2145 #ifndef XBEE_WIFI
bokunimowakaru 0:d72830877d98 2146 unsigned int leni; // 実際のAPIサービス長と使用するAPIサービス長の差(データ破棄用)
bokunimowakaru 0:d72830877d98 2147 byte check = 0xFF; // チェックサム
bokunimowakaru 0:d72830877d98 2148 #endif
bokunimowakaru 0:d72830877d98 2149 byte ret=0;
bokunimowakaru 0:d72830877d98 2150
bokunimowakaru 0:d72830877d98 2151 /* 受信処理 */
bokunimowakaru 0:d72830877d98 2152 #ifndef XBEE_WIFI // ZigBee
bokunimowakaru 0:d72830877d98 2153 data[0] = sci_read( 1 ); // 1ms待ち受けで受信
bokunimowakaru 0:d72830877d98 2154 if( data[0] == 0x7E ) { // 期待デリミタ0x7E時
bokunimowakaru 0:d72830877d98 2155 for( i=1;i<=2;i++ ){
bokunimowakaru 0:d72830877d98 2156 #ifdef LITE // BeeBee Lite by 蘭
bokunimowakaru 0:d72830877d98 2157 data[i] = sci_read( 35 ); // 1割だけ緩和しました。sci_read 32⇒35(Wataru)
bokunimowakaru 0:d72830877d98 2158 #else
bokunimowakaru 0:d72830877d98 2159 data[i] = sci_read( 50 );
bokunimowakaru 0:d72830877d98 2160 #endif
bokunimowakaru 0:d72830877d98 2161 }
bokunimowakaru 0:d72830877d98 2162 if(data[1] == 0x00) len = data[2];
bokunimowakaru 0:d72830877d98 2163 else len = 0xFF - 4; // API長が255バイトまでの制約(本来は64KB)
bokunimowakaru 0:d72830877d98 2164 if( len > (API_SIZE-4) ) len = API_SIZE-4;
bokunimowakaru 0:d72830877d98 2165 leni = (unsigned int)data[1] * 256 + (unsigned int)data[2] - (unsigned int)len;
bokunimowakaru 0:d72830877d98 2166 // 通常は0。lenが本来の容量よりも少ない場合に不足分が代入されれる
bokunimowakaru 0:d72830877d98 2167 for( i=0 ; i <= len ; i++){ // i = lenはチェックサムを入力する
bokunimowakaru 0:d72830877d98 2168 #ifdef LITE // BeeBee Lite by 蘭
bokunimowakaru 0:d72830877d98 2169 data[i+3] = sci_read( 35 ); // 1割だけ緩和しました。sci_read 32⇒35(Wataru)
bokunimowakaru 0:d72830877d98 2170 #else
bokunimowakaru 0:d72830877d98 2171 data[i+3] = sci_read( 50 );
bokunimowakaru 0:d72830877d98 2172 #endif
bokunimowakaru 0:d72830877d98 2173 if( i != len) check -= data[i+3]; // チェックサムのカウント
bokunimowakaru 0:d72830877d98 2174 }
bokunimowakaru 0:d72830877d98 2175 while( leni > 0 ){
bokunimowakaru 0:d72830877d98 2176 data[len+3] = sci_read( 50 ); // データの空読み(lenは固定)
bokunimowakaru 0:d72830877d98 2177 if( leni != 1 ) {
bokunimowakaru 0:d72830877d98 2178 check -= data[len+3]; // leni=0の時はCheck sumなので減算しない
bokunimowakaru 0:d72830877d98 2179 }
bokunimowakaru 0:d72830877d98 2180 leni--;
bokunimowakaru 0:d72830877d98 2181 }
bokunimowakaru 0:d72830877d98 2182 if( check == data[len+3] ) ret = len +3;
bokunimowakaru 0:d72830877d98 2183 else ret = 0;
bokunimowakaru 0:d72830877d98 2184 #ifdef DEBUG_RX
bokunimowakaru 0:d72830877d98 2185 lcd_cls(); lcd_goto(LCD_ROW_1);
bokunimowakaru 0:d72830877d98 2186 lcd_putstr("->");
bokunimowakaru 0:d72830877d98 2187 for( i=0 ; i <= len+3 ; i++){
bokunimowakaru 0:d72830877d98 2188 lcd_disp_hex( data[i] );
bokunimowakaru 0:d72830877d98 2189 if( i == 8 ) lcd_goto(LCD_ROW_2);
bokunimowakaru 0:d72830877d98 2190 if( i == 18 ) lcd_goto(LCD_ROW_3);
bokunimowakaru 0:d72830877d98 2191 if( i == 28 ) lcd_goto(LCD_ROW_4);
bokunimowakaru 0:d72830877d98 2192 if( i == 38 ) lcd_goto(LCD_ROW_1);
bokunimowakaru 0:d72830877d98 2193 }
bokunimowakaru 0:d72830877d98 2194 lcd_goto(LCD_ROW_4);
bokunimowakaru 0:d72830877d98 2195 lcd_putstr("ID=");
bokunimowakaru 0:d72830877d98 2196 lcd_disp_hex( PACKET_ID );
bokunimowakaru 0:d72830877d98 2197 lcd_putstr(":");
bokunimowakaru 0:d72830877d98 2198 lcd_disp_hex( data[4] );
bokunimowakaru 0:d72830877d98 2199 if( check != data[len+3]){
bokunimowakaru 0:d72830877d98 2200 lcd_putstr(" ER=");
bokunimowakaru 0:d72830877d98 2201 }else{
bokunimowakaru 0:d72830877d98 2202 lcd_putstr(" OK=");
bokunimowakaru 0:d72830877d98 2203 }
bokunimowakaru 0:d72830877d98 2204 lcd_disp_hex( check );
bokunimowakaru 0:d72830877d98 2205 lcd_putstr(":");
bokunimowakaru 0:d72830877d98 2206 lcd_disp_hex( data[len+3] );
bokunimowakaru 0:d72830877d98 2207 #endif
bokunimowakaru 0:d72830877d98 2208 }
bokunimowakaru 0:d72830877d98 2209 #else // XBEE_WIFI
bokunimowakaru 0:d72830877d98 2210 ret = sci_read_frame( data );
bokunimowakaru 0:d72830877d98 2211
bokunimowakaru 0:d72830877d98 2212 if( ret >= 7){ // もともと10バイト以上にしていたけどUARTは最低7バイトからなので変更
bokunimowakaru 0:d72830877d98 2213 #ifdef XBEE_WIFI
bokunimowakaru 0:d72830877d98 2214 if(DEVICE_TYPE == XB_TYPE_WIFI20 && data[4] != 0x00){ // UARTのときは処理不要
bokunimowakaru 0:d72830877d98 2215 #ifdef DEBUG
bokunimowakaru 0:d72830877d98 2216 printf("DEBUG:RX_10(%3d):",ret);
bokunimowakaru 0:d72830877d98 2217 for(i=0;i<ret;i++) printf("%02X,",data[i]);
bokunimowakaru 0:d72830877d98 2218 printf("\n");
bokunimowakaru 0:d72830877d98 2219 #endif
bokunimowakaru 0:d72830877d98 2220 if( ret > 10 ){
bokunimowakaru 0:d72830877d98 2221 for(i=10; i<ret; i++)data[i-6]=data[i];
bokunimowakaru 0:d72830877d98 2222 ret -=6;
bokunimowakaru 0:d72830877d98 2223 }
bokunimowakaru 0:d72830877d98 2224 #ifdef DEBUG
bokunimowakaru 0:d72830877d98 2225 printf("DEBUG:RX_20(%3d):",ret);
bokunimowakaru 0:d72830877d98 2226 for(i=0;i<ret;i++) printf("%02X,",data[i]);
bokunimowakaru 0:d72830877d98 2227 printf("\n");
bokunimowakaru 0:d72830877d98 2228 #endif
bokunimowakaru 0:d72830877d98 2229 }
bokunimowakaru 0:d72830877d98 2230 #endif
bokunimowakaru 0:d72830877d98 2231 switch( data[4] ){
bokunimowakaru 0:d72830877d98 2232 case 0x82: // Remote AT Resp. アドレス4バイト+基本レスポンス6バイト+オプション0バイト以上
bokunimowakaru 0:d72830877d98 2233 if(ret >= 10){
bokunimowakaru 0:d72830877d98 2234 for(i=ret;i>=10; i--){
bokunimowakaru 0:d72830877d98 2235 data[i+8] = data[i]; // 破壊 18以降全て ※メモリリークするのでUdpXBeeR受信で制限している
bokunimowakaru 0:d72830877d98 2236 }
bokunimowakaru 0:d72830877d98 2237 data[17] = data[9]; // AT Command status
bokunimowakaru 0:d72830877d98 2238 data[16] = data[8]; // AT Command LSB
bokunimowakaru 0:d72830877d98 2239 data[15] = data[7]; // AT Command MSB
bokunimowakaru 0:d72830877d98 2240 data[14] = 0xFE;
bokunimowakaru 0:d72830877d98 2241 data[13] = 0xFF;
bokunimowakaru 0:d72830877d98 2242 data[4]=data[6]; // Frame ID 破壊 4
bokunimowakaru 0:d72830877d98 2243 for(i=0;i<4;i++){ // IPアドレス
bokunimowakaru 0:d72830877d98 2244 data[5+i]=data[i]; // 破壊 5,6,7,8
bokunimowakaru 0:d72830877d98 2245 data[9+i]=0x00; // 破壊 9,10,11,12
bokunimowakaru 0:d72830877d98 2246 }
bokunimowakaru 0:d72830877d98 2247 data[3]=0x97; // rat res
bokunimowakaru 0:d72830877d98 2248 data[0]=0x7E; // 受信成功
bokunimowakaru 0:d72830877d98 2249 ret += 9;
bokunimowakaru 0:d72830877d98 2250 data[1]=0x00; // length上位
bokunimowakaru 0:d72830877d98 2251 data[2]=ret-3; // length下位
bokunimowakaru 0:d72830877d98 2252 }
bokunimowakaru 0:d72830877d98 2253 break;
bokunimowakaru 0:d72830877d98 2254 case 0x04: // IO RX Sample アドレス4バイト+基本レスポンス6バイト+オプション0バイト以上
bokunimowakaru 0:d72830877d98 2255 if(ret >= 10){
bokunimowakaru 0:d72830877d98 2256 for(i=ret;i>=6; i--){ // datasheetの誤り Number SamplesのOffsetはdatesheetでは3だが実際は2
bokunimowakaru 0:d72830877d98 2257 // これにIPの4バイトが追加されるので6
bokunimowakaru 0:d72830877d98 2258 data[i+9] = data[i]; // 破壊 15以降全て ※メモリリークするのでUdpXBeeR受信で制限している
bokunimowakaru 0:d72830877d98 2259 }
bokunimowakaru 0:d72830877d98 2260 data[14] = 0x02; // Packet was a broadcast
bokunimowakaru 0:d72830877d98 2261 data[13] = 0xFE;
bokunimowakaru 0:d72830877d98 2262 data[12] = 0xFF;
bokunimowakaru 0:d72830877d98 2263 for(i=0;i<4;i++){ // IPアドレス
bokunimowakaru 0:d72830877d98 2264 data[4+i]=data[i]; // 破壊 5,6,7,8
bokunimowakaru 0:d72830877d98 2265 data[8+i]=0x00; // 破壊 9,10,11,12
bokunimowakaru 0:d72830877d98 2266 }
bokunimowakaru 0:d72830877d98 2267 data[3]=0x92; // io sample
bokunimowakaru 0:d72830877d98 2268 data[0]=0x7E; // 受信成功
bokunimowakaru 0:d72830877d98 2269 ret += 10;
bokunimowakaru 0:d72830877d98 2270 data[1]=0x00; // length上位
bokunimowakaru 0:d72830877d98 2271 data[2]=ret-3; // length下位
bokunimowakaru 0:d72830877d98 2272 }
bokunimowakaru 0:d72830877d98 2273 break;
bokunimowakaru 0:d72830877d98 2274 case 0x00: // UART
bokunimowakaru 0:d72830877d98 2275 len = data[5]; // 破壊されるのでUART長はバックアップ
bokunimowakaru 0:d72830877d98 2276 for(i=ret;i>=6; i--){
bokunimowakaru 0:d72830877d98 2277 data[i+9] = data[i]; // 破壊 15以降全て ※メモリリークするのでUdpXBeeU受信で制限している
bokunimowakaru 0:d72830877d98 2278 }
bokunimowakaru 0:d72830877d98 2279 data[14] = 0x02; // Packet was a broadcast
bokunimowakaru 0:d72830877d98 2280 data[13] = 0xFE;
bokunimowakaru 0:d72830877d98 2281 data[12] = 0xFF;
bokunimowakaru 0:d72830877d98 2282 for(i=0;i<4;i++){ // IPアドレス
bokunimowakaru 0:d72830877d98 2283 data[4+i]=data[i]; // 破壊 5,6,7,8
bokunimowakaru 0:d72830877d98 2284 data[8+i]=0x00; // 破壊 9,10,11,12
bokunimowakaru 0:d72830877d98 2285 }
bokunimowakaru 0:d72830877d98 2286 data[1]=0x00; // 243バイトまでしか考慮しない
bokunimowakaru 0:d72830877d98 2287 data[2]=len + 0x0C; // 243バイトまでしか考慮しない
bokunimowakaru 0:d72830877d98 2288 data[3]=0x90; // UART
bokunimowakaru 0:d72830877d98 2289 data[0]=0x7E; // 受信成功
bokunimowakaru 0:d72830877d98 2290 ret += 10;
bokunimowakaru 0:d72830877d98 2291 break;
bokunimowakaru 0:d72830877d98 2292 default:
bokunimowakaru 0:d72830877d98 2293 for(i=ret;i>=7; i--){
bokunimowakaru 0:d72830877d98 2294 data[i+8] = data[i]; // 破壊 18以降全て ※メモリリークするのでUdpXBeeR受信で制限している
bokunimowakaru 0:d72830877d98 2295 }
bokunimowakaru 0:d72830877d98 2296 data[4]=data[6]; // Frame ID 破壊 4
bokunimowakaru 0:d72830877d98 2297 for(i=0;i<4;i++){ // IPアドレス
bokunimowakaru 0:d72830877d98 2298 data[5+i]=data[i]; // 破壊 5,6,7,8
bokunimowakaru 0:d72830877d98 2299 data[9+i]=0x00; // 破壊 9,10,11,12
bokunimowakaru 0:d72830877d98 2300 }
bokunimowakaru 0:d72830877d98 2301 data[3]=data[4];
bokunimowakaru 0:d72830877d98 2302 ret=0;
bokunimowakaru 0:d72830877d98 2303 }
bokunimowakaru 0:d72830877d98 2304 #ifdef DEBUG
bokunimowakaru 0:d72830877d98 2305 printf("DEBUG:RX_ZB(%3d):",ret);
bokunimowakaru 0:d72830877d98 2306 for(i=0;i<ret;i++) printf("%02X,",data[i]);
bokunimowakaru 0:d72830877d98 2307 printf("\n");
bokunimowakaru 0:d72830877d98 2308 #endif
bokunimowakaru 0:d72830877d98 2309 }else ret=0;
bokunimowakaru 0:d72830877d98 2310 #ifdef XBEE_WIFI_DEBUG
bokunimowakaru 0:d72830877d98 2311 Serial.print("RX api size=");
bokunimowakaru 0:d72830877d98 2312 Serial.print(ret);
bokunimowakaru 0:d72830877d98 2313 Serial.print(", ");
bokunimowakaru 0:d72830877d98 2314 for(i=0;i<ret;i++){
bokunimowakaru 0:d72830877d98 2315 Serial.print(data[i],HEX);
bokunimowakaru 0:d72830877d98 2316 Serial.print(" ");
bokunimowakaru 0:d72830877d98 2317 }
bokunimowakaru 0:d72830877d98 2318 Serial.println("");
bokunimowakaru 0:d72830877d98 2319 #endif
bokunimowakaru 0:d72830877d98 2320 #endif
bokunimowakaru 0:d72830877d98 2321 return( ret );
bokunimowakaru 0:d72830877d98 2322 }
bokunimowakaru 0:d72830877d98 2323
bokunimowakaru 0:d72830877d98 2324 /* (ドライバ)パケット差出人の抽出 */
bokunimowakaru 0:d72830877d98 2325 byte xbee_from_acum( const byte *data ){
bokunimowakaru 0:d72830877d98 2326 /*
bokunimowakaru 0:d72830877d98 2327 処理:受信データの差出人をグローバル変数へ登録 ※xbee_at_rxでは登録しない
bokunimowakaru 0:d72830877d98 2328 入力:data[] APIデータ
bokunimowakaru 0:d72830877d98 2329 出力:byte 受信データの種別mode値を戻り値に代入
bokunimowakaru 0:d72830877d98 2330    受信データの差出人をグローバル変数ADR_FROMに代入
bokunimowakaru 0:d72830877d98 2331 再起動で8Aのモード応答あり
bokunimowakaru 0:d72830877d98 2332 */
bokunimowakaru 0:d72830877d98 2333 byte i;
bokunimowakaru 0:d72830877d98 2334 byte ret=0;
bokunimowakaru 0:d72830877d98 2335
bokunimowakaru 0:d72830877d98 2336 if( data[3]==MODE_UART // 0x90 UART Receive
bokunimowakaru 0:d72830877d98 2337 || data[3]==MODE_UAR2 // 0x91 UART AO=0
bokunimowakaru 0:d72830877d98 2338 || data[3]==MODE_GPIN // 0x92 GPI data
bokunimowakaru 0:d72830877d98 2339 || data[3]==MODE_SENS // 0x94 XB Sensor
bokunimowakaru 0:d72830877d98 2340 || data[3]==MODE_IDNT){ // 0x95 Node Identify
bokunimowakaru 0:d72830877d98 2341 for(i=0;i<8;i++) ADR_FROM[i]=data[4+i];
bokunimowakaru 0:d72830877d98 2342 ret = data[3]; // mode値
bokunimowakaru 0:d72830877d98 2343 }else if(
bokunimowakaru 0:d72830877d98 2344 data[3]==MODE_RESP){ // 0x97 リモートATコマンドの結果
bokunimowakaru 0:d72830877d98 2345 for(i=0;i<8;i++) ADR_FROM[i]=data[5+i];
bokunimowakaru 0:d72830877d98 2346 ret = data[3]; // mode値
bokunimowakaru 0:d72830877d98 2347 }else if(
bokunimowakaru 0:d72830877d98 2348 data[3]==MODE_RES // 0x88 ローカルATコマンドの結果
bokunimowakaru 0:d72830877d98 2349 || data[3]==MODE_MODM){ // 0x8A Modem Statusを受信
bokunimowakaru 0:d72830877d98 2350 ret = data[3]; // mode値
bokunimowakaru 0:d72830877d98 2351 }else{
bokunimowakaru 0:d72830877d98 2352 #ifdef H3694
bokunimowakaru 0:d72830877d98 2353 led_red( 1 );
bokunimowakaru 0:d72830877d98 2354 #endif
bokunimowakaru 0:d72830877d98 2355 #ifdef ERRLOG
bokunimowakaru 0:d72830877d98 2356 strcopy( ERR_LOG , "ERR:xbee_from" );
bokunimowakaru 0:d72830877d98 2357 ERR_CODE = data[3];
bokunimowakaru 0:d72830877d98 2358 #endif
bokunimowakaru 0:d72830877d98 2359 ret = 0;
bokunimowakaru 0:d72830877d98 2360 }
bokunimowakaru 0:d72830877d98 2361 return( ret );
bokunimowakaru 0:d72830877d98 2362 }
bokunimowakaru 0:d72830877d98 2363
bokunimowakaru 0:d72830877d98 2364 /* (ドライバ)GPIO入力データの計算部 */
bokunimowakaru 0:d72830877d98 2365 byte xbee_gpi_acum( byte *data ){
bokunimowakaru 0:d72830877d98 2366 /* リモート先(ADR_FROMに入力)のGPIOの入力値(下位バイト)を応答する。
bokunimowakaru 0:d72830877d98 2367 リモート先は(こちらから呼ばなくても)GPIOの変化などで自動送信する設定にしておく必要がある。
bokunimowakaru 0:d72830877d98 2368 具体的にはリモート先をATIC設定するなど。本演算関数はxbee_rx_callから呼ばれる。
bokunimowakaru 0:d72830877d98 2369 port: port指定 IO名 ピン番号 USB評価ボード(XBIB-U-Dev)
bokunimowakaru 0:d72830877d98 2370 port= 1 DIO1 XBee_pin 19 (AD1) SW2
bokunimowakaru 0:d72830877d98 2371 port= 2 DIO2 XBee_pin 18 (AD2) SW3
bokunimowakaru 0:d72830877d98 2372 port= 3 DIO3 XBee_pin 17 (AD3) SW4
bokunimowakaru 0:d72830877d98 2373 out: port 1~7の入力値をバイトで応答。
bokunimowakaru 0:d72830877d98 2374 上位バイトのポートには対応しない
bokunimowakaru 0:d72830877d98 2375 DIOのport1~7がオフでかつADCが有効の場合は有効ADC(1~3の最も若い番号)のAD変換結果を応答する。
bokunimowakaru 0:d72830877d98 2376 ADC結果は8ビットに間引かれる。電圧は0~1.2Vに対応する。以下でADC電圧を得ることが可能。
bokunimowakaru 0:d72830877d98 2377 (unsigned int)xbee_gpi_acum(data)/255*1200 [mV]
bokunimowakaru 0:d72830877d98 2378 注意1:DIO/ADCの切り換え方法:DIOのport1~7が一つでも有効であればDIOとして動作します。
bokunimowakaru 0:d72830877d98 2379 port1~7のDIOが全て無効でADCが有効であれば有効なADC(1~3の最も若い番号)が動作します。
bokunimowakaru 0:d72830877d98 2380 port1~7のDIOとADC1~3が全て無効で電源電圧検出ADCが有効であれば電圧を応答します。(要確認)
bokunimowakaru 0:d72830877d98 2381 未対応:電源電圧ADCの範囲と単位を要確認。必要に応じて値を変換する必要がある。
bokunimowakaru 0:d72830877d98 2382 mode = MODE_GPIN(0x92) GPI data
bokunimowakaru 0:d72830877d98 2383
bokunimowakaru 0:d72830877d98 2384 data[17]:mask(下位)
bokunimowakaru 0:d72830877d98 2385 */
bokunimowakaru 0:d72830877d98 2386 byte ret=0xFF;
bokunimowakaru 0:d72830877d98 2387
bokunimowakaru 0:d72830877d98 2388 if( data[3] == MODE_GPIN ){ // data[3]:MODE_GPIN(92)
bokunimowakaru 0:d72830877d98 2389 if( xbee_from_acum( data ) > 0 ){ // 差出人をグローバル変数へ
bokunimowakaru 0:d72830877d98 2390 if( (data[17]&0xFE) != 0x00 ){ // DIO(port 1~7)がある時
bokunimowakaru 0:d72830877d98 2391 ret = (data[17] & data[20]); // 20:DIOデータ(下位バイト) 17:マスク
bokunimowakaru 0:d72830877d98 2392 }else if( (data[18]&0x8E) != 0 ){ // ADCがあるとき
bokunimowakaru 0:d72830877d98 2393 if( data[16] == 0x00 && data[17] == 0x00 ){ // DIOが全てマスクされているとき
bokunimowakaru 0:d72830877d98 2394 ret = (data[19]<6) | (data[20]>2); // 19:ADCデータ(上位)、20:下位
bokunimowakaru 0:d72830877d98 2395 }else{ //
bokunimowakaru 0:d72830877d98 2396 ret = (data[21]<6) | (data[22]>2); // 21:ADCデータ(上位)、22:下位
bokunimowakaru 0:d72830877d98 2397 }
bokunimowakaru 0:d72830877d98 2398 }
bokunimowakaru 0:d72830877d98 2399 }else{
bokunimowakaru 0:d72830877d98 2400 #ifdef H3694
bokunimowakaru 0:d72830877d98 2401 led_red( 1 );
bokunimowakaru 0:d72830877d98 2402 #endif
bokunimowakaru 0:d72830877d98 2403 #ifdef ERRLOG
bokunimowakaru 0:d72830877d98 2404 strcopy( ERR_LOG , "ERR:xbee_gpi acum" );
bokunimowakaru 0:d72830877d98 2405 ERR_CODE = xbee_from_acum( data );
bokunimowakaru 0:d72830877d98 2406 #endif
bokunimowakaru 0:d72830877d98 2407 }
bokunimowakaru 0:d72830877d98 2408 }else{
bokunimowakaru 0:d72830877d98 2409 #ifdef H3694
bokunimowakaru 0:d72830877d98 2410 led_red( 1 );
bokunimowakaru 0:d72830877d98 2411 #endif
bokunimowakaru 0:d72830877d98 2412 #ifdef ERRLOG
bokunimowakaru 0:d72830877d98 2413 strcopy( ERR_LOG , "ERR:xbee_gpi mode" );
bokunimowakaru 0:d72830877d98 2414 ERR_CODE = data[3];
bokunimowakaru 0:d72830877d98 2415 #endif
bokunimowakaru 0:d72830877d98 2416 }
bokunimowakaru 0:d72830877d98 2417 #ifdef DEBUG_RX
bokunimowakaru 0:d72830877d98 2418 lcd_goto(LCD_ROW_2);
bokunimowakaru 0:d72830877d98 2419 lcd_putstr(" M:"); // MASK表示
bokunimowakaru 0:d72830877d98 2420 lcd_disp_hex( data[16] );
bokunimowakaru 0:d72830877d98 2421 lcd_disp_hex( data[17] );
bokunimowakaru 0:d72830877d98 2422 lcd_putstr(" D:"); // デジタルサンプル値
bokunimowakaru 0:d72830877d98 2423 lcd_disp_hex( data[19] );
bokunimowakaru 0:d72830877d98 2424 lcd_disp_hex( data[20] );
bokunimowakaru 0:d72830877d98 2425 #endif
bokunimowakaru 0:d72830877d98 2426 return(ret);
bokunimowakaru 0:d72830877d98 2427 }
bokunimowakaru 0:d72830877d98 2428
bokunimowakaru 0:d72830877d98 2429 /* (ドライバ)UART入力データの計算部 */
bokunimowakaru 0:d72830877d98 2430 byte xbee_uart_acum( byte *data ){
bokunimowakaru 0:d72830877d98 2431 /*
bokunimowakaru 0:d72830877d98 2432 mode =MODE_UART(0x90) UART Receive
bokunimowakaru 0:d72830877d98 2433 mode =MODE_UAR2(0x91) UART AO=0
bokunimowakaru 0:d72830877d98 2434 */
bokunimowakaru 0:d72830877d98 2435 #ifdef DEBUG_RX
bokunimowakaru 0:d72830877d98 2436 byte i; // DEGUG用
bokunimowakaru 0:d72830877d98 2437 byte len;
bokunimowakaru 0:d72830877d98 2438 #endif
bokunimowakaru 0:d72830877d98 2439 byte ret=0;
bokunimowakaru 0:d72830877d98 2440
bokunimowakaru 0:d72830877d98 2441 if( data[3] == 0x90 ){ // data[3]:データ種別=ZigBee Recieve Packet
bokunimowakaru 0:d72830877d98 2442 if( xbee_from_acum( data ) > 0 ){
bokunimowakaru 0:d72830877d98 2443 ret = data[15]; // 15:データ1文字 ※Digi仕様書P100記載誤り
bokunimowakaru 0:d72830877d98 2444 #ifdef DEBUG_RX
bokunimowakaru 0:d72830877d98 2445 len = data[2]-0x0C; // 12バイト減算
bokunimowakaru 0:d72830877d98 2446 #endif
bokunimowakaru 0:d72830877d98 2447 }else{
bokunimowakaru 0:d72830877d98 2448 #ifdef H3694
bokunimowakaru 0:d72830877d98 2449 led_red( 1 );
bokunimowakaru 0:d72830877d98 2450 #endif
bokunimowakaru 0:d72830877d98 2451 #ifdef ERRLOG
bokunimowakaru 0:d72830877d98 2452 strcopy( ERR_LOG , "ERR:xbee_uart from" );
bokunimowakaru 0:d72830877d98 2453 ERR_CODE = xbee_from_acum( data );
bokunimowakaru 0:d72830877d98 2454 #endif
bokunimowakaru 0:d72830877d98 2455 }
bokunimowakaru 0:d72830877d98 2456 }else if( data[3] == 0x91 ){ // data[3]:データ種別=ZigBee Explict Rx Indicator
bokunimowakaru 0:d72830877d98 2457 if( xbee_from_acum( data ) > 0 ){
bokunimowakaru 0:d72830877d98 2458 ret = data[21]; // 14:データ1文字
bokunimowakaru 0:d72830877d98 2459 #ifdef DEBUG_RX
bokunimowakaru 0:d72830877d98 2460 len = data[2]-0x12; // 18バイト減算
bokunimowakaru 0:d72830877d98 2461 #endif
bokunimowakaru 0:d72830877d98 2462 }else{
bokunimowakaru 0:d72830877d98 2463 #ifdef H3694
bokunimowakaru 0:d72830877d98 2464 led_red( 1 );
bokunimowakaru 0:d72830877d98 2465 #endif
bokunimowakaru 0:d72830877d98 2466 #ifdef ERRLOG
bokunimowakaru 0:d72830877d98 2467 strcopy( ERR_LOG , "ERR:xbee_uart2 from" );
bokunimowakaru 0:d72830877d98 2468 ERR_CODE = xbee_from_acum( data );
bokunimowakaru 0:d72830877d98 2469 #endif
bokunimowakaru 0:d72830877d98 2470 }
bokunimowakaru 0:d72830877d98 2471 }else{
bokunimowakaru 0:d72830877d98 2472 #ifdef H3694
bokunimowakaru 0:d72830877d98 2473 led_red( 1 );
bokunimowakaru 0:d72830877d98 2474 #endif
bokunimowakaru 0:d72830877d98 2475 #ifdef ERRLOG
bokunimowakaru 0:d72830877d98 2476 strcopy( ERR_LOG , "ERR:xbee_uart mode" );
bokunimowakaru 0:d72830877d98 2477 ERR_CODE = data[3];
bokunimowakaru 0:d72830877d98 2478 #endif
bokunimowakaru 0:d72830877d98 2479 }
bokunimowakaru 0:d72830877d98 2480 #ifdef DEBUG_RX
bokunimowakaru 0:d72830877d98 2481 lcd_goto(LCD_ROW_3);
bokunimowakaru 0:d72830877d98 2482 lcd_putstr("[");
bokunimowakaru 0:d72830877d98 2483 if( data[3]==0x90 && len>1 ) for(i=0; i< len ; i++) lcd_putch( data[15+i] );
bokunimowakaru 0:d72830877d98 2484 else if( data[3]==0x91 && len>1 ) for(i=0; i< len ; i++) lcd_putch( data[21+i] );
bokunimowakaru 0:d72830877d98 2485 else lcd_putch( ret );
bokunimowakaru 0:d72830877d98 2486 lcd_putstr( "](0x" );
bokunimowakaru 0:d72830877d98 2487 lcd_disp_hex( ret );
bokunimowakaru 0:d72830877d98 2488 lcd_putstr( ") l=" );
bokunimowakaru 0:d72830877d98 2489 lcd_disp_hex( len );
bokunimowakaru 0:d72830877d98 2490 if( data[3]==0x91 ){
bokunimowakaru 0:d72830877d98 2491 lcd_putstr(" CI:");
bokunimowakaru 0:d72830877d98 2492 lcd_disp_hex( data[16] );
bokunimowakaru 0:d72830877d98 2493 lcd_disp_hex( data[17] );
bokunimowakaru 0:d72830877d98 2494 lcd_putstr(".");
bokunimowakaru 0:d72830877d98 2495 lcd_disp_hex( data[18] );
bokunimowakaru 0:d72830877d98 2496 lcd_disp_hex( data[19] );
bokunimowakaru 0:d72830877d98 2497 }
bokunimowakaru 0:d72830877d98 2498 #endif
bokunimowakaru 0:d72830877d98 2499 return(ret);
bokunimowakaru 0:d72830877d98 2500 }
bokunimowakaru 0:d72830877d98 2501
bokunimowakaru 0:d72830877d98 2502 /* (ドライバ)ATコマンドの送信+受信 */
bokunimowakaru 0:d72830877d98 2503 byte xbee_tx_rx(const char *at, byte *data, byte len){
bokunimowakaru 0:d72830877d98 2504 /*
bokunimowakaru 0:d72830877d98 2505 コマンド送信と受信がセットになったAPI(受信コマンドの簡単なチェックも実施)
bokunimowakaru 0:d72830877d98 2506 at: ATコマンド(文字列)
bokunimowakaru 0:d72830877d98 2507 data[API_SIZE]: 入力データ/出力データ(共用)
bokunimowakaru 0:d72830877d98 2508 ※本コマンドの処理中に受信した他のパケット(送信IDとATコマンド名で判定)は破棄する。
bokunimowakaru 0:d72830877d98 2509 (始めに受信キャッシュクリアしている)
bokunimowakaru 0:d72830877d98 2510 戻り値:エラー時 0x00
bokunimowakaru 0:d72830877d98 2511
bokunimowakaru 0:d72830877d98 2512 注意:本コマンドは応答待ちを行うので干渉によるパケット損失があります。
bokunimowakaru 0:d72830877d98 2513 */
bokunimowakaru 0:d72830877d98 2514
bokunimowakaru 0:d72830877d98 2515 byte err,retry;
bokunimowakaru 0:d72830877d98 2516 byte r_dat = 10; // AT=0、RAT=10、TX=未定 リモートATと通常ATの応答値dataの代入位置の差
bokunimowakaru 0:d72830877d98 2517 byte r_at = 1; // AT=0、RAT=1 リモートの可否
bokunimowakaru 0:d72830877d98 2518 #ifndef XBEE_WIFI // ZigBee
bokunimowakaru 0:d72830877d98 2519 unsigned int wait_add = 0;
bokunimowakaru 0:d72830877d98 2520 #endif
bokunimowakaru 0:d72830877d98 2521 #ifdef CACHE_RES
bokunimowakaru 0:d72830877d98 2522 byte i;
bokunimowakaru 0:d72830877d98 2523 #endif
bokunimowakaru 0:d72830877d98 2524
bokunimowakaru 0:d72830877d98 2525 #ifndef LITE // BeeBee Lite by 蘭
bokunimowakaru 0:d72830877d98 2526 sci_write_check();
bokunimowakaru 0:d72830877d98 2527 #endif
bokunimowakaru 0:d72830877d98 2528 #ifdef H3694
bokunimowakaru 0:d72830877d98 2529 sci_clear();
bokunimowakaru 0:d72830877d98 2530 #endif
bokunimowakaru 0:d72830877d98 2531
bokunimowakaru 0:d72830877d98 2532 #ifndef XBEE_WIFI // ZigBee
bokunimowakaru 0:d72830877d98 2533 if( at[0] == 'A' && at[1] == 'T' ){
bokunimowakaru 0:d72830877d98 2534 r_dat = 0; r_at=0;
bokunimowakaru 0:d72830877d98 2535 if( at[2] == 'W' && at[3] == 'R' ) wait_add = 100; // ATWR 110~1100ms
bokunimowakaru 0:d72830877d98 2536 } else if ( at[0] == 'R' && at[1] == 'A' && at[2] == 'T' ){
bokunimowakaru 0:d72830877d98 2537 r_dat = 10; r_at=1;
bokunimowakaru 0:d72830877d98 2538 if( at[3] == 'W' && at[4] == 'R' ) wait_add = 100; // RATWR 120~1200ms
bokunimowakaru 0:d72830877d98 2539 }
bokunimowakaru 0:d72830877d98 2540 if( xbee_at_tx( at ,data ,len ) > 0){
bokunimowakaru 0:d72830877d98 2541 err = 12; // 受信なしエラー
bokunimowakaru 0:d72830877d98 2542 for( retry = 10 ; ( retry > 0 && err != 0 ) ; retry-- ){
bokunimowakaru 0:d72830877d98 2543 wait_millisec( 10 + (unsigned int)r_dat ); // 応答時間待ち AT 10~100ms / RAT 20~200ms
bokunimowakaru 0:d72830877d98 2544 if( wait_add != 0 ){
bokunimowakaru 0:d72830877d98 2545 wait_millisec( wait_add ); // 追加ウェイト
bokunimowakaru 0:d72830877d98 2546 }
bokunimowakaru 0:d72830877d98 2547 if( xbee_at_rx( data ) > 0){
bokunimowakaru 0:d72830877d98 2548 if( (
bokunimowakaru 0:d72830877d98 2549 ( data[3] == MODE_RES && r_at == 0 ) || ( data[3] == MODE_RESP && r_at == 1 )
bokunimowakaru 0:d72830877d98 2550 ) && (
bokunimowakaru 0:d72830877d98 2551 data[4] == PACKET_ID
bokunimowakaru 0:d72830877d98 2552 )
bokunimowakaru 0:d72830877d98 2553 ){
bokunimowakaru 0:d72830877d98 2554 /* ATコマンドが正しいかどうかの確認を削除(Ver 1.51)
bokunimowakaru 0:d72830877d98 2555 ※MODE_RESPの条件を追加したので不要のはず。
bokunimowakaru 0:d72830877d98 2556 && data[5+r_dat] == (byte)at[2+r_at] && data[6+r_dat] == (byte)at[3+r_at]
bokunimowakaru 0:d72830877d98 2557 */
bokunimowakaru 0:d72830877d98 2558 if( data[7+r_dat] == 0x00 ){
bokunimowakaru 0:d72830877d98 2559 err=0;
bokunimowakaru 0:d72830877d98 2560 }else err = data[7+r_dat]; // ATのERRORコード (AT:data[7] RAT:data[17])
bokunimowakaru 0:d72830877d98 2561 }else{ // 受信したパケットIDまたはATコマンドが相違しているとき
bokunimowakaru 0:d72830877d98 2562 #ifdef CACHE_RES
bokunimowakaru 0:d72830877d98 2563 if( CACHE_COUNTER < CACHE_RES ){
bokunimowakaru 0:d72830877d98 2564 for( i=0 ; i < API_SIZE ; i++) CACHE_MEM[CACHE_COUNTER][i] = data[i];
bokunimowakaru 0:d72830877d98 2565 CACHE_COUNTER++;
bokunimowakaru 0:d72830877d98 2566 #ifdef DEBUG
bokunimowakaru 0:d72830877d98 2567 lcd_putstr("### CACHE_RES ### <- "); // DEBUG
bokunimowakaru 0:d72830877d98 2568 lcd_disp_hex( CACHE_COUNTER );
bokunimowakaru 0:d72830877d98 2569 lcd_putch('\n');
bokunimowakaru 0:d72830877d98 2570 #endif
bokunimowakaru 0:d72830877d98 2571 }
bokunimowakaru 0:d72830877d98 2572 #endif
bokunimowakaru 0:d72830877d98 2573 // キャッシュ容量が無い場合は受信データを保持せずにリトライする
bokunimowakaru 0:d72830877d98 2574 }
bokunimowakaru 0:d72830877d98 2575 }
bokunimowakaru 0:d72830877d98 2576 }
bokunimowakaru 0:d72830877d98 2577 //printf("\nretry=%d\n",retry);
bokunimowakaru 0:d72830877d98 2578 }else err = 11; // 送信失敗
bokunimowakaru 0:d72830877d98 2579 #else // XBEE_WIFI (PC + Arduino)
bokunimowakaru 0:d72830877d98 2580 #ifdef XBEE_WIFI_DEBUG
bokunimowakaru 0:d72830877d98 2581 for(i=0;i<(5+len);i++) Serial.print(at[i]);
bokunimowakaru 0:d72830877d98 2582 Serial.print('(');
bokunimowakaru 0:d72830877d98 2583 Serial.print(PACKET_ID,HEX);
bokunimowakaru 0:d72830877d98 2584 Serial.println(')');
bokunimowakaru 0:d72830877d98 2585 #endif
bokunimowakaru 0:d72830877d98 2586
bokunimowakaru 0:d72830877d98 2587 if(DEVICE_TYPE == XB_TYPE_NULL){
bokunimowakaru 0:d72830877d98 2588 #ifdef DEBUG
bokunimowakaru 0:d72830877d98 2589 printf("DEBUG:check DEVICE_TYPE = XB_TYPE_WIFI20\n");
bokunimowakaru 0:d72830877d98 2590 #endif
bokunimowakaru 0:d72830877d98 2591 DEVICE_TYPE = XB_TYPE_WIFI20;
bokunimowakaru 0:d72830877d98 2592 if( xbee_tx_rx(at, data, len) > 0 ){
bokunimowakaru 0:d72830877d98 2593 return(1);
bokunimowakaru 0:d72830877d98 2594 }else{
bokunimowakaru 0:d72830877d98 2595 #ifdef DEBUG
bokunimowakaru 0:d72830877d98 2596 printf("DEBUG:check DEVICE_TYPE = XB_TYPE_WIFI10\n");
bokunimowakaru 0:d72830877d98 2597 #endif
bokunimowakaru 0:d72830877d98 2598 DEVICE_TYPE = XB_TYPE_WIFI10;
bokunimowakaru 0:d72830877d98 2599 if( xbee_tx_rx(at, data, len) > 0 ) return(1);
bokunimowakaru 0:d72830877d98 2600 else{
bokunimowakaru 0:d72830877d98 2601 #ifdef DEBUG
bokunimowakaru 0:d72830877d98 2602 printf("DEBUG:no Response at check DEVICE_TYPE\n");
bokunimowakaru 0:d72830877d98 2603 #endif
bokunimowakaru 0:d72830877d98 2604 DEVICE_TYPE = XB_TYPE_NULL;
bokunimowakaru 0:d72830877d98 2605 #ifdef ERRLOG
bokunimowakaru 0:d72830877d98 2606 ERR_CODE=12;
bokunimowakaru 0:d72830877d98 2607 strcopy( ERR_LOG ,"ERR:tx_rx no Rx Res. wifi check");
bokunimowakaru 0:d72830877d98 2608 #endif
bokunimowakaru 0:d72830877d98 2609 return(0); // エラー終了
bokunimowakaru 0:d72830877d98 2610 }
bokunimowakaru 0:d72830877d98 2611 }
bokunimowakaru 0:d72830877d98 2612 }
bokunimowakaru 0:d72830877d98 2613 if( xbee_at_tx( at ,data ,len ) > 0){
bokunimowakaru 0:d72830877d98 2614 err = 12; // 受信なしエラー
bokunimowakaru 0:d72830877d98 2615 for( retry = 10 ; ( retry > 0 && err != 0 ) ; retry-- ){
bokunimowakaru 0:d72830877d98 2616 if( xbee_at_rx( data ) > 0){
bokunimowakaru 0:d72830877d98 2617 if( (
bokunimowakaru 0:d72830877d98 2618 ( data[3] == MODE_RES && r_at == 0 ) || ( data[3] == MODE_RESP && r_at == 1 )
bokunimowakaru 0:d72830877d98 2619 ) && (
bokunimowakaru 0:d72830877d98 2620 data[4] == PACKET_ID
bokunimowakaru 0:d72830877d98 2621 )
bokunimowakaru 0:d72830877d98 2622 ){
bokunimowakaru 0:d72830877d98 2623 /* ATコマンドが正しいかどうかの確認を削除(Ver 1.51)
bokunimowakaru 0:d72830877d98 2624 ※MODE_RESPの条件を追加したので不要のはず。
bokunimowakaru 0:d72830877d98 2625 && data[5+r_dat] == (byte)at[2+r_at] && data[6+r_dat] == (byte)at[3+r_at]
bokunimowakaru 0:d72830877d98 2626 */
bokunimowakaru 0:d72830877d98 2627 if( data[7+r_dat] == 0x00 ){
bokunimowakaru 0:d72830877d98 2628 err=0;
bokunimowakaru 0:d72830877d98 2629 }else err = data[7+r_dat]; // ATのERRORコード (AT:data[7] RAT:data[17])
bokunimowakaru 0:d72830877d98 2630 }else{ // 受信したパケットIDまたはATコマンドが相違しているとき
bokunimowakaru 0:d72830877d98 2631 #ifdef CACHE_RES
bokunimowakaru 0:d72830877d98 2632 if( CACHE_COUNTER < CACHE_RES ){
bokunimowakaru 0:d72830877d98 2633 for( i=0 ; i < API_SIZE ; i++) CACHE_MEM[CACHE_COUNTER][i] = data[i];
bokunimowakaru 0:d72830877d98 2634 CACHE_COUNTER++;
bokunimowakaru 0:d72830877d98 2635 #ifdef DEBUG
bokunimowakaru 0:d72830877d98 2636 lcd_putstr("### CACHE_RES ### <- "); // DEBUG
bokunimowakaru 0:d72830877d98 2637 lcd_disp_hex( CACHE_COUNTER );
bokunimowakaru 0:d72830877d98 2638 lcd_putch('\n');
bokunimowakaru 0:d72830877d98 2639 #endif
bokunimowakaru 0:d72830877d98 2640 }
bokunimowakaru 0:d72830877d98 2641 #endif
bokunimowakaru 0:d72830877d98 2642 // キャッシュ容量が無い場合は受信データを保持せずにリトライする
bokunimowakaru 0:d72830877d98 2643 }
bokunimowakaru 0:d72830877d98 2644 }else{ // 受信データが無い時(リトライ前)
bokunimowakaru 0:d72830877d98 2645 wait_millisec(50); // 50msの待ち時間
bokunimowakaru 0:d72830877d98 2646 }
bokunimowakaru 0:d72830877d98 2647 }
bokunimowakaru 0:d72830877d98 2648 }else err = 11; // 送信失敗
bokunimowakaru 0:d72830877d98 2649 delay(1); // 直前のコマンド応答がすぐに返った時にキャッシュに貯めれないことを防止する
bokunimowakaru 0:d72830877d98 2650
bokunimowakaru 0:d72830877d98 2651 #endif
bokunimowakaru 0:d72830877d98 2652
bokunimowakaru 0:d72830877d98 2653 if( err ){
bokunimowakaru 0:d72830877d98 2654 wait_millisec( 1000 ); // 応答待ち状態で、次々にコマンドを送るとXBeeモジュールが非応答になる対策
bokunimowakaru 0:d72830877d98 2655 #ifdef H3694
bokunimowakaru 0:d72830877d98 2656 led_red( 1 );
bokunimowakaru 0:d72830877d98 2657 #endif
bokunimowakaru 0:d72830877d98 2658 #ifdef ERRLOG
bokunimowakaru 0:d72830877d98 2659 ERR_CODE=err;
bokunimowakaru 0:d72830877d98 2660 switch(err){
bokunimowakaru 0:d72830877d98 2661 case 2: // 01234567890123456789
bokunimowakaru 0:d72830877d98 2662 strcopy( ERR_LOG ,"ERR:tx_rx AT Command");
bokunimowakaru 0:d72830877d98 2663 break;
bokunimowakaru 0:d72830877d98 2664 case 3:
bokunimowakaru 0:d72830877d98 2665 strcopy( ERR_LOG ,"ERR:tx_rx AT Param. ");
bokunimowakaru 0:d72830877d98 2666 break;
bokunimowakaru 0:d72830877d98 2667 case 4:
bokunimowakaru 0:d72830877d98 2668 strcopy( ERR_LOG ,"ERR:tx_rx AT Commu. ");
bokunimowakaru 0:d72830877d98 2669 break;
bokunimowakaru 0:d72830877d98 2670 case 10:
bokunimowakaru 0:d72830877d98 2671 strcopy( ERR_LOG ,"ERR:tx_rx not AT CMD");
bokunimowakaru 0:d72830877d98 2672 break;
bokunimowakaru 0:d72830877d98 2673 case 11:
bokunimowakaru 0:d72830877d98 2674 strcopy( ERR_LOG ,"ERR:tx_rx TX Failed ");
bokunimowakaru 0:d72830877d98 2675 break;
bokunimowakaru 0:d72830877d98 2676 case 12:
bokunimowakaru 0:d72830877d98 2677 strcopy( ERR_LOG ,"ERR:tx_rx no Rx Res.");
bokunimowakaru 0:d72830877d98 2678 break;
bokunimowakaru 0:d72830877d98 2679 case 13:
bokunimowakaru 0:d72830877d98 2680 strcopy( ERR_LOG ,"ERR:tx_rx AT Pckt ID");
bokunimowakaru 0:d72830877d98 2681 break;
bokunimowakaru 0:d72830877d98 2682 case 14:
bokunimowakaru 0:d72830877d98 2683 strcopy( ERR_LOG ,"ERR:tx_rx Diff.Adrs.");
bokunimowakaru 0:d72830877d98 2684 break;
bokunimowakaru 0:d72830877d98 2685 default:
bokunimowakaru 0:d72830877d98 2686 strcopy( ERR_LOG ,"ERR:tx_rx AT unknown");
bokunimowakaru 0:d72830877d98 2687 break;
bokunimowakaru 0:d72830877d98 2688 }
bokunimowakaru 0:d72830877d98 2689 ERR_LOG[20] = ':';
bokunimowakaru 0:d72830877d98 2690 if( at[0] == 'A' ){
bokunimowakaru 0:d72830877d98 2691 ERR_LOG[21] = at[2];
bokunimowakaru 0:d72830877d98 2692 ERR_LOG[22] = at[3];
bokunimowakaru 0:d72830877d98 2693 }else{
bokunimowakaru 0:d72830877d98 2694 ERR_LOG[21] = at[3];
bokunimowakaru 0:d72830877d98 2695 ERR_LOG[22] = at[4];
bokunimowakaru 0:d72830877d98 2696 }
bokunimowakaru 0:d72830877d98 2697 #endif
bokunimowakaru 0:d72830877d98 2698 }
bokunimowakaru 0:d72830877d98 2699 #ifdef XBEE_WIFI_DEBUG
bokunimowakaru 0:d72830877d98 2700 if( err ){
bokunimowakaru 0:d72830877d98 2701 Serial.print("ERR in tx_rx ");
bokunimowakaru 0:d72830877d98 2702 Serial.println(err,DEC);
bokunimowakaru 0:d72830877d98 2703 }
bokunimowakaru 0:d72830877d98 2704 #endif
bokunimowakaru 0:d72830877d98 2705 #ifdef DEBUG
bokunimowakaru 0:d72830877d98 2706 #ifdef ARM_MBED
bokunimowakaru 0:d72830877d98 2707 if( err ){
bokunimowakaru 0:d72830877d98 2708 _xbee_debug.printf("DEBUG: %s ", ERR_LOG);
bokunimowakaru 0:d72830877d98 2709 _xbee_debug.printf("(err=%d)\r\n", err);
bokunimowakaru 0:d72830877d98 2710 }
bokunimowakaru 0:d72830877d98 2711 #else
bokunimowakaru 0:d72830877d98 2712 if( err ) fprintf(stderr,"DEBUG: %s (err=%d)\n", ERR_LOG,err);
bokunimowakaru 0:d72830877d98 2713 #endif
bokunimowakaru 0:d72830877d98 2714 #endif
bokunimowakaru 0:d72830877d98 2715 return( !err );
bokunimowakaru 0:d72830877d98 2716 }
bokunimowakaru 0:d72830877d98 2717
bokunimowakaru 0:d72830877d98 2718 /***********************************************************************
bokunimowakaru 0:d72830877d98 2719 XBee用 UART出力API
bokunimowakaru 0:d72830877d98 2720 byte xbee_putch( const char c );
bokunimowakaru 0:d72830877d98 2721 byte xbee_putstr( const char *s );
bokunimowakaru 0:d72830877d98 2722 void xbee_disp_hex( const unsigned char i );
bokunimowakaru 0:d72830877d98 2723 void xbee_disp_1( const unsigned int x );
bokunimowakaru 0:d72830877d98 2724 void xbee_disp_2( unsigned int x );
bokunimowakaru 0:d72830877d98 2725 void xbee_disp_3(unsigned int x);
bokunimowakaru 0:d72830877d98 2726 void xbee_disp_5(unsigned int x);
bokunimowakaru 0:d72830877d98 2727 void xbee_log( const byte level, const char *err , const byte x );
bokunimowakaru 0:d72830877d98 2728 ***********************************************************************/
bokunimowakaru 0:d72830877d98 2729
bokunimowakaru 0:d72830877d98 2730 #ifndef LITE // BeeBee Lite by 蘭
bokunimowakaru 0:d72830877d98 2731 byte xbee_putch( const char c ){
bokunimowakaru 0:d72830877d98 2732 byte data[2];
bokunimowakaru 0:d72830877d98 2733 byte len;
bokunimowakaru 0:d72830877d98 2734 data[0] = (byte)c;
bokunimowakaru 0:d72830877d98 2735 if( xbee_at_tx( "TX", data , 1) == 0 ) len=0; else len=1;
bokunimowakaru 0:d72830877d98 2736 return( len );
bokunimowakaru 0:d72830877d98 2737 }
bokunimowakaru 0:d72830877d98 2738 #endif
bokunimowakaru 0:d72830877d98 2739
bokunimowakaru 0:d72830877d98 2740 byte xbee_putstr( const char *s ){
bokunimowakaru 0:d72830877d98 2741 /*
bokunimowakaru 0:d72830877d98 2742 文字を送信する
bokunimowakaru 0:d72830877d98 2743 入力:char *s
bokunimowakaru 0:d72830877d98 2744 出力:送信データ長を応答。0の場合は異常
bokunimowakaru 0:d72830877d98 2745 */
bokunimowakaru 0:d72830877d98 2746 byte data[API_TXSIZE-17]; // 17バイトはAPIヘッダ+CRC1バイトなのでデータ長は[API_TXSIZE-18]+null文字で+1する-17
bokunimowakaru 0:d72830877d98 2747 byte i;
bokunimowakaru 0:d72830877d98 2748
bokunimowakaru 0:d72830877d98 2749 for(i=0; (i< (API_TXSIZE-18) ) && (s[i] != 0x00) ; i++){ // データ長はAPI_TXSIZE-18
bokunimowakaru 0:d72830877d98 2750 data[i] = (byte)s[i]; // テキストデータをバイナリデータ(バイト値)に変換する
bokunimowakaru 0:d72830877d98 2751 }
bokunimowakaru 0:d72830877d98 2752 data[i] = 0x00;
bokunimowakaru 0:d72830877d98 2753 if( xbee_at_tx( "TX", data , i) == 0) i=0;
bokunimowakaru 0:d72830877d98 2754 return( i );
bokunimowakaru 0:d72830877d98 2755 }
bokunimowakaru 0:d72830877d98 2756
bokunimowakaru 0:d72830877d98 2757 #ifndef LITE // BeeBee Lite by 蘭
bokunimowakaru 0:d72830877d98 2758 void xbee_disp_hex( const byte i ){
bokunimowakaru 0:d72830877d98 2759 byte data[3];
bokunimowakaru 0:d72830877d98 2760 data[0] = i&0xF0;
bokunimowakaru 0:d72830877d98 2761 data[0] = data[0]>>4;
bokunimowakaru 0:d72830877d98 2762 data[0] += '0';
bokunimowakaru 0:d72830877d98 2763 if (data[0]>'9') data[0] += 7;
bokunimowakaru 0:d72830877d98 2764 data[1]=(i&0x0F)+'0';
bokunimowakaru 0:d72830877d98 2765 if (data[1]>'9') data[1]+=7;
bokunimowakaru 0:d72830877d98 2766 xbee_at_tx( "TX", data , 2);
bokunimowakaru 0:d72830877d98 2767 }
bokunimowakaru 0:d72830877d98 2768
bokunimowakaru 0:d72830877d98 2769 void xbee_disp_1( const unsigned int x ){
bokunimowakaru 0:d72830877d98 2770 if (x<10) xbee_putch((char)(x+0x30));
bokunimowakaru 0:d72830877d98 2771 else if (x<16) xbee_putch((char)(x-10+'A'));
bokunimowakaru 0:d72830877d98 2772 else xbee_putch('X');
bokunimowakaru 0:d72830877d98 2773 }
bokunimowakaru 0:d72830877d98 2774
bokunimowakaru 0:d72830877d98 2775 void xbee_disp_2( unsigned int x ){
bokunimowakaru 0:d72830877d98 2776 char s[3];
bokunimowakaru 0:d72830877d98 2777 unsigned int y;
bokunimowakaru 0:d72830877d98 2778 if (x<100){
bokunimowakaru 0:d72830877d98 2779 y=x/10; s[0]=(char)(y+0x30); x-=(y*10);
bokunimowakaru 0:d72830877d98 2780 s[1]=(char)(x+0x30);
bokunimowakaru 0:d72830877d98 2781 s[2]='\0';
bokunimowakaru 0:d72830877d98 2782 if( s[0]=='0' ){
bokunimowakaru 0:d72830877d98 2783 s[0]=' ';
bokunimowakaru 0:d72830877d98 2784 }
bokunimowakaru 0:d72830877d98 2785 xbee_putstr( s );
bokunimowakaru 0:d72830877d98 2786 }else xbee_putstr("XX");
bokunimowakaru 0:d72830877d98 2787 }
bokunimowakaru 0:d72830877d98 2788
bokunimowakaru 0:d72830877d98 2789 void xbee_disp_3(unsigned int x){
bokunimowakaru 0:d72830877d98 2790 char s[4];
bokunimowakaru 0:d72830877d98 2791 unsigned int y;
bokunimowakaru 0:d72830877d98 2792 if (x<1000){
bokunimowakaru 0:d72830877d98 2793 y=x/100; s[0]=(char)(y+0x30); x-=(y*100);
bokunimowakaru 0:d72830877d98 2794 y=x/10; s[1]=(char)(y+0x30); x-= (y*10);
bokunimowakaru 0:d72830877d98 2795 s[2]=(char)(x+0x30);
bokunimowakaru 0:d72830877d98 2796 s[3]='\0';
bokunimowakaru 0:d72830877d98 2797 if( s[0]=='0' ){
bokunimowakaru 0:d72830877d98 2798 s[0]=' ';
bokunimowakaru 0:d72830877d98 2799 if( s[1]=='0' ){
bokunimowakaru 0:d72830877d98 2800 s[1]=' ';
bokunimowakaru 0:d72830877d98 2801 }
bokunimowakaru 0:d72830877d98 2802 }
bokunimowakaru 0:d72830877d98 2803 xbee_putstr( s );
bokunimowakaru 0:d72830877d98 2804 }else xbee_putstr("XXX");
bokunimowakaru 0:d72830877d98 2805 }
bokunimowakaru 0:d72830877d98 2806
bokunimowakaru 0:d72830877d98 2807 void xbee_disp_5(unsigned int x){
bokunimowakaru 0:d72830877d98 2808 char s[6];
bokunimowakaru 0:d72830877d98 2809 unsigned int y;
bokunimowakaru 0:d72830877d98 2810 if (x<=65535){
bokunimowakaru 0:d72830877d98 2811 y=x/10000; s[0]=(char)(y+0x30); x-=(y*10000);
bokunimowakaru 0:d72830877d98 2812 y=x/1000; s[1]=(char)(y+0x30); x-= (y*1000);
bokunimowakaru 0:d72830877d98 2813 y=x/100; s[2]=(char)(y+0x30); x-= (y*100);
bokunimowakaru 0:d72830877d98 2814 y=x/10; s[3]=(char)(y+0x30); x-= (y*10);
bokunimowakaru 0:d72830877d98 2815 s[4]=(char)(x+0x30);
bokunimowakaru 0:d72830877d98 2816 s[5]='\0';
bokunimowakaru 0:d72830877d98 2817 if( s[0]=='0' ){
bokunimowakaru 0:d72830877d98 2818 s[0]=' ';
bokunimowakaru 0:d72830877d98 2819 if( s[1]=='0' ){
bokunimowakaru 0:d72830877d98 2820 s[1]=' ';
bokunimowakaru 0:d72830877d98 2821 if( s[2]=='0' ){
bokunimowakaru 0:d72830877d98 2822 s[2]=' ';
bokunimowakaru 0:d72830877d98 2823 if( s[3]=='0' ){
bokunimowakaru 0:d72830877d98 2824 s[3]=' ';
bokunimowakaru 0:d72830877d98 2825 }
bokunimowakaru 0:d72830877d98 2826 }
bokunimowakaru 0:d72830877d98 2827 }
bokunimowakaru 0:d72830877d98 2828 }
bokunimowakaru 0:d72830877d98 2829 xbee_putstr( s );
bokunimowakaru 0:d72830877d98 2830 }else xbee_putstr("XXXXX");
bokunimowakaru 0:d72830877d98 2831 }
bokunimowakaru 0:d72830877d98 2832 #endif // LITE
bokunimowakaru 0:d72830877d98 2833
bokunimowakaru 0:d72830877d98 2834 void xbee_log(const byte level, const char *err, const byte x ){
bokunimowakaru 0:d72830877d98 2835 /*
bokunimowakaru 0:d72830877d98 2836 エラーログ用レベルガイド
bokunimowakaru 0:d72830877d98 2837 LEVEL 5 ERROR 致命的なエラー、バグ発生
bokunimowakaru 0:d72830877d98 2838 LEVEL 4 ERR 通信エラー等のうち不具合動作を伴う懸念のあるもの。500ms待ち挿入
bokunimowakaru 0:d72830877d98 2839 LEVEL 3 CAUTION 通信エラー、使い方の問題など
bokunimowakaru 0:d72830877d98 2840 LEVEL 2 未定義
bokunimowakaru 0:d72830877d98 2841 LEVEL 1 LOG 各関数の動作確認用
bokunimowakaru 0:d72830877d98 2842 */
bokunimowakaru 0:d72830877d98 2843 #ifdef ERRLOG
bokunimowakaru 0:d72830877d98 2844 /* PCの場合 */
bokunimowakaru 0:d72830877d98 2845 #ifndef ARDUINO
bokunimowakaru 0:d72830877d98 2846 #ifndef H3694
bokunimowakaru 0:d72830877d98 2847 #ifdef XBEE_ERROR_TIME
bokunimowakaru 0:d72830877d98 2848 time_t error_time;
bokunimowakaru 0:d72830877d98 2849 struct tm *error_time_st;
bokunimowakaru