Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
- Committer:
- Elecia
- Date:
- 2016-05-25
- Revision:
- 1:0a051df78be2
- Parent:
- 0:21fea82c85fc
File content as of revision 1:0a051df78be2:
/*
Fist full of wires!
The intention here is to make a ball of wires that someone can reach in and
grab, changing the behavior of the system.
So we read in the free IO lines, build up a variable.
If it has changed,
do the change actions:
make a bzzzzt sound
turn off all of the LEDs for a brief instant
Use the created variable to choose the neopixel pattern
and the sound pattern to output to the audio (intermittent beeps)
This program depends on neopixel library.
http://developer.mbed.org/users/JacobBramley/code/PixelArray/
Audio using an Adafruit sound fx board
https://developer.mbed.org/users/Szilard/notebook/mbed-r2d2-robot/
Sounds in general: https://developer.mbed.org/users/4180_1/notebook/using-a-speaker-for-audio-output/
*/
#include "mbed.h"
#include "neopixel.h"
#include "LedArrayController.h"
#include <stdlib.h> /* srand, rand */
BusIn mColorWires(
p22, p19, p18, p21, p16, p15 // six color, two each, RGB
);
typedef union {
struct {
uint32_t green:2;
uint32_t blue:2;
uint32_t red:2;
uint32_t junk:26;
};
uint32_t value;
} tledColorWires;
BusIn mBlinkConfig(
p14, p13, p20, // three timing: indexes into mBlinkTiming
p30, p29 ); // two for blink type
Serial SerialToAudio(p9, p10); // tx, rx
BusIn mLedPatternConfig (p23, p35, p36);
// 000 001 010 011 100 101 110 111
uint8_t mLedPattern[] = { 0x01, 0xF0, 0x0F, 0xAA, 0x55, 0x0F, 0xF0, 0xFF };
char *mAudioPlaylist[] = {
"PBITEDUSTOGG\n" , // another one bites the dust
"PDANGW OGG\n" , // danger will robinson
"PHASTA OGG\n" , // hasta la vista baby
"PHELPME OGG\n" , // help me obiwan kenobi, you are my only hope
"PNODISA OGG\n" , // no disassembly
"PNOESCAPEOGG\n" , // there'll be no escape for the princess this time
"POMG OGG\n" , // Oh my god (bender)
"PPRESSUREOGG\n" , // simpsons bomb disposal robot
"PSTILLALIOGG\n" , // this was a triumph
"PLAUGH OGG\n" , // robo laugh
"PCOMPUTE OGG\n" , // does not compute
"PEMBEDDEDOGG\n" , // embedded.fm
};
int mNumAudioInPlaylist = 12;
void InitializePins(void);
void AllOneColorLeds(neopixel::Pixel * out, uint32_t index, uintptr_t color);
void OnChangeMode(neopixel::PixelArray *array);
neopixel::Pixel GetCurrentColor(uint32_t wireConfig);
void SetLeds(neopixel::Pixel * out, uint32_t index, uintptr_t wireConfig);
void InitializePins(void)
{
mColorWires.mode(PullUp);
mLedPatternConfig.mode(PullUp);
mBlinkConfig.mode(PullUp);
SerialToAudio.baud(9600);
}
void OnChangeMode(neopixel::PixelArray *array)
{
// all black, zap, then white
array->update(SetLeds, NLED, COLOR_BLACK);
SerialToAudio.printf("Q\n");
SerialToAudio.printf("q\n");
wait_ms(50);
// P and then the file name zap.ogg with no dot
SerialToAudio.printf("PZAP OGG\n");
wait_ms(350);
array->update(SetLeds, NLED, COLOR_WHITE);
wait_ms(100);
SerialToAudio.printf("Q\n");
SerialToAudio.printf("q\n");
wait_ms(500);
int audioListIndex = rand() % mNumAudioInPlaylist;
SerialToAudio.printf(mAudioPlaylist[audioListIndex]);
}
uint8_t MakeColorFromWires(uint32_t singleColorWireConfig)
{
uint8_t color;
if (singleColorWireConfig == 3u) {
color = 0xFF;
} else if (singleColorWireConfig == 0u) {
color = 0x00;
} else { /* one bit on */
color = 0x80;
}
return color;
}
void AllOneColorLeds(neopixel::Pixel * out, uint32_t index, uintptr_t color)
{
bool thisOneOn = false;
uint32_t indexMask = 1u << index;
indexMask &= mLedPattern[mLedPatternConfig];
if ( (color == COLOR_BLACK) || (color == COLOR_WHITE) )
{
thisOneOn = true;
}
if (indexMask) { // if this one set
thisOneOn = true;
}
if (thisOneOn)
{
out->red = (color >> 16) & 0xFF;
out->green = (color >> 8 ) & 0xFF;
out->blue = (color ) & 0xFF;
}
}
uint32_t GetCurrentColorU32(uint32_t wireConfig)
{
neopixel::Pixel pix;
uint32_t out;
pix = GetCurrentColor(wireConfig);
out = pix.blue + (pix.green << 8) + (pix.red << 16);
return out;
}
neopixel::Pixel GetCurrentColor(uint32_t wireConfig)
{
tledColorWires config;
neopixel::Pixel out;
config.value = wireConfig;
if ( (config.red == 0u) && (config.green == 0u) && (config.blue == 0u) ) {
out.red = 0x10u;
out.green = 0x10u;
out.blue = 0x10u;
} else {
out.red = MakeColorFromWires(config.red);
out.green = MakeColorFromWires(config.green);
out.blue = MakeColorFromWires(config.blue);
}
return out;
}
void SetLeds(neopixel::Pixel * out, uint32_t index, uintptr_t wireConfig)
{
bool thisOneOn = false;
uint32_t indexMask = 1u << index;
indexMask &= mLedPattern[mLedPatternConfig];
if (indexMask) { // if this one set
thisOneOn = true;
}
if (thisOneOn) {
*out = GetCurrentColor(wireConfig);
} else {
AllOneColorLeds(out, index, COLOR_BLACK);
}
}
int main()
{
uint32_t ledColorWires;
uint32_t ledPatternConfig;
uint32_t ledBlinkConfig;
bool change = false;
AnalogIn analog (p20);
srand(analog*65535*analog);
InitializePins();
neopixel::PixelArray mPixelArray(p5);
LedArrayController ledArrayController(&mBlinkConfig, &mPixelArray);
ledColorWires = mColorWires & mColorWires.mask();
ledPatternConfig = mLedPatternConfig & mLedPatternConfig.mask();
ledBlinkConfig = mBlinkConfig & mBlinkConfig.mask();
ledArrayController.OnChangeMode(GetCurrentColorU32(ledColorWires));
mPixelArray.update(SetLeds, NLED, ledColorWires);
while (1) {
if (
( ledColorWires != ( mColorWires & mColorWires.mask() ) ) ||
( ledPatternConfig != ( mLedPatternConfig & mLedPatternConfig.mask() ) ) ||
( ledBlinkConfig != ( mBlinkConfig & mBlinkConfig.mask() ) ) ){
change = true;
}
if (change) {
change = false;
ledArrayController.Stop();
OnChangeMode(&mPixelArray);
ledArrayController.OnChangeMode(GetCurrentColorU32(ledColorWires));
ledColorWires = mColorWires & mColorWires.mask();
ledPatternConfig = mLedPatternConfig & mLedPatternConfig.mask();
ledBlinkConfig = mBlinkConfig & mBlinkConfig.mask();
mPixelArray.update(SetLeds, NLED, ledColorWires);
}
wait_ms(10);
}
}