Update preset.
[bertos.git] / bertos / emul / timer_qt.c
index 6f96da646984ce5e69c53e7c135669fd9d3c6f35..e0883abd87059b2f809e992f91ca4ae26dd586bf 100644 (file)
@@ -30,9 +30,8 @@
  *
  * -->
  *
- * \version $Id$
  *
- * \author Bernardo Innocenti <bernie@develer.com>
+ * \author Bernie Innocenti <bernie@codewiz.org>
  *
  * \brief Low-level timer module for Qt emulator (implementation).
  */
 #include <QtCore/QDateTime>
 #include <QtCore/QTimer>
 
+#if CONFIG_KERN_IRQ
+#include <kern/irq.h>
+#endif
+
 
 // The user interrupt server routine
 void timer_isr(void);
@@ -87,13 +90,28 @@ public:
                // Record initial time
                system_time.start();
 
+               #if CONFIG_KERN_IRQ
+                       irq_register(SIGALRM, timer_isr);
+               #endif
+
                // Activate timer interrupt
-               timer.connect(&timer, SIGNAL(timeout()), this, SLOT(timerInterrupt()));
+               connect(&timer, SIGNAL(timeout()), SLOT(timerInterrupt()));
                timer.start(1000 / TIMER_TICKS_PER_SEC);
 
                initialized = true;
        }
 
+       void cleanup()
+       {
+               // Timer cleaned twice?
+               ASSERT(initialized);
+
+               timer.stop();
+               timer.disconnect();
+
+               initialized = false;
+       }
+
        /// Return current time in high-precision format.
        hptime_t hpread()
        {
@@ -105,7 +123,11 @@ public slots:
        void timerInterrupt(void)
        {
                // Just call user interrupt server, timer restarts automatically.
-               timer_isr();
+               #if CONFIG_KERN_IRQ
+                       irq_entry(SIGALRM);
+               #else
+                       timer_isr();
+               #endif
        }
 
 };
@@ -116,10 +138,14 @@ public slots:
 /// HW dependent timer initialization.
 static void timer_hw_init(void)
 {
-       // Kick EmulTimer initialization
        EmulTimer::instance().init();
 }
 
+static void timer_hw_cleanup(void)
+{
+       EmulTimer::instance().cleanup();
+}
+
 INLINE hptime_t timer_hw_hpread(void)
 {
        return EmulTimer::instance().hpread();