From c1d4fe283fa4a5503b7d27931c15b46f3bc51343 Mon Sep 17 00:00:00 2001 From: BlueCrescent Date: Wed, 14 Feb 2024 19:29:08 +0900 Subject: [PATCH] =?UTF-8?q?=E4=BF=A1=E9=A0=BC=E5=BA=A6=E5=B0=8E=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/JJYReceiver.cpp | 23 +++++++++++++++++------ src/JJYReceiver.h | 9 +++------ 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/JJYReceiver.cpp b/src/JJYReceiver.cpp index 577991b..3bb25bd 100644 --- a/src/JJYReceiver.cpp +++ b/src/JJYReceiver.cpp @@ -81,9 +81,12 @@ time_t JJYReceiver::getTime() { if(timeavailable == -1) return -1; timeavailable = -1; switch(reliability){ - case 1: + case LENGTHOK: return updateTimeInfo(jjydata,timeavailable,1); - break; + break; + case PARITYOK: + return updateTimeInfo(jjydata,timeavailable,1); + break; } return -1; case TIMEVALID: @@ -135,10 +138,18 @@ void JJYReceiver::delta_tick(){ markercount++; if(markercount==2){ rcvcnt = (rcvcnt + 1) % VERIFYLOOP; - if(settime(rcvcnt)){ - datetimeCheck(); - timeCheck(rcvcnt); - timeavailable = rcvcnt; + if(lencheck(jjypayloadlen)){ // Payload Length check + settime(rcvcnt); + if(timeCheck(rcvcnt)){ // Parity check + datetimeCheck(); + timeavailable = rcvcnt; + reliability = static_cast((reliability < LENGTHOK) ? LENGTHOK : reliability); + } + }else{ + if(timeCheck(rcvcnt)){ // Payload bad, but Parity check passed. Time could be used. + timeavailable = rcvcnt; + reliability = static_cast((reliability < PARITYOK) ? PARITYOK : reliability); + } } #ifdef DEBUG_BUILD debug3(); diff --git a/src/JJYReceiver.h b/src/JJYReceiver.h index aca9594..065a5d6 100644 --- a/src/JJYReceiver.h +++ b/src/JJYReceiver.h @@ -79,6 +79,7 @@ typedef union { class JJYReceiver { enum STATE {INIT,RECEIVE,TIMEVALID,TIMETICK}; + enum RELIABILITY {UNKNOWN=-1,PARITYOK=0,LENGTHOK=1}; enum JJYSTATE {JJY_INIT=-1,JJY_MIN=0,JJY_HOUR=1,JJY_DOYH=2,JJY_DOYL=3,JJY_YEAR=4,JJY_WEEK=5}; public: @@ -93,7 +94,7 @@ class JJYReceiver { volatile int8_t monitorpin = -1; volatile uint8_t frequency = 0; volatile uint8_t markercount = 0; - volatile uint8_t reliability = 0; + volatile enum RELIABILITY reliability = UNKNOWN; volatile uint8_t quality = 0; volatile uint8_t tick = 0; @@ -142,10 +143,7 @@ class JJYReceiver { #endif private: - bool settime(uint8_t index){ - if(lencheck(jjypayloadlen) == false){ - return false; - } + void settime(uint8_t index){ jjydata[index].bits.year =(uint8_t) 0x00FF & jjypayload[JJY_YEAR]; jjydata[index].bits.doyh =(uint16_t) 0x007F & jjypayload[JJY_DOYH]; jjydata[index].bits.doyl =(uint8_t) ((0x01E0 & jjypayload[JJY_DOYL]) >> 5); @@ -154,7 +152,6 @@ class JJYReceiver { jjydata[index].bits.PA1_h =(uint8_t) ((0x0004 & jjypayload[JJY_DOYL]) >> 2); jjydata[index].bits.PA2_m =(uint8_t) ((0x0002 & jjypayload[JJY_DOYL]) >> 1); timeinfo.tm_sec = 1; // 秒 - return true; } time_t updateTimeInfo(JJYData* jjydata, int8_t index, int8_t offset) { int year, yday;