Subversion Repositories Code-Repo

Compare Revisions

Ignore whitespace Rev 214 → Rev 215

/PIC Stuff/Cerebot_32MX7_LED_Cube/CUBE.c
684,6 → 684,8
// Ensure that the length of the string does not exceed the storage buffer
if (length > CUBE_STRING_MAX_LENGTH) length = CUBE_STRING_MAX_LENGTH;
 
Cube_Overlay_Clear();
 
// Copy the passed data into the buffer
int i;
for (i = 0; i < length; i++)
745,64 → 747,98
cube_data_ptr->frame_index = 0;
cube_data_ptr->frame_checksum = 0;
cube_data_ptr->frame_command = 0;
cube_data_ptr->frame_escape = 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 IDLE:
// Reflect the character back to the transmitter
UART1_Write(&c, 1);
break;
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;
return;
}
// 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 IDLE:
// Reflect the character back to the transmitter
UART1_Write(&c, 1);
break;
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;
if (cube_data_ptr->frame_length == 1)
cube_data_ptr->frame_state = READ_CHECKSUM;
else
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 - 1)
cube_data_ptr->frame_state = READ_CHECKSUM;
break;
case READ_CHECKSUM: // Process frame if checksum is valid
cube_data_ptr->frame_checksum = 0xFF - cube_data_ptr->frame_checksum;
if (cube_data_ptr->frame_checksum == c) {
Cube_Data_In_Process_Frame();
}
cube_data_ptr->frame_state = IDLE;
break;
default:
break;
}
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 - 1)
cube_data_ptr->frame_state = READ_CHECKSUM;
break;
case READ_CHECKSUM: // Process frame if checksum is valid
cube_data_ptr->frame_checksum = 0xFF - cube_data_ptr->frame_checksum;
if (cube_data_ptr->frame_checksum == c) {
Cube_Data_In_Process_Frame();
}
cube_data_ptr->frame_state = IDLE;
cube_data_ptr->frame_index = 0;
cube_data_ptr->frame_length = 0;
break;
default:
break;
}
}
 
void Cube_Data_In_Process_Frame(void) {
// Here we process received frames depending on the command
char *frame = cube_data_ptr->frame_buffer;
switch (cube_data_ptr->frame_command) {
case CUBE_COMMAND_SET_BC:
TIMER5_Stop();
Delay_MS(1); // Need to wait for all SPI writes to complete
Cube_Write_DCS(frame[0]);
TIMER5_Start();
break;
case CUBE_COMMAND_CLEAR:
Cube_Clear();
break;
case CUBE_COMMAND_SET_PIXEL:
Cube_Set_Pixel(frame[0], frame[1], frame[2], frame[3], frame[4], frame[5]);
break;
case CUBE_COMMAND_SET_LAYER:
Cube_Data_Direct_Write(frame[0], &frame[1]);
break;
case CUBE_COMMAND_START_TEXT:
Cube_Text_Init(&frame[3], cube_data_ptr->frame_length - 4, frame[0], frame[1], frame[2]);
TIMER4_Start();
break;
case CUBE_COMMAND_STOP_TEXT:
TIMER4_Stop();
Cube_Overlay_Clear();
break;
default:
break;
}
}
 
void Cube_Data_Direct_Write(char layer, char *buffer) {
int i;
for (i = 0; i < GCS_LAYER_SIZE; i++) {
cube_data_ptr->GCS[layer][i] = buffer[i];
}
}
/PIC Stuff/Cerebot_32MX7_LED_Cube/CUBE.h
40,15 → 40,19
#define CUBE_STRING_MAX_LENGTH 32
 
// Data Streaming In Buffer Size
#define CUBE_FRAME_BUFFER_SIZE 128
#define CUBE_FRAME_BUFFER_SIZE 600
#define CUBE_START_CHAR 0x7E
#define CUBE_ESCAPE_CHAR 0x7D
#define CUBE_ESCAPE_XOR 0x20
 
