180622 HJM : 10 Count sensing data RF send

Dependencies:   1_cubebite_ev-cog-ad3029lz_433MHz_1nd_certTest stm-spirit1-rf-driver_for_cubebite2

main.cpp

Committer:
jmhong
Date:
2018-06-22
Revision:
1:04f46755f8af
Parent:
0:c2a57b2f934e
Child:
2:8861d01a78e4

File content as of revision 1:04f46755f8af:

//HJM : 선풍기 에이징 테스트 용 소스임.
//180615 HJM : 선풍기 에이징 용 온도 1개 진동 10개 전송용 테스트 임.
//            CUBEBITE_TEMPERATURE_DISABLE  define 값으로 온도 센서 (연결 및 미연결) 시 설정을 할 수 있음.



#include "mbed.h"
#include "ADXL362.h"
#include "SimpleSpirit1.h"
#include "main.h"



//*************************************************************************************
//Define : Test, Compile 
//*************************************************************************************
//#define CUBEBITE_DEBUG
//#define HEAVY_DEBUG


/* 180108 cubebite HJM : cubebite Testing define, 1개씩만 켜야 함. */
#define CUBEBITE_RF_SPEED_TEST_SEND_ON
//#define CUBEBITE_RF_SPEED_TEST_RECV_ON
//#define CUBEBITE_RF_SPEED_TEST_SEND_AND_RECV_ON   //HJM : 추후 만들 예정..

/* 180109 cubebite HJM : cubebite Compile define, 1개씩만 켜야 함. */
#define CUBEBITE_BOARD_AD3029LZ


#define CUBEBITE_RF_SETTING_VALUE_PRINT
//#define CUBEBITE_TEMPERATURE_DISABLE


//180411 HJM : 현재 1~3 까지 3대까지 가능 -> 게이트웨이에서 3대까지만 처리하게끔 되어있
#define CUBEBITE_SENSOR_UUID        1   //180621 HJM : 온도 및 진동 테스트 용
//#define CUBEBITE_SENSOR_UUID        2 //180621 HJM : 철기연 테스트 용
//*************************************************************************************




//HJM : 타이머 인터럽트 테스트 용
#ifdef  CUBEBITE_DEBUG
    DigitalOut led1(LED1);
#endif  




//*************************************************************************************
//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)]


//온도 객체
#ifndef CUBEBITE_TEMPERATURE_DISABLE
I2C i2c(I2C_SDA, I2C_SCL);  //HJM : 테스트 용 임, 서대리님이 클래스 정리해서 줄 예정
#endif

//진동 객체(Accelerometer (mosi, miso, sclk, cs), SPI 1)
ADXL362 adxl362(P1_07, P1_08, P1_06, P1_10); //HJM : 테스트 용 임, 서대리님이 클래스 정리해서 줄 예정

//*************************************************************************************






//*************************************************************************************
//HJM SUDO code : main 사용자 함수 선언
//*************************************************************************************


static void callback_func(int event);   //RF user callback 함수임.
void UserTimerInterrupt(void);          //1초, 타이머 인터럽트 임
int UserTimerInterrupt_Execution(void);
static int SendData(SimpleSpirit1& myspirit);


//*************************************************************************************








//*************************************************************************************
//(테스트용)HJM SUDO code : 전역 변수, 진동, 온도 쪽 테스트용임. 추후 서대리님이 클래스 재 정의시 없어질 예정
//*************************************************************************************




//진동
uint16_t vCnt = 0;
uint8_t iCnt = 0;   

//int16_t x16 = 0;
//int16_t y16 = 0;
//int16_t z16 = 0;
int8_t x8 = 0;
int8_t y8 = 0;
int8_t z8 = 0;


int8_t int8tX8Result = 0;
int8_t int8tY8Result = 0;
int8_t int8tZ8Result = 0;


int16_t temp_x16[3] = {0,};
int16_t temp_y16[3] = {0,};
int16_t temp_z16[3] = {0,};

int Comp1_x = 0, Comp2_x = 0;
int Comp1_y = 0, Comp2_y = 0;
int Comp1_z = 0, Comp2_z = 0;

float float_x = 0;
float float_y = 0;
float float_z = 0;     

float G_x = 0;
float G_y = 0;
float G_z = 0;

float  Output = 0;

double dVibOutputSqrt = 0;


//온도
char wReg[2] = {0,};
char rReg[2] = {0,};
int wACK = 0;
int rACK = 0;
int16_t Tem16;
float TempData = 0;

#define busAddr 0x4F

#define ID_DATA_ADDR 0x00
#define ID_CON_ADDR 0x01
#define ID_REG_ADDR 0x07


