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;
126 m_stVehicleInfo.bHeadLight = false; // HEAD LIGHT OFF(false)
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();
165 } while ((++i) < g_JoyStickTypeNum);
171 myConf.LoadConfig(m_strConfPath.c_str());
175 if (!LoadConfigJson(AMB_CONF)) {
176 printf("AMB configfile read error\n");
180 m_sendMsgInfo.clear();
183 for (int i = 0; i < protocols_sz; i++) {
184 sprintf(uri, _D_URI_FORM, _D_HOST_STR, m_ambpicomm_port[i]);
185 if (false == m_ambpicomm_client[i].start(uri, protocolsName[i])) {
186 return false; // connect fail
188 if (false == m_ambpicomm_client[i].threadCondWait()) {
189 std::cerr << "Failed to wait signal (" << i << ")" << std::endl;
193 const char *vi = "LOCATION";
194 double location[] = { myConf.m_fLat, myConf.m_fLng, 0 };
195 SendVehicleInfo(dataport_def, vi, &location[0], 3);
200 bool CGtCtrl::Terminate()
210 #define sENGINE_SPEED "ENGINE_SPEED"
211 #define sBRAKE_SIGNAL "BRAKE_SIGNAL"
212 #define sBRAKE_PRESSURE "BRAKE_PRESSURE"
213 #define sACCPEDAL_OPEN "ACCPEDAL_OPEN"
214 #define sVELOCITY "VELOCITY"
215 #define sDIRECTION "DIRECTION"
216 #define sLOCATION "LOCATION"
217 #define sSHIFT "SHIFT"
218 #define sLIGHTSTATUS "LIGHTSTATUS"
228 * INTERVAL WAIT COUNTER
230 int iwc = D_RUNLOOP_INTERVAL_COUNT;
232 * RPM/Breake/Speed calc class
235 bool bBrakeSigSend = false;
236 bool bBrakeSig = false;
237 int nBrakePressure = -1;
238 int nAccPedalOpen = -1;
240 CAvgCar pmCar(g_RPM_SAMPLE_SPACE_SIZE, g_SPEED_SAMPLE_SPACE_SIZE,
241 g_BREAKE_SAMPLE_SPACE_SIZE);
242 pmCar.chgGear(CAvgGear::E_SHIFT_PARKING);
246 double dir = (double)m_stVehicleInfo.nDirection;
250 int nShiftPosBK = -1;
252 while (g_bStopFlag) {
254 type = myJS->Read(&number, &value);
256 m_sendMsgInfo.clear();
260 if (number == myConf.m_nSteering) {
262 m_stVehicleInfo.nSteeringAngle +=
263 (value * 10 / 65536 - m_stVehicleInfo.nSteeringAngle);
266 const char *vi = "STEERING";
268 SendVehicleInfo(dataport_def,
269 vi, m_stVehicleInfo.nSteeringAngle);
272 else if (number == myConf.m_nAccel) {
274 pmCar.chgThrottle(32767);
277 pmCar.chgThrottle((value - 16384) * -2);
280 else if (number == myConf.m_nBrake) {
282 pmCar.chgBrake(32767);
285 pmCar.chgBrake((value - 16384) * -2);
289 case JS_EVENT_BUTTON:
290 if (myConf.m_sDeviceName == D_DEV_NAME_G25) {
292 * Gear Change SHIFT UP
294 if (number == myConf.m_nShiftU) {
295 //printf("Shift Up[%d]\n",value);
298 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
299 shiftpos = pmCar.getValue();
303 * Gear Change SHIFT DOWN
305 if (number == myConf.m_nShiftD) {
306 //printf("Shift Down[%d]\n",value);
308 pmCar.setShiftDown();
309 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
310 shiftpos = pmCar.getValue();
315 else if (myConf.m_sDeviceName == D_DEV_NAME_G27) {
316 if (number == myConf.m_nShift1) {
317 //printf("Shift 1[%d]\n",value);
319 pmCar.setShiftMT(CAvgGear::E_SHIFT_MT_FIRST);
320 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
321 shiftpos = pmCar.getValue();
324 pmCar.setShiftMT(CAvgGear::E_SHIFT_NEUTRAL);
325 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
326 shiftpos = pmCar.getValue();
330 if (number == myConf.m_nShift2) {
331 //printf("Shift 2[%d]\n",value);
333 pmCar.setShiftMT(CAvgGear::E_SHIFT_MT_SECOND);
334 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
335 shiftpos = pmCar.getValue();
338 pmCar.setShiftMT(CAvgGear::E_SHIFT_NEUTRAL);
339 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
340 shiftpos = pmCar.getValue();
344 if (number == myConf.m_nShift3) {
345 //printf("Shift 3[%d]\n",value);
347 pmCar.setShiftMT(CAvgGear::E_SHIFT_MT_THIRD);
348 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
349 shiftpos = pmCar.getValue();
352 pmCar.setShiftMT(CAvgGear::E_SHIFT_NEUTRAL);
353 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
354 shiftpos = pmCar.getValue();
358 if (number == myConf.m_nShift4) {
359 //printf("Shift 4[%d]\n",value);
361 pmCar.setShiftMT(CAvgGear::E_SHIFT_MT_FOURTH);
362 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
363 shiftpos = pmCar.getValue();
366 pmCar.setShiftMT(CAvgGear::E_SHIFT_NEUTRAL);
367 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
368 shiftpos = pmCar.getValue();
372 if (number == myConf.m_nShift5) {
373 //printf("Shift 5[%d]\n",value);
375 pmCar.setShiftMT(CAvgGear::E_SHIFT_MT_FIFTH);
376 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
377 shiftpos = pmCar.getValue();
380 pmCar.setShiftMT(CAvgGear::E_SHIFT_NEUTRAL);
381 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
382 shiftpos = pmCar.getValue();
386 if (number == myConf.m_nShift6) {
387 //printf("Shift 6[%d]\n",value);
389 pmCar.setShiftMT(CAvgGear::E_SHIFT_MT_SIXTH);
390 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
391 shiftpos = pmCar.getValue();
394 pmCar.setShiftMT(CAvgGear::E_SHIFT_NEUTRAL);
395 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
396 shiftpos = pmCar.getValue();
400 if (number == myConf.m_nShiftR) {
401 //printf("Shift R[%d]\n",value);
403 pmCar.setShiftMT(CAvgGear::E_SHIFT_REVERSE);
404 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
405 shiftpos = pmCar.getValue();
408 pmCar.setShiftMT(CAvgGear::E_SHIFT_NEUTRAL);
409 m_stVehicleInfo.nShiftPos = pmCar.getSelectGear();
410 shiftpos = pmCar.getValue();
415 * TURN SIGNAL(WINKER) & LIGHTSTATUS
417 bool bLIGHTSTATUS = false;
418 if (number == myConf.m_nWinkR) {
421 m_stVehicleInfo.bWinkR = !m_stVehicleInfo.bWinkR;
422 m_stVehicleInfo.bWinkL = false;
423 if (m_stVehicleInfo.bWinkR)
424 m_stVehicleInfo.nWinkerPos = WINKER_RIGHT;
426 m_stVehicleInfo.nWinkerPos = WINKER_OFF;
428 const char *vi = "TURN_SIGNAL";
430 m_stVehicleInfo.nWinkerPos == WINKER_RIGHT ? 1 : 0;
431 SendVehicleInfo(dataport_def, vi, wpos);
436 if (number == myConf.m_nWinkL) {
438 m_stVehicleInfo.bWinkL = !m_stVehicleInfo.bWinkL;
439 m_stVehicleInfo.bWinkR = false;
440 if (m_stVehicleInfo.bWinkL)
441 m_stVehicleInfo.nWinkerPos = WINKER_LEFT;
443 m_stVehicleInfo.nWinkerPos = WINKER_OFF;
445 const char *vi = "TURN_SIGNAL";
447 m_stVehicleInfo.nWinkerPos == WINKER_LEFT ? 2 : 0;
448 SendVehicleInfo(dataport_def, vi, wpos);
453 if (number == myConf.m_nHeadLight) {
455 if (false == m_stVehicleInfo.bHeadLight) { // HEAD LIGHT OFF(false) ?
456 m_stVehicleInfo.bHeadLight = true; // HEAD LIGHT ON(true)
459 m_stVehicleInfo.bHeadLight = false; // HEAD LIGHT OFF(false)
465 if (true == bLIGHTSTATUS) {
466 const size_t LSsz = 8;
468 // 0:LIGHT HEAD STATUS ON(1)/OFF(0)
469 // 1:LEFT WINKER STATUS ON(1)/OFF(0)
470 // 2:RIGHT WINKER STATUS ON(1)/OFF(0)
476 memset(data, 0, sizeof(data));
477 if (true == m_stVehicleInfo.bHeadLight) { // HEAD LIGHT ON ?
480 if (WINKER_LEFT == m_stVehicleInfo.nWinkerPos) {
483 else if (WINKER_RIGHT == m_stVehicleInfo.nWinkerPos) {
486 SendVehicleInfo(dataport_def, sLIGHTSTATUS, &data[0], LSsz);
495 int rpmNEW = (int)pmCar.getRPM();
496 if ((iwc==0)&&(rpmNEW != nRPM)) {
497 SendVehicleInfo(dataport_def, sENGINE_SPEED, rpmNEW);
498 nRPM = rpmNEW; // update value
500 int apoNEW = pmCar.calcAccPedalOpen();
501 if (apoNEW != nAccPedalOpen) {
502 SendVehicleInfo(dataport_def, sACCPEDAL_OPEN, apoNEW);
503 nAccPedalOpen = apoNEW;
508 bool bBrakeNEW = pmCar.isOnBrake();
509 m_stVehicleInfo.bBrake = bBrakeNEW;
510 if ((false == bBrakeSigSend) || (bBrakeNEW != bBrakeSig)) {
511 bBrakeSigSend = true;
512 SendVehicleInfo(dataport_def, sBRAKE_SIGNAL, bBrakeNEW);
513 bBrakeSig = bBrakeNEW; // update value
518 int pressureNEW = pmCar.calcPressure(pmCar.getBrakeAvg());
519 m_stVehicleInfo.nBrakeHydraulicPressure = pressureNEW;
520 if (pressureNEW != nBrakePressure) {
521 SendVehicleInfo(dataport_def, sBRAKE_PRESSURE, pressureNEW);
522 nBrakePressure = pressureNEW;
528 int speedNew = (int)pmCar.getSpeed();
529 if (speedNew != nSpeed) {
530 SendVehicleInfo(dataport_def, sVELOCITY, speedNew);
531 m_stVehicleInfo.nVelocity = speedNew;
537 if (nShiftPosBK != m_stVehicleInfo.nShiftPos) {
538 const size_t ShiftSz = 3;
540 int val = pmCar.getValue();
541 data[0] = pmCar.getSelectGear();
543 data[0] = data[0] - 10 + 4;
548 data[1] = pmCar.getValue();
549 data[2] = pmCar.getMode();
550 SendVehicleInfo(dataport_def, sSHIFT, &data[0], ShiftSz);
551 nShiftPosBK = m_stVehicleInfo.nShiftPos;
556 * DIRECTION (AZIMUTH)
557 * Front wheel steering angle
559 double runMeters = pmCar.getTripmeter();
560 pmCar.tripmeterReset();
561 if (0 != runMeters) {
562 double stear = (double)m_stVehicleInfo.nSteeringAngle;
563 double dirNEW = CalcAzimuth(dir, stear, runMeters);
564 int nDir = (int)dirNEW;
566 if (nDir != m_stVehicleInfo.nDirection) {
567 SendVehicleInfo(dataport_def, sDIRECTION, nDir);
568 m_stVehicleInfo.nDirection = nDir;
574 if ((!m_bUseGps) && (0 != runMeters)) {
575 double tmpLat = m_stVehicleInfo.fLat;
576 double tmpLng = m_stVehicleInfo.fLng;
577 POINT pNEW = CalcDest(tmpLat, tmpLng, dir, runMeters);
578 if ((tmpLat != pNEW.lat) || (tmpLng != pNEW.lng)){
579 double tmpLct[] = { pNEW.lat, pNEW.lng, 0 };
580 SendVehicleInfo(dataport_def, sLOCATION, &tmpLct[0], 3);
581 m_stVehicleInfo.fLat = pNEW.lat;
582 m_stVehicleInfo.fLng = pNEW.lng;
587 iwc = D_RUNLOOP_INTERVAL_COUNT;
607 bool nextPointFlg = true;
608 bool routeDriveFlg = true;
609 std::string tmpstr = "";
617 pthread_mutex_init(&mutex, NULL);
619 while (g_bStopFlag) {
620 type = myJS->Read(&number, &value);
622 pthread_mutex_lock(&mutex);
623 if (msgQueue.size() > 0) {
630 tmpGeo.lat = GEORESET;
631 tmpGeo.lng = GEORESET;
633 for (i = 0; i < (int) msgQueue.size(); i++) {
634 if (msgQueue[i] == ',') {
635 tmpGeo.lat = atof(buf);
638 else if (msgQueue[i] == '\n') {
639 tmpGeo.lng = atof(buf);
642 routeList.push(tmpGeo);
644 tmpGeo.lat = GEORESET;
645 tmpGeo.lng = GEORESET;
648 buf[pos++] = msgQueue[i];
651 for (int idx = 0; msgQueue[lastidx] != '\0'; idx++, lastidx++) {
652 tmpstr[idx] = msgQueue[lastidx];
657 pthread_mutex_unlock(&mutex);
661 if (number == myConf.m_nSteering) {
663 m_stVehicleInfo.nSteeringAngle +=
664 (value * 10 / 65536 - m_stVehicleInfo.nSteeringAngle);
668 if (number == myConf.m_nAccel) {
670 m_stVehicleInfo.bBrake = false;
671 m_stVehicleInfo.nBrakeHydraulicPressure = 0;
674 else if (0 < value) {
675 m_stVehicleInfo.bBrake = true;
676 m_stVehicleInfo.nBrakeHydraulicPressure =
677 (value * 100) / MAX_SPEED;
680 m_stVehicleInfo.bBrake = false;
681 m_stVehicleInfo.nBrakeHydraulicPressure = 0;
683 m_stVehicleInfo.nAccel = value;
685 const char *vi1 = "BRAKE_SIGNAL";
686 const char *vi2 = "BRAKE_PRESSURE";
687 SendVehicleInfo(dataport_def, vi1, m_stVehicleInfo.bBrake);
689 SendVehicleInfo(dataport_def,
690 vi2, m_stVehicleInfo.nBrakeHydraulicPressure);
693 case JS_EVENT_BUTTON:
694 if (number == myConf.m_nShiftU) {
697 if (m_stVehicleInfo.nShiftPos > PARKING) {
698 switch (m_stVehicleInfo.nShiftPos) {
700 m_stVehicleInfo.nShiftPos = SECOND;
704 m_stVehicleInfo.nShiftPos = THIRD;
708 m_stVehicleInfo.nShiftPos = DRIVE;
712 m_stVehicleInfo.nShiftPos = NEUTRAL;
716 m_stVehicleInfo.nShiftPos = REVERSE;
720 m_stVehicleInfo.nShiftPos = PARKING;
726 char data[] = { shiftpos, shiftpos, 0 };
727 const char *vi = "SHIFT";
728 SendVehicleInfo(dataport_def, vi, &data[0]);
733 if (number == myConf.m_nShiftD) {
736 if (m_stVehicleInfo.nShiftPos < SPORTS) {
737 switch (m_stVehicleInfo.nShiftPos) {
739 m_stVehicleInfo.nShiftPos = PARKING;
743 m_stVehicleInfo.nShiftPos = REVERSE;
747 m_stVehicleInfo.nShiftPos = NEUTRAL;
751 m_stVehicleInfo.nShiftPos = DRIVE;
755 m_stVehicleInfo.nShiftPos = THIRD;
759 m_stVehicleInfo.nShiftPos = SECOND;
763 m_stVehicleInfo.nShiftPos = FIRST;
769 char data[] = { shiftpos, shiftpos, 0 };
770 const char *vi = "SHIFT";
771 SendVehicleInfo(dataport_def, vi, &data[0], 3);
775 if (number == myConf.m_nWinkR) {
777 m_stVehicleInfo.bWinkR = !m_stVehicleInfo.bWinkR;
778 if (m_stVehicleInfo.bWinkR)
779 m_stVehicleInfo.nWinkerPos = WINKER_RIGHT;
781 m_stVehicleInfo.nWinkerPos = WINKER_OFF;
783 const char *vi = "TURN_SIGNAL";
785 m_stVehicleInfo.nWinkerPos == WINKER_RIGHT ? 1 : 0;
786 SendVehicleInfo(dataport_def, vi, wpos);
790 if (number == myConf.m_nWinkL) {
792 m_stVehicleInfo.bWinkL = !m_stVehicleInfo.bWinkL;
793 if (m_stVehicleInfo.bWinkL)
794 m_stVehicleInfo.nWinkerPos = WINKER_LEFT;
796 m_stVehicleInfo.nWinkerPos = WINKER_OFF;
798 const char *vi = "TURN_SIGNAL";
800 m_stVehicleInfo.nWinkerPos == WINKER_LEFT ? 2 : 0;
801 SendVehicleInfo(dataport_def, vi, wpos);
808 if (m_stVehicleInfo.nAccel < 0) {
809 m_stVehicleInfo.dVelocity +=
810 ((abs(m_stVehicleInfo.nAccel) / 10000.0) -
811 (m_stVehicleInfo.dVelocity / 100.0));
813 else if (0 < m_stVehicleInfo.nAccel) {
814 m_stVehicleInfo.dVelocity -=
815 ((abs(m_stVehicleInfo.nAccel) / 10000.0) +
816 (m_stVehicleInfo.dVelocity / 100.0));
819 m_stVehicleInfo.dVelocity -= (m_stVehicleInfo.dVelocity / 1000);
822 if (m_stVehicleInfo.dVelocity > MAX_SPEED)
823 m_stVehicleInfo.dVelocity = MAX_SPEED;
824 if (m_stVehicleInfo.dVelocity < 0)
825 m_stVehicleInfo.dVelocity = 0.0;
827 if (m_stVehicleInfo.nVelocity != (int) m_stVehicleInfo.dVelocity) {
828 m_stVehicleInfo.nVelocity = (int) m_stVehicleInfo.dVelocity;
829 const char *vi = "VELOCITY";
830 SendVehicleInfo(dataport_def, vi, m_stVehicleInfo.nVelocity);
834 if (routeList.empty()) {
836 printf("FreeDriving\n");
838 routeDriveFlg = false;
840 m_stVehicleInfo.nDirection += m_stVehicleInfo.nSteeringAngle;
842 while (m_stVehicleInfo.nDirection > 359)
843 m_stVehicleInfo.nDirection -= 360;
844 while (m_stVehicleInfo.nDirection < 0)
845 m_stVehicleInfo.nDirection += 360;
848 const char *vi = "DIRECTION";
849 SendVehicleInfo(dataport_def, vi, m_stVehicleInfo.nDirection);
855 if (m_stVehicleInfo.nDirection != 0)
857 (double) m_stVehicleInfo.nDirection / 180.0 *
860 double dx = (double) m_stVehicleInfo.nVelocity * sin(rad);
861 double dy = (double) m_stVehicleInfo.nVelocity * cos(rad);
863 m_stVehicleInfo.fLat += dx * 0.000003;
864 m_stVehicleInfo.fLng += dy * 0.000003;
866 const char *vi = "LOCATION";
868 { m_stVehicleInfo.fLat, m_stVehicleInfo.fLng, 0 };
872 if (!routeDriveFlg) {
873 printf("route Driving\n");
874 m_stVehicleInfo.fLat = routeList.front().lat;
875 m_stVehicleInfo.fLng = routeList.front().lng;
878 routeDriveFlg = true;
879 next = routeList.front();
880 dy = next.lat - m_stVehicleInfo.fLat;
881 dx = next.lng - m_stVehicleInfo.fLng;
882 theta = (double) atan2(dy, dx) * 180.0 / (atan(1.0) * 4.0);
884 theta = 360.0 + theta;
887 rad = (theta / 180.0) * PIE;
889 m_stVehicleInfo.nDirection = 90 - theta;
890 if (m_stVehicleInfo.nDirection < 0) {
891 m_stVehicleInfo.nDirection = 360 + m_stVehicleInfo.nDirection;
895 const char *vi = "DIRECTION";
896 SendVehicleInfo(dataport_def, vi, m_stVehicleInfo.nDirection);
898 m_stVehicleInfo.fLat +=
899 (m_stVehicleInfo.nVelocity * sin(rad) / (72 * 1000)) /
900 (cos((m_stVehicleInfo.fLat / 180) * PIE) * 111.111);
901 m_stVehicleInfo.fLng +=
902 (m_stVehicleInfo.nVelocity * cos(rad) / (72 * 1000)) * (1 /
906 const char *vi = "LOCATION";
908 { m_stVehicleInfo.fLat, m_stVehicleInfo.fLng, 0 };
912 if (m_stVehicleInfo.fLng >= next.lng) {
916 else if (rad > 0 && rad < 0.5 * PIE) {
917 if (m_stVehicleInfo.fLng >= next.lng
918 && m_stVehicleInfo.fLat >= next.lat) {
922 else if (rad == 0.5 * PIE) {
923 if (m_stVehicleInfo.fLat >= next.lat) {
927 else if (rad > 0.5 * PIE && rad < PIE) {
928 if (m_stVehicleInfo.fLng <= next.lng
929 && m_stVehicleInfo.fLat >= next.lat) {
933 else if (rad == PIE) {
934 if (m_stVehicleInfo.fLng <= next.lng) {
938 else if (rad > PIE && rad < 1.5 * PIE) {
939 if (m_stVehicleInfo.fLng <= next.lng
940 && m_stVehicleInfo.fLat <= next.lat) {
944 else if (rad == 1.5 * PIE) {
945 if (m_stVehicleInfo.fLat <= next.lat) {
950 if (m_stVehicleInfo.fLng >= next.lng
951 && m_stVehicleInfo.fLat <= next.lat) {
957 if (!routeList.empty()) {
958 next = routeList.front();
960 nextPointFlg = false;
966 pthread_join(thread[0], NULL);
967 pthread_join(thread[1], NULL);
968 while (!routeList.empty()) {
971 pthread_mutex_destroy(&mutex);
977 struct KeyDataMsg_t ret;
978 int *recvid = (int *) s;
980 while (g_bStopFlag) {
981 if (msgrcv(*recvid, &ret, sizeof(struct KeyDataMsg_t), 31, MSG_EXCEPT)
983 return (void *) NULL;
990 /*--------------------------------------------------------------------------*/
992 * @brief function of vehicle information access
994 * @param[in] SigNo signal number
997 /*--------------------------------------------------------------------------*/
998 void DaemonTerminate(int SigNo)
1002 (SigNo != SIGHUP) && (SigNo != SIGINT) && (SigNo != SIGTERM)) {
1003 (void) signal(SigNo, DaemonTerminate);
1010 /*--------------------------------------------------------------------------*/
1012 * @brief function of vehicle information set to AMB
1014 * @param[in] sendque_id que id for sending
1015 * @param[in] recvque_id que id for receiving
1016 * @param[in] mtype priority
1017 * @param[in] key name of vehicle information
1018 * @param[in] comstat common_status
1019 * @param[in] data value of vehicle information
1020 * @param[in] len length of vehicle information
1021 * @param[out] ret struct from AMB
1022 * @return bool true:success,false:fail
1024 /*--------------------------------------------------------------------------*/
1025 bool CGtCtrl::SendVehicleInfo( /*int & send_id, long mtype, */
1026 ProtocolType type, const char *key, bool data)
1028 return sendVehicleInfo( /*send_id, mtype, */ type, key, (void *) &data,
1032 bool CGtCtrl::SendVehicleInfo( /*int & send_id, long mtype, */
1033 ProtocolType type, const char *key, int data)
1035 return sendVehicleInfo( /*send_id, mtype, */ type, key, (void *) &data,
1039 bool CGtCtrl::SendVehicleInfo( /*int & send_id, long mtype, */
1040 ProtocolType type, const char *key, int data[],
1043 return sendVehicleInfo( /*send_id, mtype, */ type, key, (void *) data,
1047 bool CGtCtrl::SendVehicleInfo(/*int & send_id, long mtype */
1048 ProtocolType type, const char *key,
1049 double data[], int len)
1051 return sendVehicleInfo( /*send_id, mtype, */ type, key, (void *) data,
1052 sizeof(double), len);
1055 bool CGtCtrl::SendVehicleInfo( /*int & send_id, long mtype, */
1056 ProtocolType type, const char *key, char data[],
1059 return sendVehicleInfo( /*send_id, mtype, */ type, key, (void *) data,
1063 /*--------------------------------------------------------------------------*/
1065 * @brief vehicle information struct for AMB
1067 * @param[in] buf buffer for vehicle information struct
1068 * @param[in] bufsize size of buffer
1069 * @param[in] mtype priority
1070 * @param[in] key name of vehicle information
1071 * @param[in] tm time
1072 * @param[in] nstat common_status
1073 * @param[in] status value of vehicle information
1076 /*--------------------------------------------------------------------------*/
1077 void CGtCtrl::SetMQKeyData(char *buf, unsigned int bufsize, long &mtype,
1078 const char *key, char status[], unsigned int size)
1080 KeyDataMsg_t *tmp_t = (KeyDataMsg_t *) buf;
1082 memset(buf, 0x00, bufsize);
1083 strcpy(tmp_t->KeyEventType, key);
1084 gettimeofday(&tmp_t->recordtime, NULL);
1085 tmp_t->data.common_status = 0;
1086 memcpy(&tmp_t->data.status[0], &status[0], size);
1089 /*--------------------------------------------------------------------------*/
1091 * @brief set vehicle information for AMB
1093 * @param[in] sendque_id queue ID
1094 * @param[in] priority priority of queue
1095 * @param[in] key KeyEventType
1096 * @param[in] data value of vehicle info
1097 * @param[in] unit_size size of send data unit
1098 * @param[in] unit_cnt number of send data unit
1099 * @return bool true:success,false:failure
1101 /*--------------------------------------------------------------------------*/
1102 bool CGtCtrl::sendVehicleInfo( /*int & send_id, long priority, */
1103 ProtocolType type, const char *key, void *data,
1104 unsigned int unit_size, int unit_cnt)
1108 if (unit_size == 0 || unit_cnt <= 0 || data == NULL)
1111 char adata[unit_size * unit_cnt];
1112 char mqMsg[sizeof(KeyDataMsg_t) + sizeof(adata)];
1114 for (int i = 0; i < unit_cnt; i++) {
1115 int pos = i * unit_size;
1116 memcpy(&adata[pos], (char *) data + pos, unit_size);
1119 SetMQKeyData(&mqMsg[0], sizeof(mqMsg), priority, key, adata,
1122 if (!m_ambpicomm_client[type].
1123 send(reinterpret_cast < char *>(mqMsg), sizeof(mqMsg)))
1125 std::cerr << "Failed to send data(" << errno << ")." << std::endl;
1129 m_sendMsgInfo.push_back(string(key));
1135 /*--------------------------------------------------------------------------*/
1137 * @brief JOSN parser
1139 * @param[in] fname file name of configuration file(full path)
1140 * @return bool false:failure
1142 /*--------------------------------------------------------------------------*/
1143 bool CGtCtrl::LoadConfigJson(const char *fname)
1145 char confpath[1024];
1146 JsonParser *parser = NULL;
1147 JsonNode *node = NULL;
1148 JsonReader *reader = NULL;
1150 if (!LoadConfigAMBJson(fname, &confpath[0], sizeof(confpath))) {
1155 printf("conf=%s\nvehicleinfo conf=%s\n", fname, confpath);
1157 parser = json_parser_new();
1158 GError *error = NULL;
1160 json_parser_load_from_file(parser, confpath, &error);
1162 printf("Failed to load config: %s\n", error->message);
1163 DelJsonObj(parser, reader);
1167 node = json_parser_get_root(parser);
1169 printf("Unable to get JSON root object.\n");
1170 DelJsonObj(parser, reader);
1174 reader = json_reader_new(node);
1175 if (reader == NULL) {
1176 printf("Unable to create JSON reader\n");
1177 DelJsonObj(parser, reader);
1181 if (!LoadConfigJsonCarSim(reader)) {
1182 DelJsonObj(parser, reader);
1186 json_reader_set_root(reader, node);
1187 if (!LoadConfigJsonCommon(reader)) {
1188 DelJsonObj(parser, reader);
1195 /*--------------------------------------------------------------------------*/
1197 * @brief release JSON parser object
1199 * @param[in] parser parser object
1200 * @param[in] node node object
1201 * @param[in] reader reader object
1204 /*--------------------------------------------------------------------------*/
1205 void CGtCtrl::DelJsonObj(JsonParser *parser, JsonReader *reader)
1208 g_object_unref(reader);
1210 g_object_unref(parser);
1213 /*--------------------------------------------------------------------------*/
1215 * @brief get JSON file path form configuration
1217 * @param[in] fname full path of configuration file
1218 * @param[out] jsonfname buffer of JSON file name
1219 * @param[in] size size of second argument buffer size
1220 * @return bool false:failure
1222 /*--------------------------------------------------------------------------*/
1223 bool CGtCtrl::LoadConfigAMBJson(const char *fname, char *jsonfname, int size)
1225 JsonParser *ps = NULL;
1226 JsonNode *nd = NULL;
1227 JsonReader *rd = NULL;
1229 memset(jsonfname, 0x00, size);
1232 ps = json_parser_new();
1233 GError *error = NULL;
1235 json_parser_load_from_file(ps, fname, &error);
1237 printf("Failed to load AMBconfig: %s\n", error->message);
1242 nd = json_parser_get_root(ps);
1244 printf("Unable to get AMB-JSON root object.\n");
1249 rd = json_reader_new(nd);
1251 printf("Unable to create AMB-JSON reader\n");
1256 json_reader_read_member(rd, "sources");
1257 error = (GError *) json_reader_get_error(rd);
1258 if (error != NULL) {
1259 printf("Error getting AMB sources member. %s\n", error->message);
1263 g_assert(json_reader_is_array(rd));
1264 for (int i = 0; i < json_reader_count_elements(rd); i++) {
1265 json_reader_read_element(rd, i);
1266 json_reader_read_member(rd, "name");
1267 std::string section = json_reader_get_string_value(rd);
1268 json_reader_end_member(rd);
1269 if ("VehicleSource" == section) {
1271 if (GetConfigValue(rd, "configfile", &val[0], size)) {
1272 strcpy(jsonfname, val);
1276 json_reader_end_element(rd);
1278 json_reader_end_member(rd);
1283 /*--------------------------------------------------------------------------*/
1285 * @brief get JSON value(CarSim)
1287 * @param[in] reader JSON reader object
1288 * @return bool false:failure
1290 /*--------------------------------------------------------------------------*/
1291 bool CGtCtrl::LoadConfigJsonCarSim(JsonReader *reader)
1293 json_reader_read_member(reader, "Config");
1294 const GError *confreaderror = json_reader_get_error(reader);
1295 if (confreaderror != NULL) {
1296 printf("Error getting sources member. %s\n", confreaderror->message);
1299 g_assert(json_reader_is_array(reader));
1301 int elementnum = json_reader_count_elements(reader);
1302 for (int i = 0; i < elementnum; i++) {
1303 json_reader_read_element(reader, i);
1304 json_reader_read_member(reader, "Section");
1305 std::string section = json_reader_get_string_value(reader);
1306 json_reader_end_member(reader);
1308 if ("CarSim" == section) {
1309 const char *key1 = "DefaultInfoMQKey";
1310 const char *key2 = "CustomizeInfoMQKey";
1311 const char *key3 = "VehicleInfoList";
1314 if (!json_reader_read_member(reader, key3)) {
1315 confreaderror = json_reader_get_error(reader);
1316 printf("Error getting %s. %s\n", key3,
1317 confreaderror->message);
1321 confreaderror = json_reader_get_error(reader);
1322 if (confreaderror != NULL) {
1323 confreaderror = json_reader_get_error(reader);
1324 printf("Error getting %s member. %s\n", key3,
1325 confreaderror->message);
1328 g_assert(json_reader_is_array(reader));
1329 m_viList.length = json_reader_count_elements(reader);
1330 for (int j = 0; j < m_viList.length; j++) {
1331 json_reader_read_element(reader, j);
1332 std::string str = json_reader_get_string_value(reader);
1333 strcpy(m_viList.name[j], str.c_str());
1334 json_reader_end_element(reader);
1336 json_reader_end_member(reader);
1339 json_reader_end_element(reader);
1341 json_reader_end_member(reader);
1346 /*--------------------------------------------------------------------------*/
1348 * @brief get JSON value(Common)
1350 * @param[in] reader JSON reader object
1351 * @return bool false:failure
1353 /*--------------------------------------------------------------------------*/
1354 bool CGtCtrl::LoadConfigJsonCommon(JsonReader *reader)
1356 json_reader_read_member(reader, "Config");
1357 const GError *confreaderror = json_reader_get_error(reader);
1358 if (confreaderror != NULL) {
1359 printf("Error getting sources member. %s\n", confreaderror->message);
1362 g_assert(json_reader_is_array(reader));
1364 int elementnum = json_reader_count_elements(reader);
1366 for (i = 0; i < elementnum; i++) {
1367 json_reader_read_element(reader, i);
1368 if (!json_reader_read_member(reader, "Section")) {
1369 confreaderror = json_reader_get_error(reader);
1370 printf("Error getting Section. %s\n", confreaderror->message);
1373 std::string section = json_reader_get_string_value(reader);
1374 json_reader_end_member(reader);
1376 if ("Common" == section) {
1377 const char *key1 = "VehicleInfoDefine";
1379 if (!json_reader_read_member(reader, key1)) {
1380 confreaderror = json_reader_get_error(reader);
1381 printf("Error getting %s. %s\n", key1,
1382 confreaderror->message);
1386 confreaderror = json_reader_get_error(reader);
1387 if (confreaderror != NULL) {
1388 confreaderror = json_reader_get_error(reader);
1389 printf("Error getting %s member. %s\n", key1,
1390 confreaderror->message);
1393 g_assert(json_reader_is_array(reader));
1395 for (int j = 0; j < json_reader_count_elements(reader); j++) {
1396 json_reader_read_element(reader, j);
1397 if (!json_reader_read_member(reader, "KeyEventType")) {
1398 confreaderror = json_reader_get_error(reader);
1399 printf("Error getting %s. %s\n", key1,
1400 confreaderror->message);
1404 std::string str = json_reader_get_string_value(reader);
1405 json_reader_end_member(reader);
1406 if (m_viList.isContainVehicleName(str.c_str())) {
1408 if (GetConfigValue(reader, "Priority", &priority, 0)) {
1409 m_viList.setPriority(str.c_str(), priority);
1413 json_reader_end_element(reader);
1415 json_reader_end_member(reader);
1416 const char key2[][32] = {
1420 const char *subkey1 = "DataPort";
1421 const char *subkey2 = "CtrlPort";
1423 for (int i = 0; i < 2; i++) {
1424 if (!json_reader_read_member(reader, key2[i])) {
1425 confreaderror = json_reader_get_error(reader);
1426 printf("Error getting %s. %s\n", key2[i],
1427 confreaderror->message);
1430 confreaderror = json_reader_get_error(reader);
1431 if (confreaderror != NULL) {
1432 confreaderror = json_reader_get_error(reader);
1433 printf("Error getting %s member. %s\n", key2[i],
1434 confreaderror->message);
1438 if (!json_reader_read_member(reader, subkey1)) {
1439 confreaderror = json_reader_get_error(reader);
1440 printf("Error getting %s->%s. %s\n", key2[i],
1441 subkey1, confreaderror->message);
1444 confreaderror = json_reader_get_error(reader);
1445 if (confreaderror != NULL) {
1446 confreaderror = json_reader_get_error(reader);
1447 printf("Error getting %s->%s member. %s\n", key2[i],
1448 subkey1, confreaderror->message);
1451 m_ambpicomm_port[i * 2] = json_reader_get_int_value(reader);
1452 json_reader_end_member(reader);
1454 if (!json_reader_read_member(reader, subkey2)) {
1455 confreaderror = json_reader_get_error(reader);
1456 printf("Error getting %s->%s. %s\n", key2[i],
1457 subkey2, confreaderror->message);
1460 confreaderror = json_reader_get_error(reader);
1461 if (confreaderror != NULL) {
1462 confreaderror = json_reader_get_error(reader);
1463 printf("Error getting %s->%s member. %s\n", key2[i],
1464 subkey2, confreaderror->message);
1467 m_ambpicomm_port[i * 2 + 1] =
1468 json_reader_get_int_value(reader);
1469 json_reader_end_member(reader);
1470 json_reader_end_member(reader);
1473 json_reader_end_element(reader);
1475 json_reader_end_member(reader);
1480 /*--------------------------------------------------------------------------*/
1482 * @brief get value form configuration file(text data)
1484 * @param[in] r JsonReader object
1485 * @param[in] key key
1486 * @param[out] buf data buffer
1487 * @param[in] size size of data buffer
1488 * @return bool false:failure
1490 /*--------------------------------------------------------------------------*/
1491 bool CGtCtrl::GetConfigValText(JsonReader *r, const char *key, char *buf,
1497 memset(buf, 0x00, size);
1498 if (!json_reader_read_member(r, key)) {
1499 printf("Error getting string value.\n");
1503 val = json_reader_get_string_value(r);
1504 json_reader_end_member(r);
1506 (int) val.length() > (size - 1) ? (size - 1) : (int) val.length();
1507 memcpy(buf, val.c_str(), len);
1512 /*--------------------------------------------------------------------------*/
1514 * @brief get value form configuration file(integer data)
1516 * @param[in] r JsonReader object
1517 * @param[in] key key
1518 * @param[out] buf data buffer
1519 * @return bool false:failure
1521 /*--------------------------------------------------------------------------*/
1522 bool CGtCtrl::GetConfigValInt(JsonReader *r, const char *key, int *buf)
1526 if (!json_reader_read_member(r, key)) {
1527 printf("Error getting integer value.\n");
1531 *buf = (int) json_reader_get_int_value(r);
1532 json_reader_end_member(r);
1537 /*--------------------------------------------------------------------------*/
1539 * @brief get value form configuration file(double data)
1541 * @param[in] r JsonReader object
1542 * @param[in] key key
1543 * @param[out] buf data buffer
1544 * @return bool false:failure
1546 /*--------------------------------------------------------------------------*/
1547 bool CGtCtrl::GetConfigValDouble(JsonReader *r, const char *key, double *buf)
1551 if (!json_reader_read_member(r, key)) {
1552 printf("Error getting floating point value.\n");
1556 *buf = (double) json_reader_get_double_value(r);
1557 json_reader_end_member(r);
1562 /*--------------------------------------------------------------------------*/
1564 * @brief get value form configuration file(boolean data)
1566 * @param[in] r JsonReader object
1567 * @param[in] key key
1568 * @param[out] buf data buffer
1569 * @return bool false:failure
1571 /*--------------------------------------------------------------------------*/
1572 bool CGtCtrl::GetConfigValBool(JsonReader *r, const char *key, bool *buf)
1576 if (!json_reader_read_member(r, key)) {
1577 printf("Error getting boolean value.\n");
1581 *buf = (double) json_reader_get_boolean_value(r);
1582 json_reader_end_member(r);
1587 /*--------------------------------------------------------------------------*/
1589 * @brief get value form configuration file
1591 * @param[in] r JsonReader object
1592 * @param[in] key key
1593 * @param[out] buf data buffer
1594 * @param[in] size size of buf
1595 * @return bool false:failure
1597 /*--------------------------------------------------------------------------*/
1598 bool CGtCtrl::GetConfigValue(JsonReader *r, const char *key, char *buf,
1601 return GetConfigValText(r, key, buf, size);
1604 bool CGtCtrl::GetConfigValue(JsonReader *r, const char *key, int *buf,
1607 return GetConfigValInt(r, key, buf);
1610 bool CGtCtrl::GetConfigValue(JsonReader *r, const char *key, double *buf,
1613 return GetConfigValDouble(r, key, buf);
1616 bool CGtCtrl::GetConfigValue(JsonReader *r, const char *key, bool *buf,
1619 return GetConfigValBool(r, key, buf);
1623 void CGtCtrl::CheckSendResult(int mqid)
1629 if (msgrcv(mqid, &ret, sizeof(KeyDataMsg_t), 31, IPC_NOWAIT) == -1) {
1634 list < string >::iterator pos;
1636 find(m_sendMsgInfo.begin(), m_sendMsgInfo.end(),
1637 string(ret.KeyEventType));
1638 if (pos != m_sendMsgInfo.end()) {
1639 printf("send error: AMB cannot receive %s\n",
1647 * End of File. (CGtCtrl.cpp)