| 199 |
Kevin |
1 |
#ifndef CUBE_H
|
|
|
2 |
#define CUBE_H
|
|
|
3 |
|
| 212 |
Kevin |
4 |
// Cube Parameters
|
| 199 |
Kevin |
5 |
#define CUBE_ROW_COUNT 8
|
|
|
6 |
#define CUBE_COLUMN_COUNT 8
|
|
|
7 |
#define CUBE_LAYER_COUNT 8
|
| 237 |
Kevin |
8 |
#define CUBE_PIXELS 512
|
| 205 |
Kevin |
9 |
#define CUBE_ROTATIONS 7
|
| 199 |
Kevin |
10 |
|
|
|
11 |
#define GCS_REG_SIZE 36
|
|
|
12 |
#define GCS_LAYER_SIZE (GCS_REG_SIZE*CUBE_ROW_COUNT)
|
|
|
13 |
|
| 212 |
Kevin |
14 |
// Color Definitions
|
| 264 |
Kevin |
15 |
#define CLEAR 0x000,0x000,0x000
|
|
|
16 |
#define RED 0x0FF,0x000,0x000
|
| 276 |
Kevin |
17 |
#define ORANGE 0x0FF,0x020,0x000
|
|
|
18 |
#define YELLOW 0x0FF,0x060,0x000
|
| 264 |
Kevin |
19 |
#define GREEN 0x000,0x0FF,0x000
|
|
|
20 |
#define TEAL 0x000,0x0FF,0x040
|
|
|
21 |
#define BLUE 0x000,0x000,0x0FF
|
|
|
22 |
#define PURPLE 0x0FF,0x000,0x0FF
|
| 241 |
Kevin |
23 |
#define WHITE 0x0FF,0x0FF,0x0FF
|
| 199 |
Kevin |
24 |
|
| 212 |
Kevin |
25 |
// Control Pin Declarations
|
| 269 |
Kevin |
26 |
#define DCSIN_TRIS TRISDbits.TRISD3
|
|
|
27 |
#define DCSCK_TRIS TRISDbits.TRISD12
|
| 199 |
Kevin |
28 |
|
| 269 |
Kevin |
29 |
#define DCSIN LATDbits.LATD3
|
|
|
30 |
#define DCSCK LATDbits.LATD12
|
| 199 |
Kevin |
31 |
|
| 269 |
Kevin |
32 |
#define SFT_R_TRIS TRISBbits.TRISB15
|
|
|
33 |
#define SFT_K_TRIS TRISDbits.TRISD5
|
|
|
34 |
#define SFT_S_TRIS TRISDbits.TRISD4
|
|
|
35 |
#define SFT_D_TRIS TRISBbits.TRISB14
|
|
|
36 |
|
|
|
37 |
#define SFT_R LATBbits.LATB15
|
|
|
38 |
#define SFT_K LATDbits.LATD5
|
|
|
39 |
#define SFT_S LATDbits.LATD4
|
|
|
40 |
#define SFT_D LATBbits.LATB14
|
|
|
41 |
|
| 199 |
Kevin |
42 |
#define GSLAT_TRIS TRISDbits.TRISD9
|
|
|
43 |
#define XBLNK_TRIS TRISDbits.TRISD2
|
|
|
44 |
|
| 268 |
Kevin |
45 |
#define GSLAT LATDbits.LATD9
|
|
|
46 |
#define XBLNK LATDbits.LATD2
|
| 199 |
Kevin |
47 |
|
| 212 |
Kevin |
48 |
// String Overlay Buffer Size
|
| 264 |
Kevin |
49 |
#define CUBE_STRING_MAX_LENGTH 255
|
| 212 |
Kevin |
50 |
|
|
|
51 |
// Data Streaming In Buffer Size
|
| 216 |
Kevin |
52 |
#define CUBE_FRAME_BUFFER_SIZE 3000
|
| 212 |
Kevin |
53 |
#define CUBE_START_CHAR 0x7E
|
|
|
54 |
#define CUBE_ESCAPE_CHAR 0x7D
|
|
|
55 |
#define CUBE_ESCAPE_XOR 0x20
|
|
|
56 |
|
|
|
57 |
// Data Streaming In Command Set
|
| 215 |
Kevin |
58 |
#define CUBE_COMMAND_SET_BC 0x0A // [Brightness Value]
|
|
|
59 |
#define CUBE_COMMAND_CLEAR 0x0B // (no data)
|
|
|
60 |
#define CUBE_COMMAND_SET_PIXEL 0x10 // [Layer, Row, Column, R, G, B]
|
| 216 |
Kevin |
61 |
#define CUBE_COMMAND_SET_ALL 0x11 // [R1, G1, B1, R2, ...]
|
| 215 |
Kevin |
62 |
#define CUBE_COMMAND_START_TEXT 0x20 // [R, G, B, Char1, Char2, Char3, ...]
|
|
|
63 |
#define CUBE_COMMAND_STOP_TEXT 0x21 // (no data)
|
| 212 |
Kevin |
64 |
|
| 264 |
Kevin |
65 |
// Ethernet Op-Codes
|
|
|
66 |
#define CUBE_ETH_RESET 0x01
|
|
|
67 |
#define CUBE_EHT_IDLE 0x02
|
|
|
68 |
#define CUBE_ETH_CLEAR 0x0A
|
|
|
69 |
#define CUBE_ETH_DCS 0x0B
|
|
|
70 |
#define CUBE_ETH_ROTATE 0x0C
|
|
|
71 |
#define CUBE_ETH_ROTATE_LAYER 0x0D
|
|
|
72 |
#define CUBE_ETH_WRITE_ALL 0x10
|
|
|
73 |
#define CUBE_ETH_WRITE_PIXEL 0x11
|
|
|
74 |
#define CUBE_ETH_WRITE_CHANNEL 0x12
|
| 266 |
Kevin |
75 |
#define CUBE_ETH_WRITE_TEXT_SCROLL 0x20
|
|
|
76 |
#define CUBE_ETH_WRITE_TEXT_STATIC 0x21
|
|
|
77 |
#define CUBE_EHT_WRITE_TEXT_INSERT 0x22
|
| 264 |
Kevin |
78 |
#define CUBE_ETH_WATERFALL 0x30
|
|
|
79 |
#define CUBE_ETH_SPHERE 0x31
|
|
|
80 |
|
| 212 |
Kevin |
81 |
typedef enum {
|
|
|
82 |
IDLE,
|
|
|
83 |
READ_LENGTH_MSB,
|
|
|
84 |
READ_LENGTH_LSB,
|
|
|
85 |
READ_COMMAND,
|
|
|
86 |
READ_DATA,
|
|
|
87 |
READ_CHECKSUM
|
|
|
88 |
} PROCESS_STATE;
|
|
|
89 |
|
| 199 |
Kevin |
90 |
typedef struct {
|
| 212 |
Kevin |
91 |
// Variables for base cube
|
| 231 |
Kevin |
92 |
uint8_t GCS[CUBE_LAYER_COUNT][GCS_LAYER_SIZE];
|
|
|
93 |
uint8_t GCS_OVERLAY[CUBE_LAYER_COUNT][GCS_LAYER_SIZE];
|
|
|
94 |
uint8_t GCS_WRITE[CUBE_LAYER_COUNT][GCS_LAYER_SIZE];
|
|
|
95 |
uint8_t current_layer;
|
|
|
96 |
uint8_t rotation_counter;
|
| 206 |
Kevin |
97 |
|
| 212 |
Kevin |
98 |
// Variables for the scrolling text
|
| 231 |
Kevin |
99 |
uint8_t string[CUBE_STRING_MAX_LENGTH];
|
|
|
100 |
uint8_t string_length;
|
|
|
101 |
uint8_t string_index;
|
|
|
102 |
uint8_t string_line;
|
|
|
103 |
uint16_t string_R, string_G, string_B;
|
| 212 |
Kevin |
104 |
|
|
|
105 |
// Variables for input frame data
|
|
|
106 |
PROCESS_STATE frame_state;
|
| 231 |
Kevin |
107 |
uint8_t frame_buffer[CUBE_FRAME_BUFFER_SIZE];
|
|
|
108 |
uint8_t frame_checksum;
|
|
|
109 |
uint32_t frame_length;
|
|
|
110 |
uint32_t frame_index;
|
|
|
111 |
uint32_t frame_command;
|
|
|
112 |
uint32_t frame_escape;
|
| 199 |
Kevin |
113 |
} CUBE_DATA;
|
|
|
114 |
|
| 231 |
Kevin |
115 |
void Cube_Init(CUBE_DATA *data, uint8_t BC);
|
| 199 |
Kevin |
116 |
void Cube_Timer_Interrupt(void);
|
|
|
117 |
|
|
|
118 |
// Callbacks on completion of DCS/GCS writes
|
|
|
119 |
void Cube_DCS_Write_Callback(void);
|
|
|
120 |
void Cube_GCS_Write_Callback(void);
|
|
|
121 |
|
|
|
122 |
// Cube control functions
|
| 231 |
Kevin |
123 |
void Cube_Write_DCS(uint8_t BC);
|
| 199 |
Kevin |
124 |
void Cube_Clear(void);
|
| 231 |
Kevin |
125 |
void Cube_Set_All(uint16_t R, uint16_t G, uint16_t B);
|
|
|
126 |
void Cube_Set_Layer(uint8_t layer, uint16_t R, uint16_t G, uint16_t B);
|
| 264 |
Kevin |
127 |
void Cube_Set_Row(uint8_t row, uint16_t R, uint16_t G, uint16_t B);
|
|
|
128 |
void Cube_Set_Column(uint8_t column, uint16_t R, uint16_t G, uint16_t B);
|
| 231 |
Kevin |
129 |
void Cube_Set_Pixel(uint8_t layer, uint8_t row, uint8_t column, uint16_t R, uint16_t G, uint16_t B);
|
|
|
130 |
void Cube_Get_Pixel(uint8_t layer, uint8_t row, uint8_t column, uint16_t* R, uint16_t* G, uint16_t* B);
|
|
|
131 |
void Cube_Move_Pixel(uint8_t layer1, uint8_t row1, uint8_t column1, uint8_t layer2, uint8_t row2, uint8_t column2);
|
| 264 |
Kevin |
132 |
void Cube_Set_Sphere(uint8_t layer, uint8_t R, uint8_t G, uint8_t B);
|
|
|
133 |
void Cube_Set_Shell(uint8_t layer, uint8_t R, uint8_t G, uint8_t B);
|
| 231 |
Kevin |
134 |
void Cube_Rotate_Shell(uint8_t shell, uint8_t direction);
|
|
|
135 |
void Cube_Rotate(uint8_t direction);
|
| 264 |
Kevin |
136 |
void Cube_Shift_Row(uint8_t direction);
|
| 205 |
Kevin |
137 |
|
| 264 |
Kevin |
138 |
void Cube_Shift_Waterfall(uint8_t *values);
|
|
|
139 |
void Cube_Shift_Waterfall2(uint8_t *values);
|
|
|
140 |
|
| 212 |
Kevin |
141 |
// Overlay control functions
|
| 206 |
Kevin |
142 |
void Cube_Overlay_Clear(void);
|
| 231 |
Kevin |
143 |
void Cube_Overlay_Set_Pixel(uint8_t layer, uint8_t row, uint8_t column, uint16_t R, uint16_t G, uint16_t B);
|
|
|
144 |
void Cube_Overlay_Get_Pixel(uint8_t layer, uint8_t row, uint8_t column, uint16_t* R, uint16_t* G, uint16_t* B);
|
|
|
145 |
void Cube_Overlay_Move_Pixel(uint8_t layer1, uint8_t row1, uint8_t column1, uint8_t layer2, uint8_t row2, uint8_t column2);
|
|
|
146 |
void Cube_Overlay_Rotate_Shell(uint8_t shell, uint8_t direction);
|
| 205 |
Kevin |
147 |
|
| 212 |
Kevin |
148 |
// Text control functions
|
| 231 |
Kevin |
149 |
void Cube_Text_Init(uint8_t *string, uint8_t length, uint16_t R, uint16_t G, uint16_t B);
|
| 266 |
Kevin |
150 |
void Cube_Text_Update(void);
|
| 268 |
Kevin |
151 |
void Cube_Text_Insert(uint8_t c, uint16_t R, uint16_t G, uint16_t B, uint16_t delay);
|
|
|
152 |
void Cube_Text_Single_Char_Interupt(void);
|
| 206 |
Kevin |
153 |
void Cube_Text_Interrupt(void);
|
|
|
154 |
|
| 212 |
Kevin |
155 |
// Data stream in control functions
|
| 263 |
Kevin |
156 |
// UART functions
|
| 231 |
Kevin |
157 |
void Cube_Data_In(uint8_t c);
|
| 212 |
Kevin |
158 |
void Cube_Data_In_Process_Frame(void);
|
| 231 |
Kevin |
159 |
void Cube_Data_Direct_Write_All(uint8_t *buffer);
|
| 263 |
Kevin |
160 |
// Ethernet functions
|
| 255 |
Kevin |
161 |
void Cube_Ethernet_Frame_In(void);
|
| 212 |
Kevin |
162 |
|
| 199 |
Kevin |
163 |
#endif /* CUBE_H */
|
|
|
164 |
|