FluidTrack / MOA_garden

Fluid Track Unity Application
MIT License
0 stars 0 forks source link

[BUG] 모아정원 Timestamp Parsing Error #122

Closed KimYC1223 closed 2 years ago

KimYC1223 commented 3 years ago

모아정원 Timestamp Parsing Error Parsing Error

192번 유저에게서 다음과 같은 에러 메세지 발생

ArgumentOutOfRangeException: Year, Month, and Day parameters describe an un-representable DateTime.

System.DateTime.DateToTicks (System.Int32 year, System.Int32 month, System.Int32 day) (at <00000000000000000000000000000000>:0) System.DBNull..cctor () (at <00000000000000000000000000000000>:0) TimeHandler DateTimeStamp..ctor (System.String datetimeString) (at <00000000000000000000000000000000>:0) ProtocolHandler.MakeTimeStamp (System.Byte day, System.Byte hour, System.Byte min, System.Byte sec) (at <00000000000000000000000000000000>:0) ProtocolHandler.ParsingBytes (System.Byte[] bytes) (at <00000000000000000000000000000000>:0) System.Action`3[T1,T2,T3].Invoke (T1 arg1, T2 arg2, T3 arg3) (at <00000000000000000000000000000000>:0) BluetoothDeviceScript.OnBluetoothData (System.String deviceAddress, System.String characteristic, System.String base64Data) (at <00000000000000000000000000000000>:0) BluetoothDeviceScript.OnBluetoothMessage (System.String message) (at <00000000000000000000000000000000>:0)


문제 코드

트레이싱을 따라 추적한 결과 원인이 되는 부분은 TimeHandler.cs의 내부 클래스

DateTimeHandler의 생성자 public DateTimeStamp(String datetimeString)108번째 줄이었다.

image

해당 부분은 Timestamp 자료형을 많이 다루는 모아정원이

웹 서버에서가져온 string형 타임스탬프나 모아밴드에서 가져온 byte array형 타임스탬프 값을

DataTimeStamp 클래스로 만드는 부분이다.

string이나 byte에서 값을 추출하여 int형 변수들(Years,Months, ... )에 넣는 것은 어렵지 않으나,

문제는 YYYY-MM-DD hh:mm:ss무슨 요일인지 계산하는 것이었고,

이는 Unity에서 지원하는 시간 관련 내장 함수를 통해 구현하였다.


이슈에서 나온 에러는 다음 상황들과 같이 무슨 요일인지 맞출 수 없는 경우에 발생한다.

2021-13-12, 2021-0-33, 2021-2-31, 2021-7-0

따라서 문제가 발생한 모아밴드를 직접 확인 할 필요가 있다고 판단하였다.

KimYC1223 commented 3 years ago

모아밴드 고장 진단

TouchW32_30 밴드를 모아밴드 테스터 어플리케이션을 통해 확인해보았다.

모아밴드 테스터 어플리케이션은 똑같이 TimeStamp를 Parsing하는 기능이 있지만,

이슈가 되는 요일를 구하는 부분이 없기 때문에 문제를 확인 할 수 있기 때문이다.


TouchW32_30의 타이머 기능 고장

image

확인 결과 타이머가 0으로 고정되어 있음을 알 수 있다.

타임스탬프의 년과 월에 해당 하는 부분은 정상적으로 보이지만,

애초에 모아밴드는 히스토리 기록을 전송할 때 "년","월"을 제외한 "일","시","분","초"만 전달하기 때문에

년과 월은 항상 현재 시간으로 나오기 때문이다.

이 과정에서 2021년 11월 0일은 존재하지 않기 때문에 본 이슈가 발생했던 것으로 생각된다.



그런데 문제는 망가진 타이머가 아무리 재설정 프로토콜을 보내도 설정되지 않는다는 것이다.
image

혹시나 어플리케이션의 타이머 세팅에 문제가 있는가 싶어 정상 밴드로 테스트해본 결과,

타이머 설정 기능은 잘 동작하는 것으로 확인되었다.

좀 더 자세하게 내용을 확인 할 수 있는 nrf toolbox 어플리케이션으로도 확인 해 본 결과,

TouchW32_30밴드는 타이머가 0으로 고정되어 움직이지 않았다.

image



펌웨어 업데이트를 다시한번 진행하면 해결이 되지 않을까 하여,

nrf tool box로 펌웨어를 다시 깔아봤지만 문제가 해결되지 않았다.


결론

모아정원 어플리케이션은 모아밴드에서 항상 정확하고 유효한 TimeStamp를 전달한다고 가정하고 설계되었다.

따라서 본 이슈는 모아밴드의 하드웨어 결함으로 판단해야 하며,

TouchW32_30은 불량 밴드로 분류하여야 한다.