?? rf_test.c
字號:
while( !stopApplication() ){
YLED = LED_ON;
res = radioSend(&sendBuffer, 1, remoteAddr, DO_ACK);
sendBall(ORIENTED_RIGHT);
YLED = LED_OFF;
if(res == TRUE)
{
res = radioReceive(&buffer, &length, PING_PONG_TIMEOUT,&sender);
}
else
{
res = FALSE;
}
if(res == TRUE)
{
receiveBall(ORIENTED_RIGHT);
GLED = LED_ON;
// lcdUpdateLine(LINE1, "OK!");
lcdUpdate((char *)"OK!", (char *)"");
printRSSI(buffer[length]);
}
else
{
GLED = LED_OFF;
// lcdUpdateLine(LINE1, "Failed...");
lcdUpdate((char *)"Failed...", (char *)"");
waitVisible(CLEARLY_VISIBLE);
}
waitVisible(CLEARLY_VISIBLE);
GLED = LED_OFF;
}
}
/******************************************************************************
* @fn perTestMode
*
* @brief
* Function for performing a packet error rate (PER) test.
*
* Parameters:
*
* @param void
*
* @return void
*
******************************************************************************/
void perTestMode(void)
{
BYTE sendBuffer = PER_TEST_REQUEST;
char number[16];
BYTE* receiveBuffer;
BYTE length;
BYTE res;
BYTE sender;
WORD lastPacketNumber = 0;
WORD thisPacketNumber;
WORD failed = 0;
YLED = LED_ON;
res = radioSend(&sendBuffer, 1, remoteAddr, DO_ACK);
YLED = LED_OFF;
if(res == TRUE)
{
while(lastPacketNumber < PER_TOTAL_PACKET_NUMBER)
{
res = radioReceive(&receiveBuffer, &length, PER_RECEIVE_TIMEOUT, &sender);
if(res == TRUE)
{
thisPacketNumber = *((WORD*) receiveBuffer);
failed += (thisPacketNumber - lastPacketNumber - 1);
lastPacketNumber = thisPacketNumber;
GLED = LED_ON;
}
else
{
GLED = LED_OFF;
failed += (PER_TOTAL_PACKET_NUMBER - lastPacketNumber);
lastPacketNumber = PER_TOTAL_PACKET_NUMBER;
}
}
if((failed == 0) &&(lastPacketNumber != 0))
{
lcdUpdateLine(LINE2,(char *)"Correct!");
}
failed = failed / 10;
sprintf(number, (char *)"PER: %d", failed);
lcdUpdateLine(LINE1,number);
lcdUpdateChar(LINE1, 8, '%');
}
else
{
lcdUpdate((char *)"Node Unreachable",(char *)"");
}
haltApplicationWithLED();
return;
}
/******************************************************************************
* @fn receiveMode
*
* @brief
* Function for receiving data.
*
* Parameters:
*
* @param void
*
* @return void
*
******************************************************************************/
void receiveMode(void)
{
BYTE* receiveBuffer;
BYTE length;
BYTE res;
BYTE sender;
pingPongInit();
while( !stopApplication() )
{
res = radioReceive(&receiveBuffer, &length, RECEIVE_TIMEOUT, &sender);
if(res == TRUE)
{
GLED = LED_ON;
if(*receiveBuffer == PING_PONG_REQUEST)
{
pingPongResponse();
}
else if(*receiveBuffer == PER_TEST_REQUEST)
{
conductPerTest();
}
else
{
printRSSI(receiveBuffer[length]);
showState();
}
}
else
{
lcdUpdate((char *)"Waiting",(char *)"");
GLED = LED_OFF;
}
GLED = LED_OFF;
}
return;
}
/******************************************************************************
* @fn showState
*
* @brief
* Print "Sending" or "Receiving" on LINE1.
*
* Parameters:
*
* @param void
*
* @return void
*
******************************************************************************/
void showState(void)
{
if (RxTxState == SEND){
lcdUpdateLine(LINE1, (char *)"Sending");
}
else{
lcdUpdateLine(LINE1, (char *)"Receiving");
}
halWait(0xFF);
}
/******************************************************************************
* @fn pingPongResponse
*
* @brief
* Handles response to pingpong.
*
* Parameters:
*
* @param void
*
* @return void
*
******************************************************************************/
void pingPongResponse(void)
{
BYTE transmitBuffer;
receiveBall(ORIENTED_LEFT);
halWait(1);
YLED = LED_ON;
transmitBuffer = PING_PONG_RESPONSE;
radioSend(&transmitBuffer, 1, remoteAddr, DO_NOT_ACK);
sendBall(ORIENTED_LEFT);
YLED = LED_OFF;
}
/******************************************************************************
* @fn conductPerTest
*
* @brief
* Sends 1000 packets to calculate PER.
*
* Parameters:
*
* @param void
*
* @return void
*
******************************************************************************/
void conductPerTest(void)
{
WORD i;
WORD sendBuffer[2];
lcdUpdate((char *)"Conducting", (char *)"PER test.");
sendBuffer[1] = PER_TOTAL_PACKET_NUMBER;
for(i=1; i < PER_TOTAL_PACKET_NUMBER+1 ; i++)
{
halWait(8);
sendBuffer[0] = i;
radioSend((BYTE*) sendBuffer, sizeof(sendBuffer), remoteAddr, DO_NOT_ACK);
}
}
/******************************************************************************
* @fn printRSSI
*
* @brief
* Printing RSSI on the LCD-display.
*
* Parameters:
*
* @param INT8 rssi
* New RSSI value.
*
*
* @return void
*
******************************************************************************/
void printRSSI(INT8 rssi)
{
char rssiString[16];
sprintf(rssiString, (char const *)"%d dBm", (rssi-45));
lcdUpdateLine(LINE2, rssiString);
}
/******************************************************************************
* @fn getFrequency
*
* @brief
* Get current frequency.
*
* Parameters:
*
* @param void
*
* @return UINT32
* Current frequency.
*
******************************************************************************/
UINT32 getFrequency(void)
{
UINT8 selection;
char *menuText[] = {(char*)" 2405", (char*)" 2410", (char*)" 2415", (char*)" 2420", (char*)" 2425", (char*)" 2430", (char*)" 2435", (char*)" 2440", (char*)" 2445", (char*)" 2450", (char*)" 2455", (char*)" 2460", (char*)" 2465", (char*)" 2470", (char*)" 2475", (char*)" 2480", (char*)" 2485"};
selection = lcdMenu(menuText, 17);
if(selection != ABORT_MENU)
{
return (2405000 + 5000*selection);
}
else
{
return (2405000);
}
}
/******************************************************************************
* @fn getAddress
*
* @brief
* Get current address.
*
* Parameters:
*
* @param UINT8 a
*
* @return UINT8
*
******************************************************************************/
UINT8 getAddress(UINT8 a)
{
UINT8 address = a;
char line[16];
JOYSTICK_DIRECTION jsv;
while(getJoystickDirection() != CENTRED);
while((jsv = getJoystickDirection()) != RIGHT)
{
while(getJoystickDirection() != CENTRED);
if(jsv == UP)
{
address++;
}
else if (jsv == DOWN)
{
address--;
}
sprintf(line,(char *)"Address: %d ",address);
lcdUpdateLine(LINE2, line);
}
return address;
}
/******************************************************************************
* @fn clockmodes_init
*
* @brief
* Setup for incorperating the functions in this
* module with the menu
*
* Parameters:
*
* @param APPLICATION *a
* Main application
*
* @return void
*
******************************************************************************/
#ifdef COMPLETE_APPLICATION
void rf_test_init(APPLICATION *a)
{
a->menuText = (char *)"RF Test";
a->description = (char *)"Radio comm.";
a->main_func = rf_test_main;
}
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -