Subversion Repositories Code-Repo

Rev

Rev 205 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 205 Rev 206
Line 1... Line 1...
1
#include <xc.h>
1
#include <xc.h>
2
#include <plib.h>
2
#include <plib.h>
3
#include "defines.h"
3
#include "defines.h"
4
#include "CUBE.h"
4
#include "CUBE.h"
5
#include "SPI1.h"
5
#include "SPI1.h"
-
 
6
#include "glcdfont.h"
6
 
7
 
7
static CUBE_DATA *cube_data_ptr;
8
static CUBE_DATA *cube_data_ptr;
8
 
9
 
9
inline void Cube_Delay() {
10
inline void Cube_Delay() {
10
    // Small delay to ensure that latch speeds are < 30Mhz
11
    // Small delay to ensure that latch speeds are < 30Mhz
Line 44... Line 45...
44
    Cube_Delay();
45
    Cube_Delay();
45
    SFT_R = 1;
46
    SFT_R = 1;
46
 
47
 
47
    Cube_Write_DCS(BC);
48
    Cube_Write_DCS(BC);
48
    Cube_Clear();
49
    Cube_Clear();
-
 
50
    Cube_Overlay_Clear();
49
}
51
}
50
 
52
 
51
void Cube_Timer_Interrupt(void) {
53
void Cube_Timer_Interrupt(void) {
-
 
54
    // OR values in the overlay array with the display array
-
 
55
    int i,j;
-
 
56
    for (i = 0; i < CUBE_LAYER_COUNT; i++) {
-
 
57
        for (j = 0; j < GCS_LAYER_SIZE; j++) {
-
 
58
            cube_data_ptr->GCS_WRITE[i][j] = cube_data_ptr->GCS[i][j] | cube_data_ptr->GCS_OVERLAY[i][j];
-
 
59
        }
-
 
60
    }
52
    // Write to the GCS register
61
    // Write to the GCS register
53
    SPI1_Write(cube_data_ptr->GCS[cube_data_ptr->current_layer], GCS_LAYER_SIZE, &Cube_GCS_Write_Callback);
62
    SPI1_Write(cube_data_ptr->GCS_WRITE[cube_data_ptr->current_layer], GCS_LAYER_SIZE, &Cube_GCS_Write_Callback);
54
}
63
}
55
 
64
 
56
void Cube_DCS_Write_Callback(void) {
65
void Cube_DCS_Write_Callback(void) {
57
    // GSLAT must be >7ms after DCS write
66
    // GSLAT must be >7ms after DCS write
58
    Delay_MS(7);
67
    Delay_MS(7);
Line 213... Line 222...
213
            break;
222
            break;
214
    }
223
    }
215
}
224
}
216
 
225
 
217
void Cube_Move_Pixel(int layer1, int row1, int column1, int layer2, int row2, int column2) {
226
void Cube_Move_Pixel(int layer1, int row1, int column1, int layer2, int row2, int column2) {
218
    // Copies data from one pixel to another one
227
    // Copies data from pixel 1 to pixel 2
219
    // Note: destination pixel value is overwritten
228
    // Note: destination pixel value is overwritten
220
    int prev_R, prev_G, prev_B;
229
    int prev_R, prev_G, prev_B;
221
    Cube_Get_Pixel(layer1, row1, column1, &prev_R, &prev_G, &prev_B);
230
    Cube_Get_Pixel(layer1, row1, column1, &prev_R, &prev_G, &prev_B);
222
    Cube_Set_Pixel(layer2, row2, column2, prev_R, prev_G, prev_B);
231
    Cube_Set_Pixel(layer2, row2, column2, prev_R, prev_G, prev_B);
223
}
232
}
224
 
233
 
