FEP RX library

Dependents:   2022_FEPRX-PS4 2022A_FEPRX_TokiPS4 2022NHK_A_ashimawari 2022NHK_A_main

Committer:
piroro4560
Date:
Thu Oct 06 08:09:12 2022 +0000
Revision:
2:39eb865e21e1
Parent:
1:8979e85cceb1
erase count_timeout

Who changed what in which revision?

UserRevisionLine numberNew contents of line
piroro4560 0:062f14a26406 1 /**
piroro4560 0:062f14a26406 2 * @file FEP_RX22.cpp
piroro4560 1:8979e85cceb1 3 * @brief FEP受信用ライブラリ
piroro4560 0:062f14a26406 4 * @author 安澤瑠
piroro4560 2:39eb865e21e1 5 * @date 22/10/6
piroro4560 0:062f14a26406 6 */
piroro4560 0:062f14a26406 7 #include "FEP_RX22.h"
piroro4560 0:062f14a26406 8
piroro4560 0:062f14a26406 9 FEP_RX22::FEP_RX22(PinName tx, PinName rx, uint8_t addr_, int baud) :
piroro4560 0:062f14a26406 10 RawSerial(tx, rx, baud)
piroro4560 0:062f14a26406 11 {
piroro4560 0:062f14a26406 12 addr = addr_;
piroro4560 0:062f14a26406 13 timeout = TIMEOUT_COUNT;
piroro4560 0:062f14a26406 14 bufindex = 0;
piroro4560 0:062f14a26406 15 }
piroro4560 0:062f14a26406 16
piroro4560 0:062f14a26406 17 void FEP_RX22::StartReceive()
piroro4560 0:062f14a26406 18 {
piroro4560 0:062f14a26406 19 attach(callback(this, &FEP_RX22::ReceiveBytes));
piroro4560 0:062f14a26406 20 timeoutTimer.attach(callback(this, &FEP_RX22::TimeoutLoop), 0.1);
piroro4560 0:062f14a26406 21 }
piroro4560 0:062f14a26406 22
piroro4560 0:062f14a26406 23 void FEP_RX22::TimeoutLoop()
piroro4560 0:062f14a26406 24 {
piroro4560 0:062f14a26406 25 if (timeout >= TIMEOUT_COUNT) {
piroro4560 0:062f14a26406 26 status = false;
piroro4560 0:062f14a26406 27 } else {
piroro4560 0:062f14a26406 28 status = true;
piroro4560 0:062f14a26406 29 timeout++;
piroro4560 0:062f14a26406 30 }
piroro4560 0:062f14a26406 31 }
piroro4560 0:062f14a26406 32
piroro4560 0:062f14a26406 33 void FEP_RX22::ReceiveBytes()
piroro4560 0:062f14a26406 34 {
piroro4560 0:062f14a26406 35 buffer[bufindex] = getc(); // Receive 1byte
piroro4560 0:062f14a26406 36 timeout = 0;
piroro4560 0:062f14a26406 37
piroro4560 0:062f14a26406 38 if ( (!strncmp((char*)(buffer + ((256 + bufindex - 1)%256) ), "\r\n", 2)) ) { // <CR><LF> bufindex = <LF>(='\n')
piroro4560 0:062f14a26406 39 CheckData();
piroro4560 0:062f14a26406 40 }
piroro4560 0:062f14a26406 41 bufindex++;
piroro4560 0:062f14a26406 42 }
piroro4560 0:062f14a26406 43
piroro4560 0:062f14a26406 44 void FEP_RX22::CheckData()
piroro4560 0:062f14a26406 45 {
piroro4560 1:8979e85cceb1 46 indexofR=0;
piroro4560 2:39eb865e21e1 47 for (uint16_t i_Rbn=0; i_Rbn<256; i_Rbn++) {
piroro4560 2:39eb865e21e1 48 indexofR = (256 + bufindex - i_Rbn) % 256;
piroro4560 1:8979e85cceb1 49 if ( !strncmp((char*)(buffer + indexofR) , "RBN", 3) ) { // check header indexofR is address of 'R'BN
piroro4560 1:8979e85cceb1 50 #if ControllerMode
piroro4560 1:8979e85cceb1 51 getControllerState();
piroro4560 1:8979e85cceb1 52 #else
piroro4560 1:8979e85cceb1 53 datalen = (buffer[(indexofR+6)%256]-48)*100 + (buffer[(indexofR+7)%256]-48)*10 + (buffer[(indexofR+8)%256]-48);
piroro4560 2:39eb865e21e1 54 for (int i_msg=0; i_msg<datalen; i_msg++) {
piroro4560 2:39eb865e21e1 55 msgdata[i_msg] = buffer[(indexofR+9+i_msg)%256];
piroro4560 0:062f14a26406 56 }
piroro4560 1:8979e85cceb1 57 #endif
piroro4560 0:062f14a26406 58
piroro4560 0:062f14a26406 59 return;
piroro4560 0:062f14a26406 60 }
piroro4560 0:062f14a26406 61 }
piroro4560 0:062f14a26406 62 }
piroro4560 0:062f14a26406 63
piroro4560 1:8979e85cceb1 64 uint8_t FEP_RX22::getData(uint8_t *data)
piroro4560 1:8979e85cceb1 65 {
piroro4560 1:8979e85cceb1 66 for(int i=0; i<128; i++) data[i] = msgdata[i];
piroro4560 1:8979e85cceb1 67 return datalen;
piroro4560 1:8979e85cceb1 68 }
piroro4560 0:062f14a26406 69
piroro4560 1:8979e85cceb1 70 void FEP_RX22::getControllerState()
piroro4560 0:062f14a26406 71 {
piroro4560 1:8979e85cceb1 72 /* コントローラの仕様変更時はここを変える */
piroro4560 1:8979e85cceb1 73 for (int i_button=0; i_button<2; i_button++) {
piroro4560 1:8979e85cceb1 74 button[i_button] = buffer[(indexofR+9+i_button)%256];
piroro4560 1:8979e85cceb1 75 }
piroro4560 1:8979e85cceb1 76 for (int i_stick=0; i_stick<4; i_stick++) {
piroro4560 1:8979e85cceb1 77 stick[i_stick] = buffer[(indexofR+11+i_stick)%256];
piroro4560 1:8979e85cceb1 78 }
piroro4560 1:8979e85cceb1 79 for (int i_trigger=0; i_trigger<2; i_trigger++) {
piroro4560 1:8979e85cceb1 80 trigger[i_trigger] = buffer[(indexofR+15+i_trigger)%256];
piroro4560 1:8979e85cceb1 81 }
piroro4560 1:8979e85cceb1 82
piroro4560 1:8979e85cceb1 83 return;
piroro4560 0:062f14a26406 84 }
piroro4560 0:062f14a26406 85
piroro4560 0:062f14a26406 86 bool FEP_RX22::getButton(uint8_t n)
piroro4560 0:062f14a26406 87 {
piroro4560 0:062f14a26406 88 if (n<8) {
piroro4560 0:062f14a26406 89 return (button[0]>>n) & 1;
piroro4560 0:062f14a26406 90 } else {
piroro4560 0:062f14a26406 91 return (button[1]>>(n-8)) & 1;
piroro4560 0:062f14a26406 92 }
piroro4560 0:062f14a26406 93 }
piroro4560 0:062f14a26406 94
piroro4560 0:062f14a26406 95 int16_t FEP_RX22::getStick(uint8_t n)
piroro4560 0:062f14a26406 96 {
piroro4560 0:062f14a26406 97 if (n%2) return 128-stick[n];
piroro4560 0:062f14a26406 98 else return stick[n]-128;
piroro4560 0:062f14a26406 99 }
piroro4560 0:062f14a26406 100
piroro4560 0:062f14a26406 101 int16_t FEP_RX22::getTrigger(uint8_t n)
piroro4560 0:062f14a26406 102 {
piroro4560 0:062f14a26406 103 return trigger[n];
piroro4560 0:062f14a26406 104 }
piroro4560 0:062f14a26406 105
piroro4560 1:8979e85cceb1 106 bool FEP_RX22::getStatus()
piroro4560 1:8979e85cceb1 107 {
piroro4560 1:8979e85cceb1 108 return status;
piroro4560 0:062f14a26406 109 }