A set of classes that mimic the behaviour of Mbed Ticker class but using TIMER0, TIMER1, TIMER2 and the RIT.

Files at this revision

API Documentation at this revision

Comitter:
AjK
Date:
Fri Feb 11 11:35:49 2011 +0000
Parent:
0:5c7fd96cf29a
Commit message:
0.2

Changed in this revision

Ticker0Sys.cpp Show annotated file Show diff for this revision Revisions of this file
Ticker1Sys.cpp Show annotated file Show diff for this revision Revisions of this file
Ticker2Sys.cpp Show annotated file Show diff for this revision Revisions of this file
TickerRSys.cpp Show annotated file Show diff for this revision Revisions of this file
Tickers.cpp Show annotated file Show diff for this revision Revisions of this file
Tickers.h Show annotated file Show diff for this revision Revisions of this file
TickersSys.h Show annotated file Show diff for this revision Revisions of this file
diff -r 5c7fd96cf29a -r e60d949ec09a Ticker0Sys.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Ticker0Sys.cpp	Fri Feb 11 11:35:49 2011 +0000
@@ -0,0 +1,79 @@
+/*
+    Copyright (c) 2011 Andy Kirkham
+ 
+    Permission is hereby granted, free of charge, to any person obtaining a copy
+    of this software and associated documentation files (the "Software"), to deal
+    in the Software without restriction, including without limitation the rights
+    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+    copies of the Software, and to permit persons to whom the Software is
+    furnished to do so, subject to the following conditions:
+ 
+    The above copyright notice and this permission notice shall be included in
+    all copies or substantial portions of the Software.
+ 
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+    THE SOFTWARE.
+*/
+
+// Mimic Mbed's Ticker class but using TIMER1 
+// (note, only goes to milliseconds level not microseconds!)
+
+#include "TickersSys.h"
+
+namespace AjK {
+
+// Create a Ticker0 controller.
+Ticker0Sys _ticker0Sys;
+
+// Nice and simple ISR, just call the class standard handler.
+extern "C" void TIMER0_IRQHandler(void) __irq 
+{
+    _ticker0Sys.isr();    
+}
+
+Ticker0Sys::Ticker0Sys(void)
+{    
+    LPC_SC->PCONP    |= (1UL << 1); // TIM0 On
+    LPC_SC->PCLKSEL0 |= (3UL << 2); // CCLK/8 = 12MHz
+    LPC_TIM0->PR      = 11;         // TC clocks at 1MHz.
+    LPC_TIM0->MR0     = 1000;       // Match at 1kHz.
+    LPC_TIM0->MCR    |= 1;          // Generate an interrupt.
+    LPC_TIM0->TCR     = 1;          // Enable Timer1 to count.
+    NVIC_EnableIRQ(TIMER0_IRQn);
+}
+
+void 
+Ticker0Sys::addTicker(Ticker0 *t)
+{
+    tickers.push_back(t);   
+}
+
+void 
+Ticker0Sys::delTicker(Ticker0 *t)
+{
+    for (list<Ticker0 *>::iterator itor = tickers.begin(); itor !=  tickers.end(); ++itor) {
+        if ((*itor) == t) {
+            itor = tickers.erase(itor);
+            return;
+        }
+    }
+}
+
+void 
+Ticker0Sys::isr(void)
+{
+    LPC_TIM0->IR = 1;
+    LPC_TIM0->MR0 += 1000;
+    if (tickers.empty()) return;
+    
+    for (list<Ticker0 *>::iterator itor = tickers.begin(); itor !=  tickers.end(); ++itor) {
+        (*itor)->tick();
+    }
+    
+}    
+}; // namespace AjK ends.
diff -r 5c7fd96cf29a -r e60d949ec09a Ticker1Sys.cpp
--- a/Ticker1Sys.cpp	Fri Feb 11 10:42:52 2011 +0000
+++ b/Ticker1Sys.cpp	Fri Feb 11 11:35:49 2011 +0000
@@ -48,15 +48,15 @@
 }
 
 void 
-Ticker1Sys::addTicker(TickerA *t)
+Ticker1Sys::addTicker(Ticker1 *t)
 {
     tickers.push_back(t);   
 }
 
 void 
