X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=Scan%2FSTLcd%2Flcd_scan.c;h=74c6763ba523d723de846fe8cd58608fc4e53bbc;hb=893231b3559bf9e7c6c8eb8e6da7f02b0d6e70cc;hp=b8211f8729b336e3959f13416583c2057bc46039;hpb=9a96c4635d9b4102f832056a3d5e38045dc19082;p=kiibohd-controller.git diff --git a/Scan/STLcd/lcd_scan.c b/Scan/STLcd/lcd_scan.c index b8211f8..74c6763 100644 --- a/Scan/STLcd/lcd_scan.c +++ b/Scan/STLcd/lcd_scan.c @@ -21,7 +21,7 @@ // Project Includes #include -#include +#include #include #include @@ -33,6 +33,7 @@ // ----- Defines ----- #define LCD_TOTAL_VISIBLE_PAGES 4 +#define LCD_TOTAL_PAGES 9 #define LCD_PAGE_LEN 128 @@ -51,6 +52,7 @@ // CLI Functions void cliFunc_lcdCmd ( char* args ); void cliFunc_lcdColor( char* args ); +void cliFunc_lcdDisp ( char* args ); void cliFunc_lcdInit ( char* args ); void cliFunc_lcdTest ( char* args ); @@ -70,12 +72,14 @@ uint8_t cliNormalReverseToggleState = 0; // Scan Module command dictionary CLIDict_Entry( lcdCmd, "Send byte via SPI, second argument enables a0. Defaults to control." ); CLIDict_Entry( lcdColor, "Set backlight color. 3 16-bit numbers: R G B. i.e. 0xFFF 0x1444 0x32" ); +CLIDict_Entry( lcdDisp, "Write byte(s) to given page starting at given address. i.e. 0x1 0x5 0xFF 0x00" ); CLIDict_Entry( lcdInit, "Re-initialize the LCD display." ); CLIDict_Entry( lcdTest, "Test out the LCD display." ); CLIDict_Def( lcdCLIDict, "ST LCD Module Commands" ) = { CLIDict_Item( lcdCmd ), CLIDict_Item( lcdColor ), + CLIDict_Item( lcdDisp ), CLIDict_Item( lcdInit ), CLIDict_Item( lcdTest ), { 0, 0, 0 } // Null entry for dictionary end @@ -204,7 +208,7 @@ inline void LCD_clearPage( uint8_t page ) void LCD_clear() { // Setup each page - for ( uint8_t page = 0; page < LCD_TOTAL_VISIBLE_PAGES; page++ ) + for ( uint8_t page = 0; page < LCD_TOTAL_PAGES; page++ ) { LCD_clearPage( page ); } @@ -286,7 +290,6 @@ inline void LCD_setup() LCD_writeDisplayReg( page, (uint8_t*)&STLcdDefaultImage[page * LCD_PAGE_LEN], LCD_PAGE_LEN ); // Setup Backlight - // TODO Expose default settings SIM_SCGC6 |= SIM_SCGC6_FTM0; FTM0_CNT = 0; // Reset counter @@ -300,7 +303,7 @@ inline void LCD_setup() FTM0_C2SC = 0x24; // Base FTM clock selection (72 MHz system clock) - // @ 0xFFFF period, 72 MHz / 0xFFFF * 2 = Actual period + // @ 0xFFFF period, 72 MHz / (0xFFFF * 2) = Actual period // Higher pre-scalar will use the most power (also look the best) // Pre-scalar calculations // 0 - 72 MHz -> 549 Hz @@ -334,13 +337,127 @@ inline void LCD_setup() // LCD State processing loop inline uint8_t LCD_scan() { - // NOP - Screen Refresh - //LCD_writeControlReg( 0xE3 ); return 0; } +// ----- Capabilities ----- + +uint16_t LCD_layerStack_prevSize = 0; +uint16_t LCD_layerStack_prevTop = 0; +void LCD_layerStack_capability( uint8_t state, uint8_t stateType, uint8_t *args ) +{ + // Display capability name + if ( stateType == 0xFF && state == 0xFF ) + { + print("LCD_layerStack_capability"); + return; + } + + // Parse the layer stack, top to bottom + extern uint16_t macroLayerIndexStack[]; + extern uint16_t macroLayerIndexStackSize; + + // Ignore if the stack size hasn't changed and the top of the stack is the same + if ( macroLayerIndexStackSize == LCD_layerStack_prevSize + && macroLayerIndexStack[macroLayerIndexStackSize - 1] == LCD_layerStack_prevTop ) + { + return; + } + LCD_layerStack_prevSize = macroLayerIndexStackSize; + LCD_layerStack_prevTop = macroLayerIndexStack[macroLayerIndexStackSize - 1]; + + // Number data for LCD + const uint8_t numbers[10][128] = { + { STLcdNumber0_define }, + { STLcdNumber1_define }, + { STLcdNumber2_define }, + { STLcdNumber3_define }, + { STLcdNumber4_define }, + { STLcdNumber5_define }, + { STLcdNumber6_define }, + { STLcdNumber7_define }, + { STLcdNumber8_define }, + { STLcdNumber9_define }, + }; + + // Color data for numbers + const uint16_t colors[10][3] = { + { STLcdNumber0Color_define }, + { STLcdNumber1Color_define }, + { STLcdNumber2Color_define }, + { STLcdNumber3Color_define }, + { STLcdNumber4Color_define }, + { STLcdNumber5Color_define }, + { STLcdNumber6Color_define }, + { STLcdNumber7Color_define }, + { STLcdNumber8Color_define }, + { STLcdNumber9Color_define }, + }; + + // Only display if there are layers active + if ( macroLayerIndexStackSize > 0 ) + { + // Set the color according to the "top-of-stack" layer + uint16_t layerIndex = macroLayerIndexStack[ macroLayerIndexStackSize - 1 ]; + FTM0_C0V = colors[ layerIndex ][0]; + FTM0_C1V = colors[ layerIndex ][1]; + FTM0_C2V = colors[ layerIndex ][2]; + + // Iterate through each of the pages + // XXX Many of the values here are hard-coded + // Eventually a proper font rendering engine should take care of things like this... -HaaTa + for ( uint8_t page = 0; page < LCD_TOTAL_VISIBLE_PAGES; page++ ) + { + // Set the register page + LCD_writeControlReg( 0xB0 | ( 0x0F & page ) ); + + // Set starting address + LCD_writeControlReg( 0x10 ); + LCD_writeControlReg( 0x00 ); + + // Write data + for ( uint16_t layer = 1; layer <= macroLayerIndexStackSize; layer++ ) + { + layerIndex = macroLayerIndexStack[ macroLayerIndexStackSize - layer ]; + + // Default to 0, if over 9 + if ( layerIndex > 9 ) + { + layerIndex = 0; + } + + // Write page of number to display + SPI_write( (uint8_t*)&numbers[ layerIndex ][ page * 32 ], 32 ); + } + + // Blank out rest of display + uint8_t data = 0; + for ( uint8_t c = 0; c < 4 - macroLayerIndexStackSize; c++ ) + { + for ( uint8_t byte = 0; byte < 32; byte++ ) + { + SPI_write( &data, 1 ); + } + } + } + } + else + { + // Set default backlight + FTM0_C0V = STLcdBacklightRed_define; + FTM0_C1V = STLcdBacklightGreen_define; + FTM0_C2V = STLcdBacklightBlue_define; + + // Write default image + for ( uint8_t page = 0; page < LCD_TOTAL_VISIBLE_PAGES; page++ ) + LCD_writeDisplayReg( page, (uint8_t *)&STLcdDefaultImage[page * LCD_PAGE_LEN], LCD_PAGE_LEN ); + } +} + + + // ----- CLI Command Functions ----- void cliFunc_lcdInit( char* args ) @@ -417,3 +534,50 @@ void cliFunc_lcdColor( char* args ) FTM0_C2V = rgb[2]; } +void cliFunc_lcdDisp( char* args ) +{ + char* curArgs; + char* arg1Ptr; + char* arg2Ptr = args; + + // First process page and starting address + curArgs = arg2Ptr; + CLI_argumentIsolation( curArgs, &arg1Ptr, &arg2Ptr ); + + // Stop processing args if no more are found + if ( *arg1Ptr == '\0' ) + return; + uint8_t page = numToInt( arg1Ptr ); + + curArgs = arg2Ptr; + CLI_argumentIsolation( curArgs, &arg1Ptr, &arg2Ptr ); + + // Stop processing args if no more are found + if ( *arg1Ptr == '\0' ) + return; + uint8_t address = numToInt( arg1Ptr ); + + // Set the register page + LCD_writeControlReg( 0xB0 | ( 0x0F & page ) ); + + // Set starting address + LCD_writeControlReg( 0x10 | ( ( 0xF0 & address ) >> 4 ) ); + LCD_writeControlReg( 0x00 | ( 0x0F & address )); + + // Process all args + for ( ;; ) + { + curArgs = arg2Ptr; + CLI_argumentIsolation( curArgs, &arg1Ptr, &arg2Ptr ); + + // Stop processing args if no more are found + if ( *arg1Ptr == '\0' ) + break; + + uint8_t value = numToInt( arg1Ptr ); + + // Write buffer to SPI + SPI_write( &value, 1 ); + } +} +