// Data Streaming In Command Set
#define CUBE_COMMAND_SET_PIXEL 0x10 // Layer, Row, Column, R, G, B <-- frame layout
#define CUBE_COMMAND_SET_BC 0x0A // [Brightness Value]
#define CUBE_COMMAND_CLEAR 0x0B // (no data)
#define CUBE_COMMAND_SET_PIXEL 0x10 // [Layer, Row, Column, R, G, B]
#define CUBE_COMMAND_SET_LAYER 0x11 // [Layer, R1, G1, B1, R2, ...]
#define CUBE_COMMAND_START_TEXT 0x20 // [R, G, B, Char1, Char2, Char3, ...]
#define CUBE_COMMAND_STOP_TEXT 0x21 // (no data)
 
 
typedef enum {
IDLE,
READ_LENGTH_MSB,
115,6 → 119,7
// Data stream in control functions
void Cube_Data_In(char c);
void Cube_Data_In_Process_Frame(void);
void Cube_Data_Direct_Write(char layer, char *buffer);
 
#endif /* CUBE_H */
 
/PIC Stuff/Cerebot_32MX7_LED_Cube/SPI1.c
91,7 → 91,7
#endif
 
// Process SPI1 transmit flag
if (IFS0bits.SPI1TXIF) {
if (IFS0bits.SPI1TXIF && IEC0bits.SPI1TXIE) {
int i;
// Disable the transmit interrupt if all data has been sent
if (spi_data_ptr->buffer_out_len == 0) {
/PIC Stuff/Cerebot_32MX7_LED_Cube/UART1.c
5,6 → 5,17
 
static UART1_DATA *uart_data_ptr;
 
/* Note: BRGH values are different from PIC18!
*
* Baud Rate Calculation (BRGH = 0):
* Baud Rate = PerfBusFreq / (16 * (BRG + 1))
* BRG = PerfBusFreq / (16 * Baud Rate) - 1
*
* Baud Rate Calculation (BRGH = 1):
* Baud Rate = PerfBusFreq / (4 * (BRG + 1))
* BRG = PerfBusFreq / (4 * Baud Rate) - 1
*/
 
void UART1_Init(UART1_DATA *data, void (*rx_callback)(char)) {
uart_data_ptr = data;
uart_data_ptr->rx_callback = rx_callback;
19,7 → 30,7
U1MODE = 0x00008000; // UART enabled, BRGH = 0
U1STA = 0x00009400; // TX interrupt on buffer empty, RX interrupt on buffer not empty
U1BRG = 19; // Set baud rate to 256000 @ 80MHz
U1BRG = 42; // Set baud rate to 115200 @ 80MHz
IEC0SET = 0x0C000000; // Enable the RX and Error interrupts
 
INTEnableInterrupts();
75,7 → 86,7
}
 
// Process UART1 transmit flag
if (IFS0bits.U1TXIF) {
if (IFS0bits.U1TXIF && IEC0bits.U1TXIE) {
// Disable the transmit interrupt if all data has been sent
if (uart_data_ptr->buffer_out_ind == uart_data_ptr->buffer_out_len) {
IEC0CLR = 0x10000000;
/PIC Stuff/Cerebot_32MX7_LED_Cube/main.c
126,8 → 126,8
// Cube_Set_All(BLUE);
// Delay_MS(6000);
 
char start_text[] = "Cube Initialized\r\n";
UART1_Write(start_text, 18);
// char start_text[] = "Cube Initialized\r\n";
// UART1_Write(start_text, 18);
 
// Set the overlay text
// char text_string[] = "Welcome to the CCM Lab ";
/PIC Stuff/Cerebot_32MX7_LED_Cube/nbproject/Makefile-default.mk
179,12 → 179,12
ifeq ($(TYPE_IMAGE), DEBUG_RUN)
dist/${CND_CONF}/${IMAGE_TYPE}/Cerebot_32MX7_LED_Cube.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} dist/${CND_CONF}/${IMAGE_TYPE}
${MP_CC} $(MP_EXTRA_LD_PRE) -mdebugger -D__MPLAB_DEBUGGER_PK3=1 -mprocessor=$(MP_PROCESSOR_OPTION) -o dist/${CND_CONF}/${IMAGE_TYPE}/Cerebot_32MX7_LED_Cube.${IMAGE_TYPE}.${OUTPUT_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} -Wl,--defsym=__MPLAB_BUILD=1$(MP_EXTRA_LD_POST)$(MP_LINKER_FILE_OPTION),--defsym=__ICD2RAM=1,--defsym=__MPLAB_DEBUG=1,--defsym=__DEBUG=1,--defsym=__MPLAB_DEBUGGER_PK3=1
${MP_CC} $(MP_EXTRA_LD_PRE) -mdebugger -D__MPLAB_DEBUGGER_PK3=1 -mprocessor=$(MP_PROCESSOR_OPTION) -o dist/${CND_CONF}/${IMAGE_TYPE}/Cerebot_32MX7_LED_Cube.${IMAGE_TYPE}.${OUTPUT_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} -Wl,--defsym=__MPLAB_BUILD=1$(MP_EXTRA_LD_POST)$(MP_LINKER_FILE_OPTION),--defsym=__ICD2RAM=1,--defsym=__MPLAB_DEBUG=1,--defsym=__DEBUG=1,--defsym=__MPLAB_DEBUGGER_PK3=1,--report-mem
else
dist/${CND_CONF}/${IMAGE_TYPE}/Cerebot_32MX7_LED_Cube.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk
@${MKDIR} dist/${CND_CONF}/${IMAGE_TYPE}
${MP_CC} $(MP_EXTRA_LD_PRE) -mprocessor=$(MP_PROCESSOR_OPTION) -o dist/${CND_CONF}/${IMAGE_TYPE}/Cerebot_32MX7_LED_Cube.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} -Wl,--defsym=__MPLAB_BUILD=1$(MP_EXTRA_LD_POST)$(MP_LINKER_FILE_OPTION)
${MP_CC} $(MP_EXTRA_LD_PRE) -mprocessor=$(MP_PROCESSOR_OPTION) -o dist/${CND_CONF}/${IMAGE_TYPE}/Cerebot_32MX7_LED_Cube.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} -Wl,--defsym=__MPLAB_BUILD=1$(MP_EXTRA_LD_POST)$(MP_LINKER_FILE_OPTION),--report-mem
${MP_CC_DIR}\\xc32-bin2hex dist/${CND_CONF}/${IMAGE_TYPE}/Cerebot_32MX7_LED_Cube.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX}
endif
 
/PIC Stuff/Cerebot_32MX7_LED_Cube/nbproject/Makefile-genesis.properties
1,5 → 1,5
#
#Wed Aug 07 21:27:20 EDT 2013
#Sat Aug 10 23:28:16 EDT 2013
default.com-microchip-mplab-nbide-toolchainXC32-XC32LanguageToolchain.md5=6b4fa04caf3910c7c3a4666b1aea8c5c
default.languagetoolchain.dir=C\:\\Program Files (x86)\\Microchip\\xc32\\v1.20\\bin
com-microchip-mplab-nbide-embedded-makeproject-MakeProject.md5=415494acd195d89b2f6d7a36797a5ab4
/PIC Stuff/Cerebot_32MX7_LED_Cube/nbproject/configurations.xml
124,7 → 124,7
<property key="optimization-level" value=""/>
<property key="preprocessor-macros" value=""/>
<property key="remove-unused-sections" value="false"/>
<property key="report-memory-usage" value="false"/>
<property key="report-memory-usage" value="true"/>
<property key="stack-size" value=""/>
<property key="symbol-stripping" value=""/>
<property key="trace-symbols" value=""/>