Cubebite Publish
Fork of HelloWorld_IDS01A4 by
main.cpp
- Committer:
- jmhong
- Date:
- 2018-02-13
- Revision:
- 14:1a6faeda6579
- Parent:
- 13:d802c6ed2e75
File content as of revision 14:1a6faeda6579:
/**
******************************************************************************
* @file main.cpp
* @author JMHong, Cubebite
* @version V1.0.0
* @date June 19th, 2018
* @brief mbed test application for the STMicroelectronics X-NUCLEO-IDB01A4/5
* Spirit1 Module(SPSGRFC-433)
******************************************************************************
* @attention
*
* <h2><center>© COPYRIGHT(c) 2018 Cubebite</center></h2>
*
******************************************************************************
*/
//*************************************************************************************
//Define : Test, Compile
//*************************************************************************************
/* 180108 cubebite HJM : cubebite Testing define, 1개씩만 켜야 함. */
#define CUBEBITE_RF_SPEED_TEST_SEND_ON
//#define CUBEBITE_RF_SPEED_TEST_RECV_ON
/* 180109 cubebite HJM : cubebite Compile define, 1개씩만 켜야 함. */
//#define CUBEBITE_BOARD_F746ZG
#define CUBEBITE_BOARD_F401RE
#define CUBEBITE_RF_SETTING_VALUE_PRINT
//*************************************************************************************
//*************************************************************************************
//Define : Debug
//*************************************************************************************
/* 180108 cubebite HJM : SimpleSpirit1 Debug define */
#define NDEBUG
#define HEAVY_DEBUG
#define DEBUG_IRQ
/* 180108 cubebite HJM : cubebite Debug define */
//#define CUBEBITE_DEBUG
//*************************************************************************************
//*************************************************************************************
//Include
//*************************************************************************************
#ifndef __MAIN_H__
#define __MAIN_H__
#include "main.h"
#endif //__MAIN_H__
//*************************************************************************************
enum RecvReturnValue
{
CUBEBITE_RECV_OK = 0, CUBEBITE_RECV_ERROR_READ_NOTHING, CUBEBITE_RECV_ERROR_READ_NOT_MATCH
};
enum SendReturnValue
{
CUBEBITE_SEND_OK = 0, CUBEBITE_SEND_ERROR, CUBEBITE_SEND_COLLISION, CUBEBITE_SEND_NOACK, CUBEBITE_SEND_ERROR_UNKNOWN
};
static void callback_func(int event);
static int ReadRcvdData(SimpleSpirit1& myspirit);
static int ReadRcvdData_ClockMeasure_AckEnd(SimpleSpirit1& myspirit);
static int SendData(SimpleSpirit1& myspirit);
static int SendData_ClockMeasure_AckStart(SimpleSpirit1& myspirit);
/*
<RF 설정 값>
황무지 -> 전파
고속도로 -> 주파수
차선 -> 채널
#define POWER_DBM 11.6
#define CHANNEL_SPACE 100e3
#define FREQ_DEVIATION 20e3
#define BANDWIDTH 100.5e3
#define MODULATION_SELECT GFSK_BT1
#define DATARATE 38400
#define XTAL_OFFSET_PPM 0
#define SYNC_WORD 0x88888888
#define LENGTH_WIDTH 8 // betzw - NOTE: only 255 bytes for payload!!!
#define CRC_MODE PKT_CRC_MODE_16BITS_2
#define EN_WHITENING S_DISABLE
#define INFINITE_TIMEOUT 0.0
#define BASE_FREQUENCY 433.0e6
*/
/**
* @brief main routine
* @param None
* @retval int
*/
int main()
{
/* 180108 cubebite HJM : function return value print */
int iReturn = 0;
//*************************************************************************************
//Global variable : Create an instance by board
//*************************************************************************************
/* 180108 cubebite HJM : orignal code, backup */
//static SimpleSpirit1 &myspirit = SimpleSpirit1::CreateInstance(D11, D12, D3, D9, D10, D2); /* (SPI_CLK) = (D13:PA5:resistorR7 --> D3:PB3:resistorR4)*/
#ifdef CUBEBITE_BOARD_F401RE
/* 180108 cubebite HJM : F401re borad, AnalogIn PIN Info, A0(PA_0) A1(PA_1) A2(PA_4) A3(PB_0) A4(PC_1) A5(PC_0) */
/* RF Module 과 상관 관계 => A0(PA_0)[SPI GPIO 3] A1(PA_1)[CSN] A2(PA_4)[SPI1 GPIO 2] A3(PB_0)[SPI1 GPIO 1] A4(PC_1)[SPI1_GPIO 0] */
/* 180108 cubebite HJM : F401re borad Init code */
//static SimpleSpirit1 &myspirit = SimpleSpirit1::CreateInstance(PA_7, PA_6, PA_5, PC_7, PB_6, PA_10); //F401re borad
static SimpleSpirit1 &myspirit = SimpleSpirit1::CreateInstance(PA_7, PA_6, PA_5, PA_0, PB_6, PA_10); //F401re borad, IRQ Testing, GPIO 3 -> IRQ
//static SimpleSpirit1 &myspirit = SimpleSpirit1::CreateInstance_RSSI_negative_OneHundredTwenty(PA_7, PA_6, PA_5, PA_0, PB_6, PA_10); //F401re borad, IRQ Testing, GPIO 3 -> IRQ
#endif
#ifdef CUBEBITE_BOARD_F746ZG
/* 180108 cubebite HJM : F746zg borad, AnalogIn PIN Info, A0(PA_3) A1(PC_0) A2(PC_3) A3(PF_3) A4(PF_5) A5(PF_10) */
/* RF Module 과 상관 관계 => A0(PA_3)[SPI GPIO 3] A1(PC_0)[CSN] A2(PC_3)[SPI1 GPIO 2] A3(PF_3)[SPI1 GPIO 1] A4(PF_5)[SPI1_GPIO 0] */
/* 180108 cubebite HJM : F746zg borad Init code */
//static SimpleSpirit1 &myspirit = SimpleSpirit1::CreateInstance(PB_5, PB_4, PB_3, PD_14, PD_5, PD_6); //F746zg borad
static SimpleSpirit1 &myspirit = SimpleSpirit1::CreateInstance(PB_5, PB_4, PB_3, PA_3, PD_5, PD_6); //F746zg borad, IRQ Testing, GPIO 3 -> IRQ
//static SimpleSpirit1 &myspirit2 = SimpleSpirit1::CreateInstance2(PB_5, PB_4, PB_3, PA_3, PD_5, PD_6); //F746zg borad, IRQ Testing, GPIO 3 -> IRQ
#endif
//*************************************************************************************
/* 180108 cubebite HJM : spirit module, init code */
printf("[CUBEBITE] Init ");
/* LED off */
TestLED = 0;
myspirit.attach_irq_callback(callback_func);
iReturn = myspirit.on();
if ( 0 == iReturn )
{
printf("OK.\n");
}
else
{
printf("ERROR.\n");
}
#ifdef CUBEBITE_DEBUG
printf("[CUBEBITE] CUBEBITE_DEBUG ON. \n");
#endif //CUBEBITE_DEBUG
#ifdef CUBEBITE_RF_SETTING_VALUE_PRINT
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 CUBEBITE_RF_SPEED_TEST_SEND_ON
// printf("\nOutput Power(dBm) : [%f]\n", POWER_DBM);
printf("\nOutput Power(dBm) : [%f]\n", (float)CUBEBITE_OUTPUT_POWER_DBM_TEST);
#endif //CUBEBITE_RF_SPEED_TEST_SEND_ON
#ifdef CUBEBITE_RF_SPEED_TEST_RECV_ON
printf("\nRSSI threshold Setting value : [%d]\n", (int)CCA_THRESHOLD);
#endif //CUBEBITE_RF_SPEED_TEST_RECV_ON
wait(2);
#endif //CUBEBITE_RF_SETTING_VALUE_PRINT
while(1)
{
/* low power in idle condition., waiting for an event */
__WFE();
#ifdef CUBEBITE_RF_SPEED_TEST_SEND_ON
iReturn = SendData(myspirit);
if (CUBEBITE_SEND_OK == iReturn)
{
printf("[DEBUG] send OK.\n");
}
else if (CUBEBITE_SEND_ERROR == iReturn)
{
printf("[DEBUG] send ERROR.\n");
}
iReturn = (int)myspirit.get_last_sqi(); //HJM : LQI, 현재 주변 통신 품질 값, 높을수록 좋은 것.
printf("get_last_sqi() return : [%d]\n", iReturn);
#endif
#ifdef CUBEBITE_RF_SPEED_TEST_RECV_ON
if (bRxDoneFlag)
{
iReturn = ReadRcvdData(myspirit);
if (CUBEBITE_RECV_OK == iReturn)
{
//통신 속도 체크시, 응답 send code.
printf("[DEBUG] recv OK.\n");
float fReturn1 = myspirit.get_last_rssi_dbm();
printf("get_last_rssi_dbm() return : [%f]\n", fReturn1); //HJM : 위의 값과 같을 거라고 예상 됨. 나중에 테스트.
if (-50 < fReturn1) //-80 < fReturn1
{
TestLED3 = !TestLED3; /* Toggle LED at the receiver */
}
else if (-50 >= fReturn1)
{
// TestLED = !TestLED; /* Toggle LED at the receiver */
TestLED2 = !TestLED2; /* Toggle LED at the receiver */
// TestLED3 = !TestLED3; /* Toggle LED at the receiver */
}
else if (-70 >= fReturn1) //-100 >= fReturn1
{
TestLED = !TestLED; /* Toggle LED at the receiver */
}
}
bRxDoneFlag = 0;
}
#endif
}
/* unreachable */
// myspirit.off();
// return 0;
}
/**
* @brief callback_func
* @param callback event
* @retval None.
*/
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;
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//recv
/**
* @brief ReadRcvdData
* @param None
* @retval None
*/
static int ReadRcvdData(SimpleSpirit1& myspirit)
{
#ifdef CUBEBITE_DEBUG
printf("[CUBEBITE] ReadRcvdData() 호출 됨. \n");
#endif
for(unsigned int flush_count = 0; flush_count < TEST_STR_LEN; flush_count++) uiRendBuf[flush_count] = 0 ;/* clear the read buffer */
int ret = myspirit.read(uiRendBuf, sizeof(uiRendBuf));
if (ret == 0)
{
printf("[CUBEBITE] Read() Error : Nothing to read\n");
return CUBEBITE_RECV_ERROR_READ_NOTHING;
}
printf("ReadRcvdData() 1");
printf("[DEBUG]recv -> %s ", uiRendBuf);
ret = strcmp((const char *)uiRendBuf, (const char *)uiSendBuf);
printf(" 3");
if (0 == ret)
{
// set_ack_bSendDataFlag(); //180118 HJM : 다시 바로 보내는 걸로 수정
// printf("read, send buf collect!!\n");
// TestLED = !TestLED; /* Toggle LED at the receiver */
printf(" 4");
// bIsAckSended = true;
// printf("[DEBUG]recv -> %s\n", uiRendBuf);
#ifdef CUBEBITE_DEBUG
printf("[DEBUG]recv -> %s\n", uiRendBuf);
#endif
//746zg 보드
// wait(1.0);
/*
int iRet = myspirit.send(uiSendAckBuf, sizetCurrAckBufLen);
if (iRet == RADIO_TX_OK)
{
#ifdef CUBEBITE_DEBUG
printf("ACK : [RADIO_TX_OK]\n");
#endif
}
else if (iRet == RADIO_TX_ERR)
{
#ifdef CUBEBITE_DEBUG
printf("ACK : [RADIO_TX_ERR]\n");
#endif
}
else if (iRet == RADIO_TX_COLLISION)
{
#ifdef CUBEBITE_DEBUG
printf("ACK : [RADIO_TX_COLLISION]\n");
#endif
}
else if (iRet == RADIO_TX_NOACK)
{
#ifdef CUBEBITE_DEBUG
printf("ACK : [RADIO_TX_NOACK]\n");
#endif
}
*/
return CUBEBITE_RECV_OK;
printf(" 5 ok\n");
}
#ifdef CUBEBITE_DEBUG
printf("[CUBEBITE] ReadRcvdData() 호출 끝. \n");
#endif
return CUBEBITE_RECV_ERROR_READ_NOT_MATCH;
printf(" 6 error\n");
}
static int ReadRcvdData_ClockMeasure_AckEnd(SimpleSpirit1& myspirit)
{
#ifdef CUBEBITE_DEBUG
printf("[CUBEBITE] ReadRcvdData() 호출 됨. \n");
#endif
for(unsigned int flush_count = 0; flush_count < TEST_STR_LEN; flush_count++) uiRendBuf[flush_count] = 0 ;/* clear the read buffer */
int ret = myspirit.read(uiRendBuf, sizeof(uiRendBuf));
if (ret == 0)
{
printf("[CUBEBITE] Read() Error : Nothing to read\n");
return CUBEBITE_RECV_ERROR_READ_NOTHING;
}
#ifdef CUBEBITE_RF_SPEED_TEST_RECV_ON
ret = strcmp((const char *)uiRendBuf, (const char *)uiSendBuf);
if (0 == ret)
{
// set_ack_bSendDataFlag(); //180118 HJM : 다시 바로 보내는 걸로 수정
// printf("read, send buf collect!!\n");
TestLED = !TestLED; /* Toggle LED at the receiver */
// bIsAckSended = true;
#ifdef CUBEBITE_DEBUG
printf("[DEBUG]recv -> %s\n", uiRendBuf);
#endif
//746zg 보드
// wait(1.0);
/*
int iRet = myspirit.send(uiSendAckBuf, sizetCurrAckBufLen);
if (iRet == RADIO_TX_OK)
{
#ifdef CUBEBITE_DEBUG
printf("ACK : [RADIO_TX_OK]\n");
#endif
}
else if (iRet == RADIO_TX_ERR)
{
#ifdef CUBEBITE_DEBUG
printf("ACK : [RADIO_TX_ERR]\n");
#endif
}
else if (iRet == RADIO_TX_COLLISION)
{
#ifdef CUBEBITE_DEBUG
printf("ACK : [RADIO_TX_COLLISION]\n");
#endif
}
else if (iRet == RADIO_TX_NOACK)
{
#ifdef CUBEBITE_DEBUG
printf("ACK : [RADIO_TX_NOACK]\n");
#endif
}
*/
return CUBEBITE_RECV_OK;
}
#endif
#ifdef CUBEBITE_RF_SPEED_TEST_SEND_ON
//401re 보드
if (true == bIsSendFirstClockFunctionStarted)
{
clocktimeRFSpeedTestEnd = clock();
}
//printf("[DEBUG]recv -> %s\n", uiRendBuf);
#endif
#ifdef CUBEBITE_DEBUG
printf("[CUBEBITE] ReadRcvdData() 호출 끝. \n");
#endif
return CUBEBITE_RECV_ERROR_READ_NOT_MATCH;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//send
/**
* @brief SendData
* @param None
* @retval None
*/
static int SendData(SimpleSpirit1& myspirit)
{
#ifdef CUBEBITE_DEBUG
printf("[CUBEBITE] SendData() 호출 됨.\n");
#endif
while(myspirit.is_receiving()); /* wait for ongoing RX ends 180110 HJM 아마 이 전에 보내던 거 마저 다 보내려고 하는 거 같다. */
size_t curr_len = strlen((const char*)uiSendBuf) + 1;
int iRet = 0;
printf("SendData() uiSendBuf -> [%s]\n", uiSendBuf);
iRet = myspirit.send(uiSendBuf, curr_len);
if (iRet == RADIO_TX_OK)
{
#ifdef CUBEBITE_DEBUG
printf("[RADIO_TX_OK]\n");
#endif
return CUBEBITE_SEND_OK;
}
else if (iRet == RADIO_TX_ERR)
{
#ifdef CUBEBITE_DEBUG
printf("[RADIO_TX_ERR]\n");
#endif
return CUBEBITE_SEND_ERROR;
}
else if (iRet == RADIO_TX_COLLISION)
{
#ifdef CUBEBITE_DEBUG
printf("[RADIO_TX_COLLISION]\n");
#endif
return CUBEBITE_SEND_COLLISION;
}
else if (iRet == RADIO_TX_NOACK)
{
#ifdef CUBEBITE_DEBUG
printf("[RADIO_TX_NOACK]\n");
#endif
return CUBEBITE_SEND_NOACK;
}
#ifdef CUBEBITE_DEBUG
printf("[CUBEBITE] SendData() 호출 끝.\n");
#endif
return CUBEBITE_SEND_ERROR_UNKNOWN;
}
static int SendData_ClockMeasure_AckStart(SimpleSpirit1& myspirit)
{
#ifdef CUBEBITE_DEBUG
printf("[CUBEBITE] SendData() 호출 됨.\n");
#endif
while(myspirit.is_receiving()); /* wait for ongoing RX ends 180110 HJM 아마 이 전에 보내던 거 마저 다 보내려고 하는 거 같다. */
size_t curr_len = strlen((const char*)uiSendBuf) + 1;
int iRet = 0;
iRet = myspirit.send(uiSendBuf, curr_len);
if (iRet == RADIO_TX_OK)
{
#ifdef CUBEBITE_DEBUG
printf("[RADIO_TX_OK]\n");
#endif
#ifdef CUBEBITE_RF_SPEED_TEST_SEND_ON
if (false == bIsSendFirstClockFunctionStarted)
{
clocktimeRFSpeedTestStart = clock();
bIsSendFirstClockFunctionStarted = true;
}
#endif
return CUBEBITE_SEND_OK;
}
else if (iRet == RADIO_TX_ERR)
{
#ifdef CUBEBITE_DEBUG
printf("[RADIO_TX_ERR]\n");
#endif
return CUBEBITE_SEND_ERROR;
}
else if (iRet == RADIO_TX_COLLISION)
{
#ifdef CUBEBITE_DEBUG
printf("[RADIO_TX_COLLISION]\n");
#endif
return CUBEBITE_SEND_COLLISION;
}
else if (iRet == RADIO_TX_NOACK)
{
#ifdef CUBEBITE_DEBUG
printf("[RADIO_TX_NOACK]\n");
#endif
return CUBEBITE_SEND_NOACK;
}
#ifdef CUBEBITE_DEBUG
printf("[CUBEBITE] SendData() 호출 끝.\n");
#endif
return CUBEBITE_SEND_ERROR_UNKNOWN;
}