//RF->이거도 클래스 내부에 넣기
static volatile bool bRxDoneFlag = false; 
static volatile bool bTxDoneFlag = false; 
static volatile bool bSendDataFlag = false;

//*************************************************************************************









//HJM : I2C PullUp 용.. RF IRQ 도 이 핀 이지만 사용안하기 때문에 괜찮음.
DigitalOut TempSupply(P1_12);

bool iTempFlag = false;
bool isTimerInterruptStarted = false;
bool bIs1SecTimerSet = false;
int iTempInitCount = 0;
bool isTempInitOk = false;
int main(void)
{    
//*************************************************************************************
//HJM SUDO code : 진동, 온도, RF 초기화
//*************************************************************************************    
    
    //필수!!!
    TempSupply.write(1);
    
    
    //진동 init_시작
        // set up SPI interface
    adxl362.init_spi();
        // Set up accelerometer
    adxl362.init_adxl362();
    
    wait_ms(25);
    //진동 init_끝
    
    
    //온도 init_시작    
        //Power supply for the sensor is given from GPIO28(VDD_MCU_B).
    
#ifndef CUBEBITE_TEMPERATURE_DISABLE
    i2c.frequency(100000);
#endif
    
        // JMOD Init
#ifndef CUBEBITE_TEMPERATURE_DISABLE        
    wReg[0] = ID_CON_ADDR;
    
    while(rReg[0] != 0x03)
    {
        //write 0x00(ID_CON_ADDR) 
        wReg[1] = 0x00;
        wACK = i2c.write(busAddr, wReg, 2);

        //read 0x00(ID_CON_ADDR) 
        wACK = i2c.write(busAddr, wReg, 1);
        rACK = i2c.read(busAddr, rReg, 1);
    
        wait_ms(250);     
        
        //write 0x03(ID_CON_ADDR) 
        wReg[1] = 0x03;
        wACK = i2c.write(busAddr, wReg, 2);

        //read 0x03(ID_CON_ADDR) 
        wACK = i2c.write(busAddr, wReg, 1);
        rACK = i2c.read(busAddr, rReg, 1);
    
        i2c.write(busAddr, wReg, 2);

        if(rReg[0] == 0x03)
        {
            printf(" (Success!!)\n\n");

            //write 0x00(ID_CON_ADDR) 
            wReg[1] = 0x00;
            wACK = i2c.write(busAddr, wReg, 2);
            isTempInitOk = true;
            wait_ms(250);     
        }
        else if (3 == iTempInitCount)
        {
            isTempInitOk = false;
            break;
        }
        else
        {
            printf(".");
            ++iTempInitCount;
        }
        
        wait_ms(500);           
    }
#endif    
    //온도 init_끝
    
    
    
    //RF init_시작    
    myspirit.attach_irq_callback(callback_func);      
    if (myspirit.on())
    {
        printf("ERROR.\n");        
    }
    else
    {
        printf("OK.\n"); 
    }    
    //RF init_끝
//*************************************************************************************    
    
    
    
//*************************************************************************************
//HJM SUDO code : 1초 타이머 인터럽트 생성, 1초 간격 호출 함수 : UserTimerInterrupt()
//*************************************************************************************
//    Timeout timeoutUserInterrupt;                         //1번만 실행
//    Ticker timeoutUserInterrupt;                            //매번 실행
//    timeoutUserInterrupt.attach(&UserTimerInterrupt, 1.0); //1 sec 
//    timeoutUserInterrupt.attach(&UserTimerInterrupt, 3.0); //3 sec 
//*************************************************************************************
    
    wait(1);
    
    
    while(1)
    {
        __WFE();    //HJM : sleep 모드 ON                
        
        UserTimerInterrupt_Execution();
        if (true == isTimerInterruptStarted)
        {            
            isTimerInterruptStarted = false;
            SendData(myspirit);                                                    
        }        
    }


//    return 0; //unreachable
}

static void callback_func(int event) 
{
#ifdef  CUBEBITE_DEBUG
    printf("[CUBEBITE] callback_func(int event) \n");
#endif

  
    if(event == SimpleSpirit1::RX_DONE) 
    {         
        bRxDoneFlag = 1;
    }
    else if (event == SimpleSpirit1::TX_DONE) 
    {  
        bTxDoneFlag = 1;
    }
}