225
void Cube_Rotate_Shell(char shell) {
234
void Cube_Rotate_Shell(char shell, char direction) {
226
    // Shell is the layer to rotate, with the outermost being 0
235
    // Shell is the layer to rotate, with the outermost being 0
227
    int layer, origin_R, origin_G, origin_B;;
236
    int layer, origin_R, origin_G, origin_B;;
228
    for (layer = 0; layer < CUBE_LAYER_COUNT; layer++) {
237
    for (layer = 0; layer < CUBE_LAYER_COUNT; layer++) {
229
        switch(shell) {
238
        if (direction) {
230
            case 0:
239
            switch(shell) {
231
                // Rotate outermost layer
240
                case 0:
232
                Cube_Get_Pixel(layer, 0, 0, &origin_R, &origin_G, &origin_B);
241
                    // Rotate outermost layer
233
                Cube_Move_Pixel(layer, 0, 1, layer, 0, 0);
242
                    Cube_Get_Pixel(layer, 0, 0, &origin_R, &origin_G, &origin_B);
234
                Cube_Move_Pixel(layer, 0, 2, layer, 0, 1);
243
                    Cube_Move_Pixel(layer, 0, 1, layer, 0, 0);
235
                Cube_Move_Pixel(layer, 0, 3, layer, 0, 2);
244
                    Cube_Move_Pixel(layer, 0, 2, layer, 0, 1);
236
                Cube_Move_Pixel(layer, 0, 4, layer, 0, 3);
245
                    Cube_Move_Pixel(layer, 0, 3, layer, 0, 2);
237
                Cube_Move_Pixel(layer, 0, 5, layer, 0, 4);
246
                    Cube_Move_Pixel(layer, 0, 4, layer, 0, 3);
238
                Cube_Move_Pixel(layer, 0, 6, layer, 0, 5);
247
                    Cube_Move_Pixel(layer, 0, 5, layer, 0, 4);
239
                Cube_Move_Pixel(layer, 0, 7, layer, 0, 6);
248
                    Cube_Move_Pixel(layer, 0, 6, layer, 0, 5);
240
                Cube_Move_Pixel(layer, 1, 7, layer, 0, 7);
249
                    Cube_Move_Pixel(layer, 0, 7, layer, 0, 6);
241
                Cube_Move_Pixel(layer, 2, 7, layer, 1, 7);
250
                    Cube_Move_Pixel(layer, 1, 7, layer, 0, 7);
242
                Cube_Move_Pixel(layer, 3, 7, layer, 2, 7);
251
                    Cube_Move_Pixel(layer, 2, 7, layer, 1, 7);
243
                Cube_Move_Pixel(layer, 4, 7, layer, 3, 7);
252
                    Cube_Move_Pixel(layer, 3, 7, layer, 2, 7);
244
                Cube_Move_Pixel(layer, 5, 7, layer, 4, 7);
253
                    Cube_Move_Pixel(layer, 4, 7, layer, 3, 7);
245
                Cube_Move_Pixel(layer, 6, 7, layer, 5, 7);
254
                    Cube_Move_Pixel(layer, 5, 7, layer, 4, 7);
246
                Cube_Move_Pixel(layer, 7, 7, layer, 6, 7);
255
                    Cube_Move_Pixel(layer, 6, 7, layer, 5, 7);
247
                Cube_Move_Pixel(layer, 7, 6, layer, 7, 7);
256
                    Cube_Move_Pixel(layer, 7, 7, layer, 6, 7);
248
                Cube_Move_Pixel(layer, 7, 5, layer, 7, 6);
257
                    Cube_Move_Pixel(layer, 7, 6, layer, 7, 7);
249
                Cube_Move_Pixel(layer, 7, 4, layer, 7, 5);
258
                    Cube_Move_Pixel(layer, 7, 5, layer, 7, 6);
250
                Cube_Move_Pixel(layer, 7, 3, layer, 7, 4);
259
                    Cube_Move_Pixel(layer, 7, 4, layer, 7, 5);
251
                Cube_Move_Pixel(layer, 7, 2, layer, 7, 3);
260
                    Cube_Move_Pixel(layer, 7, 3, layer, 7, 4);
252
                Cube_Move_Pixel(layer, 7, 1, layer, 7, 2);
261
                    Cube_Move_Pixel(layer, 7, 2, layer, 7, 3);
253
                Cube_Move_Pixel(layer, 7, 0, layer, 7, 1);
262
                    Cube_Move_Pixel(layer, 7, 1, layer, 7, 2);
254
                Cube_Move_Pixel(layer, 6, 0, layer, 7, 0);
263
                    Cube_Move_Pixel(layer, 7, 0, layer, 7, 1);
255
                Cube_Move_Pixel(layer, 5, 0, layer, 6, 0);
264
                    Cube_Move_Pixel(layer, 6, 0, layer, 7, 0);
256
                Cube_Move_Pixel(layer, 4, 0, layer, 5, 0);
265
                    Cube_Move_Pixel(layer, 5, 0, layer, 6, 0);
257
                Cube_Move_Pixel(layer, 3, 0, layer, 4, 0);
266
                    Cube_Move_Pixel(layer, 4, 0, layer, 5, 0);
258
                Cube_Move_Pixel(layer, 2, 0, layer, 3, 0);
267
                    Cube_Move_Pixel(layer, 3, 0, layer, 4, 0);
259
                Cube_Move_Pixel(layer, 1, 0, layer, 2, 0);
268
                    Cube_Move_Pixel(layer, 2, 0, layer, 3, 0);
260
                Cube_Set_Pixel(layer, 1, 0, origin_R, origin_G, origin_B);
269
                    Cube_Move_Pixel(layer, 1, 0, layer, 2, 0);
261
                break;
270
                    Cube_Set_Pixel(layer, 1, 0, origin_R, origin_G, origin_B);
262
            case 1:
271
                    break;
263
                // Rotate second to outermost layer
272
                case 1:
264
                Cube_Get_Pixel(layer, 1, 1, &origin_R, &origin_G, &origin_B);
273
                    // Rotate second to outermost layer
265
                Cube_Move_Pixel(layer, 1, 2, layer, 1, 1);
274
                    Cube_Get_Pixel(layer, 1, 1, &origin_R, &origin_G, &origin_B);
266
                Cube_Move_Pixel(layer, 1, 3, layer, 1, 2);
275
                    Cube_Move_Pixel(layer, 1, 2, layer, 1, 1);
267
                Cube_Move_Pixel(layer, 1, 4, layer, 1, 3);
276
                    Cube_Move_Pixel(layer, 1, 3, layer, 1, 2);
268
                Cube_Move_Pixel(layer, 1, 5, layer, 1, 4);
277
                    Cube_Move_Pixel(layer, 1, 4, layer, 1, 3);
269
                Cube_Move_Pixel(layer, 1, 6, layer, 1, 5);
278
                    Cube_Move_Pixel(layer, 1, 5, layer, 1, 4);
270
                Cube_Move_Pixel(layer, 2, 6, layer, 1, 6);
279
                    Cube_Move_Pixel(layer, 1, 6, layer, 1, 5);
271
                Cube_Move_Pixel(layer, 3, 6, layer, 2, 6);
280
                    Cube_Move_Pixel(layer, 2, 6, layer, 1, 6);
272
                Cube_Move_Pixel(layer, 4, 6, layer, 3, 6);
281
                    Cube_Move_Pixel(layer, 3, 6, layer, 2, 6);
273
                Cube_Move_Pixel(layer, 5, 6, layer, 4, 6);
282
                    Cube_Move_Pixel(layer, 4, 6, layer, 3, 6);
274
                Cube_Move_Pixel(layer, 6, 6, layer, 5, 6);
283
                    Cube_Move_Pixel(layer, 5, 6, layer, 4, 6);
275
                Cube_Move_Pixel(layer, 6, 5, layer, 6, 6);
284
                    Cube_Move_Pixel(layer, 6, 6, layer, 5, 6);
276
                Cube_Move_Pixel(layer, 6, 4, layer, 6, 5);
285
                    Cube_Move_Pixel(layer, 6, 5, layer, 6, 6);
277
                Cube_Move_Pixel(layer, 6, 3, layer, 6, 4);
286
                    Cube_Move_Pixel(layer, 6, 4, layer, 6, 5);
278
                Cube_Move_Pixel(layer, 6, 2, layer, 6, 3);
287
                    Cube_Move_Pixel(layer, 6, 3, layer, 6, 4);
279
                Cube_Move_Pixel(layer, 6, 1, layer, 6, 2);
288
                    Cube_Move_Pixel(layer, 6, 2, layer, 6, 3);
280
                Cube_Move_Pixel(layer, 5, 1, layer, 6, 1);
289
                    Cube_Move_Pixel(layer, 6, 1, layer, 6, 2);
281
                Cube_Move_Pixel(layer, 4, 1, layer, 5, 1);
290
                    Cube_Move_Pixel(layer, 5, 1, layer, 6, 1);
282
                Cube_Move_Pixel(layer, 3, 1, layer, 4, 1);
291
                    Cube_Move_Pixel(layer, 4, 1, layer, 5, 1);
283
                Cube_Move_Pixel(layer, 2, 1, layer, 3, 1);
292
                    Cube_Move_Pixel(layer, 3, 1, layer, 4, 1);
284
                Cube_Set_Pixel(layer, 2, 1, origin_R, origin_G, origin_B);
293
                    Cube_Move_Pixel(layer, 2, 1, layer, 3, 1);
285
                break;
294
                    Cube_Set_Pixel(layer, 2, 1, origin_R, origin_G, origin_B);
286
            case 2:
295
                    break;
287
                // Rotate second to innermost layer
296
                case 2:
288
                Cube_Get_Pixel(layer, 2, 2, &origin_R, &origin_G, &origin_B);
297
                    // Rotate second to innermost layer
289
                Cube_Move_Pixel(layer, 2, 3, layer, 2, 2);
298
                    Cube_Get_Pixel(layer, 2, 2, &origin_R, &origin_G, &origin_B);
290
                Cube_Move_Pixel(layer, 2, 4, layer, 2, 3);
299
                    Cube_Move_Pixel(layer, 2, 3, layer, 2, 2);
291
                Cube_Move_Pixel(layer, 2, 5, layer, 2, 4);
300
                    Cube_Move_Pixel(layer, 2, 4, layer, 2, 3);
292
                Cube_Move_Pixel(layer, 3, 5, layer, 2, 5);
301
                    Cube_Move_Pixel(layer, 2, 5, layer, 2, 4);
293
                Cube_Move_Pixel(layer, 4, 5, layer, 3, 5);
302
                    Cube_Move_Pixel(layer, 3, 5, layer, 2, 5);
294
                Cube_Move_Pixel(layer, 5, 5, layer, 4, 5);
303
                    Cube_Move_Pixel(layer, 4, 5, layer, 3, 5);
295
                Cube_Move_Pixel(layer, 5, 4, layer, 5, 5);
304
                    Cube_Move_Pixel(layer, 5, 5, layer, 4, 5);
296
                Cube_Move_Pixel(layer, 5, 3, layer, 5, 4);
305
                    Cube_Move_Pixel(layer, 5, 4, layer, 5, 5);
297
                Cube_Move_Pixel(layer, 5, 2, layer, 5, 3);
306
                    Cube_Move_Pixel(layer, 5, 3, layer, 5, 4);
298
                Cube_Move_Pixel(layer, 4, 2, layer, 5, 2);
307
                    Cube_Move_Pixel(layer, 5, 2, layer, 5, 3);
299
                Cube_Move_Pixel(layer, 3, 2, layer, 4, 2);
308
                    Cube_Move_Pixel(layer, 4, 2, layer, 5, 2);
300
                Cube_Set_Pixel(layer, 3, 2, origin_R, origin_G, origin_B);
309
                    Cube_Move_Pixel(layer, 3, 2, layer, 4, 2);
301
                break;
310
                    Cube_Set_Pixel(layer, 3, 2, origin_R, origin_G, origin_B);
302
            case 3:
311
                    break;
303
                // Rotate innermost layer
312
                case 3:
304
                Cube_Get_Pixel(layer, 3, 3, &origin_R, &origin_G, &origin_B);
313
                    // Rotate innermost layer
305
                Cube_Move_Pixel(layer, 3, 4, layer, 3, 3);
314
                    Cube_Get_Pixel(layer, 3, 3, &origin_R, &origin_G, &origin_B);
306
                Cube_Move_Pixel(layer, 4, 4, layer, 3, 4);
315
                    Cube_Move_Pixel(layer, 3, 4, layer, 3, 3);
307
                Cube_Move_Pixel(layer, 4, 3, layer, 4, 4);
316
                    Cube_Move_Pixel(layer, 4, 4, layer, 3, 4);
308
                Cube_Set_Pixel(layer, 4, 3, origin_R, origin_G, origin_B);
317
                    Cube_Move_Pixel(layer, 4, 3, layer, 4, 4);
309
                break;
318
                    Cube_Set_Pixel(layer, 4, 3, origin_R, origin_G, origin_B);
-
 
319
                    break;
-
 
320
            }
-
 
321
        } else {
-
 
322
            switch(shell) {
-
 
323
                case 0:
-
 
324
                    // Rotate outermost layer
-
 
325
                    Cube_Get_Pixel(layer, 0, 0, &origin_R, &origin_G, &origin_B);
-
 
326
                    Cube_Move_Pixel(layer, 1, 0, layer, 0, 0);
-
 
327
                    Cube_Move_Pixel(layer, 2, 0, layer, 1, 0);
-
 
328
                    Cube_Move_Pixel(layer, 3, 0, layer, 2, 0);
-
 
329
                    Cube_Move_Pixel(layer, 4, 0, layer, 3, 0);
-
 
330
                    Cube_Move_Pixel(layer, 5, 0, layer, 4, 0);
-
 
331
                    Cube_Move_Pixel(layer, 6, 0, layer, 5, 0);
-
 
332
                    Cube_Move_Pixel(layer, 7, 0, layer, 6, 0);
-
 
333
                    Cube_Move_Pixel(layer, 7, 1, layer, 7, 0);
-
 
334
                    Cube_Move_Pixel(layer, 7, 2, layer, 7, 1);
-
 
335
                    Cube_Move_Pixel(layer, 7, 3, layer, 7, 2);
-
 
336
                    Cube_Move_Pixel(layer, 7, 4, layer, 7, 3);
-
 
337
                    Cube_Move_Pixel(layer, 7, 5, layer, 7, 4);
-
 
338
                    Cube_Move_Pixel(layer, 7, 6, layer, 7, 5);
-
 
339
                    Cube_Move_Pixel(layer, 7, 7, layer, 7, 6);
-
 
340
                    Cube_Move_Pixel(layer, 6, 7, layer, 7, 7);
-
 
341
                    Cube_Move_Pixel(layer, 5, 7, layer, 6, 7);
-
 
342
                    Cube_Move_Pixel(layer, 4, 7, layer, 5, 7);
-
 
343
                    Cube_Move_Pixel(layer, 3, 7, layer, 4, 7);
-
 
344
                    Cube_Move_Pixel(layer, 2, 7, layer, 3, 7);
-
 
345
                    Cube_Move_Pixel(layer, 1, 7, layer, 2, 7);
-
 
346
                    Cube_Move_Pixel(layer, 0, 7, layer, 1, 7);
-
 
347
                    Cube_Move_Pixel(layer, 0, 6, layer, 0, 7);
-
 
348
                    Cube_Move_Pixel(layer, 0, 5, layer, 0, 6);
-
 
349
                    Cube_Move_Pixel(layer, 0, 4, layer, 0, 5);
-
 
350
                    Cube_Move_Pixel(layer, 0, 3, layer, 0, 4);
-
 
351
                    Cube_Move_Pixel(layer, 0, 2, layer, 0, 3);
-
 
352
                    Cube_Move_Pixel(layer, 0, 1, layer, 0, 2);
-
 
353
                    Cube_Set_Pixel(layer, 0, 1, origin_R, origin_G, origin_B);
-
 
354
                    break;
-
 
355
                case 1:
-
 
356
                    // Rotate second to outermost layer
-
 
357
                    Cube_Get_Pixel(layer, 1, 1, &origin_R, &origin_G, &origin_B);
-
 
358
                    Cube_Move_Pixel(layer, 2, 1, layer, 1, 1);
-
 
359
                    Cube_Move_Pixel(layer, 3, 1, layer, 2, 1);
-
 
360
                    Cube_Move_Pixel(layer, 4, 1, layer, 3, 1);
-
 
361
                    Cube_Move_Pixel(layer, 5, 1, layer, 4, 1);
-
 
362
                    Cube_Move_Pixel(layer, 6, 1, layer, 5, 1);
-
 
363
                    Cube_Move_Pixel(layer, 6, 2, layer, 6, 1);
-
 
364
                    Cube_Move_Pixel(layer, 6, 3, layer, 6, 2);
-
 
365
                    Cube_Move_Pixel(layer, 6, 4, layer, 6, 3);
-
 
366
                    Cube_Move_Pixel(layer, 6, 5, layer, 6, 4);
-
 
367
                    Cube_Move_Pixel(layer, 6, 6, layer, 6, 5);
-
 
368
                    Cube_Move_Pixel(layer, 5, 6, layer, 6, 6);
-
 
369
                    Cube_Move_Pixel(layer, 4, 6, layer, 5, 6);
-
 
370
                    Cube_Move_Pixel(layer, 3, 6, layer, 4, 6);
-
 
371
                    Cube_Move_Pixel(layer, 2, 6, layer, 3, 6);
-
 
372
                    Cube_Move_Pixel(layer, 1, 6, layer, 2, 6);
-
 
373
                    Cube_Move_Pixel(layer, 1, 5, layer, 1, 6);
-
 
374
                    Cube_Move_Pixel(layer, 1, 4, layer, 1, 5);
-
 
375
                    Cube_Move_Pixel(layer, 1, 3, layer, 1, 4);
-
 
376
                    Cube_Move_Pixel(layer, 1, 2, layer, 1, 3);
-
 
377
                    Cube_Set_Pixel(layer, 1, 2, origin_R, origin_G, origin_B);
-
 
378
                    break;
-
 
379
                case 2:
-
 
380
                    // Rotate second to innermost layer
-
 
381
                    Cube_Get_Pixel(layer, 2, 2, &origin_R, &origin_G, &origin_B);
-
 
382
                    Cube_Move_Pixel(layer, 3, 2, layer, 2, 2);
-
 
383
                    Cube_Move_Pixel(layer, 4, 2, layer, 3, 2);
-
 
384
                    Cube_Move_Pixel(layer, 5, 2, layer, 4, 2);
-
 
385
                    Cube_Move_Pixel(layer, 5, 3, layer, 5, 2);
-
 
386
                    Cube_Move_Pixel(layer, 5, 4, layer, 5, 3);
-
 
387
                    Cube_Move_Pixel(layer, 5, 5, layer, 5, 4);
-
 
388
                    Cube_Move_Pixel(layer, 4, 5, layer, 5, 5);
-
 
389
                    Cube_Move_Pixel(layer, 3, 5, layer, 4, 5);
-
 
390
                    Cube_Move_Pixel(layer, 2, 5, layer, 3, 5);
-
 
391
                    Cube_Move_Pixel(layer, 2, 4, layer, 2, 5);
-
 
392
                    Cube_Move_Pixel(layer, 2, 3, layer, 2, 4);
-
 
393
                    Cube_Set_Pixel(layer, 2, 3, origin_R, origin_G, origin_B);
-
 
394
                    break;
-
 
395
                case 3:
-
 
396
                    // Rotate innermost layer
-
 
397
                    Cube_Get_Pixel(layer, 3, 3, &origin_R, &origin_G, &origin_B);
-
 
398
                    Cube_Move_Pixel(layer, 4, 3, layer, 3, 3);
-
 
399
                    Cube_Move_Pixel(layer, 4, 4, layer, 4, 3);
-
 
400
                    Cube_Move_Pixel(layer, 3, 4, layer, 4, 4);
-
 
401
                    Cube_Set_Pixel(layer, 3, 4, origin_R, origin_G, origin_B);
-
 
402
                    break;
-
 
403
            }
310
        }
404
        }
311
        
-
 
312
    }
405
    }
313
}
406
}
314
 
