mirror of
https://github.com/intrepidcs/libicsneo.git
synced 2026-08-05 01:18:36 +02:00
Added error checking to functions called from Communication
This commit is contained in:
@@ -73,12 +73,16 @@ bool Communication::getSettingsSync(std::vector<uint8_t>& data, std::chrono::mil
|
||||
return false;
|
||||
|
||||
std::shared_ptr<ReadSettingsMessage> gsmsg = std::dynamic_pointer_cast<ReadSettingsMessage>(msg);
|
||||
if(!gsmsg)
|
||||
if(!gsmsg) {
|
||||
err(APIError::Unknown);
|
||||
return false;
|
||||
}
|
||||
|
||||
if(gsmsg->response != ReadSettingsMessage::Response::OK)
|
||||
if(gsmsg->response != ReadSettingsMessage::Response::OK) {
|
||||
err(APIError::Unknown);
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
data = std::move(msg->data);
|
||||
return true;
|
||||
}
|
||||
@@ -108,6 +112,7 @@ bool Communication::removeMessageCallback(int id) {
|
||||
messageCallbacks.erase(id);
|
||||
return true;
|
||||
} catch(...) {
|
||||
err(APIError::Unknown);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,11 +13,13 @@ bool Encoder::encode(std::vector<uint8_t>& result, const std::shared_ptr<Message
|
||||
switch(message->network.getType()) {
|
||||
case Network::Type::Ethernet: {
|
||||
auto ethmsg = std::dynamic_pointer_cast<EthernetMessage>(message);
|
||||
if(!ethmsg)
|
||||
if(!ethmsg) {
|
||||
err(APIError::MessageFormattingError);
|
||||
return false; // The message was not a properly formed EthernetMessage
|
||||
}
|
||||
|
||||
useResultAsBuffer = true;
|
||||
if(!HardwareEthernetPacket::EncodeFromMessage(*ethmsg, result))
|
||||
if(!HardwareEthernetPacket::EncodeFromMessage(*ethmsg, result, err))
|
||||
return false;
|
||||
|
||||
break;
|
||||
@@ -26,14 +28,18 @@ bool Encoder::encode(std::vector<uint8_t>& result, const std::shared_ptr<Message
|
||||
case Network::Type::SWCAN:
|
||||
case Network::Type::LSFTCAN: {
|
||||
auto canmsg = std::dynamic_pointer_cast<CANMessage>(message);
|
||||
if(!canmsg)
|
||||
if(!canmsg) {
|
||||
err(APIError::MessageFormattingError);
|
||||
return false; // The message was not a properly formed CANMessage
|
||||
}
|
||||
|
||||
if(!supportCANFD && canmsg->isCANFD)
|
||||
if(!supportCANFD && canmsg->isCANFD) {
|
||||
err(APIError::CANFDNotSupported);
|
||||
return false; // This device does not support CAN FD
|
||||
|
||||
}
|
||||
|
||||
useResultAsBuffer = true;
|
||||
if(!HardwareCANPacket::EncodeFromMessage(*canmsg, result))
|
||||
if(!HardwareCANPacket::EncodeFromMessage(*canmsg, result, err))
|
||||
return false; // The CANMessage was malformed
|
||||
|
||||
break;
|
||||
@@ -69,6 +75,7 @@ bool Encoder::encode(std::vector<uint8_t>& result, const std::shared_ptr<Message
|
||||
break;
|
||||
}
|
||||
default:
|
||||
err(APIError::UnexpectedNetworkType);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,5 +50,10 @@ bool ICommunication::write(const std::vector<uint8_t>& bytes) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return writeQueue.enqueue(WriteOperation(bytes));
|
||||
|
||||
bool ret = writeQueue.enqueue(WriteOperation(bytes));
|
||||
if(!ret) {
|
||||
err(APIError::Unknown);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
@@ -79,13 +79,17 @@ std::shared_ptr<CANMessage> HardwareCANPacket::DecodeToMessage(const std::vector
|
||||
return msg;
|
||||
}
|
||||
|
||||
bool HardwareCANPacket::EncodeFromMessage(const CANMessage& message, std::vector<uint8_t>& result) {
|
||||
if(message.isCANFD && message.isRemote)
|
||||
bool HardwareCANPacket::EncodeFromMessage(const CANMessage& message, std::vector<uint8_t>& result, const device_errorhandler_t& err) {
|
||||
if(message.isCANFD && message.isRemote) {
|
||||
err(APIError::RTRNotSupported);
|
||||
return false; // RTR frames can not be used with CAN FD
|
||||
}
|
||||
|
||||
const size_t dataSize = message.data.size();
|
||||
if(dataSize > 64 || (dataSize > 8 && !message.isCANFD))
|
||||
if(dataSize > 64 || (dataSize > 8 && !message.isCANFD)) {
|
||||
err(APIError::MessageDataOverCapacity);
|
||||
return false; // Too much data for the protocol
|
||||
}
|
||||
|
||||
uint8_t lengthNibble = uint8_t(message.data.size());
|
||||
uint8_t paddingBytes = 0;
|
||||
@@ -162,6 +166,7 @@ bool HardwareCANPacket::EncodeFromMessage(const CANMessage& message, std::vector
|
||||
lengthNibble = 0xF;
|
||||
break;
|
||||
default:
|
||||
err(APIError::Unknown);
|
||||
return false; // CAN FD frame may have had an incorrect byte count
|
||||
}
|
||||
}
|
||||
@@ -176,8 +181,10 @@ bool HardwareCANPacket::EncodeFromMessage(const CANMessage& message, std::vector
|
||||
|
||||
// Next 2-4 bytes are ArbID
|
||||
if(message.isExtended) {
|
||||
if(message.arbid >= 0x20000000) // Extended messages use 29-bit arb IDs
|
||||
if(message.arbid >= 0x20000000) {// Extended messages use 29-bit arb IDs
|
||||
err(APIError::MessageFormattingError);
|
||||
return false;
|
||||
}
|
||||
|
||||
result.insert(result.end(), {
|
||||
(uint8_t)(message.arbid >> 21),
|
||||
@@ -186,8 +193,10 @@ bool HardwareCANPacket::EncodeFromMessage(const CANMessage& message, std::vector
|
||||
(uint8_t)message.arbid
|
||||
});
|
||||
} else {
|
||||
if(message.arbid >= 0x800) // Standard messages use 11-bit arb IDs
|
||||
if(message.arbid >= 0x800) {// Standard messages use 11-bit arb IDs
|
||||
err(APIError::MessageFormattingError);
|
||||
return false;
|
||||
}
|
||||
|
||||
result.insert(result.end(), {
|
||||
(uint8_t)(message.arbid >> 3),
|
||||
|
||||
@@ -53,7 +53,7 @@ std::shared_ptr<EthernetMessage> HardwareEthernetPacket::DecodeToMessage(const s
|
||||
return messagePtr;
|
||||
}
|
||||
|
||||
bool HardwareEthernetPacket::EncodeFromMessage(const EthernetMessage& message, std::vector<uint8_t>& bytestream) {
|
||||
bool HardwareEthernetPacket::EncodeFromMessage(const EthernetMessage& message, std::vector<uint8_t>& bytestream, const device_errorhandler_t& err) {
|
||||
const size_t unpaddedSize = message.data.size();
|
||||
size_t paddedSize = unpaddedSize;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user