-
Notifications
You must be signed in to change notification settings - Fork 45
/
Copy pathDataSenderProtoReader.cpp
114 lines (101 loc) · 3.66 KB
/
DataSenderProtoReader.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
#include "DataSenderProtoReader.h"
#include "CANDataTypes.h"
#include "LoggingModule.h"
#include "OBDDataTypes.h"
#include "SignalTypes.h"
#include "TimeTypes.h"
#include <algorithm>
#include <array>
#include <cstdint>
#include <google/protobuf/message.h>
#include <vector>
namespace Aws
{
namespace IoTFleetWise
{
DataSenderProtoReader::DataSenderProtoReader( CANInterfaceIDTranslator &canIDTranslator )
: mIDTranslator( canIDTranslator )
{
}
DataSenderProtoReader::~DataSenderProtoReader()
{
google::protobuf::ShutdownProtobufLibrary();
}
bool
DataSenderProtoReader::setupVehicleData( const std::string &data )
{
mVehicleData.Clear();
return mVehicleData.ParseFromString( data );
}
bool
DataSenderProtoReader::deserializeVehicleData( TriggeredCollectionSchemeData &out )
{
out.eventID = mVehicleData.collection_event_id();
out.triggerTime = mVehicleData.collection_event_time_ms_epoch();
// metadata
out.metadata.collectionSchemeID = mVehicleData.campaign_sync_id();
out.metadata.decoderID = mVehicleData.decoder_sync_id();
// signals
for ( auto i = 0; i < mVehicleData.captured_signals_size(); ++i )
{
auto protoSignal = mVehicleData.captured_signals( i );
CollectedSignal signal{};
signal.signalID = protoSignal.signal_id();
auto receiveTime =
protoSignal.relative_time_ms() + static_cast<int64_t>( mVehicleData.collection_event_time_ms_epoch() );
if ( receiveTime >= 0 )
{
signal.receiveTime = static_cast<Timestamp>( receiveTime );
}
signal.value.setVal( protoSignal.double_value(), SignalType::DOUBLE );
out.signals.emplace_back( signal );
}
// can frames
for ( auto i = 0; i < mVehicleData.can_frames_size(); ++i )
{
auto protoFrame = mVehicleData.can_frames( i );
if ( protoFrame.byte_values().size() > MAX_CAN_FRAME_BYTE_SIZE )
{
FWE_LOG_WARN( "Skipping malformed CAN frame with size larger than " +
std::to_string( MAX_CAN_FRAME_BYTE_SIZE ) +
". fID: " + std::to_string( protoFrame.message_id() ) );
continue;
}
CollectedCanRawFrame frame{};
frame.size = static_cast<uint8_t>( protoFrame.byte_values().size() );
std::array<uint8_t, MAX_CAN_FRAME_BYTE_SIZE> buf = {};
std::copy_n( protoFrame.byte_values().begin(), frame.size, buf.begin() );
frame.data = buf;
auto receiveTime =
protoFrame.relative_time_ms() + static_cast<int64_t>( mVehicleData.collection_event_time_ms_epoch() );
if ( receiveTime >= 0 )
{
frame.receiveTime = static_cast<Timestamp>( receiveTime );
}
frame.frameID = protoFrame.message_id();
frame.channelId = mIDTranslator.getChannelNumericID( protoFrame.interface_id() );
out.canFrames.emplace_back( frame );
}
// dtc info
if ( mVehicleData.has_dtc_data() )
{
DTCInfo info;
// NOTE: mSID is purposefully omitted because it is not serialized
auto receiveTime = mVehicleData.dtc_data().relative_time_ms() +
static_cast<int64_t>( mVehicleData.collection_event_time_ms_epoch() );
if ( receiveTime >= 0 )
{
info.receiveTime = static_cast<Timestamp>( receiveTime );
}
for ( auto code : mVehicleData.dtc_data().active_dtc_codes() )
{
info.mDTCCodes.emplace_back( code );
}
out.mDTCInfo = info;
}
return true;
}
} // namespace IoTFleetWise
} // namespace Aws