340 lines
15 KiB
C
340 lines
15 KiB
C
#include <stdio.h>
|
|
|
|
/* Include files needed to do firmware updates. */
|
|
#include "vn/sensors.h"
|
|
|
|
int processErrorReceived(char* errorMessage, VnError errorCode);
|
|
|
|
/*
|
|
Firmware Update Protocol
|
|
1. Switch to target processor
|
|
2. Enter Update Mode in Bootloader
|
|
3. Set Baud Rate
|
|
4. Verify Acknowledgement
|
|
5. Send firmware update one record at a time
|
|
6. Wait for Acknowledgement before sending next record
|
|
7. Exit Update Mode in Bootloader
|
|
8. Switch to next target processor or return back to the NAV processor
|
|
*/
|
|
|
|
int one_call_method_for_the_VN300(void)
|
|
{
|
|
|
|
VnSensor vs;
|
|
char modelNumber[30];
|
|
char firmwareVersion[30];
|
|
VnError error;
|
|
|
|
/* This example walks through using the VectorNav C Library to do a firmware update on the different processors of the VN300 using the firmwareUpdate method. */
|
|
|
|
/* First determine which COM port your sensor is attached to and update the
|
|
* constant below. Also, if you have changed your sensor from the factory
|
|
* default baudrate of 115200, you will need to update the baudrate
|
|
* constant below as well. */
|
|
const char SENSOR_PORT[] = "COM4"; /* Windows format for physical and virtual (USB) serial port. */
|
|
/*const char SENSOR_PORT[] = "/dev/ttyS1"; */ /* Linux format for physical serial port. */
|
|
/*const char SENSOR_PORT[] = "/dev/ttyUSB0"; */ /* Linux format for virtual (USB) serial port. */
|
|
/*const char SENSOR_PORT[] = "/dev/tty.usbserial-FTXXXXXX"; */ /* Mac OS X format for virtual (USB) serial port. */
|
|
/*const char SENSOR_PORT[] = "/dev/ttyS0"; */ /* CYGWIN format. Usually the Windows COM port number minus 1. This would connect to COM1. */
|
|
const uint32_t SENSOR_BAUDRATE = 115200;
|
|
const uint32_t FIRMWARE_UPDATE_BAUDRATE = 115200; /* This can be different than the sensor baudrate, recommend 115200 or slower for reliability */
|
|
const char VN300_NAVFirmwareUpdate[] = "../../FirmwareUpdates/VN300_NAV_v0.5.0.0.vnx";
|
|
const char VN300_GPSFirmwareUpdate[] = "../../FirmwareUpdates/VN300_GPS_v0.5.0.0.vnx";
|
|
|
|
|
|
/* We first need to initialize our VnSensor structure. */
|
|
printf("Initialize VN Sensor.\n");
|
|
VnSensor_initialize(&vs);
|
|
|
|
/* Now connect to our sensor. */
|
|
printf("Connect to VN Sensor.\n");
|
|
if ((error = VnSensor_connect(&vs, SENSOR_PORT, SENSOR_BAUDRATE)) != E_NONE)
|
|
return processErrorReceived("Error connecting to sensor.", error);
|
|
|
|
/* Let's query the sensor's model number. */
|
|
printf("Query VN Sensor Model.\n");
|
|
if ((error = VnSensor_readModelNumber(&vs, modelNumber, sizeof(modelNumber))) != E_NONE)
|
|
return processErrorReceived("Error reading model number.", error);
|
|
printf("Model Number: %s\n", modelNumber);
|
|
|
|
/* Let's query the sensor's firmware version. */
|
|
printf("Query VN Sensor Firmware Version.\n");
|
|
if ((error = VnSensor_readFirmwareVersion(&vs, firmwareVersion, sizeof(firmwareVersion))) != E_NONE)
|
|
return processErrorReceived("Error reading firmware version.", error);
|
|
printf("Firmware Version: %s\n", firmwareVersion);
|
|
|
|
/* Let's update the firmware on the NAV processor. */
|
|
printf("NAV Firmware Update VN Sensor with %s.\n", VN300_NAVFirmwareUpdate);
|
|
if ((error = VnSensor_firmwareUpdate(&vs, FIRMWARE_UPDATE_BAUDRATE, VN300_NAVFirmwareUpdate)) != E_NONE)
|
|
return processErrorReceived("Error updating firmware.", error);
|
|
|
|
/* Let's switch to the target processor to update. */
|
|
printf("Switch processors on VN Sensor.\n");
|
|
if ((error = VnSensor_switchProcessors(&vs, VNPROCESSOR_GPS, modelNumber, firmwareVersion)) != E_NONE)
|
|
return processErrorReceived("Error switching processors.", error);
|
|
|
|
/* Let's update the firmware on the GPS processor. */
|
|
printf("GPS Firmware Update VN Sensor with %s.\n", VN300_GPSFirmwareUpdate);
|
|
if ((error = VnSensor_firmwareUpdate(&vs, FIRMWARE_UPDATE_BAUDRATE, VN300_GPSFirmwareUpdate)) != E_NONE)
|
|
return processErrorReceived("Error updating firmware.", error);
|
|
|
|
/* Now disconnect from the sensor since we are finished. */
|
|
printf("Disconnect from VN Sensor.\n");
|
|
if ((error = VnSensor_disconnect(&vs)) != E_NONE)
|
|
return processErrorReceived("Error disconnecting from sensor.", error);
|
|
|
|
/* Depending on the sensor, a power cycle may be needed instead of a reset. */
|
|
printf("Power Cycle the sensor.\n");
|
|
|
|
return 0;
|
|
}
|
|
|
|
int manage_each_step_for_the_VN200(void)
|
|
{
|
|
VnSensor vs;
|
|
char modelNumber[30];
|
|
char firmwareVersion[30];
|
|
VnError error;
|
|
int RecordSize = MAXFIRMWAREUPDATERECORDSIZE;
|
|
char record[MAXFIRMWAREUPDATERECORDSIZE];
|
|
bool stillGoing = true;
|
|
|
|
/* This example walks through using the VectorNav C Library to connect to
|
|
* and interact with a VectorNav sensor using the VnSensor structure. */
|
|
|
|
/* First determine which COM port your sensor is attached to and update the
|
|
* constant below. Also, if you have changed your sensor from the factory
|
|
* default baudrate of 115200, you will need to update the baudrate
|
|
* constant below as well. */
|
|
const char SENSOR_PORT[] = "COM3"; /* Windows format for physical and virtual (USB) serial port. */
|
|
/*const char SENSOR_PORT[] = "/dev/ttyS1"; */ /* Linux format for physical serial port. */
|
|
/*const char SENSOR_PORT[] = "/dev/ttyUSB0"; */ /* Linux format for virtual (USB) serial port. */
|
|
/*const char SENSOR_PORT[] = "/dev/tty.usbserial-FTXXXXXX"; */ /* Mac OS X format for virtual (USB) serial port. */
|
|
/*const char SENSOR_PORT[] = "/dev/ttyS0"; */ /* CYGWIN format. Usually the Windows COM port number minus 1. This would connect to COM1. */
|
|
const uint32_t SENSOR_BAUDRATE = 115200;
|
|
const uint32_t FIRMWARE_UPDATE_BAUDRATE = 115200; /* This can be different than the sensor baudrate, recommend 115200 or slower for reliability */
|
|
const char VN200FirmwareUpdate[] = "../../FirmwareUpdates/VN200_NAV_v2.0.0.1.vnx";
|
|
|
|
/* We first need to initialize our VnSensor structure. */
|
|
printf("Initialize VN Sensor.\n");
|
|
VnSensor_initialize(&vs);
|
|
|
|
/* Now connect to our sensor. */
|
|
printf("Connect to VN Sensor.\n");
|
|
if ((error = VnSensor_connect(&vs, SENSOR_PORT, SENSOR_BAUDRATE)) != E_NONE)
|
|
return processErrorReceived("Error connecting to sensor.", error);
|
|
|
|
/* Let's query the sensor's model number. */
|
|
printf("Query VN Sensor Model.\n");
|
|
if ((error = VnSensor_readModelNumber(&vs, modelNumber, sizeof(modelNumber))) != E_NONE)
|
|
return processErrorReceived("Error reading model number.", error);
|
|
printf("Model Number: %s\n", modelNumber);
|
|
|
|
/* Let's query the sensor's firmware version. */
|
|
printf("Query VN Sensor Firmware Version.\n");
|
|
if ((error = VnSensor_readFirmwareVersion(&vs, firmwareVersion, sizeof(firmwareVersion))) != E_NONE)
|
|
return processErrorReceived("Error reading firmware version.", error);
|
|
printf("Firmware Version: %s\n", firmwareVersion);
|
|
|
|
/* Open Firmware Update File*/
|
|
FILE* firmwareUpdateFile = VnSensor_openFirmwareUpdateFile(VN200FirmwareUpdate);
|
|
|
|
/* Enter the bootloader */
|
|
if((error = VnSensor_firmwareUpdateMode(&vs, true)) != E_NONE)
|
|
return processErrorReceived("Failed to enter firmware update mode.", error);
|
|
|
|
/* Give the processor some time to reboot */
|
|
VnThread_sleepMs(1000);
|
|
|
|
/* Change the baud rate for updating the firmware */
|
|
if((error = VnSerialPort_changeBaudrate(&(vs.serialPort), FIRMWARE_UPDATE_BAUDRATE)) != E_NONE)
|
|
return processErrorReceived("Failed to change the firmware update baud rate.", error);
|
|
|
|
/* Calibrate the Bootloader before sending records */
|
|
VnSensor_calibrateBootloader(&vs);
|
|
|
|
/* Write the firmware update file to the sensor, one record at a time */
|
|
while (stillGoing)
|
|
{
|
|
stillGoing = VnSensor_getNextFirmwareUpdateRecord(firmwareUpdateFile, record, RecordSize);
|
|
if (stillGoing)
|
|
{
|
|
//printf("Send: %s\n", record);
|
|
printf(".");
|
|
if((error = VnSensor_writeFirmwareUpdateRecord(&vs, record)) != E_BOOTLOADER_NONE)
|
|
{
|
|
processErrorReceived("Failed to write record to firmware.", error);
|
|
stillGoing = false;
|
|
}
|
|
}
|
|
}
|
|
printf("\n");
|
|
|
|
/* Switch the baud rate back to the original setting */
|
|
if((error = VnSerialPort_changeBaudrate(&(vs.serialPort), SENSOR_BAUDRATE)) != E_NONE)
|
|
return processErrorReceived("Failed to change baud rate back.", error);
|
|
|
|
/* Close the firmware update file */
|
|
VnSensor_closeFirmwareUpdateFile(firmwareUpdateFile);
|
|
|
|
/* Exit Bootloader mode. Just sleep for 10 seconds */
|
|
VnThread_sleepMs(10000);
|
|
|
|
/* Do a reset */
|
|
VnSensor_reset(&vs, true);
|
|
|
|
/* Wait 2 seconds for the reset to finish */
|
|
VnThread_sleepMs(2000);
|
|
|
|
/* Now disconnect from the sensor since we are finished. */
|
|
printf("Disconnect from VN Sensor.\n");
|
|
if ((error = VnSensor_disconnect(&vs)) != E_NONE)
|
|
return processErrorReceived("Error disconnecting from sensor.", error);
|
|
|
|
/* Depending on the sensor, a power cycle may be needed instead of a reset. */
|
|
printf("Power Cycle the sensor.\n");
|
|
return 0;
|
|
}
|
|
|
|
int one_call_method_for_the_VN310(void)
|
|
{
|
|
|
|
VnSensor vs;
|
|
char modelNumber[30];
|
|
char firmwareVersion[30];
|
|
VnError error;
|
|
int RecordSize = MAXFIRMWAREUPDATERECORDSIZE;
|
|
char record[MAXFIRMWAREUPDATERECORDSIZE];
|
|
bool stillGoing = true;
|
|
|
|
/* This example walks through using the VectorNav C Library to connect to
|
|
* and interact with a VectorNav sensor using the VnSensor structure. */
|
|
|
|
/* First determine which COM port your sensor is attached to and update the
|
|
* constant below. Also, if you have changed your sensor from the factory
|
|
* default baudrate of 115200, you will need to update the baudrate
|
|
* constant below as well. */
|
|
const char SENSOR_PORT[] = "COM6"; /* Windows format for physical and virtual (USB) serial port. */
|
|
/*const char SENSOR_PORT[] = "/dev/ttyS1"; */ /* Linux format for physical serial port. */
|
|
/*const char SENSOR_PORT[] = "/dev/ttyUSB0"; */ /* Linux format for virtual (USB) serial port. */
|
|
/*const char SENSOR_PORT[] = "/dev/tty.usbserial-FTXXXXXX"; */ /* Mac OS X format for virtual (USB) serial port. */
|
|
/*const char SENSOR_PORT[] = "/dev/ttyS0"; */ /* CYGWIN format. Usually the Windows COM port number minus 1. This would connect to COM1. */
|
|
const uint32_t SENSOR_BAUDRATE = 115200;
|
|
const uint32_t FIRMWARE_UPDATE_BAUDRATE = 115200; /* This can be different than the sensor baudrate, recommend 115200 or slower for reliability */
|
|
const char VN310_NAVFirmwareUpdate[] = "../../FirmwareUpdates/VN310_NAV_v0.8.1.0.vnx";
|
|
const char VN310_GPSFirmwareUpdate[] = "../../FirmwareUpdates/VN310_GPS_v0.8.1.0.vnx";
|
|
const char VN310_IMUFirmwareUpdate[] = "../../FirmwareUpdates/VN310_IMU_v2.5.1.0.vnx";
|
|
|
|
bool updateNAV = true;
|
|
bool updateGPS = true;
|
|
bool updateIMU = true;
|
|
|
|
|
|
/* We first need to initialize our VnSensor structure. */
|
|
printf("Initialize VN Sensor.\n");
|
|
VnSensor_initialize(&vs);
|
|
|
|
/* Now connect to our sensor. */
|
|
printf("Connect to VN Sensor.\n");
|
|
if ((error = VnSensor_connect(&vs, SENSOR_PORT, SENSOR_BAUDRATE)) != E_NONE)
|
|
return processErrorReceived("Error connecting to sensor.", error);
|
|
|
|
/* Let's query the sensor's model number. */
|
|
printf("Query VN Sensor Model.\n");
|
|
if ((error = VnSensor_readModelNumber(&vs, modelNumber, sizeof(modelNumber))) != E_NONE)
|
|
return processErrorReceived("Error reading model number.", error);
|
|
printf("Model Number: %s\n", modelNumber);
|
|
|
|
/* Let's query the sensor's firmware version. */
|
|
printf("Query VN Sensor Firmware Version.\n");
|
|
if ((error = VnSensor_readFirmwareVersion(&vs, firmwareVersion, sizeof(firmwareVersion))) != E_NONE)
|
|
return processErrorReceived("Error reading firmware version.", error);
|
|
printf("Firmware Version: %s\n", firmwareVersion);
|
|
|
|
if (updateNAV)
|
|
{
|
|
/* Let's update the firmware on the NAV processor. */
|
|
printf("NAV Firmware Update VN Sensor with %s.\n", VN310_NAVFirmwareUpdate);
|
|
if ((error = VnSensor_firmwareUpdate(&vs, FIRMWARE_UPDATE_BAUDRATE, VN310_NAVFirmwareUpdate)) != E_NONE)
|
|
return processErrorReceived("Error updating firmware.", error);
|
|
|
|
/* Need to switch back to NAV befor we leave*/
|
|
printf("Switch to NAV processor.\n");
|
|
if ((error = VnSensor_switchProcessors(&vs, VNPROCESSOR_NAV, modelNumber, firmwareVersion)) != E_NONE)
|
|
return processErrorReceived("Error switching processors.", error);
|
|
}
|
|
|
|
if (updateGPS)
|
|
{
|
|
/* Let's switch to the target processor to update. */
|
|
printf("Switch to GPS processor.\n");
|
|
if ((error = VnSensor_switchProcessors(&vs, VNPROCESSOR_GPS, modelNumber, firmwareVersion)) != E_NONE)
|
|
return processErrorReceived("Error switching processors.", error);
|
|
|
|
/* Let's update the firmware on the GPS processor. */
|
|
printf("GPS Firmware Update VN Sensor with %s.\n", VN310_GPSFirmwareUpdate);
|
|
if ((error = VnSensor_firmwareUpdate(&vs, FIRMWARE_UPDATE_BAUDRATE, VN310_GPSFirmwareUpdate)) != E_NONE)
|
|
return processErrorReceived("Error updating firmware.", error);
|
|
|
|
/* Need to switch back to NAV since we cannot switch directly to IMU from GPS. */
|
|
printf("Switch to NAV processor.\n");
|
|
if ((error = VnSensor_switchProcessors(&vs, VNPROCESSOR_NAV, modelNumber, firmwareVersion)) != E_NONE)
|
|
return processErrorReceived("Error switching processors.", error);
|
|
}
|
|
|
|
if (updateIMU)
|
|
{
|
|
/* Let's switch to the target processor to update. */
|
|
printf("Switch to IMU processor.\n");
|
|
if ((error = VnSensor_switchProcessors(&vs, VNPROCESSOR_IMU, modelNumber, firmwareVersion)) != E_NONE)
|
|
return processErrorReceived("Error switching processors.", error);
|
|
|
|
/* Let's update the firmware on the GPS processor. */
|
|
printf("IMU Firmware Update VN Sensor with %s.\n", VN310_IMUFirmwareUpdate);
|
|
if ((error = VnSensor_firmwareUpdate(&vs, FIRMWARE_UPDATE_BAUDRATE, VN310_IMUFirmwareUpdate)) != E_NONE)
|
|
return processErrorReceived("Error updating firmware.", error);
|
|
|
|
/* Need to switch back to NAV befor we leave*/
|
|
printf("Switch to NAV processor.\n");
|
|
if ((error = VnSensor_switchProcessors(&vs, VNPROCESSOR_NAV, modelNumber, firmwareVersion)) != E_NONE)
|
|
return processErrorReceived("Error switching processors.", error);
|
|
}
|
|
/* Now disconnect from the sensor since we are finished. */
|
|
printf("Disconnect from VN Sensor.\n");
|
|
if ((error = VnSensor_disconnect(&vs)) != E_NONE)
|
|
return processErrorReceived("Error disconnecting from sensor.", error);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
int processErrorReceived(char* errorMessage, VnError errorCode)
|
|
{
|
|
char errorCodeStr[100];
|
|
strFromVnError(errorCodeStr, errorCode);
|
|
printf("%s\nERROR: %s\n", errorMessage, errorCodeStr);
|
|
return -1;
|
|
}
|
|
|
|
|
|
int main(void)
|
|
{
|
|
int retval = 0;
|
|
|
|
printf("********************************************************************************\n");
|
|
printf("Updating the firmware on a VN200.\n");
|
|
printf("********************************************************************************\n");
|
|
retval = manage_each_step_for_the_VN200();
|
|
|
|
printf("********************************************************************************\n");
|
|
printf("Updating the firmware on a VN300.\n");
|
|
printf("********************************************************************************\n");
|
|
retval = one_call_method_for_the_VN300();
|
|
|
|
printf("********************************************************************************\n");
|
|
printf("Updating the firmware on a VN310.\n");
|
|
printf("********************************************************************************\n");
|
|
retval = one_call_method_for_the_VN310();
|
|
|
|
return retval;
|
|
} |