Kabuki Starship / Mbed 2 deprecated mbedBug

Dependencies:   mbed

Committer:
kabukistarship
Date:
Tue Apr 07 13:09:21 2020 +0000
Revision:
2:aa9a1377aa0d
Switched to all UpperCamelCase.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kabukistarship 2:aa9a1377aa0d 1 /* mbedBug @version 0.x
kabukistarship 2:aa9a1377aa0d 2 @link https://github.com/KabukiStarship/mbedBug.git
kabukistarship 2:aa9a1377aa0d 3 @file /led_status.h
kabukistarship 2:aa9a1377aa0d 4 @author Cale McCollough <https://cale-mccollough.github.io>
kabukistarship 2:aa9a1377aa0d 5 @license Copyright 2016-20 (C) Kabuki Starship <kabukistarship.com>; all rights
kabukistarship 2:aa9a1377aa0d 6 reserved (R). This Source Code Form is subject to the terms of the Mozilla
kabukistarship 2:aa9a1377aa0d 7 Public License, v. 2.0. If a copy of the MPL was not distributed with this file,
kabukistarship 2:aa9a1377aa0d 8 You can obtain one at <https://mozilla.org/MPL/2.0/>. */
kabukistarship 2:aa9a1377aa0d 9 #ifndef _mbedBug_StatusLED_header
kabukistarship 2:aa9a1377aa0d 10 #define _mbedBug_StatusLED_header
kabukistarship 2:aa9a1377aa0d 11 #define _Debug 0 //< Use this flag to turn this library into a debug example program. @see mbedBug.cpp:int main ()
kabukistarship 2:aa9a1377aa0d 12 #include <mbed.h>
kabukistarship 2:aa9a1377aa0d 13 #include <stdint.h>
kabukistarship 2:aa9a1377aa0d 14 #define _CreateStatusLED \
kabukistarship 2:aa9a1377aa0d 15 static StatusLED<0,1> Status (GREEN_LED);\
kabukistarship 2:aa9a1377aa0d 16
kabukistarship 2:aa9a1377aa0d 17 #define ASSERT(STATEMENT, MESSAGE) {\
kabukistarship 2:aa9a1377aa0d 18 if (!(STATEMENT)) {\
kabukistarship 2:aa9a1377aa0d 19 printf("ASSERT: %s\r\n%s, line %d\r\n", #MESSAGE, __FILE__, __LINE__)\
kabukistarship 2:aa9a1377aa0d 20 Status.HandleAssert ()\
kabukistarship 2:aa9a1377aa0d 21 while (true)\
kabukistarship 2:aa9a1377aa0d 22 }\
kabukistarship 2:aa9a1377aa0d 23 }
kabukistarship 2:aa9a1377aa0d 24
kabukistarship 2:aa9a1377aa0d 25 namespace mbedBug {
kabukistarship 2:aa9a1377aa0d 26
kabukistarship 2:aa9a1377aa0d 27 /* Outputs the firmware Status using the LED on the mbed board.
kabukistarship 2:aa9a1377aa0d 28 This class works by using strings with ASCII Mores Code. Each char in a
kabukistarship 2:aa9a1377aa0d 29 represents a pulse split into 4 lengths.
kabukistarship 2:aa9a1377aa0d 30
kabukistarship 2:aa9a1377aa0d 31 | Frame | ASCII | Index | Duty Cycle |
kabukistarship 2:aa9a1377aa0d 32 |:-----:|:-----:|:-----:|:----------:|
kabukistarship 2:aa9a1377aa0d 33 | Off | ' ' | <= 44 | 0% |
kabukistarship 2:aa9a1377aa0d 34 | Long | '-' | 45 | 1/3 |
kabukistarship 2:aa9a1377aa0d 35 | Short | '.' | 46 | 1/3 |
kabukistarship 2:aa9a1377aa0d 36 | On | '_' | >= 47 | 100% |
kabukistarship 2:aa9a1377aa0d 37
kabukistarship 2:aa9a1377aa0d 38 Off could be any value less than 44, and On could be any value greater than
kabukistarship 2:aa9a1377aa0d 39 47, but ASCII space (' ') and Period ('.') are used by convention because
kabukistarship 2:aa9a1377aa0d 40 they look like the pulse widths.
kabukistarship 2:aa9a1377aa0d 41
kabukistarship 2:aa9a1377aa0d 42 ## Terminology
kabukistarship 2:aa9a1377aa0d 43 * Frame - Each character in a char Sequence represents 3 timer interrupts.
kabukistarship 2:aa9a1377aa0d 44 * Pattern - A null-terminated string of frames.
kabukistarship 2:aa9a1377aa0d 45 * Sequence - A null-terminated string of const char*.
kabukistarship 2:aa9a1377aa0d 46
kabukistarship 2:aa9a1377aa0d 47 @code
kabukistarship 2:aa9a1377aa0d 48 StatusLED<0, 1> stausLED (); //< Use <0, 1> if you're LED is active low.
kabukistarship 2:aa9a1377aa0d 49 StatusLED<1, 0> stausLED (LED_2); //< Use <0, 1> if you're LED is active high.
kabukistarship 2:aa9a1377aa0d 50
kabukistarship 2:aa9a1377aa0d 51 const char* ExamplePattern[] = {
kabukistarship 2:aa9a1377aa0d 52 "... ", //< Blinks fast three times in a row.
kabukistarship 2:aa9a1377aa0d 53 "...---... ", //< SOS in Mores Code.
kabukistarship 2:aa9a1377aa0d 54 "____ ", //< Slowly blinks on and off.
kabukistarship 2:aa9a1377aa0d 55 0 //< Must have null-termination pointer.
kabukistarship 2:aa9a1377aa0d 56 };
kabukistarship 2:aa9a1377aa0d 57
kabukistarship 2:aa9a1377aa0d 58 statusLED.SetPattern (exapmlePattern, 1.5f);
kabukistarship 2:aa9a1377aa0d 59
kabukistarship 2:aa9a1377aa0d 60 @endcode
kabukistarship 2:aa9a1377aa0d 61 */
kabukistarship 2:aa9a1377aa0d 62 template <int On, int Off>
kabukistarship 2:aa9a1377aa0d 63 class StatusLED {
kabukistarship 2:aa9a1377aa0d 64 public:
kabukistarship 2:aa9a1377aa0d 65
kabukistarship 2:aa9a1377aa0d 66 char Count, //< Counter counts from from 1-3.
kabukistarship 2:aa9a1377aa0d 67 Period; //< The current Period char.
kabukistarship 2:aa9a1377aa0d 68
kabukistarship 2:aa9a1377aa0d 69 float Frequency; //< The Period length
kabukistarship 2:aa9a1377aa0d 70
kabukistarship 2:aa9a1377aa0d 71 const char** Sequence; //< Null-terminated string of pointers.
kabukistarship 2:aa9a1377aa0d 72
kabukistarship 2:aa9a1377aa0d 73 const char* Pattern, //< The current string in the Sequence.
kabukistarship 2:aa9a1377aa0d 74 * Cursor; //< The current char in the current string.
kabukistarship 2:aa9a1377aa0d 75
kabukistarship 2:aa9a1377aa0d 76 DigitalOut Pin; //< Red LED on the mbed board.
kabukistarship 2:aa9a1377aa0d 77
kabukistarship 2:aa9a1377aa0d 78 Ticker Blinker; //< Ticker for blinking the LEDs.
kabukistarship 2:aa9a1377aa0d 79
kabukistarship 2:aa9a1377aa0d 80 static const float FrequencyDefault = 0.5f, //< Default Frequency in hertz.
kabukistarship 2:aa9a1377aa0d 81 FrequencyMin = 0.01f, //< Min Frequency in hertz.
kabukistarship 2:aa9a1377aa0d 82 FrequencyMax = 2.0f; //< Max Frequency in hertz.
kabukistarship 2:aa9a1377aa0d 83
kabukistarship 2:aa9a1377aa0d 84 typedef enum {
kabukistarship 2:aa9a1377aa0d 85 Off = 0,
kabukistarship 2:aa9a1377aa0d 86 Short = 63,
kabukistarship 2:aa9a1377aa0d 87 Long = 127,
kabukistarship 2:aa9a1377aa0d 88 On = 255
kabukistarship 2:aa9a1377aa0d 89 } Pulse;
kabukistarship 2:aa9a1377aa0d 90
kabukistarship 2:aa9a1377aa0d 91 /* Simple constructor. */
kabukistarship 2:aa9a1377aa0d 92 StatusLED (PinName LEDPin = LED1, float Frequency = FrequencyDefault)
kabukistarship 2:aa9a1377aa0d 93 : Count (0),
kabukistarship 2:aa9a1377aa0d 94 Period (0),
kabukistarship 2:aa9a1377aa0d 95 Sequence (0),
kabukistarship 2:aa9a1377aa0d 96 Pattern (0),
kabukistarship 2:aa9a1377aa0d 97 Cursor (0),
kabukistarship 2:aa9a1377aa0d 98 Frequency (Frequency),
kabukistarship 2:aa9a1377aa0d 99 Pin (LEDPin, Off) {
kabukistarship 2:aa9a1377aa0d 100 /// Nothing to do here.
kabukistarship 2:aa9a1377aa0d 101 }
kabukistarship 2:aa9a1377aa0d 102
kabukistarship 2:aa9a1377aa0d 103 /* Sets the light blinking Sequence. */
kabukistarship 2:aa9a1377aa0d 104 void SetSequence (char** SequenceNew) {
kabukistarship 2:aa9a1377aa0d 105 if (!SequenceNew) {
kabukistarship 2:aa9a1377aa0d 106 Sequence = 0;
kabukistarship 2:aa9a1377aa0d 107 StopBlinking ();
kabukistarship 2:aa9a1377aa0d 108 return;
kabukistarship 2:aa9a1377aa0d 109 }
kabukistarship 2:aa9a1377aa0d 110
kabukistarship 2:aa9a1377aa0d 111 const char* TempString = Sequence[0];
kabukistarship 2:aa9a1377aa0d 112
kabukistarship 2:aa9a1377aa0d 113 if (TempString == 0 || TempString[0] == 0) {
kabukistarship 2:aa9a1377aa0d 114 #if _Debug
kabukistarship 2:aa9a1377aa0d 115 printf ("\r\n\nError: First Sequence and first char can't be null.\r\n\n");
kabukistarship 2:aa9a1377aa0d 116 #endif
kabukistarship 2:aa9a1377aa0d 117 return;
kabukistarship 2:aa9a1377aa0d 118 }
kabukistarship 2:aa9a1377aa0d 119 Sequence = SequenceNew;
kabukistarship 2:aa9a1377aa0d 120 Pattern = SequenceNew[0];
kabukistarship 2:aa9a1377aa0d 121 Cursor = Pattern;
kabukistarship 2:aa9a1377aa0d 122 CurrentByte = *Cursor;
kabukistarship 2:aa9a1377aa0d 123 Update ();
kabukistarship 2:aa9a1377aa0d 124 }
kabukistarship 2:aa9a1377aa0d 125
kabukistarship 2:aa9a1377aa0d 126 /* Turns off the Blinker. */
kabukistarship 2:aa9a1377aa0d 127 void TurnOff () {
kabukistarship 2:aa9a1377aa0d 128 Pin = Off;
kabukistarship 2:aa9a1377aa0d 129 }
kabukistarship 2:aa9a1377aa0d 130
kabukistarship 2:aa9a1377aa0d 131 /* Turns on the Blinker. */
kabukistarship 2:aa9a1377aa0d 132 void TurnOn () {
kabukistarship 2:aa9a1377aa0d 133 Color = ColorA;
kabukistarship 2:aa9a1377aa0d 134 Update ();
kabukistarship 2:aa9a1377aa0d 135 }
kabukistarship 2:aa9a1377aa0d 136
kabukistarship 2:aa9a1377aa0d 137 /* Starts flashing the SOS Sequence. */
kabukistarship 2:aa9a1377aa0d 138 void FlashSOS () {
kabukistarship 2:aa9a1377aa0d 139 Sequence = SoSPattern ();
kabukistarship 2:aa9a1377aa0d 140 Cursor = Sequence[0];
kabukistarship 2:aa9a1377aa0d 141 Cursor = *Cursor;
kabukistarship 2:aa9a1377aa0d 142 Period = *Cursor;
kabukistarship 2:aa9a1377aa0d 143 }
kabukistarship 2:aa9a1377aa0d 144
kabukistarship 2:aa9a1377aa0d 145 /* Starts blinking. */
kabukistarship 2:aa9a1377aa0d 146 void StartBlinking () {
kabukistarship 2:aa9a1377aa0d 147 const char* _pattern = Sequence[0];
kabukistarship 2:aa9a1377aa0d 148 Pattern = _pattern;
kabukistarship 2:aa9a1377aa0d 149 Cursor = _pattern;
kabukistarship 2:aa9a1377aa0d 150 Period = *_pattern;
kabukistarship 2:aa9a1377aa0d 151
kabukistarship 2:aa9a1377aa0d 152 Blinker.attach (this, &StatusLED::blink, Frequency / 4);
kabukistarship 2:aa9a1377aa0d 153 Update ();
kabukistarship 2:aa9a1377aa0d 154 }
kabukistarship 2:aa9a1377aa0d 155
kabukistarship 2:aa9a1377aa0d 156 /* Stops blinking and turns off the LED. */
kabukistarship 2:aa9a1377aa0d 157 void StopBlinking () {
kabukistarship 2:aa9a1377aa0d 158 TurnOff ();
kabukistarship 2:aa9a1377aa0d 159 Blinker.detach ();
kabukistarship 2:aa9a1377aa0d 160 Pin = Off;
kabukistarship 2:aa9a1377aa0d 161 Update ();
kabukistarship 2:aa9a1377aa0d 162 }
kabukistarship 2:aa9a1377aa0d 163
kabukistarship 2:aa9a1377aa0d 164 /* Sets the blink Frequency. */
kabukistarship 2:aa9a1377aa0d 165 void FrequencySet (float Value) {
kabukistarship 2:aa9a1377aa0d 166 Frequency = Value;
kabukistarship 2:aa9a1377aa0d 167 Blinker.attach (this, &StatusLED::Blink, Value);
kabukistarship 2:aa9a1377aa0d 168 }
kabukistarship 2:aa9a1377aa0d 169
kabukistarship 2:aa9a1377aa0d 170 /* Handler for the ASSERT macro. */
kabukistarship 2:aa9a1377aa0d 171 void HandleAssert () {
kabukistarship 2:aa9a1377aa0d 172 SetPattern (SoSPattern ());
kabukistarship 2:aa9a1377aa0d 173 }
kabukistarship 2:aa9a1377aa0d 174
kabukistarship 2:aa9a1377aa0d 175 /* Pattern blinks three times in a row. */
kabukistarship 2:aa9a1377aa0d 176 const char** Blink3TimesPattern () {
kabukistarship 2:aa9a1377aa0d 177 static const char** Sequence = { "... ", 0 };
kabukistarship 2:aa9a1377aa0d 178 return &Sequence;
kabukistarship 2:aa9a1377aa0d 179 }
kabukistarship 2:aa9a1377aa0d 180
kabukistarship 2:aa9a1377aa0d 181 /* Standard blink Sequence. */
kabukistarship 2:aa9a1377aa0d 182 const char** SlowBlinkPattern () {
kabukistarship 2:aa9a1377aa0d 183 static const char** Sequence = { "__ ", 0 };
kabukistarship 2:aa9a1377aa0d 184 return &Sequence;
kabukistarship 2:aa9a1377aa0d 185 }
kabukistarship 2:aa9a1377aa0d 186
kabukistarship 2:aa9a1377aa0d 187 /* Standard blink Sequence. */
kabukistarship 2:aa9a1377aa0d 188 const char** FastBlinkPattern () {
kabukistarship 2:aa9a1377aa0d 189 static const char** Sequence = { "_ ", 0 };
kabukistarship 2:aa9a1377aa0d 190 return &Sequence;
kabukistarship 2:aa9a1377aa0d 191 }
kabukistarship 2:aa9a1377aa0d 192
kabukistarship 2:aa9a1377aa0d 193 /* Standard SOS Sequence. */
kabukistarship 2:aa9a1377aa0d 194 const char** SoSPattern () {
kabukistarship 2:aa9a1377aa0d 195 static const char** Sequence = { "...---... ", 0 };
kabukistarship 2:aa9a1377aa0d 196 return &Sequence;
kabukistarship 2:aa9a1377aa0d 197 }
kabukistarship 2:aa9a1377aa0d 198
kabukistarship 2:aa9a1377aa0d 199 /* Returns the next char in the Sequence. */
kabukistarship 2:aa9a1377aa0d 200 inline char GetNextPeriod () {
kabukistarship 2:aa9a1377aa0d 201 /// We've already checked that the Sequence and Cursor and not null.
kabukistarship 2:aa9a1377aa0d 202
kabukistarship 2:aa9a1377aa0d 203 char period_temp = *(++Cursor);
kabukistarship 2:aa9a1377aa0d 204
kabukistarship 2:aa9a1377aa0d 205 if (period_temp == 0) {
kabukistarship 2:aa9a1377aa0d 206 const char* temp_pattern = *(Pattern + sizeof (const char*));
kabukistarship 2:aa9a1377aa0d 207
kabukistarship 2:aa9a1377aa0d 208 if (!temp_pattern) {
kabukistarship 2:aa9a1377aa0d 209 const char* _cursor = Sequence[0];
kabukistarship 2:aa9a1377aa0d 210 Cursor = Pattern = _cursor;
kabukistarship 2:aa9a1377aa0d 211 return *_cursor;
kabukistarship 2:aa9a1377aa0d 212 }
kabukistarship 2:aa9a1377aa0d 213 Pattern = temp_pattern;
kabukistarship 2:aa9a1377aa0d 214 return *temp_pattern; //< We don't particularly care if the Period is '\0'.
kabukistarship 2:aa9a1377aa0d 215 }
kabukistarship 2:aa9a1377aa0d 216
kabukistarship 2:aa9a1377aa0d 217 return period_temp;
kabukistarship 2:aa9a1377aa0d 218 }
kabukistarship 2:aa9a1377aa0d 219
kabukistarship 2:aa9a1377aa0d 220 /* Updates the Status LED. */
kabukistarship 2:aa9a1377aa0d 221 inline void Update () {
kabukistarship 2:aa9a1377aa0d 222 const char* period_temp = Period;
kabukistarship 2:aa9a1377aa0d 223 if (!Sequence || !period_temp) return;
kabukistarship 2:aa9a1377aa0d 224
kabukistarship 2:aa9a1377aa0d 225 if (Count == 0) { //< Beginning of cycle Period.
kabukistarship 2:aa9a1377aa0d 226 char _period = GetNextPeriod ();
kabukistarship 2:aa9a1377aa0d 227 Period = _period;
kabukistarship 2:aa9a1377aa0d 228 Count = 1;
kabukistarship 2:aa9a1377aa0d 229 if (_period < '-') {
kabukistarship 2:aa9a1377aa0d 230 Pin = Off;
kabukistarship 2:aa9a1377aa0d 231 return;
kabukistarship 2:aa9a1377aa0d 232 }
kabukistarship 2:aa9a1377aa0d 233 Pin = On;
kabukistarship 2:aa9a1377aa0d 234 return;
kabukistarship 2:aa9a1377aa0d 235 }
kabukistarship 2:aa9a1377aa0d 236 else if (Count == 1) { //< 1/3 duty cycle.
kabukistarship 2:aa9a1377aa0d 237 Count = 2;
kabukistarship 2:aa9a1377aa0d 238 if (Period == '.') {
kabukistarship 2:aa9a1377aa0d 239 Pin = Off;
kabukistarship 2:aa9a1377aa0d 240 return;
kabukistarship 2:aa9a1377aa0d 241 }
kabukistarship 2:aa9a1377aa0d 242 return;
kabukistarship 2:aa9a1377aa0d 243 }
kabukistarship 2:aa9a1377aa0d 244 /// 2/3 duty cycle.
kabukistarship 2:aa9a1377aa0d 245 Count = 0;
kabukistarship 2:aa9a1377aa0d 246 if (Period > '.') //< Leave the LED on
kabukistarship 2:aa9a1377aa0d 247 return;
kabukistarship 2:aa9a1377aa0d 248 Pin = Off;
kabukistarship 2:aa9a1377aa0d 249 }
kabukistarship 2:aa9a1377aa0d 250 };
kabukistarship 2:aa9a1377aa0d 251 }
kabukistarship 2:aa9a1377aa0d 252
kabukistarship 2:aa9a1377aa0d 253 // _D_e_m_o_____________________________________________________________________
kabukistarship 2:aa9a1377aa0d 254
kabukistarship 2:aa9a1377aa0d 255 #if 0 //< Set to non-zero to run this demo.
kabukistarship 2:aa9a1377aa0d 256
kabukistarship 2:aa9a1377aa0d 257 using namespace mbedBug;
kabukistarship 2:aa9a1377aa0d 258
kabukistarship 2:aa9a1377aa0d 259 StatusLED Status ();
kabukistarship 2:aa9a1377aa0d 260 InterruptIn switch3 (SW3);
kabukistarship 2:aa9a1377aa0d 261
kabukistarship 2:aa9a1377aa0d 262 const char* ExamplePattern[] = {
kabukistarship 2:aa9a1377aa0d 263 "... ", //< Blinks fast three times in a row.
kabukistarship 2:aa9a1377aa0d 264 "...---... ", //< SOS in Mores Code.
kabukistarship 2:aa9a1377aa0d 265 "____ ", //< Slowly blinks on and off.
kabukistarship 2:aa9a1377aa0d 266 0 //< Pattern must have null-term pointer.
kabukistarship 2:aa9a1377aa0d 267 };
kabukistarship 2:aa9a1377aa0d 268 /* Interrupt handler for SW2. */
kabukistarship 2:aa9a1377aa0d 269 void SwitchIRQHandler () {
kabukistarship 2:aa9a1377aa0d 270 static bool ExamplePatterMode = true;
kabukistarship 2:aa9a1377aa0d 271
kabukistarship 2:aa9a1377aa0d 272 if (ExamplePatterMode) {
kabukistarship 2:aa9a1377aa0d 273 Status.SetPattern (ExamplePattern);
kabukistarship 2:aa9a1377aa0d 274 Status.StartBlinking ();
kabukistarship 2:aa9a1377aa0d 275 ExamplePatterMode = false;
kabukistarship 2:aa9a1377aa0d 276 }
kabukistarship 2:aa9a1377aa0d 277 else {
kabukistarship 2:aa9a1377aa0d 278 Status.SetPattern(Status.SOSPattern ()));
kabukistarship 2:aa9a1377aa0d 279 ExamplePatterMode = true;
kabukistarship 2:aa9a1377aa0d 280 }
kabukistarship 2:aa9a1377aa0d 281 }
kabukistarship 2:aa9a1377aa0d 282
kabukistarship 2:aa9a1377aa0d 283 int main() {
kabukistarship 2:aa9a1377aa0d 284 printf ("\r\n\nTesting mbed Utils.\r\n\n");
kabukistarship 2:aa9a1377aa0d 285 PrintLine ();
kabukistarship 2:aa9a1377aa0d 286
kabukistarship 2:aa9a1377aa0d 287 switch3.rise (&SwitchIRQHandler);
kabukistarship 2:aa9a1377aa0d 288 //Status.StartBlinking ()
kabukistarship 2:aa9a1377aa0d 289
kabukistarship 2:aa9a1377aa0d 290 while (true);
kabukistarship 2:aa9a1377aa0d 291 }
kabukistarship 2:aa9a1377aa0d 292
kabukistarship 2:aa9a1377aa0d 293 #endif //< Demo
kabukistarship 2:aa9a1377aa0d 294 #endif