18,6 → 18,8 |
cube_data_ptr = data; |
cube_data_ptr->current_layer = 0; |
cube_data_ptr->rotation_counter = 0; |
cube_data_ptr->frame_state = IDLE; |
cube_data_ptr->frame_escape = 0; |
|
SFT_D = 0; |
SFT_S = 0; |
62,6 → 64,10 |
SPI1_Write(cube_data_ptr->GCS_WRITE[cube_data_ptr->current_layer], GCS_LAYER_SIZE, &Cube_GCS_Write_Callback); |
} |
|
//////////////////////// |
// Callback functions // |
//////////////////////// |
|
void Cube_DCS_Write_Callback(void) { |
// GSLAT must be >7ms after DCS write |
Delay_MS(7); |
101,6 → 107,10 |
? 0 : cube_data_ptr->current_layer + 1; |
} |
|
//////////////////////////// |
// Cube control functions // |
//////////////////////////// |
|
void Cube_Write_DCS(char BC) { |
XBLNK = 0; |
int i,j; |
431,6 → 441,9 |
} |
} |
|
/////////////////////////////// |
// Overlay control functions // |
/////////////////////////////// |
|
void Cube_Overlay_Clear(void) { |
int i,j; |
662,6 → 675,9 |
} |
} |
|
//////////////////////////// |
// Text control functions // |
//////////////////////////// |
|
void Cube_Text_Init(char *string, char length, int R, int G, int B) { |
// Ensure that the length of the string does not exceed the storage buffer |
715,4 → 731,73 |
} else { |
cube_data_ptr->string_line += 1; |
} |
} |
|
///////////////////////////////////////////// |
// Functions for processing streaming data // |
///////////////////////////////////////////// |
|
void Cube_Data_In(char c) { |
// Reset upon receiving the start char |
if (c == CUBE_START_CHAR) { |
cube_data_ptr->frame_length = 0; |
cube_data_ptr->frame_index = 0; |
cube_data_ptr->frame_checksum = 0; |
cube_data_ptr->frame_command = 0; |
cube_data_ptr->frame_state = READ_LENGTH_MSB; |
} else { |
// If the input is the escape char, XOR the next char received |
if (c == CUBE_ESCAPE_CHAR) { |
cube_data_ptr->frame_escape = 1; |
return; |
} |
// XOR the input char if needed |
if (cube_data_ptr->frame_escape) { |
c ^= CUBE_ESCAPE_XOR; |
cube_data_ptr->frame_escape = 0; |
} |
// Process data |
switch (cube_data_ptr->frame_state) { |
case READ_LENGTH_MSB: // Save MSB of length |
cube_data_ptr->frame_length |= (c << 8); |
cube_data_ptr->frame_state = READ_LENGTH_LSB; |
break; |
case READ_LENGTH_LSB: // Save LSB of length |
cube_data_ptr->frame_length |= c; |
cube_data_ptr->frame_state = READ_COMMAND; |
break; |
case READ_COMMAND: // Store the command byte |
cube_data_ptr->frame_checksum += c; |
cube_data_ptr->frame_command = c; |
cube_data_ptr->frame_state = READ_DATA; |
break; |
case READ_DATA: // Read the passed data into the buffer |
cube_data_ptr->frame_checksum += c; |
cube_data_ptr->frame_buffer[cube_data_ptr->frame_index] = c; |
cube_data_ptr->frame_index++; |
if (cube_data_ptr->frame_index == cube_data_ptr->frame_length) |
cube_data_ptr->frame_state = READ_CHECKSUM; |
break; |
case READ_CHECKSUM: // Process frame if checksum is valid |
if (0xFF - (cube_data_ptr->frame_checksum && 0xFF) == c) |
Cube_Data_In_Process_Frame(); |
cube_data_ptr->frame_state = IDLE; |
break; |
case IDLE: |
default: |
// Do nothing |
break; |
} |
} |
} |
|
void Cube_Data_In_Process_Frame(void) { |
char *frame = cube_data_ptr->frame_buffer; |
switch (cube_data_ptr->frame_command) { |
case CUBE_COMMAND_SET_PIXEL: |
Cube_Set_Pixel(frame[0], frame[1], frame[2], frame[3], frame[4], frame[5]); |
break; |
default: |
break; |
} |
} |