Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: ADXL362_bugFix stm-spirit1-rf-driver_for_cubebite
Fork of cubebite_rnd_ev-cog-ad3029lz_433MHz_2nd_testing2_RF10CountSensingCheckOK_180619_initReviseTest by
Revision 2:b87c19873d46, committed 2018-09-20
- Comitter:
- jmhong
- Date:
- Thu Sep 20 06:36:52 2018 +0000
- Parent:
- 1:04f46755f8af
- Commit message:
- 10 sensing data and adxl bug fix
Changed in this revision
--- a/ADXL362.lib Fri Jun 22 03:43:49 2018 +0000 +++ b/ADXL362.lib Thu Sep 20 06:36:52 2018 +0000 @@ -1,1 +1,1 @@ -https://os.mbed.com/users/jmhong/code/ADXL362/#bf56b783747e +https://os.mbed.com/users/jmhong/code/ADXL362_bugFix/#e484040b8f84
--- 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");
--- a/stm-spirit1-rf-driver_for_cubebite.lib Fri Jun 22 03:43:49 2018 +0000 +++ b/stm-spirit1-rf-driver_for_cubebite.lib Thu Sep 20 06:36:52 2018 +0000 @@ -1,1 +1,1 @@ -https://os.mbed.com/users/jmhong/code/EV-COG-AD3029LZ/#45b9ff78a066 +https://os.mbed.com/users/jmhong/code/stm-spirit1-rf-driver_for_cubebite/#38de5ee78824
