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
17 #include "CJoyStick.h"
18 #include "CJoyStickEV.h"
26 std::queue < geoData > routeList;
30 int nDelayedCallback = 0;
37 pthread_mutex_t mutex;
40 * Average ENGINE or CAR Sample Space size
42 short g_RPM_SAMPLE_SPACE_SIZE = 60;
43 short g_SPEED_SAMPLE_SPACE_SIZE = 180;
44 short g_BREAKE_SAMPLE_SPACE_SIZE = 10;
47 * GPS Info update flag
49 bool g_bSentInMileage = true;
50 bool g_bSentInChgLngLat = true;
51 double g_SentInMileage = 3.0; // 3 meter
52 double g_StartLatitude = 35.47945;
53 double g_StartLongitude = 139.40026;
54 double g_GoalLatitude = 35.49746;
55 double g_GoalLongitude = 139.40504;
58 #define _D_URI_FORM "ws://%s:%d"
59 #define _D_HOST_STR "127.0.0.1"
60 const int protocols_sz = 4;
61 const char* protocolsName[protocols_sz] = {
62 "standarddatamessage-only",
63 "standardcontrolmessage-only",
64 "customdatamessage-only",
65 "customcontrolmessage-only"
71 m_strConfPath = "/usr/bin/CarSimDaemon.conf";
72 // TODO Auto-generated constructor stub
73 signal(SIGINT, CGtCtrl::signal_handler);
74 signal(SIGQUIT, CGtCtrl::signal_handler);
75 signal(SIGKILL, CGtCtrl::signal_handler);
76 signal(SIGTERM, CGtCtrl::signal_handler);
77 signal(SIGCHLD, CGtCtrl::signal_handler);
85 // TODO Auto-generated destructor stub
92 void CGtCtrl::signal_handler(int signo)
100 printf("receive cancel command(%d).\n", signo);
109 bool CGtCtrl::Initialize()
113 m_stVehicleInfo.fLng = g_StartLongitude;
114 m_stVehicleInfo.fLat = g_StartLatitude;
115 m_stVehicleInfo.nSteeringAngle = 0;
116 m_stVehicleInfo.nShiftPos = 0;
117 m_stVehicleInfo.bHazard = false;
118 m_stVehicleInfo.bWinkR = false;
119 m_stVehicleInfo.bWinkL = false;
120 m_stVehicleInfo.nAirconTemp = 250;
121 m_stVehicleInfo.nHeadLightPos = 1;
122 m_stVehicleInfo.nVelocity = 0;
123 m_stVehicleInfo.nDirection = 0;
124 m_stVehicleInfo.dVelocity = 0.0;
125 m_stVehicleInfo.nAccel = 0;
129 if (true == gbDevJs) {
130 myJS = new CJoyStick;
131 int nRet = myJS->Open();
133 printf("JoyStick open error\n");
142 printf("Load class G27\n");
143 myJS = new CJoyStickG27;
144 m_strConfPath = g_ConfPathG27;
147 printf("Load class G25\n");
148 myJS = new CJoyStickG25;
149 m_strConfPath = g_ConfPathG25;
152 printf("Load class EV\n");
153 myJS = new CJoyStickEV;
154 m_strConfPath = g_ConfPathG27;
159 int nRet = myJS->Open();
164 } while ((++i) < g_JoyStickTypeNum);
170 myConf.LoadConfig(m_strConfPath.c_str());
174 if (!LoadConfigJson(AMB_CONF)) {
175 printf("AMB configfile read error\n");
179 m_sendMsgInfo.clear();
182 for (int i = 0; i < protocols_sz; i++) {
183 sprintf(uri, _D_URI_FORM, _D_HOST_STR, m_ambpicomm_port[i]);
184 if (false == m_ambpicomm_client[i].start(uri, protocolsName[i])) {
185 return false; // connect fail
187 if (false == m_ambpicomm_client[i].threadCondWait()) {
188 std::cerr << "Failed to wait signal (" << i << ")" << std::endl;
192 const char *vi = "LOCATION";
193 double location[] = { myConf.m_fLat, myConf.m_fLng, 0 };
194 SendVehicleInfo(dataport_def, vi, &location[0], 3);
199 bool CGtCtrl::Terminate()
209 #define sENGINE_SPEED "ENGINE_SPEED"
210 #define sBRAKE_SIGNAL "BRAKE_SIGNAL"
211 #define sBRAKE_PRESSURE "BRAKE_PRESSURE"
212 #define sACCPEDAL_OPEN "ACCPEDAL_OPEN"
213 #define sVELOCITY "VELOCITY"
214 #define sDIRECTION "DIRECTION"
215 #define sLOCATION "LOCATION"
216 #define sSHIFT "SHIFT"
217 #define sLIGHTSTATUS "LIGHTSTATUS"
227 * INTERVAL WAIT COUNTER
229 int iwc = D_RUNLOOP_INTERVAL_COUNT;
231 * RPM/Breake/Speed calc class
234 bool bBrakeSigSend = false;
235 bool bBrakeSig = false;
236 int nBrakePressure = -1;
237 int nAccPedalOpen = -1;
239 CAvgCar pmCar(g_RPM_SAMPLE_SPACE_SIZE, g_SPEED_SAMPLE_SPACE_SIZE,
240 g_BREAKE_SAMPLE_SPACE_SIZE);
241 pmCar.chgGear(CAvgGear::E_SHIFT_PARKING);
245 double dir = (double)m_stVehicleInfo.nDirection;
249 int nShiftPosBK = -1;
251 while (g_bStopFlag) {
253 type = myJS->Read(&number, &value);
255 m_sendMsgInfo.clear();
259 if (number == myConf.m_nSteering) {
261 m_stVehicleInfo.nSteeringAngle +=
262 (value * 10 / 65536 - m_stVehicleInfo.nSteeringAngle);
265 const char *vi = "STEERING";
267 SendVehicleInfo(dataport_def,
268 vi, m_stVehicleInfo.nSteeringAngle);
272 if (number == myConf.m_nAccel) {
273 //printf("Accel[%d]\n", value);
276 pmCar.chgThrottle(32767);
277 pmCar.chgBrake(32767);
279 else if (0 < value) {
280 pmCar.chgThrottle(32767);
281 pmCar.chgBrake((value - 16384) * -2);
284 pmCar.chgThrottle((abs(value) - 16384) * -2);
285 pmCar.chgBrake(32767);
289 pmCar.chgThrottle((65535 - value) / 1.1 + 32767);
290 pmCar.chgBrake(32767);
294 if (number == myConf.m_nBrake) {
295 //printf("Brake[%d]\n", value);
296 pmCar.chgThrottle(32767);
297 pmCar.chgBrake((65535 - value) / 64 + 32767);
300 case JS_EVENT_BUTTON:
301 if (myConf.m_sDeviceName == D_DEV_NAME_G25) {
303 * Gear Change SHIFT UP
305 if (number == myConf.m_nShiftU) {
306 //printf("Shift Up[%d]\n",value);
309 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
310 shiftpos = pmCar.getValue();
314 * Gear Change SHIFT DOWN
316 if (number == myConf.m_nShiftD) {
317 //printf("Shift Down[%d]\n",value);
319 pmCar.setShiftDown();
320 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
321 shiftpos = pmCar.getValue();
326 else if (myConf.m_sDeviceName == D_DEV_NAME_G27) {
327 if (number == myConf.m_nShift1) {
328 //printf("Shift 1[%d]\n",value);
330 pmCar.setShiftMT(CAvgGear::E_SHIFT_MT_FIRST);
331 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
332 shiftpos = pmCar.getValue();
335 pmCar.setShiftMT(CAvgGear::E_SHIFT_NEUTRAL);
336 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
337 shiftpos = pmCar.getValue();
341 if (number == myConf.m_nShift2) {
342 //printf("Shift 2[%d]\n",value);
344 pmCar.setShiftMT(CAvgGear::E_SHIFT_MT_SECOND);
345 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
346 shiftpos = pmCar.getValue();
349 pmCar.setShiftMT(CAvgGear::E_SHIFT_NEUTRAL);
350 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
351 shiftpos = pmCar.getValue();
355 if (number == myConf.m_nShift3) {
356 //printf("Shift 3[%d]\n",value);
358 pmCar.setShiftMT(CAvgGear::E_SHIFT_MT_THIRD);
359 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
360 shiftpos = pmCar.getValue();
363 pmCar.setShiftMT(CAvgGear::E_SHIFT_NEUTRAL);
364 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
365 shiftpos = pmCar.getValue();
369 if (number == myConf.m_nShift4) {
370 //printf("Shift 4[%d]\n",value);
372 pmCar.setShiftMT(CAvgGear::E_SHIFT_MT_FOURTH);
373 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
374 shiftpos = pmCar.getValue();
377 pmCar.setShiftMT(CAvgGear::E_SHIFT_NEUTRAL);
378 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
379 shiftpos = pmCar.getValue();
383 if (number == myConf.m_nShift5) {
384 //printf("Shift 5[%d]\n",value);
386 pmCar.setShiftMT(CAvgGear::E_SHIFT_MT_FIFTH);
387 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
388 shiftpos = pmCar.getValue();
391 pmCar.setShiftMT(CAvgGear::E_SHIFT_NEUTRAL);
392 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
393 shiftpos = pmCar.getValue();
397 if (number == myConf.m_nShift6) {
398 //printf("Shift 6[%d]\n",value);
400 pmCar.setShiftMT(CAvgGear::E_SHIFT_MT_SIXTH);
401 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
402 shiftpos = pmCar.getValue();
405 pmCar.setShiftMT(CAvgGear::E_SHIFT_NEUTRAL);
406 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
407 shiftpos = pmCar.getValue();
411 if (number == myConf.m_nShiftR) {
412 //printf("Shift R[%d]\n",value);
414 pmCar.setShiftMT(CAvgGear::E_SHIFT_REVERSE);
415 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
416 shiftpos = pmCar.getValue();
419 pmCar.setShiftMT(CAvgGear::E_SHIFT_NEUTRAL);
420 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
421 shiftpos = pmCar.getValue();
426 * TURN SIGNAL(WINKER) & LIGHTSTATUS
428 bool bTurnSignal = false;
429 if (number == myConf.m_nWinkR) {
432 m_stVehicleInfo.bWinkR = !m_stVehicleInfo.bWinkR;
433 m_stVehicleInfo.bWinkL = false;
434 if (m_stVehicleInfo.bWinkR)
435 m_stVehicleInfo.nWinkerPos = WINKER_RIGHT;
437 m_stVehicleInfo.nWinkerPos = WINKER_OFF;
439 const char *vi = "TURN_SIGNAL";
441 m_stVehicleInfo.nWinkerPos == WINKER_RIGHT ? 1 : 0;
442 SendVehicleInfo(dataport_def, vi, wpos);
447 if (number == myConf.m_nWinkL) {
449 m_stVehicleInfo.bWinkL = !m_stVehicleInfo.bWinkL;
450 m_stVehicleInfo.bWinkR = false;
451 if (m_stVehicleInfo.bWinkL)
452 m_stVehicleInfo.nWinkerPos = WINKER_LEFT;
454 m_stVehicleInfo.nWinkerPos = WINKER_OFF;
456 const char *vi = "TURN_SIGNAL";
458 m_stVehicleInfo.nWinkerPos == WINKER_LEFT ? 2 : 0;
459 SendVehicleInfo(dataport_def, vi, wpos);
464 if (true == bTurnSignal) {
465 const size_t LSsz = 8;
467 memset(data, 0, sizeof(data));
468 if (WINKER_LEFT == m_stVehicleInfo.nWinkerPos) {
471 else if (WINKER_RIGHT == m_stVehicleInfo.nWinkerPos) {
474 SendVehicleInfo(dataport_def, sLIGHTSTATUS, &data[0], LSsz);
483 int rpmNEW = (int)pmCar.getRPM();
484 if ((iwc==0)&&(rpmNEW != nRPM)) {
485 SendVehicleInfo(dataport_def, sENGINE_SPEED, rpmNEW);
486 nRPM = rpmNEW; // update value
488 int apoNEW = pmCar.calcAccPedalOpen();
489 if (apoNEW != nAccPedalOpen) {
490 SendVehicleInfo(dataport_def, sACCPEDAL_OPEN, apoNEW);
491 nAccPedalOpen = apoNEW;
496 bool bBrakeNEW = pmCar.isOnBrake();
497 m_stVehicleInfo.bBrake = bBrakeNEW;
498 if ((false == bBrakeSigSend) || (bBrakeNEW != bBrakeSig)) {
499 bBrakeSigSend = true;
500 SendVehicleInfo(dataport_def, sBRAKE_SIGNAL, bBrakeNEW);
501 bBrakeSig = bBrakeNEW; // update value
506 int pressureNEW = pmCar.calcPressure(pmCar.getBrakeAvg());
507 m_stVehicleInfo.nBrakeHydraulicPressure = pressureNEW;
508 if (pressureNEW != nBrakePressure) {
509 SendVehicleInfo(dataport_def, sBRAKE_PRESSURE, pressureNEW);
510 nBrakePressure = pressureNEW;
516 int speedNew = (int)pmCar.getSpeed();
517 if (speedNew != nSpeed) {
518 SendVehicleInfo(dataport_def, sVELOCITY, speedNew);
519 m_stVehicleInfo.nVelocity = speedNew;
525 if (nShiftPosBK != m_stVehicleInfo.nShiftPos) {
526 const size_t ShiftSz = 3;
528 int val = pmCar.getValue();
529 data[0] = pmCar.getSelectGear();
531 data[0] = data[0] - 10 + 4;
536 data[1] = pmCar.getValue();
537 data[2] = pmCar.getMode();
538 SendVehicleInfo(dataport_def, sSHIFT, &data[0], ShiftSz);
539 nShiftPosBK = m_stVehicleInfo.nShiftPos;
544 * DIRECTION (AZIMUTH)
545 * Front wheel steering angle
547 double runMeters = pmCar.getTripmeter();
548 pmCar.tripmeterReset();
549 if (0 != runMeters) {
550 double stear = (double)m_stVehicleInfo.nSteeringAngle;
551 double dirNEW = CalcAzimuth(dir, stear, runMeters);
552 int nDir = (int)dirNEW;
554 if (nDir != m_stVehicleInfo.nDirection) {
555 SendVehicleInfo(dataport_def, sDIRECTION, nDir);
556 m_stVehicleInfo.nDirection = nDir;
562 if ((!m_bUseGps) && (0 != runMeters)) {
563 double tmpLat = m_stVehicleInfo.fLat;
564 double tmpLng = m_stVehicleInfo.fLng;
565 POINT pNEW = CalcDest(tmpLat, tmpLng, dir, runMeters);
566 if ((tmpLat != pNEW.lat) || (tmpLng != pNEW.lng)){
567 double tmpLct[] = { pNEW.lat, pNEW.lng, 0 };
568 SendVehicleInfo(dataport_def, sLOCATION, &tmpLct[0], 3);
569 m_stVehicleInfo.fLat = pNEW.lat;
570 m_stVehicleInfo.fLng = pNEW.lng;
575 iwc = D_RUNLOOP_INTERVAL_COUNT;
595 bool nextPointFlg = true;
596 bool routeDriveFlg = true;
597 std::string tmpstr = "";
605 pthread_mutex_init(&mutex, NULL);
607 while (g_bStopFlag) {
608 type = myJS->Read(&number, &value);
610 pthread_mutex_lock(&mutex);
611 if (msgQueue.size() > 0) {
618 tmpGeo.lat = GEORESET;
619 tmpGeo.lng = GEORESET;
621 for (i = 0; i < (int) msgQueue.size(); i++) {
622 if (msgQueue[i] == ',') {
623 tmpGeo.lat = atof(buf);
626 else if (msgQueue[i] == '\n') {
627 tmpGeo.lng = atof(buf);
630 routeList.push(tmpGeo);
632 tmpGeo.lat = GEORESET;
633 tmpGeo.lng = GEORESET;
636 buf[pos++] = msgQueue[i];
639 for (int idx = 0; msgQueue[lastidx] != '\0'; idx++, lastidx++) {
640 tmpstr[idx] = msgQueue[lastidx];
645 pthread_mutex_unlock(&mutex);
649 if (number == myConf.m_nSteering) {
651 m_stVehicleInfo.nSteeringAngle +=
652 (value * 10 / 65536 - m_stVehicleInfo.nSteeringAngle);
656 if (number == myConf.m_nAccel) {
658 m_stVehicleInfo.bBrake = false;
659 m_stVehicleInfo.nBrakeHydraulicPressure = 0;
662 else if (0 < value) {
663 m_stVehicleInfo.bBrake = true;
664 m_stVehicleInfo.nBrakeHydraulicPressure =
665 (value * 100) / MAX_SPEED;
668 m_stVehicleInfo.bBrake = false;
669 m_stVehicleInfo.nBrakeHydraulicPressure = 0;
671 m_stVehicleInfo.nAccel = value;
673 const char *vi1 = "BRAKE_SIGNAL";
674 const char *vi2 = "BRAKE_PRESSURE";
675 SendVehicleInfo(dataport_def, vi1, m_stVehicleInfo.bBrake);
677 SendVehicleInfo(dataport_def,
678 vi2, m_stVehicleInfo.nBrakeHydraulicPressure);
681 case JS_EVENT_BUTTON:
682 if (number == myConf.m_nShiftU) {
685 if (m_stVehicleInfo.nShiftPos > PARKING) {
686 switch (m_stVehicleInfo.nShiftPos) {
688 m_stVehicleInfo.nShiftPos = SECOND;
692 m_stVehicleInfo.nShiftPos = THIRD;
696 m_stVehicleInfo.nShiftPos = DRIVE;
700 m_stVehicleInfo.nShiftPos = NEUTRAL;
704 m_stVehicleInfo.nShiftPos = REVERSE;
708 m_stVehicleInfo.nShiftPos = PARKING;
714 char data[] = { shiftpos, shiftpos, 0 };
715 const char *vi = "SHIFT";
716 SendVehicleInfo(dataport_def, vi, &data[0]);
721 if (number == myConf.m_nShiftD) {
724 if (m_stVehicleInfo.nShiftPos < SPORTS) {
725 switch (m_stVehicleInfo.nShiftPos) {
727 m_stVehicleInfo.nShiftPos = PARKING;
731 m_stVehicleInfo.nShiftPos = REVERSE;
735 m_stVehicleInfo.nShiftPos = NEUTRAL;
739 m_stVehicleInfo.nShiftPos = DRIVE;
743 m_stVehicleInfo.nShiftPos = THIRD;
747 m_stVehicleInfo.nShiftPos = SECOND;
751 m_stVehicleInfo.nShiftPos = FIRST;
757 char data[] = { shiftpos, shiftpos, 0 };
758 const char *vi = "SHIFT";
759 SendVehicleInfo(dataport_def, vi, &data[0], 3);
763 if (number == myConf.m_nWinkR) {
765 m_stVehicleInfo.bWinkR = !m_stVehicleInfo.bWinkR;
766 if (m_stVehicleInfo.bWinkR)
767 m_stVehicleInfo.nWinkerPos = WINKER_RIGHT;
769 m_stVehicleInfo.nWinkerPos = WINKER_OFF;
771 const char *vi = "TURN_SIGNAL";
773 m_stVehicleInfo.nWinkerPos == WINKER_RIGHT ? 1 : 0;
774 SendVehicleInfo(dataport_def, vi, wpos);
778 if (number == myConf.m_nWinkL) {
780 m_stVehicleInfo.bWinkL = !m_stVehicleInfo.bWinkL;
781 if (m_stVehicleInfo.bWinkL)
782 m_stVehicleInfo.nWinkerPos = WINKER_LEFT;
784 m_stVehicleInfo.nWinkerPos = WINKER_OFF;
786 const char *vi = "TURN_SIGNAL";
788 m_stVehicleInfo.nWinkerPos == WINKER_LEFT ? 2 : 0;
789 SendVehicleInfo(dataport_def, vi, wpos);
796 if (m_stVehicleInfo.nAccel < 0) {
797 m_stVehicleInfo.dVelocity +=
798 ((abs(m_stVehicleInfo.nAccel) / 10000.0) -
799 (m_stVehicleInfo.dVelocity / 100.0));
801 else if (0 < m_stVehicleInfo.nAccel) {
802 m_stVehicleInfo.dVelocity -=
803 ((abs(m_stVehicleInfo.nAccel) / 10000.0) +
804 (m_stVehicleInfo.dVelocity / 100.0));
807 m_stVehicleInfo.dVelocity -= (m_stVehicleInfo.dVelocity / 1000);
810 if (m_stVehicleInfo.dVelocity > MAX_SPEED)
811 m_stVehicleInfo.dVelocity = MAX_SPEED;
812 if (m_stVehicleInfo.dVelocity < 0)
813 m_stVehicleInfo.dVelocity = 0.0;
815 if (m_stVehicleInfo.nVelocity != (int) m_stVehicleInfo.dVelocity) {
816 m_stVehicleInfo.nVelocity = (int) m_stVehicleInfo.dVelocity;
817 const char *vi = "VELOCITY";
818 SendVehicleInfo(dataport_def, vi, m_stVehicleInfo.nVelocity);
822 if (routeList.empty()) {
824 printf("FreeDriving\n");
826 routeDriveFlg = false;
828 m_stVehicleInfo.nDirection += m_stVehicleInfo.nSteeringAngle;
830 while (m_stVehicleInfo.nDirection > 359)
831 m_stVehicleInfo.nDirection -= 360;
832 while (m_stVehicleInfo.nDirection < 0)
833 m_stVehicleInfo.nDirection += 360;
836 const char *vi = "DIRECTION";
837 SendVehicleInfo(dataport_def, vi, m_stVehicleInfo.nDirection);
843 if (m_stVehicleInfo.nDirection != 0)
845 (double) m_stVehicleInfo.nDirection / 180.0 *
848 double dx = (double) m_stVehicleInfo.nVelocity * sin(rad);
849 double dy = (double) m_stVehicleInfo.nVelocity * cos(rad);
851 m_stVehicleInfo.fLat += dx * 0.000003;
852 m_stVehicleInfo.fLng += dy * 0.000003;
854 const char *vi = "LOCATION";
856 { m_stVehicleInfo.fLat, m_stVehicleInfo.fLng, 0 };
860 if (!routeDriveFlg) {
861 printf("route Driving\n");
862 m_stVehicleInfo.fLat = routeList.front().lat;
863 m_stVehicleInfo.fLng = routeList.front().lng;
866 routeDriveFlg = true;
867 next = routeList.front();
868 dy = next.lat - m_stVehicleInfo.fLat;
869 dx = next.lng - m_stVehicleInfo.fLng;
870 theta = (double) atan2(dy, dx) * 180.0 / (atan(1.0) * 4.0);
872 theta = 360.0 + theta;
875 rad = (theta / 180.0) * PIE;
877 m_stVehicleInfo.nDirection = 90 - theta;
878 if (m_stVehicleInfo.nDirection < 0) {
879 m_stVehicleInfo.nDirection = 360 + m_stVehicleInfo.nDirection;
883 const char *vi = "DIRECTION";
884 SendVehicleInfo(dataport_def, vi, m_stVehicleInfo.nDirection);
886 m_stVehicleInfo.fLat +=
887 (m_stVehicleInfo.nVelocity * sin(rad) / (72 * 1000)) /
888 (cos((m_stVehicleInfo.fLat / 180) * PIE) * 111.111);
889 m_stVehicleInfo.fLng +=
890 (m_stVehicleInfo.nVelocity * cos(rad) / (72 * 1000)) * (1 /
894 const char *vi = "LOCATION";
896 { m_stVehicleInfo.fLat, m_stVehicleInfo.fLng, 0 };
900 if (m_stVehicleInfo.fLng >= next.lng) {
904 else if (rad > 0 && rad < 0.5 * PIE) {
905 if (m_stVehicleInfo.fLng >= next.lng
906 && m_stVehicleInfo.fLat >= next.lat) {
910 else if (rad == 0.5 * PIE) {
911 if (m_stVehicleInfo.fLat >= next.lat) {
915 else if (rad > 0.5 * PIE && rad < PIE) {
916 if (m_stVehicleInfo.fLng <= next.lng
917 && m_stVehicleInfo.fLat >= next.lat) {
921 else if (rad == PIE) {
922 if (m_stVehicleInfo.fLng <= next.lng) {
926 else if (rad > PIE && rad < 1.5 * PIE) {
927 if (m_stVehicleInfo.fLng <= next.lng
928 && m_stVehicleInfo.fLat <= next.lat) {
932 else if (rad == 1.5 * PIE) {
933 if (m_stVehicleInfo.fLat <= next.lat) {
938 if (m_stVehicleInfo.fLng >= next.lng
939 && m_stVehicleInfo.fLat <= next.lat) {
945 if (!routeList.empty()) {
946 next = routeList.front();
948 nextPointFlg = false;
954 pthread_join(thread[0], NULL);
955 pthread_join(thread[1], NULL);
956 while (!routeList.empty()) {
959 pthread_mutex_destroy(&mutex);
965 struct KeyDataMsg_t ret;
966 int *recvid = (int *) s;
968 while (g_bStopFlag) {
969 if (msgrcv(*recvid, &ret, sizeof(struct KeyDataMsg_t), 31, MSG_EXCEPT)
971 return (void *) NULL;
978 /*--------------------------------------------------------------------------*/
980 * @brief function of vehicle information access
982 * @param[in] SigNo signal number
985 /*--------------------------------------------------------------------------*/
986 void DaemonTerminate(int SigNo)
990 (SigNo != SIGHUP) && (SigNo != SIGINT) && (SigNo != SIGTERM)) {
991 (void) signal(SigNo, DaemonTerminate);
998 /*--------------------------------------------------------------------------*/
1000 * @brief function of vehicle information set to AMB
1002 * @param[in] sendque_id que id for sending
1003 * @param[in] recvque_id que id for receiving
1004 * @param[in] mtype priority
1005 * @param[in] key name of vehicle information
1006 * @param[in] comstat common_status
1007 * @param[in] data value of vehicle information
1008 * @param[in] len length of vehicle information
1009 * @param[out] ret struct from AMB
1010 * @return bool true:success,false:fail
1012 /*--------------------------------------------------------------------------*/
1013 bool CGtCtrl::SendVehicleInfo( /*int & send_id, long mtype, */
1014 ProtocolType type, const char *key, bool data)
1016 return sendVehicleInfo( /*send_id, mtype, */ type, key, (void *) &data,
1020 bool CGtCtrl::SendVehicleInfo( /*int & send_id, long mtype, */
1021 ProtocolType type, const char *key, int data)
1023 return sendVehicleInfo( /*send_id, mtype, */ type, key, (void *) &data,
1027 bool CGtCtrl::SendVehicleInfo( /*int & send_id, long mtype, */
1028 ProtocolType type, const char *key, int data[],
1031 return sendVehicleInfo( /*send_id, mtype, */ type, key, (void *) data,
1035 bool CGtCtrl::SendVehicleInfo(/*int & send_id, long mtype */
1036 ProtocolType type, const char *key,
1037 double data[], int len)
1039 return sendVehicleInfo( /*send_id, mtype, */ type, key, (void *) data,
1040 sizeof(double), len);
1043 bool CGtCtrl::SendVehicleInfo( /*int & send_id, long mtype, */
1044 ProtocolType type, const char *key, char data[],
1047 return sendVehicleInfo( /*send_id, mtype, */ type, key, (void *) data,
1051 /*--------------------------------------------------------------------------*/
1053 * @brief vehicle information struct for AMB
1055 * @param[in] buf buffer for vehicle information struct
1056 * @param[in] bufsize size of buffer
1057 * @param[in] mtype priority
1058 * @param[in] key name of vehicle information
1059 * @param[in] tm time
1060 * @param[in] nstat common_status
1061 * @param[in] status value of vehicle information
1064 /*--------------------------------------------------------------------------*/
1065 void CGtCtrl::SetMQKeyData(char *buf, unsigned int bufsize, long &mtype,
1066 const char *key, char status[], unsigned int size)
1068 KeyDataMsg_t *tmp_t = (KeyDataMsg_t *) buf;
1070 memset(buf, 0x00, bufsize);
1071 strcpy(tmp_t->KeyEventType, key);
1072 gettimeofday(&tmp_t->recordtime, NULL);
1073 tmp_t->data.common_status = 0;
1074 memcpy(&tmp_t->data.status[0], &status[0], size);
1077 /*--------------------------------------------------------------------------*/
1079 * @brief set vehicle information for AMB
1081 * @param[in] sendque_id queue ID
1082 * @param[in] priority priority of queue
1083 * @param[in] key KeyEventType
1084 * @param[in] data value of vehicle info
1085 * @param[in] unit_size size of send data unit
1086 * @param[in] unit_cnt number of send data unit
1087 * @return bool true:success,false:failure
1089 /*--------------------------------------------------------------------------*/
1090 bool CGtCtrl::sendVehicleInfo( /*int & send_id, long priority, */
1091 ProtocolType type, const char *key, void *data,
1092 unsigned int unit_size, int unit_cnt)
1096 if (unit_size == 0 || unit_cnt <= 0 || data == NULL)
1099 char adata[unit_size * unit_cnt];
1100 char mqMsg[sizeof(KeyDataMsg_t) + sizeof(adata)];
1102 for (int i = 0; i < unit_cnt; i++) {
1103 int pos = i * unit_size;
1104 memcpy(&adata[pos], (char *) data + pos, unit_size);
1107 SetMQKeyData(&mqMsg[0], sizeof(mqMsg), priority, key, adata,
1110 if (!m_ambpicomm_client[type].
1111 send(reinterpret_cast < char *>(mqMsg), sizeof(mqMsg)))
1113 std::cerr << "Failed to send data(" << errno << ")." << std::endl;
1117 m_sendMsgInfo.push_back(string(key));
1123 /*--------------------------------------------------------------------------*/
1125 * @brief JOSN parser
1127 * @param[in] fname file name of configuration file(full path)
1128 * @return bool false:failure
1130 /*--------------------------------------------------------------------------*/
1131 bool CGtCtrl::LoadConfigJson(const char *fname)
1133 char confpath[1024];
1134 JsonParser *parser = NULL;
1135 JsonNode *node = NULL;
1136 JsonReader *reader = NULL;
1138 if (!LoadConfigAMBJson(fname, &confpath[0], sizeof(confpath))) {
1143 printf("conf=%s\nvehicleinfo conf=%s\n", fname, confpath);
1145 parser = json_parser_new();
1146 GError *error = NULL;
1148 json_parser_load_from_file(parser, confpath, &error);
1150 printf("Failed to load config: %s\n", error->message);
1151 DelJsonObj(parser, reader);
1155 node = json_parser_get_root(parser);
1157 printf("Unable to get JSON root object.\n");
1158 DelJsonObj(parser, reader);
1162 reader = json_reader_new(node);
1163 if (reader == NULL) {
1164 printf("Unable to create JSON reader\n");
1165 DelJsonObj(parser, reader);
1169 if (!LoadConfigJsonCarSim(reader)) {
1170 DelJsonObj(parser, reader);
1174 json_reader_set_root(reader, node);
1175 if (!LoadConfigJsonCommon(reader)) {
1176 DelJsonObj(parser, reader);
1183 /*--------------------------------------------------------------------------*/
1185 * @brief release JSON parser object
1187 * @param[in] parser parser object
1188 * @param[in] node node object
1189 * @param[in] reader reader object
1192 /*--------------------------------------------------------------------------*/
1193 void CGtCtrl::DelJsonObj(JsonParser *parser, JsonReader *reader)
1196 g_object_unref(reader);
1198 g_object_unref(parser);
1201 /*--------------------------------------------------------------------------*/
1203 * @brief get JSON file path form configuration
1205 * @param[in] fname full path of configuration file
1206 * @param[out] jsonfname buffer of JSON file name
1207 * @param[in] size size of second argument buffer size
1208 * @return bool false:failure
1210 /*--------------------------------------------------------------------------*/
1211 bool CGtCtrl::LoadConfigAMBJson(const char *fname, char *jsonfname, int size)
1213 JsonParser *ps = NULL;
1214 JsonNode *nd = NULL;
1215 JsonReader *rd = NULL;
1217 memset(jsonfname, 0x00, size);
1220 ps = json_parser_new();
1221 GError *error = NULL;
1223 json_parser_load_from_file(ps, fname, &error);
1225 printf("Failed to load AMBconfig: %s\n", error->message);
1230 nd = json_parser_get_root(ps);
1232 printf("Unable to get AMB-JSON root object.\n");
1237 rd = json_reader_new(nd);
1239 printf("Unable to create AMB-JSON reader\n");
1244 json_reader_read_member(rd, "sources");
1245 error = (GError *) json_reader_get_error(rd);
1246 if (error != NULL) {
1247 printf("Error getting AMB sources member. %s\n", error->message);
1251 g_assert(json_reader_is_array(rd));
1252 for (int i = 0; i < json_reader_count_elements(rd); i++) {
1253 json_reader_read_element(rd, i);
1254 json_reader_read_member(rd, "name");
1255 std::string section = json_reader_get_string_value(rd);
1256 json_reader_end_member(rd);
1257 if ("VehicleSource" == section) {
1259 if (GetConfigValue(rd, "configfile", &val[0], size)) {
1260 strcpy(jsonfname, val);
1264 json_reader_end_element(rd);
1266 json_reader_end_member(rd);
1271 /*--------------------------------------------------------------------------*/
1273 * @brief get JSON value(CarSim)
1275 * @param[in] reader JSON reader object
1276 * @return bool false:failure
1278 /*--------------------------------------------------------------------------*/
1279 bool CGtCtrl::LoadConfigJsonCarSim(JsonReader *reader)
1281 json_reader_read_member(reader, "Config");
1282 const GError *confreaderror = json_reader_get_error(reader);
1283 if (confreaderror != NULL) {
1284 printf("Error getting sources member. %s\n", confreaderror->message);
1287 g_assert(json_reader_is_array(reader));
1289 int elementnum = json_reader_count_elements(reader);
1290 for (int i = 0; i < elementnum; i++) {
1291 json_reader_read_element(reader, i);
1292 json_reader_read_member(reader, "Section");
1293 std::string section = json_reader_get_string_value(reader);
1294 json_reader_end_member(reader);
1296 if ("CarSim" == section) {
1297 const char *key1 = "DefaultInfoMQKey";
1298 const char *key2 = "CustomizeInfoMQKey";
1299 const char *key3 = "VehicleInfoList";
1302 if (!json_reader_read_member(reader, key3)) {
1303 confreaderror = json_reader_get_error(reader);
1304 printf("Error getting %s. %s\n", key3,
1305 confreaderror->message);
1309 confreaderror = json_reader_get_error(reader);
1310 if (confreaderror != NULL) {
1311 confreaderror = json_reader_get_error(reader);
1312 printf("Error getting %s member. %s\n", key3,
1313 confreaderror->message);
1316 g_assert(json_reader_is_array(reader));
1317 m_viList.length = json_reader_count_elements(reader);
1318 for (int j = 0; j < m_viList.length; j++) {
1319 json_reader_read_element(reader, j);
1320 std::string str = json_reader_get_string_value(reader);
1321 strcpy(m_viList.name[j], str.c_str());
1322 json_reader_end_element(reader);
1324 json_reader_end_member(reader);
1327 json_reader_end_element(reader);
1329 json_reader_end_member(reader);
1334 /*--------------------------------------------------------------------------*/
1336 * @brief get JSON value(Common)
1338 * @param[in] reader JSON reader object
1339 * @return bool false:failure
1341 /*--------------------------------------------------------------------------*/
1342 bool CGtCtrl::LoadConfigJsonCommon(JsonReader *reader)
1344 json_reader_read_member(reader, "Config");
1345 const GError *confreaderror = json_reader_get_error(reader);
1346 if (confreaderror != NULL) {
1347 printf("Error getting sources member. %s\n", confreaderror->message);
1350 g_assert(json_reader_is_array(reader));
1352 int elementnum = json_reader_count_elements(reader);
1354 for (i = 0; i < elementnum; i++) {
1355 json_reader_read_element(reader, i);
1356 if (!json_reader_read_member(reader, "Section")) {
1357 confreaderror = json_reader_get_error(reader);
1358 printf("Error getting Section. %s\n", confreaderror->message);
1361 std::string section = json_reader_get_string_value(reader);
1362 json_reader_end_member(reader);
1364 if ("Common" == section) {
1365 const char *key1 = "VehicleInfoDefine";
1367 if (!json_reader_read_member(reader, key1)) {
1368 confreaderror = json_reader_get_error(reader);
1369 printf("Error getting %s. %s\n", key1,
1370 confreaderror->message);
1374 confreaderror = json_reader_get_error(reader);
1375 if (confreaderror != NULL) {
1376 confreaderror = json_reader_get_error(reader);
1377 printf("Error getting %s member. %s\n", key1,
1378 confreaderror->message);
1381 g_assert(json_reader_is_array(reader));
1383 for (int j = 0; j < json_reader_count_elements(reader); j++) {
1384 json_reader_read_element(reader, j);
1385 if (!json_reader_read_member(reader, "KeyEventType")) {
1386 confreaderror = json_reader_get_error(reader);
1387 printf("Error getting %s. %s\n", key1,
1388 confreaderror->message);
1392 std::string str = json_reader_get_string_value(reader);
1393 json_reader_end_member(reader);
1394 if (m_viList.isContainVehicleName(str.c_str())) {
1396 if (GetConfigValue(reader, "Priority", &priority, 0)) {
1397 m_viList.setPriority(str.c_str(), priority);
1401 json_reader_end_element(reader);
1403 json_reader_end_member(reader);
1404 const char key2[][32] = {
1408 const char *subkey1 = "DataPort";
1409 const char *subkey2 = "CtrlPort";
1411 for (int i = 0; i < 2; i++) {
1412 if (!json_reader_read_member(reader, key2[i])) {
1413 confreaderror = json_reader_get_error(reader);
1414 printf("Error getting %s. %s\n", key2[i],
1415 confreaderror->message);
1418 confreaderror = json_reader_get_error(reader);
1419 if (confreaderror != NULL) {
1420 confreaderror = json_reader_get_error(reader);
1421 printf("Error getting %s member. %s\n", key2[i],
1422 confreaderror->message);
1426 if (!json_reader_read_member(reader, subkey1)) {
1427 confreaderror = json_reader_get_error(reader);
1428 printf("Error getting %s->%s. %s\n", key2[i],
1429 subkey1, confreaderror->message);
1432 confreaderror = json_reader_get_error(reader);
1433 if (confreaderror != NULL) {
1434 confreaderror = json_reader_get_error(reader);
1435 printf("Error getting %s->%s member. %s\n", key2[i],
1436 subkey1, confreaderror->message);
1439 m_ambpicomm_port[i * 2] = json_reader_get_int_value(reader);
1440 json_reader_end_member(reader);
1442 if (!json_reader_read_member(reader, subkey2)) {
1443 confreaderror = json_reader_get_error(reader);
1444 printf("Error getting %s->%s. %s\n", key2[i],
1445 subkey2, confreaderror->message);
1448 confreaderror = json_reader_get_error(reader);
1449 if (confreaderror != NULL) {
1450 confreaderror = json_reader_get_error(reader);
1451 printf("Error getting %s->%s member. %s\n", key2[i],
1452 subkey2, confreaderror->message);
1455 m_ambpicomm_port[i * 2 + 1] =
1456 json_reader_get_int_value(reader);
1457 json_reader_end_member(reader);
1458 json_reader_end_member(reader);
1461 json_reader_end_element(reader);
1463 json_reader_end_member(reader);
1468 /*--------------------------------------------------------------------------*/
1470 * @brief get value form configuration file(text data)
1472 * @param[in] r JsonReader object
1473 * @param[in] key key
1474 * @param[out] buf data buffer
1475 * @param[in] size size of data buffer
1476 * @return bool false:failure
1478 /*--------------------------------------------------------------------------*/
1479 bool CGtCtrl::GetConfigValText(JsonReader *r, const char *key, char *buf,
1485 memset(buf, 0x00, size);
1486 if (!json_reader_read_member(r, key)) {
1487 printf("Error getting string value.\n");
1491 val = json_reader_get_string_value(r);
1492 json_reader_end_member(r);
1494 (int) val.length() > (size - 1) ? (size - 1) : (int) val.length();
1495 memcpy(buf, val.c_str(), len);
1500 /*--------------------------------------------------------------------------*/
1502 * @brief get value form configuration file(integer data)
1504 * @param[in] r JsonReader object
1505 * @param[in] key key
1506 * @param[out] buf data buffer
1507 * @return bool false:failure
1509 /*--------------------------------------------------------------------------*/
1510 bool CGtCtrl::GetConfigValInt(JsonReader *r, const char *key, int *buf)
1514 if (!json_reader_read_member(r, key)) {
1515 printf("Error getting integer value.\n");
1519 *buf = (int) json_reader_get_int_value(r);
1520 json_reader_end_member(r);
1525 /*--------------------------------------------------------------------------*/
1527 * @brief get value form configuration file(double data)
1529 * @param[in] r JsonReader object
1530 * @param[in] key key
1531 * @param[out] buf data buffer
1532 * @return bool false:failure
1534 /*--------------------------------------------------------------------------*/
1535 bool CGtCtrl::GetConfigValDouble(JsonReader *r, const char *key, double *buf)
1539 if (!json_reader_read_member(r, key)) {
1540 printf("Error getting floating point value.\n");
1544 *buf = (double) json_reader_get_double_value(r);
1545 json_reader_end_member(r);
1550 /*--------------------------------------------------------------------------*/
1552 * @brief get value form configuration file(boolean data)
1554 * @param[in] r JsonReader object
1555 * @param[in] key key
1556 * @param[out] buf data buffer
1557 * @return bool false:failure
1559 /*--------------------------------------------------------------------------*/
1560 bool CGtCtrl::GetConfigValBool(JsonReader *r, const char *key, bool *buf)
1564 if (!json_reader_read_member(r, key)) {
1565 printf("Error getting boolean value.\n");
1569 *buf = (double) json_reader_get_boolean_value(r);
1570 json_reader_end_member(r);
1575 /*--------------------------------------------------------------------------*/
1577 * @brief get value form configuration file
1579 * @param[in] r JsonReader object
1580 * @param[in] key key
1581 * @param[out] buf data buffer
1582 * @param[in] size size of buf
1583 * @return bool false:failure
1585 /*--------------------------------------------------------------------------*/
1586 bool CGtCtrl::GetConfigValue(JsonReader *r, const char *key, char *buf,
1589 return GetConfigValText(r, key, buf, size);
1592 bool CGtCtrl::GetConfigValue(JsonReader *r, const char *key, int *buf,
1595 return GetConfigValInt(r, key, buf);
1598 bool CGtCtrl::GetConfigValue(JsonReader *r, const char *key, double *buf,
1601 return GetConfigValDouble(r, key, buf);
1604 bool CGtCtrl::GetConfigValue(JsonReader *r, const char *key, bool *buf,
1607 return GetConfigValBool(r, key, buf);
1611 void CGtCtrl::CheckSendResult(int mqid)
1617 if (msgrcv(mqid, &ret, sizeof(KeyDataMsg_t), 31, IPC_NOWAIT) == -1) {
1622 list < string >::iterator pos;
1624 find(m_sendMsgInfo.begin(), m_sendMsgInfo.end(),
1625 string(ret.KeyEventType));
1626 if (pos != m_sendMsgInfo.end()) {
1627 printf("send error: AMB cannot receive %s\n",
1635 * End of File. (CGtCtrl.cpp)