Fork of Smoothie to port to mbed non-LPC targets.

Dependencies:   mbed

Fork of Smoothie by Stéphane Cachat

Committer:
Bigcheese
Date:
Sun Mar 02 06:33:08 2014 +0000
Revision:
3:f151d08d335c
Parent:
2:1df0b61d3b5a
Bunch of stuff. Need to locally merge in updated USB changes.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Michael J. Spencer 2:1df0b61d3b5a 1 #include "Pauser.h"
Michael J. Spencer 2:1df0b61d3b5a 2
Michael J. Spencer 2:1df0b61d3b5a 3 #include "libs/Kernel.h"
Michael J. Spencer 2:1df0b61d3b5a 4 #include "Block.h"
Michael J. Spencer 2:1df0b61d3b5a 5 #include "libs/nuts_bolts.h"
Michael J. Spencer 2:1df0b61d3b5a 6 #include "libs/utils.h"
Michael J. Spencer 2:1df0b61d3b5a 7
Michael J. Spencer 2:1df0b61d3b5a 8 #include <string>
Michael J. Spencer 2:1df0b61d3b5a 9 using namespace std;
Michael J. Spencer 2:1df0b61d3b5a 10
Michael J. Spencer 2:1df0b61d3b5a 11 // The Pauser module is the core of the pausing subsystem in smoothie. Basically we want several modules to be able to pause smoothie at the same time
Michael J. Spencer 2:1df0b61d3b5a 12 // ( think both the user with a button, and the temperature control because a temperature is not reached ). To do that, modules call the take() methode,
Michael J. Spencer 2:1df0b61d3b5a 13 // a pause event is called, and the pause does not end before all modules have called the release() method.
Michael J. Spencer 2:1df0b61d3b5a 14 // Please note : Modules should keep track of their pause status themselves
Michael J. Spencer 2:1df0b61d3b5a 15 Pauser::Pauser(){
Michael J. Spencer 2:1df0b61d3b5a 16 paused_block = NULL;
Michael J. Spencer 2:1df0b61d3b5a 17 }
Michael J. Spencer 2:1df0b61d3b5a 18
Michael J. Spencer 2:1df0b61d3b5a 19 void Pauser::on_module_loaded(){
Michael J. Spencer 2:1df0b61d3b5a 20 this->counter = 0;
Michael J. Spencer 2:1df0b61d3b5a 21 register_for_event(ON_BLOCK_BEGIN);
Michael J. Spencer 2:1df0b61d3b5a 22 }
Michael J. Spencer 2:1df0b61d3b5a 23
Michael J. Spencer 2:1df0b61d3b5a 24 void Pauser::on_block_begin(void* argument)
Michael J. Spencer 2:1df0b61d3b5a 25 {
Michael J. Spencer 2:1df0b61d3b5a 26 Block* block = static_cast<Block*>(argument);
Michael J. Spencer 2:1df0b61d3b5a 27
Michael J. Spencer 2:1df0b61d3b5a 28 if (counter)
Michael J. Spencer 2:1df0b61d3b5a 29 {
Michael J. Spencer 2:1df0b61d3b5a 30 block->take();
Michael J. Spencer 2:1df0b61d3b5a 31 paused_block = block;
Michael J. Spencer 2:1df0b61d3b5a 32 }
Michael J. Spencer 2:1df0b61d3b5a 33 }
Michael J. Spencer 2:1df0b61d3b5a 34
Michael J. Spencer 2:1df0b61d3b5a 35 // Pause smoothie if nobody else is currently doing so
Michael J. Spencer 2:1df0b61d3b5a 36 void Pauser::take(){
Michael J. Spencer 2:1df0b61d3b5a 37 this->counter++;
Michael J. Spencer 2:1df0b61d3b5a 38 //THEKERNEL->streams->printf("take: %u \r\n", this->counter );
Michael J. Spencer 2:1df0b61d3b5a 39 if( this->counter == 1 ){
Michael J. Spencer 2:1df0b61d3b5a 40 THEKERNEL->call_event(ON_PAUSE, &this->counter);
Michael J. Spencer 2:1df0b61d3b5a 41 }
Michael J. Spencer 2:1df0b61d3b5a 42 }
Michael J. Spencer 2:1df0b61d3b5a 43
Michael J. Spencer 2:1df0b61d3b5a 44 // Unpause smoothie unless something else is pausing it too
Michael J. Spencer 2:1df0b61d3b5a 45 void Pauser::release(){
Michael J. Spencer 2:1df0b61d3b5a 46 this->counter--;
Michael J. Spencer 2:1df0b61d3b5a 47 //THEKERNEL->streams->printf("release: %u \r\n", this->counter );
Michael J. Spencer 2:1df0b61d3b5a 48 if( this->counter == 0 ){
Michael J. Spencer 2:1df0b61d3b5a 49 THEKERNEL->call_event(ON_PLAY, &this->counter);
Michael J. Spencer 2:1df0b61d3b5a 50 if (paused_block)
Michael J. Spencer 2:1df0b61d3b5a 51 {
Michael J. Spencer 2:1df0b61d3b5a 52 Block* tmp = paused_block;
Michael J. Spencer 2:1df0b61d3b5a 53 paused_block = NULL;
Michael J. Spencer 2:1df0b61d3b5a 54 tmp->release();
Michael J. Spencer 2:1df0b61d3b5a 55 }
Michael J. Spencer 2:1df0b61d3b5a 56 }
Michael J. Spencer 2:1df0b61d3b5a 57 }
Michael J. Spencer 2:1df0b61d3b5a 58
Michael J. Spencer 2:1df0b61d3b5a 59 // Return wether smoothie is paused
Michael J. Spencer 2:1df0b61d3b5a 60 bool Pauser::paused(){
Michael J. Spencer 2:1df0b61d3b5a 61 return (counter != 0);
Michael J. Spencer 2:1df0b61d3b5a 62 }