States: AVATAR_INIT, AVATAR_IDLE, AVATAR_PLAYING
Module variables:
currentAvatarTick
Init
set CurrentState = AVATAR_INIT
set MyPriority = given priority
post ES_INIT to AvatarService
Post
enqueue ThisEvent to AvatarService’s queue
Run
switch(CurrentState)
case AVATAR_INIT:
if ThisEvent is ES_INIT
set CurrentState = AVATAR_IDLE
end if
case AVATAR_IDLE:
if ThisEvent is ES_START_BUTTON_PRESS
set CurrentState = AVATAR_PLAYING
end if
case AVATAR_PLAYING:
if ThisEvent is ES_VOLUME_CHANGE
vol = ThisEvent.param
// map volume to servo tick
if vol > ENV_MAX
vol = ENV_MAX
end if
span = AVATAR_MAX_TICK - AVATAR_MIN_TICK
scaledVol = vol * span / ENV_MAX
tick = AVATAR_MAX_TICK - scaledVol
currentAvatarTick = tick
set PWM on AVATAR_SERVO_CH to tick
end if
if ThisEvent is ES_NO_INPUT_TIMEOUT or ES_GAMEOVER_TIMEOUT
set CurrentState = AVATAR_IDLE
currentAvatarTick = AVATAR_MAX_TICK
set PWM on AVATAR_SERVO_CH to AVATAR_MAX_TICK
end if