920MHz wireless module 'FEP' Library
Dependents: CompactController_2017 quadOmni_yanagi NHK2017_octopus NHK2017_octopus2 ... more
FEP.cpp
- Committer:
- UCHITAKE
- Date:
- 2017-09-15
- Revision:
- 7:2d308c99c668
- Parent:
- 5:9f7d2ba5e188
File content as of revision 7:2d308c99c668:
#include "FEP.h" FEP::FEP(PinName tx, PinName rx, uint8_t addr, int baud):serial(tx,rx) { FEP::serial.baud(baud); FEP::_address = addr; } FEP::~FEP() { } int FEP::rxHandler(char *data) { int i,n; char buf[FEP_LINE_LEN]; for(i=0,n=0; i <= FEP_LINE_LEN; i++) { while(FEP::serial.readable() == 0) { if(n > FEP_TIMEOUT_COUNT) return FEP_NO_RESPONSE; n++; } n=0; buf[i] = FEP::serial.getc(); if(i >= 1 && (buf[i-1] == '\r' && buf[i] =='\n')) { for(n=0; n <= i; n++) { data[n] = buf[n]; } return 0; } } return 1; } uint8_t FEP::getResponse() { char buf[FEP_LINE_LEN]; memset(buf, 0, sizeof(buf)); if(FEP::rxHandler(buf) == FEP_NO_RESPONSE) { return FEP_NO_RESPONSE; } if (strlen(buf) > 4) { /* the packet in buffer is not response, continue to wait */ return FEP::getResponse(); } if (strcmp(buf, "P1\r\n") == 0) { return FEP::getResponse(); } else { if (strcmp(buf, "P0\r\n") == 0) { return FEP_P0; } else if (strcmp(buf, "N0\r\n") == 0) { return FEP_N0; } else if (strcmp(buf, "N1\r\n") == 0) { return FEP_N1; } else if (strcmp(buf, "N2\r\n") == 0) { return FEP_N2; } else if (strcmp(buf, "N3\r\n") == 0) { return FEP_N3; } else { return FEP::getResponse(); } } } uint8_t FEP::puts(char *data, uint8_t len) { uint8_t response; FEP::serial.printf("@TXT%03uG",FEP::_address); for(int i = 0; i<len; i++) { FEP::serial.printf("%02x",data[i]); } FEP::serial.printf("H\r\n"); response = FEP::getResponse(); return response; } uint8_t FEP::putbin(char *ary, size_t len) { uint8_t response, j; FEP::serial.printf("@TBN%03d%03d", FEP::_address, len); for (j = 0; j < len; j++) { FEP::serial.putc(ary[j]); } FEP::serial.putc('\r'); FEP::serial.putc('\n'); response = FEP::getResponse(); response = FEP::getResponse(); return response; } void FEP::hex2dec(char *data,char *str,uint8_t len) { char *endptr; char buf[2]; for(int i = 0; i < len*2; i+=2) { buf[0] = data[1+i]; buf[1] = data[1+i+1]; str[i/2] = (char)strtol(buf, &endptr, 16); } } int FEP::ctoi(char c) { if('0' <= c && c <= '9') return (c-'0'); else return -1; } uint8_t FEP::gets(char *data, uint8_t len) { char buf[FEP_LINE_LEN], sub[FEP_LINE_LEN]; uint8_t temp; uint16_t i; uint8_t data_mode; size_t data_len; memset(buf, 0, sizeof(buf)); temp = FEP::rxHandler(buf); if(temp == FEP_NO_RESPONSE) { return FEP_NO_RESPONSE; } else if(temp == 1) { return FEP_DT_ERR; } if (strlen(buf) >= 3) { /* get command part */ strncpy(sub, buf, 3); sub[3] = '\0'; if (!strcmp(sub, "RXT")) { /* Subtract string from a part before the intensity */ strncpy(sub, buf, strlen(buf) - 3 - 2); sub[strlen(buf) - 3 - 2 + 1] = '\0'; /* Get transmitter's address */ temp = 0; temp += FEP::ctoi(sub[3])*100; temp += FEP::ctoi(sub[4])*10; temp += FEP::ctoi(sub[5])*1; FEP::_transmitterAddr = temp; /* Store message to str */ data_len = strlen(buf) - 6 - 3 - 2; if (data_len > len) { /* received data is too long! */ return FEP_DT_ERR; } strncpy(data, buf + 6, data_len); /* Get intensity part of string */ strncpy(sub, buf + strlen(buf) - 3 - 2, 3); sub[3] = '\0'; data_mode = FEP_DT_STR; } else if (!strcmp(sub, "RBN")) { /* addr and length part */ strncpy(sub, buf + 3, 6); sub[6] = '\0'; /* Get transmitter's address & data length */ temp = 0; temp += FEP::ctoi(sub[0])*100; temp += FEP::ctoi(sub[1])*10; temp += FEP::ctoi(sub[2])*1; FEP::_transmitterAddr = temp; temp = 0; temp += FEP::ctoi(sub[3])*100; temp += FEP::ctoi(sub[4])*10; temp += FEP::ctoi(sub[5])*1; data_len = temp; /* Store binary data to array */ if (data_len > len) { /* received data is too long! */ return FEP_DT_ERR; } /* memcpy(str, buf + 9, data_len); */ for (i = 0; i < data_len; i++) { data[i] = buf[i + 9]; } /* Get intensity part of string */ strncpy(sub, buf + 9 + data_len, 3); sub[3] = '\0'; data_mode = FEP_DT_BIN; } temp = 0; temp += FEP::ctoi(sub[0])*100; temp += FEP::ctoi(sub[1])*10; temp += FEP::ctoi(sub[2])*1; FEP::_intensity = temp; } return data_mode; } uint8_t FEP::getTransmitterAddr() { return FEP::_transmitterAddr; } uint8_t FEP::getIntensity() { return FEP::_intensity; } uint8_t FEP::read(char *data, uint8_t len) { char str[FEP_LINE_LEN]; uint8_t temp; temp = FEP::gets(str, (len*2+2)); if(temp == FEP_DT_STR) { if(str[0] == 'G' && str[(len*2+2)-1] == 'H') { FEP::hex2dec(str,data,len); return 0; } else { return 1; } } else if(temp == FEP_DT_BIN) { return FEP_DT_BIN; } else if(temp == FEP_DT_ERR) { return FEP_DT_ERR; } else { return FEP_NO_RESPONSE; } } uint8_t FEP::reset() { uint8_t response; FEP::serial.printf("@RST\r\n"); response = FEP::getResponse(); while(response != FEP_P0) { response = FEP::getResponse(); } return response; }