Deleted.

Committer:
QL
Date:
Mon Sep 26 02:20:21 2011 +0000
Revision:
2:27716f570c3d
Parent:
0:9601fa787c8b
Child:
3:4df7120f6f33
Updated for QP 4.2.04 and for QM 2.0.00

Who changed what in which revision?

UserRevisionLine numberNew contents of line
QL 0:9601fa787c8b 1 //////////////////////////////////////////////////////////////////////////////
QL 0:9601fa787c8b 2 // Model: pelican.qm
QL 0:9601fa787c8b 3 // File: ./bsp.cpp
QL 0:9601fa787c8b 4 //
QL 0:9601fa787c8b 5 // This file has been generated automatically by QP Modeler (QM).
QL 0:9601fa787c8b 6 // DO NOT EDIT THIS FILE MANUALLY.
QL 0:9601fa787c8b 7 //
QL 0:9601fa787c8b 8 // Please visit www.state-machine.com/qm for more information.
QL 0:9601fa787c8b 9 //////////////////////////////////////////////////////////////////////////////
QL 0:9601fa787c8b 10 #include "qp_port.h"
QL 0:9601fa787c8b 11 #include "pelican.h"
QL 0:9601fa787c8b 12 #include "bsp.h"
QL 0:9601fa787c8b 13 #include "LPC17xx.h"
QL 0:9601fa787c8b 14
QL 0:9601fa787c8b 15 Q_DEFINE_THIS_FILE
QL 0:9601fa787c8b 16
QL 0:9601fa787c8b 17 // Local-scope objects -------------------------------------------------------
QL 0:9601fa787c8b 18 enum ISR_Priorities { // ISR priorities starting from the highest urgency
QL 0:9601fa787c8b 19 GPIOPORTA_PRIO,
QL 0:9601fa787c8b 20 SYSTICK_PRIO,
QL 0:9601fa787c8b 21 // ...
QL 0:9601fa787c8b 22 };
QL 0:9601fa787c8b 23
QL 0:9601fa787c8b 24 #define LED_PORT LPC_GPIO1
QL 0:9601fa787c8b 25 #define LED1_BIT (1U << 18)
QL 0:9601fa787c8b 26 #define LED2_BIT (1U << 20)
QL 0:9601fa787c8b 27 #define LED3_BIT (1U << 21)
QL 0:9601fa787c8b 28 #define LED4_BIT (1U << 23)
QL 0:9601fa787c8b 29
QL 0:9601fa787c8b 30 #ifdef Q_SPY
QL 0:9601fa787c8b 31 #include "mbed.h" // mbed is used only for the built-in serial
QL 0:9601fa787c8b 32
QL 0:9601fa787c8b 33 QSTimeCtr l_tickTime;
QL 0:9601fa787c8b 34 QSTimeCtr l_tickPeriod;
QL 2:27716f570c3d 35 static uint8_t l_SysTick_Handler;
QL 0:9601fa787c8b 36
QL 0:9601fa787c8b 37 #define QSPY_BAUD_RATE 115200
QL 0:9601fa787c8b 38
QL 0:9601fa787c8b 39 enum AppRecords { // application-specific trace records
QL 0:9601fa787c8b 40 PELICAN_STAT = QS_USER
QL 0:9601fa787c8b 41 };
QL 0:9601fa787c8b 42
QL 0:9601fa787c8b 43 Serial l_qspy(USBTX, USBRX);
QL 0:9601fa787c8b 44 #endif
QL 0:9601fa787c8b 45
QL 0:9601fa787c8b 46 //............................................................................
QL 0:9601fa787c8b 47 extern "C" void SysTick_Handler(void) {
QL 0:9601fa787c8b 48 QK_ISR_ENTRY(); // inform the QK kernel of entering the ISR
QL 0:9601fa787c8b 49
QL 0:9601fa787c8b 50 #ifdef Q_SPY
QL 0:9601fa787c8b 51 uint32_t volatile dummy = SysTick->CTRL; // clear the COUNTFLAG in SysTick
QL 0:9601fa787c8b 52 l_tickTime += l_tickPeriod; // account for the clock rollover
QL 0:9601fa787c8b 53 #endif
QL 0:9601fa787c8b 54
QL 2:27716f570c3d 55 QF::TICK(&l_SysTick_Handler); // process all armed time events
QL 0:9601fa787c8b 56
QL 0:9601fa787c8b 57 QK_ISR_EXIT(); // inform the QK kernel of exiting the ISR
QL 0:9601fa787c8b 58 }
QL 0:9601fa787c8b 59
QL 0:9601fa787c8b 60 //............................................................................
QL 0:9601fa787c8b 61 void BSP_init(void) {
QL 0:9601fa787c8b 62 SystemInit(); // initialize the clocking system
QL 0:9601fa787c8b 63
QL 0:9601fa787c8b 64 // set LED port to output
QL 0:9601fa787c8b 65 LED_PORT->FIODIR |= (LED1_BIT | LED2_BIT | LED3_BIT | LED4_BIT);
QL 0:9601fa787c8b 66
QL 0:9601fa787c8b 67 // clear the LEDs
QL 0:9601fa787c8b 68 LED_PORT->FIOCLR = (LED1_BIT | LED2_BIT | LED3_BIT | LED4_BIT);
QL 0:9601fa787c8b 69
QL 0:9601fa787c8b 70 if (QS_INIT((void *)0) == 0) { // initialize the QS software tracing
QL 0:9601fa787c8b 71 Q_ERROR();
QL 0:9601fa787c8b 72 }
QL 2:27716f570c3d 73 QS_OBJ_DICTIONARY(&l_SysTick_Handler);
QL 0:9601fa787c8b 74 }
QL 0:9601fa787c8b 75 //............................................................................
QL 0:9601fa787c8b 76 void BSP_signalCars(BSP_CarsSignal sig) {
QL 0:9601fa787c8b 77 switch (sig) {
QL 0:9601fa787c8b 78 case CARS_RED:
QL 0:9601fa787c8b 79 LED_PORT->FIOSET = LED1_BIT; // turn the LED1 on
QL 0:9601fa787c8b 80 LED_PORT->FIOCLR = LED2_BIT | LED3_BIT; // turn the LED2&3 off
QL 0:9601fa787c8b 81 break;
QL 0:9601fa787c8b 82 case CARS_YELLOW:
QL 0:9601fa787c8b 83 LED_PORT->FIOSET = LED2_BIT; // turn the LED2 on
QL 0:9601fa787c8b 84 LED_PORT->FIOCLR = LED1_BIT | LED3_BIT; // turn the LED1&3 off
QL 0:9601fa787c8b 85 break;
QL 0:9601fa787c8b 86 case CARS_GREEN:
QL 0:9601fa787c8b 87 LED_PORT->FIOSET = LED3_BIT; // turn the LED3 on
QL 0:9601fa787c8b 88 LED_PORT->FIOCLR = LED1_BIT | LED2_BIT; // turn the LED1&2 off
QL 0:9601fa787c8b 89 break;
QL 0:9601fa787c8b 90 case CARS_BLANK:
QL 0:9601fa787c8b 91 LED_PORT->FIOCLR = LED1_BIT | LED2_BIT | LED3_BIT; //turn all off
QL 0:9601fa787c8b 92 break;
QL 0:9601fa787c8b 93 }
QL 0:9601fa787c8b 94 }
QL 0:9601fa787c8b 95 //............................................................................
QL 0:9601fa787c8b 96 void BSP_signalPeds(BSP_PedsSignal sig) {
QL 0:9601fa787c8b 97 switch (sig) {
QL 0:9601fa787c8b 98 case PEDS_DONT_WALK:
QL 0:9601fa787c8b 99 LED_PORT->FIOSET = LED4_BIT; // turn the LED4 on
QL 0:9601fa787c8b 100 break;
QL 0:9601fa787c8b 101 case PEDS_WALK:
QL 0:9601fa787c8b 102 LED_PORT->FIOCLR = LED4_BIT; // turn the LED4 off
QL 0:9601fa787c8b 103 break;
QL 0:9601fa787c8b 104 case PEDS_BLANK:
QL 0:9601fa787c8b 105 LED_PORT->FIOCLR = LED4_BIT; // turn the LED4 off
QL 0:9601fa787c8b 106 break;
QL 0:9601fa787c8b 107 }
QL 0:9601fa787c8b 108 }
QL 0:9601fa787c8b 109 //............................................................................
QL 0:9601fa787c8b 110 void BSP_showState(char const *state) {
QL 0:9601fa787c8b 111 QS_BEGIN(PELICAN_STAT, AO_Pelican) // application-specific record
QL 0:9601fa787c8b 112 QS_STR(state); // state string
QL 0:9601fa787c8b 113 QS_END()
QL 0:9601fa787c8b 114 }
QL 0:9601fa787c8b 115
QL 0:9601fa787c8b 116 //............................................................................
QL 0:9601fa787c8b 117 void QF::onStartup(void) {
QL 0:9601fa787c8b 118 // set up the SysTick timer to fire at BSP_TICKS_PER_SEC rate
QL 0:9601fa787c8b 119 SysTick_Config(SystemCoreClock / BSP_TICKS_PER_SEC);
QL 0:9601fa787c8b 120
QL 0:9601fa787c8b 121 // set priorities of all interrupts in the system...
QL 0:9601fa787c8b 122 NVIC_SetPriority(SysTick_IRQn, SYSTICK_PRIO);
QL 0:9601fa787c8b 123 NVIC_SetPriority(EINT0_IRQn, GPIOPORTA_PRIO);
QL 0:9601fa787c8b 124
QL 0:9601fa787c8b 125 NVIC_EnableIRQ(EINT0_IRQn);
QL 0:9601fa787c8b 126 }
QL 0:9601fa787c8b 127 //............................................................................
QL 0:9601fa787c8b 128 void QF::onCleanup(void) {
QL 0:9601fa787c8b 129 }
QL 0:9601fa787c8b 130 //............................................................................
QL 0:9601fa787c8b 131 void QK::onIdle(void) {
QL 0:9601fa787c8b 132 #ifdef Q_SPY
QL 0:9601fa787c8b 133 if (l_qspy.writeable()) {
QL 0:9601fa787c8b 134 QF_INT_LOCK(dummy);
QL 0:9601fa787c8b 135 uint16_t b = QS::getByte();
QL 0:9601fa787c8b 136 QF_INT_UNLOCK(dummy);
QL 0:9601fa787c8b 137 if (b != QS_EOD) {
QL 0:9601fa787c8b 138 l_qspy.putc((uint8_t)b);
QL 0:9601fa787c8b 139 }
QL 0:9601fa787c8b 140 }
QL 0:9601fa787c8b 141 #else
QL 0:9601fa787c8b 142 // put the CPU and peripherals to the low-power mode
QL 0:9601fa787c8b 143 // you might need to customize the clock management for your application,
QL 0:9601fa787c8b 144 // see the datasheet for your particular Cortex-M3 MCU.
QL 0:9601fa787c8b 145 __WFI();
QL 0:9601fa787c8b 146 #endif
QL 0:9601fa787c8b 147 }
QL 0:9601fa787c8b 148
QL 0:9601fa787c8b 149 //............................................................................
QL 0:9601fa787c8b 150 void Q_onAssert(char const Q_ROM * const Q_ROM_VAR file, int line) {
QL 0:9601fa787c8b 151 (void)file; // avoid compiler warning
QL 0:9601fa787c8b 152 (void)line; // avoid compiler warning
QL 0:9601fa787c8b 153 QS_BEGIN_(QS_ASSERT, 0, 0)
QL 0:9601fa787c8b 154 QS_TIME_(); // time stamp
QL 0:9601fa787c8b 155 QS_U16_((uint16_t)line); // the line number
QL 0:9601fa787c8b 156 QS_STR_(file); // the file name
QL 0:9601fa787c8b 157 QS_END_()
QL 0:9601fa787c8b 158 QS::onFlush();
QL 0:9601fa787c8b 159
QL 0:9601fa787c8b 160 QF_INT_LOCK(dummy); // make sure that all interrupts are disabled
QL 0:9601fa787c8b 161 // light up all LEDs
QL 0:9601fa787c8b 162 LED_PORT->FIOSET = (LED1_BIT | LED2_BIT | LED3_BIT | LED4_BIT);
QL 0:9601fa787c8b 163
QL 0:9601fa787c8b 164 for (;;) { // NOTE: replace the loop with reset for final version
QL 0:9601fa787c8b 165 }
QL 0:9601fa787c8b 166 }
QL 0:9601fa787c8b 167
QL 0:9601fa787c8b 168 //----------------------------------------------------------------------------
QL 0:9601fa787c8b 169 #ifdef Q_SPY
QL 0:9601fa787c8b 170 //............................................................................
QL 0:9601fa787c8b 171 uint8_t QS::onStartup(void const *arg) {
QL 0:9601fa787c8b 172 static uint8_t qsBuf[6*256]; // buffer for Quantum Spy
QL 0:9601fa787c8b 173 initBuf(qsBuf, sizeof(qsBuf));
QL 0:9601fa787c8b 174
QL 0:9601fa787c8b 175 l_qspy.baud(QSPY_BAUD_RATE);
QL 0:9601fa787c8b 176
QL 0:9601fa787c8b 177 l_tickPeriod = SystemCoreClock / BSP_TICKS_PER_SEC;
QL 0:9601fa787c8b 178 l_tickTime = l_tickPeriod; // to start the timestamp at zero
QL 0:9601fa787c8b 179
QL 0:9601fa787c8b 180 // setup the QS filters...
QL 0:9601fa787c8b 181 QS_FILTER_ON(QS_ALL_RECORDS);
QL 0:9601fa787c8b 182
QL 0:9601fa787c8b 183 // QS_FILTER_OFF(QS_QEP_STATE_EMPTY);
QL 0:9601fa787c8b 184 // QS_FILTER_OFF(QS_QEP_STATE_ENTRY);
QL 0:9601fa787c8b 185 // QS_FILTER_OFF(QS_QEP_STATE_EXIT);
QL 0:9601fa787c8b 186 // QS_FILTER_OFF(QS_QEP_STATE_INIT);
QL 0:9601fa787c8b 187 // QS_FILTER_OFF(QS_QEP_INIT_TRAN);
QL 0:9601fa787c8b 188 // QS_FILTER_OFF(QS_QEP_INTERN_TRAN);
QL 0:9601fa787c8b 189 // QS_FILTER_OFF(QS_QEP_TRAN);
QL 0:9601fa787c8b 190 // QS_FILTER_OFF(QS_QEP_IGNORED);
QL 0:9601fa787c8b 191
QL 0:9601fa787c8b 192 // QS_FILTER_OFF(QS_QF_ACTIVE_ADD);
QL 0:9601fa787c8b 193 // QS_FILTER_OFF(QS_QF_ACTIVE_REMOVE);
QL 0:9601fa787c8b 194 // QS_FILTER_OFF(QS_QF_ACTIVE_SUBSCRIBE);
QL 0:9601fa787c8b 195 // QS_FILTER_OFF(QS_QF_ACTIVE_UNSUBSCRIBE);
QL 0:9601fa787c8b 196 // QS_FILTER_OFF(QS_QF_ACTIVE_POST_FIFO);
QL 0:9601fa787c8b 197 // QS_FILTER_OFF(QS_QF_ACTIVE_POST_LIFO);
QL 0:9601fa787c8b 198 // QS_FILTER_OFF(QS_QF_ACTIVE_GET);
QL 0:9601fa787c8b 199 // QS_FILTER_OFF(QS_QF_ACTIVE_GET_LAST);
QL 0:9601fa787c8b 200 // QS_FILTER_OFF(QS_QF_EQUEUE_INIT);
QL 0:9601fa787c8b 201 // QS_FILTER_OFF(QS_QF_EQUEUE_POST_FIFO);
QL 0:9601fa787c8b 202 // QS_FILTER_OFF(QS_QF_EQUEUE_POST_LIFO);
QL 0:9601fa787c8b 203 // QS_FILTER_OFF(QS_QF_EQUEUE_GET);
QL 0:9601fa787c8b 204 // QS_FILTER_OFF(QS_QF_EQUEUE_GET_LAST);
QL 0:9601fa787c8b 205 // QS_FILTER_OFF(QS_QF_MPOOL_INIT);
QL 0:9601fa787c8b 206 // QS_FILTER_OFF(QS_QF_MPOOL_GET);
QL 0:9601fa787c8b 207 // QS_FILTER_OFF(QS_QF_MPOOL_PUT);
QL 0:9601fa787c8b 208 // QS_FILTER_OFF(QS_QF_PUBLISH);
QL 0:9601fa787c8b 209 // QS_FILTER_OFF(QS_QF_NEW);
QL 0:9601fa787c8b 210 // QS_FILTER_OFF(QS_QF_GC_ATTEMPT);
QL 0:9601fa787c8b 211 // QS_FILTER_OFF(QS_QF_GC);
QL 0:9601fa787c8b 212 QS_FILTER_OFF(QS_QF_TICK);
QL 0:9601fa787c8b 213 // QS_FILTER_OFF(QS_QF_TIMEEVT_ARM);
QL 0:9601fa787c8b 214 // QS_FILTER_OFF(QS_QF_TIMEEVT_AUTO_DISARM);
QL 0:9601fa787c8b 215 // QS_FILTER_OFF(QS_QF_TIMEEVT_DISARM_ATTEMPT);
QL 0:9601fa787c8b 216 // QS_FILTER_OFF(QS_QF_TIMEEVT_DISARM);
QL 0:9601fa787c8b 217 // QS_FILTER_OFF(QS_QF_TIMEEVT_REARM);
QL 0:9601fa787c8b 218 // QS_FILTER_OFF(QS_QF_TIMEEVT_POST);
QL 0:9601fa787c8b 219 QS_FILTER_OFF(QS_QF_INT_LOCK);
QL 0:9601fa787c8b 220 QS_FILTER_OFF(QS_QF_INT_UNLOCK);
QL 0:9601fa787c8b 221 QS_FILTER_OFF(QS_QF_ISR_ENTRY);
QL 0:9601fa787c8b 222 QS_FILTER_OFF(QS_QF_ISR_EXIT);
QL 0:9601fa787c8b 223
QL 0:9601fa787c8b 224 // QS_FILTER_OFF(QS_QK_MUTEX_LOCK);
QL 0:9601fa787c8b 225 // QS_FILTER_OFF(QS_QK_MUTEX_UNLOCK);
QL 0:9601fa787c8b 226 // QS_FILTER_OFF(QS_QK_SCHEDULE);
QL 0:9601fa787c8b 227
QL 0:9601fa787c8b 228 return (uint8_t)1; // return success
QL 0:9601fa787c8b 229 }
QL 0:9601fa787c8b 230 //............................................................................
QL 0:9601fa787c8b 231 void QS::onCleanup(void) {
QL 0:9601fa787c8b 232 }
QL 0:9601fa787c8b 233 //............................................................................
QL 0:9601fa787c8b 234 QSTimeCtr QS::onGetTime(void) { // invoked with interrupts locked
QL 0:9601fa787c8b 235 if ((SysTick->CTRL & 0x00000100) == 0) { // COUNTFLAG no set?
QL 0:9601fa787c8b 236 return l_tickTime - (QSTimeCtr)SysTick->VAL;
QL 0:9601fa787c8b 237 }
QL 0:9601fa787c8b 238 else { // the rollover occured, but the SysTick_ISR did not run yet
QL 0:9601fa787c8b 239 return l_tickTime + l_tickPeriod - (QSTimeCtr)SysTick->VAL;
QL 0:9601fa787c8b 240 }
QL 0:9601fa787c8b 241 }
QL 0:9601fa787c8b 242 //............................................................................
QL 0:9601fa787c8b 243 void QS::onFlush(void) {
QL 0:9601fa787c8b 244 uint16_t b;
QL 0:9601fa787c8b 245 QF_INT_LOCK(dummy);
QL 0:9601fa787c8b 246 while ((b = QS::getByte()) != QS_EOD) {
QL 0:9601fa787c8b 247 while (!l_qspy.writeable()) { // wait until serial port is writable
QL 0:9601fa787c8b 248 }
QL 0:9601fa787c8b 249 l_qspy.putc((uint8_t)b);
QL 0:9601fa787c8b 250 }
QL 0:9601fa787c8b 251 QF_INT_UNLOCK(dummy);
QL 0:9601fa787c8b 252 }
QL 0:9601fa787c8b 253 #endif // Q_SPY
QL 0:9601fa787c8b 254 //----------------------------------------------------------------------------