920MHz wireless module 'FEP' Library

Dependents:   CompactController_2017 quadOmni_yanagi NHK2017_octopus NHK2017_octopus2 ... more

Committer:
UCHITAKE
Date:
Fri Sep 15 09:35:22 2017 +0900
Revision:
7:2d308c99c668
Parent:
5:9f7d2ba5e188
fix baud (115200)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
eil4nyqn 0:bf959a15b079 1 #include "FEP.h"
eil4nyqn 0:bf959a15b079 2
eil4nyqn 5:9f7d2ba5e188 3 FEP::FEP(PinName tx, PinName rx, uint8_t addr, int baud):serial(tx,rx)
eil4nyqn 5:9f7d2ba5e188 4 {
eil4nyqn 5:9f7d2ba5e188 5 FEP::serial.baud(baud);
eil4nyqn 5:9f7d2ba5e188 6 FEP::_address = addr;
eil4nyqn 5:9f7d2ba5e188 7 }
eil4nyqn 5:9f7d2ba5e188 8 FEP::~FEP()
eil4nyqn 5:9f7d2ba5e188 9 {
eil4nyqn 5:9f7d2ba5e188 10
eil4nyqn 0:bf959a15b079 11 }
eil4nyqn 5:9f7d2ba5e188 12
eil4nyqn 5:9f7d2ba5e188 13 int FEP::rxHandler(char *data)
eil4nyqn 5:9f7d2ba5e188 14 {
eil4nyqn 5:9f7d2ba5e188 15 int i,n;
eil4nyqn 5:9f7d2ba5e188 16 char buf[FEP_LINE_LEN];
eil4nyqn 5:9f7d2ba5e188 17 for(i=0,n=0; i <= FEP_LINE_LEN; i++) {
eil4nyqn 5:9f7d2ba5e188 18 while(FEP::serial.readable() == 0) {
eil4nyqn 5:9f7d2ba5e188 19 if(n > FEP_TIMEOUT_COUNT) return FEP_NO_RESPONSE;
eil4nyqn 5:9f7d2ba5e188 20 n++;
eil4nyqn 5:9f7d2ba5e188 21 }
eil4nyqn 5:9f7d2ba5e188 22 n=0;
eil4nyqn 5:9f7d2ba5e188 23 buf[i] = FEP::serial.getc();
eil4nyqn 5:9f7d2ba5e188 24 if(i >= 1 && (buf[i-1] == '\r' && buf[i] =='\n')) {
eil4nyqn 5:9f7d2ba5e188 25 for(n=0; n <= i; n++) {
eil4nyqn 5:9f7d2ba5e188 26 data[n] = buf[n];
eil4nyqn 5:9f7d2ba5e188 27 }
eil4nyqn 5:9f7d2ba5e188 28 return 0;
eil4nyqn 5:9f7d2ba5e188 29 }
eil4nyqn 5:9f7d2ba5e188 30 }
eil4nyqn 5:9f7d2ba5e188 31 return 1;
eil4nyqn 0:bf959a15b079 32 }
eil4nyqn 0:bf959a15b079 33
eil4nyqn 5:9f7d2ba5e188 34 uint8_t FEP::getResponse()
eil4nyqn 5:9f7d2ba5e188 35 {
eil4nyqn 5:9f7d2ba5e188 36 char buf[FEP_LINE_LEN];
eil4nyqn 5:9f7d2ba5e188 37 memset(buf, 0, sizeof(buf));
eil4nyqn 5:9f7d2ba5e188 38 if(FEP::rxHandler(buf) == FEP_NO_RESPONSE) {
eil4nyqn 5:9f7d2ba5e188 39 return FEP_NO_RESPONSE;
eil4nyqn 5:9f7d2ba5e188 40 }
eil4nyqn 5:9f7d2ba5e188 41 if (strlen(buf) > 4) {
eil4nyqn 5:9f7d2ba5e188 42 /* the packet in buffer is not response, continue to wait */
eil4nyqn 5:9f7d2ba5e188 43 return FEP::getResponse();
eil4nyqn 0:bf959a15b079 44 }
eil4nyqn 5:9f7d2ba5e188 45
eil4nyqn 5:9f7d2ba5e188 46 if (strcmp(buf, "P1\r\n") == 0) {
eil4nyqn 5:9f7d2ba5e188 47 return FEP::getResponse();
eil4nyqn 5:9f7d2ba5e188 48 } else {
eil4nyqn 5:9f7d2ba5e188 49 if (strcmp(buf, "P0\r\n") == 0) {
eil4nyqn 5:9f7d2ba5e188 50 return FEP_P0;
eil4nyqn 5:9f7d2ba5e188 51 } else if (strcmp(buf, "N0\r\n") == 0) {
eil4nyqn 5:9f7d2ba5e188 52 return FEP_N0;
eil4nyqn 5:9f7d2ba5e188 53 } else if (strcmp(buf, "N1\r\n") == 0) {
eil4nyqn 5:9f7d2ba5e188 54 return FEP_N1;
eil4nyqn 5:9f7d2ba5e188 55 } else if (strcmp(buf, "N2\r\n") == 0) {
eil4nyqn 5:9f7d2ba5e188 56 return FEP_N2;
eil4nyqn 5:9f7d2ba5e188 57 } else if (strcmp(buf, "N3\r\n") == 0) {
eil4nyqn 5:9f7d2ba5e188 58 return FEP_N3;
eil4nyqn 5:9f7d2ba5e188 59 } else {
eil4nyqn 5:9f7d2ba5e188 60 return FEP::getResponse();
eil4nyqn 5:9f7d2ba5e188 61 }
eil4nyqn 5:9f7d2ba5e188 62 }
eil4nyqn 5:9f7d2ba5e188 63 }
eil4nyqn 5:9f7d2ba5e188 64
eil4nyqn 5:9f7d2ba5e188 65 uint8_t FEP::puts(char *data, uint8_t len)
eil4nyqn 5:9f7d2ba5e188 66 {
eil4nyqn 5:9f7d2ba5e188 67 uint8_t response;
eil4nyqn 5:9f7d2ba5e188 68
eil4nyqn 5:9f7d2ba5e188 69 FEP::serial.printf("@TXT%03uG",FEP::_address);
eil4nyqn 5:9f7d2ba5e188 70 for(int i = 0; i<len; i++) {
eil4nyqn 5:9f7d2ba5e188 71 FEP::serial.printf("%02x",data[i]);
eil4nyqn 5:9f7d2ba5e188 72 }
eil4nyqn 5:9f7d2ba5e188 73 FEP::serial.printf("H\r\n");
eil4nyqn 5:9f7d2ba5e188 74 response = FEP::getResponse();
eil4nyqn 0:bf959a15b079 75 return response;
eil4nyqn 0:bf959a15b079 76 }
eil4nyqn 0:bf959a15b079 77
eil4nyqn 5:9f7d2ba5e188 78 uint8_t FEP::putbin(char *ary, size_t len)
eil4nyqn 5:9f7d2ba5e188 79 {
eil4nyqn 5:9f7d2ba5e188 80 uint8_t response, j;
eil4nyqn 0:bf959a15b079 81
eil4nyqn 5:9f7d2ba5e188 82 FEP::serial.printf("@TBN%03d%03d", FEP::_address, len);
eil4nyqn 5:9f7d2ba5e188 83 for (j = 0; j < len; j++) {
eil4nyqn 5:9f7d2ba5e188 84 FEP::serial.putc(ary[j]);
eil4nyqn 0:bf959a15b079 85 }
eil4nyqn 5:9f7d2ba5e188 86 FEP::serial.putc('\r');
eil4nyqn 5:9f7d2ba5e188 87 FEP::serial.putc('\n');
eil4nyqn 0:bf959a15b079 88
eil4nyqn 5:9f7d2ba5e188 89 response = FEP::getResponse();
eil4nyqn 5:9f7d2ba5e188 90 response = FEP::getResponse();
eil4nyqn 5:9f7d2ba5e188 91 return response;
eil4nyqn 0:bf959a15b079 92 }
eil4nyqn 0:bf959a15b079 93
eil4nyqn 5:9f7d2ba5e188 94 void FEP::hex2dec(char *data,char *str,uint8_t len)
eil4nyqn 0:bf959a15b079 95 {
eil4nyqn 4:7259654e8082 96 char *endptr;
eil4nyqn 4:7259654e8082 97 char buf[2];
eil4nyqn 5:9f7d2ba5e188 98 for(int i = 0; i < len*2; i+=2) {
eil4nyqn 4:7259654e8082 99 buf[0] = data[1+i];
eil4nyqn 4:7259654e8082 100 buf[1] = data[1+i+1];
eil4nyqn 4:7259654e8082 101 str[i/2] = (char)strtol(buf, &endptr, 16);
eil4nyqn 4:7259654e8082 102 }
eil4nyqn 4:7259654e8082 103 }
eil4nyqn 5:9f7d2ba5e188 104
eil4nyqn 5:9f7d2ba5e188 105 int FEP::ctoi(char c)
eil4nyqn 5:9f7d2ba5e188 106 {
eil4nyqn 5:9f7d2ba5e188 107 if('0' <= c && c <= '9') return (c-'0');
eil4nyqn 5:9f7d2ba5e188 108 else return -1;
eil4nyqn 5:9f7d2ba5e188 109 }
eil4nyqn 5:9f7d2ba5e188 110
eil4nyqn 5:9f7d2ba5e188 111 uint8_t FEP::gets(char *data, uint8_t len)
eil4nyqn 5:9f7d2ba5e188 112 {
eil4nyqn 5:9f7d2ba5e188 113 char buf[FEP_LINE_LEN], sub[FEP_LINE_LEN];
eil4nyqn 5:9f7d2ba5e188 114 uint8_t temp;
eil4nyqn 5:9f7d2ba5e188 115 uint16_t i;
eil4nyqn 5:9f7d2ba5e188 116 uint8_t data_mode;
eil4nyqn 5:9f7d2ba5e188 117 size_t data_len;
eil4nyqn 5:9f7d2ba5e188 118 memset(buf, 0, sizeof(buf));
eil4nyqn 5:9f7d2ba5e188 119 temp = FEP::rxHandler(buf);
eil4nyqn 5:9f7d2ba5e188 120 if(temp == FEP_NO_RESPONSE) {
eil4nyqn 5:9f7d2ba5e188 121 return FEP_NO_RESPONSE;
eil4nyqn 5:9f7d2ba5e188 122 } else if(temp == 1) {
eil4nyqn 5:9f7d2ba5e188 123 return FEP_DT_ERR;
eil4nyqn 5:9f7d2ba5e188 124 }
eil4nyqn 5:9f7d2ba5e188 125 if (strlen(buf) >= 3) {
eil4nyqn 5:9f7d2ba5e188 126 /* get command part */
eil4nyqn 5:9f7d2ba5e188 127 strncpy(sub, buf, 3);
eil4nyqn 5:9f7d2ba5e188 128 sub[3] = '\0';
eil4nyqn 5:9f7d2ba5e188 129 if (!strcmp(sub, "RXT")) {
eil4nyqn 5:9f7d2ba5e188 130 /* Subtract string from a part before the intensity */
eil4nyqn 5:9f7d2ba5e188 131 strncpy(sub, buf, strlen(buf) - 3 - 2);
eil4nyqn 5:9f7d2ba5e188 132 sub[strlen(buf) - 3 - 2 + 1] = '\0';
eil4nyqn 5:9f7d2ba5e188 133
eil4nyqn 5:9f7d2ba5e188 134 /* Get transmitter's address */
eil4nyqn 5:9f7d2ba5e188 135 temp = 0;
eil4nyqn 5:9f7d2ba5e188 136 temp += FEP::ctoi(sub[3])*100;
eil4nyqn 5:9f7d2ba5e188 137 temp += FEP::ctoi(sub[4])*10;
eil4nyqn 5:9f7d2ba5e188 138 temp += FEP::ctoi(sub[5])*1;
eil4nyqn 5:9f7d2ba5e188 139 FEP::_transmitterAddr = temp;
eil4nyqn 5:9f7d2ba5e188 140 /* Store message to str */
eil4nyqn 5:9f7d2ba5e188 141 data_len = strlen(buf) - 6 - 3 - 2;
eil4nyqn 5:9f7d2ba5e188 142 if (data_len > len) {
eil4nyqn 5:9f7d2ba5e188 143 /* received data is too long! */
eil4nyqn 5:9f7d2ba5e188 144 return FEP_DT_ERR;
eil4nyqn 5:9f7d2ba5e188 145 }
eil4nyqn 5:9f7d2ba5e188 146 strncpy(data, buf + 6, data_len);
eil4nyqn 5:9f7d2ba5e188 147
eil4nyqn 5:9f7d2ba5e188 148 /* Get intensity part of string */
eil4nyqn 5:9f7d2ba5e188 149 strncpy(sub, buf + strlen(buf) - 3 - 2, 3);
eil4nyqn 5:9f7d2ba5e188 150 sub[3] = '\0';
eil4nyqn 5:9f7d2ba5e188 151 data_mode = FEP_DT_STR;
eil4nyqn 5:9f7d2ba5e188 152 } else if (!strcmp(sub, "RBN")) {
eil4nyqn 5:9f7d2ba5e188 153 /* addr and length part */
eil4nyqn 5:9f7d2ba5e188 154 strncpy(sub, buf + 3, 6);
eil4nyqn 5:9f7d2ba5e188 155 sub[6] = '\0';
eil4nyqn 5:9f7d2ba5e188 156
eil4nyqn 5:9f7d2ba5e188 157 /* Get transmitter's address & data length */
eil4nyqn 5:9f7d2ba5e188 158 temp = 0;
eil4nyqn 5:9f7d2ba5e188 159 temp += FEP::ctoi(sub[0])*100;
eil4nyqn 5:9f7d2ba5e188 160 temp += FEP::ctoi(sub[1])*10;
eil4nyqn 5:9f7d2ba5e188 161 temp += FEP::ctoi(sub[2])*1;
eil4nyqn 5:9f7d2ba5e188 162 FEP::_transmitterAddr = temp;
eil4nyqn 5:9f7d2ba5e188 163 temp = 0;
eil4nyqn 5:9f7d2ba5e188 164 temp += FEP::ctoi(sub[3])*100;
eil4nyqn 5:9f7d2ba5e188 165 temp += FEP::ctoi(sub[4])*10;
eil4nyqn 5:9f7d2ba5e188 166 temp += FEP::ctoi(sub[5])*1;
eil4nyqn 5:9f7d2ba5e188 167 data_len = temp;
eil4nyqn 5:9f7d2ba5e188 168 /* Store binary data to array */
eil4nyqn 5:9f7d2ba5e188 169 if (data_len > len) {
eil4nyqn 5:9f7d2ba5e188 170 /* received data is too long! */
eil4nyqn 5:9f7d2ba5e188 171 return FEP_DT_ERR;
eil4nyqn 5:9f7d2ba5e188 172 }
eil4nyqn 5:9f7d2ba5e188 173 /* memcpy(str, buf + 9, data_len); */
eil4nyqn 5:9f7d2ba5e188 174 for (i = 0; i < data_len; i++) {
eil4nyqn 5:9f7d2ba5e188 175 data[i] = buf[i + 9];
eil4nyqn 5:9f7d2ba5e188 176 }
eil4nyqn 5:9f7d2ba5e188 177
eil4nyqn 5:9f7d2ba5e188 178 /* Get intensity part of string */
eil4nyqn 5:9f7d2ba5e188 179 strncpy(sub, buf + 9 + data_len, 3);
eil4nyqn 5:9f7d2ba5e188 180 sub[3] = '\0';
eil4nyqn 5:9f7d2ba5e188 181
eil4nyqn 5:9f7d2ba5e188 182 data_mode = FEP_DT_BIN;
eil4nyqn 5:9f7d2ba5e188 183 }
eil4nyqn 5:9f7d2ba5e188 184
eil4nyqn 5:9f7d2ba5e188 185 temp = 0;
eil4nyqn 5:9f7d2ba5e188 186 temp += FEP::ctoi(sub[0])*100;
eil4nyqn 5:9f7d2ba5e188 187 temp += FEP::ctoi(sub[1])*10;
eil4nyqn 5:9f7d2ba5e188 188 temp += FEP::ctoi(sub[2])*1;
eil4nyqn 5:9f7d2ba5e188 189 FEP::_intensity = temp;
eil4nyqn 5:9f7d2ba5e188 190 }
eil4nyqn 5:9f7d2ba5e188 191
eil4nyqn 5:9f7d2ba5e188 192 return data_mode;
eil4nyqn 5:9f7d2ba5e188 193 }
eil4nyqn 5:9f7d2ba5e188 194
eil4nyqn 5:9f7d2ba5e188 195 uint8_t FEP::getTransmitterAddr()
eil4nyqn 5:9f7d2ba5e188 196 {
eil4nyqn 5:9f7d2ba5e188 197 return FEP::_transmitterAddr;
eil4nyqn 5:9f7d2ba5e188 198 }
eil4nyqn 5:9f7d2ba5e188 199
eil4nyqn 5:9f7d2ba5e188 200 uint8_t FEP::getIntensity()
eil4nyqn 5:9f7d2ba5e188 201 {
eil4nyqn 5:9f7d2ba5e188 202 return FEP::_intensity;
eil4nyqn 5:9f7d2ba5e188 203 }
eil4nyqn 5:9f7d2ba5e188 204
eil4nyqn 5:9f7d2ba5e188 205 uint8_t FEP::read(char *data, uint8_t len)
eil4nyqn 5:9f7d2ba5e188 206 {
eil4nyqn 5:9f7d2ba5e188 207 char str[FEP_LINE_LEN];
eil4nyqn 5:9f7d2ba5e188 208 uint8_t temp;
eil4nyqn 5:9f7d2ba5e188 209 temp = FEP::gets(str, (len*2+2));
eil4nyqn 5:9f7d2ba5e188 210 if(temp == FEP_DT_STR) {
eil4nyqn 5:9f7d2ba5e188 211 if(str[0] == 'G' && str[(len*2+2)-1] == 'H') {
eil4nyqn 5:9f7d2ba5e188 212 FEP::hex2dec(str,data,len);
eil4nyqn 5:9f7d2ba5e188 213 return 0;
eil4nyqn 5:9f7d2ba5e188 214 } else {
eil4nyqn 5:9f7d2ba5e188 215 return 1;
eil4nyqn 5:9f7d2ba5e188 216 }
eil4nyqn 5:9f7d2ba5e188 217 } else if(temp == FEP_DT_BIN) {
eil4nyqn 5:9f7d2ba5e188 218 return FEP_DT_BIN;
eil4nyqn 5:9f7d2ba5e188 219 } else if(temp == FEP_DT_ERR) {
eil4nyqn 5:9f7d2ba5e188 220 return FEP_DT_ERR;
eil4nyqn 5:9f7d2ba5e188 221 } else {
eil4nyqn 5:9f7d2ba5e188 222 return FEP_NO_RESPONSE;
eil4nyqn 5:9f7d2ba5e188 223 }
eil4nyqn 5:9f7d2ba5e188 224 }
eil4nyqn 5:9f7d2ba5e188 225
eil4nyqn 5:9f7d2ba5e188 226 uint8_t FEP::reset()
eil4nyqn 5:9f7d2ba5e188 227 {
eil4nyqn 5:9f7d2ba5e188 228 uint8_t response;
eil4nyqn 5:9f7d2ba5e188 229 FEP::serial.printf("@RST\r\n");
eil4nyqn 5:9f7d2ba5e188 230 response = FEP::getResponse();
eil4nyqn 5:9f7d2ba5e188 231 while(response != FEP_P0) {
eil4nyqn 5:9f7d2ba5e188 232 response = FEP::getResponse();
eil4nyqn 5:9f7d2ba5e188 233 }
eil4nyqn 5:9f7d2ba5e188 234 return response;
eil4nyqn 5:9f7d2ba5e188 235 }