update work (#6)
* Translate and extend getNeighborLED * Rotate function This is so stupid, but we felt pretty clever making it. Pls no haet * Fix led selection to be side independant would only rotate the first side of the cube before! * debrilliantized rotate function Keep it simple stupid * Math is unused * Add missing equal sign That could have screwed up some things dude * Delete semicolon creating error It was a misplaced semicolon * Update work, pair programming yeee
This commit is contained in:
		
							parent
							
								
									c59c35bafb
								
							
						
					
					
						commit
						4a5bf47fbc
					
				@ -32,9 +32,20 @@ byte ROTTODIR[6][6];
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Initializing mapping for directions
 | 
					// Initializing mapping for directions
 | 
				
			||||||
void initMap(void);
 | 
					void initMap(void);
 | 
				
			||||||
// Decodes side, column, row into n LED
 | 
					// Encodes n led into a LEDSelect
 | 
				
			||||||
int decodeLED(LEDSelect selection);
 | 
					 | 
				
			||||||
void encodeLED(int n, LEDSelect* Result);
 | 
					void encodeLED(int n, LEDSelect* Result);
 | 
				
			||||||
 | 
					// Decodes side, column, row into n LED
 | 
				
			||||||
 | 
					inline int decodeLED(LEDSelect selection);
 | 
				
			||||||
 | 
					// Compares two LEDSelects, returns true if equal, false if unequal
 | 
				
			||||||
 | 
					inline bool LEDSelectCmp(LEDSelect a, LEDSelect b);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Moves pixel on single screen, edits selection.
 | 
				
			||||||
 | 
					void forceMove(LEDSelect* selection, byte direction);
 | 
				
			||||||
 | 
					//Gets neighbor led with sky directions, nice for single screen movement, but can also handle cross screen.
 | 
				
			||||||
 | 
					void getNeighborLED(LEDSelect* origin, byte origin_dir, LEDSelect* Result);
 | 
				
			||||||
 | 
					// Gets neighbor led with set directions in reference to side 0, lets you move in one direction with one vector.
 | 
				
			||||||
 | 
					void getRotNeighborLED(LEDSelect* origin, byte rot, LEDSelect* Result);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
** Set Color
 | 
					** Set Color
 | 
				
			||||||
@ -45,18 +56,16 @@ void encodeLED(int n, LEDSelect* Result);
 | 
				
			|||||||
bool setColor(LEDSelect selection, CRGB color, CRGB* leds);
 | 
					bool setColor(LEDSelect selection, CRGB color, CRGB* leds);
 | 
				
			||||||
// Sets every color that isn't black
 | 
					// Sets every color that isn't black
 | 
				
			||||||
bool updateColors(LEDSelect selection, CRGB* leds);
 | 
					bool updateColors(LEDSelect selection, CRGB* leds);
 | 
				
			||||||
// Mirrors one side to every other side
 | 
					// Copies colors from one LEDSelect to another LEDSelect of the same size
 | 
				
			||||||
bool mirror(byte side, CRGB* leds);
 | 
					 | 
				
			||||||
//Prints large X in a given color
 | 
					 | 
				
			||||||
void printError(CRGB color, CRGB* leds);
 | 
					 | 
				
			||||||
//Gets neighbor led with sky directions, nice for single screen movement, but can also handle cross screen.
 | 
					 | 
				
			||||||
void getNeighborLED(LEDSelect* origin, byte origin_dir, LEDSelect* Result);
 | 
					 | 
				
			||||||
// Gets neighbor led with set directions in reference to side 0, lets you move in one direction with one vector.
 | 
					 | 
				
			||||||
void getRotNeighborLED(LEDSelect* origin, byte rot, LEDSelect* Result);
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
void translate(LEDSelect src, LEDSelect dst, CRGB* leds);
 | 
					void translate(LEDSelect src, LEDSelect dst, CRGB* leds);
 | 
				
			||||||
// Rotates a side, in given direction, 0 - Clockwise, 1 - Anticlockwise
 | 
					// Rotates a side, in given direction, 0 - Clockwise, 1 - Anticlockwise
 | 
				
			||||||
void rotate(byte side, bool dir, byte n, CRGB* leds);
 | 
					void rotate(byte side, bool dir, byte n, CRGB* leds);
 | 
				
			||||||
 | 
					// Mirrors one side to every other side
 | 
				
			||||||
 | 
					bool mirror(byte side, CRGB* leds);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//Prints large X in a given color
 | 
				
			||||||
 | 
					void printError(CRGB color, CRGB* leds);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void initMap(void)
 | 
					void initMap(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -132,13 +141,6 @@ void initMap(void)
 | 
				
			|||||||
	ROTTODIR[5][LEFT] = 255;
 | 
						ROTTODIR[5][LEFT] = 255;
 | 
				
			||||||
	ROTTODIR[5][CLOCKW] = WEST;
 | 
						ROTTODIR[5][CLOCKW] = WEST;
 | 
				
			||||||
	ROTTODIR[5][ACLOCKW] = EAST;
 | 
						ROTTODIR[5][ACLOCKW] = EAST;
 | 
				
			||||||
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int decodeLED(LEDSelect selection)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	return 9 * selection.side + 3 * selection.row + selection.column;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void encodeLED(int n, LEDSelect* Result)
 | 
					void encodeLED(int n, LEDSelect* Result)
 | 
				
			||||||
@ -148,6 +150,15 @@ void encodeLED(int n, LEDSelect* Result)
 | 
				
			|||||||
	Result->row = n % 9 % 3;
 | 
						Result->row = n % 9 % 3;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline int decodeLED(LEDSelect selection)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return 9 * selection.side + 3 * selection.row + selection.column;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline bool LEDSelectCmp(LEDSelect a, LEDSelect b)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return a.side != b.side || a.column !=b.column || a.row != b.row;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void forceMove(LEDSelect* selection, byte direction)
 | 
					void forceMove(LEDSelect* selection, byte direction)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -382,7 +393,10 @@ void rotate(byte side, bool direction, byte n, CRGB* leds)
 | 
				
			|||||||
bool setColor(LEDSelect selection, CRGB color, CRGB* leds)
 | 
					bool setColor(LEDSelect selection, CRGB color, CRGB* leds)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (selection.side == 255) {
 | 
						if (selection.side == 255) {
 | 
				
			||||||
		return false;
 | 
							for (byte n = 0; n < 9 * 6; n++) {
 | 
				
			||||||
 | 
								leds[n] = color;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return true;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if (selection.column == 255 && selection.row == 255) {
 | 
						if (selection.column == 255 && selection.row == 255) {
 | 
				
			||||||
		for (byte n = 0; n < 9; n++) {
 | 
							for (byte n = 0; n < 9; n++) {
 | 
				
			||||||
@ -411,7 +425,7 @@ bool setColor(LEDSelect selection, CRGB color, CRGB* leds)
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// remake? kind of an useless function at the moment
 | 
				
			||||||
bool updateColors(LEDSelect selection, CRGB color, CRGB* leds)
 | 
					bool updateColors(LEDSelect selection, CRGB color, CRGB* leds)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (selection.side == 255) {
 | 
						if (selection.side == 255) {
 | 
				
			||||||
@ -420,7 +434,7 @@ bool updateColors(LEDSelect selection, CRGB color, CRGB* leds)
 | 
				
			|||||||
	
 | 
						
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	if (selection.column == 255 && selection.row == 255) {
 | 
						if (selection.column == 255 && selection.row == 255) {
 | 
				
			||||||
		for (int n = 0; n < 9; n++) {
 | 
							for (byte n = 0; n < 9; n++) {
 | 
				
			||||||
			CRGB* led = &leds[selection.side * 9 + n];
 | 
								CRGB* led = &leds[selection.side * 9 + n];
 | 
				
			||||||
			if (*led != (CRGB) 0x000000) {
 | 
								if (*led != (CRGB) 0x000000) {
 | 
				
			||||||
				*led = color;
 | 
									*led = color;
 | 
				
			||||||
@ -429,7 +443,7 @@ bool updateColors(LEDSelect selection, CRGB color, CRGB* leds)
 | 
				
			|||||||
		return true;
 | 
							return true;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else if (selection.column == 255 && selection.row != 255) {
 | 
						else if (selection.column == 255 && selection.row != 255) {
 | 
				
			||||||
		for (int n = 0; n < 3; n++) {
 | 
							for (byte n = 0; n < 3; n++) {
 | 
				
			||||||
			CRGB* led = &leds[decodeLED({ selection.side, n, selection.row })];
 | 
								CRGB* led = &leds[decodeLED({ selection.side, n, selection.row })];
 | 
				
			||||||
			if (*led != (CRGB)0x000000) {
 | 
								if (*led != (CRGB)0x000000) {
 | 
				
			||||||
				*led = color;
 | 
									*led = color;
 | 
				
			||||||
@ -438,7 +452,7 @@ bool updateColors(LEDSelect selection, CRGB color, CRGB* leds)
 | 
				
			|||||||
		return true;
 | 
							return true;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else if (selection.column != 255 && selection.row == 255) {
 | 
						else if (selection.column != 255 && selection.row == 255) {
 | 
				
			||||||
		for (int n = 0; n < 3; n++) {
 | 
							for (byte n = 0; n < 3; n++) {
 | 
				
			||||||
			CRGB* led = &leds[decodeLED({ selection.side, selection.column, n })];
 | 
								CRGB* led = &leds[decodeLED({ selection.side, selection.column, n })];
 | 
				
			||||||
			if (*led != (CRGB) 0x000000) {
 | 
								if (*led != (CRGB) 0x000000) {
 | 
				
			||||||
				*led = color;
 | 
									*led = color;
 | 
				
			||||||
@ -458,13 +472,91 @@ bool updateColors(LEDSelect selection, CRGB color, CRGB* leds)
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void translate(LEDSelect src, LEDSelect dst, CRGB* leds){
 | 
				
			||||||
 | 
						byte side = src.side;
 | 
				
			||||||
 | 
						byte column = src.column;
 | 
				
			||||||
 | 
						byte row = src.row;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(column == 255 && row == 255 &&
 | 
				
			||||||
 | 
						   dst.column == 255 && dst.row == 255){
 | 
				
			||||||
 | 
							src.column = 0;
 | 
				
			||||||
 | 
							src.row = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							dst.column = 0;
 | 
				
			||||||
 | 
							dst.row = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for(int i = 0; i < 9; i++){
 | 
				
			||||||
 | 
								leds[decodeLED(dst) + i] = leds[decodeLED(src) + i];
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else if(column != 255 && row == 255 && 
 | 
				
			||||||
 | 
								dst.column != 255 && dst.row == 255){
 | 
				
			||||||
 | 
							src.row = 0;
 | 
				
			||||||
 | 
							dst.row = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for(int i = 0; i < 9; i += 3){
 | 
				
			||||||
 | 
								leds[decodeLED(dst) + i] = leds[decodeLED(src) + i];
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else if(column == 255 && row != 255 && dst.column == 255 && dst.row != 255){
 | 
				
			||||||
 | 
							src.column = 0;
 | 
				
			||||||
 | 
							dst.column = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for(int i = 0; i < 3; i++){
 | 
				
			||||||
 | 
								leds[decodeLED(dst) + i] = leds[decodeLED(src) + i];
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						leds[decodeLED(dst)] = leds[decodeLED(src)];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void rotate(byte side, bool direction, byte n, CRGB* leds)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int firstLED = decodeLED({side, 0, 0});
 | 
				
			||||||
 | 
						byte cyclus[8] = {0, 3, 6, 7, 8, 5, 2, 1};
 | 
				
			||||||
 | 
						for (byte i = 0; i < n; i++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (direction == 0) {
 | 
				
			||||||
 | 
								CRGB Saved = leds[cyclus[0] + firstLED];
 | 
				
			||||||
 | 
								for(byte j = 0; j < 7; j++) {
 | 
				
			||||||
 | 
									leds[cyclus[j] + firstLED] = leds[cyclus[j + 1] + firstLED]; 
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								leds[cyclus[7] + firstLED] = Saved;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else {
 | 
				
			||||||
 | 
								CRGB Saved = leds[cyclus[0] + firstLED];
 | 
				
			||||||
 | 
								for(byte j = 7; j > 0; j--) {
 | 
				
			||||||
 | 
									leds[cyclus[j] + firstLED] = leds[cyclus[j - 1] + firstLED]; 
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								leds[cyclus[1] + firstLED] = Saved;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void new_rotaterot(LEDSelect selection, byte dir, byte n, CRGB* leds)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 	for (byte i = 0; i < n; i++) {
 | 
				
			||||||
 | 
					 		LEDSelect head[2] = {selection, selection};
 | 
				
			||||||
 | 
						 	CRGB saved = leds[decodeLED(head[0])];
 | 
				
			||||||
 | 
						 	do {
 | 
				
			||||||
 | 
						 		getRotNeighborLED(&head[1], (dir > 3) ? 4 + !(dir - 4) : (dir + 2) % 4, &head[0]);
 | 
				
			||||||
 | 
						 		leds[decodeLED(head[1])] = leds[decodeLED(head[0])];
 | 
				
			||||||
 | 
						 	}
 | 
				
			||||||
 | 
						 	while (!LEDSelectCmp(head[0], selection));
 | 
				
			||||||
 | 
						 	leds[decodeLED(head[1])] = saved;
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool mirror(byte side, CRGB* leds)
 | 
					bool mirror(byte side, CRGB* leds)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/*TODO: figure out memory structure, 
 | 
						/*TODO: figure out memory structure, 
 | 
				
			||||||
		copy the nine leds to the the different memory parts, so it the text is displayed on all sides.
 | 
							copy the nine leds to the the different memory parts, so it the text is displayed on all sides.
 | 
				
			||||||
		should probably use some form of modulo
 | 
							should probably use some form of modulo
 | 
				
			||||||
	*/
 | 
						*/
 | 
				
			||||||
	for(int i = 0; i < sizeof(leds) / sizeof(CRGB); i+=9) {
 | 
						for(int i = 0; i < sizeof(leds) / sizeof(CRGB); i += 9) {
 | 
				
			||||||
		memcpy(&leds[i], &leds[decodeLED({side, 0, 0})], sizeof(CRGB) * 9);
 | 
							memcpy(&leds[i], &leds[decodeLED({side, 0, 0})], sizeof(CRGB) * 9);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -8,16 +8,27 @@
 | 
				
			|||||||
#define BLUE (CRGB) 0x0000FF
 | 
					#define BLUE (CRGB) 0x0000FF
 | 
				
			||||||
#define RED (CRGB) 0xFF0000
 | 
					#define RED (CRGB) 0xFF0000
 | 
				
			||||||
#define GREEN (CRGB) 0x00FF00
 | 
					#define GREEN (CRGB) 0x00FF00
 | 
				
			||||||
#define ORANGE (CRGB) 0xFF8C00
 | 
					#define ORANGE (CRGB) 0xFF7000
 | 
				
			||||||
#define WHITE (CRGB) 0xFFFFFF
 | 
					#define WHITE (CRGB) 0xFFFFFF
 | 
				
			||||||
#define YELLOW (CRGB) 0xFFFF00
 | 
					#define YELLOW (CRGB) 0xFFFF00
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CRGB leds[NUM_LEDS];
 | 
					CRGB leds[NUM_LEDS];
 | 
				
			||||||
CRGB solution[NUM_LEDS];
 | 
					CRGB solution[NUM_LEDS];
 | 
				
			||||||
 | 
					byte METAROTTODIR[6];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void rubixRot(byte side, bool dir);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void setup() {
 | 
					void setup() {
 | 
				
			||||||
  FastLED.addLeds<PL9823, DATA_PIN>(leds, NUM_LEDS);
 | 
					  FastLED.addLeds<PL9823, DATA_PIN>(leds, NUM_LEDS);
 | 
				
			||||||
  initMap();
 | 
					  initMap();
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  METAROTTODIR[0]=CLOCKW;
 | 
				
			||||||
 | 
					  METAROTTODIR[1]=UP;
 | 
				
			||||||
 | 
					  METAROTTODIR[2]=ACLOCKW;
 | 
				
			||||||
 | 
					  METAROTTODIR[3]=DOWN;
 | 
				
			||||||
 | 
					  METAROTTODIR[4]=LEFT;
 | 
				
			||||||
 | 
					  METAROTTODIR[5]=RIGHT;
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
  randomSeed(analogRead(0));
 | 
					  randomSeed(analogRead(0));
 | 
				
			||||||
  FastLED.clear();
 | 
					  FastLED.clear();
 | 
				
			||||||
  FastLED.show();
 | 
					  FastLED.show();
 | 
				
			||||||
@ -72,7 +83,29 @@ void setup() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  FastLED.show();
 | 
					  FastLED.show();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
void loop() {
 | 
					 | 
				
			||||||
  // put your main code here, to run repeatedly:
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void loop() {
 | 
				
			||||||
 | 
					  delay(300);
 | 
				
			||||||
 | 
					  rubixRot(random(0, 7), random(0, 1));
 | 
				
			||||||
 | 
					  if (memcmp(leds, solution, sizeof(CRGB) * NUM_LEDS) == 0) {
 | 
				
			||||||
 | 
					    while(true) {
 | 
				
			||||||
 | 
					      setColor({255, 255, 255}, (CRGB) 0x0, leds);
 | 
				
			||||||
 | 
					      delay(200);
 | 
				
			||||||
 | 
					      setColor({255, 255, 255}, GREEN, leds);
 | 
				
			||||||
 | 
					      delay(200);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void rubixRot(byte side, bool dir){
 | 
				
			||||||
 | 
					  rotate(side, dir, 2, leds);
 | 
				
			||||||
 | 
					  LEDSelect origin = {side, 0, 0};
 | 
				
			||||||
 | 
					  getNeighborLED(&origin, NORTH, &origin);
 | 
				
			||||||
 | 
					  if(dir == 0){
 | 
				
			||||||
 | 
					    new_rotaterot(origin, METAROTTODIR[side], 3, leds);
 | 
				
			||||||
 | 
					  }else{
 | 
				
			||||||
 | 
					    for(byte i = 0; i < 3; i++){
 | 
				
			||||||
 | 
					      rubixRot(side,0);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user