2 * Copyright (c) 2013, TOYOTA MOTOR CORPORATION.
4 * This program is licensed under the terms and conditions of the
5 * Apache License, version 2.0. The full text of the Apache License is at
6 * http://www.apache.org/licenses/LICENSE-2.0
10 * @brief Pseudo-driving vehicle
12 * @date Jun-21-2012 create
13 * @date Apl-09-2013 RPM/Speed/Breake/GPS/direction Reform
18 #include "CJoyStick.h"
19 #include "CJoyStickEV.h"
25 #include "ico-util/ico_log.h"
30 std::queue < geoData > routeList;
31 std::string msgQueue = "";
32 std::string orgmsgQueue = "";
35 int nDelayedCallback = 0;
42 pthread_mutex_t mutex;
45 * Average ENGINE or CAR Sample Space size
47 short g_RPM_SAMPLE_SPACE_SIZE = 60;
48 short g_SPEED_SAMPLE_SPACE_SIZE = 180;
49 short g_BREAKE_SAMPLE_SPACE_SIZE = 10;
52 * GPS Info update flag
54 bool g_bSentInMileage = true;
55 bool g_bSentInChgLngLat = true;
56 double g_SentInMileage = 3.0; // 3 meter
57 double g_StartLatitude = 35.47945;
58 double g_StartLongitude = 139.40026;
59 double g_GoalLatitude = 35.49746;
60 double g_GoalLongitude = 139.40504;
63 #define _D_URI_FORM "ws://%s:%d"
64 #define _D_HOST_STR "127.0.0.1"
65 const int protocols_sz = 4;
66 const char* protocolsName[protocols_sz] = {
67 "standarddatamessage-only",
68 "standardcontrolmessage-only",
69 "customdatamessage-only",
70 "customcontrolmessage-only"
76 m_strConfPath = "/usr/bin/CarSimDaemon.conf";
77 // TODO Auto-generated constructor stub
78 signal(SIGINT, CGtCtrl::signal_handler);
79 signal(SIGQUIT, CGtCtrl::signal_handler);
80 signal(SIGKILL, CGtCtrl::signal_handler);
81 signal(SIGTERM, CGtCtrl::signal_handler);
82 signal(SIGCHLD, CGtCtrl::signal_handler);
90 // TODO Auto-generated destructor stub
97 void CGtCtrl::signal_handler(int signo)
105 printf("receive cancel command(%d).\n", signo);
114 bool CGtCtrl::Initialize()
118 m_stVehicleInfo.fLng = g_StartLongitude;
119 m_stVehicleInfo.fLat = g_StartLatitude;
120 m_stVehicleInfo.nSteeringAngle = 0;
121 m_stVehicleInfo.nShiftPos = 0;
122 m_stVehicleInfo.bHazard = false;
123 m_stVehicleInfo.bWinkR = false;
124 m_stVehicleInfo.bWinkL = false;
125 m_stVehicleInfo.nAirconTemp = 250;
126 m_stVehicleInfo.nHeadLightPos = 1;
127 m_stVehicleInfo.nVelocity = 0;
128 m_stVehicleInfo.nDirection = 0;
129 m_stVehicleInfo.dVelocity = 0.0;
130 m_stVehicleInfo.nAccel = 0;
131 m_stVehicleInfo.bHeadLight = false; // HEAD LIGHT OFF(false)
134 if (true == gbDevJs) {
135 myJS = new CJoyStick;
136 int nRet = myJS->Open();
138 printf("JoyStick open error\n");
147 printf("Load class G27\n");
148 myJS = new CJoyStickG27;
149 m_strConfPath = g_ConfPathG27;
152 printf("Load class G25\n");
153 myJS = new CJoyStickG25;
154 m_strConfPath = g_ConfPathG25;
157 printf("Load class EV\n");
158 myJS = new CJoyStickEV;
159 m_strConfPath = g_ConfPathG27;
164 int nRet = myJS->Open();
170 } while ((++i) < g_JoyStickTypeNum);
176 myConf.LoadConfig(m_strConfPath.c_str());
177 m_stVehicleInfo.fLng = myConf.m_fLng;
178 m_stVehicleInfo.fLat = myConf.m_fLat;
182 if (!LoadConfigJson(myConf.m_sAmbConfigName.c_str())) {
183 printf("AMB configfile read error\n");
187 m_sendMsgInfo.clear();
190 for (int i = 0; i < protocols_sz; i++) {
191 sprintf(uri, _D_URI_FORM, _D_HOST_STR, m_ambpicomm_port[i]);
192 if (false == m_ambpicomm_client[i].start(uri, protocolsName[i])) {
193 return false; // connect fail
195 while(m_ambpicomm_client[i].getM_id() == NULL) {
198 ICO_DBG("websocket: OK [%s][%s]", uri, protocolsName[i]);
201 const char *vi = "LOCATION";
202 double location[] = { myConf.m_fLat, myConf.m_fLng, 0 };
203 SendVehicleInfo(dataport_def, vi, &location[0], 3);
205 if (m_bDemoRunning) {
206 std::cout << "Demo Mode." << std::endl;
213 bool CGtCtrl::Terminate()
223 #define sENGINE_SPEED "ENGINE_SPEED"
224 #define sBRAKE_SIGNAL "BRAKE_SIGNAL"
225 #define sBRAKE_PRESSURE "BRAKE_PRESSURE"
226 #define sACCPEDAL_OPEN "ACCPEDAL_OPEN"
227 #define sVELOCITY "VELOCITY"
228 #define sDIRECTION "DIRECTION"
229 #define sLOCATION "LOCATION"
230 #define sSHIFT "SHIFT"
231 #define sLIGHTSTATUS "LIGHTSTATUS"
244 struct timeval timeout;
248 gettimeofday(&now, NULL);
249 usec = now.tv_usec + D_RUNLOOP_INTERVAL_COUNT*10*1000;
250 timeout.tv_usec = usec % 1000000;
251 if (usec < 1000000) {
252 timeout.tv_sec = now.tv_sec;
254 timeout.tv_sec = now.tv_sec + 1;
257 * LAST STEERING VALUE
259 int last_steering = 0;
262 * RPM/Breake/Speed calc class
265 bool bBrakeSigSend = false;
266 bool bBrakeSig = false;
267 int nBrakePressure = -1;
268 int nAccPedalOpen = -1;
270 CAvgCar pmCar(g_RPM_SAMPLE_SPACE_SIZE, g_SPEED_SAMPLE_SPACE_SIZE,
271 g_BREAKE_SAMPLE_SPACE_SIZE);
272 pmCar.chgGear(CAvgGear::E_SHIFT_PARKING);
276 double dir = (double)m_stVehicleInfo.nDirection;
280 int nShiftPosBK = -1;
283 bool nextPointFlg = false;
285 double dx, dy, rad, theta;
287 while (g_bStopFlag) {
289 type = myJS->Read(&number, &value);
291 m_sendMsgInfo.clear();
293 gettimeofday(&now, NULL);
294 if((timeout.tv_sec == now.tv_sec && timeout.tv_usec <= now.tv_sec)
295 || (timeout.tv_sec < now.tv_sec)) {
296 intervalctl = (intervalctl+1)%3;
298 fcycle = intervalctl;
300 usec = now.tv_usec + D_RUNLOOP_INTERVAL_COUNT*10*1000;
301 timeout.tv_usec = usec % 1000000;
302 if (usec < 1000000) {
303 timeout.tv_sec = now.tv_sec;
305 timeout.tv_sec = now.tv_sec + 1;
308 // ICO_DBG("intervalctl[%d], fcycle[%d]", intervalctl, fcycle);
312 if (number == myConf.m_nSteering) {
313 last_steering = value;
315 m_stVehicleInfo.nSteeringAngle +=
316 (value * 10 / 65536 - m_stVehicleInfo.nSteeringAngle);
319 else if (number == myConf.m_nAccel) {
321 pmCar.chgThrottle(32767);
324 pmCar.chgThrottle((value - 16384) * -2);
327 else if (number == myConf.m_nBrake) {
329 pmCar.chgBrake(32767);
332 pmCar.chgBrake((value - 16384) * -2);
336 case JS_EVENT_BUTTON:
337 if (myConf.m_sDeviceName == D_DEV_NAME_G25) {
339 * Gear Change SHIFT UP
341 if (number == myConf.m_nShiftU) {
342 //printf("Shift Up[%d]\n",value);
345 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
346 shiftpos = pmCar.getValue();
350 * Gear Change SHIFT DOWN
352 if (number == myConf.m_nShiftD) {
353 //printf("Shift Down[%d]\n",value);
355 pmCar.setShiftDown();
356 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
357 shiftpos = pmCar.getValue();
362 else if (myConf.m_sDeviceName == D_DEV_NAME_G27) {
363 if (number == myConf.m_nShift1) {
364 //printf("Shift 1[%d]\n",value);
366 pmCar.setShiftMT(CAvgGear::E_SHIFT_MT_FIRST);
367 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
368 shiftpos = pmCar.getValue();
371 pmCar.setShiftMT(CAvgGear::E_SHIFT_NEUTRAL);
372 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
373 shiftpos = pmCar.getValue();
377 if (number == myConf.m_nShift2) {
378 //printf("Shift 2[%d]\n",value);
380 pmCar.setShiftMT(CAvgGear::E_SHIFT_MT_SECOND);
381 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
382 shiftpos = pmCar.getValue();
385 pmCar.setShiftMT(CAvgGear::E_SHIFT_NEUTRAL);
386 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
387 shiftpos = pmCar.getValue();
391 if (number == myConf.m_nShift3) {
392 //printf("Shift 3[%d]\n",value);
394 pmCar.setShiftMT(CAvgGear::E_SHIFT_MT_THIRD);
395 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
396 shiftpos = pmCar.getValue();
399 pmCar.setShiftMT(CAvgGear::E_SHIFT_NEUTRAL);
400 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
401 shiftpos = pmCar.getValue();
405 if (number == myConf.m_nShift4) {
406 //printf("Shift 4[%d]\n",value);
408 pmCar.setShiftMT(CAvgGear::E_SHIFT_MT_FOURTH);
409 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
410 shiftpos = pmCar.getValue();
413 pmCar.setShiftMT(CAvgGear::E_SHIFT_NEUTRAL);
414 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
415 shiftpos = pmCar.getValue();
419 if (number == myConf.m_nShift5) {
420 //printf("Shift 5[%d]\n",value);
422 pmCar.setShiftMT(CAvgGear::E_SHIFT_MT_FIFTH);
423 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
424 shiftpos = pmCar.getValue();
427 pmCar.setShiftMT(CAvgGear::E_SHIFT_NEUTRAL);
428 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
429 shiftpos = pmCar.getValue();
433 if (number == myConf.m_nShift6) {
434 //printf("Shift 6[%d]\n",value);
436 pmCar.setShiftMT(CAvgGear::E_SHIFT_MT_SIXTH);
437 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
438 shiftpos = pmCar.getValue();
441 pmCar.setShiftMT(CAvgGear::E_SHIFT_NEUTRAL);
442 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
443 shiftpos = pmCar.getValue();
447 if (number == myConf.m_nShiftR) {
448 //printf("Shift R[%d]\n",value);
450 pmCar.setShiftMT(CAvgGear::E_SHIFT_REVERSE);
451 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
452 shiftpos = pmCar.getValue();
455 pmCar.setShiftMT(CAvgGear::E_SHIFT_NEUTRAL);
456 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
457 shiftpos = pmCar.getValue();
462 * TURN SIGNAL(WINKER) & LIGHTSTATUS
464 bool bLIGHTSTATUS = false;
465 if (number == myConf.m_nWinkR) {
468 m_stVehicleInfo.bWinkR = !m_stVehicleInfo.bWinkR;
469 m_stVehicleInfo.bWinkL = false;
470 if (m_stVehicleInfo.bWinkR)
471 m_stVehicleInfo.nWinkerPos = WINKER_RIGHT;
473 m_stVehicleInfo.nWinkerPos = WINKER_OFF;
475 const char *vi = "TURN_SIGNAL";
477 m_stVehicleInfo.nWinkerPos == WINKER_RIGHT ? 1 : 0;
478 SendVehicleInfo(dataport_def, vi, wpos);
483 if (number == myConf.m_nWinkL) {
485 m_stVehicleInfo.bWinkL = !m_stVehicleInfo.bWinkL;
486 m_stVehicleInfo.bWinkR = false;
487 if (m_stVehicleInfo.bWinkL)
488 m_stVehicleInfo.nWinkerPos = WINKER_LEFT;
490 m_stVehicleInfo.nWinkerPos = WINKER_OFF;
492 const char *vi = "TURN_SIGNAL";
494 m_stVehicleInfo.nWinkerPos == WINKER_LEFT ? 2 : 0;
495 SendVehicleInfo(dataport_def, vi, wpos);
500 if (number == myConf.m_nHeadLight) {
502 if (false == m_stVehicleInfo.bHeadLight) { // HEAD LIGHT OFF(false) ?
503 m_stVehicleInfo.bHeadLight = true; // HEAD LIGHT ON(true)
506 m_stVehicleInfo.bHeadLight = false; // HEAD LIGHT OFF(false)
512 if (true == bLIGHTSTATUS) {
513 const size_t LSsz = 8;
515 // 0:LIGHT HEAD STATUS ON(1)/OFF(0)
516 // 1:LEFT WINKER STATUS ON(1)/OFF(0)
517 // 2:RIGHT WINKER STATUS ON(1)/OFF(0)
523 memset(data, 0, sizeof(data));
524 if (true == m_stVehicleInfo.bHeadLight) { // HEAD LIGHT ON ?
527 if (WINKER_LEFT == m_stVehicleInfo.nWinkerPos) {
530 else if (WINKER_RIGHT == m_stVehicleInfo.nWinkerPos) {
533 SendVehicleInfo(dataport_def, sLIGHTSTATUS, &data[0], LSsz);
543 bool bBrakeNEW = pmCar.isOnBrake();
544 m_stVehicleInfo.bBrake = bBrakeNEW;
545 if ((false == bBrakeSigSend) || (bBrakeNEW != bBrakeSig)) {
546 bBrakeSigSend = true;
547 SendVehicleInfo(dataport_def, sBRAKE_SIGNAL, bBrakeNEW);
548 bBrakeSig = bBrakeNEW; // update value
553 if (nShiftPosBK != m_stVehicleInfo.nShiftPos) {
554 const size_t ShiftSz = 3;
556 int val = pmCar.getValue();
557 data[0] = pmCar.getSelectGear();
559 data[0] = data[0] - 10 + 4;
564 data[1] = pmCar.getValue();
565 data[2] = pmCar.getMode();
566 SendVehicleInfo(dataport_def, sSHIFT, &data[0], ShiftSz);
567 nShiftPosBK = m_stVehicleInfo.nShiftPos;
568 // ICO_DBG("SHIFT: Send [%d, %d, %d]", data[0], data[1], data[2]);
574 if (last_steering < 0) {
575 angle = (((double)last_steering / 32768) * 450) + 450 + 270;
577 //std:: cout << "last_steering * (450 / 32768) = " << ((double)last_steering / 32768) * 450 << "\n";
578 //std:: cout << "last_steering * (450 / 32768) + 450 = " << (double)last_steering * (450 / 32768) + 450 << "\n";
579 //std:: cout << "last_steering * (450 / 32768) + 450 + 270 = " << (double)last_steering * (450 / 32768) + 450 + 270 << "\n";
582 angle = ((double)last_steering / 32768) * 450;
584 //std:: cout << "last_steering * (450 / 32768) = " << ((double)last_steering / 32768) * 450 << "\n";
586 //std::cout << "Steering last_steering = " << last_steering << " -> angle = " << angle << std::endl;
587 if (angle != last_angle) {
588 const char *vi = "STEERING";
591 SendVehicleInfo(dataport_def,
592 vi, m_stVehicleInfo.nSteeringAngle);
594 SendVehicleInfo(dataport_def, vi, angle);
600 int rpmNEW = (int)pmCar.getRPM();
601 if (rpmNEW != nRPM) {
602 SendVehicleInfo(dataport_def, sENGINE_SPEED, rpmNEW);
603 nRPM = rpmNEW; // update value
605 int apoNEW = pmCar.calcAccPedalOpen();
606 if (apoNEW != nAccPedalOpen) {
607 SendVehicleInfo(dataport_def, sACCPEDAL_OPEN, apoNEW);
608 nAccPedalOpen = apoNEW;
610 } /* if (fcycle == 2) */
617 int pressureNEW = pmCar.calcPressure(pmCar.getBrakeAvg());
618 m_stVehicleInfo.nBrakeHydraulicPressure = pressureNEW;
619 if (pressureNEW != nBrakePressure) {
620 SendVehicleInfo(dataport_def, sBRAKE_PRESSURE, pressureNEW);
621 nBrakePressure = pressureNEW;
627 int speedNew = (int)pmCar.getSpeed();
628 if (speedNew > 180) {
631 if (speedNew != nSpeed) {
632 SendVehicleInfo(dataport_def, sVELOCITY, speedNew);
633 m_stVehicleInfo.nVelocity = speedNew;
637 if (m_bDemoRunning) {
638 next = routeList.front();
639 dy = next.lat - m_stVehicleInfo.fLat;
640 dx = next.lng - m_stVehicleInfo.fLng;
641 theta = (double) atan2(dy, dx) * 180.0 / (atan(1.0) * 4.0);
643 theta = 360.0 + theta;
646 rad = (theta / 180.0) * PIE;
648 m_stVehicleInfo.nDirection = 90 - theta;
649 if (m_stVehicleInfo.nDirection < 0) {
650 m_stVehicleInfo.nDirection = 360 + m_stVehicleInfo.nDirection;
652 SendVehicleInfo(dataport_def, sDIRECTION, m_stVehicleInfo.nDirection);
654 dir = static_cast<double>(m_stVehicleInfo.nDirection);
655 double runMeters = pmCar.getTripmeter();
656 pmCar.tripmeterReset();
657 double tmpLat = m_stVehicleInfo.fLat;
658 double tmpLng = m_stVehicleInfo.fLng;
659 POINT pNEW = CalcDest(tmpLat, tmpLng, dir, runMeters);
660 double tmpLct[] = { pNEW.lat, pNEW.lng, 0 };
661 SendVehicleInfo(dataport_def, sLOCATION, &tmpLct[0], 3);
662 m_stVehicleInfo.fLat = pNEW.lat;
663 m_stVehicleInfo.fLng = pNEW.lng;
666 if (m_stVehicleInfo.fLng >= next.lng) {
670 else if (rad > 0 && rad < 0.5 * PIE) {
671 if (m_stVehicleInfo.fLng >= next.lng
672 && m_stVehicleInfo.fLat >= next.lat) {
676 else if (rad == 0.5 * PIE) {
677 if (m_stVehicleInfo.fLat >= next.lat) {
681 else if (rad > 0.5 * PIE && rad < PIE) {
682 if (m_stVehicleInfo.fLng <= next.lng
683 && m_stVehicleInfo.fLat >= next.lat) {
687 else if (rad == PIE) {
688 if (m_stVehicleInfo.fLng <= next.lng) {
692 else if (rad > PIE && rad < 1.5 * PIE) {
693 if (m_stVehicleInfo.fLng <= next.lng
694 && m_stVehicleInfo.fLat <= next.lat) {
698 else if (rad == 1.5 * PIE) {
699 if (m_stVehicleInfo.fLat <= next.lat) {
704 if (m_stVehicleInfo.fLng >= next.lng
705 && m_stVehicleInfo.fLat <= next.lat) {
711 std::cout << "routeList.size() = " << routeList.size() << std::endl;
713 if (routeList.empty()) {
715 m_stVehicleInfo.fLng = myConf.m_fLng;
716 m_stVehicleInfo.fLat = myConf.m_fLat;
718 next = routeList.front();
719 nextPointFlg = false;
724 * DIRECTION (AZIMUTH)
725 * Front wheel steering angle
727 double runMeters = pmCar.getTripmeter();
728 pmCar.tripmeterReset();
729 if (0 != runMeters) {
730 double stear = (double)m_stVehicleInfo.nSteeringAngle;
731 double dirNEW = CalcAzimuth(dir, stear, runMeters);
732 int nDir = (int)dirNEW;
734 if (nDir != m_stVehicleInfo.nDirection) {
735 SendVehicleInfo(dataport_def, sDIRECTION, nDir);
736 m_stVehicleInfo.nDirection = nDir;
742 if ((!m_bUseGps) && (0 != runMeters)) {
743 double tmpLat = m_stVehicleInfo.fLat;
744 double tmpLng = m_stVehicleInfo.fLng;
745 POINT pNEW = CalcDest(tmpLat, tmpLng, dir, runMeters);
746 if ((tmpLat != pNEW.lat) || (tmpLng != pNEW.lng)){
747 double tmpLct[] = { pNEW.lat, pNEW.lng, 0 };
748 SendVehicleInfo(dataport_def, sLOCATION, &tmpLct[0], 3);
749 m_stVehicleInfo.fLat = pNEW.lat;
750 m_stVehicleInfo.fLng = pNEW.lng;
768 bool nextPointFlg = true;
769 bool routeDriveFlg = true;
770 std::string tmpstr = "";
778 pthread_mutex_init(&mutex, NULL);
780 while (g_bStopFlag) {
781 type = myJS->Read(&number, &value);
783 pthread_mutex_lock(&mutex);
784 if (msgQueue.size() > 0) {
791 tmpGeo.lat = GEORESET;
792 tmpGeo.lng = GEORESET;
794 for (i = 0; i < (int) msgQueue.size(); i++) {
795 if (msgQueue[i] == ',') {
796 tmpGeo.lat = atof(buf);
799 else if (msgQueue[i] == '\n') {
800 tmpGeo.lng = atof(buf);
803 routeList.push(tmpGeo);
805 tmpGeo.lat = GEORESET;
806 tmpGeo.lng = GEORESET;
809 buf[pos++] = msgQueue[i];
812 for (int idx = 0; msgQueue[lastidx] != '\0'; idx++, lastidx++) {
813 tmpstr[idx] = msgQueue[lastidx];
818 pthread_mutex_unlock(&mutex);
822 if (number == myConf.m_nSteering) {
824 m_stVehicleInfo.nSteeringAngle +=
825 (value * 10 / 65536 - m_stVehicleInfo.nSteeringAngle);
829 if (number == myConf.m_nAccel) {
831 m_stVehicleInfo.bBrake = false;
832 m_stVehicleInfo.nBrakeHydraulicPressure = 0;
835 else if (0 < value) {
836 m_stVehicleInfo.bBrake = true;
837 m_stVehicleInfo.nBrakeHydraulicPressure =
838 (value * 100) / MAX_SPEED;
841 m_stVehicleInfo.bBrake = false;
842 m_stVehicleInfo.nBrakeHydraulicPressure = 0;
844 m_stVehicleInfo.nAccel = value;
846 const char *vi1 = "BRAKE_SIGNAL";
847 const char *vi2 = "BRAKE_PRESSURE";
848 SendVehicleInfo(dataport_def, vi1, m_stVehicleInfo.bBrake);
850 SendVehicleInfo(dataport_def,
851 vi2, m_stVehicleInfo.nBrakeHydraulicPressure);
854 case JS_EVENT_BUTTON:
855 if (number == myConf.m_nShiftU) {
858 if (m_stVehicleInfo.nShiftPos > PARKING) {
859 switch (m_stVehicleInfo.nShiftPos) {
861 m_stVehicleInfo.nShiftPos = SECOND;
865 m_stVehicleInfo.nShiftPos = THIRD;
869 m_stVehicleInfo.nShiftPos = DRIVE;
873 m_stVehicleInfo.nShiftPos = NEUTRAL;
877 m_stVehicleInfo.nShiftPos = REVERSE;
881 m_stVehicleInfo.nShiftPos = PARKING;
887 char data[] = { shiftpos, shiftpos, 0 };
888 const char *vi = "SHIFT";
889 SendVehicleInfo(dataport_def, vi, &data[0]);
894 if (number == myConf.m_nShiftD) {
897 if (m_stVehicleInfo.nShiftPos < SPORTS) {
898 switch (m_stVehicleInfo.nShiftPos) {
900 m_stVehicleInfo.nShiftPos = PARKING;
904 m_stVehicleInfo.nShiftPos = REVERSE;
908 m_stVehicleInfo.nShiftPos = NEUTRAL;
912 m_stVehicleInfo.nShiftPos = DRIVE;
916 m_stVehicleInfo.nShiftPos = THIRD;
920 m_stVehicleInfo.nShiftPos = SECOND;
924 m_stVehicleInfo.nShiftPos = FIRST;
930 char data[] = { shiftpos, shiftpos, 0 };
931 const char *vi = "SHIFT";
932 SendVehicleInfo(dataport_def, vi, &data[0], 3);
936 if (number == myConf.m_nWinkR) {
938 m_stVehicleInfo.bWinkR = !m_stVehicleInfo.bWinkR;
939 if (m_stVehicleInfo.bWinkR)
940 m_stVehicleInfo.nWinkerPos = WINKER_RIGHT;
942 m_stVehicleInfo.nWinkerPos = WINKER_OFF;
944 const char *vi = "TURN_SIGNAL";
946 m_stVehicleInfo.nWinkerPos == WINKER_RIGHT ? 1 : 0;
947 SendVehicleInfo(dataport_def, vi, wpos);
951 if (number == myConf.m_nWinkL) {
953 m_stVehicleInfo.bWinkL = !m_stVehicleInfo.bWinkL;
954 if (m_stVehicleInfo.bWinkL)
955 m_stVehicleInfo.nWinkerPos = WINKER_LEFT;
957 m_stVehicleInfo.nWinkerPos = WINKER_OFF;
959 const char *vi = "TURN_SIGNAL";
961 m_stVehicleInfo.nWinkerPos == WINKER_LEFT ? 2 : 0;
962 SendVehicleInfo(dataport_def, vi, wpos);
969 if (m_stVehicleInfo.nAccel < 0) {
970 m_stVehicleInfo.dVelocity +=
971 ((abs(m_stVehicleInfo.nAccel) / 10000.0) -
972 (m_stVehicleInfo.dVelocity / 100.0));
974 else if (0 < m_stVehicleInfo.nAccel) {
975 m_stVehicleInfo.dVelocity -=
976 ((abs(m_stVehicleInfo.nAccel) / 10000.0) +
977 (m_stVehicleInfo.dVelocity / 100.0));
980 m_stVehicleInfo.dVelocity -= (m_stVehicleInfo.dVelocity / 1000);
983 if (m_stVehicleInfo.dVelocity > MAX_SPEED)
984 m_stVehicleInfo.dVelocity = MAX_SPEED;
985 if (m_stVehicleInfo.dVelocity < 0)
986 m_stVehicleInfo.dVelocity = 0.0;
988 if (m_stVehicleInfo.nVelocity != (int) m_stVehicleInfo.dVelocity) {
989 m_stVehicleInfo.nVelocity = (int) m_stVehicleInfo.dVelocity;
990 const char *vi = "VELOCITY";
991 SendVehicleInfo(dataport_def, vi, m_stVehicleInfo.nVelocity);
995 if (routeList.empty()) {
997 printf("FreeDriving\n");
999 routeDriveFlg = false;
1001 m_stVehicleInfo.nDirection += m_stVehicleInfo.nSteeringAngle;
1003 while (m_stVehicleInfo.nDirection > 359)
1004 m_stVehicleInfo.nDirection -= 360;
1005 while (m_stVehicleInfo.nDirection < 0)
1006 m_stVehicleInfo.nDirection += 360;
1009 const char *vi = "DIRECTION";
1010 SendVehicleInfo(dataport_def, vi, m_stVehicleInfo.nDirection);
1016 if (m_stVehicleInfo.nDirection != 0)
1018 (double) m_stVehicleInfo.nDirection / 180.0 *
1021 double dx = (double) m_stVehicleInfo.nVelocity * sin(rad);
1022 double dy = (double) m_stVehicleInfo.nVelocity * cos(rad);
1024 m_stVehicleInfo.fLat += dx * 0.000003;
1025 m_stVehicleInfo.fLng += dy * 0.000003;
1027 const char *vi = "LOCATION";
1029 { m_stVehicleInfo.fLat, m_stVehicleInfo.fLng, 0 };
1033 if (!routeDriveFlg) {
1034 printf("route Driving\n");
1035 m_stVehicleInfo.fLat = routeList.front().lat;
1036 m_stVehicleInfo.fLng = routeList.front().lng;
1039 routeDriveFlg = true;
1040 next = routeList.front();
1041 dy = next.lat - m_stVehicleInfo.fLat;
1042 dx = next.lng - m_stVehicleInfo.fLng;
1043 theta = (double) atan2(dy, dx) * 180.0 / (atan(1.0) * 4.0);
1045 theta = 360.0 + theta;
1048 rad = (theta / 180.0) * PIE;
1050 m_stVehicleInfo.nDirection = 90 - theta;
1051 if (m_stVehicleInfo.nDirection < 0) {
1052 m_stVehicleInfo.nDirection = 360 + m_stVehicleInfo.nDirection;
1056 const char *vi = "DIRECTION";
1057 SendVehicleInfo(dataport_def, vi, m_stVehicleInfo.nDirection);
1059 m_stVehicleInfo.fLat +=
1060 (m_stVehicleInfo.nVelocity * sin(rad) / (72 * 1000)) /
1061 (cos((m_stVehicleInfo.fLat / 180) * PIE) * 111.111);
1062 m_stVehicleInfo.fLng +=
1063 (m_stVehicleInfo.nVelocity * cos(rad) / (72 * 1000)) * (1 /
1067 const char *vi = "LOCATION";
1069 { m_stVehicleInfo.fLat, m_stVehicleInfo.fLng, 0 };
1073 if (m_stVehicleInfo.fLng >= next.lng) {
1074 nextPointFlg = true;
1077 else if (rad > 0 && rad < 0.5 * PIE) {
1078 if (m_stVehicleInfo.fLng >= next.lng
1079 && m_stVehicleInfo.fLat >= next.lat) {
1080 nextPointFlg = true;
1083 else if (rad == 0.5 * PIE) {
1084 if (m_stVehicleInfo.fLat >= next.lat) {
1085 nextPointFlg = true;
1088 else if (rad > 0.5 * PIE && rad < PIE) {
1089 if (m_stVehicleInfo.fLng <= next.lng
1090 && m_stVehicleInfo.fLat >= next.lat) {
1091 nextPointFlg = true;
1094 else if (rad == PIE) {
1095 if (m_stVehicleInfo.fLng <= next.lng) {
1096 nextPointFlg = true;
1099 else if (rad > PIE && rad < 1.5 * PIE) {
1100 if (m_stVehicleInfo.fLng <= next.lng
1101 && m_stVehicleInfo.fLat <= next.lat) {
1102 nextPointFlg = true;
1105 else if (rad == 1.5 * PIE) {
1106 if (m_stVehicleInfo.fLat <= next.lat) {
1107 nextPointFlg = true;
1111 if (m_stVehicleInfo.fLng >= next.lng
1112 && m_stVehicleInfo.fLat <= next.lat) {
1113 nextPointFlg = true;
1118 if (routeList.empty()) {
1120 m_stVehicleInfo.fLng = myConf.m_fLng;
1121 m_stVehicleInfo.fLat = myConf.m_fLat;
1123 next = routeList.front();
1125 nextPointFlg = false;
1130 pthread_join(thread[0], NULL);
1131 pthread_join(thread[1], NULL);
1132 while (!routeList.empty()) {
1135 pthread_mutex_destroy(&mutex);
1141 struct KeyDataMsg_t ret;
1142 int *recvid = (int *) s;
1144 while (g_bStopFlag) {
1145 if (msgrcv(*recvid, &ret, sizeof(struct KeyDataMsg_t), 31, MSG_EXCEPT)
1147 return (void *) NULL;
1154 /*--------------------------------------------------------------------------*/
1156 * @brief function of vehicle information access
1158 * @param[in] SigNo signal number
1161 /*--------------------------------------------------------------------------*/
1162 void DaemonTerminate(int SigNo)
1166 (SigNo != SIGHUP) && (SigNo != SIGINT) && (SigNo != SIGTERM)) {
1167 (void) signal(SigNo, DaemonTerminate);
1174 /*--------------------------------------------------------------------------*/
1176 * @brief function of vehicle information set to AMB
1178 * @param[in] sendque_id que id for sending
1179 * @param[in] recvque_id que id for receiving
1180 * @param[in] mtype priority
1181 * @param[in] key name of vehicle information
1182 * @param[in] comstat common_status
1183 * @param[in] data value of vehicle information
1184 * @param[in] len length of vehicle information
1185 * @param[out] ret struct from AMB
1186 * @return bool true:success,false:fail
1188 /*--------------------------------------------------------------------------*/
1189 bool CGtCtrl::SendVehicleInfo( /*int & send_id, long mtype, */
1190 ProtocolType type, const char *key, bool data)
1192 return sendVehicleInfo( /*send_id, mtype, */ type, key, (void *) &data,
1196 bool CGtCtrl::SendVehicleInfo( /*int & send_id, long mtype, */
1197 ProtocolType type, const char *key, int data)
1199 return sendVehicleInfo( /*send_id, mtype, */ type, key, (void *) &data,
1203 bool CGtCtrl::SendVehicleInfo( /*int & send_id, long mtype, */
1204 ProtocolType type, const char *key, int data[],
1207 return sendVehicleInfo( /*send_id, mtype, */ type, key, (void *) data,
1211 bool CGtCtrl::SendVehicleInfo(/*int & send_id, long mtype */
1212 ProtocolType type, const char *key,
1213 double data[], int len)
1215 return sendVehicleInfo( /*send_id, mtype, */ type, key, (void *) data,
1216 sizeof(double), len);
1219 bool CGtCtrl::SendVehicleInfo( /*int & send_id, long mtype, */
1220 ProtocolType type, const char *key, char data[],
1223 return sendVehicleInfo( /*send_id, mtype, */ type, key, (void *) data,
1227 /*--------------------------------------------------------------------------*/
1229 * @brief vehicle information struct for AMB
1231 * @param[in] buf buffer for vehicle information struct
1232 * @param[in] bufsize size of buffer
1233 * @param[in] mtype priority
1234 * @param[in] key name of vehicle information
1235 * @param[in] tm time
1236 * @param[in] nstat common_status
1237 * @param[in] status value of vehicle information
1240 /*--------------------------------------------------------------------------*/
1241 void CGtCtrl::SetMQKeyData(char *buf, unsigned int bufsize, long &mtype,
1242 const char *key, char status[], unsigned int size)
1244 KeyDataMsg_t *tmp_t = (KeyDataMsg_t *) buf;
1246 memset(buf, 0x00, bufsize);
1247 strcpy(tmp_t->KeyEventType, key);
1248 gettimeofday(&tmp_t->recordtime, NULL);
1249 tmp_t->data.common_status = 0;
1250 memcpy(&tmp_t->data.status[0], &status[0], size);
1253 /*--------------------------------------------------------------------------*/
1255 * @brief set vehicle information for AMB
1257 * @param[in] sendque_id queue ID
1258 * @param[in] priority priority of queue
1259 * @param[in] key KeyEventType
1260 * @param[in] data value of vehicle info
1261 * @param[in] unit_size size of send data unit
1262 * @param[in] unit_cnt number of send data unit
1263 * @return bool true:success,false:failure
1265 /*--------------------------------------------------------------------------*/
1266 bool CGtCtrl::sendVehicleInfo( /*int & send_id, long priority, */
1267 ProtocolType type, const char *key, void *data,
1268 unsigned int unit_size, int unit_cnt)
1272 if (unit_size == 0 || unit_cnt <= 0 || data == NULL)
1275 char adata[unit_size * unit_cnt];
1276 char mqMsg[sizeof(KeyDataMsg_t) + sizeof(adata)];
1278 for (int i = 0; i < unit_cnt; i++) {
1279 int pos = i * unit_size;
1280 memcpy(&adata[pos], (char *) data + pos, unit_size);
1283 SetMQKeyData(&mqMsg[0], sizeof(mqMsg), priority, key, adata,
1286 if (!m_ambpicomm_client[type].
1287 send(reinterpret_cast < char *>(mqMsg), sizeof(mqMsg)))
1289 std::cerr << "Failed to send data(" << errno << ")." << std::endl;
1293 m_sendMsgInfo.push_back(string(key));
1299 /*--------------------------------------------------------------------------*/
1301 * @brief JOSN parser
1303 * @param[in] fname file name of configuration file(full path)
1304 * @return bool false:failure
1306 /*--------------------------------------------------------------------------*/
1307 bool CGtCtrl::LoadConfigJson(const char *fname)
1309 char confpath[1024];
1310 JsonParser *parser = NULL;
1311 JsonNode *node = NULL;
1312 JsonReader *reader = NULL;
1314 if (!LoadConfigAMBJson(fname, &confpath[0], sizeof(confpath))) {
1319 printf("conf=%s\nvehicleinfo conf=%s\n", fname, confpath);
1321 parser = json_parser_new();
1322 GError *error = NULL;
1324 json_parser_load_from_file(parser, confpath, &error);
1326 printf("Failed to load config: %s\n", error->message);
1327 DelJsonObj(parser, reader);
1331 node = json_parser_get_root(parser);
1333 printf("Unable to get JSON root object.\n");
1334 DelJsonObj(parser, reader);
1338 reader = json_reader_new(node);
1339 if (reader == NULL) {
1340 printf("Unable to create JSON reader\n");
1341 DelJsonObj(parser, reader);
1345 if (!LoadConfigJsonCarSim(reader)) {
1346 DelJsonObj(parser, reader);
1350 json_reader_set_root(reader, node);
1351 if (!LoadConfigJsonCommon(reader)) {
1352 DelJsonObj(parser, reader);
1359 /*--------------------------------------------------------------------------*/
1361 * @brief release JSON parser object
1363 * @param[in] parser parser object
1364 * @param[in] node node object
1365 * @param[in] reader reader object
1368 /*--------------------------------------------------------------------------*/
1369 void CGtCtrl::DelJsonObj(JsonParser *parser, JsonReader *reader)
1372 g_object_unref(reader);
1374 g_object_unref(parser);
1377 /*--------------------------------------------------------------------------*/
1379 * @brief get JSON file path form configuration
1381 * @param[in] fname full path of configuration file
1382 * @param[out] jsonfname buffer of JSON file name
1383 * @param[in] size size of second argument buffer size
1384 * @return bool false:failure
1386 /*--------------------------------------------------------------------------*/
1387 bool CGtCtrl::LoadConfigAMBJson(const char *fname, char *jsonfname, int size)
1389 JsonParser *ps = NULL;
1390 JsonNode *nd = NULL;
1391 JsonReader *rd = NULL;
1393 memset(jsonfname, 0x00, size);
1396 ps = json_parser_new();
1397 GError *error = NULL;
1399 json_parser_load_from_file(ps, fname, &error);
1401 printf("Failed to load AMBconfig: %s\n", error->message);
1406 nd = json_parser_get_root(ps);
1408 printf("Unable to get AMB-JSON root object.\n");
1413 rd = json_reader_new(nd);
1415 printf("Unable to create AMB-JSON reader\n");
1420 json_reader_read_member(rd, "sources");
1421 error = (GError *) json_reader_get_error(rd);
1422 if (error != NULL) {
1423 printf("Error getting AMB sources member. %s\n", error->message);
1427 g_assert(json_reader_is_array(rd));
1428 for (int i = 0; i < json_reader_count_elements(rd); i++) {
1429 json_reader_read_element(rd, i);
1430 json_reader_read_member(rd, "name");
1431 std::string section = json_reader_get_string_value(rd);
1432 json_reader_end_member(rd);
1433 if ("VehicleSource" == section) {
1435 if (GetConfigValue(rd, "configfile", &val[0], size)) {
1436 strcpy(jsonfname, val);
1440 json_reader_end_element(rd);
1442 json_reader_end_member(rd);
1447 /*--------------------------------------------------------------------------*/
1449 * @brief get JSON value(CarSim)
1451 * @param[in] reader JSON reader object
1452 * @return bool false:failure
1454 /*--------------------------------------------------------------------------*/
1455 bool CGtCtrl::LoadConfigJsonCarSim(JsonReader *reader)
1457 json_reader_read_member(reader, "Config");
1458 const GError *confreaderror = json_reader_get_error(reader);
1459 if (confreaderror != NULL) {
1460 printf("Error getting sources member. %s\n", confreaderror->message);
1463 g_assert(json_reader_is_array(reader));
1465 int elementnum = json_reader_count_elements(reader);
1466 for (int i = 0; i < elementnum; i++) {
1467 json_reader_read_element(reader, i);
1468 json_reader_read_member(reader, "Section");
1469 std::string section = json_reader_get_string_value(reader);
1470 json_reader_end_member(reader);
1472 if ("CarSim" == section) {
1473 const char *key1 = "DefaultInfoMQKey";
1474 const char *key2 = "CustomizeInfoMQKey";
1475 const char *key3 = "VehicleInfoList";
1478 if (!json_reader_read_member(reader, key3)) {
1479 confreaderror = json_reader_get_error(reader);
1480 printf("Error getting %s. %s\n", key3,
1481 confreaderror->message);
1485 confreaderror = json_reader_get_error(reader);
1486 if (confreaderror != NULL) {
1487 confreaderror = json_reader_get_error(reader);
1488 printf("Error getting %s member. %s\n", key3,
1489 confreaderror->message);
1492 g_assert(json_reader_is_array(reader));
1493 m_viList.length = json_reader_count_elements(reader);
1494 for (int j = 0; j < m_viList.length; j++) {
1495 json_reader_read_element(reader, j);
1496 std::string str = json_reader_get_string_value(reader);
1497 strcpy(m_viList.name[j], str.c_str());
1498 json_reader_end_element(reader);
1500 json_reader_end_member(reader);
1503 json_reader_end_element(reader);
1505 json_reader_end_member(reader);
1510 /*--------------------------------------------------------------------------*/
1512 * @brief get JSON value(Common)
1514 * @param[in] reader JSON reader object
1515 * @return bool false:failure
1517 /*--------------------------------------------------------------------------*/
1518 bool CGtCtrl::LoadConfigJsonCommon(JsonReader *reader)
1520 json_reader_read_member(reader, "Config");
1521 const GError *confreaderror = json_reader_get_error(reader);
1522 if (confreaderror != NULL) {
1523 printf("Error getting sources member. %s\n", confreaderror->message);
1526 g_assert(json_reader_is_array(reader));
1528 int elementnum = json_reader_count_elements(reader);
1530 for (i = 0; i < elementnum; i++) {
1531 json_reader_read_element(reader, i);
1532 if (!json_reader_read_member(reader, "Section")) {
1533 confreaderror = json_reader_get_error(reader);
1534 printf("Error getting Section. %s\n", confreaderror->message);
1537 std::string section = json_reader_get_string_value(reader);
1538 json_reader_end_member(reader);
1540 if ("Common" == section) {
1541 const char *key1 = "VehicleInfoDefine";
1543 if (!json_reader_read_member(reader, key1)) {
1544 confreaderror = json_reader_get_error(reader);
1545 printf("Error getting %s. %s\n", key1,
1546 confreaderror->message);
1550 confreaderror = json_reader_get_error(reader);
1551 if (confreaderror != NULL) {
1552 confreaderror = json_reader_get_error(reader);
1553 printf("Error getting %s member. %s\n", key1,
1554 confreaderror->message);
1557 g_assert(json_reader_is_array(reader));
1559 for (int j = 0; j < json_reader_count_elements(reader); j++) {
1560 json_reader_read_element(reader, j);
1561 if (!json_reader_read_member(reader, "KeyEventType")) {
1562 confreaderror = json_reader_get_error(reader);
1563 printf("Error getting %s. %s\n", key1,
1564 confreaderror->message);
1568 std::string str = json_reader_get_string_value(reader);
1569 json_reader_end_member(reader);
1570 if (m_viList.isContainVehicleName(str.c_str())) {
1572 if (GetConfigValue(reader, "Priority", &priority, 0)) {
1573 m_viList.setPriority(str.c_str(), priority);
1577 json_reader_end_element(reader);
1579 json_reader_end_member(reader);
1580 const char key2[][32] = {
1584 const char *subkey1 = "DataPort";
1585 const char *subkey2 = "CtrlPort";
1587 for (int i = 0; i < 2; i++) {
1588 if (!json_reader_read_member(reader, key2[i])) {
1589 confreaderror = json_reader_get_error(reader);
1590 printf("Error getting %s. %s\n", key2[i],
1591 confreaderror->message);
1594 confreaderror = json_reader_get_error(reader);
1595 if (confreaderror != NULL) {
1596 confreaderror = json_reader_get_error(reader);
1597 printf("Error getting %s member. %s\n", key2[i],
1598 confreaderror->message);
1602 if (!json_reader_read_member(reader, subkey1)) {
1603 confreaderror = json_reader_get_error(reader);
1604 printf("Error getting %s->%s. %s\n", key2[i],
1605 subkey1, confreaderror->message);
1608 confreaderror = json_reader_get_error(reader);
1609 if (confreaderror != NULL) {
1610 confreaderror = json_reader_get_error(reader);
1611 printf("Error getting %s->%s member. %s\n", key2[i],
1612 subkey1, confreaderror->message);
1615 m_ambpicomm_port[i * 2] = json_reader_get_int_value(reader);
1616 json_reader_end_member(reader);
1618 if (!json_reader_read_member(reader, subkey2)) {
1619 confreaderror = json_reader_get_error(reader);
1620 printf("Error getting %s->%s. %s\n", key2[i],
1621 subkey2, confreaderror->message);
1624 confreaderror = json_reader_get_error(reader);
1625 if (confreaderror != NULL) {
1626 confreaderror = json_reader_get_error(reader);
1627 printf("Error getting %s->%s member. %s\n", key2[i],
1628 subkey2, confreaderror->message);
1631 m_ambpicomm_port[i * 2 + 1] =
1632 json_reader_get_int_value(reader);
1633 json_reader_end_member(reader);
1634 json_reader_end_member(reader);
1637 json_reader_end_element(reader);
1639 json_reader_end_member(reader);
1644 /*--------------------------------------------------------------------------*/
1646 * @brief get value form configuration file(text data)
1648 * @param[in] r JsonReader object
1649 * @param[in] key key
1650 * @param[out] buf data buffer
1651 * @param[in] size size of data buffer
1652 * @return bool false:failure
1654 /*--------------------------------------------------------------------------*/
1655 bool CGtCtrl::GetConfigValText(JsonReader *r, const char *key, char *buf,
1661 memset(buf, 0x00, size);
1662 if (!json_reader_read_member(r, key)) {
1663 printf("Error getting string value.\n");
1667 val = json_reader_get_string_value(r);
1668 json_reader_end_member(r);
1670 (int) val.length() > (size - 1) ? (size - 1) : (int) val.length();
1671 memcpy(buf, val.c_str(), len);
1676 /*--------------------------------------------------------------------------*/
1678 * @brief get value form configuration file(integer data)
1680 * @param[in] r JsonReader object
1681 * @param[in] key key
1682 * @param[out] buf data buffer
1683 * @return bool false:failure
1685 /*--------------------------------------------------------------------------*/
1686 bool CGtCtrl::GetConfigValInt(JsonReader *r, const char *key, int *buf)
1690 if (!json_reader_read_member(r, key)) {
1691 printf("Error getting integer value.\n");
1695 *buf = (int) json_reader_get_int_value(r);
1696 json_reader_end_member(r);
1701 /*--------------------------------------------------------------------------*/
1703 * @brief get value form configuration file(double data)
1705 * @param[in] r JsonReader object
1706 * @param[in] key key
1707 * @param[out] buf data buffer
1708 * @return bool false:failure
1710 /*--------------------------------------------------------------------------*/
1711 bool CGtCtrl::GetConfigValDouble(JsonReader *r, const char *key, double *buf)
1715 if (!json_reader_read_member(r, key)) {
1716 printf("Error getting floating point value.\n");
1720 *buf = (double) json_reader_get_double_value(r);
1721 json_reader_end_member(r);
1726 /*--------------------------------------------------------------------------*/
1728 * @brief get value form configuration file(boolean data)
1730 * @param[in] r JsonReader object
1731 * @param[in] key key
1732 * @param[out] buf data buffer
1733 * @return bool false:failure
1735 /*--------------------------------------------------------------------------*/
1736 bool CGtCtrl::GetConfigValBool(JsonReader *r, const char *key, bool *buf)
1740 if (!json_reader_read_member(r, key)) {
1741 printf("Error getting boolean value.\n");
1745 *buf = (double) json_reader_get_boolean_value(r);
1746 json_reader_end_member(r);
1751 /*--------------------------------------------------------------------------*/
1753 * @brief get value form configuration file
1755 * @param[in] r JsonReader object
1756 * @param[in] key key
1757 * @param[out] buf data buffer
1758 * @param[in] size size of buf
1759 * @return bool false:failure
1761 /*--------------------------------------------------------------------------*/
1762 bool CGtCtrl::GetConfigValue(JsonReader *r, const char *key, char *buf,
1765 return GetConfigValText(r, key, buf, size);
1768 bool CGtCtrl::GetConfigValue(JsonReader *r, const char *key, int *buf,
1771 return GetConfigValInt(r, key, buf);
1774 bool CGtCtrl::GetConfigValue(JsonReader *r, const char *key, double *buf,
1777 return GetConfigValDouble(r, key, buf);
1780 bool CGtCtrl::GetConfigValue(JsonReader *r, const char *key, bool *buf,
1783 return GetConfigValBool(r, key, buf);
1787 void CGtCtrl::CheckSendResult(int mqid)
1793 if (msgrcv(mqid, &ret, sizeof(KeyDataMsg_t), 31, IPC_NOWAIT) == -1) {
1798 list < string >::iterator pos;
1800 find(m_sendMsgInfo.begin(), m_sendMsgInfo.end(),
1801 string(ret.KeyEventType));
1802 if (pos != m_sendMsgInfo.end()) {
1803 printf("send error: AMB cannot receive %s\n",
1810 void CGtCtrl::LoadRouteList() {
1811 std::cout << "LoadRouteList:orgmsgQueue[" << orgmsgQueue << "]\n";
1812 if (orgmsgQueue == "") {
1814 fin.open(g_RouteListFile.c_str());
1816 std::cerr << "Can't read " << g_RouteListFile << std::endl;
1819 while (fin && getline(fin, line)) {
1820 orgmsgQueue.append(line);
1821 orgmsgQueue.append("\n");
1823 msgQueue = orgmsgQueue;
1827 msgQueue = orgmsgQueue;
1829 if (msgQueue.size() > 0) {
1836 tmpGeo.lat = GEORESET;
1837 tmpGeo.lng = GEORESET;
1839 for (i = 0; i < (int) msgQueue.size(); i++) {
1840 if (msgQueue[i] == ',') {
1841 tmpGeo.lat = atof(buf);
1844 else if (msgQueue[i] == '\n') {
1845 tmpGeo.lng = atof(buf);
1848 routeList.push(tmpGeo);
1850 tmpGeo.lat = GEORESET;
1851 tmpGeo.lng = GEORESET;
1854 buf[pos++] = msgQueue[i];
1861 * End of File. (CGtCtrl.cpp)