2 * @copyright Copyright (c) 2017-2020 TOYOTA MOTOR CORPORATION.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
21 #include <agl_thread.h>
22 #include <native_service/frameworkunified_framework_if.h>
23 #include <native_service/frameworkunified_dispatcher.h>
24 #include <native_service/frameworkunified_multithreading.h>
25 #include "vehicle_hal_frameworkunifiedlog.h"
28 // #include "carsignal_mng_api.h"
31 #include "vehicle_hal.h"
34 * \~english environment variable define
36 #define VEHICLEHAL_LINESENSKIND_ADIM_DATA "VEHICLEHAL_LINESENSKIND_ADIM"
38 * \~english environment variable define
40 #define VEHICLEHAL_LINESENSKIND_MIC_DATA "VEHICLEHAL_LINESENSKIND_MIC"
42 * \~english environment variable define
44 #define VEHICLEHAL_LINESENSKIND_VB_DATA "VEHICLEHAL_LINESENSKIND_VB"
46 * \~english environment variable define
48 #define VEHICLEHAL_LINESENSKIND_RHEOSTAT_DATA "VEHICLEHAL_LINESENSKIND_RHEOSTAT"
50 #define VEHICLEHAL_LOWVB_VALUE 75
53 static HANDLE g_sendmsg_handle = NULL;
55 // work thread exit flag
56 static BOOL g_loopendflag = FALSE;
58 // polling thread exit flag
59 static BOOL g_polloopendflag = FALSE;
62 static BOOL g_isopenflag = FALSE;
65 static pthread_t g_threadid = 0;
68 //static VclCtlApiObj g_sclientobj;
71 static CHAR g_appname[MAX_NAME_SIZE_APP];
74 const UINT8 kLineSensList[VEHICLEHAL_LINESENSKIND_NUM] = {
81 static void *VehicleHalProcess(void *arg);
83 HANDLE g_vehiclehalext_thread;
84 HANDLE g_vehiclehalpol_thread;
85 EFrameworkunifiedStatus VehicleHalProcessExtStart(HANDLE happ);
86 EFrameworkunifiedStatus VehicleHalProcessExtStop(HANDLE happ);
87 EFrameworkunifiedStatus VehicleHalProcessRecvSpeed(HANDLE happ);
89 EFrameworkunifiedStatus VehicleHalProcessPolStart(HANDLE happ);
90 EFrameworkunifiedStatus VehicleHalProcessPolStop(HANDLE happ);
92 static const FrameworkunifiedProtocolCallbackHandler kVehicleHalSpd[] = { {
93 CID_VEHICLEHAL_SPD, VehicleHalProcessRecvSpeed } };
95 #define VEHICLEHAL_SPEED "VehicleHalSpd"
96 #define VEHICLEHAL_EXT "VehicleHalExt"
97 #define VEHICLEHAL_POL "VehicleHalPol"
99 VEHICLEHAL_RET_TYPE VehicleHalStart(HANDLE happ) {
101 FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, "Handle is NULL");
102 return VEHICLEHAL_RET_ERR_PARAM;
106 if (TRUE == g_isopenflag) {
107 FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, "Already Opened");
108 return VEHICLEHAL_RET_SUCCESS;
111 // memset(&g_sclientobj, 0, sizeof(g_sclientobj));
114 g_loopendflag = FALSE;
116 g_polloopendflag = FALSE;
119 PCSTR app_name = FrameworkunifiedGetAppName(happ);
120 if (NULL == app_name) {
121 FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, "Get App Name Failed");
122 return VEHICLEHAL_RET_ERR_PARAM;
125 memset(g_appname, 0, sizeof(g_appname));
126 memcpy(g_appname, app_name, sizeof(g_appname));
127 g_appname[MAX_NAME_SIZE_APP] = '\0';
129 // // Start VLC data input control API
130 // UINT32 ret = VclCtlApiOpen(&g_sclientobj);
131 // if ( CARSIGNAL_CTL_RET_SUCCESS != ret ) {
132 // FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, "Ten Api Open Failed");
133 // return VEHICLEHAL_RET_ERR_HARDINIT;
136 // Open message queue for sending
137 g_sendmsg_handle = McOpenSender(g_appname);
138 if (NULL == g_sendmsg_handle) {
139 FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, "Open Mc Sender Failed");
140 // VclCtlApiClose(&g_sclientobj);
141 return VEHICLEHAL_RET_ERR_MCOPEN;
145 int iret = pthread_create(&g_threadid,
150 FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, "Create Thread Failed");
151 McClose(g_sendmsg_handle);
152 // VclCtlApiClose(&g_sclientobj);
153 return VEHICLEHAL_RET_ERR_THREADSTART;
156 g_vehiclehalext_thread = FrameworkunifiedCreateChildThread(happ, VEHICLEHAL_EXT,
157 VehicleHalProcessExtStart,
158 VehicleHalProcessExtStop);
160 EFrameworkunifiedStatus estatus = FrameworkunifiedStartChildThread(happ, g_vehiclehalext_thread, 0, NULL);
161 if (eFrameworkunifiedStatusOK != estatus) {
162 FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, "FrameworkunifiedStartChildThread Failed");
163 McClose(g_sendmsg_handle);
164 return VEHICLEHAL_RET_ERR_THREADSTART;
167 g_vehiclehalpol_thread = FrameworkunifiedCreateChildThread(happ, VEHICLEHAL_POL,
168 VehicleHalProcessPolStart,
169 VehicleHalProcessPolStop);
171 EFrameworkunifiedStatus estatus_pol = FrameworkunifiedStartChildThread(happ, g_vehiclehalpol_thread, 0, NULL);
172 if (eFrameworkunifiedStatusOK != estatus_pol) {
173 FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, "FrameworkunifiedStartChildThread polling Failed");
174 McClose(g_sendmsg_handle);
175 return VEHICLEHAL_RET_ERR_THREADSTART;
179 // set open flag true
182 return VEHICLEHAL_RET_SUCCESS;
185 VEHICLEHAL_RET_TYPE VehicleHalStop(HANDLE happ) {
187 FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, "Handle is NULL");
188 return VEHICLEHAL_RET_ERR_PARAM;
191 if (NULL != g_vehiclehalext_thread) {
192 EFrameworkunifiedStatus estatus = FrameworkunifiedDestroyChildThread(happ, g_vehiclehalext_thread);
193 if (eFrameworkunifiedStatusOK != estatus) {
194 FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, "FrameworkunifiedDestroyChildThread Failed");
195 return VEHICLEHAL_RET_ERR_PARAM;
197 g_vehiclehalext_thread = NULL;
200 // set open flag of polling to fasle
201 g_polloopendflag = TRUE;
203 if (NULL != g_vehiclehalpol_thread) {
204 EFrameworkunifiedStatus estatus = FrameworkunifiedStopChildThread(happ, g_vehiclehalpol_thread, 0, NULL);
205 if (eFrameworkunifiedStatusOK != estatus) {
206 FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, "FrameworkunifiedDestroyChildThread polling Failed");
207 return VEHICLEHAL_RET_ERR_PARAM;
209 estatus = FrameworkunifiedDestroyChildThread(happ, g_vehiclehalpol_thread);
210 if (eFrameworkunifiedStatusOK != estatus) {
211 FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, "FrameworkunifiedDestroyChildThread polling Failed");
212 return VEHICLEHAL_RET_ERR_PARAM;
214 g_vehiclehalpol_thread = NULL;
217 // set open flag fasle
218 g_isopenflag = FALSE;
221 g_loopendflag = TRUE;
224 pthread_join(g_threadid, NULL);
226 // Close message queue
227 McClose(g_sendmsg_handle);
229 // // End VLC data input control API
230 // VclCtlApiClose(&g_sclientobj);
232 return VEHICLEHAL_RET_SUCCESS;
235 void *VehicleHalProcess(void *arg) {
236 // Line Sense Message
237 VehicleHalLineSensMsg s_linesensmsg;
238 memset( &s_linesensmsg, 0xFF, sizeof(s_linesensmsg) );
241 while (TRUE != g_loopendflag) {
242 char* p_env_vb = NULL;
243 p_env_vb = getenv(VEHICLEHAL_LINESENSKIND_VB_DATA);
244 if (NULL != p_env_vb) {
246 if (VEHICLEHAL_LOWVB_VALUE >= atoi(p_env_vb)) {
247 s_linesensmsg.stdata[VEHICLEHAL_LINESENSKIND_LOWVOLTAGE] = 1;
249 s_linesensmsg.stdata[VEHICLEHAL_LINESENSKIND_LOWVOLTAGE] = 0;
253 // loop to get line sense status
254 for (UI_32 iloopnum = 0; iloopnum <= VEHICLEHAL_LINESENSKIND_ILL; ++iloopnum) {
258 // // get line sense status
259 // UINT32 ret = VclCtlApiRcvVclData(&g_sclientobj, kLineSensList[iloopnum], &signalret);
260 // if ( CARSIGNAL_CTL_RET_SUCCESS != ret ) {
261 // FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, "Get LineSens [%d] status faild [%d]", kLineSensList[iloopnum], ret);
265 // convert 0 to 1 or 1 to 0 for IG,REV according car signal api reference
266 switch (kLineSensList[iloopnum]) {
267 // case CARSIGNAL_IG:
268 // case CARSIGNAL_REV:
269 // signalret = 1 - signalret;
277 if (signalret != s_linesensmsg.stdata[iloopnum]) {
278 s_linesensmsg.stdata[iloopnum] = signalret;
282 char* p_env_adim = NULL;
283 p_env_adim = getenv(VEHICLEHAL_LINESENSKIND_ADIM_DATA);
284 if (NULL != p_env_adim) {
285 s_linesensmsg.stdata[VEHICLEHAL_LINESENSKIND_ADIM] = atoi(p_env_adim);
288 char* p_env_mic = NULL;
289 p_env_mic = getenv(VEHICLEHAL_LINESENSKIND_MIC_DATA);
290 if (NULL != p_env_mic) {
291 s_linesensmsg.stdata[VEHICLEHAL_LINESENSKIND_MIC] = atoi(p_env_mic);
295 EFrameworkunifiedStatus eretval = McSend(g_sendmsg_handle, TN_LINE_SENS_READ, CID_VEHICLEHAL_LINESENS,
296 sizeof(s_linesensmsg), (PVOID)&s_linesensmsg);
297 if (eFrameworkunifiedStatusOK != eretval) {
298 FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, "McSend LineSens failed");
307 EFrameworkunifiedStatus VehicleHalProcessExtStart(HANDLE happ) {
308 EFrameworkunifiedStatus estatus = FrameworkunifiedAttachCallbacksToDispatcher(happ, VEHICLEHAL_SPEED,
310 static_cast<UI_32>(_countof(kVehicleHalSpd)));
311 if (eFrameworkunifiedStatusOK != estatus) {
312 FRAMEWORKUNIFIEDLOG(ZONE_ERR, __func__,
313 "Error FrameworkunifiedAttachCallbacksToDispatcher Vehicle_Hal_Speed:%d", estatus);
317 return eFrameworkunifiedStatusOK;
320 EFrameworkunifiedStatus VehicleHalProcessExtStop(HANDLE happ) {
321 return eFrameworkunifiedStatusOK;
324 EFrameworkunifiedStatus VehicleHalProcessRecvSpeed(HANDLE happ) {
325 // Speed Pusle Message
326 VehicleHalSpeedPulse speedpulsemsg;
327 memset( &speedpulsemsg, 0xFF, sizeof(speedpulsemsg) );
331 EFrameworkunifiedStatus estatus = eFrameworkunifiedStatusOK;
333 estatus = FrameworkunifiedGetMsgDataOfSize(happ, &speed, sizeof(speed), eSMRRelease);
334 if (eFrameworkunifiedStatusOK != estatus) {
335 FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, "failed FrameworkunifiedGetMsgDataOfSize() Status=[%d]", estatus);
339 // calculate speed to speed pulse
340 float speedpulse = static_cast<float>(speed * (4.0*637.0) / (60.0 * 60.0));
341 if ( speedpulse != speedpulsemsg.pulse ) {
342 speedpulsemsg.pulse = speedpulse;
343 if (0.0 != speedpulse) {
344 speedpulsemsg.period = static_cast<float>((1 / speedpulse) * 1000);
346 speedpulsemsg.period = 0;
351 EFrameworkunifiedStatus eretval = McSend(g_sendmsg_handle, TN_LINE_SENS_READ, CID_VEHICLEHAL_SPDPULSE,
352 sizeof(speedpulsemsg), (PVOID)&speedpulsemsg);
353 if (eFrameworkunifiedStatusOK != eretval) {
354 FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, "McSend Speed Pulse failed");
357 eretval = McSend(g_sendmsg_handle, TN_LINE_SENS_READ, CID_VEHICLEHAL_SPD,
358 sizeof(UINT16), (PVOID)&speed);
359 if (eFrameworkunifiedStatusOK != eretval) {
360 FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, "McSend Speed failed");
363 return eFrameworkunifiedStatusOK;
366 EFrameworkunifiedStatus VehicleHalProcessPolStart(HANDLE happ) {
368 memset( &s_pol, 0xFF, sizeof(s_pol) );
370 while (!g_polloopendflag) {
371 char* p_env_vb = NULL;
372 char* p_env_rheostat = NULL;
373 p_env_vb = getenv(VEHICLEHAL_LINESENSKIND_VB_DATA);
374 p_env_rheostat = getenv(VEHICLEHAL_LINESENSKIND_RHEOSTAT_DATA);
375 if (NULL != p_env_vb) {
376 // covert voltage value
377 s_pol.vb = atoi(p_env_vb);
380 if (NULL != p_env_rheostat) {
381 // covert RHEOSTAT value
382 s_pol.rheostat = atoi(p_env_rheostat);
384 // send vb and rheostat
385 EFrameworkunifiedStatus eretval = McSend(g_sendmsg_handle, TN_LINE_SENS_READ, CID_VEHICLEHAL_LINESENS_POL,
386 sizeof(s_pol), (PVOID)&s_pol);
387 if (eFrameworkunifiedStatusOK != eretval) {
388 FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, "McSend Vb and RHEOSTAT failed");
393 return eFrameworkunifiedStatusOK;
396 EFrameworkunifiedStatus VehicleHalProcessPolStop(HANDLE happ) {
397 return eFrameworkunifiedStatusOK;