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.
Diff: coilgun.cpp
- Revision:
- 5:0e061c4013a2
- Parent:
- 4:0e2bdd3d52bc
- Child:
- 6:4c75db8a43db
diff -r 0e2bdd3d52bc -r 0e061c4013a2 coilgun.cpp
--- a/coilgun.cpp Sat Sep 14 22:57:17 2013 +0000
+++ b/coilgun.cpp Wed Sep 18 10:50:22 2013 +0000
@@ -1,55 +1,80 @@
-#include "coilgun.h"
-
-CoilGun::CoilGun(PinName chargePinName, PinName kickPinName, PinName donePinName)
- : chargePin(chargePinName), kickPin(kickPinName), donePin(donePinName) {
- kicking = false;
- discharging = false;
- kickPin = 1;
- chargePin = 0;
- donePin.fall(this, &CoilGun::doneCallback);
-}
-
-void CoilGun::kick(unsigned int length) {
- if (!kicking){
+ #include "coilgun.h"
+
+ Coilgun::Coilgun(PinName kickPinName ,PinName chargePinName, PinName donePinName):
+ kickPin(kickPinName),chargePin(chargePinName), donePin(donePinName)
+ {
+ state = idle;
+ kickPin = 1;
chargePin = 0;
- kicking = true;
- kickPin = 0;
- kickTimeout.attach_us(this, &CoilGun::kickEnd, length);
+ donePin.fall(this, &Coilgun::chargeEnd);
+ }
+
+ void Coilgun::kick(unsigned int length) {
+ kick(length,true);
}
-}
-
-void CoilGun::kickEnd(void) {
- kickTimeout.detach();
- kickPin = 1;
- chargePin = 1;
- kicking = false;
-}
+
+ void Coilgun::kick(unsigned int length, bool change_state = true) {
+ if(change_state) //Used to keep state when discharging
+ changeState(kicking);
+
+ chargePin = 0; // Maybe not needed anymore? (still a safety?)
+ kickPin = 0;
+ kickTimeout.attach_us(this, &Coilgun::kickEnd, length);
+ }
+
+ void Coilgun::kickEnd(void) {
+ kickTimeout.detach();
+ kickPin = 1;
-void CoilGun::setCharge(bool chargeState) {
- if (chargeState) {
- if (discharging)
- dischargeEnd();
+ if(state != discharging){ //Used when discharging
+ chargePin = 1; // Don't start charging again
+ state = idle; //(let state stay "discharging")
+ }
+
+ }
+
+ void Coilgun::charge() {
+ changeState(charging);
kickPin = 1;
- chargePin = 1;
- } else {
- chargePin = 0;
- }
-}
+ chargePin = 1;
+ }
-void CoilGun::discharge() {
- setCharge(false);
- discharging = true;
- dischargeTimeout.attach(this, &CoilGun::dischargeEnd, 5.0); // End discharging after 5 seconds
- discharger.attach_us(this, &CoilGun::dischargeKick, 5000); // calls short kick every 5ms
-}
-void CoilGun::dischargeKick(void) {
- kick(1000);
-}
-void CoilGun::dischargeEnd(void) {
- discharger.detach();
- discharging = false;
-}
-
-void CoilGun::doneCallback(void) {
- chargePin = 0;
-}
\ No newline at end of file
+ void Coilgun::chargeEnd(){
+ chargePin = 0;
+ state = idle;
+ }
+
+ void Coilgun::discharge() {
+ changeState(discharging);
+ dischargeTimeout.attach(this, &Coilgun::dischargeEnd, 10.0); // End discharging after 10 seconds
+ discharger.attach_us(this, &Coilgun::dischargeKick, 5000); // calls short kick every 5ms
+ }
+ void Coilgun::dischargeEnd(void) {
+ discharger.detach();
+ state = idle;
+ }
+ void Coilgun::dischargeKick(void) {
+ kick(500, false);
+ }
+
+ void Coilgun::changeState(State new_state){
+ switch(state){
+ case idle:
+ //nothing to end.
+ break;
+ case kicking:
+ kickEnd();
+ break;
+ case charging:
+ chargeEnd();
+ break;
+ case discharging:
+ dischargeEnd();
+ break;
+ default:
+ //error - no such state
+ break;
+ }
+ //set new state
+ state = new_state;
+ }
\ No newline at end of file
