Subversion Repositories Code-Repo

Compare Revisions

Ignore whitespace Rev 209 → Rev 212

/PIC Stuff/Cerebot_32MX7_LED_Cube/CUBE.c
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;
}
}