diff --git a/api/icsneoc/icsneoc.cpp b/api/icsneoc/icsneoc.cpp index f57bd78..29eb4e6 100644 --- a/api/icsneoc/icsneoc.cpp +++ b/api/icsneoc/icsneoc.cpp @@ -599,13 +599,18 @@ bool icsneo_getSupportedDevices(devicetype_t* devices, size_t* count) { return true; } -extern bool DLLExport icsneo_getTimestampMultiplier(const neodevice_t* device, int* multiplier) +extern bool DLLExport icsneo_getTimestampResolution(const neodevice_t* device, uint16_t* resolution) { if (!icsneo_isValidNeoDevice(device)) { ErrorManager::GetInstance().add(APIError::InvalidNeoDevice); return false; } - *multiplier = device->device->getTimestampMultiplier(); + if (resolution == nullptr) { + ErrorManager::GetInstance().add(APIError::RequiredParameterNull); + return false; + } + + *resolution = device->device->getTimestampResolution(); return true; } diff --git a/api/icsneolegacy/icsneolegacy.cpp b/api/icsneolegacy/icsneolegacy.cpp index 3adc2ec..59ec2d0 100644 --- a/api/icsneolegacy/icsneolegacy.cpp +++ b/api/icsneolegacy/icsneolegacy.cpp @@ -37,7 +37,7 @@ static NeoDevice OldNeoDeviceFromNew(const neodevice_t* newnd) { return oldnd; } -static void NeoMessageToSpyMessage(const neomessage_t& newmsg, icsSpyMessage& oldmsg) { +static void NeoMessageToSpyMessage(const neodevice_t* device, const neomessage_t& newmsg, icsSpyMessage& oldmsg) { memset(&oldmsg, 0, sizeof(icsSpyMessage)); oldmsg.NumberBytesData = (uint8_t)std::min(newmsg.length, (size_t)255); oldmsg.NumberBytesHeader = 4; @@ -59,12 +59,25 @@ static void NeoMessageToSpyMessage(const neomessage_t& newmsg, icsSpyMessage& ol oldmsg.Protocol = SPY_PROTOCOL_ETHERNET; break; } + // Timestamp - epoch = 1/1/2007 - 25ns per tick most of the time uint64_t t = newmsg.timestamp; - if (newmsg.timestampMultiplier) - t /= newmsg.timestampMultiplier; - oldmsg.TimeHardware2 = (unsigned long)(t >> 32); - oldmsg.TimeHardware = (unsigned long)(t & 0xFFFFFFFF); + uint16_t res = 0; + if (icsneo_getTimestampResolution(device, &res)) { + t /= res; + oldmsg.TimeHardware2 = (unsigned long)(t >> 32); + oldmsg.TimeHardware = (unsigned long)(t & 0xFFFFFFFF); + switch (res) { + case 25: + oldmsg.TimeStampHardwareID = HARDWARE_TIMESTAMP_ID_NEORED_25NS; + break; + case 10: + oldmsg.TimeStampHardwareID = HARDWARE_TIMESTAMP_ID_NEORED_10NS; + break; + default: + oldmsg.TimeStampHardwareID = HARDWARE_TIMESTAMP_ID_NONE; + } + } } //Basic Functions @@ -186,7 +199,7 @@ int icsneoGetMessages(void* hObject, icsSpyMessage* pMsg, int* pNumberOfMessages *pNumberOfErrors = 0; for(size_t i = 0; i < messageCount; i++) - NeoMessageToSpyMessage(messages[i], pMsg[i]); + NeoMessageToSpyMessage(device, messages[i], pMsg[i]); return true; } @@ -236,8 +249,8 @@ int icsneoGetTimeStampForMsg(void* hObject, icsSpyMessage* pMsg, double* pTimeSt return false; neodevice_t* device = (neodevice_t*)hObject; - int multiplier = 0; - if (!icsneo_getTimestampMultiplier(device, &multiplier)) + uint16_t resolution = 0; + if (!icsneo_getTimestampResolution(device, &resolution)) return false; // Convert back to ticks @@ -246,7 +259,7 @@ int icsneoGetTimeStampForMsg(void* hObject, icsSpyMessage* pMsg, double* pTimeSt ticks += pMsg->TimeHardware; // convert to ns - ticks *= multiplier; + ticks *= resolution; // icsneoGetTimeStampForMsg() expects pTimeStamp to be in seconds *pTimeStamp = ticks / (double)1000000000; diff --git a/communication/decoder.cpp b/communication/decoder.cpp index 15c0062..3bb8edd 100644 --- a/communication/decoder.cpp +++ b/communication/decoder.cpp @@ -25,10 +25,9 @@ bool Decoder::decode(std::shared_ptr& result, const std::shared_ptrtimestamp *= timestampMultiplier; - result->timestampMultiplier = timestampMultiplier; + // Timestamps are in (resolution) ns increments since 1/1/2007 GMT 00:00:00.0000 + // The resolution depends on the device + result->timestamp *= timestampResolution; result->network = packet->network; return true; case Network::Type::CAN: @@ -41,10 +40,9 @@ bool Decoder::decode(std::shared_ptr& result, const std::shared_ptrtimestamp *= timestampMultiplier; - result->timestampMultiplier = timestampMultiplier; + // Timestamps are in (resolution) ns increments since 1/1/2007 GMT 00:00:00.0000 + // The resolution depends on the device + result->timestamp *= timestampResolution; result->network = packet->network; return true; } diff --git a/communication/message/neomessage.cpp b/communication/message/neomessage.cpp index 98fced3..191eb7c 100644 --- a/communication/message/neomessage.cpp +++ b/communication/message/neomessage.cpp @@ -14,7 +14,6 @@ neomessage_t icsneo::CreateNeoMessage(const std::shared_ptr message) { neomsg.length = message->data.size(); neomsg.data = message->data.data(); neomsg.timestamp = message->timestamp; - neomsg.timestampMultiplier = message->timestampMultiplier; neomsg.status.globalError = message->error; neomsg.status.transmitMessage = message->transmitted; diff --git a/communication/packet/canpacket.cpp b/communication/packet/canpacket.cpp index 2bb57c8..9ec41b6 100644 --- a/communication/packet/canpacket.cpp +++ b/communication/packet/canpacket.cpp @@ -17,8 +17,8 @@ std::shared_ptr HardwareCANPacket::DecodeToMessage(const std::vector msg->arbid = data->header.SID; } - // This timestamp is raw off the device (in timestampMultiplier increments) - // Decoder will fix as it has information about the timestampMultiplier increments + // This timestamp is raw off the device (in timestampResolution increments) + // Decoder will fix as it has information about the timestampResolution increments msg->timestamp = data->timestamp.TS; // DLC diff --git a/communication/packet/ethernetpacket.cpp b/communication/packet/ethernetpacket.cpp index e380f9f..4d1f6bd 100644 --- a/communication/packet/ethernetpacket.cpp +++ b/communication/packet/ethernetpacket.cpp @@ -40,8 +40,8 @@ std::shared_ptr HardwareEthernetPacket::DecodeToMessage(const s if(message.frameTooShort) message.error = true; - // This timestamp is raw off the device (in timestampMultiplier increments) - // Decoder will fix as it has information about the timestampMultiplier increments + // This timestamp is raw off the device (in timestampResolution increments) + // Decoder will fix as it has information about the timestampResolution increments message.timestamp = packet->timestamp.TS; // Network ID is also not set, this will be fixed in the Decoder as well diff --git a/device/device.cpp b/device/device.cpp index 34cb678..741286e 100644 --- a/device/device.cpp +++ b/device/device.cpp @@ -67,8 +67,8 @@ bool Device::SerialStringIsNumeric(const std::string& serial) { return isdigit(serial[0]) && isdigit(serial[1]); } -int Device::getTimestampMultiplier() const { - return com->decoder->timestampMultiplier; +uint16_t Device::getTimestampResolution() const { + return com->decoder->timestampResolution; } std::string Device::describe() const { diff --git a/include/icsneo/communication/decoder.h b/include/icsneo/communication/decoder.h index 792cd37..bdeab9d 100644 --- a/include/icsneo/communication/decoder.h +++ b/include/icsneo/communication/decoder.h @@ -19,7 +19,7 @@ public: Decoder(device_errorhandler_t err) : err(err) {} bool decode(std::shared_ptr& result, const std::shared_ptr& packet); - int timestampMultiplier = 25; + uint16_t timestampResolution = 25; private: device_errorhandler_t err; diff --git a/include/icsneo/communication/message/message.h b/include/icsneo/communication/message/message.h index 6aa2522..3ed805c 100644 --- a/include/icsneo/communication/message/message.h +++ b/include/icsneo/communication/message/message.h @@ -12,7 +12,6 @@ public: Network network; std::vector data; uint64_t timestamp = 0; - int timestampMultiplier = 0; uint16_t description = 0; bool transmitted = false; bool error = false; diff --git a/include/icsneo/communication/message/neomessage.h b/include/icsneo/communication/message/neomessage.h index e093a76..28892c1 100644 --- a/include/icsneo/communication/message/neomessage.h +++ b/include/icsneo/communication/message/neomessage.h @@ -108,8 +108,7 @@ typedef struct { uint8_t header[4]; uint16_t netid; uint8_t type; - uint8_t reserved[15]; - uint16_t timestampMultiplier; + uint8_t reserved[17]; } neomessage_t; // 72 bytes total // Any time you add another neomessage_*_t type, make sure to add it to the static_asserts below! diff --git a/include/icsneo/device/device.h b/include/icsneo/device/device.h index 8910f06..410d391 100644 --- a/include/icsneo/device/device.h +++ b/include/icsneo/device/device.h @@ -29,7 +29,7 @@ public: static uint32_t SerialStringToNum(const std::string& serial); static bool SerialStringIsNumeric(const std::string& serial); - int getTimestampMultiplier() const; + uint16_t getTimestampResolution() const; DeviceType getType() const { return DeviceType(data.type); } uint16_t getProductId() const { return productId; } std::string getSerial() const { return data.serial; } diff --git a/include/icsneo/device/radgalaxy/radgalaxy.h b/include/icsneo/device/radgalaxy/radgalaxy.h index 43ec2d8..9b8319b 100644 --- a/include/icsneo/device/radgalaxy/radgalaxy.h +++ b/include/icsneo/device/radgalaxy/radgalaxy.h @@ -99,7 +99,7 @@ protected: virtual void setupDecoder(Decoder& decoder) override { Device::setupDecoder(decoder); - decoder.timestampMultiplier = 10; // Timestamps are in 10ns increments instead of the usual 25ns + decoder.timestampResolution = 10; // Timestamps are in 10ns increments instead of the usual 25ns } virtual void setupSupportedRXNetworks(std::vector& rxNetworks) override { diff --git a/include/icsneo/device/radstar2/radstar2.h b/include/icsneo/device/radstar2/radstar2.h index dea0e17..19450bf 100644 --- a/include/icsneo/device/radstar2/radstar2.h +++ b/include/icsneo/device/radstar2/radstar2.h @@ -41,7 +41,7 @@ protected: virtual void setupDecoder(Decoder& decoder) override { Device::setupDecoder(decoder); - decoder.timestampMultiplier = 10; // Timestamps are in 10ns increments instead of the usual 25ns + decoder.timestampResolution = 10; // Timestamps are in 10ns increments instead of the usual 25ns } virtual void setupSupportedRXNetworks(std::vector& rxNetworks) override { diff --git a/include/icsneo/device/radsupermoon/radsupermoon.h b/include/icsneo/device/radsupermoon/radsupermoon.h index 22cdfd5..75af958 100644 --- a/include/icsneo/device/radsupermoon/radsupermoon.h +++ b/include/icsneo/device/radsupermoon/radsupermoon.h @@ -23,7 +23,7 @@ public: protected: virtual void setupDecoder(Decoder& decoder) override { - decoder.timestampMultiplier = 10; // Timestamps are in 10ns increments instead of the usual 25ns + decoder.timestampResolution = 10; // Timestamps are in 10ns increments instead of the usual 25ns } private: diff --git a/include/icsneo/icsnVC40.h b/include/icsneo/icsnVC40.h index ce89fe1..6548e78 100644 --- a/include/icsneo/icsnVC40.h +++ b/include/icsneo/icsnVC40.h @@ -398,6 +398,18 @@ typedef unsigned __int64 uint64_t; #define NEOVI_RED_TIMESTAMP_2_10NS 429.4967296 #define NEOVI_RED_TIMESTAMP_1_10NS 0.000000010 +#define HARDWARE_TIMESTAMP_ID_NONE (unsigned char)0 +#define HARDWARE_TIMESTAMP_ID_VSI (unsigned char)1 +#define HARDWARE_TIMESTAMP_ID_AVT_716 (unsigned char)2 +#define HARDWARE_TIMESTAMP_ID_NI_CAN (unsigned char)3 +#define HARDWARE_TIMESTAMP_ID_NEOVI (unsigned char)4 +#define HARDWARE_TIMESTAMP_ID_AVT_717 (unsigned char)5 +#define HARDWARE_TIMESTAMP_ID_NEOv6_VCAN (unsigned char)6 +#define HARDWARE_TIMESTAMP_ID_DOUBLE_SEC (unsigned char)7 +#define HARDWARE_TIMESTAMP_ID_NEORED_10US (unsigned char)8 +#define HARDWARE_TIMESTAMP_ID_NEORED_25NS (unsigned char)9 +#define HARDWARE_TIMESTAMP_ID_NEORED_10NS (unsigned char)10 + typedef struct { uint32_t DeviceType; diff --git a/include/icsneo/icsneoc.h b/include/icsneo/icsneoc.h index b7380a1..4d9cd1b 100644 --- a/include/icsneo/icsneoc.h +++ b/include/icsneo/icsneoc.h @@ -627,13 +627,13 @@ extern size_t DLLExport icsneo_getErrorLimit(void); extern bool DLLExport icsneo_getSupportedDevices(devicetype_t* devices, size_t* count); /** - * \brief Get the devices timestamp multiplier - * \param[out] device A pointer to a buffer of devicetype_t structures which will be written to. - * \param[inout] multiplier A pointer to an int, for legacy tick rate to ns + * \brief Get the timestamp resolution for the given device + * \param[out] device A pointer to the neodevice_t structure specifying the device to read out the timestamp for. + * \param[out] resolution A pointer to a uint16_t where the resolution will be stored. This value is in nanoseconds. - * \returns True unless device is invalid + * \returns True if the resolution was written */ -extern bool DLLExport icsneo_getTimestampMultiplier(const neodevice_t* device, int* multiplier); +extern bool DLLExport icsneo_getTimestampResolution(const neodevice_t* device, uint16_t* resolution);