FEP RX library

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

Revision:
0:062f14a26406
Child:
1:8979e85cceb1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/FEP_RX22.cpp	Wed Oct 05 01:14:22 2022 +0000
@@ -0,0 +1,96 @@
+/**
+ *  @file   FEP_RX22.cpp
+ *  @author 安澤瑠
+ *  @date   22/10/4
+ */
+#include "FEP_RX22.h"
+
+FEP_RX22::FEP_RX22(PinName tx, PinName rx, uint8_t addr_, int baud) :
+    RawSerial(tx, rx, baud)
+{
+    addr     = addr_;
+    timeout  = TIMEOUT_COUNT;
+    bufindex = 0;
+    retindex = 0;
+}
+
+void FEP_RX22::StartReceive()
+{
+    attach(callback(this, &FEP_RX22::ReceiveBytes));
+    timeoutTimer.attach(callback(this, &FEP_RX22::TimeoutLoop), 0.1);
+}
+
+void FEP_RX22::TimeoutLoop()
+{
+    if (timeout >= TIMEOUT_COUNT) {
+        status = false;
+    } else {
+        status = true;
+        timeout++;
+    }
+}
+
+void FEP_RX22::ReceiveBytes()
+{
+    buffer[bufindex] = getc(); // Receive 1byte
+    timeout = 0;
+
+    if ( (!strncmp((char*)(buffer + ((256 + bufindex - 1)%256) ), "\r\n", 2)) ) { // <CR><LF> bufindex = <LF>(='\n')
+        CheckData();
+    }
+    bufindex++;
+}
+
+void FEP_RX22::CheckData()
+{
+    uint8_t temp=0;
+    for (uint16_t i=0; i<256; i++) {
+        temp = (256 + bufindex - i) % 256;
+        if ( !strncmp((char*)(buffer + temp) , "RBN", 3) ) { // check header  temp='R'
+        /* コントローラの仕様変更時はここを変える */
+            for (int i_button=0; i_button<2; i_button++) {
+                button[i_button] = buffer[(temp+9+i_button)%256];
+            }
+            for (int i_stick=0; i_stick<4; i_stick++) {
+                stick[i_stick] = buffer[(temp+11+i_stick)%256];
+            }
+            for (int i_trigger=0; i_trigger<2; i_trigger++) {
+                trigger[i_trigger] = buffer[(temp+15+i_trigger)%256];
+            }
+            count_timeout = buffer[(temp+17)%256];
+            
+            return;
+        }
+    }
+}
+
+
+void FEP_RX22::GetData(uint8_t *data)
+{
+    for (int i=0; i<DATANUM; i++) data[i] = retdata[i];
+}
+
+bool FEP_RX22::getButton(uint8_t n)
+{
+    if (n<8) {
+        return (button[0]>>n) & 1;
+    } else {
+        return (button[1]>>(n-8)) & 1;
+    }
+}
+
+int16_t FEP_RX22::getStick(uint8_t n)
+{
+    if (n%2) return 128-stick[n];
+    else return stick[n]-128;
+}
+
+int16_t FEP_RX22::getTrigger(uint8_t n)
+{
+    return trigger[n];
+}
+
+uint8_t FEP_RX22::getTimeout()
+{
+    return count_timeout;
+}
\ No newline at end of file