bug fix, But not applied
Dependencies: ADXL362_bugFix stm-spirit1-rf-driver_for_cubebite
Fork of cubebite_rnd_ev-cog-ad3029lz_433MHz_2nd_testing2_RF10CountSensingCheckOK_180619_initReviseTest by
Diff: main.cpp
- Revision:
- 2:b87c19873d46
- Parent:
- 1:04f46755f8af
--- a/main.cpp Fri Jun 22 03:43:49 2018 +0000 +++ b/main.cpp Thu Sep 20 06:36:52 2018 +0000 @@ -1,7 +1,8 @@ //HJM : 선풍기 에이징 테스트 용 소스임. //180615 HJM : 선풍기 에이징 용 온도 1개 진동 10개 전송용 테스트 임. // CUBEBITE_TEMPERATURE_DISABLE define 값으로 온도 센서 (연결 및 미연결) 시 설정을 할 수 있음. - +//180717 HJM : 인증(온도) 테스트용 소스 버전 관리, 0.1 -> 온도(저온) 테스트 +//180717 HJM : 수정 1 #include "mbed.h" @@ -10,6 +11,14 @@ #include "main.h" +#define FIRMWARE_VERSION_MAJOR 0 +#define FIRMWARE_VERSION_MINOR 2 +#define FIRMWARE_VERSION_REVISE 2 + +//#define DEBUG_PRINT_TEMP +//#define DEBUG_PRINT_SEND + +//#define FIRMWARE_VERSION_PRINT(x) printf(#x " = %s\n", x); //************************************************************************************* //Define : Test, Compile @@ -32,13 +41,12 @@ //180411 HJM : 현재 1~3 까지 3대까지 가능 -> 게이트웨이에서 3대까지만 처리하게끔 되어있 -#define CUBEBITE_SENSOR_UUID 1 //180621 HJM : 온도 및 진동 테스트 용 -//#define CUBEBITE_SENSOR_UUID 2 //180621 HJM : 철기연 테스트 용 +#define CUBEBITE_SENSOR_UUID 1 //3180621 HJM : 온도 및 진동 테스트 용 +//#define CUBEBITE_SENSOR_UUID 2 //180621 HJM : 철기연 테스트 용, 방대리님 테스트 용 //************************************************************************************* - //HJM : 타이머 인터럽트 테스트 용 #ifdef CUBEBITE_DEBUG DigitalOut led1(LED1); @@ -46,18 +54,13 @@ +#define RETURN_ERROR_NUMBER 100 + //************************************************************************************* //HJM SUDO code : 3개 객체 생성->RF, 온도, 진동 //************************************************************************************* -//RF 객체 -static SimpleSpirit1 &myspirit = SimpleSpirit1::CreateInstance(P0_01, P0_02, P0_00, P1_12 ,P2_08, P1_14); - // P0_01[SPI0_MOSI] - // P0_02[SPI0_MISO], - // P0_00[SPI0_CLK], - // P1_12[GPIO 28, RF(GPIO 0)]->IRQ로 설정, - // P2_08[SPI0_CS2], - // P1_14[GPIO 30, RF (SDN)] + //온도 객체 @@ -83,6 +86,8 @@ static void callback_func(int event); //RF user callback 함수임. void UserTimerInterrupt(void); //1초, 타이머 인터럽트 임 int UserTimerInterrupt_Execution(void); +int UserTimerInterrupt_Execution2(void); +//void UserTimerInterrupt2(void); static int SendData(SimpleSpirit1& myspirit); @@ -99,7 +104,14 @@ //(테스트용)HJM SUDO code : 전역 변수, 진동, 온도 쪽 테스트용임. 추후 서대리님이 클래스 재 정의시 없어질 예정 //************************************************************************************* - +//RF 객체 + static SimpleSpirit1 &myspirit = SimpleSpirit1::CreateInstance(P0_01, P0_02, P0_00, P1_12 ,P2_08, P1_14); + // P0_01[SPI0_MOSI] + // P0_02[SPI0_MISO], + // P0_00[SPI0_CLK], + // P1_12[GPIO 28, RF(GPIO 0)]->IRQ로 설정, + // P2_08[SPI0_CS2], + // P1_14[GPIO 30, RF (SDN)] //진동 @@ -154,6 +166,12 @@ #define ID_CON_ADDR 0x01 #define ID_REG_ADDR 0x07 +#define RESET_HW_OFF 1 +#define RESET_HW_ON 0 + +#define SPIRIT1_POWER_OFF 1 +#define SPIRIT1_POWER_ON 2 + //RF->이거도 클래스 내부에 넣기 static volatile bool bRxDoneFlag = false; @@ -171,13 +189,19 @@ //HJM : I2C PullUp 용.. RF IRQ 도 이 핀 이지만 사용안하기 때문에 괜찮음. -DigitalOut TempSupply(P1_12); +DigitalOut resetHW(P1_12); +//prit1(P1_11); //GPIO27 bool iTempFlag = false; bool isTimerInterruptStarted = false; bool bIs1SecTimerSet = false; int iTempInitCount = 0; bool isTempInitOk = false; + +int iMainCounting = 1; +static int iIsResetStartCounting = 0; +//static int iIsResetStartCountingInterrupt = 0; +bool isTempOk = false; int main(void) { //************************************************************************************* @@ -185,7 +209,31 @@ //************************************************************************************* //필수!!! - TempSupply.write(1); + resetHW.write(RESET_HW_OFF); + //Describe + printf("\n\n FIRMWARE_VERSION : %d.%d.%d \n\n", FIRMWARE_VERSION_MAJOR, FIRMWARE_VERSION_MINOR, FIRMWARE_VERSION_REVISE); + printf("\n\n FIRMWARE_VERSION_DESCRIBE : Cold test \n"); + printf("FIRMWARE_VERSION_REVISE_DESCRIBE : BANDWIDTH change and debug line all delete\n"); + + printf("Xtal offset in ppm : [%d]\n", XTAL_OFFSET_PPM); + printf("base frequency : [%d]\n", (uint32_t)BASE_FREQUENCY); + printf("channel space : [%d]\n", (uint32_t)CHANNEL_SPACE); + printf("channel number : [%d]\n", CHANNEL_NUMBER); + printf("modulation select : [%d]\n", MODULATION_SELECT); + printf("data rate : [%d]\n", DATARATE); + printf("frequency deviation : [%d]\n", (uint32_t)FREQ_DEVIATION); + printf("channel filter bandwidth : [%d]\n", (uint32_t)BANDWIDTH); + +#ifdef USE_SPIRIT1_433MHz + printf("\n is 433Mhz FREQ !!!\n"); +#endif + + + + +// FIRMWARE_VERSION_PRINT(FIRMWARE_VERSION); + + //진동 init_시작 @@ -194,19 +242,17 @@ // Set up accelerometer adxl362.init_adxl362(); - wait_ms(25); +// wait_ms(25); //진동 init_끝 //온도 init_시작 //Power supply for the sensor is given from GPIO28(VDD_MCU_B). + // JMOD Init +#ifndef CUBEBITE_TEMPERATURE_DISABLE + printf("[Temperature] Init start"); -#ifndef CUBEBITE_TEMPERATURE_DISABLE - i2c.frequency(100000); -#endif - - // JMOD Init -#ifndef CUBEBITE_TEMPERATURE_DISABLE + i2c.frequency(100000); //100khz wReg[0] = ID_CON_ADDR; while(rReg[0] != 0x03) @@ -233,15 +279,17 @@ if(rReg[0] == 0x03) { - printf(" (Success!!)\n\n"); +// printf(" (Vib Success!!)\n\n"); //write 0x00(ID_CON_ADDR) wReg[1] = 0x00; wACK = i2c.write(busAddr, wReg, 2); isTempInitOk = true; wait_ms(250); +// wait_ms(60); +// wait_ms(150); } - else if (3 == iTempInitCount) + else if (10 == iTempInitCount) { isTempInitOk = false; break; @@ -253,14 +301,18 @@ } wait_ms(500); +// wait_ms(80); +// wait_ms(200); } #endif + printf("(OK)\n"); //온도 init_끝 + //RF init_시작 - myspirit.attach_irq_callback(callback_func); +// myspirit.attach_irq_callback(callback_func); if (myspirit.on()) { printf("ERROR.\n"); @@ -278,19 +330,41 @@ //HJM SUDO code : 1초 타이머 인터럽트 생성, 1초 간격 호출 함수 : UserTimerInterrupt() //************************************************************************************* // Timeout timeoutUserInterrupt; //1번만 실행 -// Ticker timeoutUserInterrupt; //매번 실행 + Ticker timeoutUserInterrupt; //매번 실행 +// Ticker timeoutUserInterrupt2; //매번 실행 // timeoutUserInterrupt.attach(&UserTimerInterrupt, 1.0); //1 sec -// timeoutUserInterrupt.attach(&UserTimerInterrupt, 3.0); //3 sec + timeoutUserInterrupt.attach(&UserTimerInterrupt, 900.0); //15 minuite, reset test +// timeoutUserInterrupt2.attach(&UserTimerInterrupt2, 1.0); //1 sec +// timeoutUserInterrupt.attach(&UserTimerInterrupt, 5.0); //test, 5sec //************************************************************************************* - wait(1); +// wait(1); while(1) { - __WFE(); //HJM : sleep 모드 ON + __WFE(); //HJM : sleep 모드 ON + + if (false == isTempOk) + { + isTempOk = true; + + UserTimerInterrupt_Execution(); + } + UserTimerInterrupt_Execution2(); - UserTimerInterrupt_Execution(); +// myspirit.off(); +// myspirit.on(); + + //if (0 == (iMainCounting % 10)) +// { +//// myspirit.reset_board(); +//// iMainCounting = 0; +// iMainCounting = 1; +// myspirit.off(); +// myspirit.on(); +// } + if (true == isTimerInterruptStarted) { isTimerInterruptStarted = false; @@ -307,7 +381,6 @@ #ifdef CUBEBITE_DEBUG printf("[CUBEBITE] callback_func(int event) \n"); #endif - if(event == SimpleSpirit1::RX_DONE) { @@ -323,36 +396,58 @@ void UserTimerInterrupt(void) { -//************************************************************************************* -//HJM : 타이머 인터럽트 작동 테스트 -//************************************************************************************* -//180329 HJM : 작동 테스트 완료 -#ifdef CUBEBITE_DEBUG - led1 = !led1; -#endif - -//************************************************************************************* - - if (false == bIs1SecTimerSet) - { - bIs1SecTimerSet = true; - } + resetHW.write(RESET_HW_ON); return; } +bool bIsResetGo = false; +int UserTimerInterrupt_Execution(void) +{ + if (true == isTempInitOk) + { + wReg[0] = ID_DATA_ADDR; + + i2c.write(busAddr, wReg, 1); + i2c.read(busAddr, rReg, 2); + + Tem16 = (rReg[0] << 8) | (rReg[1]); + Tem16 >>= 5; + TempData = Tem16; + + TempData = TempData *0.125; + + //if (5 > TempData) +// { +// if (false == bIsResetGo) +// { +// bIsResetGo = true; +// resetHW.write(RESET_HW_ON); +// } +// } + +#ifdef DEBUG_PRINT_TEMP + printf("TEMP DEBUG : %f\n", TempData); +#endif //DEBUG_PRINT_TEMP + } + + return 0; +} + + + + volatile int iFunctionCallCounting = 0; -int UserTimerInterrupt_Execution(void) +int UserTimerInterrupt_Execution2(void) { // printf("UserTimerInterrupt_Execution 호출, dataCount : [%d]\n", dataCount); ++iFunctionCallCounting; if (false == isTimerInterruptStarted) - { + { //진동 - adxl362.ACC_GetXYZ8(&x8, &y8, &z8); - + adxl362.ACC_GetXYZ8(&x8, &y8, &z8); if (0 == x8) { uiSendBuf[dataCount++] = '0'; @@ -364,8 +459,7 @@ int8tX8Result = x8; uiSendBuf[dataCount++] = (uint8_t)int8tX8Result; - } - + } if (0 == y8) { uiSendBuf[dataCount++] = '0'; @@ -377,8 +471,7 @@ int8tY8Result = y8; uiSendBuf[dataCount++] = (uint8_t)int8tY8Result; - } - + } if (0 == z8) { uiSendBuf[dataCount++] = '0'; @@ -390,49 +483,43 @@ int8tZ8Result = z8; uiSendBuf[dataCount++] = (uint8_t)int8tZ8Result; - } - -// printf("int8tX8Result : %d\n", (uint8_t)int8tX8Result); - -// printf("int8tY8Result : %d\n", (uint8_t)int8tY8Result); - -// printf("int8tZ8Result : %d\n", (uint8_t)int8tZ8Result); - - - + } - wait(0.025); // 25ms, Wait is required in this mode + wait(0.025); // 25ms, Wait is required in this mode //온도 // temperature data receive -#ifndef CUBEBITE_TEMPERATURE_DISABLE if (true == isTempInitOk) - { - wReg[0] = ID_DATA_ADDR; - - i2c.write(busAddr, wReg, 1); - i2c.read(busAddr, rReg, 2); - - Tem16 = (rReg[0] << 8) | (rReg[1]); - Tem16 >>= 5; - TempData = Tem16; - - TempData = TempData *0.125; + { + // wReg[0] = ID_DATA_ADDR; +// +// i2c.write(busAddr, wReg, 1); +// i2c.read(busAddr, rReg, 2); +// +// Tem16 = (rReg[0] << 8) | (rReg[1]); +// Tem16 >>= 5; +// TempData = Tem16; +// +// TempData = TempData *0.125; if (0 == rReg[0]) { + uiSendBuf[dataCount++] = '@'; uiSendBuf[dataCount++] = '0'; - // uiSendBuf[dataCount++] = '1'; +// uiSendBuf[dataCount++] = '1'; } else { uiSendBuf[dataCount++] = (uint8_t)rReg[0]; } + + if (0 == rReg[1]) { + uiSendBuf[dataCount++] = '@'; uiSendBuf[dataCount++] = '0'; - // uiSendBuf[dataCount++] = '2'; +// uiSendBuf[dataCount++] = '2'; } else { @@ -441,31 +528,27 @@ } else { - uiSendBuf[dataCount++] = '0'; + uiSendBuf[dataCount++] = '@'; uiSendBuf[dataCount++] = '0'; +// uiSendBuf[dataCount++] = '1'; + uiSendBuf[dataCount++] = '@'; + uiSendBuf[dataCount++] = '0'; +// uiSendBuf[dataCount++] = '2'; } - -#else //온도 안쓰면, - uiSendBuf[dataCount++] = '0'; - uiSendBuf[dataCount++] = '0'; -#endif - -#ifdef CUBEBITE_DEBUG - printf("!!!!!!!!!!!!!! cFileWriteData : %d@%d@%d@%f\n", x8, y8, z8, TempData); -#endif //CUBEBITE_DEBUG - - -// printf("iFunctionCallCounting : [%d]\n", iFunctionCallCounting); - uiSendBuf[dataCount++] = '#'; uiSendBuf[dataCount++] = '#'; wait(0.025); // 25ms, Wait is required in this mode - } - if (iFunctionCallCounting >= 10) //10번의 측정이 끝나면, + + + + +// if (iFunctionCallCounting >= 10) //10번의 측정이 끝나면, +// if (iFunctionCallCounting >= 8) //8번의 측정이 끝나면, 180703 온도 0도 표현시 버그 발생.. + if (iFunctionCallCounting >= 1) //180718 HJM : 테스트 중... { isTimerInterruptStarted = true; // printf("if in!!\n"); @@ -502,6 +585,11 @@ */ static int SendData(SimpleSpirit1& myspirit) { +// ++iMainCounting; +// printf("iMainCounting : %d\n", iMainCounting); +// ++iIsResetStartCountingInterrupt; + + isTempOk = false; #ifdef CUBEBITE_DEBUG printf("=========================================\n"); #endif //CUBEBITE_DEBUG @@ -511,12 +599,18 @@ #endif //CUBEBITE_DEBUG int iRet; + +// while(1 == myspirit.channel_clear()); while(myspirit.is_receiving()); /* wait for ongoing RX ends 180110 HJM 아마 이 전에 보내던 거 마저 다 보내려고 하는 거 같다. */ + + + size_t curr_len = strlen((const char*)uiSendBuf) + 1; // printf("curr_len : [%d]\n", curr_len); + iRet = myspirit.send(uiSendBuf, curr_len); @@ -525,28 +619,46 @@ { uiSendBuf[iTemp] = 0; } - -// static uint8_t uiRFSpeedTestSendBuf[MAX_BUFFER_LEN] = { 0, }; //70 Byte //성공 - -// sprintf((char *)uiRFSpeedTestSendBuf, "%f@%f@%f@%f@%f", G_x, G_y, G_z, Output, TempData); //HJM : 데이터 파싱 용 -// sprintf((char *)uiRFSpeedTestSendBuf, "%.2f@%.2f@%.2f@%.2lf@%.2f@%d", G_x, G_y, G_z, dVibOutputSqrt, TempData, CUBEBITE_SENSOR_UUID); //HJM : 데이터 파싱 용 -// printf("%.2f@%.2f@%.2f@%.2lf@%.2f@%d\n\n", G_x, G_y, G_z, dVibOutputSqrt, TempData, CUBEBITE_SENSOR_UUID); +#ifdef DEBUG_PRINT_SEND + printf("iIsResetStartCounting : %d\n", iIsResetStartCounting); +#endif //DEBUG_PRINT_COLD_TEST + if (10 < iIsResetStartCounting) + {//HJM : 아예 뻗으면 하드웨어 리셋으로 + iIsResetStartCounting = 0; + //180709 HJM : 하드웨어 리셋이 아니고 SPIRIT1 만 리셋하는 걸로 수정 + resetHW.write(RESET_HW_ON); - //서버 에서 split 처리 시, 아래와 같음. - //0 -> 진동 x 축 값 - //1 -> 진동 y 축 값 - //2 -> 진동 z 축 값 - //3 -> 온도 값 - // - -// iRet = myspirit.send(uiSendBuf, curr_len); + return RADIO_TX_ERR_RESET; + } + + if (iRet == RADIO_TX_OK) { + iIsResetStartCounting = 0; return RADIO_TX_OK; } else if (iRet == RADIO_TX_ERR) { - return RADIO_TX_ERR; + iRet = myspirit.off(); + if (RETURN_ERROR_NUMBER == iRet) + { + resetHW.write(RESET_HW_ON); + } + + iRet = myspirit.on(); + if (RETURN_ERROR_NUMBER == iRet) + { + resetHW.write(RESET_HW_ON); + } + + //HJM : 테스트 !!, +// while(1 == myspirit.channel_clear()); + ++iIsResetStartCounting; + return RADIO_TX_ERR; + } + else if (iRet == RETURN_ERROR_NUMBER) + { + resetHW.write(RESET_HW_ON); } else if (iRet == RADIO_TX_COLLISION) { @@ -554,15 +666,31 @@ } else if (iRet == RADIO_TX_NOACK) { + ++iIsResetStartCounting; return RADIO_TX_NOACK; } else if (iRet == RADIO_TX_ERR_RESET) { - printf("RADIO_TX_ERR_RESET return.\n"); -// myspirit.off(); + printf("RADIO_TX_ERR_RESET return.\n"); + ++iIsResetStartCounting; + + //소프트웨어 리셋 myspirit.reset_board(); - myspirit.off(); - myspirit.on(); + iRet = myspirit.off(); + if (RETURN_ERROR_NUMBER == iRet) + { + resetHW.write(RESET_HW_ON); + } + + iRet = myspirit.on(); + if (RETURN_ERROR_NUMBER == iRet) + { + resetHW.write(RESET_HW_ON); + } + + //180703 HJM : 하드웨어 리셋으로 바꿈 +// resetHW.write(SPIRIT1_POWER_OFF); + return RADIO_TX_ERR_RESET; } dataCount = 0; @@ -571,7 +699,10 @@ { uiSendBuf[iTemp] = 0; } - + + + + #ifdef CUBEBITE_DEBUG printf("[CUBEBITE] SendData() 호출 끝.\n");