Allow settings to be marked as readonly

In the case of the FIRE 2 ethernet, we're waiting on a bug fix in firmware before we re-enable writing.
In the meantime, setting settings over ethernet crashes the ethernet driver.
pull/4/head
Paul Hollinsky 2018-10-10 16:28:00 -04:00
parent 5d4cfe4930
commit ba82c51914
3 changed files with 15 additions and 0 deletions

View File

@ -85,6 +85,9 @@ bool IDeviceSettings::refresh(bool ignoreChecksum) {
} }
bool IDeviceSettings::apply(bool temporary) { bool IDeviceSettings::apply(bool temporary) {
if(readonly)
return false;
std::vector<uint8_t> bytestream; std::vector<uint8_t> bytestream;
bytestream.resize(7 + structSize); bytestream.resize(7 + structSize);
bytestream[0] = 0x00; bytestream[0] = 0x00;
@ -131,6 +134,9 @@ bool IDeviceSettings::apply(bool temporary) {
} }
bool IDeviceSettings::applyDefaults(bool temporary) { bool IDeviceSettings::applyDefaults(bool temporary) {
if(readonly)
return false;
com->sendCommand(Command::SetDefaultSettings); com->sendCommand(Command::SetDefaultSettings);
std::shared_ptr<Message> msg = com->waitForMessageSync(std::make_shared<Main51MessageFilter>(Command::SetDefaultSettings), std::chrono::milliseconds(1000)); std::shared_ptr<Message> msg = com->waitForMessageSync(std::make_shared<Main51MessageFilter>(Command::SetDefaultSettings), std::chrono::milliseconds(1000));
if(!msg || msg->data[0] != 1) { if(!msg || msg->data[0] != 1) {
@ -171,6 +177,9 @@ bool IDeviceSettings::applyDefaults(bool temporary) {
} }
bool IDeviceSettings::setBaudrateFor(Network net, uint32_t baudrate) { bool IDeviceSettings::setBaudrateFor(Network net, uint32_t baudrate) {
if(readonly)
return false;
switch(net.getType()) { switch(net.getType()) {
case Network::Type::CAN: { case Network::Type::CAN: {
CAN_SETTINGS* cfg = getCANSettingsFor(net); CAN_SETTINGS* cfg = getCANSettingsFor(net);
@ -191,6 +200,9 @@ bool IDeviceSettings::setBaudrateFor(Network net, uint32_t baudrate) {
} }
template<typename T> bool IDeviceSettings::setStructure(const T& newStructure) { template<typename T> bool IDeviceSettings::setStructure(const T& newStructure) {
if(readonly)
return false;
if(sizeof(T) != structSize) if(sizeof(T) != structSize)
return false; // The wrong structure was passed in for the current device return false; // The wrong structure was passed in for the current device

View File

@ -302,6 +302,8 @@ public:
template<typename T> bool setStructure(const T& newStructure); template<typename T> bool setStructure(const T& newStructure);
uint8_t getEnumValueForBaudrate(uint32_t baudrate); uint8_t getEnumValueForBaudrate(uint32_t baudrate);
bool readonly = false;
protected: protected:
std::shared_ptr<Communication> com; std::shared_ptr<Communication> com;
size_t structSize; size_t structSize;

View File

@ -18,6 +18,7 @@ public:
auto decoder = std::unique_ptr<Decoder>(new Decoder()); auto decoder = std::unique_ptr<Decoder>(new Decoder());
com = std::make_shared<Communication>(std::move(transport), packetizer, std::move(encoder), std::move(decoder)); com = std::make_shared<Communication>(std::move(transport), packetizer, std::move(encoder), std::move(decoder));
settings = std::unique_ptr<IDeviceSettings>(new NeoVIFIRE2Settings(com)); settings = std::unique_ptr<IDeviceSettings>(new NeoVIFIRE2Settings(com));
settings->readonly = true;
productId = PRODUCT_ID; productId = PRODUCT_ID;
} }