This is the code we showed at Uncraftivism

Dependencies:   mbed

Committer:
jarkman
Date:
Mon Dec 14 08:28:21 2009 +0000
Revision:
2:01115080f6da

        

Who changed what in which revision?

UserRevisionLine numberNew 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