Project

General

Profile

Support Request #7981 ยป VehicleModelOutputBehaviour.cpp

Please note MediaSampleDescription from source - hidden, 2019-08-12 11:39

 
1
/**
2
 * Vehicle ModelOutput Behaviour Source.
3
 *
4
 * @file
5
 * Copyright © Digiteq automotive. All rights reserved
6
 *
7
 * $Author: voigtlpi $
8
 * $Date: 2013-10-21 16:19:03 +0200 (Mon, 21 Oct 2013) $
9
 * $Revision: 41925 $
10
 *
11
 * @remarks
12
 */
13
#include "stdafx.h"
14
#include "VehicleModelOutputBehaviour.h"
15

    
16
/// Create filter for random number generator
17
ADTF_FILTER_PLUGIN("Vehicle ModelOutput Behaviour", OID_ADTF_MODEL_OUT_BEHAVIOR_FILTER, cVehicleModelOutputB)
18

    
19

    
20

    
21
cVehicleModelOutputB::cVehicleModelOutputB(const tChar* __info) : adtf::cAsyncDataTriggeredFilter(__info)
22
{
23
  memset(&m_sVehicleBehaviour, 0, sizeof(m_sVehicleBehaviour)); 
24
  m_DataReceived = false;
25
  m_CycleTime = 100000;
26
}
27

    
28

    
29
cVehicleModelOutputB::~cVehicleModelOutputB()
30
{
31
}
32

    
33

    
34

    
35
tResult cVehicleModelOutputB::Start( __exception)
36
{   
37
   m_oThread.Run();
38
   return cFilter::Start(__exception_ptr);
39
}
40

    
41
tResult cVehicleModelOutputB::Stop( __exception)
42
{
43
   m_oThread.Suspend();   
44
   return cFilter::Stop(__exception_ptr);
45
}
46

    
47

    
48
const char OUTPUT_PIN_NAME[] = "output_vehicle_behaviour";
49
const char INPUT_PIN_NAME[] = "input_vehicle_behaviour";
50

    
51
tResult cVehicleModelOutputB::Init(tInitStage eStage, __exception)
52
{
53
  RETURN_IF_FAILED(cAsyncDataTriggeredFilter::Init(eStage, __exception_ptr));
54

    
55
  switch(eStage)
56
  {
57
    case StageFirst:
58
		// Output to ADTF framework
59
        RETURN_IF_FAILED(m_oOutputVehicleBehaviour.Create(OUTPUT_PIN_NAME,
60
            cObjectPtr<IMediaType>(new cMediaType(MEDIA_TYPE_VEHICLE_MODEL_OUTPUT_BEHAVIOUR, MEDIA_SUBTYPE_VEHICLE_MODEL_OUTPUT_BEHAVIOUR_V1)),
61
            static_cast<IPinEventSink*>(this)));
62
        RETURN_IF_FAILED(RegisterPin(&m_oOutputVehicleBehaviour));
63

    
64
		// Input from Matlab
65
	RETURN_IF_FAILED(m_pInputPin.Create(INPUT_PIN_NAME,
66
            cObjectPtr<IMediaType>(new cMediaType(0,0)), //MEDIA_TYPE_STRUCTURED_DATA, MEDIA_SUBTYPE_STRUCT_STRUCTURED)),	// Regular output for ADTF-Matlab connection
67
            //cObjectPtr<IMediaType>(new cMediaType(MEDIA_TYPE_VEHICLE_MODEL_OUTPUT_BEHAVIOUR, MEDIA_SUBTYPE_VEHICLE_MODEL_OUTPUT_BEHAVIOUR_V1)), // Just a hack for EF6 testing.
68
            static_cast<IPinEventSink*>(this)));
69
        RETURN_IF_FAILED(RegisterPin(&m_pInputPin));
70

    
71
        break;
72

    
73
    case StageNormal:
74
			// init all properties
75
	{
76
          adtf_util::cString strByteOrder = "LE";
77
          if(PLATFORM_BYTEORDER == PLATFORM_BIG_ENDIAN_8)
78
          {
79
            strByteOrder = "BE";
80
          }
81
          adtf_util::cString strTypeNameI = adtf_util::cString::Format("tVehicleModelOutputBehaviour_%s", OIGetInstanceName());
82

    
83
          adtf_util::cString strMyDescriptionI = adtf_util::cString::Format(
84
        "<structs>"
85
        "<struct alignment=\"8\" name=\"tVehicleModelAnimationState\" version=\"1\">"
86
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"0\" type=\"tFloat64\" name=\"fSteeringPosition\"/>"
87
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"8\" type=\"tFloat64\" name=\"afWheelAngle0\"/>"
88
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"16\" type=\"tFloat64\" name=\"afWheelAngle1\"/>"
89
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"24\" type=\"tFloat64\" name=\"afWheelAngle2\"/>"
90
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"32\" type=\"tFloat64\" name=\"afWheelAngle3\"/>"
91
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"40\" type=\"tFloat64\" name=\"afWheelDeflection0\"/>"
92
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"48\" type=\"tFloat64\" name=\"afWheelDeflection1\"/>"
93
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"56\" type=\"tFloat64\" name=\"afWheelDeflection2\"/>"
94
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"64\" type=\"tFloat64\" name=\"afWheelDeflection3\"/>"
95
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"72\" type=\"tUInt32\" name=\"nLightMask\"/>"
96
            "<element alignment=\"4\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"74\" type=\"tUInt32\" name=\"void\"/>"
97
        "</struct>"
98
        "<struct alignment=\"8\" name=\"tDrivetrain\" version=\"1\">"
99
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"0\" type=\"tFloat64\" name=\"fGear\"/>"
100
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"8\" type=\"tFloat64\" name=\"fGearboxType\"/>"
101
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"16\" type=\"tFloat64\" name=\"fDrivetrainType\"/>"
102
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"24\" type=\"tFloat64\" name=\"fTorqueGearBoxIn\"/>"
103
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"32\" type=\"tFloat64\" name=\"fTorqueCenterDiffOut0\"/>"
104
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"40\" type=\"tFloat64\" name=\"fTorqueCenterDiffOut1\"/>"
105
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"48\" type=\"tFloat64\" name=\"fTorqueShaft\"/>"
106
        "</struct>"
107
        "<struct alignment=\"8\" name=\"tEngine\" version=\"1\">"
108
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"0\" type=\"tFloat64\" name=\"fRpm\"/>"
109
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"8\" type=\"tFloat64\" name=\"fTorque\"/>"
110
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"16\" type=\"tFloat64\" name=\"fLoad\"/>"
111
        "</struct>"
112
        "<struct alignment=\"8\" name=\"tWheel\" version=\"1\">"
113
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"0\" type=\"tFloat64\" name=\"fSpringCompression\"/>"
114
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"8\" type=\"tFloat64\" name=\"fSteeringAngle\"/>"
115
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"16\" type=\"tFloat64\" name=\"fRotAngle\"/>"
116
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"24\" type=\"tFloat64\" name=\"fRotAngleDot\"/>"
117
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"32\" type=\"tFloat64\" name=\"fSlip\"/>"
118
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"40\" type=\"tFloat64\" name=\"fBrakePressure\"/>"
119
        "</struct>"
120
        "<struct alignment=\"8\" name=\"tVehicleModelOutputBehaviour\" version=\"1\">"
121
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"0\" type=\"tVTDPosition\" name=\"sPosition\"/>"
122
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"120\" type=\"tVehicleModelAnimationState\" name=\"sAnimationState\"/>"
123
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"200\" type=\"tFloat64\" name=\"fSteeringMoment\"/>"
124
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"208\" type=\"tEngine\" name=\"sEngine\"/>"
125
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"232\" type=\"tDrivetrain\" name=\"sDrivetrain\"/>"
126
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"288\" type=\"tWheel\" name=\"sWheel0\"/>"
127
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"336\" type=\"tWheel\" name=\"sWheel1\"/>"
128
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"384\" type=\"tWheel\" name=\"sWheel2\"/>"
129
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"432\" type=\"tWheel\" name=\"sWheel3\"/>"
130
        "</struct>"
131
        "<struct alignment=\"8\" name=\"tVTDPosition\" version=\"1\">"
132
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"0\" type=\"tFloat64\" name=\"afXYZ0\"/>"
133
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"8\" type=\"tFloat64\" name=\"afXYZ1\"/>"
134
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"16\" type=\"tFloat64\" name=\"afXYZ2\"/>"
135
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"24\" type=\"tFloat64\" name=\"afXYZdot0\"/>"
136
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"32\" type=\"tFloat64\" name=\"afXYZdot1\"/>"
137
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"40\" type=\"tFloat64\" name=\"afXYZdot2\"/>"
138
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"48\" type=\"tFloat64\" name=\"afXYZdotdot0\"/>"
139
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"56\" type=\"tFloat64\" name=\"afXYZdotdot1\"/>"
140
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"64\" type=\"tFloat64\" name=\"afXYZdotdot2\"/>"
141
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"72\" type=\"tFloat64\" name=\"afHPR0\"/>"
142
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"80\" type=\"tFloat64\" name=\"afHPR1\"/>"
143
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"88\" type=\"tFloat64\" name=\"afHPR2\"/>"
144
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"96\" type=\"tFloat64\" name=\"afHPRdot0\"/>"
145
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"104\" type=\"tFloat64\" name=\"afHPRdot1\"/>"
146
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"112\" type=\"tFloat64\" name=\"afHPRdot2\"/>"
147
        "</struct>"
148
        "</structs>");
149

    
150
          ucom::cObjectPtr<adtf::IMediaType> pTypeI = NULL;
151
          RETURN_IF_FAILED(m_pInputPin.GetMediaType(&pTypeI));
152
          ucom::cObjectPtr<adtf::IMediaTypeDescription> pTypeDescriptionI = NULL;
153
          if(IS_OK(pTypeI->GetInterface(IID_ADTF_MEDIA_TYPE_DESCRIPTION, (tVoid**)&pTypeDescriptionI)))
154
          {
155
            //if you are not sure your description works! 
156
            //react on this return value!
157
            RETURN_IF_FAILED(pTypeDescriptionI->SetMediaSampleDescription("tVehicleModelOutputBehaviour",		//strTypeName,
158
                                                                         strMyDescriptionI.GetPtr(),
159
                                                                         IMediaDescription::MDF_DDL020000));
160
          }
161

    
162
        adtf_util::cString strMyDescription = adtf_util::cString::Format(
163
        "<structs>"
164
        "<struct alignment=\"8\" name=\"tVehicleModelAnimationStateI\" version=\"1\">"
165
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"%u\" type=\"tFloat64\" name=\"fSteeringPosition\"/>"
166
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"%u\" type=\"tFloat64\" name=\"afWheelAngle0\"/>"
167
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"%u\" type=\"tFloat64\" name=\"afWheelAngle1\"/>"
168
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"%u\" type=\"tFloat64\" name=\"afWheelAngle2\"/>"
169
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"%u\" type=\"tFloat64\" name=\"afWheelAngle3\"/>"
170
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"%u\" type=\"tFloat64\" name=\"afWheelDeflection0\"/>"
171
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"%u\" type=\"tFloat64\" name=\"afWheelDeflection1\"/>"
172
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"%u\" type=\"tFloat64\" name=\"afWheelDeflection2\"/>"
173
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"%u\" type=\"tFloat64\" name=\"afWheelDeflection3\"/>"
174
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"%u\" type=\"tUInt32\" name=\"nLightMask\"/>"
175
            "<element alignment=\"4\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"%u\" type=\"tUInt32\" name=\"void\"/>"
176
        "</struct>"
177
        "<struct alignment=\"8\" name=\"tDrivetrainI\" version=\"1\">"
178
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"%u\" type=\"tFloat64\" name=\"fGear\"/>"
179
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"%u\" type=\"tFloat64\" name=\"fGearboxType\"/>"
180
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"%u\" type=\"tFloat64\" name=\"fDrivetrainType\"/>"
181
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"%u\" type=\"tFloat64\" name=\"fTorqueGearBoxIn\"/>"
182
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"%u\" type=\"tFloat64\" name=\"fTorqueCenterDiffOut0\"/>"
183
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"%u\" type=\"tFloat64\" name=\"fTorqueCenterDiffOut1\"/>"
184
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"%u\" type=\"tFloat64\" name=\"fTorqueShaft\"/>"
185
        "</struct>"
186
        "<struct alignment=\"8\" name=\"tEngineI\" version=\"1\">"
187
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"%u\" type=\"tFloat64\" name=\"fRpm\"/>"
188
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"%u\" type=\"tFloat64\" name=\"fTorque\"/>"
189
            "<element alignment=\"8\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"%u\" type=\"tFloat64\" name=\"fLoad\"/>"
190
        "</struct>"
191
        "<struct alignment=\"8\" name=\"tWheelI\" version=\"1\">"
192
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"%u\" type=\"tFloat64\" name=\"fSpringCompression\"/>"
193
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"%u\" type=\"tFloat64\" name=\"fSteeringAngle\"/>"
194
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"%u\" type=\"tFloat64\" name=\"fRotAngle\"/>"
195
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"%u\" type=\"tFloat64\" name=\"fRotAngleDot\"/>"
196
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"%u\" type=\"tFloat64\" name=\"fSlip\"/>"
197
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"%u\" type=\"tFloat64\" name=\"fBrakePressure\"/>"
198
        "</struct>"
199
        "<struct alignment=\"8\" name=\"%s\" version=\"1\">"
200
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"0\" type=\"tVTDPositionI\" name=\"sPosition\"/>"
201
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"%u\" type=\"tVehicleModelAnimationStateI\" name=\"sAnimationState\"/>"
202
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"%u\" type=\"tFloat64\" name=\"fSteeringMoment\"/>"
203
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"%u\" type=\"tEngineI\" name=\"sEngine\"/>"
204
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"%u\" type=\"tDrivetrainI\" name=\"sDrivetrain\"/>"
205
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"%u\" type=\"tWheelI\" name=\"sWheel0\"/>"
206
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"%u\" type=\"tWheelI\" name=\"sWheel1\"/>"
207
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"%u\" type=\"tWheelI\" name=\"sWheel2\"/>"
208
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"%u\" type=\"tWheelI\" name=\"sWheel3\"/>"
209
        "</struct>"
210
        "<struct alignment=\"8\" name=\"tVTDPositionI\" version=\"1\">"
211
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"0\" type=\"tFloat64\" name=\"afXYZ0\"/>"
212
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"8\" type=\"tFloat64\" name=\"afXYZ1\"/>"
213
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"16\" type=\"tFloat64\" name=\"afXYZ2\"/>"
214
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"24\" type=\"tFloat64\" name=\"afXYZdot0\"/>"
215
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"32\" type=\"tFloat64\" name=\"afXYZdot1\"/>"
216
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"40\" type=\"tFloat64\" name=\"afXYZdot2\"/>"
217
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"48\" type=\"tFloat64\" name=\"afXYZdotdot0\"/>"
218
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"56\" type=\"tFloat64\" name=\"afXYZdotdot1\"/>"
219
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"64\" type=\"tFloat64\" name=\"afXYZdotdot2\"/>"
220
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"72\" type=\"tFloat64\" name=\"afHPR0\"/>"
221
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"80\" type=\"tFloat64\" name=\"afHPR1\"/>"
222
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"88\" type=\"tFloat64\" name=\"afHPR2\"/>"
223
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"96\" type=\"tFloat64\" name=\"afHPRdot0\"/>"
224
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"104\" type=\"tFloat64\" name=\"afHPRdot1\"/>"
225
            "<element alignment=\"1\" arraysize=\"1\" byteorder=\"LE\" bytepos=\"112\" type=\"tFloat64\" name=\"afHPRdot2\"/>"
226
        "</struct>"
227
        "</structs>",
228
                offsetof(tVehicleModelAnimationState, fSteeringPosition),
229
                offsetof(tVehicleModelAnimationState, afWheelAngle),
230
                offsetof(tVehicleModelAnimationState, afWheelAngle) + sizeof(tFloat64),
231
                offsetof(tVehicleModelAnimationState, afWheelAngle) + 2*sizeof(tFloat64),
232
                offsetof(tVehicleModelAnimationState, afWheelAngle) + 3*sizeof(tFloat64),
233
                offsetof(tVehicleModelAnimationState, afWheelDeflection),
234
                offsetof(tVehicleModelAnimationState, afWheelDeflection) + sizeof(tFloat64),
235
                offsetof(tVehicleModelAnimationState, afWheelDeflection) + 2*sizeof(tFloat64),
236
                offsetof(tVehicleModelAnimationState, afWheelDeflection) + 3*sizeof(tFloat64),
237
                offsetof(tVehicleModelAnimationState, nLightMask),
238
                offsetof(tVehicleModelAnimationState, nLightMask) + 4,
239

    
240
                offsetof(tDrivetrain, fGear),
241
                offsetof(tDrivetrain, fGearboxType),
242
                offsetof(tDrivetrain, fDrivetrainType),
243
                offsetof(tDrivetrain, fTorqueGearBoxIn),
244
                offsetof(tDrivetrain, fTorqueCenterDiffOut),
245
                offsetof(tDrivetrain, fTorqueCenterDiffOut) + sizeof(tFloat64),
246
                offsetof(tDrivetrain, fTorqueShaft),
247
  
248
                offsetof(tEngine, fRpm),
249
                offsetof(tEngine, fTorque),
250
                offsetof(tEngine, fLoad),
251

    
252
                offsetof(tWheel, fSpringCompression),
253
                offsetof(tWheel, fSteeringAngle),
254
                offsetof(tWheel, fRotAngle),
255
                offsetof(tWheel, fRotAngleDot),
256
                offsetof(tWheel, fSlip),
257
                offsetof(tWheel, fBrakePressure),
258

    
259
		OUTPUT_PIN_NAME,
260
		offsetof(tVehicleModelOutputBehaviour,sAnimationState),
261
                offsetof(tVehicleModelOutputBehaviour,fSteeringMoment),
262
                offsetof(tVehicleModelOutputBehaviour,sEngine),
263
                offsetof(tVehicleModelOutputBehaviour,sDrivetrain),
264
                offsetof(tVehicleModelOutputBehaviour,sWheel),
265
                offsetof(tVehicleModelOutputBehaviour,sWheel) + sizeof(tWheel),
266
                offsetof(tVehicleModelOutputBehaviour,sWheel) + 2*sizeof(tWheel),
267
                offsetof(tVehicleModelOutputBehaviour,sWheel) + 3*sizeof(tWheel)
268
         );
269

    
270
         ucom::cObjectPtr<adtf::IMediaType> pType = NULL;
271
         RETURN_IF_FAILED(m_oOutputVehicleBehaviour.GetMediaType(&pType));
272
         ucom::cObjectPtr<adtf::IMediaTypeDescription> pTypeDescription = NULL;
273
         if(IS_OK(pType->GetInterface(IID_ADTF_MEDIA_TYPE_DESCRIPTION, (tVoid**)&pTypeDescription)))
274
         {
275
            //if you are not sure your description works! 
276
            //react on this return value!
277
            RETURN_IF_FAILED(pTypeDescription->SetMediaSampleDescription(OUTPUT_PIN_NAME,
278
                                                                         strMyDescription.GetPtr(),
279
                                                                         IMediaDescription::MDF_DDL020000));
280
         }
281
        }
282
        break;
283

    
284
    case StageGraphReady:
285
        memset(&m_sVehicleBehaviour, 0, sizeof(m_sVehicleBehaviour)); 
286
        m_DataReceived = false;
287

    
288
        m_oThread.SetCycleTime(m_CycleTime);
289
        m_oThread.Create(0,0,A_UTILS_NS::cThread::TF_Suspended,this);
290
	break;      
291
  }
292

    
293
  RETURN_NOERROR;
294
}
295

    
296

    
297
tResult cVehicleModelOutputB::Shutdown(tInitStage eStage, __exception)
298
{
299
tResult nResult = ERR_NOERROR;
300

    
301
    RETURN_IF_FAILED(cFilter::Shutdown(eStage, __exception_ptr));
302

    
303
    switch (eStage)
304
    {
305
       case StageFirst:   break;       
306
       case StageNormal:  break;
307

    
308
       case StageGraphReady:
309
       {
310
          m_oThread.Release();          
311
          break;
312
       }
313
    }
314
    RETURN_NOERROR;
315
}
316

    
317

    
318
tResult cVehicleModelOutputB::Cycle(__exception)
319
{
320
  if(!m_DataReceived) return ERR_NOERROR;
321
    // declare smart pointer to media sample which automatically
322
    // releases the reference to the sample in the sample pool
323
    // at function exit
324
  ucom::cObjectPtr<adtf::IMediaSample> pNewSample;
325

    
326
    // get a new media sample container from sample pool
327
  RETURN_IF_FAILED(AllocMediaSample((tVoid**)&pNewSample));
328

    
329
    // alloc array buffer
330
  RETURN_IF_FAILED(pNewSample->AllocBuffer(sizeof(tVehicleModelOutputBehaviour)));
331
    
332
  tTimeStamp tmStreamTime = _clock ? _clock->GetStreamTime() : adtf_util::cHighResTimer::GetTime();
333
  pNewSample->SetTime(tmStreamTime);
334

    
335
    // access the sample data buffer
336
  try
337
  {
338
        // acquire the write lock
339
    __sample_write_lock(pNewSample, tVehicleModelOutputBehaviour, pDestDataX);
340
    if(pDestDataX==NULL) return ERR_POINTER;
341

    
342
    memcpy(pDestDataX, &m_sVehicleBehaviour, sizeof(tVehicleModelOutputBehaviour));
343

    
344
        // the write lock will be released when leaving this scope
345
  }
346
  catch(...)
347
  {
348
    LOG_ERROR("VehicleModelOutputBehaviour: cVehicleModelOutputB::Cycle crashed.");
349
    return ERR_EXCEPTION_RAISED;
350
  }
351
    
352
    // transmit sample through the output pin
353
  RETURN_IF_FAILED(m_oOutputVehicleBehaviour.Transmit(pNewSample));
354

    
355
  RETURN_NOERROR;
356
}
357

    
358

    
359
tResult cVehicleModelOutputB::ThreadFunc(A_UTILS_NS::cThread *pThread, tVoid*pvUserData, tSize szUserData)
360
{
361
  if(pThread==&m_oThread) Cycle();
362
  RETURN_NOERROR;
363
}
364

    
365

    
366

    
367
tResult cVehicleModelOutputB::OnPinEvent(IPin* pSource, tInt nEventCode, tInt nParam1, tInt nParam2, IMediaSample* pMediaSample)
368
{
369
  if(nEventCode == IPinEventSink::PE_MediaSampleReceived)
370
  {
371
    if(pSource == &m_pInputPin)
372
    {
373
      tResult ret = ProcessInputBehaviour(pMediaSample);
374
      if(ret != ERR_NOERROR) return ret;
375
      ret = PushOutputVehicleBehaviour();
376
      if(ret != ERR_NOERROR) return ret;
377
    }
378
    else RETURN_ERROR(ERR_NOT_SUPPORTED);
379
  }
380

    
381
  RETURN_NOERROR;
382
}
383

    
384

    
385
tResult cVehicleModelOutputB::OnAsyncPinEvent(IPin *pSource, tInt nEventCode, tInt nParam1, tInt nParam2, IMediaSample *pMediaSample)
386
{
387
if(nEventCode == IPinEventSink::PE_MediaSampleReceived)
388
  {
389
    if(pSource == &m_pInputPin)
390
    {
391
      tResult ret = ProcessInputBehaviour(pMediaSample);
392
      if(ret != ERR_NOERROR) return ret;
393
      ret = PushOutputVehicleBehaviour();
394
      if(ret != ERR_NOERROR) return ret;
395
    }
396
    else RETURN_ERROR(ERR_NOT_SUPPORTED);
397
  }
398

    
399
  RETURN_NOERROR;
400
}
401

    
402

    
403
#define LD_Float64(dest,src)  memcpy(&dest,src,sizeof(double))
404
#define LD_UInt32(dest,src)  memcpy(&dest,src,sizeof(unsigned))
405

    
406
void cVehicleModelOutputB::LoadVTDposition(const char *psInput, tVTDPosition &pVTDPosition)
407
{
408
				// <struct alignment="8" name="tVTDPosition" version="1">
409
  LD_Float64(pVTDPosition.afXYZ[0],psInput);  // <element alignment="1" arraysize="1" byteorder="LE" bytepos="0" type="tFloat64" name="afXYZ0"/>
410
  LD_Float64(pVTDPosition.afXYZ[1],psInput+8);  // <element alignment="1" arraysize="1" byteorder="LE" bytepos="8" type="tFloat64" name="afXYZ1"/>
411
  LD_Float64(pVTDPosition.afXYZ[2],psInput+16);	// <element alignment="1" arraysize="1" byteorder="LE" bytepos="16" type="tFloat64" name="afXYZ2"/>
412
  LD_Float64(pVTDPosition.afXYZdot[0],psInput+24);  // <element alignment="1" arraysize="1" byteorder="LE" bytepos="24" type="tFloat64" name="afXYZdot0"/>
413
  LD_Float64(pVTDPosition.afXYZdot[1],psInput+32); // <element alignment="1" arraysize="1" byteorder="LE" bytepos="32" type="tFloat64" name="afXYZdot1"/>
414
  LD_Float64(pVTDPosition.afXYZdot[2],psInput+40);  // <element alignment="1" arraysize="1" byteorder="LE" bytepos="40" type="tFloat64" name="afXYZdot2"/>
415
  LD_Float64(pVTDPosition.afXYZdotdot[0],psInput+48);  // <element alignment="1" arraysize="1" byteorder="LE" bytepos="48" type="tFloat64" name="afXYZdotdot0"/>
416
  LD_Float64(pVTDPosition.afXYZdotdot[1],psInput+56);  // <element alignment="1" arraysize="1" byteorder="LE" bytepos="56" type="tFloat64" name="afXYZdotdot1"/>
417
  LD_Float64(pVTDPosition.afXYZdotdot[2],psInput+64);  // <element alignment="1" arraysize="1" byteorder="LE" bytepos="64" type="tFloat64" name="afXYZdotdot2"/>
418
  LD_Float64(pVTDPosition.afHPR[0],psInput+72);	   //  <element alignment="1" arraysize="1" byteorder="LE" bytepos="72" type="tFloat64" name="afHPR0"/>
419
  LD_Float64(pVTDPosition.afHPR[1],psInput+80);  // <element alignment="1" arraysize="1" byteorder="LE" bytepos="80" type="tFloat64" name="afHPR1"/>
420
  LD_Float64(pVTDPosition.afHPR[2],psInput+88);  // <element alignment="1" arraysize="1" byteorder="LE" bytepos="88" type="tFloat64" name="afHPR2"/>
421
  LD_Float64(pVTDPosition.afHPRdot[0],psInput+96); // <element alignment="1" arraysize="1" byteorder="LE" bytepos="96" type="tFloat64" name="afHPRdot0"/>
422
  LD_Float64(pVTDPosition.afHPRdot[1],psInput+104); // <element alignment="1" arraysize="1" byteorder="LE" bytepos="104" type="tFloat64" name="afHPRdot1"/>
423
  LD_Float64(pVTDPosition.afHPRdot[2],psInput+112); // <element alignment="1" arraysize="1" byteorder="LE" bytepos="112" type="tFloat64" name="afHPRdot2"/>
424
			// </struct>
425
}
426

    
427

    
428
void cVehicleModelOutputB::LoadModelAnimationState(const char *psInput, tVehicleModelAnimationState &pAnimationState)
429
{
430
		//      <struct alignment="8" name="tVehicleModelAnimationState" version="1">
431
  LD_Float64(pAnimationState.fSteeringPosition,psInput);  // <element alignment="8" arraysize="1" byteorder="LE" bytepos="0" type="tFloat64" name="fSteeringPosition"/>
432
  LD_Float64(pAnimationState.afWheelAngle[0],psInput+8);  // <element alignment="8" arraysize="1" byteorder="LE" bytepos="8" type="tFloat64" name="afWheelAngle0"/>
433
  LD_Float64(pAnimationState.afWheelAngle[1],psInput+16);  // <element alignment="8" arraysize="1" byteorder="LE" bytepos="16" type="tFloat64" name="afWheelAngle1"/>
434
  LD_Float64(pAnimationState.afWheelAngle[2],psInput+24);  // <element alignment="8" arraysize="1" byteorder="LE" bytepos="24" type="tFloat64" name="afWheelAngle2"/>
435
  LD_Float64(pAnimationState.afWheelAngle[3],psInput+32);  // <element alignment="8" arraysize="1" byteorder="LE" bytepos="32" type="tFloat64" name="afWheelAngle3"/>
436
  LD_Float64(pAnimationState.afWheelDeflection[0],psInput+40);  // <element alignment="8" arraysize="1" byteorder="LE" bytepos="40" type="tFloat64" name="afWheelDeflection0"/>
437
  LD_Float64(pAnimationState.afWheelDeflection[1],psInput+48);  // <element alignment="8" arraysize="1" byteorder="LE" bytepos="48" type="tFloat64" name="afWheelDeflection1"/>
438
  LD_Float64(pAnimationState.afWheelDeflection[2],psInput+56);  // <element alignment="8" arraysize="1" byteorder="LE" bytepos="56" type="tFloat64" name="afWheelDeflection2"/>
439
  LD_Float64(pAnimationState.afWheelDeflection[3],psInput+64);  // <element alignment="8" arraysize="1" byteorder="LE" bytepos="64" type="tFloat64" name="afWheelDeflection3"/>
440
  LD_UInt32(pAnimationState.afWheelDeflection[0],psInput+72);  // <element alignment="8" arraysize="1" byteorder="LE" bytepos="72" type="tUInt32" name="nLightMask"/>
441
				// <element alignment="4" arraysize="1" byteorder="LE" bytepos="74" type="tUInt32" name="void"/>
442
       // </struct>
443
}
444

    
445

    
446
void cVehicleModelOutputB::LoadEngine(const char *psInput, tEngine &pEngine)
447
{
448
		// <struct alignment="8" name="tEngine" version="1">
449
  LD_Float64(pEngine.fRpm,psInput);  //// <element alignment="8" arraysize="1" byteorder="LE" bytepos="0" type="tFloat64" name="fRpm"/>
450
  LD_Float64(pEngine.fTorque,psInput+8); // <element alignment="8" arraysize="1" byteorder="LE" bytepos="8" type="tFloat64" name="fTorque"/>
451
  LD_Float64(pEngine.fLoad,psInput+16); // <element alignment="8" arraysize="1" byteorder="LE" bytepos="16" type="tFloat64" name="fLoad"/>
452
		// </struct>
453
}
454

    
455

    
456
void cVehicleModelOutputB::LoadWheel(const char *psInput, tWheel &pWheel)
457
{
458
  // <struct alignment="8" name="tWheel" version="1">
459
  LD_Float64(pWheel.fSpringCompression,psInput);  // <element alignment="1" arraysize="1" byteorder="LE" bytepos="0" type="tFloat64" name="fSpringCompression"/>
460
  LD_Float64(pWheel.fSteeringAngle,psInput+8);  // <element alignment="1" arraysize="1" byteorder="LE" bytepos="8" type="tFloat64" name="fSteeringAngle"/>
461
  LD_Float64(pWheel.fRotAngle,psInput+16);      // <element alignment="1" arraysize="1" byteorder="LE" bytepos="16" type="tFloat64" name="fRotAngle"/>
462
  LD_Float64(pWheel.fRotAngleDot,psInput+24);   // <element alignment="1" arraysize="1" byteorder="LE" bytepos="24" type="tFloat64" name="fRotAngleDot"/>
463
  LD_Float64(pWheel.fSlip,psInput+32);          // <element alignment="1" arraysize="1" byteorder="LE" bytepos="32" type="tFloat64" name="fSlip"/>
464
  LD_Float64(pWheel.fBrakePressure,psInput+40);	// <element alignment="1" arraysize="1" byteorder="LE" bytepos="40" type="tFloat64" name="fBrakePressure"/>
465
  // </struct>
466
}
467

    
468

    
469
void cVehicleModelOutputB::LoadDrivetrain(const char *psInput, tDrivetrain &pDrivetrain)
470
{
471
	// <struct alignment="8" name="tDrivetrain" version="1">
472
  LD_Float64(pDrivetrain.fGear,psInput);  // <element alignment="8" arraysize="1" byteorder="LE" bytepos="0" type="tFloat64" name="fGear"/>
473
  LD_Float64(pDrivetrain.fGearboxType,psInput+8);  // <element alignment="8" arraysize="1" byteorder="LE" bytepos="8" type="tFloat64" name="fGearboxType"/>
474
  LD_Float64(pDrivetrain.fDrivetrainType,psInput+16);// <element alignment="8" arraysize="1" byteorder="LE" bytepos="16" type="tFloat64" name="fDrivetrainType"/>
475
  LD_Float64(pDrivetrain.fTorqueGearBoxIn,psInput+24);// <element alignment="8" arraysize="1" byteorder="LE" bytepos="24" type="tFloat64" name="fTorqueGearBoxIn"/>
476
  LD_Float64(pDrivetrain.fTorqueCenterDiffOut[0],psInput+32);// <element alignment="8" arraysize="1" byteorder="LE" bytepos="32" type="tFloat64" name="fTorqueCenterDiffOut0"/>
477
  LD_Float64(pDrivetrain.fTorqueCenterDiffOut[1],psInput+40);// <element alignment="8" arraysize="1" byteorder="LE" bytepos="40" type="tFloat64" name="fTorqueCenterDiffOut1"/>
478
  LD_Float64(pDrivetrain.fTorqueShaft,psInput+48);  // <element alignment="8" arraysize="1" byteorder="LE" bytepos="48" type="tFloat64" name="fTorqueShaft"/>
479
	//  </struct>  
480
}
481

    
482

    
483
//#############################################################################
484
tResult cVehicleModelOutputB::ProcessInputBehaviour(IMediaSample* pSample)
485
{
486
  RETURN_IF_POINTER_NULL(pSample);
487
  const char *psInput;
488

    
489
  const int sz = pSample->GetSize();
490
  if(sz != 480) return ERR_INVALID_TYPE;
491
  
492
  pSample->Lock((const tVoid**)&psInput);
493
  
494
  memset(&m_sVehicleBehaviour,0,sizeof(m_sVehicleBehaviour));
495
  // <struct alignment="8" name="tVehicleModelOutputBehaviour" version="1">
496
  LoadVTDposition(psInput,m_sVehicleBehaviour.sPosition);			// <element alignment="1" arraysize="1" byteorder="LE" bytepos="0" type="tVTDPosition" name="sPosition"/>
497
  LoadModelAnimationState(psInput+120,m_sVehicleBehaviour.sAnimationState);	// <element alignment="1" arraysize="1" byteorder="LE" bytepos="120" type="tVehicleModelAnimationState" name="sAnimationState"/>
498
  LD_Float64(m_sVehicleBehaviour.fSteeringMoment,psInput+200); // <element alignment="1" arraysize="1" byteorder="LE" bytepos="200" type="tFloat64" name="fSteeringMoment"/>
499
  LoadEngine(psInput+208,m_sVehicleBehaviour.sEngine);	// <element alignment="1" arraysize="1" byteorder="LE" bytepos="208" type="tEngine" name="sEngine"/>
500
  LoadDrivetrain(psInput+232,m_sVehicleBehaviour.sDrivetrain); // <element alignment="1" arraysize="1" byteorder="LE" bytepos="232" type="tDrivetrain" name="sDrivetrain"/>
501
  LoadWheel(psInput+288,m_sVehicleBehaviour.sWheel[0]);	 // <element alignment="1" arraysize="1" byteorder="LE" bytepos="288" type="tWheel" name="sWheel0"/>
502
  LoadWheel(psInput+336,m_sVehicleBehaviour.sWheel[1]);  // <element alignment="1" arraysize="1" byteorder="LE" bytepos="336" type="tWheel" name="sWheel1"/>
503
  LoadWheel(psInput+384,m_sVehicleBehaviour.sWheel[2]);  // <element alignment="1" arraysize="1" byteorder="LE" bytepos="384" type="tWheel" name="sWheel2"/>
504
  LoadWheel(psInput+432,m_sVehicleBehaviour.sWheel[3]);  // <element alignment="1" arraysize="1" byteorder="LE" bytepos="432" type="tWheel" name="sWheel3"/>
505
  // </struct>
506

    
507
  pSample->Unlock((tVoid*)psInput);
508
  m_DataReceived = true;
509
  RETURN_NOERROR;
510
}
511

    
512

    
513
//#############################################################################
514
tResult cVehicleModelOutputB::PushOutputVehicleBehaviour()
515
{
516
  cObjectPtr<IMediaSample> pVehicleBehaviourSample;
517
  RETURN_IF_FAILED(AllocMediaSample((tVoid**)&pVehicleBehaviourSample));
518
  tTimeStamp tmStreamTime = _clock ? _clock->GetStreamTime() : adtf_util::cHighResTimer::GetTime();
519
  try{RETURN_IF_FAILED(pVehicleBehaviourSample->Update(tmStreamTime, &m_sVehicleBehaviour, sizeof(m_sVehicleBehaviour), IMediaSample::MSF_None));}
520
  catch(...)
521
  {
522
    LOG_ERROR("VehicleModelOutputBehaviour: pVehicleInputInit->Update crashed.");
523
    return ERR_EXCEPTION_RAISED;
524
  }
525
  RETURN_IF_FAILED(m_oOutputVehicleBehaviour.Transmit(pVehicleBehaviourSample));
526

    
527
  RETURN_NOERROR;
528
}
    (1-1/1)