diff --git a/README.md b/README.md index ce4b809..16b73f3 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ To enable the custom option just uncomment the line by removing the starting '#' Battery voltage boot screen now includes the percentage (as well as voltage). * "STEP" menu, added 1.25kHz option, removed 5kHz option -* "ABR" menu, shows extended backlight times +* "ABR" menu, renamed to "BAK-LT", shows extended backlight times * "MIC" menu, shows mic gain in dB's, now includes the max mic gain possible (+15.5dB) * "VOL" menu, renamed to "BATVOL", shows voltage and percentage * "AM" menu, renamed to "MODE", shows modulation mode diff --git a/driver/st7565.c b/driver/st7565.c index 5f4a330..ee37138 100644 --- a/driver/st7565.c +++ b/driver/st7565.c @@ -33,21 +33,25 @@ void ST7565_DrawLine(uint8_t Column, uint8_t Line, uint16_t Size, const uint8_t ST7565_SelectColumnAndLine(Column + 4U, Line); GPIO_SetBit(&GPIOB->DATA, GPIOB_PIN_ST7565_A0); - if (!bIsClearMode) { - for (i = 0; i < Size; i++) { - while ((SPI0->FIFOST & SPI_FIFOST_TFF_MASK) != SPI_FIFOST_TFF_BITS_NOT_FULL) { - } + if (!bIsClearMode) + { + for (i = 0; i < Size; i++) + { + while ((SPI0->FIFOST & SPI_FIFOST_TFF_MASK) != SPI_FIFOST_TFF_BITS_NOT_FULL) {} SPI0->WDR = pBitmap[i]; } - } else { - for (i = 0; i < Size; i++) { - while ((SPI0->FIFOST & SPI_FIFOST_TFF_MASK) != SPI_FIFOST_TFF_BITS_NOT_FULL) { - } + } + else + { + for (i = 0; i < Size; i++) + { + while ((SPI0->FIFOST & SPI_FIFOST_TFF_MASK) != SPI_FIFOST_TFF_BITS_NOT_FULL) {} SPI0->WDR = 0; } } SPI_WaitForUndocumentedTxFifoStatusBit(); + SPI_ToggleMasterMode(&SPI0->CR, true); } @@ -57,52 +61,67 @@ void ST7565_BlitFullScreen(void) uint8_t Column; SPI_ToggleMasterMode(&SPI0->CR, false); + ST7565_WriteByte(0x40); - for (Line = 0; Line < 7; Line++) { - ST7565_SelectColumnAndLine(4U, Line + 1U); + for (Line = 0; Line < 7; Line++) + { + ST7565_SelectColumnAndLine(4, Line + 1); GPIO_SetBit(&GPIOB->DATA, GPIOB_PIN_ST7565_A0); - for (Column = 0; Column < 128; Column++) { - while ((SPI0->FIFOST & SPI_FIFOST_TFF_MASK) != SPI_FIFOST_TFF_BITS_NOT_FULL) { - } + for (Column = 0; Column < 128; Column++) + { + while ((SPI0->FIFOST & SPI_FIFOST_TFF_MASK) != SPI_FIFOST_TFF_BITS_NOT_FULL) {} SPI0->WDR = gFrameBuffer[Line][Column]; } SPI_WaitForUndocumentedTxFifoStatusBit(); } - SYSTEM_DelayMs(20); + #if 0 + // whats the delay for I wonder ? .. it slows down scanning :( + SYSTEM_DelayMs(20); + #else + SYSTEM_DelayMs(1); + #endif + SPI_ToggleMasterMode(&SPI0->CR, true); } void ST7565_BlitStatusLine(void) { - uint8_t i; + unsigned int i; SPI_ToggleMasterMode(&SPI0->CR, false); + ST7565_WriteByte(0x40); + ST7565_SelectColumnAndLine(4, 0); + GPIO_SetBit(&GPIOB->DATA, GPIOB_PIN_ST7565_A0); - for (i = 0; i < 0x80; i++) { - while ((SPI0->FIFOST & SPI_FIFOST_TFF_MASK) != SPI_FIFOST_TFF_BITS_NOT_FULL) { - } + for (i = 0; i < sizeof(gStatusLine); i++) + { + while ((SPI0->FIFOST & SPI_FIFOST_TFF_MASK) != SPI_FIFOST_TFF_BITS_NOT_FULL) {} SPI0->WDR = gStatusLine[i]; } + SPI_WaitForUndocumentedTxFifoStatusBit(); + SPI_ToggleMasterMode(&SPI0->CR, true); } void ST7565_FillScreen(uint8_t Value) { - uint8_t i, j; + unsigned int i; SPI_ToggleMasterMode(&SPI0->CR, false); - for (i = 0; i < 8; i++) { + for (i = 0; i < 8; i++) + { + unsigned int j; ST7565_SelectColumnAndLine(0, i); GPIO_SetBit(&GPIOB->DATA, GPIOB_PIN_ST7565_A0); - for (j = 0; j < 132; j++) { - while ((SPI0->FIFOST & SPI_FIFOST_TFF_MASK) != SPI_FIFOST_TFF_BITS_NOT_FULL) { - } + for (j = 0; j < 132; j++) + { + while ((SPI0->FIFOST & SPI_FIFOST_TFF_MASK) != SPI_FIFOST_TFF_BITS_NOT_FULL) {} SPI0->WDR = Value; } SPI_WaitForUndocumentedTxFifoStatusBit(); @@ -113,10 +132,16 @@ void ST7565_FillScreen(uint8_t Value) void ST7565_Init(void) { SPI0_Init(); + ST7565_Configure_GPIO_B11(); + SPI_ToggleMasterMode(&SPI0->CR, false); + + // RESET command ST7565_WriteByte(0xE2); - SYSTEM_DelayMs(0x78); + + SYSTEM_DelayMs(120); + ST7565_WriteByte(0xA2); ST7565_WriteByte(0xC0); ST7565_WriteByte(0xA1); @@ -126,18 +151,27 @@ void ST7565_Init(void) ST7565_WriteByte(0x81); ST7565_WriteByte(0x1F); ST7565_WriteByte(0x2B); + SYSTEM_DelayMs(1); + ST7565_WriteByte(0x2E); + SYSTEM_DelayMs(1); + ST7565_WriteByte(0x2F); ST7565_WriteByte(0x2F); ST7565_WriteByte(0x2F); ST7565_WriteByte(0x2F); - SYSTEM_DelayMs(0x28); + + SYSTEM_DelayMs(40); + ST7565_WriteByte(0x40); ST7565_WriteByte(0xAF); + SPI_WaitForUndocumentedTxFifoStatusBit(); + SPI_ToggleMasterMode(&SPI0->CR, true); + ST7565_FillScreen(0x00); } @@ -154,14 +188,11 @@ void ST7565_Configure_GPIO_B11(void) void ST7565_SelectColumnAndLine(uint8_t Column, uint8_t Line) { GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_ST7565_A0); - while ((SPI0->FIFOST & SPI_FIFOST_TFF_MASK) != SPI_FIFOST_TFF_BITS_NOT_FULL) { - } - SPI0->WDR = Line + 0xB0; - while ((SPI0->FIFOST & SPI_FIFOST_TFF_MASK) != SPI_FIFOST_TFF_BITS_NOT_FULL) { - } + while ((SPI0->FIFOST & SPI_FIFOST_TFF_MASK) != SPI_FIFOST_TFF_BITS_NOT_FULL) {} + SPI0->WDR = Line + 176; + while ((SPI0->FIFOST & SPI_FIFOST_TFF_MASK) != SPI_FIFOST_TFF_BITS_NOT_FULL) {} SPI0->WDR = ((Column >> 4) & 0x0F) | 0x10; - while ((SPI0->FIFOST & SPI_FIFOST_TFF_MASK) != SPI_FIFOST_TFF_BITS_NOT_FULL) { - } + while ((SPI0->FIFOST & SPI_FIFOST_TFF_MASK) != SPI_FIFOST_TFF_BITS_NOT_FULL) {} SPI0->WDR = ((Column >> 0) & 0x0F); SPI_WaitForUndocumentedTxFifoStatusBit(); } @@ -169,8 +200,6 @@ void ST7565_SelectColumnAndLine(uint8_t Column, uint8_t Line) void ST7565_WriteByte(uint8_t Value) { GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_ST7565_A0); - while ((SPI0->FIFOST & SPI_FIFOST_TFF_MASK) != SPI_FIFOST_TFF_BITS_NOT_FULL) { - } + while ((SPI0->FIFOST & SPI_FIFOST_TFF_MASK) != SPI_FIFOST_TFF_BITS_NOT_FULL) {} SPI0->WDR = Value; } - diff --git a/firmware b/firmware index de6b562..cae351a 100644 Binary files a/firmware and b/firmware differ diff --git a/firmware.bin b/firmware.bin index 2cedbd4..bda1e86 100644 Binary files a/firmware.bin and b/firmware.bin differ diff --git a/firmware.packed.bin b/firmware.packed.bin index dcf8584..e0d0e72 100644 Binary files a/firmware.packed.bin and b/firmware.packed.bin differ diff --git a/ui/lock.c b/ui/lock.c index 1f48788..b45b794 100644 --- a/ui/lock.c +++ b/ui/lock.c @@ -28,8 +28,8 @@ static void Render(void) { - char String[7]; unsigned int i; + char String[7]; memset(gStatusLine, 0, sizeof(gStatusLine)); memset(gFrameBuffer, 0, sizeof(gFrameBuffer)); @@ -39,7 +39,6 @@ static void Render(void) for (i = 0; i < 6; i++) String[i] = (gInputBox[i] == 10) ? '-' : '*'; String[6] = 0; - UI_PrintString(String, 0, 127, 3, 12, true); ST7565_BlitStatusLine(); diff --git a/ui/menu.c b/ui/menu.c index 435ccc4..e64b451 100644 --- a/ui/menu.c +++ b/ui/menu.c @@ -49,7 +49,7 @@ static const char MenuList[][7] = "MEM-CH", "SAVE", "VOX", - "ABR", + "BAK-LT", // 16 "TDR", "WX", @@ -275,14 +275,21 @@ void UI_DisplayMenu(void) gFrameBuffer[3][i] ^= 0xFF; } - for (i = 0; i < 7; i++) - { - gFrameBuffer[i][48] = 0xFF; - gFrameBuffer[i][49] = 0xFF; - } - + // draw vertical separating line + #if 0 + // original thick line + for (i = 0; i < 7; i++) + { + gFrameBuffer[i][48] = 0xFF; + gFrameBuffer[i][49] = 0xFF; + } + #else + // a nicer less intense thinner dotted line + for (i = 0; i < 6; i++) + gFrameBuffer[i][49] = 0xAA; + #endif + NUMBER_ToDigits(gMenuCursor + 1, String); - UI_DisplaySmallDigits(2, String + 6, 33, 6); if (gIsInSubMenu) @@ -515,7 +522,7 @@ void UI_DisplayMenu(void) UI_PrintString(String, 50, 127, 2, 8, true); if (gMenuCursor == MENU_VOL) - { // 2nd text line + { // 2nd text line .. percentage const uint16_t volts = (gBatteryVoltageAverage < gMin_bat_v) ? gMin_bat_v : (gBatteryVoltageAverage > gMax_bat_v) ? gMax_bat_v : gBatteryVoltageAverage; @@ -596,4 +603,3 @@ void UI_DisplayMenu(void) ST7565_BlitFullScreen(); } - diff --git a/ui/rssi.c b/ui/rssi.c index a69ef15..36ec6a2 100644 --- a/ui/rssi.c +++ b/ui/rssi.c @@ -26,43 +26,45 @@ static void Render(uint8_t RssiLevel, uint8_t VFO) { uint8_t *pLine; - uint8_t Line; - bool bIsClearMode; + uint8_t Line; + bool bIsClearMode; - if (gCurrentFunction == FUNCTION_TRANSMIT || gScreenToDisplay != DISPLAY_MAIN) { + if (gCurrentFunction == FUNCTION_TRANSMIT || gScreenToDisplay != DISPLAY_MAIN) return; - } - if (VFO == 0) { + if (VFO == 0) + { pLine = gFrameBuffer[2]; Line = 3; - } else { + } + else + { pLine = gFrameBuffer[6]; Line = 7; } memset(pLine, 0, 23); - if (RssiLevel == 0) { - pLine = NULL; + + if (RssiLevel == 0) + { + pLine = NULL; bIsClearMode = true; - } else { - memcpy(pLine, BITMAP_Antenna, 5); - memcpy(pLine + 5, BITMAP_AntennaLevel1, sizeof(BITMAP_AntennaLevel1)); - if (RssiLevel >= 2) { - memcpy(pLine + 8, BITMAP_AntennaLevel2, sizeof(BITMAP_AntennaLevel2)); - } - if (RssiLevel >= 3) { + } + else + { + memcpy(pLine, BITMAP_Antenna, 5); + memcpy(pLine + 5, BITMAP_AntennaLevel1, sizeof(BITMAP_AntennaLevel1)); + if (RssiLevel >= 2) + memcpy(pLine + 8, BITMAP_AntennaLevel2, sizeof(BITMAP_AntennaLevel2)); + if (RssiLevel >= 3) memcpy(pLine + 11, BITMAP_AntennaLevel3, sizeof(BITMAP_AntennaLevel3)); - } - if (RssiLevel >= 4) { + if (RssiLevel >= 4) memcpy(pLine + 14, BITMAP_AntennaLevel4, sizeof(BITMAP_AntennaLevel4)); - } - if (RssiLevel >= 5) { + if (RssiLevel >= 5) memcpy(pLine + 17, BITMAP_AntennaLevel5, sizeof(BITMAP_AntennaLevel5)); - } - if (RssiLevel >= 6) { + if (RssiLevel >= 6) memcpy(pLine + 20, BITMAP_AntennaLevel6, sizeof(BITMAP_AntennaLevel6)); - } + bIsClearMode = false; } @@ -71,23 +73,23 @@ static void Render(uint8_t RssiLevel, uint8_t VFO) void UI_UpdateRSSI(uint16_t RSSI) { - uint8_t Level; + uint8_t Level = 0; - if (RSSI >= gEEPROM_RSSI_CALIB[gRxVfo->Band][3]) { + if (RSSI >= gEEPROM_RSSI_CALIB[gRxVfo->Band][3]) Level = 6; - } else if (RSSI >= gEEPROM_RSSI_CALIB[gRxVfo->Band][2]) { + else + if (RSSI >= gEEPROM_RSSI_CALIB[gRxVfo->Band][2]) Level = 4; - } else if (RSSI >= gEEPROM_RSSI_CALIB[gRxVfo->Band][1]) { + else + if (RSSI >= gEEPROM_RSSI_CALIB[gRxVfo->Band][1]) Level = 2; - } else if (RSSI >= gEEPROM_RSSI_CALIB[gRxVfo->Band][0]) { + else + if (RSSI >= gEEPROM_RSSI_CALIB[gRxVfo->Band][0]) Level = 1; - } else { - Level = 0; - } - if (gVFO_RSSI_Level[gEeprom.RX_CHANNEL] != Level) { + if (gVFO_RSSI_Level[gEeprom.RX_CHANNEL] != Level) + { gVFO_RSSI_Level[gEeprom.RX_CHANNEL] = Level; Render(Level, gEeprom.RX_CHANNEL); } } -