This example illustrates basic connectivity and interaction with a VectorNav sensor using the low-level UART protocol code that is part of the core section of the library.
To compile and run for an environment not listed here, you will need to add all of the *.c
files in the directory <root>/c/src
along with the file located at <root>/c/examples/getting_started/main.c
to your project for compilation. You will also need to add <root>/c/include
to your include directories.
#include <string.h>
#include <stdio.h>
#include "vn/util.h"
#include "vn/protocol/upack.h"
#include "vn/protocol/upackf.h"
#include "vn/int.h"
void packetFoundHandler(
void *userData,
VnUartPacket *packet,
size_t runningIndexOfPacketStart);
void UserUart_initialize(void);
bool UserUart_checkForReceivedData(char* buffer, size_t bufferSize, size_t* numOfBytesReceived);
void UserUart_mockReceivedData(char* buffer, size_t bufferSize);
void UserUart_sendData(char *data, size_t size);
bool gIsCheckingForModelNumberResponse = false;
bool gIsCheckingForAsyncOutputFreqResponse = false;
bool gIsCheckingForVpeBasicControlResponse = false;
uint8_t gEnable, gHeadingMode, gFilteringMode, gTuningMode;
int main(void)
{
char buffer[256];
size_t numOfBytes, readModelNumberSize, writeAsyncOutputFreqSize, readVpeBasicControlSize, writeVpeBasicControlSize;
size_t writeBinaryOutput1Size;
char mockAsciiAsyncData[] = "$VNYMR,+100.949,-007.330,+000.715,-00.0049,-00.2449,+00.5397,-01.258,-00.100,-09.701,-00.000018,+00.001122,-00.000551*69\r\n";
char mockReadModelNumberResponse[] = "$VNRRG,01,VN-200T-CR*31\r\n";
char mockWriteAsyncOutputFrequencyResponse[] = "$VNWRG,07,2*6F\r\n";
char mockFactoryDefaultReadVpeBasicControlResponse[] = "$VNRRG,35,1,1,1,1*75\r\n";
char mockWriteVpeBasicControlResponse[] = "$VNWRG,35,1,0,1,1*71\r\n";
char mockErrorMessage[] = "$VNERR,12*72\r\n";
uint8_t mockBinaryAsyncData[] = { 0xFA, 0x01, 0x09, 0x00, 0x70, 0x05, 0x00, 0x03, 0x0A, 0x00, 0x00, 0x00, 0x48, 0x0E, 0x2C, 0x42, 0x08, 0x4C, 0x37, 0xC1, 0x10, 0x38, 0x8B, 0xC2, 0xD4, 0xCB };
char genReadModelNumberBuffer[256];
char genWriteAsyncOutputFrequencyBuffer[256];
char genReadVpeBasicControlBuffer[256];
char genWriteVpeBasicControlBuffer[256];
char genWriteBinaryOutput1Buffer[256];
VnUartPacketFinder_initialize(&up);
VnUartPacketFinder_registerPacketFoundHandler(&up, packetFoundHandler, NULL);
UserUart_initialize();
UserUart_mockReceivedData(mockAsciiAsyncData, strlen(mockAsciiAsyncData));
UserUart_checkForReceivedData(buffer, sizeof(buffer), &numOfBytes);
VnUartPacketFinder_processData(&up,(uint8_t*) buffer, numOfBytes);
genReadModelNumberBuffer,
sizeof(genReadModelNumberBuffer),
VNERRORDETECTIONMODE_CHECKSUM,
&readModelNumberSize);
gIsCheckingForModelNumberResponse = true;
UserUart_sendData(genReadModelNumberBuffer, readModelNumberSize);
UserUart_mockReceivedData(mockReadModelNumberResponse, strlen(mockReadModelNumberResponse));
UserUart_checkForReceivedData(buffer, sizeof(buffer), &numOfBytes);
VnUartPacketFinder_processData(&up, (uint8_t*)buffer, numOfBytes);
gIsCheckingForModelNumberResponse = false;
genWriteAsyncOutputFrequencyBuffer,
sizeof(genWriteAsyncOutputFrequencyBuffer),
VNERRORDETECTIONMODE_CHECKSUM,
&writeAsyncOutputFreqSize,
2);
gIsCheckingForAsyncOutputFreqResponse = true;
UserUart_sendData(genWriteAsyncOutputFrequencyBuffer, writeAsyncOutputFreqSize);
UserUart_mockReceivedData(mockWriteAsyncOutputFrequencyResponse, strlen(mockWriteAsyncOutputFrequencyResponse));
UserUart_checkForReceivedData(buffer, sizeof(buffer), &numOfBytes);
VnUartPacketFinder_processData(&up, (uint8_t*)buffer, numOfBytes);
gIsCheckingForAsyncOutputFreqResponse = false;
printf("Reading current values of the VPE Basic Control register.\n");
genReadVpeBasicControlBuffer,
sizeof(genReadVpeBasicControlBuffer),
VNERRORDETECTIONMODE_CHECKSUM,
&readVpeBasicControlSize);
gIsCheckingForVpeBasicControlResponse = true;
UserUart_sendData(genReadVpeBasicControlBuffer, readVpeBasicControlSize);
UserUart_mockReceivedData(mockFactoryDefaultReadVpeBasicControlResponse, strlen(mockFactoryDefaultReadVpeBasicControlResponse));
UserUart_checkForReceivedData(buffer, sizeof(buffer), &numOfBytes);
VnUartPacketFinder_processData(&up, (uint8_t*)buffer, numOfBytes);
gIsCheckingForVpeBasicControlResponse = false;
printf("Writing new values to the VPE Basic Control register.\n");
genWriteVpeBasicControlBuffer,
sizeof(genWriteVpeBasicControlBuffer),
VNERRORDETECTIONMODE_CHECKSUM,
&writeVpeBasicControlSize,
gEnable,
0,
gFilteringMode,
gTuningMode);
gIsCheckingForVpeBasicControlResponse = true;
UserUart_sendData(genWriteVpeBasicControlBuffer, writeVpeBasicControlSize);
UserUart_mockReceivedData(mockWriteVpeBasicControlResponse, strlen(mockWriteVpeBasicControlResponse));
UserUart_checkForReceivedData(buffer, sizeof(buffer), &numOfBytes);
VnUartPacketFinder_processData(&up, (uint8_t*)buffer, numOfBytes);
gIsCheckingForVpeBasicControlResponse = false;
(uint8_t*)genWriteBinaryOutput1Buffer,
sizeof(genWriteBinaryOutput1Buffer),
VNERRORDETECTIONMODE_CHECKSUM,
&writeBinaryOutput1Size,
ASYNCMODE_PORT1,
200,
COMMONGROUP_TIMESTARTUP | COMMONGROUP_YAWPITCHROLL,
TIMEGROUP_NONE,
IMUGROUP_NONE,
GPSGROUP_NONE,
ATTITUDEGROUP_NONE,
INSGROUP_NONE);
UserUart_sendData(genWriteBinaryOutput1Buffer, writeBinaryOutput1Size);
UserUart_mockReceivedData((char*)mockBinaryAsyncData, 26);
UserUart_checkForReceivedData(buffer, sizeof(buffer), &numOfBytes);
VnUartPacketFinder_processData(&up, (uint8_t*)buffer, numOfBytes);
UserUart_mockReceivedData(mockErrorMessage, strlen(mockErrorMessage));
UserUart_checkForReceivedData(buffer, sizeof(buffer), &numOfBytes);
VnUartPacketFinder_processData(&up, (uint8_t*)buffer, numOfBytes);
return 0;
}
void packetFoundHandler(
void *userData,
VnUartPacket *packet,
size_t runningIndexOfPacketStart)
{
(runningIndexOfPacketStart);
(userData);
if (VnUartPacket_type(packet) == PACKETTYPE_ASCII)
{
if (VnUartPacket_isAsciiAsync(packet))
{
VnAsciiAsync asyncType = VnUartPacket_determineAsciiAsyncType(packet);
if (asyncType == VNYMR)
{
vec3f ypr, mag, accel, angularRate;
char yprStr[100], magStr[100], accelStr[100], angularRateStr[100];
str_vec3f(yprStr, ypr);
str_vec3f(magStr, mag);
str_vec3f(accelStr, accel);
str_vec3f(angularRateStr, angularRate);
printf("[Found VNYMR Packet]\n");
printf(" YawPitchRoll: %s\n", yprStr);
printf(" Magnetic: %s\n", magStr);
printf(" Acceleration: %s\n", accelStr);
printf(" Angular Rate: %s\n", angularRateStr);
}
}
else if (VnUartPacket_isResponse(packet))
{
if (gIsCheckingForModelNumberResponse)
{
char modelNumber[100];
printf("Model Number: %s\n", modelNumber);
}
else if (gIsCheckingForAsyncOutputFreqResponse)
{
uint32_t asyncOutputFreq;
printf("Asynchronous Output Frequency: %u Hz\n", asyncOutputFreq);
}
else if (gIsCheckingForVpeBasicControlResponse)
{
char enableStr[100], headingModeStr[100], filteringModeStr[100], tuningModeStr[100];
strFromBool(enableStr, (bool) gEnable);
printf("[VPE Basic Control]\n");
printf(" Enable: %s\n", enableStr);
printf(" Heading Mode: %s\n", headingModeStr);
printf(" Filtering Mode: %s\n", filteringModeStr);
printf(" Tuning Mode: %s\n", tuningModeStr);
}
}
else if (VnUartPacket_isError(packet))
{
uint8_t error;
char errorStr[100];
printf("Sensor Error: %s\n", errorStr);
}
}
else if (VnUartPacket_type(packet) == PACKETTYPE_BINARY) {
uint64_t timeStartup;
char yprStr[100];
if (!VnUartPacket_isCompatible(
packet,
COMMONGROUP_TIMESTARTUP | COMMONGROUP_YAWPITCHROLL,
TIMEGROUP_NONE,
IMUGROUP_NONE,
GPSGROUP_NONE,
ATTITUDEGROUP_NONE,
INSGROUP_NONE))
{
return;
}
str_vec3f(yprStr, ypr);
printf("[Binary Packet Received]\n");
printf(" TimeStartup: %u\n", (uint32_t) timeStartup);
printf(" Yaw Pitch Roll: %s\n", yprStr);
}
}
char* mockUartReceivedDataBuffer[256];
size_t mockUartReceivedDataSize;
void UserUart_initialize(void)
{
mockUartReceivedDataSize = 0;
}
bool UserUart_checkForReceivedData(char* buffer, size_t bufferSize, size_t* numOfBytesReceived)
{
(bufferSize);
if (mockUartReceivedDataSize == 0)
return false;
memcpy(buffer, mockUartReceivedDataBuffer, mockUartReceivedDataSize);
*numOfBytesReceived = mockUartReceivedDataSize;
mockUartReceivedDataSize = 0;
return true;
}
void UserUart_mockReceivedData(char* buffer, size_t bufferSize)
{
memcpy(mockUartReceivedDataBuffer, buffer, bufferSize);
mockUartReceivedDataSize = bufferSize;
}
void UserUart_sendData(char *data, size_t size)
{
(data);
(size);
}