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.
Fork of HelloWorld_IDS01A4 by
main.cpp
- Committer:
- jmhong
- Date:
- 2018-01-12
- Revision:
- 11:f8396aa48de6
- Parent:
- 10:cc81b87e005e
- Child:
- 12:5e20115bd13b
File content as of revision 11:f8396aa48de6:
/**
******************************************************************************
* @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>
*
******************************************************************************
*/
//*************************************************************************************
//Include
//*************************************************************************************
#include "mbed.h"
#include "SimpleSpirit1.h"
//*************************************************************************************
//*************************************************************************************
//Define : Debug
//*************************************************************************************
/* 180108 cubebite HJM : SimpleSpirit1 Debug define */
#define NDEBUG
#define HEAVY_DEBUG
/* 180108 cubebite HJM : cubebite Debug define */
//#define CUBEBITE_DEBUG
//*************************************************************************************
//*************************************************************************************
//Define : Test, Compile
//*************************************************************************************
/* 180108 cubebite HJM : cubebite Testing define, 1개씩만 켜야 함. */
//#define CUBEBITE_RF_USER_BUTTON_SEND_TEST
//#define CUBEBITE_RF_DEVICE_PARTNUMBER_TEST
//#define CUBEBITE_RF_GPIO_0_TEST
#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
//*************************************************************************************
//*************************************************************************************
//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
#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
#endif
//*************************************************************************************
//*************************************************************************************
//Global variable : LEDs and user buttons by board
//*************************************************************************************
#ifdef CUBEBITE_BOARD_F401RE
static DigitalOut TestLED(D5); /* LED of IDS01A4/5 */
#endif
#ifdef CUBEBITE_BOARD_F746ZG
static DigitalOut TestLED(PB_0); /* LED of IDS01A4/5 */
#endif
#ifdef CUBEBITE_RF_USER_BUTTON_SEND_TEST
static InterruptIn event(USER_BUTTON); /* Interrupt event to give userinterface to send pkt. */
#endif
//*************************************************************************************
//*************************************************************************************
//Global variable : Rf Send, read Buffer
//*************************************************************************************
/* 180108 cubebite HJM : send testing, orignal code */
#define TEST_STR_LEN (32)
static uint8_t send_buf[TEST_STR_LEN] ={'S','P','I','R','I','T','1',' ','H','E','L','L','O',' ','W','O','R','L','D',' ','P','2','P',' ','D','E','M','O'};
static uint8_t read_buf[TEST_STR_LEN] ={'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'};
//*************************************************************************************
//*************************************************************************************
//Global variable : tx, rx Flag
//*************************************************************************************
static volatile bool rx_done_flag = false;
static volatile bool tx_done_flag = false;
static volatile bool send_data_flag = false;
//*************************************************************************************
//*************************************************************************************
//Global variable : Testing
//*************************************************************************************
/* Test : GPIO 0 */
#ifdef CUBEBITE_RF_GPIO_0_TEST
#ifdef CUBEBITE_BOARD_F401RE
/* 180108 cubebite HJM : F401re borad, PC_1 == RF_MODULE_GPIO 0, Testing code */
static DigitalIn RF_GPIO_0_INPUT(PC_1); //F401re borad
//static DigitalIn RF_GPIO_3_INPUT(PA_0); //F401re borad, 사용시, send 정상 동작 안함, Spirit1 IRQ 핀이랑 같이 물려있기 때문
#endif
#endif
#ifdef CUBEBITE_RF_GPIO_0_TEST
#ifdef CUBEBITE_BOARD_F746ZG
/* 180108 cubebite HJM : F746zg borad, PC_1 == RF_MODULE_GPIO 0, Testing code */
static DigitalIn RF_GPIO_0_INPUT(PF_5); //F746zg borad
//static DigitalIn RF_GPIO_3_INPUT(PA_3); //F746zg borad, 사용시, send 정상 동작 안함, Spirit1 IRQ 핀이랑 같이 물려있기 때문
#endif
#endif
/* Test : RF Speed Test */
#ifdef CUBEBITE_RF_SPEED_TEST_SEND_ON
static clock_t clockRfSpeedTestStart, clockRfSpeedTestEnd;
static float fRfSpeedTestResult;
static bool bIsSendFirstClockFunctionStarted = false;
static bool bIsSetSendFlag = false;
#endif
#ifdef CUBEBITE_RF_SPEED_TEST_RECV_ON
#define TEST_ACK_STR_LEN (6)
static uint8_t send_ack_buf[TEST_ACK_STR_LEN] ={'O','K'};
size_t curr_ack_len = strlen((const char*)send_ack_buf) + 1;
static bool bIsAckSended = false;
#endif
//*************************************************************************************
/**
* @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)
{
rx_done_flag = 1;
}
else if (event == SimpleSpirit1::TX_DONE)
{
tx_done_flag = 1;
}
}
/**
* @brief set_send_data_flag
* @param None
* @retval None
*/
static void set_send_data_flag(void)
{
send_data_flag = 1 ;
}
/**
* @brief send_data
* @param None
* @retval None
*/
static void send_data(void)
{
#ifdef CUBEBITE_DEBUG
printf("[CUBEBITE] send_data() 호출 됨.\n");
printf("[CUBEBITE] myspirit, is_receiving()\t......");
#endif
while(myspirit.is_receiving()); /* wait for ongoing RX ends 180110 HJM 아마 이 전에 보내던 거 마저 다 보내려고 하는 거 같다. */
#ifdef CUBEBITE_DEBUG
printf("OK\n");
#endif
size_t curr_len = strlen((const char*)send_buf) + 1;
int iRet = 0;
#ifdef CUBEBITE_DEBUG
printf("[CUBEBITE] myspirit, send()\t......");
#endif
iRet = myspirit.send(send_buf, curr_len);
if (iRet == RADIO_TX_OK)
{
#ifdef CUBEBITE_DEBUG
printf("[RADIO_TX_OK]\n");
#endif
#ifdef CUBEBITE_RF_SPEED_TEST_SEND_ON
#ifdef CUBEBITE_BOARD_F401RE
if (false == bIsSendFirstClockFunctionStarted)
{
clockRfSpeedTestStart = clock();
bIsSendFirstClockFunctionStarted = true;
}
#endif
#endif
}
else if (iRet == RADIO_TX_ERR)
{
#ifdef CUBEBITE_DEBUG
printf("[RADIO_TX_ERR]\n");
#endif
}
else if (iRet == RADIO_TX_COLLISION)
{
#ifdef CUBEBITE_DEBUG
printf("[RADIO_TX_COLLISION]\n");
#endif
}
else if (iRet == RADIO_TX_NOACK)
{
#ifdef CUBEBITE_DEBUG
printf("[RADIO_TX_NOACK]\n");
#endif
}
#ifdef CUBEBITE_DEBUG
printf("[CUBEBITE] send_data() 호출 끝.\n");
#endif
}
/**
* @brief read_rcvd_data
* @param None
* @retval None
*/
static void read_rcvd_data(void)
{
#ifdef CUBEBITE_DEBUG
printf("[CUBEBITE] read_rcvd_data() 호출 됨. \n");
#endif
for(unsigned int flush_count = 0; flush_count < TEST_STR_LEN; flush_count++) read_buf[flush_count] = 0 ;/* clear the read buffer */
int ret = myspirit.read(read_buf, sizeof(read_buf));
if (ret == 0)
{
printf("[CUBEBITE] Read() Error : Nothing to read\n");
return;
}
#ifdef CUBEBITE_RF_SPEED_TEST_RECV_ON
ret = strcmp((const char *)read_buf, (const char *)send_buf);
if (0 == ret)
{
printf("read, send buf collect!!\n");
TestLED = !TestLED; /* Toggle LED at the receiver */
// bIsAckSended = true;
//746zg 보드
int iRet = myspirit.send(send_ack_buf, curr_ack_len);
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
}
}
#endif
#ifdef CUBEBITE_RF_SPEED_TEST_SEND_ON
//401re 보드
if (true == bIsSendFirstClockFunctionStarted)
{
clockRfSpeedTestEnd = clock();
}
#endif
#ifdef CUBEBITE_DEBUG
printf("[CUBEBITE] read_rcvd_data() 호출 끝. \n");
#endif
}
static void ack_send_data(void)
{
#ifdef CUBEBITE_RF_SPEED_TEST_RECV_ON
//746zg 보드
int iRet = myspirit.send(send_ack_buf, curr_ack_len);
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
}
#endif
}
/**
* @brief main routine
* @param None
* @retval int
*/
int main()
{
/* LED off */
TestLED = 0;
/* 180108 cubebite HJM : function return value print */
int iRet = 0;
#ifdef CUBEBITE_RF_GPIO_0_TEST
/* 180108 cubebite HJM : GPIO 0, init code */
SGpioInit gpioIRQ={
SPIRIT_GPIO_0,
SPIRIT_GPIO_MODE_DIGITAL_OUTPUT_LP,
SPIRIT_GPIO_DIG_OUT_IRQ
};
SpiritGpioInit(&gpioIRQ);
/* 180108 cubebite HJM : GPIO 0, For spiritFunctionalState(), Testing code */
SpiritFunctionalState spiritFunctionalState={
S_DISABLE
};
#endif
/* 180108 cubebite HJM : spirit module, init code */
printf("[CUBEBITE] myspirit, attach_irq_callback()\t......");
myspirit.attach_irq_callback(callback_func);
printf("OK\n");
printf("[CUBEBITE] myspirit, on()\t......");
iRet = myspirit.on();
if ( 0 == iRet )
{
printf("OK\n");
}
else
{
printf("ERROR\n");
}
#ifdef CUBEBITE_DEBUG
printf("[CUBEBITE] CUBEBITE_DEBUG ON. \n");
#endif
#ifdef CUBEBITE_RF_USER_BUTTON_SEND_TEST
event.rise(&set_send_data_flag); /*User button interrupt trigger to set send data flag */
#endif
#ifdef CUBEBITE_RF_DEVICE_PARTNUMBER_TEST
uint16_t int16SpiritPartNum = 0;
#endif
while(1)
{
#ifdef CUBEBITE_RF_DEVICE_PARTNUMBER_TEST
printf("[CUBEBITE][devicePartNumber] SpiritGeneralGetDevicePartNumber()\t......");
int16SpiritPartNum = SpiritGeneralGetDevicePartNumber();
printf("OK => ");
printf("int16SpiritPartNum value : [0x%04X]\n", int16SpiritPartNum);
int16SpiritPartNum = 0;
#endif
/* low power in idle condition., waiting for an event */
__WFE();
#ifdef CUBEBITE_RF_GPIO_0_TEST
//180108 HJM : For spiritFunctionalState(), testing code
if (S_ENABLE == spiritFunctionalState)
{
spiritFunctionalState = S_DISABLE;
}
else
{
spiritFunctionalState = S_ENABLE;
}
/* 180108 cubebite HJM : GPIO 0, For, spiritFunctionalState() => Enables or Disables the output of temperature sensor on SPIRIT GPIO_0. */
SpiritGpioTemperatureSensor(spiritFunctionalState);
/* 180108 cubebite HJM : RF_GPIO_0_INPUT pin value print */
printf("****** RF GPIO_0 Status Testing => [%d] ******\n", (int)RF_GPIO_0_INPUT);
wait(1);
#endif
#ifdef CUBEBITE_RF_SPEED_TEST_SEND_ON
if (true == bIsSetSendFlag)
{
set_send_data_flag();
bIsSetSendFlag = false;
}
#endif
if(rx_done_flag)
{
rx_done_flag = false;
read_rcvd_data();
printf("recvedd.\n");
#ifdef CUBEBITE_RF_SPEED_TEST_SEND_ON
if (true == bIsSendFirstClockFunctionStarted)
{
fRfSpeedTestResult = (float)(clockRfSpeedTestEnd - clockRfSpeedTestStart)/CLOCKS_PER_SEC;
printf("\n Clock Rf Speed Test : [%.9f(sec)] \n", fRfSpeedTestResult);
bIsSendFirstClockFunctionStarted = false;
}
#endif
}
else if (send_data_flag)
{
#ifdef CUBEBITE_RF_SPEED_TEST_SEND_ON
//180112 HJM : Ack 응답 올 때 까지의 Timeout.
// wait(0.1); //100ms, 정상 동작, 오류 없음. (5분 테스트)
// wait(0.06); //60ms, 정상 동작, 오류 없음. (5분 테스트)
wait(0.05); // 50ms, 정상 동작, 오류 없음. (10분 테스트)
// wait(0.01); // 10ms, 정상 동작.
// wait(0.008); // 8ms, 정상 동작, 하지만 0.01 이 최대 속도값으로 보임.
// wait(0.005); // 5ms, 정상 동작, 하지만 0.01 이 최대 속도값으로 보임, 하지만 Nothing to read 오류가 많이 뜸. (20분 테스트)
// wait(0.00001); // 0.01ms, 비 정상 동작. (30분 테스트)
#endif
send_data_flag = false;
send_data();
printf("sended.\n");
}
else if (tx_done_flag)
{
tx_done_flag = false;
// printf("\n***Packet sent ***\nSent string ='%s' (len=%d)\n", send_buf, strlen((const char*)send_buf) + 1);
}
#ifdef CUBEBITE_RF_SPEED_TEST_RECV_ON
//180112 HJM 오후 1시, 현재 사용 안하는 중, recv 쪽에서 strcmp로 보낸 데이터와 받은 데이터 비교 후, send 를 바로 하는 코드로 바꿨음.
else if (true == bIsAckSended)
{
bIsAckSended = false;
ack_send_data();
printf("recv sended.\n");
}
#endif
}
/* unreachable */
// myspirit.off();
// return 0;
}
