diff --git a/src/haptic.cpp b/src/haptic.cpp index ce0cdaf86..0d860164a 100644 --- a/src/haptic.cpp +++ b/src/haptic.cpp @@ -1,124 +1,125 @@ -/* - * Authors (alphabetical order) - * - Bertrand Songis - * - Bryan J. Rentoul (Gruvin) - * - Cameron Weeks - * - Erez Raviv - * - Jean-Pierre Parisy - * - Karl Szmutny - * - Michael Blandford - * - Michal Hlavinka - * - Pat Mackenzie - * - Philip Moss - * - Rob Thomson - * - Romolo Manfredini - * - Thomas Husterer - * - * open9x is based on code named - * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, - * er9x by Erez Raviv: http://code.google.com/p/er9x/, - * and the original (and ongoing) project by - * Thomas Husterer, th9x: http://code.google.com/p/th9x/ - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include "open9x.h" - -hapticQueue::hapticQueue() -{ - buzzTimeLeft = 0; - buzzPause = 0; - - t_queueRidx = 0; - t_queueWidx = 0; - - hapticTick = 0; -} - -void hapticQueue::heartbeat() -{ -#if defined(SIMU) - return; -#endif - - if (buzzTimeLeft > 0) { - buzzTimeLeft--; // time gets counted down -#if defined(PCBARM) - hapticOn(g_eeGeneral.hapticStrength * 20); -#else - if (hapticTick-- > 0) { - HAPTIC_ON; // haptic output 'high' - } - else { - HAPTIC_OFF; // haptic output 'high' - hapticTick = g_eeGeneral.hapticStrength; - } -#endif - } - else { - HAPTIC_OFF; // haptic output 'high' - if (buzzPause > 0) { - buzzPause--; - } - else if (t_queueRidx != t_queueWidx) { - buzzTimeLeft = queueHapticLength[t_queueRidx]; - buzzPause = queueHapticPause[t_queueRidx]; - if (!queueHapticRepeat[t_queueRidx]--) { - t_queueRidx = (t_queueRidx + 1) % HAPTIC_QUEUE_LENGTH; - } - } - } -} - -void hapticQueue::play(uint8_t tLen, uint8_t tPause, uint8_t tFlags) -{ - tLen = getHapticLength(tLen); - - if ((tFlags & PLAY_NOW) || (!busy() && empty())) { - buzzTimeLeft = tLen; - buzzPause = tPause; - t_queueWidx = t_queueRidx; - } - else { - tFlags += 1; - } - - tFlags &= 0x0f; - if (tFlags) { - uint8_t next_queueWidx = (t_queueWidx + 1) % HAPTIC_QUEUE_LENGTH; - if (next_queueWidx != t_queueRidx) { - queueHapticLength[t_queueWidx] = tLen; - queueHapticPause[t_queueWidx] = tPause; - queueHapticRepeat[t_queueWidx] = tFlags-1; - t_queueWidx = next_queueWidx; - } - } -} - -void hapticQueue::event(uint8_t e) -{ - if (g_eeGeneral.hapticMode>0 || (g_eeGeneral.hapticMode==0 && e>=AU_WARNING1) || (g_eeGeneral.hapticMode>=-1 && e<=AU_ERROR)) { - if (e <= AU_ERROR) - play(15, 3, PLAY_NOW); - else if (e <= AU_TRIM_MOVE) - play(5, 0, PLAY_NOW); - else if (e <= AU_TIMER_LT3) - play(15, 3, PLAY_NOW); - else if (e < AU_FRSKY_FIRST) - play(15, 3, (e-AU_TIMER_10)|PLAY_NOW); - else if (e >= AU_FRSKY_LAST && empty()) { - play(15, 3, e-AU_FRSKY_LAST); - } - } -} - -hapticQueue haptic; +/* + * Authors (alphabetical order) + * - Bertrand Songis + * - Bryan J. Rentoul (Gruvin) + * - Cameron Weeks + * - Erez Raviv + * - Jean-Pierre Parisy + * - Karl Szmutny + * - Michael Blandford + * - Michal Hlavinka + * - Pat Mackenzie + * - Philip Moss + * - Rob Thomson + * - Romolo Manfredini + * - Thomas Husterer + * + * open9x is based on code named + * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, + * er9x by Erez Raviv: http://code.google.com/p/er9x/, + * and the original (and ongoing) project by + * Thomas Husterer, th9x: http://code.google.com/p/th9x/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include "open9x.h" + +hapticQueue::hapticQueue() +{ + buzzTimeLeft = 0; + buzzPause = 0; + + t_queueRidx = 0; + t_queueWidx = 0; + + hapticTick = 0; +} + +void hapticQueue::heartbeat() +{ +#if defined(SIMU) + return; +#endif + + if (buzzTimeLeft > 0) { + buzzTimeLeft--; // time gets counted down +#if defined(PCBARM) + hapticOn(g_eeGeneral.hapticStrength * 20); +#else + if (hapticTick-- > 0) { + HAPTIC_ON; // haptic output 'high' + } + else { + HAPTIC_OFF; // haptic output 'high' + hapticTick = g_eeGeneral.hapticStrength; + } +#endif + } + else { + HAPTIC_OFF; // haptic output 'high' + if (buzzPause > 0) { + buzzPause--; + } + else if (t_queueRidx != t_queueWidx) { + buzzTimeLeft = queueHapticLength[t_queueRidx]; + buzzPause = queueHapticPause[t_queueRidx]; + if (!queueHapticRepeat[t_queueRidx]--) { + t_queueRidx = (t_queueRidx + 1) % HAPTIC_QUEUE_LENGTH; + } + } + } +} + +void hapticQueue::play(uint8_t tLen, uint8_t tPause, uint8_t tFlags) +{ + tLen = getHapticLength(tLen); + + if ((tFlags & PLAY_NOW) || (!busy() && empty())) { + buzzTimeLeft = tLen; + buzzPause = tPause; + t_queueWidx = t_queueRidx; + } + else { + tFlags += 1; + } + + tFlags &= 0x0f; + if (tFlags) { + uint8_t next_queueWidx = (t_queueWidx + 1) % HAPTIC_QUEUE_LENGTH; + if (next_queueWidx != t_queueRidx) { + queueHapticLength[t_queueWidx] = tLen; + queueHapticPause[t_queueWidx] = tPause; + queueHapticRepeat[t_queueWidx] = tFlags-1; + t_queueWidx = next_queueWidx; + } + } +} + +void hapticQueue::event(uint8_t e) +{ + if (g_eeGeneral.hapticMode>0 || (g_eeGeneral.hapticMode==0 && e>=AU_WARNING1) || (g_eeGeneral.hapticMode>=-1 && e<=AU_ERROR)) { + if (e <= AU_ERROR) + play(15, 3, PLAY_NOW); + else if (e <= AU_TRIM_MOVE) + play(5, 0, PLAY_NOW); + else if (e <= AU_TIMER_LT3) + play(15, 3, PLAY_NOW); + else if (e < AU_FRSKY_FIRST) + play(15, 3, (e-AU_TIMER_10)|PLAY_NOW); + else if (e >= AU_FRSKY_LAST && empty()) { + play(30, 10, 0); + play(10,50-10*(e-AU_FRSKY_LAST),(e-AU_FRSKY_LAST)); + } + } +} + +hapticQueue haptic;