void UserTimerInterrupt(void)
{
//*************************************************************************************
//HJM : 타이머 인터럽트 작동 테스트
//*************************************************************************************    
//180329 HJM : 작동 테스트 완료
#ifdef  CUBEBITE_DEBUG
    led1 = !led1;
#endif

//*************************************************************************************
    
    if (false == bIs1SecTimerSet)
    {
        bIs1SecTimerSet = true;        
    }

    return;    
}


volatile int iFunctionCallCounting = 0;
int UserTimerInterrupt_Execution(void)
{
//    printf("UserTimerInterrupt_Execution 호출, dataCount : [%d]\n", dataCount);
    ++iFunctionCallCounting;
    
    if (false == isTimerInterruptStarted)
    {
        //진동    
        adxl362.ACC_GetXYZ8(&x8, &y8, &z8);        
        
        if (0 == x8)
        {
            uiSendBuf[dataCount++] = '0';
            uiSendBuf[dataCount++] = 'x';
            uiSendBuf[dataCount++] = '@';            
        }
        else
        {
            int8tX8Result = x8;
                                    
            uiSendBuf[dataCount++] = (uint8_t)int8tX8Result;            
        }
        
        if (0 == y8)
        {
            uiSendBuf[dataCount++] = '0';
            uiSendBuf[dataCount++] = 'y';
            uiSendBuf[dataCount++] = '@';
        }
        else
        {
            int8tY8Result = y8;   
            
            uiSendBuf[dataCount++] = (uint8_t)int8tY8Result; 
        }
        
        if (0 == z8)
        {
            uiSendBuf[dataCount++] = '0';
            uiSendBuf[dataCount++] = 'z';
            uiSendBuf[dataCount++] = '@';
        }                      
        else
        {
            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
    
        //온도     
    //        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;
            
            if (0 == rReg[0])
            {            
                uiSendBuf[dataCount++] = '0';            
    //            uiSendBuf[dataCount++] = '1';            
            }
            else
            {
                uiSendBuf[dataCount++] = (uint8_t)rReg[0];    
            }
            
            if (0 == rReg[1])
            {
                uiSendBuf[dataCount++] = '0';            
    //            uiSendBuf[dataCount++] = '2';            
            }
            else
            {
                uiSendBuf[dataCount++] = (uint8_t)rReg[1];            
            }
        }
        else
        {
            uiSendBuf[dataCount++] = '0';
            uiSendBuf[dataCount++] = '0';
        }
        

#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번의 측정이 끝나면,
    {
        isTimerInterruptStarted = true;
//        printf("if in!!\n");
        
        uiSendBuf[dataCount++] = '*';        
        uiSendBuf[dataCount++] = '*';
        
        uiSendBuf[dataCount] = CUBEBITE_SENSOR_UUID;
                           
        iFunctionCallCounting = 0;
    }  
    
    return 0;
}















/**
 * @brief  SendData
 * @param  None
 * @retval None
 */
static int SendData(SimpleSpirit1& myspirit)
{
#ifdef  CUBEBITE_DEBUG
    printf("=========================================\n");
#endif  //CUBEBITE_DEBUG    

#ifdef  CUBEBITE_DEBUG
    printf("[CUBEBITE] SendData() 호출 됨.\n");
#endif  //CUBEBITE_DEBUG    
    
    int iRet;
    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);
    
    
    dataCount = 0;    
    for (int iTemp = 0; iTemp < TEST_STR_LEN; ++iTemp)
    {
        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);

    //서버 에서 split 처리 시, 아래와 같음.
    //0 -> 진동 x 축 값
    //1 -> 진동 y 축 값
    //2 -> 진동 z 축 값
    //3 -> 온도 값
    //
 
//    iRet = myspirit.send(uiSendBuf, curr_len);
    if (iRet == RADIO_TX_OK)
    {
        return RADIO_TX_OK;
    }
    else if (iRet == RADIO_TX_ERR)
    {
        return RADIO_TX_ERR;
    }
    else if (iRet == RADIO_TX_COLLISION)
    {     
        return RADIO_TX_COLLISION;
    }
    else if (iRet == RADIO_TX_NOACK)
    {
        return RADIO_TX_NOACK;              
    }
    else if (iRet == RADIO_TX_ERR_RESET)
    {
        printf("RADIO_TX_ERR_RESET return.\n");
//        myspirit.off();
        myspirit.reset_board();
        myspirit.off();
        myspirit.on();
    }
    
    dataCount = 0;
    
    for (int iTemp = 0; iTemp < TEST_STR_LEN; ++iTemp)
    {
        uiSendBuf[iTemp] = 0;
    }
        
    
#ifdef  CUBEBITE_DEBUG
    printf("[CUBEBITE] SendData() 호출 끝.\n");
#endif

    return -10;
}