NEC Near Field Communication RF module library for mbed H001-000003-001 (950MHz), H001-000013-001 (920MHz), TY24FM-E2024 (2.4GHz)
Dependents: NECnfc_sample Drone_air Drone_ground
NEC Near Field Communication RF module library
NEC製の近距離無線モジュール用のライブラリです。
NECnfc_util.cpp@7:9c963cb53ef7, 2016-04-07 (annotated)
- Committer:
- okini3939
- Date:
- Thu Apr 07 00:56:50 2016 +0000
- Revision:
- 7:9c963cb53ef7
- Parent:
- 4:07e752ff8dce
bug fix;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
okini3939 | 4:07e752ff8dce | 1 | #include "NECnfc.h" |
okini3939 | 4:07e752ff8dce | 2 | |
okini3939 | 4:07e752ff8dce | 3 | int NECnfc::setRfConfig (enum NECPWR power, int ch, NECBAUD baud) { |
okini3939 | 4:07e752ff8dce | 4 | char cmd[3]; |
okini3939 | 4:07e752ff8dce | 5 | |
okini3939 | 4:07e752ff8dce | 6 | switch (_type) { |
okini3939 | 4:07e752ff8dce | 7 | case TYPE_2400MHz: |
okini3939 | 4:07e752ff8dce | 8 | if (ch < 0 || ch > 15) return -1; |
okini3939 | 4:07e752ff8dce | 9 | power = (enum NECPWR)(power >= PWR_HIGH ? 0x0f : 0x00); |
okini3939 | 4:07e752ff8dce | 10 | case TYPE_950MHz: |
okini3939 | 4:07e752ff8dce | 11 | if (power == PWR_LOW && (ch < 1 || ch > 33)) return -1; |
okini3939 | 4:07e752ff8dce | 12 | if (power >= PWR_MID && (ch < 17 || ch > 31)) return -1; |
okini3939 | 4:07e752ff8dce | 13 | break; |
okini3939 | 4:07e752ff8dce | 14 | case TYPE_920MHz: |
okini3939 | 4:07e752ff8dce | 15 | if (power <= PWR_MID && (ch < 24 || ch > 38)) return -1; |
okini3939 | 4:07e752ff8dce | 16 | if (power >= PWR_HIGH && (ch < 24 || ch > 37 || ch == 32)) return -1; |
okini3939 | 4:07e752ff8dce | 17 | break; |
okini3939 | 4:07e752ff8dce | 18 | } |
okini3939 | 4:07e752ff8dce | 19 | |
okini3939 | 4:07e752ff8dce | 20 | if (_type == TYPE_2400MHz) { |
okini3939 | 4:07e752ff8dce | 21 | cmd[0] = ch; |
okini3939 | 4:07e752ff8dce | 22 | if (send(NECMSG_WRITE_CHANNEL, NEC_DUMMYID, cmd, 1)) { |
okini3939 | 4:07e752ff8dce | 23 | return -1; |
okini3939 | 4:07e752ff8dce | 24 | } |
okini3939 | 4:07e752ff8dce | 25 | cmd[0] = power; |
okini3939 | 4:07e752ff8dce | 26 | if (send(NECMSG_WRITE_RFCONF, NEC_DUMMYID, cmd, 1)) { |
okini3939 | 4:07e752ff8dce | 27 | return -1; |
okini3939 | 4:07e752ff8dce | 28 | } |
okini3939 | 4:07e752ff8dce | 29 | } else { |
okini3939 | 4:07e752ff8dce | 30 | cmd[0] = power; |
okini3939 | 4:07e752ff8dce | 31 | cmd[1] = ch; |
okini3939 | 4:07e752ff8dce | 32 | cmd[2] = baud; |
okini3939 | 4:07e752ff8dce | 33 | if (send(NECMSG_WRITE_RFCONF, NEC_DUMMYID, cmd, 3)) { |
okini3939 | 4:07e752ff8dce | 34 | return -1; |
okini3939 | 4:07e752ff8dce | 35 | } |
okini3939 | 4:07e752ff8dce | 36 | } |
okini3939 | 4:07e752ff8dce | 37 | return 0; |
okini3939 | 4:07e752ff8dce | 38 | } |
okini3939 | 4:07e752ff8dce | 39 | |
okini3939 | 4:07e752ff8dce | 40 | unsigned int NECnfc::getId () { |
okini3939 | 4:07e752ff8dce | 41 | |
okini3939 | 4:07e752ff8dce | 42 | if (send(NECMSG_READ_DEFAULT, NEC_DUMMYID, NULL, 0)) { |
okini3939 | 4:07e752ff8dce | 43 | return 0; |
okini3939 | 4:07e752ff8dce | 44 | } |
okini3939 | 4:07e752ff8dce | 45 | if (_type == TYPE_2400MHz) { |
okini3939 | 4:07e752ff8dce | 46 | _id = (_rxmsg.parameter[23] << 24) | (_rxmsg.parameter[24] << 16) | (_rxmsg.parameter[25] << 8) | _rxmsg.parameter[26]; |
okini3939 | 4:07e752ff8dce | 47 | } else { |
okini3939 | 4:07e752ff8dce | 48 | _id = (_rxmsg.parameter[21] << 24) | (_rxmsg.parameter[22] << 16) | (_rxmsg.parameter[23] << 8) | _rxmsg.parameter[24]; |
okini3939 | 4:07e752ff8dce | 49 | } |
okini3939 | 4:07e752ff8dce | 50 | return _id; |
okini3939 | 4:07e752ff8dce | 51 | } |
okini3939 | 4:07e752ff8dce | 52 | |
okini3939 | 4:07e752ff8dce | 53 | unsigned int NECnfc::getSystemId () { |
okini3939 | 4:07e752ff8dce | 54 | unsigned int id; |
okini3939 | 4:07e752ff8dce | 55 | |
okini3939 | 4:07e752ff8dce | 56 | if (send(NECMSG_READ_DEFAULT, NEC_DUMMYID, NULL, 0)) { |
okini3939 | 4:07e752ff8dce | 57 | return 0; |
okini3939 | 4:07e752ff8dce | 58 | } |
okini3939 | 4:07e752ff8dce | 59 | |
okini3939 | 4:07e752ff8dce | 60 | if (_type == TYPE_2400MHz) { |
okini3939 | 4:07e752ff8dce | 61 | id = (_rxmsg.parameter[19] << 24) | (_rxmsg.parameter[20] << 16) | (_rxmsg.parameter[21] << 8) | _rxmsg.parameter[22]; |
okini3939 | 4:07e752ff8dce | 62 | } else { |
okini3939 | 4:07e752ff8dce | 63 | id = (_rxmsg.parameter[17] << 24) | (_rxmsg.parameter[18] << 16) | (_rxmsg.parameter[19] << 8) | _rxmsg.parameter[20]; |
okini3939 | 4:07e752ff8dce | 64 | } |
okini3939 | 4:07e752ff8dce | 65 | return id; |
okini3939 | 4:07e752ff8dce | 66 | } |
okini3939 | 4:07e752ff8dce | 67 | |
okini3939 | 4:07e752ff8dce | 68 | int NECnfc::setSystemId (unsigned int id) { |
okini3939 | 4:07e752ff8dce | 69 | int len; |
okini3939 | 4:07e752ff8dce | 70 | char buf[24]; |
okini3939 | 4:07e752ff8dce | 71 | |
okini3939 | 4:07e752ff8dce | 72 | if (send(NECMSG_READ_DEFAULT, NEC_DUMMYID, NULL, 0)) { |
okini3939 | 4:07e752ff8dce | 73 | return 0; |
okini3939 | 4:07e752ff8dce | 74 | } |
okini3939 | 4:07e752ff8dce | 75 | |
okini3939 | 4:07e752ff8dce | 76 | if (_type == TYPE_2400MHz) { |
okini3939 | 4:07e752ff8dce | 77 | len = 23; |
okini3939 | 4:07e752ff8dce | 78 | memcpy(buf, _rxmsg.parameter, len); |
okini3939 | 4:07e752ff8dce | 79 | buf[19] = (id >> 24) & 0xff; |
okini3939 | 4:07e752ff8dce | 80 | buf[20] = (id >> 16) & 0xff; |
okini3939 | 4:07e752ff8dce | 81 | buf[21] = (id >> 8) & 0xff; |
okini3939 | 4:07e752ff8dce | 82 | buf[22] = id & 0xff; |
okini3939 | 4:07e752ff8dce | 83 | } else { |
okini3939 | 4:07e752ff8dce | 84 | len = 21; |
okini3939 | 4:07e752ff8dce | 85 | memcpy(buf, _rxmsg.parameter, len); |
okini3939 | 4:07e752ff8dce | 86 | buf[17] = (id >> 24) & 0xff; |
okini3939 | 4:07e752ff8dce | 87 | buf[18] = (id >> 16) & 0xff; |
okini3939 | 4:07e752ff8dce | 88 | buf[19] = (id >> 8) & 0xff; |
okini3939 | 4:07e752ff8dce | 89 | buf[20] = id & 0xff; |
okini3939 | 4:07e752ff8dce | 90 | } |
okini3939 | 4:07e752ff8dce | 91 | if (send(NECMSG_WRITE_DEFAULT, NEC_DUMMYID, buf, len)) { |
okini3939 | 4:07e752ff8dce | 92 | return -1; |
okini3939 | 4:07e752ff8dce | 93 | } |
okini3939 | 4:07e752ff8dce | 94 | return 0; |
okini3939 | 4:07e752ff8dce | 95 | } |
okini3939 | 4:07e752ff8dce | 96 | |
okini3939 | 4:07e752ff8dce | 97 | int NECnfc::setSleepMode (int sleep_time, int rev_time) { |
okini3939 | 4:07e752ff8dce | 98 | int len; |
okini3939 | 4:07e752ff8dce | 99 | char buf[24]; |
okini3939 | 4:07e752ff8dce | 100 | |
okini3939 | 4:07e752ff8dce | 101 | if (send(NECMSG_READ_CONFIG, NEC_DUMMYID, NULL, 0)) { |
okini3939 | 4:07e752ff8dce | 102 | return 0; |
okini3939 | 4:07e752ff8dce | 103 | } |
okini3939 | 4:07e752ff8dce | 104 | |
okini3939 | 4:07e752ff8dce | 105 | if (_type == TYPE_2400MHz) { |
okini3939 | 4:07e752ff8dce | 106 | len = 22; |
okini3939 | 4:07e752ff8dce | 107 | memcpy(buf, _rxmsg.parameter, len); |
okini3939 | 4:07e752ff8dce | 108 | buf[12] = (rev_time >> 8) & 0xff; |
okini3939 | 4:07e752ff8dce | 109 | buf[13] = rev_time & 0xff; |
okini3939 | 4:07e752ff8dce | 110 | buf[14] = sleep_time; |
okini3939 | 4:07e752ff8dce | 111 | } else { |
okini3939 | 4:07e752ff8dce | 112 | len = 21; |
okini3939 | 4:07e752ff8dce | 113 | memcpy(buf, _rxmsg.parameter, len); |
okini3939 | 4:07e752ff8dce | 114 | buf[6] = sleep_time; |
okini3939 | 4:07e752ff8dce | 115 | buf[7] = (rev_time >> 8) & 0xff; |
okini3939 | 4:07e752ff8dce | 116 | buf[8] = rev_time & 0xff; |
okini3939 | 4:07e752ff8dce | 117 | } |
okini3939 | 4:07e752ff8dce | 118 | if (send(NECMSG_WRITE_CONFIG, NEC_DUMMYID, buf, len)) { |
okini3939 | 4:07e752ff8dce | 119 | return -1; |
okini3939 | 4:07e752ff8dce | 120 | } |
okini3939 | 4:07e752ff8dce | 121 | return 0; |
okini3939 | 4:07e752ff8dce | 122 | } |
okini3939 | 4:07e752ff8dce | 123 | |
okini3939 | 4:07e752ff8dce | 124 | int NECnfc::getRssi () { |
okini3939 | 4:07e752ff8dce | 125 | |
okini3939 | 4:07e752ff8dce | 126 | if (send(NECMSG_READ_RSSI, NEC_DUMMYID, NULL, 0)) { |
okini3939 | 4:07e752ff8dce | 127 | return 0; |
okini3939 | 4:07e752ff8dce | 128 | } |
okini3939 | 4:07e752ff8dce | 129 | return _rssi; |
okini3939 | 4:07e752ff8dce | 130 | } |
okini3939 | 4:07e752ff8dce | 131 | |
okini3939 | 4:07e752ff8dce | 132 | int NECnfc::search () { |
okini3939 | 4:07e752ff8dce | 133 | char cmd[1] = {1}; |
okini3939 | 4:07e752ff8dce | 134 | Timer t; |
okini3939 | 4:07e752ff8dce | 135 | |
okini3939 | 4:07e752ff8dce | 136 | DBG("search\r\n"); |
okini3939 | 4:07e752ff8dce | 137 | t.start(); |
okini3939 | 4:07e752ff8dce | 138 | if (send(NECMSG_SEARCH, NEC_DUMMYID, cmd, 1)) { |
okini3939 | 4:07e752ff8dce | 139 | return -1; |
okini3939 | 4:07e752ff8dce | 140 | } |
okini3939 | 4:07e752ff8dce | 141 | for (;;) { |
okini3939 | 4:07e752ff8dce | 142 | if (_ack && _rxmsg.msgid == NECMSG_ACK) { |
okini3939 | 4:07e752ff8dce | 143 | DBG("found %08x", ntohl(_rxmsg.srcid)); |
okini3939 | 4:07e752ff8dce | 144 | _ack = 0; |
okini3939 | 4:07e752ff8dce | 145 | } |
okini3939 | 4:07e752ff8dce | 146 | if (_resend) break; |
okini3939 | 4:07e752ff8dce | 147 | if (t.read() > NEC_TIMEOUT) { |
okini3939 | 4:07e752ff8dce | 148 | DBG("timeout\r\n"); |
okini3939 | 4:07e752ff8dce | 149 | t.stop(); |
okini3939 | 4:07e752ff8dce | 150 | return -1; |
okini3939 | 4:07e752ff8dce | 151 | } |
okini3939 | 4:07e752ff8dce | 152 | } |
okini3939 | 4:07e752ff8dce | 153 | t.stop(); |
okini3939 | 4:07e752ff8dce | 154 | DBG(" ack %d, noack %d, resend %d\r\n", _ack, _noack, _resend); |
okini3939 | 4:07e752ff8dce | 155 | return 0; |
okini3939 | 4:07e752ff8dce | 156 | } |