working demo, with iPhone support

Dependencies:   NeoPixels NeoStrip mbed

Fork of NeoPixels by Allen Wild

main.cpp

Committer:
zchen311
Date:
2014-04-25
Revision:
1:3b59b44884cd
Parent:
0:f38492690f0e
Child:
2:b322ea7290a5

File content as of revision 1:3b59b44884cd:

/*
 * Adafruit NeoPixel 8x8 matrix example
 *
 * This program displays a couple simple patterns on an 8x8 NeoPixel matrix.
 *
 * 3 buttons are used for DigitalIns, 2 control the brightness up and down,
 * and the third switches patterns
 */

#include "mbed.h"
#include "NeoStrip.h"
#include "gt.h"
#include "text.h"
#define N 128
#define PATTERNS 4
#include <string>
int hueToRGB(float h);
void pattern0();
void pattern1();
void pattern2();
void fillBlue();
void progressBar(bool);
int getIndex(int, int);
void putChar(int row, int col, char ch, int color);
void putString(std::string);
void loopAscii(int count);
void MarioBox();
void drawBox(int row);void emptyBox(int row);
void putCharV(int row, int col, char ch, int color);
// array of function pointers to the various patterns
//void (*patterns[])(void) = {&pattern0, &pattern1, &pattern2};

NeoStrip strip(p18, N);
DigitalIn b1(p20); // brightness up
DigitalIn b2(p19); // brightness down
DigitalIn b3(p21); // next pattern

// timer used for debugging
Timer timer;
int chars[128];
char ch = 'A';

int main()
{
	
	std::string emoji[9] = {"*_*", "^_^", "$_$", ">_<", "=_=", "+_=", ":)", ":(", ":3"};
	float bright = 0.2;	// 20% is plenty for indoor use
	strip.setBrightness(bright);	// set default brightness
	int count = 0;
	while (true)
	{
		timer.reset(); // use a timer to measure loop execution time for debugging purposes
		timer.start(); // for this application, the main loop takes approximately 3ms to run
progressBar(true);
wait(5);
progressBar(false);

//	fillBlue();

	// write character
//	MarioBox();
//	displayEmoji();
//	loopAscii(count);
//	ch+=2;
//	putString(emoji[count%9]);
//	count++;
	wait(2);
		timer.stop();
		// print loop time if b3 is pressed		
		wait_ms(10);
	}
}

// pattern0 displays a static image
void pattern0()
{
	fillBlue();
	// write character
	int color = 0xffff00;	
	putChar(0,0,'G',color);
	putChar(0,6,'O',color);		
	strip.setPixels(0, N, chars);
}

// display a shifting rainbow, all colors have maximum
// saturation and value, with evenly spaced hue
void pattern1()
{
	static float dh = 360.0 / N;
	static float x = 0;

	for (int i = 0; i < N; i++)
		strip.setPixel(i, hueToRGB((dh * i) - x));
	
	x += 1;
	if (x > 360)
		x = 0;
}



// Converts HSV to RGB with the given hue, assuming
// maximum saturation and value
int hueToRGB(float h)
{
	// lots of floating point magic from the internet and scratching my head
	float r, g, b;
	if (h > 360)
		h -= 360;
	if (h < 0)
		h += 360;
	int i = (int)(h / 60.0);
	float f = (h / 60.0) - i;
	float q = 1 - f;
	
	switch (i % 6)
	{
		case 0: r = 1; g = f; b = 0; break;
		case 1: r = q; g = 1; b = 0; break;
		case 2: r = 0; g = 1; b = f; break;
		case 3: r = 0; g = q; b = 1; break;
		case 4: r = f; g = 0; b = 1; break;
		case 5: r = 1; g = 0; b = q; break;
		default: r = 0; g = 0; b = 0; break;
	}
	
	// scale to integers and return the packed value
	uint8_t R = (uint8_t)(r * 255);
	uint8_t G = (uint8_t)(g * 255);
	uint8_t B = (uint8_t)(b * 255);

	return (R << 16) | (G << 8) | B;
}

void fillBlue(){
	for(int i = 0; i < N; i++){
		chars[i] = 0x122446;
	}	
}

int getIndex(int r, int c){
	if(c < 8){
		return (r * 8 + c);
	}else if(c > 15){
		return -1;		
	}
	else{
		return (64 + r * 8 + (c-8));
	}
}


void putChar(int row, int col, char ch, int color){
		for(int r = 0; r < 8; r++){
			for(int c = 0; c < 6; c++){
				if(fontdata_6x8[ch * 48 + r * 6 +c]){
					int idx = getIndex(row+r, col+c);
					if(idx != -1)
						chars[idx] = color;	
				}
			}
	}
}
void putCharV(int row, int col, char ch, int color){
		for(int r = 0; r < 8; r++){
			for(int c = 0; c < 6; c++){
				if(fontdata_6x8[ch * 48 + r * 6 +c]){
					int idx = (row + r) *8 +( col +c);
					if(idx != -1)
						chars[idx] = color;	
				}
			}
	}
}

void MarioBox(){
		int color = 0xffff00;
		int red = 0xff0000;
		
		drawBox(8);
		strip.setPixels(0, N, chars);
		strip.write();		
		wait(5);

		for(int i = 1; i < 3; i++){
			fillBlue();
			drawBox(8-i);
			strip.setPixels(0, N, chars);
			strip.write();		
			wait(0.3);
		}		
		for(int i = 0; i < 3; i++){
			fillBlue();
			drawBox(6 + i);
			strip.setPixels(0, N, chars);
			strip.write();		
			wait(0.3);
		}
		fillBlue();
		emptyBox(8);
		putChar(0,0,'0',color);
		strip.setPixels(0, N, chars);
		strip.write();
		wait(30);		
}
void putString(std::string str){
	int color = 0xffff00;
	for(int i = 0; i < str.length(); ++i){
		putChar(0,5*i,str[i], color);		
	}	
	strip.setPixels(0, N, chars);
	strip.write();

}

void loopAscii(int count){
	int color = 0xffff00;
	putChar(0,0,ch+count,color);
	putChar(0,6,ch+count+1,color);
	strip.setPixels(0, N, chars);
	strip.write();
}

void drawBox(int row){
	for(int i = 0; i < 64; ++i)
		chars[row*8 + i] = 0x000000;
	putCharV(row,0,'?',0xffff00);	
}
void emptyBox(int row){
	for(int i = 0; i < 64; ++i)
		chars[row*8 + i] = 0x000000;
}
void progressBar(bool up){
	int index;
	int init;
	int increment;
	int color;
	if(up == true){
		 init = 0;
		 increment = 1;
		 color = 0x122446;
	}else {
		 init = 15;
		 increment = -1;
		fillBlue();
		 color = 0x000000;
	}
	
	for(int x = 0; x < 16 ; x++){
		
		for (int j = 0; j < 8; j++){
			index = getIndex(j,init + increment * x);
			chars[index] = color;
		}
	strip.setPixels(0, N, chars);
	strip.write();
		wait(1);
	}
}