2018年度計器mbed用プログラム

Dependencies:   BufferedSoftSerial2 INA226_ver1 mbed-rtos mbed SDFileSystem-RTOS

Fork of keiki2017 by albatross

Branch:
Thread-gyogetsuMPU
Revision:
37:34aaa1951390
Parent:
34:c46f2f687c7b
Child:
41:1bd730c4840d
--- a/Cadence.h	Sat Feb 18 06:45:59 2017 +0000
+++ b/Cadence.h	Sun Feb 19 13:20:11 2017 +0000
@@ -1,63 +1,97 @@
+//;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>
-
 DigitalOut led3(LED3);
-double cadence;
-
-class Cadence : public /*BufferedSoft*/RawSerial{
+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,BuffNum = 10000;
+    
     protected:
     
     public:
-    char strC[4],strV[4];
-    char data[DATAS_NUM];
+    string strC,strV;
+    char data[DATAS_NUM],myBuff[BuffNum],c;
     string strData;
     int data_count, data_num;
-    double voltage, safeflag;
-    int cadence_i, voltage_i;
-    Cadence(PinName tx, PinName rx/*, const char* name = NULL*/) : /*BufferedSoft*/RawSerial(tx, rx/*, NULL*/){
-        for(int i=0;i<DATAS_NUM;i++) data[i]= 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]= '\0';
+        for(int i = 0;i<BuffNum;i++) myBuff[i] = '\0';
+        data_num=0;
         data_count=0;
         baud(115200);
         cadence=0;
         voltage=0;
-        strC[0] = '0';
-        strV[0] = '0';
+//        attach(this, &Cadence::readData);
     }
-    int checkInt(char c[]){
-        for(int i = 0; i< sizeof(c)/sizeof(c[0]); i++){
-            if( c[i] - '0' >9 || c[i] - '0' < 0 ) return -1;
-        }
-        return 1;
+    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()){ 
-        data_count = 0;
+    void readData(){
+      if(readable()){
+        led3 = 1;
         do{
-            if(readable()){
-                data[data_count] = getc();
-                if(data[data_count] != '\n') data_count++;
-                led3 = !led3;
+            if(!readable()) return;
+            c = getc();
+            if(c != '\n'){
+                myBuff[data_count] = c;
+                data_count++;
             }
-        }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]; // 6 = 5 + 1
-                strV[i] = data[data_count - 43 + i]; // 43 = 42 + 1
+        }while(c == '\n' && myBuff[data_count-1] == '\r');
+//        do{
+//            if(readable()) {
+//                char c = getc();
+////                if(c == '\n' && data[data_count-1] == '\r'){
+//                if(c == '\n' && myBuff[data_count-1] == '\r'){
+//                    break;
+//                }else{
+////                    data[data_count] = c;
+//                    myBuff[data_count] = c;
+//                    data_count++;
+//                }
+//            }
+//        }while(data_count<BuffNum);
+        strData = myBuff;
+        led3 = 0;
+        if( int strlength = strData.length() > DATAS_NUM-4 && strlength < DATAS_NUM ){
+//            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 (strlength){
+                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);
             }
-            if(checkInt(strC)) sscanf(strC,"%4d",&cadence_i);
-            if(checkInt(strV)) 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;
         }
-//      }
+        for (int i = 0; i<data_count; i++) myBuff[i] = '\0';
+        data_count = 0;
+      }
     }
 };
 #endif
\ No newline at end of file