Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of Smoothie by
Pauser.cpp
00001 #include "Pauser.h" 00002 00003 #include "libs/Kernel.h" 00004 #include "Block.h" 00005 #include "libs/nuts_bolts.h" 00006 #include "libs/utils.h" 00007 00008 #include <string> 00009 using namespace std; 00010 00011 // 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 00012 // ( 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, 00013 // a pause event is called, and the pause does not end before all modules have called the release() method. 00014 // Please note : Modules should keep track of their pause status themselves 00015 Pauser::Pauser(){ 00016 paused_block = NULL; 00017 } 00018 00019 void Pauser::on_module_loaded(){ 00020 this->counter = 0; 00021 register_for_event(ON_BLOCK_BEGIN); 00022 } 00023 00024 void Pauser::on_block_begin(void* argument) 00025 { 00026 Block* block = static_cast<Block*>(argument); 00027 00028 if (counter) 00029 { 00030 block->take(); 00031 paused_block = block; 00032 } 00033 } 00034 00035 // Pause smoothie if nobody else is currently doing so 00036 void Pauser::take(){ 00037 this->counter++; 00038 //THEKERNEL->streams->printf("take: %u \r\n", this->counter ); 00039 if( this->counter == 1 ){ 00040 THEKERNEL->call_event(ON_PAUSE, &this->counter); 00041 } 00042 } 00043 00044 // Unpause smoothie unless something else is pausing it too 00045 void Pauser::release(){ 00046 this->counter--; 00047 //THEKERNEL->streams->printf("release: %u \r\n", this->counter ); 00048 if( this->counter == 0 ){ 00049 THEKERNEL->call_event(ON_PLAY, &this->counter); 00050 if (paused_block) 00051 { 00052 Block* tmp = paused_block; 00053 paused_block = NULL; 00054 tmp->release(); 00055 } 00056 } 00057 } 00058 00059 // Return wether smoothie is paused 00060 bool Pauser::paused(){ 00061 return (counter != 0); 00062 }
Generated on Tue Jul 12 2022 20:09:02 by
1.7.2
