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