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
12 * RPM / Speed / Brake Value is determined by the average
14 * @date Apr-08-2013 create
22 /******************************************
24 ******************************************/
27 * @brief averageMachine
29 * @param sz average sample space size
31 averageMachine::averageMachine(const short sz)
36 memset(m_x, 0, sizeof(double) * sz);
44 * @brief ~averageMachine
47 averageMachine::~averageMachine()
54 * @param x sample value
56 void averageMachine::setSample(double x)
58 short next = m_posi + 1;
62 m_x[m_posi] = x; // store sample value
66 m_posi = next; // next position
67 m_avg = m_t / m_n; // get average
73 void averageMachine::reCalc()
76 for (int i = 0; i < m_sz; i++) {
82 /******************************************
83 * average Machine Integer
84 ******************************************/
87 * @brief iAverageMachine
90 iAverageMachine::iAverageMachine(const short sz)
95 memset(m_x, 0, sizeof(int) * sz);
104 * @brief ~iAverageMachine
107 iAverageMachine::~iAverageMachine()
114 * @param x sample value
116 void iAverageMachine::setSample(int x)
118 short next = m_posi + 1;
122 m_x[m_posi] = x; // store sample value
126 m_posi = next; // next position
127 m_avg = (double) m_t / (double) m_n; // get average
134 void iAverageMachine::reCalc()
137 for (int i = 0; i < m_sz; i++) {
140 m_avg = (double) m_t / (double) m_n; // get average
144 /******************************************
146 ******************************************/
152 CAvgEngine::CAvgEngine(const short sz)
153 :m_avgRPM(sz? sz: D_SAMPLE_SPACE_RPM)
162 CAvgEngine::~CAvgEngine()
169 void CAvgEngine::ignitionStart(int rpm)
173 m_rpm = (double) rpm;
179 * Gets the RPM from the throttle
180 * @param throttle 0 - 65535
182 void CAvgEngine::chgThrottle(int throttle)
184 double rpm = (((double) throttle) / 65534.0l) * 100.0l;
185 if (false == isActive()) {
188 m_avgRPM.setSample(rpm);
189 m_rpm = m_avgRPM.getAvg();
190 if (D_RPM_BOTTOM_BORDER > m_rpm) {
191 m_rpm = D_IDLING_RPM + ((double) rand() / RAND_MAX);
195 /******************************************
197 ******************************************/
201 * @param sz sample space size
203 CAvgBrake::CAvgBrake(const short sz)
204 :m_brk(sz? sz: D_SAMPLE_SPACE_BRAKE)
214 CAvgBrake::~CAvgBrake()
220 * Gets the Brake Infomation from the brake value
221 * @param brake 0 - 65535
223 void CAvgBrake::chgBrake(int brake)
225 m_brk.setSample(brake);
226 m_brakeVal = m_brk.getIAvg();
233 void CAvgBrake::judgeBrake()
236 if (D_LAG_BRAKE < m_brakeVal) {
243 * @param sourceSpeed speed
244 * @return Calculate the load on the brake
246 #define D_SOFT_SPEED_STOP 15.0l
247 #define D_MIDDLE_SPEED_STOP 22.0l
248 #define D_HARD_SPEED_STOP 30.0l
252 #define D_S_SPEED_S 0.4
253 #define D_S_SPEED_M 0.6
254 #define D_S_SPEED_H 0.8
258 #define D_M_SPEED_S 0.3
259 #define D_M_SPEED_M 0.5
260 #define D_M_SPEED_H 0.7
263 #define D_H_SPEED_S 0.1
264 #define D_H_SPEED_M 0.3
265 #define D_H_SPEED_H 0.5
267 double CAvgBrake::getSpeed(double sourceSpeed)
269 if (false == m_brake) {
273 if (D_SOFT_BRAKE_MAX > m_brakeVal) {
274 if (D_SOFT_SPEED_STOP > sourceSpeed) {
278 else if (D_MIDDLE_BRAKE_MAX > m_brakeVal) {
279 if (D_MIDDLE_SPEED_STOP > sourceSpeed) {
284 if (D_HARD_SPEED_STOP > sourceSpeed) {
290 if (D_S_SPEED > sourceSpeed) {
291 if (D_SOFT_BRAKE_MAX > m_brakeVal) {
292 brakeX = D_S_SPEED_S;
294 else if (D_MIDDLE_BRAKE_MAX > m_brakeVal) {
295 brakeX = D_S_SPEED_M;
298 brakeX = D_S_SPEED_H;
301 else if (D_M_SPEED > sourceSpeed) {
302 if (D_SOFT_BRAKE_MAX > m_brakeVal) {
303 brakeX = D_M_SPEED_S;
305 else if (D_MIDDLE_BRAKE_MAX > m_brakeVal) {
306 brakeX = D_M_SPEED_M;
309 brakeX = D_M_SPEED_H;
313 if (D_SOFT_BRAKE_MAX > m_brakeVal) {
314 brakeX = D_H_SPEED_S;
316 else if (D_MIDDLE_BRAKE_MAX > m_brakeVal) {
317 brakeX = D_H_SPEED_M;
320 brakeX = D_H_SPEED_H;
323 return (sourceSpeed - (sourceSpeed * brakeX));
326 /******************************************
328 ******************************************/
335 m_transmission = E_SHIFT_PARKING;
336 m_transmissionValue = D_SHIFT_VALUE_PARKING;
343 CAvgGear::~CAvgGear()
349 * @brief getGearRatio
351 * @param bDown true:speed down
354 const double gr1 = 1.0 / 4.1;
355 const double gr2 = 1.0 / 2.8;
356 const double gr3 = 1.0 / 1.8;
357 const double grD1 = 1.0 / 2.3;
358 const double grD2 = 1.0 / 1.4;
359 const double grD3 = 1.0 / 1.0;
360 const double grD4 = 1.0 / 0.8;
361 const double grD5 = 1.0 / 0.46;
362 const double grR = 1.0 / 3.1;
364 const double atd1 = 9.0l;
365 const double atd2 = 15.0l;
366 const double atd3 = 23.0l;
367 const double atd4 = 32.0l;
368 const double atd5 = 42.0l;
370 double CAvgGear::getGearRatio(double speed, bool bDown) const
373 switch (m_transmission) {
383 // Speed by changing the gear ratio
387 else if (atd2 > speed) {
393 else if (atd3 > speed) {
399 else if (atd4 > speed) {
412 case E_SHIFT_REVERSE:
415 case E_SHIFT_PARKING:
416 case E_SHIFT_NEUTRAL:
429 void CAvgGear::setShiftDown()
431 switch (m_transmission) {
432 case E_SHIFT_PARKING:
433 m_transmission = E_SHIFT_REVERSE; // PARKING -> REVERSE
434 m_transmissionValue = D_SHIFT_VALUE_REVERSE;
436 case E_SHIFT_REVERSE:
437 m_transmission = E_SHIFT_NEUTRAL; // REVERSE -> NEUTRAL
438 m_transmissionValue = D_SHIFT_VALUE_NEUTRAL;
440 case E_SHIFT_NEUTRAL:
441 m_transmission = E_SHIFT_DRIVE; // NEUTRAL -> DRIVE
442 m_transmissionValue = D_SHIFT_VALUE_DRIVE;
445 m_transmission = E_SHIFT_THIRD; // DRIVE -> THIRD
446 m_transmissionValue = D_SHIFT_VALUE_THIRD;
449 m_transmission = E_SHIFT_SECOND; // THIRD -> SECOND
450 m_transmissionValue = D_SHIFT_VALUE_SECOND;
453 m_transmission = E_SHIFT_FIRST; // SECOND -> FIRST
454 m_transmissionValue = D_SHIFT_VALUE_FIRST;
457 m_transmission = E_SHIFT_FIRST; // NO CHANGE
458 m_transmissionValue = D_SHIFT_VALUE_FIRST;
466 void CAvgGear::setShiftUp()
468 switch (m_transmission) {
470 m_transmission = E_SHIFT_SECOND; // FIRST -> SECOND
471 m_transmissionValue = D_SHIFT_VALUE_SECOND;
474 m_transmission = E_SHIFT_THIRD; // SECOND -> THIRD
475 m_transmissionValue = D_SHIFT_VALUE_THIRD;
478 m_transmission = E_SHIFT_DRIVE; // THIRD -> DRIVE
479 m_transmissionValue = D_SHIFT_VALUE_DRIVE;
482 m_transmission = E_SHIFT_NEUTRAL; // DRIVE -> NEUTRAL
483 m_transmissionValue = D_SHIFT_VALUE_NEUTRAL;
485 case E_SHIFT_NEUTRAL:
486 m_transmission = E_SHIFT_REVERSE; // NEUTRAL -> REVERSE
487 m_transmissionValue = D_SHIFT_VALUE_REVERSE;
489 case E_SHIFT_REVERSE:
490 m_transmission = E_SHIFT_PARKING; // REVERSE -> PARKING
491 m_transmissionValue = D_SHIFT_VALUE_PARKING;
493 case E_SHIFT_PARKING:
494 m_transmission = E_SHIFT_PARKING; // NO CHANGE
495 m_transmissionValue = D_SHIFT_VALUE_PARKING;
500 /******************************************
502 ******************************************/
507 CAvgCar::CAvgCar(const short RPMsz, const short SPDsz,
509 : m_brake(BRKsz), m_engine(RPMsz),
510 m_speed(SPDsz? SPDsz: D_SAMPLE_SPACE_SPEED),
511 m_accPedalOpen(D_SAMPLE_SPACE_ACCPEDAL)
516 m_bChgThrottle = false;
533 * @param throttle CAvgEngine parameter
535 void CAvgCar::chgThrottle(int throttle)
537 int x = abs((throttle - 32767));
538 if (false == m_engine.isActive()) {
539 if ((true == isNeutral()) || (true == isParking())) {
540 m_engine.ignitionStart(D_RPM_IGNITION_VALUE);
543 for (int i; i < D_SAMPLE_SPACE_ACCPEDAL; i++) {
544 m_accPedalOpen.setSample(x);
550 m_engine.chgThrottle(x);
551 m_accPedalOpen.setSample(x);
552 m_bChgThrottle = true;
559 * @param BrakeVal CAvgBrake parameter
561 void CAvgCar::chgBrake(int brakeVal)
563 int x = abs((brakeVal - 32767));
571 * speed and range calc
573 #define D_DOUBLE_SET_SPEED_MAX atd4
576 double oldSpd = getSpeed();
577 double rpm = getRPM();
579 if (D_RPM_BOTTOM_BORDER > m_engine.getAvgRPM()){
582 double gearRatio = getGearRatio(oldSpd,bDown);
583 double tmpX = rpm * gearRatio / 100;
585 double x = m_brake.getSpeed(tmpX);
586 m_speed.setSample(x);
588 * Processing for the acceleration
590 if ((oldSpd < x) && (atd4 > x)){
591 m_speed.setSample(x);
592 m_speed.setSample(x);
595 * Processing for the brake
597 if (true == m_brake.isOnBrake()) {
599 if ((atd1 > oldSpd) && (0 == x)) {
600 m_speed.setSample(x);
601 m_speed.setSample(x);
602 m_speed.setSample(x);
603 m_speed.setSample(x);
607 double spd = m_speed.getAvg();
608 struct timespec oldtp;
609 oldtp.tv_sec = m_tp.tv_sec;
610 oldtp.tv_nsec = m_tp.tv_nsec;
611 clock_gettime(CLOCK_MONOTONIC, &m_tp);
613 long int sec = m_tp.tv_sec - oldtp.tv_sec; // sec
614 long int nsec = m_tp.tv_nsec - oldtp.tv_nsec; // nano sec
615 double r_nsec = (((double)sec * 1000000000l) +
616 (double)nsec) / 1000000000l; // get time(nanosec)
617 m_currentRunMeter = (((double)(spd / 3600)) * 1000) * r_nsec; // get ran lengths
618 if (true == isReverse()) {
619 double x = 0 - m_currentRunMeter;
620 m_currentRunMeter = x;
622 m_tripmeter += m_currentRunMeter;
623 m_odometer += m_currentRunMeter;
626 m_currentRunMeter = 0.0l;
632 void CAvgCar::updateAvg()
634 if ((false == m_bChgThrottle) && (-1 != m_valThrottle)) {
635 m_engine.chgThrottle(m_valThrottle);
636 m_accPedalOpen.setSample(m_valThrottle);
638 m_bChgThrottle = false;
639 if ((false == m_bChgBrake) && (-1 != m_valBrake)){
640 m_brake.chgBrake(m_valBrake);