As of Monday morning, so this is the code we showed at Uncraftivism.

Dependencies:   mbed

Committer:
voidnoise
Date:
Mon Dec 14 08:25:07 2009 +0000
Revision:
1:5d20e168f467
Parent:
0:da6a22da11a2

        

Who changed what in which revision?

UserRevisionLine numberNew 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 1:5d20e168f467 52 return EYE_OPEN + ( (EYE_CLOSED-EYE_OPEN) * 0.8 * 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