Interplan IM920 library, 920MHz module

Dependents:   IM920_sample IM920_SDlog IM920_sample IM920_sample3 ... more

IM920 ライブラリ

データモード、低速、長距離 の設定で通信するライブラリです。

920MHz無線モジュール

http://www.interplan.co.jp/images/contents/solution/im920.png IM920 (インタープラン製)

  • mbedとモジュールとは、シリアル(TX,RX)、BUSY、RESET端子を接続します。
  • モジュールはあらかじめ、コマンドでノード番号などを設定しておきます。

NECの920MHz近距離無線モジュールもおすすめ

Committer:
idealtechlab
Date:
Fri Apr 24 03:59:13 2015 +0000
Revision:
5:2fd9b1725283
Parent:
4:ba939555ed35
fix buffer over run

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 1:81b2fd407327 1 /* Copyright (C) 2014 Suga, MIT License
okini3939 1:81b2fd407327 2 *
okini3939 1:81b2fd407327 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
okini3939 1:81b2fd407327 4 * and associated documentation files (the "Software"), to deal in the Software without restriction,
okini3939 1:81b2fd407327 5 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
okini3939 1:81b2fd407327 6 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
okini3939 1:81b2fd407327 7 * furnished to do so, subject to the following conditions:
okini3939 1:81b2fd407327 8 *
okini3939 1:81b2fd407327 9 * The above copyright notice and this permission notice shall be included in all copies or
okini3939 1:81b2fd407327 10 * substantial portions of the Software.
okini3939 1:81b2fd407327 11 *
okini3939 1:81b2fd407327 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
okini3939 1:81b2fd407327 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
okini3939 1:81b2fd407327 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
okini3939 1:81b2fd407327 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
okini3939 1:81b2fd407327 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
okini3939 1:81b2fd407327 17 */
okini3939 0:d3ab05ed8142 18 #ifndef _IM920_h_
okini3939 0:d3ab05ed8142 19 #define _IM920_h_
okini3939 0:d3ab05ed8142 20
okini3939 0:d3ab05ed8142 21 #include "IM920_conf.h"
okini3939 0:d3ab05ed8142 22
okini3939 0:d3ab05ed8142 23 #include "mbed.h"
idealtechlab 2:0b47f6b25cc4 24 #include "FunctionPointer.h"
okini3939 0:d3ab05ed8142 25 #include "CBuffer.h"
okini3939 0:d3ab05ed8142 26 #include <ctype.h>
okini3939 0:d3ab05ed8142 27 #include <stdlib.h>
okini3939 0:d3ab05ed8142 28 #include <string.h>
okini3939 0:d3ab05ed8142 29
okini3939 0:d3ab05ed8142 30 //Debug is disabled by default
idealtechlab 4:ba939555ed35 31 #if defined(DEBUG)
okini3939 0:d3ab05ed8142 32 #define DBG(x, ...) std::printf("[DBG]" x "\r\n", ##__VA_ARGS__);
okini3939 0:d3ab05ed8142 33 #define WARN(x, ...) std::printf("[WARN]" x "\r\n", ##__VA_ARGS__);
okini3939 0:d3ab05ed8142 34 #define ERR(x, ...) std::printf("[ERR]" x "\r\n", ##__VA_ARGS__);
okini3939 0:d3ab05ed8142 35 #define INFO(x, ...) std::printf("[INFO]" x "\r\n", ##__VA_ARGS__);
okini3939 0:d3ab05ed8142 36 #else
okini3939 0:d3ab05ed8142 37 #define DBG(x, ...)
okini3939 0:d3ab05ed8142 38 #define WARN(x, ...)
okini3939 0:d3ab05ed8142 39 #define ERR(x, ...)
okini3939 0:d3ab05ed8142 40 #define INFO(x, ...)
okini3939 0:d3ab05ed8142 41 #endif
okini3939 0:d3ab05ed8142 42
okini3939 0:d3ab05ed8142 43 class IM920 {
okini3939 0:d3ab05ed8142 44 public:
okini3939 0:d3ab05ed8142 45 enum Response {
okini3939 0:d3ab05ed8142 46 RES_NULL,
okini3939 0:d3ab05ed8142 47 RES_RDID,
okini3939 0:d3ab05ed8142 48 RES_RDNN,
okini3939 0:d3ab05ed8142 49 RES_RDRS,
okini3939 0:d3ab05ed8142 50 };
okini3939 0:d3ab05ed8142 51
okini3939 0:d3ab05ed8142 52 enum Mode {
okini3939 0:d3ab05ed8142 53 MODE_COMMAND,
okini3939 0:d3ab05ed8142 54 MODE_DATA_RX,
okini3939 0:d3ab05ed8142 55 };
okini3939 0:d3ab05ed8142 56
okini3939 0:d3ab05ed8142 57 enum Status {
okini3939 0:d3ab05ed8142 58 STAT_NONE,
okini3939 0:d3ab05ed8142 59 STAT_SLEEP,
okini3939 0:d3ab05ed8142 60 };
okini3939 0:d3ab05ed8142 61
okini3939 3:db269462ad1c 62 IM920 (PinName tx, PinName rx, PinName busy, PinName reset, int baud = IM920_BAUD);
okini3939 0:d3ab05ed8142 63
okini3939 3:db269462ad1c 64 int init ();
idealtechlab 4:ba939555ed35 65 void poll ();
idealtechlab 4:ba939555ed35 66 int send (char *buf, int len);
idealtechlab 4:ba939555ed35 67 int recv (char *buf, int len);
idealtechlab 2:0b47f6b25cc4 68
idealtechlab 2:0b47f6b25cc4 69 void attach (void(*fptr)() = NULL) {
idealtechlab 2:0b47f6b25cc4 70 _func.attach(fptr);
idealtechlab 2:0b47f6b25cc4 71 }
idealtechlab 2:0b47f6b25cc4 72 template<typename T>
idealtechlab 2:0b47f6b25cc4 73 void attach (T* tptr, void (T::*mptr)()) {
idealtechlab 2:0b47f6b25cc4 74 if ((mptr != NULL) && (tptr != NULL)) {
idealtechlab 2:0b47f6b25cc4 75 _func.attach(tptr, mptr);
idealtechlab 2:0b47f6b25cc4 76 }
idealtechlab 2:0b47f6b25cc4 77 }
okini3939 0:d3ab05ed8142 78
idealtechlab 4:ba939555ed35 79 // ----- IM920_util.cpp -----
idealtechlab 4:ba939555ed35 80 int setNode (int node);
idealtechlab 4:ba939555ed35 81 int getNode ();
okini3939 0:d3ab05ed8142 82 int setCh (int ch);
idealtechlab 4:ba939555ed35 83 int setPower (int pwr);
idealtechlab 4:ba939555ed35 84 int setSpeed (int spd);
okini3939 0:d3ab05ed8142 85 int getRssi ();
okini3939 0:d3ab05ed8142 86 int sleep ();
okini3939 0:d3ab05ed8142 87 int wakeup ();
idealtechlab 4:ba939555ed35 88 int test ();
okini3939 0:d3ab05ed8142 89
okini3939 1:81b2fd407327 90 // ----- IM920_cmd.cpp -----
okini3939 0:d3ab05ed8142 91 int sendCommand(const char * cmd, Response res = RES_NULL, int timeout = DEFAULT_WAIT_RESP_TIMEOUT);
okini3939 0:d3ab05ed8142 92 int sendData(const char * data, int len, int timeout = CFG_TIMEOUT);
okini3939 0:d3ab05ed8142 93
okini3939 0:d3ab05ed8142 94 private:
okini3939 0:d3ab05ed8142 95 RawSerial _im;
okini3939 0:d3ab05ed8142 96 DigitalIn *_busy;
okini3939 3:db269462ad1c 97 DigitalInOut *_reset;
okini3939 0:d3ab05ed8142 98 int _baud;
idealtechlab 2:0b47f6b25cc4 99 FunctionPointer _func;
okini3939 0:d3ab05ed8142 100
okini3939 0:d3ab05ed8142 101 struct STATE {
okini3939 0:d3ab05ed8142 102 int id, node, rssi;
okini3939 0:d3ab05ed8142 103
okini3939 0:d3ab05ed8142 104 time_t time;
okini3939 0:d3ab05ed8142 105 bool initialized;
okini3939 0:d3ab05ed8142 106 volatile Mode mode;
okini3939 0:d3ab05ed8142 107 volatile Status status;
okini3939 0:d3ab05ed8142 108 volatile bool ok, failure;
okini3939 0:d3ab05ed8142 109 volatile Response res;
okini3939 0:d3ab05ed8142 110 int n;
okini3939 0:d3ab05ed8142 111 char buf[CFG_BUF_SIZE];
okini3939 0:d3ab05ed8142 112
okini3939 0:d3ab05ed8142 113 CircBuffer<char> *data;
okini3939 0:d3ab05ed8142 114 volatile bool received;
okini3939 0:d3ab05ed8142 115 } _state;
okini3939 0:d3ab05ed8142 116
okini3939 1:81b2fd407327 117 // ----- IM920_util.cpp -----
okini3939 0:d3ab05ed8142 118 int x2i (char c);
okini3939 0:d3ab05ed8142 119 char i2x (int i);
okini3939 0:d3ab05ed8142 120
okini3939 1:81b2fd407327 121 // ----- IM920_msg.cpp -----
okini3939 0:d3ab05ed8142 122 void recvData (char c);
okini3939 0:d3ab05ed8142 123 int parseMessage ();
okini3939 0:d3ab05ed8142 124 void msgOk (const char*);
okini3939 0:d3ab05ed8142 125 void msgError (const char*);
okini3939 0:d3ab05ed8142 126 void msgConnect (const char*);
okini3939 0:d3ab05ed8142 127 void resRDID (const char *buf);
okini3939 0:d3ab05ed8142 128 void resRDNN (const char *buf);
okini3939 0:d3ab05ed8142 129 void resRDRS (const char *buf);
okini3939 0:d3ab05ed8142 130
okini3939 1:81b2fd407327 131 // ----- IM920_cmd.cpp -----
okini3939 0:d3ab05ed8142 132 void clearFlags ();
okini3939 0:d3ab05ed8142 133 int cmdENWR ();
okini3939 0:d3ab05ed8142 134 int cmdDSWR ();
okini3939 0:d3ab05ed8142 135 int cmdRDID ();
okini3939 0:d3ab05ed8142 136 int cmdSTNN (int n);
okini3939 0:d3ab05ed8142 137 int cmdRDNN ();
okini3939 0:d3ab05ed8142 138 int cmdSRID (int n);
okini3939 0:d3ab05ed8142 139 int cmdERID ();
okini3939 0:d3ab05ed8142 140 int cmdSTCH (int n);
okini3939 0:d3ab05ed8142 141 int cmdRDRS ();
okini3939 0:d3ab05ed8142 142 int cmdSTPO (int n);
okini3939 0:d3ab05ed8142 143 int cmdSTRT (int n);
okini3939 0:d3ab05ed8142 144 int cmdSBRT (int n);
okini3939 0:d3ab05ed8142 145 int cmdDSRX ();
okini3939 0:d3ab05ed8142 146 int cmdENRX ();
idealtechlab 4:ba939555ed35 147 int cmdEGRX ();
idealtechlab 4:ba939555ed35 148 int cmdDGRX ();
okini3939 0:d3ab05ed8142 149
okini3939 1:81b2fd407327 150 // ----- IM920_hal.cpp -----
okini3939 0:d3ab05ed8142 151 void setReset (bool flg);
okini3939 0:d3ab05ed8142 152 void isrUart ();
okini3939 0:d3ab05ed8142 153 int getUart ();
okini3939 0:d3ab05ed8142 154 void putUart (char c);
okini3939 0:d3ab05ed8142 155 int lockUart (int ms);
okini3939 0:d3ab05ed8142 156 void unlockUart ();
okini3939 0:d3ab05ed8142 157 void initUart (PinName busy, PinName reset, int baud);
okini3939 0:d3ab05ed8142 158 };
okini3939 0:d3ab05ed8142 159
okini3939 0:d3ab05ed8142 160 #endif
okini3939 3:db269462ad1c 161