yusei sugimoeo / Mbed OS controllerForMbed_test_Re
Revision:
2:507b31207449
Parent:
0:4f5b9889cbc4
diff -r ab1c94d6f4fb -r 507b31207449 Controller.cpp
--- a/Controller.cpp	Fri Dec 17 10:04:13 2021 +0000
+++ b/Controller.cpp	Tue Sep 06 06:07:56 2022 +0000
@@ -31,10 +31,8 @@
     comCheck = false;
 
 #if CON_TYPE == CON_ADACHI // 安達君開発のコントローラを使う場合の処理(どのコントローラを使うかはdefine.hで設定)
-    while (loop_count < 10 && serial.readable())
-    {
-        if (serial_recieve() == '\n')
-        {
+    while (loop_count < 10 && serial.readable()) {
+        if (serial_recieve() == '\n') {
             for (int i = 0; i < 8; i++)
                 receive_data[i] = serial_recieve();
             for (int i = 0; i < 8; i++)
@@ -42,8 +40,7 @@
             for (int i = 0; i < 7; i++)
                 checksum ^= receive_data[i];
 
-            if (receive_data[7] == checksum & 0xFF)
-            {
+            if (receive_data[7] == checksum & 0xFF) {
                 comCheck = true;
 
                 //pre_conData.ButtonState = conData.ButtonState;
@@ -57,7 +54,7 @@
 
                 break;
             }
-            
+
             pre_count_ms = count_ms; //受信時間の更新
         }
         loop_count++;
@@ -66,17 +63,15 @@
     // コントローラデータを取得する部分
     static int recv_num = 0;
     char c;
-    while (serial.readable())
-    {
+    while (serial.readable()) {
         c = serial.getc();
-        if (c == '\n')
-        {
-            if (recv_num == 10)
-            { // チェックサムは無く,9個受信したら値を格納
+        if (c == '\n') {
+            if (recv_num == 10) {
+                // チェックサムは無く,9個受信したら値を格納
                 for (int i = 0; i < 9; i++)
                     checksum += (unsigned int)(receive_data[i] - 0x20); // チェックサムの計算
-                if ((checksum & 0x3F) == (receive_data[9] - 0x20))
-                { // チェックサムの計算が合っていた場合のみ値を格納
+                if ((checksum & 0x3F) == (receive_data[9] - 0x20)) {
+                    // チェックサムの計算が合っていた場合のみ値を格納
                     comCheck = true;
 
                     //conData.ButtonState = 0;
@@ -102,27 +97,21 @@
                     conData.RJoyY = abs(conData.RJoyY - 0xFF);
 
                     int buttonPushNum = 0;
-                    for (int i = 0; i < 16; i++)
-                    {
+                    for (int i = 0; i < 16; i++) {
                         buttonPushNum += (conData.ButtonState >> i) & 0x0001;
                     }
-                    if (buttonPushNum > 5)
-                    {
+                    if (buttonPushNum > 5) {
                         //conData.ButtonState = pre_conData.ButtonState;
                         comCheck = false;
-                    }
-                    else
-                    {
+                    } else {
                         conData.ButtonState |= lastButtonState;
                     }
-                    
+
                     pre_count_ms = count_ms; //受信時間の更新
                 }
             }
             recv_num = 0;
-        }
-        else
-        {
+        } else {
             receive_data[recv_num] = c;
             recv_num++;
         }
@@ -131,19 +120,21 @@
     // コントローラデータを取得する部分
     static int recv_num = 0;
     char c;
-    while (serial.readable())
-    {
+    while (serial.readable()) {
         c = serial.getc();
-        //Serial.print(c);
-        if (c == '\n')
-        {
-            if (recv_num == 10)
-            { // データ数はチェックサム含めて10個(0~9)
+        //printf("%x ",c);
+
+        if (c == '\n') {
+            //printf("\t");
+            if (recv_num == 10) {
+                // データ数はチェックサム含めて10個(0~9)
                 checksum = 0;
-                for (int i = 0; i < 9; i++)
-                    checksum ^= (unsigned int)(receive_data[i] - 0x20); // チェックサムの計算
-                if ((checksum & 0x3F) == (receive_data[9] - 0x20))
-                { // チェックサムの計算が合っていた場合のみ値を格納
+                //for(int i = 0; i<10; i++)printf("%+x ",receive_data[i]);
+                for (int i = 0; i < 9; i++)checksum ^= (unsigned int)(receive_data[i] - 0x20); // チェックサムの計算
+                //printf(" %+x\n",checksum);
+                if ((checksum & 0x3F) == (receive_data[9] - 0x20)) {
+                    // チェックサムの計算が合っていた場合のみ値を格納
+                    //printf("checksum ok \n");
                     comCheck = true;
 
                     //conData.ButtonState = 0;
@@ -152,7 +143,7 @@
                     lastButtonState |= (unsigned int)((receive_data[1] - 0x20) & 0x3F) << 6;
                     lastButtonState |= (unsigned int)((receive_data[2] - 0x20) & 0x0F) << 12;
 
-                    conData.LJoyX |= (unsigned int)(receive_data[3] - 0x20);
+                    conData.LJoyX |= (unsigned int)(receive_data[3] - 0x20) & 0x3F;
                     conData.LJoyX |= (unsigned int)((receive_data[4] - 0x20) & 0x03) << 6;
                     conData.LJoyX = abs(conData.LJoyX - 0xFF);
 
@@ -164,23 +155,19 @@
                     conData.RJoyX |= (unsigned int)((receive_data[6] - 0x20) & 0x3F) << 2;
                     conData.RJoyX = abs(conData.RJoyX - 0xFF);
 
-                    conData.RJoyY |= (unsigned int)(receive_data[7] - 0x20);
+                    conData.RJoyY |= (unsigned int)(receive_data[7] - 0x20) & 0x3F;
                     conData.RJoyY |= (unsigned int)((receive_data[8] - 0x20) & 0x03) << 6;
                     conData.RJoyY = abs(conData.RJoyY - 0xFF);
 
                     // 通信ミスであり得ない数のボタン数押されていた場合に無視する処理
                     int buttonPushNum = 0;
-                    for (int i = 0; i < 16; i++)
-                    {
+                    for (int i = 0; i < 16; i++) {
                         buttonPushNum += (lastButtonState >> i) & 0x0001;
                     }
-                    if (buttonPushNum > 5)
-                    {
+                    if (buttonPushNum > 5) {
                         //conData.ButtonState = pre_conData.ButtonState;
                         comCheck = false;
-                    }
-                    else
-                    {
+                    } else {
                         conData.ButtonState = lastButtonState & 0xFFFF;
                     }
 
@@ -188,20 +175,21 @@
                 }
             }
             recv_num = 0;
-        }
-        else
-        {
+        } else {
             receive_data[recv_num] = c;
             recv_num++;
         }
+        //printf("con\n");
     }
+        //printf("nuketa\n");
 
 #endif
-
+//printf("g1");
     if(!(time_out_ms == -1)) conAvailable = (time_out_ms > (count_ms - pre_count_ms)); //タイムアウトとインターバルの比較
     else conAvailable = true;
+    //printf("g2");
     if(count_ms > time_out_ms * 1000) count_ms = time_out_ms; //オーバーフロー対策
-
+//printf("h");
     return comCheck;
 }
 
@@ -215,13 +203,35 @@
     return conAvailable;
 }
 
+bool Controller::clearBuffer(void)
+{
+    if(serial.readable()) serial.getc();
+    return serial.readable();
+}
+
+bool Controller::rate(void)
+{
+    bool _ButtunState = false, _RX = false, _RY = false, _LX = false, _LY = false ;
+    if(comCheck) {
+        _ButtunState = (conData.ButtonState != 0)? true : false;
+        _RX = (conData.RJoyX != 128)? true : false;
+        _RY = (conData.RJoyY != 128)? true : false;
+        _LX = (conData.LJoyX != 128)? true : false;
+        _LY = (conData.LJoyY != 128)? true : false;
+    }
+    //printf("%d,%d,%d,%d,%d\n",_ButtunState,_RX,_RY,_LX,_LY);
+    return _ButtunState | _RX | _RY | _LX | _LY;
+}
+
 bool Controller::readButton_bin(unsigned int ButtonNum)
-{ //放しているときは0,押しているときは1
+{
+    //放しているときは0,押しているときは1
     return ((conData.ButtonState & (0x0001 << (ButtonNum - 1))) == (0x0001 << (ButtonNum - 1))) ? true : false;
 }
 
 int Controller::readButton(unsigned int ButtonNum)
-{ //放しているときは0,押しているときは1,押した瞬間は2,放した瞬間は-1
+{
+    //放しているときは0,押しているときは1,押した瞬間は2,放した瞬間は-1
     int result = 0;
     if ((conData.ButtonState & (0x0001 << (ButtonNum - 1))) == (0x0001 << (ButtonNum - 1)))
         result += 2;
@@ -297,13 +307,10 @@
 {
     // 立ち上がり,立下りのフラッギング処理 (フラグクリアは別関数で)
     unsigned int buttonFlagRise = 0;
-    if (pre_conData.ButtonState != conData.ButtonState)
-    {
-        for (int i = 0; i < 16; i++)
-        {
+    if (pre_conData.ButtonState != conData.ButtonState) {
+        for (int i = 0; i < 16; i++) {
             int mask = 0x01 << i;
-            if ((conData.ButtonState & mask) != (pre_conData.ButtonState & mask))
-            {
+            if ((conData.ButtonState & mask) != (pre_conData.ButtonState & mask)) {
                 if ((conData.ButtonState & mask) == mask)
                     buttonFlagRise |= (conData.ButtonState & mask);
             }
@@ -315,18 +322,14 @@
 unsigned int Controller::getButtonFlagFall()
 {
     unsigned int buttonFlagFall = 0;
-    if (pre_conData.ButtonState != conData.ButtonState)
-    {
-        for (int i = 0; i < 16; i++)
-        {
+    if (pre_conData.ButtonState != conData.ButtonState) {
+        for (int i = 0; i < 16; i++) {
             int mask = 0x01 << i;
-            if ((conData.ButtonState & mask) != (pre_conData.ButtonState & mask))
-            {
+            if ((conData.ButtonState & mask) != (pre_conData.ButtonState & mask)) {
                 if ((pre_conData.ButtonState & mask) == mask)
                     buttonFlagFall |= (pre_conData.ButtonState & mask);
             }
         }
     }
     return buttonFlagFall;
-}
-
+}
\ No newline at end of file