379 lines
13 KiB
C++
379 lines
13 KiB
C++
// firmware_update.cpp : This file contains the 'main' function. Program execution begins and ends there.
|
|
//
|
|
|
|
#include <iostream>
|
|
// Include this header file to get access to VectorNav sensors.
|
|
#include "vn/sensors.h"
|
|
|
|
// We need this file for our sleep function.
|
|
#include "vn/thread.h"
|
|
|
|
using namespace std;
|
|
using namespace vn::math;
|
|
using namespace vn::sensors;
|
|
using namespace vn::protocol::uart;
|
|
using namespace vn::xplat;
|
|
|
|
void one_call_method_for_the_VN300()
|
|
{
|
|
// 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 string SensorPort = "COM4"; // Windows format for physical and virtual (USB) serial port.
|
|
// const string SensorPort = "/dev/ttyS1"; // Linux format for physical serial port.
|
|
// const string SensorPort = "/dev/ttyUSB0"; // Linux format for virtual (USB) serial port.
|
|
// const string SensorPort = "/dev/tty.usbserial-FTXXXXXX"; // Mac OS X format for virtual (USB) serial port.
|
|
// const string SensorPort = "/dev/ttyS0"; // CYGWIN format. Usually the Windows COM port number minus 1. This would connect to COM1.
|
|
const uint32_t SensorBaudrate = 115200;
|
|
const uint32_t FirmwareUpdateBaudrate = 115200; // This can be different than the sensor baudrate, recommend 115200 or slower for reliability
|
|
std::string VN300_NAVFirmwareUpdate("../../FirmwareUpdates/VN300_NAV_v0.5.0.0.vnx");
|
|
std::string VN300_GPSFirmwareUpdate("../../FirmwareUpdates/VN300_GPS_v0.5.0.0.vnx");
|
|
|
|
// Now let's create a VnSensor object and use it to connect to our sensor.
|
|
cout << "Connecting to sensor" << endl;
|
|
VnSensor vs;
|
|
vs.connect(SensorPort, SensorBaudrate);
|
|
|
|
// Let's query the sensor's model number.
|
|
string mn = vs.readModelNumber();
|
|
cout << "Model Number: " << mn << endl;
|
|
|
|
// Let's query the sensor's firmware version.
|
|
string fwv = vs.readFirmwareVersion();
|
|
cout << "Firmware Version: " << fwv << endl;
|
|
|
|
// Let's update the NAV firmware first.
|
|
cout << "Updating NAV processor" << endl;
|
|
vs.firmwareUpdate(FirmwareUpdateBaudrate, VN300_NAVFirmwareUpdate);
|
|
|
|
// Let's switch to the target processor to update.
|
|
cout << "Switching to the GPS processor to update" << endl;
|
|
vs.switchProcessors(vs.VNPROCESSOR_GPS, mn, fwv);
|
|
|
|
// Let's update the GPS firmware Second.
|
|
cout << "Updating GPS processor" << endl;
|
|
vs.firmwareUpdate(FirmwareUpdateBaudrate, VN300_GPSFirmwareUpdate);
|
|
|
|
// Now disconnect from the sensor since we are finished.
|
|
cout << "Disconnecting from sensor" << endl;
|
|
vs.disconnect();
|
|
|
|
// Depending on the sensor, a power cycle may be needed instead of a reset.
|
|
cout << "Power Cycle the sensor" << endl;
|
|
}
|
|
|
|
void manage_each_step_method_for_the_VN200()
|
|
{
|
|
// This example walks through using the VectorNav C++ Library to do a firmware update of the VN200 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 string SensorPort = "COM3"; // Windows format for physical and virtual (USB) serial port.
|
|
// const string SensorPort = "/dev/ttyS1"; // Linux format for physical serial port.
|
|
// const string SensorPort = "/dev/ttyUSB0"; // Linux format for virtual (USB) serial port.
|
|
// const string SensorPort = "/dev/tty.usbserial-FTXXXXXX"; // Mac OS X format for virtual (USB) serial port.
|
|
// const string SensorPort = "/dev/ttyS0"; // CYGWIN format. Usually the Windows COM port number minus 1. This would connect to COM1.
|
|
const uint32_t SensorBaudrate = 115200;
|
|
const uint32_t FirmwareUpdateBaudrate = 115200; // This can be different than the sensor baudrate, recommend 115200 or slower for reliability
|
|
std::string VN200FirmwareUpdate("../../FirmwareUpdates/VN200_NAV_v2.0.0.1.vnx");
|
|
|
|
// Now let's create a VnSensor object and use it to connect to our sensor.
|
|
cout << "Connecting to sensor" << endl;
|
|
VnSensor vs;
|
|
vs.connect(SensorPort, SensorBaudrate);
|
|
|
|
// Let's query the sensor's model number.
|
|
string mn = vs.readModelNumber();
|
|
cout << "Model Number: " << mn << endl;
|
|
|
|
// Let's query the sensor's firmware version.
|
|
string fwv = vs.readFirmwareVersion();
|
|
cout << "Firmware Version: " << fwv << endl;
|
|
|
|
// Let's update the firmware on the target processor.
|
|
cout << "Updating processor" << endl;
|
|
std::string record = "";
|
|
|
|
// Open firmware update file
|
|
vs.openFirmwareUpdateFile(VN200FirmwareUpdate);
|
|
|
|
// Enter bootloader mode
|
|
vs.firmwareUpdateMode(true);
|
|
|
|
// Give the sensor time to reboot into bootloader mode
|
|
Thread::sleepSec(1);
|
|
|
|
// Configure baudrate for firmware update
|
|
uint32_t navBaudRate = vs.baudrate();
|
|
vs.setFirmwareUpdateBaudRate(FirmwareUpdateBaudrate);
|
|
|
|
// Calibrate the bootloader by letting it calculate the current baudrate.
|
|
std::string bootloaderVersion = vs.calibrateBootloader();
|
|
cout << bootloaderVersion << endl;
|
|
|
|
// Send each record from the firmware update file one at a time
|
|
do
|
|
{
|
|
record = vs.getNextFirwareUpdateRecord();
|
|
if (!record.empty())
|
|
{
|
|
cout << ".";
|
|
record.erase(0, 1); // Remove the ':' from the beginning of the line.
|
|
vs.writeFirmwareUpdateRecord(record, true);
|
|
}
|
|
} while (!record.empty());
|
|
cout << endl;
|
|
|
|
// Close firmware update file
|
|
vs.closeFirmwareUpdateFile();
|
|
|
|
// Reset baudrate
|
|
vs.setFirmwareUpdateBaudRate(navBaudRate);
|
|
|
|
// Exit bootloader mode. Sleep for 10 seconds
|
|
Thread::sleepSec(10);
|
|
|
|
// Do a reset
|
|
vs.reset();
|
|
|
|
// Wait 2 seconds after a reset
|
|
Thread::sleepSec(2);
|
|
|
|
// Now disconnect from the sensor since we are finished.
|
|
cout << "Disconnecting from sensor" << endl;
|
|
vs.disconnect();
|
|
|
|
// Depending on the sensor, a power cycle may be needed instead of a reset.
|
|
cout << "Power Cycle the sensor" << endl;
|
|
}
|
|
|
|
void manage_each_step_method_for_the_VN310()
|
|
{
|
|
const string SensorPort = "COM6";
|
|
const uint32_t SensorBaudrate = 115200;
|
|
const uint32_t FirmwareUpdateBaudrate = 115200; // This can be different than the sensor baudrate, recommend 115200 or slower for reliability
|
|
std::string VN310_NAVFirmwareUpdate("../../FirmwareUpdates/VN310_NAV_v0.8.1.0.vnx");
|
|
std::string VN310_GPSFirmwareUpdate("../../FirmwareUpdates/VN310_GPS_v0.8.1.0.vnx");
|
|
std::string VN310_IMUFirmwareUpdate("../../FirmwareUpdates/VN310_IMU_v2.5.1.0.vnx");
|
|
|
|
bool updateNAV = true;
|
|
bool updateGPS = true;
|
|
bool updateIMU = true;
|
|
|
|
// Now let's create a VnSensor object and use it to connect to our sensor.
|
|
cout << "Connecting to sensor" << endl;
|
|
VnSensor vs;
|
|
vs.connect(SensorPort, SensorBaudrate);
|
|
|
|
// Let's query the sensor's model number.
|
|
string mn = vs.readModelNumber();
|
|
cout << "Model Number: " << mn << endl;
|
|
|
|
// Let's query the sensor's firmware version.
|
|
string fwv = vs.readFirmwareVersion();
|
|
cout << "Firmware Version: " << fwv << endl;
|
|
|
|
// Let's update the firmware on the target processor.
|
|
cout << "Updating processor" << endl;
|
|
std::string record = "";
|
|
|
|
// ******************** Update NAV ********************
|
|
if (updateNAV)
|
|
{
|
|
cout << "********************************************************************************" << endl;
|
|
cout << "Updating the NAV firmware on a VN310" << endl;
|
|
cout << "********************************************************************************" << endl;
|
|
|
|
// Open firmware update file
|
|
vs.openFirmwareUpdateFile(VN310_NAVFirmwareUpdate);
|
|
|
|
// Enter bootloader mode
|
|
vs.firmwareUpdateMode(true);
|
|
|
|
// Give the sensor time to reboot into bootloader mode
|
|
Thread::sleepSec(1);
|
|
|
|
// Configure baudrate for firmware update
|
|
uint32_t navBaudRate = vs.baudrate();
|
|
vs.setFirmwareUpdateBaudRate(FirmwareUpdateBaudrate);
|
|
|
|
// Calibrate the bootloader by letting it calculate the current baudrate.
|
|
std::string bootloaderVersion = vs.calibrateBootloader();
|
|
cout << bootloaderVersion << endl;
|
|
|
|
// Send each record from the firmware update file one at a time
|
|
do
|
|
{
|
|
record = vs.getNextFirwareUpdateRecord();
|
|
if (!record.empty())
|
|
{
|
|
cout << ".";
|
|
record.erase(0, 1); // Remove the ':' from the beginning of the line.
|
|
vs.writeFirmwareUpdateRecord(record, true);
|
|
}
|
|
} while (!record.empty());
|
|
|
|
// Close firmware update file
|
|
vs.closeFirmwareUpdateFile();
|
|
|
|
// Reset baudrate
|
|
vs.setFirmwareUpdateBaudRate(navBaudRate);
|
|
|
|
// Exit bootloader mode. Sleep for 10 seconds
|
|
Thread::sleepSec(10);
|
|
|
|
// Do a reset
|
|
vs.reset();
|
|
|
|
// Wait 2 seconds after a reset
|
|
Thread::sleepSec(2);
|
|
|
|
// Let's switch back to the main processor
|
|
cout << "Switching to the NAV processor" << endl;
|
|
vs.switchProcessors(vs.VNPROCESSOR_NAV, mn, fwv);
|
|
}
|
|
|
|
// ******************** Update GPS ********************
|
|
if (updateGPS)
|
|
{
|
|
cout << "********************************************************************************" << endl;
|
|
cout << "Updating the GPS firmware on a VN310" << endl;
|
|
cout << "********************************************************************************" << endl;
|
|
|
|
// Let's switch to the target processor to update.
|
|
cout << "Switching to the GPS processor to update" << endl;
|
|
vs.switchProcessors(vs.VNPROCESSOR_GPS, mn, fwv);
|
|
|
|
// Open firmware update file
|
|
vs.openFirmwareUpdateFile(VN310_GPSFirmwareUpdate);
|
|
|
|
// Enter bootloader mode
|
|
vs.firmwareUpdateMode(true);
|
|
|
|
// Give the sensor time to reboot into bootloader mode
|
|
Thread::sleepSec(1);
|
|
|
|
// Configure baudrate for firmware update
|
|
uint32_t navBaudRate = vs.baudrate();
|
|
vs.setFirmwareUpdateBaudRate(FirmwareUpdateBaudrate);
|
|
|
|
// Calibrate the bootloader by letting it calculate the current baudrate.
|
|
std::string bootloaderVersion = vs.calibrateBootloader();
|
|
cout << bootloaderVersion << endl;
|
|
|
|
// Send each record from the firmware update file one at a time
|
|
do
|
|
{
|
|
record = vs.getNextFirwareUpdateRecord();
|
|
if (!record.empty())
|
|
{
|
|
cout << ".";
|
|
record.erase(0, 1); // Remove the ':' from the beginning of the line.
|
|
vs.writeFirmwareUpdateRecord(record, true);
|
|
}
|
|
} while (!record.empty());
|
|
|
|
// Close firmware update file
|
|
vs.closeFirmwareUpdateFile();
|
|
|
|
// Reset baudrate
|
|
vs.setFirmwareUpdateBaudRate(navBaudRate);
|
|
|
|
// Exit bootloader mode. Sleep for 10 seconds
|
|
Thread::sleepSec(10);
|
|
|
|
// Do a reset
|
|
vs.reset();
|
|
|
|
// Wait 2 seconds after a reset
|
|
Thread::sleepSec(2);
|
|
|
|
// Let's switch back to the main processor
|
|
cout << "Switching to the NAV processor" << endl;
|
|
vs.switchProcessors(vs.VNPROCESSOR_NAV, mn, fwv);
|
|
|
|
}
|
|
|
|
// ******************** Update IMU ********************
|
|
if (updateIMU)
|
|
{
|
|
cout << "********************************************************************************" << endl;
|
|
cout << "Updating the IMU firmware on a VN310" << endl;
|
|
cout << "********************************************************************************" << endl;
|
|
|
|
// Let's switch to the target processor to update.
|
|
cout << "Switching to the IMU processor to update" << endl;
|
|
vs.switchProcessors(vs.VNPROCESSOR_IMU, mn, fwv);
|
|
|
|
// Open firmware update file
|
|
vs.openFirmwareUpdateFile(VN310_IMUFirmwareUpdate);
|
|
|
|
// Enter bootloader mode
|
|
vs.firmwareUpdateMode(true);
|
|
|
|
// Give the sensor time to reboot into bootloader mode
|
|
Thread::sleepSec(1);
|
|
|
|
// Configure baudrate for firmware update
|
|
uint32_t navBaudRate = vs.baudrate();
|
|
vs.setFirmwareUpdateBaudRate(FirmwareUpdateBaudrate);
|
|
|
|
// Calibrate the bootloader by letting it calculate the current baudrate.
|
|
std::string bootloaderVersion = vs.calibrateBootloader();
|
|
cout << bootloaderVersion << endl;
|
|
|
|
// Send each record from the firmware update file one at a time
|
|
do
|
|
{
|
|
record = vs.getNextFirwareUpdateRecord();
|
|
if (!record.empty())
|
|
{
|
|
cout << ".";
|
|
record.erase(0, 1); // Remove the ':' from the beginning of the line.
|
|
vs.writeFirmwareUpdateRecord(record, true);
|
|
}
|
|
} while (!record.empty());
|
|
|
|
// Close firmware update file
|
|
vs.closeFirmwareUpdateFile();
|
|
|
|
// Reset baudrate
|
|
vs.setFirmwareUpdateBaudRate(navBaudRate);
|
|
|
|
// Exit bootloader mode. Sleep for 10 seconds
|
|
Thread::sleepSec(10);
|
|
|
|
// Do a reset
|
|
vs.reset();
|
|
|
|
// Wait 2 seconds after a reset
|
|
Thread::sleepSec(2);
|
|
|
|
// Let's switch back to the main processor
|
|
cout << "Switching to the NAV processor" << endl;
|
|
vs.switchProcessors(vs.VNPROCESSOR_NAV, mn, fwv);
|
|
}
|
|
|
|
// Now disconnect from the sensor since we are finished.
|
|
cout << "Disconnecting from sensor" << endl;
|
|
vs.disconnect();
|
|
}
|
|
|
|
|
|
int main()
|
|
{
|
|
cout << "Updating the firmware on a VN200" << endl;
|
|
manage_each_step_method_for_the_VN200();
|
|
|
|
cout << "Updating the firmware on a VN300" << endl;
|
|
one_call_method_for_the_VN300();
|
|
|
|
cout << "Updating the firmware on a VN310" << endl;
|
|
manage_each_step_method_for_the_VN310();
|
|
|
|
return 0;
|
|
}
|