-Ticker1Sys::delTicker(TickerA *t)
+Ticker1Sys::delTicker(Ticker1 *t)
 {
-    for (list<TickerA *>::iterator itor = tickers.begin(); itor !=  tickers.end(); ++itor) {
+    for (list<Ticker1 *>::iterator itor = tickers.begin(); itor !=  tickers.end(); ++itor) {
         if ((*itor) == t) {
             itor = tickers.erase(itor);
             return;
@@ -71,7 +71,7 @@
     LPC_TIM1->MR0 += 1000;
     if (tickers.empty()) return;
     
-    for (list<TickerA *>::iterator itor = tickers.begin(); itor !=  tickers.end(); ++itor) {
+    for (list<Ticker1 *>::iterator itor = tickers.begin(); itor !=  tickers.end(); ++itor) {
         (*itor)->tick();
     }
     
diff -r 5c7fd96cf29a -r e60d949ec09a Ticker2Sys.cpp
--- a/Ticker2Sys.cpp	Fri Feb 11 10:42:52 2011 +0000
+++ b/Ticker2Sys.cpp	Fri Feb 11 11:35:49 2011 +0000
@@ -48,15 +48,15 @@
 }
 
 void 
-Ticker2Sys::addTicker(TickerB *t)
+Ticker2Sys::addTicker(Ticker2 *t)
 {
     tickers.push_back(t);   
 }
 
 void 
-Ticker2Sys::delTicker(TickerB *t)
+Ticker2Sys::delTicker(Ticker2 *t)
 {
-    for (list<TickerB *>::iterator itor = tickers.begin(); itor !=  tickers.end(); ++itor) {
+    for (list<Ticker2 *>::iterator itor = tickers.begin(); itor !=  tickers.end(); ++itor) {
         if ((*itor) == t) {
             itor = tickers.erase(itor);
             return;
@@ -71,7 +71,7 @@
     LPC_TIM2->MR0 += 1000;
     if (tickers.empty()) return;
     
-    for (list<TickerB *>::iterator itor = tickers.begin(); itor !=  tickers.end(); ++itor) {
+    for (list<Ticker2 *>::iterator itor = tickers.begin(); itor !=  tickers.end(); ++itor) {
         (*itor)->tick();
     }
     
diff -r 5c7fd96cf29a -r e60d949ec09a TickerRSys.cpp
--- a/TickerRSys.cpp	Fri Feb 11 10:42:52 2011 +0000
+++ b/TickerRSys.cpp	Fri Feb 11 11:35:49 2011 +0000
@@ -52,15 +52,15 @@
 }
 
 void 
-TickerRSys::addTicker(TickerC *t)
+TickerRSys::addTicker(Ticker4 *t)
 {
     tickers.push_back(t);   
 }
 
 void 
-TickerRSys::delTicker(TickerC *t)
+TickerRSys::delTicker(Ticker4 *t)
 {
-    for (list<TickerC *>::iterator itor = tickers.begin(); itor !=  tickers.end(); ++itor) {
+    for (list<Ticker4 *>::iterator itor = tickers.begin(); itor !=  tickers.end(); ++itor) {
         if ((*itor) == t) {
             itor = tickers.erase(itor);
             return;
@@ -75,7 +75,7 @@
     
     if (tickers.empty()) return;
     
-    for (list<TickerC *>::iterator itor = tickers.begin(); itor !=  tickers.end(); ++itor) {
+    for (list<Ticker4 *>::iterator itor = tickers.begin(); itor !=  tickers.end(); ++itor) {
         (*itor)->tick();
     }
     
diff -r 5c7fd96cf29a -r e60d949ec09a Tickers.cpp
--- a/Tickers.cpp	Fri Feb 11 10:42:52 2011 +0000
+++ b/Tickers.cpp	Fri Feb 11 11:35:49 2011 +0000
@@ -22,17 +22,37 @@
 
 #include "Tickers.h"
 
-TickerA::TickerA() { 
+Ticker0::Ticker0() { 
+    counter = 0;
+    _ticker0Sys.addTicker(this);
+}
+
+Ticker0::~Ticker0() { 
+    _ticker0Sys.delTicker(this);
+}
+    
+void 
+Ticker0::tick(void) {
+    if (counter) {
+        counter--;
+        if (counter == 0) {
+            counter = reload;
+            callback.call();
+        }        
+    }
+}
+
+Ticker1::Ticker1() { 
     counter = 0;
     _ticker1Sys.addTicker(this);
 }
 
-TickerA::~TickerA() { 
+Ticker1::~Ticker1() { 
     _ticker1Sys.delTicker(this);
 }
     
 void 
-TickerA::tick(void) {
+Ticker1::tick(void) {
     if (counter) {
         counter--;
         if (counter == 0) {
@@ -42,17 +62,17 @@
     }
 }
 
-TickerB::TickerB() { 
+Ticker2::Ticker2() { 
     counter = 0;
     _ticker2Sys.addTicker(this);
 }
 
-TickerB::~TickerB() { 
+Ticker2::~Ticker2() { 
     _ticker2Sys.delTicker(this);
 }
     
 void 
-TickerB::tick(void) {
+Ticker2::tick(void) {
     if (counter) {
         counter--;
         if (counter == 0) {
@@ -62,17 +82,17 @@
     }
 }
 
-TickerC::TickerC() { 
+Ticker4::Ticker4() { 
     counter = 0;
     _tickerRSys.addTicker(this);
 }
 
-TickerC::~TickerC() { 
+Ticker4::~Ticker4() { 
     _tickerRSys.delTicker(this);
 }
     
 void 
-TickerC::tick(void) {
+Ticker4::tick(void) {
     if (counter) {
         counter--;
         if (counter == 0) {
@@ -81,4 +101,3 @@
         }        
     }
 }
-
diff -r 5c7fd96cf29a -r e60d949ec09a Tickers.h
--- a/Tickers.h	Fri Feb 11 10:42:52 2011 +0000
+++ b/Tickers.h	Fri Feb 11 11:35:49 2011 +0000
@@ -32,17 +32,49 @@
 // Mimic Mbed's Ticker class but using TIMER1 
 // (note, only goes to milliseconds level not microseconds!)
 
-class Ticker1Sys;
-extern Ticker1Sys _ticker1Sys;
+class Ticker0Sys;
+extern Ticker0Sys _ticker0Sys;
 
-class TickerA {
+class Ticker0 {
 protected:
     FunctionPointer callback;
     uint32_t counter;
     uint32_t reload;
 public:
-    TickerA();
-    ~TickerA();
+    Ticker0();
+    ~Ticker0();
+    void tick(void);
+    
+    void detach(void) {        
+        callback.attach();
+    }
+    void attach(void (*fptr)(void), double d) {
+        counter = reload = (uint32_t)( d * 1000.0 );
+        callback.attach(fptr);
+    }
+    template<typename T>
+    void attach(T* tptr, void (T::*mptr)(void), double d) {  
+        if((mptr != NULL) && (tptr != NULL)) {
+            counter = reload = (uint32_t)( d * 1000.0 );
+            callback.attach(tptr, mptr);         
+        }        
+    }
+};
+
+// Mimic Mbed's Ticker class but using TIMER1 
+// (note, only goes to milliseconds level not microseconds!)
+
+class Ticker1Sys;
+extern Ticker1Sys _ticker1Sys;
+
+class Ticker1 {
+protected:
+    FunctionPointer callback;
+    uint32_t counter;
+    uint32_t reload;
+public:
+    Ticker1();
+    ~Ticker1();
     void tick(void);
     
     void detach(void) {        
@@ -67,14 +99,14 @@
 class Ticker2Sys;
 extern Ticker2Sys _ticker2Sys;
 
-class TickerB {
+class Ticker2 {
 protected:
     FunctionPointer callback;
     uint32_t counter;
     uint32_t reload;
 public:
-    TickerB();
-    ~TickerB();
+    Ticker2();
+    ~Ticker2();
     void tick(void);
     
     void detach(void) {        
@@ -99,14 +131,14 @@
 class TickerRSys;
 extern TickerRSys _tickerRSys;
 
-class TickerC {
+class Ticker4 {
 protected:
     FunctionPointer callback;
     uint32_t counter;
     uint32_t reload;
 public:
-    TickerC();
-    ~TickerC();
+    Ticker4();
+    ~Ticker4();
     void tick(void);
     
     void detach(void) {        
@@ -126,11 +158,11 @@
 };
 
 // Mimic Mbed's Ticker class but using actual Ticker by inheriting.
-// This just basically "renames" Ticker to TickerD for consistancy.
+// This just basically "renames" Ticker to TickerE for consistancy.
 
-class TickerD : public Ticker {
+class Ticker3 : public Ticker {
 public:
-    TickerD() : Ticker() {};
+    Ticker3() : Ticker() {};
 };
 
 }; // namespace AjK ends.
diff -r 5c7fd96cf29a -r e60d949ec09a TickersSys.h
--- a/TickersSys.h	Fri Feb 11 10:42:52 2011 +0000
+++ b/TickersSys.h	Fri Feb 11 11:35:49 2011 +0000
@@ -29,49 +29,64 @@
 
 namespace AjK {
 
-class TickerA;
+class Ticker0;
+
+// Ticker0 controller.
+class Ticker0Sys {
+protected:
+    list<Ticker0 *> tickers;
+    
+public:
+    void init(void);
+    Ticker0Sys();
+    void isr(void);    
+    void addTicker(Ticker0 *t);
+    void delTicker(Ticker0 *t);        
+};
+
+class Ticker1;
 
 // Ticker1 controller.
 class Ticker1Sys {
 protected:
-    list<TickerA *> tickers;
+    list<Ticker1 *> tickers;
     
 public:
     void init(void);
     Ticker1Sys();
     void isr(void);    
-    void addTicker(TickerA *t);
-    void delTicker(TickerA *t);        
+    void addTicker(Ticker1 *t);
+    void delTicker(Ticker1 *t);        
 };
 
-class TickerB;
+class Ticker2;
 
 // Ticker2 controller.
 class Ticker2Sys {
 protected:
-    list<TickerB *> tickers;
+    list<Ticker2 *> tickers;
     
 public:
     void init(void);
     Ticker2Sys();
     void isr(void);    
-    void addTicker(TickerB *t);    
-    void delTicker(TickerB *t);    
+    void addTicker(Ticker2 *t);    
+    void delTicker(Ticker2 *t);    
 };
 
-class TickerC;
+class Ticker4;
 
 // TickerR controller.
 class TickerRSys {
 protected:
-    list<TickerC *> tickers;
+    list<Ticker4 *> tickers;
     
 public:
     void init(void);
     TickerRSys();
     void isr(void);    
-    void addTicker(TickerC *t);    
-    void delTicker(TickerC *t);    
+    void addTicker(Ticker4 *t);    
+    void delTicker(Ticker4 *t);    
 };
 
 }; // namespace AjK ends.