407
 
315
void Cube_Rotate(void) {
408
void Cube_Rotate(char direction) {
316
    // Rotate outermost layer
409
    // Rotate outermost layer
317
    Cube_Rotate_Shell(0);
410
    Cube_Rotate_Shell(0, direction);
318
    // Rotate second to outermost layer
411
    // Rotate second to outermost layer
319
    if ((cube_data_ptr->rotation_counter != 1) && (cube_data_ptr->rotation_counter != 5)) {
412
    if ((cube_data_ptr->rotation_counter != 1) && (cube_data_ptr->rotation_counter != 5)) {
320
        Cube_Rotate_Shell(1);
413
        Cube_Rotate_Shell(1, direction);
321
    }
414
    }
322
    // Rotate second to innermost layer
415
    // Rotate second to innermost layer
323
    if ((cube_data_ptr->rotation_counter != 0) && (cube_data_ptr->rotation_counter != 2) &&
416
    if ((cube_data_ptr->rotation_counter != 0) && (cube_data_ptr->rotation_counter != 2) &&
324
        (cube_data_ptr->rotation_counter != 4) && (cube_data_ptr->rotation_counter != 6)) {
417
        (cube_data_ptr->rotation_counter != 4) && (cube_data_ptr->rotation_counter != 6)) {
325
        Cube_Rotate_Shell(2);
418
        Cube_Rotate_Shell(2, direction);
326
    }
419
    }
327
    // Rotate innermost layer
420
    // Rotate innermost layer
328
    if ((cube_data_ptr->rotation_counter == 3) || (cube_data_ptr->rotation_counter == 7)) {
421
    if ((cube_data_ptr->rotation_counter == 3) || (cube_data_ptr->rotation_counter == 7)) {
329
        Cube_Rotate_Shell(3);
422
        Cube_Rotate_Shell(3, direction);
330
    }
423
    }
331
 
424
 
332
    cube_data_ptr->rotation_counter = (cube_data_ptr->rotation_counter == CUBE_ROTATIONS-1)
425
    cube_data_ptr->rotation_counter = (cube_data_ptr->rotation_counter == CUBE_ROTATIONS-1)
333
            ? 0 : cube_data_ptr->rotation_counter + 1;
426
            ? 0 : cube_data_ptr->rotation_counter + 1;
-
 
427
}
-
 
428
 
-
 
429
 
-
 
430
void Cube_Overlay_Clear(void) {
-
 
431
    int i,j;
-
 
432
    for (i = 0; i < CUBE_LAYER_COUNT; i++)
-
 
433
        for (j = 0; j < GCS_LAYER_SIZE; j++)
-
 
434
            cube_data_ptr->GCS_OVERLAY[i][j] = 0x00;
-
 
435
}
-
 
436
 
-
 
437
void Cube_Overlay_Set_Pixel(int layer, int row, int column, int R, int G, int B) {
-
 
438
    // Set the specified pixel to the given color
-
 
439
    R &= 0x0FFF;
-
 
440
    G &= 0x0FFF;
-
 
441
    B &= 0x0FFF;
-
 
442
    int var = row * GCS_REG_SIZE + (column / 2 * 9);
-
 
443
    switch (column % 2) {
-
 
444
        case 0:
-
 
445
            cube_data_ptr->GCS_OVERLAY[layer][var+0] = R & 0xFF;
-
 
446
            cube_data_ptr->GCS_OVERLAY[layer][var+1] = (G << 4) | (R >> 8);
-
 
447
            cube_data_ptr->GCS_OVERLAY[layer][var+2] = G >> 4;
-
 
448
            cube_data_ptr->GCS_OVERLAY[layer][var+3] = B & 0xFF;
-
 
449
            cube_data_ptr->GCS_OVERLAY[layer][var+4] = (cube_data_ptr->GCS_OVERLAY[layer][var+4] & 0xF0) | (B >> 8);
-
 
450
            break;
-
 
451
        case 1:
-
 
452
            cube_data_ptr->GCS_OVERLAY[layer][var+4] = (cube_data_ptr->GCS_OVERLAY[layer][var+4] & 0x0F) | (R << 4);
-
 
453
            cube_data_ptr->GCS_OVERLAY[layer][var+5] = R >> 4;
-
 
454
            cube_data_ptr->GCS_OVERLAY[layer][var+6] = G & 0xFF;
-
 
455
            cube_data_ptr->GCS_OVERLAY[layer][var+7] = (B << 4) | (G >> 8);
-
 
456
            cube_data_ptr->GCS_OVERLAY[layer][var+8] = B >> 4;
-
 
457
            break;
-
 
458
    }
-
 
459
}
-
 
460
 
-
 
461
void Cube_Overlay_Get_Pixel(int layer, int row, int column, int* R, int* G, int* B) {
-
 
462
    int var = row * GCS_REG_SIZE + (column / 2 * 9);
-
 
463
    switch (column % 2) {
-
 
464
        // Concatenate lower byte and upper byte of each color channel
-
 
465
        case 0:
-
 
466
            *R = cube_data_ptr->GCS_OVERLAY[layer][var+0] | ((cube_data_ptr->GCS_OVERLAY[layer][var+1] & 0x0F) << 8);
-
 
467
            *G = (cube_data_ptr->GCS_OVERLAY[layer][var+1] >> 4) | (cube_data_ptr->GCS_OVERLAY[layer][var+2] << 4);
-
 
468
            *B = cube_data_ptr->GCS_OVERLAY[layer][var+3] | ((cube_data_ptr->GCS_OVERLAY[layer][var+4] & 0x0F) << 8);
-
 
469
            break;
-
 
470
        case 1:
-
 
471
            *R = (cube_data_ptr->GCS_OVERLAY[layer][var+4] >> 4) | (cube_data_ptr->GCS_OVERLAY[layer][var+5] << 4);
-
 
472
            *G = cube_data_ptr->GCS_OVERLAY[layer][var+6] | ((cube_data_ptr->GCS_OVERLAY[layer][var+7] & 0x0F) << 8);
-
 
473
            *B = (cube_data_ptr->GCS_OVERLAY[layer][var+7] >> 4) | (cube_data_ptr->GCS_OVERLAY[layer][var+8] << 4);
-
 
474
            break;
-
 
475
    }
-
 
476
}
-
 
477
 
-
 
478
void Cube_Overlay_Move_Pixel(int layer1, int row1, int column1, int layer2, int row2, int column2) {
-
 
479
    // Copies data from pixel 1 to pixel 2
-
 
480
    // Note: destination pixel value is overwritten
-
 
481
    int prev_R, prev_G, prev_B;
-
 
482
    Cube_Overlay_Get_Pixel(layer1, row1, column1, &prev_R, &prev_G, &prev_B);
-
 
483
    Cube_Overlay_Set_Pixel(layer2, row2, column2, prev_R, prev_G, prev_B);
-
 
484
}
-
 
485
 
-
 
486
void Cube_Overlay_Rotate_Shell(char shell, char direction) {
-
 
487
    // Shell is the layer to rotate, with the outermost being 0
-
 
488
    int layer, origin_R, origin_G, origin_B;;
-
 
489
    for (layer = 0; layer < CUBE_LAYER_COUNT; layer++) {
-
 
490
        if (direction) {
-
 
491
            switch(shell) {
-
 
492
                case 0:
-
 
493
                    // Rotate outermost layer
-
 
494
                    Cube_Overlay_Get_Pixel(layer, 0, 0, &origin_R, &origin_G, &origin_B);
-
 
495
                    Cube_Overlay_Move_Pixel(layer, 0, 1, layer, 0, 0);
-
 
496
                    Cube_Overlay_Move_Pixel(layer, 0, 2, layer, 0, 1);
-
 
497
                    Cube_Overlay_Move_Pixel(layer, 0, 3, layer, 0, 2);
-
 
498
                    Cube_Overlay_Move_Pixel(layer, 0, 4, layer, 0, 3);
-
 
499
                    Cube_Overlay_Move_Pixel(layer, 0, 5, layer, 0, 4);
-
 
500
                    Cube_Overlay_Move_Pixel(layer, 0, 6, layer, 0, 5);
-
 
501
                    Cube_Overlay_Move_Pixel(layer, 0, 7, layer, 0, 6);
-
 
502
                    Cube_Overlay_Move_Pixel(layer, 1, 7, layer, 0, 7);
-
 
503
                    Cube_Overlay_Move_Pixel(layer, 2, 7, layer, 1, 7);
-
 
504
                    Cube_Overlay_Move_Pixel(layer, 3, 7, layer, 2, 7);
-
 
505
                    Cube_Overlay_Move_Pixel(layer, 4, 7, layer, 3, 7);
-
 
506
                    Cube_Overlay_Move_Pixel(layer, 5, 7, layer, 4, 7);
-
 
507
                    Cube_Overlay_Move_Pixel(layer, 6, 7, layer, 5, 7);
-
 
508
                    Cube_Overlay_Move_Pixel(layer, 7, 7, layer, 6, 7);
-
 
509
                    Cube_Overlay_Move_Pixel(layer, 7, 6, layer, 7, 7);
-
 
510
                    Cube_Overlay_Move_Pixel(layer, 7, 5, layer, 7, 6);
-
 
511
                    Cube_Overlay_Move_Pixel(layer, 7, 4, layer, 7, 5);
-
 
512
                    Cube_Overlay_Move_Pixel(layer, 7, 3, layer, 7, 4);
-
 
513
                    Cube_Overlay_Move_Pixel(layer, 7, 2, layer, 7, 3);
-
 
514
                    Cube_Overlay_Move_Pixel(layer, 7, 1, layer, 7, 2);
-
 
515
                    Cube_Overlay_Move_Pixel(layer, 7, 0, layer, 7, 1);
-
 
516
                    Cube_Overlay_Move_Pixel(layer, 6, 0, layer, 7, 0);
-
 
517
                    Cube_Overlay_Move_Pixel(layer, 5, 0, layer, 6, 0);
-
 
518
                    Cube_Overlay_Move_Pixel(layer, 4, 0, layer, 5, 0);
-
 
519
                    Cube_Overlay_Move_Pixel(layer, 3, 0, layer, 4, 0);
-
 
520
                    Cube_Overlay_Move_Pixel(layer, 2, 0, layer, 3, 0);
-
 
521
                    Cube_Overlay_Move_Pixel(layer, 1, 0, layer, 2, 0);
-
 
522
                    Cube_Overlay_Set_Pixel(layer, 1, 0, origin_R, origin_G, origin_B);
-
 
523
                    break;
-
 
524
                case 1:
-
 
525
                    // Rotate second to outermost layer
-
 
526
                    Cube_Overlay_Get_Pixel(layer, 1, 1, &origin_R, &origin_G, &origin_B);
-
 
527
                    Cube_Overlay_Move_Pixel(layer, 1, 2, layer, 1, 1);
-
 
528
                    Cube_Overlay_Move_Pixel(layer, 1, 3, layer, 1, 2);
-
 
529
                    Cube_Overlay_Move_Pixel(layer, 1, 4, layer, 1, 3);
-
 
530
                    Cube_Overlay_Move_Pixel(layer, 1, 5, layer, 1, 4);
-
 
531
                    Cube_Overlay_Move_Pixel(layer, 1, 6, layer, 1, 5);
-
 
532
                    Cube_Overlay_Move_Pixel(layer, 2, 6, layer, 1, 6);
-
 
533
                    Cube_Overlay_Move_Pixel(layer, 3, 6, layer, 2, 6);
-
 
534
                    Cube_Overlay_Move_Pixel(layer, 4, 6, layer, 3, 6);
-
 
535
                    Cube_Overlay_Move_Pixel(layer, 5, 6, layer, 4, 6);
-
 
536
                    Cube_Overlay_Move_Pixel(layer, 6, 6, layer, 5, 6);
-
 
537
                    Cube_Overlay_Move_Pixel(layer, 6, 5, layer, 6, 6);
-
 
538
                    Cube_Overlay_Move_Pixel(layer, 6, 4, layer, 6, 5);
-
 
539
                    Cube_Overlay_Move_Pixel(layer, 6, 3, layer, 6, 4);
-
 
540
                    Cube_Overlay_Move_Pixel(layer, 6, 2, layer, 6, 3);
-
 
541
                    Cube_Overlay_Move_Pixel(layer, 6, 1, layer, 6, 2);
-
 
542
                    Cube_Overlay_Move_Pixel(layer, 5, 1, layer, 6, 1);
-
 
543
                    Cube_Overlay_Move_Pixel(layer, 4, 1, layer, 5, 1);
-
 
544
                    Cube_Overlay_Move_Pixel(layer, 3, 1, layer, 4, 1);
-
 
545
                    Cube_Overlay_Move_Pixel(layer, 2, 1, layer, 3, 1);
-
 
546
                    Cube_Overlay_Set_Pixel(layer, 2, 1, origin_R, origin_G, origin_B);
-
 
547
                    break;
-
 
548
                case 2:
-
 
549
                    // Rotate second to innermost layer
-
 
550
                    Cube_Overlay_Get_Pixel(layer, 2, 2, &origin_R, &origin_G, &origin_B);
-
 
551
                    Cube_Overlay_Move_Pixel(layer, 2, 3, layer, 2, 2);
-
 
552
                    Cube_Overlay_Move_Pixel(layer, 2, 4, layer, 2, 3);
-
 
553
                    Cube_Overlay_Move_Pixel(layer, 2, 5, layer, 2, 4);
-
 
554
                    Cube_Overlay_Move_Pixel(layer, 3, 5, layer, 2, 5);
-
 
555
                    Cube_Overlay_Move_Pixel(layer, 4, 5, layer, 3, 5);
-
 
556
                    Cube_Overlay_Move_Pixel(layer, 5, 5, layer, 4, 5);
-
 
557
                    Cube_Overlay_Move_Pixel(layer, 5, 4, layer, 5, 5);
-
 
558
                    Cube_Overlay_Move_Pixel(layer, 5, 3, layer, 5, 4);
-
 
559
                    Cube_Overlay_Move_Pixel(layer, 5, 2, layer, 5, 3);
-
 
560
                    Cube_Overlay_Move_Pixel(layer, 4, 2, layer, 5, 2);
-
 
561
                    Cube_Overlay_Move_Pixel(layer, 3, 2, layer, 4, 2);
-
 
562
                    Cube_Overlay_Set_Pixel(layer, 3, 2, origin_R, origin_G, origin_B);
-
 
563
                    break;
-
 
564
                case 3:
-
 
565
                    // Rotate innermost layer
-
 
566
                    Cube_Overlay_Get_Pixel(layer, 3, 3, &origin_R, &origin_G, &origin_B);
-
 
567
                    Cube_Overlay_Move_Pixel(layer, 3, 4, layer, 3, 3);
-
 
568
                    Cube_Overlay_Move_Pixel(layer, 4, 4, layer, 3, 4);
-
 
569
                    Cube_Overlay_Move_Pixel(layer, 4, 3, layer, 4, 4);
-
 
570
                    Cube_Overlay_Set_Pixel(layer, 4, 3, origin_R, origin_G, origin_B);
-
 
571
                    break;
-
 
572
            }
-
 
573
        } else {
-
 
574
            switch(shell) {
-
 
575
                case 0:
-
 
576
                    // Rotate outermost layer
-
 
577
                    Cube_Overlay_Get_Pixel(layer, 0, 0, &origin_R, &origin_G, &origin_B);
-
 
578
                    Cube_Overlay_Move_Pixel(layer, 1, 0, layer, 0, 0);
-
 
579
                    Cube_Overlay_Move_Pixel(layer, 2, 0, layer, 1, 0);
-
 
580
                    Cube_Overlay_Move_Pixel(layer, 3, 0, layer, 2, 0);
-
 
581
                    Cube_Overlay_Move_Pixel(layer, 4, 0, layer, 3, 0);
-
 
582
                    Cube_Overlay_Move_Pixel(layer, 5, 0, layer, 4, 0);
-
 
583
                    Cube_Overlay_Move_Pixel(layer, 6, 0, layer, 5, 0);
-
 
584
                    Cube_Overlay_Move_Pixel(layer, 7, 0, layer, 6, 0);
-
 
585
                    Cube_Overlay_Move_Pixel(layer, 7, 1, layer, 7, 0);
-
 
586
                    Cube_Overlay_Move_Pixel(layer, 7, 2, layer, 7, 1);
-
 
587
                    Cube_Overlay_Move_Pixel(layer, 7, 3, layer, 7, 2);
-
 
588
                    Cube_Overlay_Move_Pixel(layer, 7, 4, layer, 7, 3);
-
 
589
                    Cube_Overlay_Move_Pixel(layer, 7, 5, layer, 7, 4);
-
 
590
                    Cube_Overlay_Move_Pixel(layer, 7, 6, layer, 7, 5);
-
 
591
                    Cube_Overlay_Move_Pixel(layer, 7, 7, layer, 7, 6);
-
 
592
                    Cube_Overlay_Move_Pixel(layer, 6, 7, layer, 7, 7);
-
 
593
                    Cube_Overlay_Move_Pixel(layer, 5, 7, layer, 6, 7);
-
 
594
                    Cube_Overlay_Move_Pixel(layer, 4, 7, layer, 5, 7);
-
 
595
                    Cube_Overlay_Move_Pixel(layer, 3, 7, layer, 4, 7);
-
 
596
                    Cube_Overlay_Move_Pixel(layer, 2, 7, layer, 3, 7);
-
 
597
                    Cube_Overlay_Move_Pixel(layer, 1, 7, layer, 2, 7);
-
 
598
                    Cube_Overlay_Move_Pixel(layer, 0, 7, layer, 1, 7);
-
 
599
                    Cube_Overlay_Move_Pixel(layer, 0, 6, layer, 0, 7);
-
 
600
                    Cube_Overlay_Move_Pixel(layer, 0, 5, layer, 0, 6);
-
 
601
                    Cube_Overlay_Move_Pixel(layer, 0, 4, layer, 0, 5);
-
 
602
                    Cube_Overlay_Move_Pixel(layer, 0, 3, layer, 0, 4);
-
 
603
                    Cube_Overlay_Move_Pixel(layer, 0, 2, layer, 0, 3);
-
 
604
                    Cube_Overlay_Move_Pixel(layer, 0, 1, layer, 0, 2);
-
 
605
                    Cube_Overlay_Set_Pixel(layer, 0, 1, origin_R, origin_G, origin_B);
-
 
606
                    break;
-
 
607
                case 1:
-
 
608
                    // Rotate second to outermost layer
-
 
609
                    Cube_Overlay_Get_Pixel(layer, 1, 1, &origin_R, &origin_G, &origin_B);
-
 
610
                    Cube_Overlay_Move_Pixel(layer, 2, 1, layer, 1, 1);
-
 
611
                    Cube_Overlay_Move_Pixel(layer, 3, 1, layer, 2, 1);
-
 
612
                    Cube_Overlay_Move_Pixel(layer, 4, 1, layer, 3, 1);
-
 
613
                    Cube_Overlay_Move_Pixel(layer, 5, 1, layer, 4, 1);
-
 
614
                    Cube_Overlay_Move_Pixel(layer, 6, 1, layer, 5, 1);
-
 
615
                    Cube_Overlay_Move_Pixel(layer, 6, 2, layer, 6, 1);
-
 
616
                    Cube_Overlay_Move_Pixel(layer, 6, 3, layer, 6, 2);
-
 
617
                    Cube_Overlay_Move_Pixel(layer, 6, 4, layer, 6, 3);
-
 
618
                    Cube_Overlay_Move_Pixel(layer, 6, 5, layer, 6, 4);
-
 
619
                    Cube_Overlay_Move_Pixel(layer, 6, 6, layer, 6, 5);
-
 
620
                    Cube_Overlay_Move_Pixel(layer, 5, 6, layer, 6, 6);
-
 
621
                    Cube_Overlay_Move_Pixel(layer, 4, 6, layer, 5, 6);
-
 
622
                    Cube_Overlay_Move_Pixel(layer, 3, 6, layer, 4, 6);
-
 
623
                    Cube_Overlay_Move_Pixel(layer, 2, 6, layer, 3, 6);
-
 
624
                    Cube_Overlay_Move_Pixel(layer, 1, 6, layer, 2, 6);
-
 
625
                    Cube_Overlay_Move_Pixel(layer, 1, 5, layer, 1, 6);
-
 
626
                    Cube_Overlay_Move_Pixel(layer, 1, 4, layer, 1, 5);
-
 
627
                    Cube_Overlay_Move_Pixel(layer, 1, 3, layer, 1, 4);
-
 
628
                    Cube_Overlay_Move_Pixel(layer, 1, 2, layer, 1, 3);
-
 
629
                    Cube_Overlay_Set_Pixel(layer, 1, 2, origin_R, origin_G, origin_B);
-
 
630
                    break;
-
 
631
                case 2:
-
 
632
                    // Rotate second to innermost layer
-
 
633
                    Cube_Overlay_Get_Pixel(layer, 2, 2, &origin_R, &origin_G, &origin_B);
-
 
634
                    Cube_Overlay_Move_Pixel(layer, 3, 2, layer, 2, 2);
-
 
635
                    Cube_Overlay_Move_Pixel(layer, 4, 2, layer, 3, 2);
-
 
636
                    Cube_Overlay_Move_Pixel(layer, 5, 2, layer, 4, 2);
-
 
637
                    Cube_Overlay_Move_Pixel(layer, 5, 3, layer, 5, 2);
-
 
638
                    Cube_Overlay_Move_Pixel(layer, 5, 4, layer, 5, 3);
-
 
639
                    Cube_Overlay_Move_Pixel(layer, 5, 5, layer, 5, 4);
-
 
640
                    Cube_Overlay_Move_Pixel(layer, 4, 5, layer, 5, 5);
-
 
641
                    Cube_Overlay_Move_Pixel(layer, 3, 5, layer, 4, 5);
-
 
642
                    Cube_Overlay_Move_Pixel(layer, 2, 5, layer, 3, 5);
-
 
643
                    Cube_Overlay_Move_Pixel(layer, 2, 4, layer, 2, 5);
-
 
644
                    Cube_Overlay_Move_Pixel(layer, 2, 3, layer, 2, 4);
-
 
645
                    Cube_Overlay_Set_Pixel(layer, 2, 3, origin_R, origin_G, origin_B);
-
 
646
                    break;
-
 
647
                case 3:
-
 
648
                    // Rotate innermost layer
-
 
649
                    Cube_Overlay_Get_Pixel(layer, 3, 3, &origin_R, &origin_G, &origin_B);
-
 
650
                    Cube_Overlay_Move_Pixel(layer, 4, 3, layer, 3, 3);
-
 
651
                    Cube_Overlay_Move_Pixel(layer, 4, 4, layer, 4, 3);
-
 
652
                    Cube_Overlay_Move_Pixel(layer, 3, 4, layer, 4, 4);
-
 
653
                    Cube_Overlay_Set_Pixel(layer, 3, 4, origin_R, origin_G, origin_B);
-
 
654
                    break;
-
 
655
            }
-
 
656
        }
-
 
657
    }
-
 
658
}
-
 
659
 
-
 
660
 
-
 
661
void Cube_Text_Init(char *string, char length, int R, int G, int B) {
-
 
662
    // Ensure that the length of the string does not exceed the storage buffer
-
 
663
    if (length > CUBE_STRING_MAX_LENGTH) length = CUBE_STRING_MAX_LENGTH;
-
 
664
 
-
 
665
    // Copy the passed data into the buffer
-
 
666
    int i;
-
 
667
    for (i = 0; i < length; i++)
-
 
668
        cube_data_ptr->string[i] = string[i];
-
 
669
    cube_data_ptr->string_length = length;
-
 
670
    cube_data_ptr->string_index = 0;
-
 
671
    cube_data_ptr->string_line = 0;
-
 
672
    cube_data_ptr->string_R = R;
-
 
673
    cube_data_ptr->string_G = G;
-
 
674
    cube_data_ptr->string_B = B;
-
 
675
}
-
 
676
 
-
 
677
void Cube_Text_Interrupt(void) {
-
 
678
    int layer, line;
-
 
679
 
-
 
680
    // Rotate before drawing the new line at (0,0)
-
 
681
    Cube_Overlay_Rotate_Shell(0, 0);
-
 
682
 
-
 
683
    // Get the next vertical line of the character currently being drawn
-
 
684
    if (cube_data_ptr->string_line == 5) {
-
 
685
        line = 0x0; // Leave a space between characters
-
 
686
    } else {
-
 
687
        line = font[(cube_data_ptr->string[cube_data_ptr->string_index] * 5)
-
 
688
                + cube_data_ptr->string_line];
-
 
689
    }
-
 
690
 
-
 
691
    // Draw the line onto (0,0) using the specified color
-
 
692
    for (layer = 7; layer >= 0; layer--) {
-
 
693
        if (line & 0x1) {
-
 
694
            Cube_Overlay_Set_Pixel(layer, 0, 0, cube_data_ptr->string_R,
-
 
695
                    cube_data_ptr->string_G, cube_data_ptr->string_B);
-
 
696
        } else {
-
 
697
            Cube_Overlay_Set_Pixel(layer, 0, 0, 0x00, 0x00, 0x00);
-
 
698
        }
-
 
699
        line >>= 1;
-
 
700
    }
-
 
701
 
-
 
702
    // Increment the vertical line and the character as needed
-
 
703
    if (cube_data_ptr->string_line == 5) {
-
 
704
        cube_data_ptr->string_line = 0;
-
 
705
        if (cube_data_ptr->string_index == cube_data_ptr->string_length-1) {
-
 
706
            cube_data_ptr->string_index = 0;
-
 
707
        } else {
-
 
708
            cube_data_ptr->string_index += 1;
-
 
709
        }
-
 
710
    } else {
-
 
711
        cube_data_ptr->string_line += 1;
-
 
712
    }
334
}
713
}
335
714