回転数計のクラスです。

Dependencies:   mbed

Revision:
6:93f90c5d0e5b
Parent:
5:871c2d6c1129
--- a/Cadence.h	Sat Jan 28 01:07:59 2017 +0000
+++ b/Cadence.h	Sat Feb 18 07:57:27 2017 +0000
@@ -1,53 +1,77 @@
+//;2648 ;00 00000 0;168 ;001; 10043 c1;31 10;00 00;00 00;10 63;08 39;I; -012; 0002; 0104;\r\n
+//;109  ;00 00000 0;123 ;011; 10008 e4;27 95;00 00;00 00;13 99;08 51;G; -068; -096; -192;
 #ifndef CADENCE_H
 #define CADENCE_H
 
 #include "mbed.h"
-#include "BufferedSoftSerial.h"
 #include <string>
-
-
-class Cadence : public /*BufferedSoft*/RawSerial{
+DigitalOut led3(LED3);
+class Cadence : public RawSerial{
     private:
-    static const int DATAS_NUM = 69 + 4 + 1; //経過時間の文字数は最大4
-//;1816; 00 00000 0;168 ;001; 10133 e9;34 00;00 0e;00 00;10 70;06 89;G; -005; -009; -006;    //2+4+67+2(\r\n)
-//                                     -- --                                        ----
+    static const int DATAS_NUM = 75;
+    
     protected:
     
     public:
-    char strC[4],strV[4];
+    string strC,strV;
     char data[DATAS_NUM];
     string strData;
     int data_count, data_num;
-    double cadence, voltage, safeflag;
-    int cadence_i, voltage_i;
-    Cadence(PinName tx, PinName rx, const char* name = NULL) : /*BufferedSoft*/RawSerial(tx, rx, NULL){
+    double cadence, voltage;
+    Cadence(PinName tx, PinName rx, const char* name = NULL) : RawSerial(tx, rx){
         for(int i=0;i<DATAS_NUM;i++) data[i]= NULL;
+        data_num=0;
         data_count=0;
         baud(115200);
         cadence=0;
         voltage=0;
-        strC[0] = '0';
-        strV[0] = '0';
+    }
+    int checkInt(const char c[]){
+        for(int i = 0; i<strlen(c); i++){
+            if( c[0] == '-' ) continue;
+            if( c[i] - '0' > 9 || c[i] - '0' <0 ) return -1;
+        }return 1;
     }
-    void readData(){ //Ticker で定期的に呼び出して値を更新
-      if(readable()){ 
+    void readData(){
+      if(readable()){
         data_count = 0;
+        for (int i = 0; i<DATAS_NUM; i++) data[i] = NULL;
         do{
-            if(readable()){
+            if(readable()) {
                 data[data_count] = getc();
                 if(data[data_count] != '\n') data_count++;
+                led3 = !led3;
             }
-        }while( data[data_count-1] != '\r' && data_count < DATAS_NUM );
-        if( data_count > 71 ) {
-            for(int i = 0; i<4; i++){
-                strC[i] = data[data_count - 6 + i]; // 7 = 5 + 1
-                pc.putc(strC[i]);
-                strV[i] = data[data_count - 43 + i]; // 44 = 42 + 1
+        }while(data[data_count] != '\n' && data_count<DATAS_NUM);
+        strData = data;
+        if( int strlength = strData.length() > DATAS_NUM-4 ){
+//            for(int i = 0; i<4; i++){
+//                strC += data[data_count-6+i];
+//                strV += data[data_count-43+i];
+//            }
+//            if( checkInt(strC) ) sscanf(strC,"%lf",&cadence);
+//            if( checkInt(strV) ) sscanf(strV,"%lf",&voltage);
+
+            switch (strData.length()){
+                case DATAS_NUM-3 :
+                    strData.erase(0,2);
+                    break;
+                case DATAS_NUM-2 :
+                    strData.erase(0,3);
+                    break;
+                case DATAS_NUM-1 :
+                    strData.erase(0,4);
+                    break;
+                case DATAS_NUM :
+                    strData.erase(0,5);
             }
-            sscanf(strC,"%4d",&cadence_i);
-            sscanf(strV,"%4d",&voltage_i);
-            cadence = cadence_i/6.0;
-            voltage = voltage_i/1000.0;
+            strV = strData.substr(27,4);
+            strC = strData.substr(64,4);
+            if( checkInt( strV.c_str() ) ) sscanf(strV.c_str(),"%lf",&voltage);
+            if( checkInt( strC.c_str() ) ) sscanf(strC.c_str(),"%lf",&cadence);
+            
+            cadence /= 6.0;
+            voltage *= 0.001;
         }
       }
     }