16,6 → 16,7 |
void Cube_Init(CUBE_DATA *data, char BC) { |
cube_data_ptr = data; |
cube_data_ptr->current_layer = 0; |
cube_data_ptr->rotation_counter = 0; |
|
SFT_D = 0; |
SFT_S = 0; |
92,10 → 93,6 |
} |
|
void Cube_Write_DCS(char BC) { |
// Ensure that the brightness isnt set too high |
if (BC > CUBE_MAX_BRIGHTNESS) |
BC = CUBE_MAX_BRIGHTNESS; |
|
XBLNK = 0; |
int i,j; |
// Write configuration data to the DC/BC/FC/UD registers |
198,4 → 195,140 |
cube_data_ptr->GCS[layer][var+8] = B >> 4; |
break; |
} |
} |
|
void Cube_Get_Pixel(int layer, int row, int column, int* R, int* G, int* B) { |
int var = row * GCS_REG_SIZE + (column / 2 * 9); |
switch (column % 2) { |
// Concatenate lower byte and upper byte of each color channel |
case 0: |
*R = cube_data_ptr->GCS[layer][var+0] | ((cube_data_ptr->GCS[layer][var+1] & 0x0F) << 8); |
*G = (cube_data_ptr->GCS[layer][var+1] >> 4) | (cube_data_ptr->GCS[layer][var+2] << 4); |
*B = cube_data_ptr->GCS[layer][var+3] | ((cube_data_ptr->GCS[layer][var+4] & 0x0F) << 8); |
break; |
case 1: |
*R = (cube_data_ptr->GCS[layer][var+4] >> 4) | (cube_data_ptr->GCS[layer][var+5] << 4); |
*G = cube_data_ptr->GCS[layer][var+6] | ((cube_data_ptr->GCS[layer][var+7] & 0x0F) << 8); |
*B = (cube_data_ptr->GCS[layer][var+7] >> 4) | (cube_data_ptr->GCS[layer][var+8] << 4); |
break; |
} |
} |
|
void Cube_Move_Pixel(int layer1, int row1, int column1, int layer2, int row2, int column2) { |
// Copies data from one pixel to another one |
// Note: destination pixel value is overwritten |
int prev_R, prev_G, prev_B; |
Cube_Get_Pixel(layer1, row1, column1, &prev_R, &prev_G, &prev_B); |
Cube_Set_Pixel(layer2, row2, column2, prev_R, prev_G, prev_B); |
} |
|
void Cube_Rotate_Shell(char shell) { |
// Shell is the layer to rotate, with the outermost being 0 |
int layer, origin_R, origin_G, origin_B;; |
for (layer = 0; layer < CUBE_LAYER_COUNT; layer++) { |
switch(shell) { |
case 0: |
// Rotate outermost layer |
Cube_Get_Pixel(layer, 0, 0, &origin_R, &origin_G, &origin_B); |
Cube_Move_Pixel(layer, 0, 1, layer, 0, 0); |
Cube_Move_Pixel(layer, 0, 2, layer, 0, 1); |
Cube_Move_Pixel(layer, 0, 3, layer, 0, 2); |
Cube_Move_Pixel(layer, 0, 4, layer, 0, 3); |
Cube_Move_Pixel(layer, 0, 5, layer, 0, 4); |
Cube_Move_Pixel(layer, 0, 6, layer, 0, 5); |
Cube_Move_Pixel(layer, 0, 7, layer, 0, 6); |
Cube_Move_Pixel(layer, 1, 7, layer, 0, 7); |
Cube_Move_Pixel(layer, 2, 7, layer, 1, 7); |
Cube_Move_Pixel(layer, 3, 7, layer, 2, 7); |
Cube_Move_Pixel(layer, 4, 7, layer, 3, 7); |
Cube_Move_Pixel(layer, 5, 7, layer, 4, 7); |
Cube_Move_Pixel(layer, 6, 7, layer, 5, 7); |
Cube_Move_Pixel(layer, 7, 7, layer, 6, 7); |
Cube_Move_Pixel(layer, 7, 6, layer, 7, 7); |
Cube_Move_Pixel(layer, 7, 5, layer, 7, 6); |
Cube_Move_Pixel(layer, 7, 4, layer, 7, 5); |
Cube_Move_Pixel(layer, 7, 3, layer, 7, 4); |
Cube_Move_Pixel(layer, 7, 2, layer, 7, 3); |
Cube_Move_Pixel(layer, 7, 1, layer, 7, 2); |
Cube_Move_Pixel(layer, 7, 0, layer, 7, 1); |
Cube_Move_Pixel(layer, 6, 0, layer, 7, 0); |
Cube_Move_Pixel(layer, 5, 0, layer, 6, 0); |
Cube_Move_Pixel(layer, 4, 0, layer, 5, 0); |
Cube_Move_Pixel(layer, 3, 0, layer, 4, 0); |
Cube_Move_Pixel(layer, 2, 0, layer, 3, 0); |
Cube_Move_Pixel(layer, 1, 0, layer, 2, 0); |
Cube_Set_Pixel(layer, 1, 0, origin_R, origin_G, origin_B); |
break; |
case 1: |
// Rotate second to outermost layer |
Cube_Get_Pixel(layer, 1, 1, &origin_R, &origin_G, &origin_B); |
Cube_Move_Pixel(layer, 1, 2, layer, 1, 1); |
Cube_Move_Pixel(layer, 1, 3, layer, 1, 2); |
Cube_Move_Pixel(layer, 1, 4, layer, 1, 3); |
Cube_Move_Pixel(layer, 1, 5, layer, 1, 4); |
Cube_Move_Pixel(layer, 1, 6, layer, 1, 5); |
Cube_Move_Pixel(layer, 2, 6, layer, 1, 6); |
Cube_Move_Pixel(layer, 3, 6, layer, 2, 6); |
Cube_Move_Pixel(layer, 4, 6, layer, 3, 6); |
Cube_Move_Pixel(layer, 5, 6, layer, 4, 6); |
Cube_Move_Pixel(layer, 6, 6, layer, 5, 6); |
Cube_Move_Pixel(layer, 6, 5, layer, 6, 6); |
Cube_Move_Pixel(layer, 6, 4, layer, 6, 5); |
Cube_Move_Pixel(layer, 6, 3, layer, 6, 4); |
Cube_Move_Pixel(layer, 6, 2, layer, 6, 3); |
Cube_Move_Pixel(layer, 6, 1, layer, 6, 2); |
Cube_Move_Pixel(layer, 5, 1, layer, 6, 1); |
Cube_Move_Pixel(layer, 4, 1, layer, 5, 1); |
Cube_Move_Pixel(layer, 3, 1, layer, 4, 1); |
Cube_Move_Pixel(layer, 2, 1, layer, 3, 1); |
Cube_Set_Pixel(layer, 2, 1, origin_R, origin_G, origin_B); |
break; |
case 2: |
// Rotate second to innermost layer |
Cube_Get_Pixel(layer, 2, 2, &origin_R, &origin_G, &origin_B); |
Cube_Move_Pixel(layer, 2, 3, layer, 2, 2); |
Cube_Move_Pixel(layer, 2, 4, layer, 2, 3); |
Cube_Move_Pixel(layer, 2, 5, layer, 2, 4); |
Cube_Move_Pixel(layer, 3, 5, layer, 2, 5); |
Cube_Move_Pixel(layer, 4, 5, layer, 3, 5); |
Cube_Move_Pixel(layer, 5, 5, layer, 4, 5); |
Cube_Move_Pixel(layer, 5, 4, layer, 5, 5); |
Cube_Move_Pixel(layer, 5, 3, layer, 5, 4); |
Cube_Move_Pixel(layer, 5, 2, layer, 5, 3); |
Cube_Move_Pixel(layer, 4, 2, layer, 5, 2); |
Cube_Move_Pixel(layer, 3, 2, layer, 4, 2); |
Cube_Set_Pixel(layer, 3, 2, origin_R, origin_G, origin_B); |
break; |
case 3: |
// Rotate innermost layer |
Cube_Get_Pixel(layer, 3, 3, &origin_R, &origin_G, &origin_B); |
Cube_Move_Pixel(layer, 3, 4, layer, 3, 3); |
Cube_Move_Pixel(layer, 4, 4, layer, 3, 4); |
Cube_Move_Pixel(layer, 4, 3, layer, 4, 4); |
Cube_Set_Pixel(layer, 4, 3, origin_R, origin_G, origin_B); |
break; |
} |
|
} |
} |
|
void Cube_Rotate(void) { |
// Rotate outermost layer |
Cube_Rotate_Shell(0); |
// Rotate second to outermost layer |
if ((cube_data_ptr->rotation_counter != 1) && (cube_data_ptr->rotation_counter != 5)) { |
Cube_Rotate_Shell(1); |
} |
// Rotate second to innermost layer |
if ((cube_data_ptr->rotation_counter != 0) && (cube_data_ptr->rotation_counter != 2) && |
(cube_data_ptr->rotation_counter != 4) && (cube_data_ptr->rotation_counter != 6)) { |
Cube_Rotate_Shell(2); |
} |
// Rotate innermost layer |
if ((cube_data_ptr->rotation_counter == 3) || (cube_data_ptr->rotation_counter == 7)) { |
Cube_Rotate_Shell(3); |
} |
|
cube_data_ptr->rotation_counter = (cube_data_ptr->rotation_counter == CUBE_ROTATIONS-1) |
? 0 : cube_data_ptr->rotation_counter + 1; |
} |