Kabuki Starship / Mbed 2 deprecated mbedBug

Dependencies:   mbed

Committer:
kabukistarship
Date:
Thu Apr 09 22:40:13 2020 +0000
Revision:
6:02df5c1108f1
Parent:
LEDStatus.h@2:aa9a1377aa0d
Renamed StatusLED to StatusIndicator.

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