From ef14f74f92fb52d0028eb36b7b48b7e7c4ef52c4 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Thu, 27 Mar 2008 11:48:28 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@248 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- demos/ARM7-LPC214x-G++/main.cpp | 141 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 demos/ARM7-LPC214x-G++/main.cpp (limited to 'demos/ARM7-LPC214x-G++/main.cpp') diff --git a/demos/ARM7-LPC214x-G++/main.cpp b/demos/ARM7-LPC214x-G++/main.cpp new file mode 100644 index 000000000..b3c4f8e45 --- /dev/null +++ b/demos/ARM7-LPC214x-G++/main.cpp @@ -0,0 +1,141 @@ +/* + ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio. + + This file is part of ChibiOS/RT. + + ChibiOS/RT is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/RT is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include + +#include +#include + +using namespace chibios_rt; + +/* + * LED blinking sequences. + */ +#define SLEEP 0 +#define STOP 1 +#define BITCLEAR 2 +#define BITSET 3 + +typedef struct { + uint8_t action; + uint32_t value; +} bitop_t; + +bitop_t LED1_sequence[] = +{ + {BITCLEAR, 0x00000400}, + {SLEEP, 200}, + {BITSET, 0x00000400}, + {SLEEP, 1800} +}; + +bitop_t LED2_sequence[] = +{ + {SLEEP, 1000}, + {BITCLEAR, 0x00000800}, + {SLEEP, 200}, + {BITSET, 0x00000800}, + {SLEEP, 800} +}; + +bitop_t LED3_sequence[] = +{ + {BITCLEAR, 0x80000000}, + {SLEEP, 200}, + {BITSET, 0x80000000}, + {SLEEP, 300} +}; + +/** + * LED blinker thread class. + */ +class BlinkerThread : chibios_rt::BaseThread { +private: + WorkingArea(wa, 64); + bitop_t *base, *curr, *top; + +protected: + virtual msg_t Main(void) { + + while (TRUE) { + switch(curr->action) { + case SLEEP: + Sleep(curr->value); + break; + case STOP: + return 0; + case BITCLEAR: + IO0CLR = curr->value; + break; + case BITSET: + IO0SET = curr->value; + break; + } + if (++curr >= top) + curr = base; + } + } + +public: + BlinkerThread(bitop_t *sequence, int n) : BaseThread(NORMALPRIO, 0, wa, sizeof wa) { + + base = curr = sequence; + top = sequence + n; + } +}; + +extern "C" { + msg_t TestThread(void *p); +} + +/* + * Executed as event handler at 500mS intervals. + */ +static void TimerHandler(eventid_t id) { + + if (!(IO0PIN & 0x00018000)) // Both buttons + TestThread(&COM1); +} + +/* + * Entry point, the interrupts are disabled on entry. + */ +int main(int argc, char **argv) { + static const evhandler_t evhndl[] = { + TimerHandler + }; + static EvTimer evt; + struct EventListener el0; + + System::Init(); + + evtInit(&evt, 500); /* Initializes an event timer object. */ + evtStart(&evt); /* Starts the event timer. */ + chEvtRegister(&evt.et_es, &el0, 0); /* Registers on the timer event source. */ + + BlinkerThread blinker1(LED1_sequence, sizeof(LED1_sequence) / sizeof(bitop_t)); + BlinkerThread blinker2(LED2_sequence, sizeof(LED2_sequence) / sizeof(bitop_t)); + BlinkerThread blinker3(LED3_sequence, sizeof(LED3_sequence) / sizeof(bitop_t)); + + while(1) + Event::Wait(ALL_EVENTS, evhndl); + + return 0; +} -- cgit v1.2.3