initial
This commit is contained in:
378
vnproglib/cpp/examples/firmware_update/main.cpp
Normal file
378
vnproglib/cpp/examples/firmware_update/main.cpp
Normal file
@ -0,0 +1,378 @@
|
||||
// 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;
|
||||
}
|
||||
Reference in New Issue
Block a user