Richard Sewell
/
ucam
This is the code we showed at Uncraftivism
Blinker.cpp@2:01115080f6da, 2009-12-14 (annotated)
- Committer:
- jarkman
- Date:
- Mon Dec 14 08:28:21 2009 +0000
- Revision:
- 2:01115080f6da
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jarkman | 2:01115080f6da | 1 | #include "stdafx.h" |
jarkman | 2:01115080f6da | 2 | |
jarkman | 2:01115080f6da | 3 | #include "mbed.h" |
jarkman | 2:01115080f6da | 4 | #include "Blinker.h" |
jarkman | 2:01115080f6da | 5 | |
jarkman | 2:01115080f6da | 6 | #define EYE_CLOSED 0.25 |
jarkman | 2:01115080f6da | 7 | #define EYE_OPEN 0.85 |
jarkman | 2:01115080f6da | 8 | |
jarkman | 2:01115080f6da | 9 | extern Logger pcSerial; |
jarkman | 2:01115080f6da | 10 | |
jarkman | 2:01115080f6da | 11 | Blinker::Blinker( ServoMinder *servoMinder ) |
jarkman | 2:01115080f6da | 12 | { |
jarkman | 2:01115080f6da | 13 | m_servoMinder = servoMinder; |
jarkman | 2:01115080f6da | 14 | m_servoMinder->moveTo( EYE_CLOSED ); |
jarkman | 2:01115080f6da | 15 | |
jarkman | 2:01115080f6da | 16 | m_sleepiness = 0; |
jarkman | 2:01115080f6da | 17 | m_boredom = 0; |
jarkman | 2:01115080f6da | 18 | |
jarkman | 2:01115080f6da | 19 | m_tickTime = 0.1; |
jarkman | 2:01115080f6da | 20 | m_blinkTimer = 0; |
jarkman | 2:01115080f6da | 21 | |
jarkman | 2:01115080f6da | 22 | m_nextMove = -1; |
jarkman | 2:01115080f6da | 23 | |
jarkman | 2:01115080f6da | 24 | |
jarkman | 2:01115080f6da | 25 | m_ticker.attach( this, &Blinker::tick, m_tickTime ); |
jarkman | 2:01115080f6da | 26 | } |
jarkman | 2:01115080f6da | 27 | |
jarkman | 2:01115080f6da | 28 | void Blinker::setBoredom( float boredom ) |
jarkman | 2:01115080f6da | 29 | { |
jarkman | 2:01115080f6da | 30 | m_boredom = boredom; |
jarkman | 2:01115080f6da | 31 | } |
jarkman | 2:01115080f6da | 32 | |
jarkman | 2:01115080f6da | 33 | void Blinker::setSleepiness( float sleepiness ) |
jarkman | 2:01115080f6da | 34 | { |
jarkman | 2:01115080f6da | 35 | float diff = fabs( m_sleepiness - sleepiness ); |
jarkman | 2:01115080f6da | 36 | m_sleepiness = sleepiness; |
jarkman | 2:01115080f6da | 37 | |
jarkman | 2:01115080f6da | 38 | if( diff > 0.01 ) |
jarkman | 2:01115080f6da | 39 | open(); |
jarkman | 2:01115080f6da | 40 | |
jarkman | 2:01115080f6da | 41 | } |
jarkman | 2:01115080f6da | 42 | |
jarkman | 2:01115080f6da | 43 | float Blinker::speedForSleepiness() |
jarkman | 2:01115080f6da | 44 | { |
jarkman | 2:01115080f6da | 45 | // for sleepiness 0->1, return speed 2->0.5 |
jarkman | 2:01115080f6da | 46 | return 2 - (1.5 * m_sleepiness); |
jarkman | 2:01115080f6da | 47 | } |
jarkman | 2:01115080f6da | 48 | |
jarkman | 2:01115080f6da | 49 | float Blinker::openPosForSleepiness() |
jarkman | 2:01115080f6da | 50 | { |
jarkman | 2:01115080f6da | 51 | // for sleepiness 0->1, return EYE_OPEN ->( )/2 |
jarkman | 2:01115080f6da | 52 | return EYE_OPEN + ( (EYE_CLOSED-EYE_OPEN) * 0.8 * m_sleepiness); |
jarkman | 2:01115080f6da | 53 | } |
jarkman | 2:01115080f6da | 54 | |
jarkman | 2:01115080f6da | 55 | void Blinker::close() |
jarkman | 2:01115080f6da | 56 | { |
jarkman | 2:01115080f6da | 57 | m_servoMinder->setSpeed( speedForSleepiness() ); |
jarkman | 2:01115080f6da | 58 | m_servoMinder->moveTo( EYE_CLOSED ); |
jarkman | 2:01115080f6da | 59 | |
jarkman | 2:01115080f6da | 60 | } |
jarkman | 2:01115080f6da | 61 | |
jarkman | 2:01115080f6da | 62 | void Blinker::open() |
jarkman | 2:01115080f6da | 63 | { |
jarkman | 2:01115080f6da | 64 | m_servoMinder->setSpeed( speedForSleepiness() ); |
jarkman | 2:01115080f6da | 65 | m_servoMinder->moveTo( openPosForSleepiness() ); |
jarkman | 2:01115080f6da | 66 | } |
jarkman | 2:01115080f6da | 67 | |
jarkman | 2:01115080f6da | 68 | void Blinker::blink() |
jarkman | 2:01115080f6da | 69 | { |
jarkman | 2:01115080f6da | 70 | m_servoMinder->setSpeed( speedForSleepiness() ); |
jarkman | 2:01115080f6da | 71 | m_servoMinder->moveTo( EYE_CLOSED ); |
jarkman | 2:01115080f6da | 72 | m_nextMove = openPosForSleepiness(); |
jarkman | 2:01115080f6da | 73 | } |
jarkman | 2:01115080f6da | 74 | |
jarkman | 2:01115080f6da | 75 | void Blinker::tick() |
jarkman | 2:01115080f6da | 76 | { |
jarkman | 2:01115080f6da | 77 | |
jarkman | 2:01115080f6da | 78 | if( ! m_servoMinder->isMoving()) |
jarkman | 2:01115080f6da | 79 | if( m_nextMove >= 0 ) |
jarkman | 2:01115080f6da | 80 | { |
jarkman | 2:01115080f6da | 81 | m_servoMinder->moveTo( m_nextMove ); |
jarkman | 2:01115080f6da | 82 | m_nextMove = -1; |
jarkman | 2:01115080f6da | 83 | } |
jarkman | 2:01115080f6da | 84 | |
jarkman | 2:01115080f6da | 85 | m_blinkTimer ++; |
jarkman | 2:01115080f6da | 86 | if( m_blinkTimer > 100 ) // 10 secs |
jarkman | 2:01115080f6da | 87 | { |
jarkman | 2:01115080f6da | 88 | m_blinkTimer = 0; |
jarkman | 2:01115080f6da | 89 | blink(); |
jarkman | 2:01115080f6da | 90 | } |
jarkman | 2:01115080f6da | 91 | |
jarkman | 2:01115080f6da | 92 | if( m_boredom < m_sleepiness ) |
jarkman | 2:01115080f6da | 93 | setSleepiness( m_boredom ); // wake up quickly |
jarkman | 2:01115080f6da | 94 | else |
jarkman | 2:01115080f6da | 95 | setSleepiness( m_sleepiness + (m_boredom - m_sleepiness) / 200 ); // fall asleep slowly |
jarkman | 2:01115080f6da | 96 | } |
jarkman | 2:01115080f6da | 97 |