Kalapaja / kampela-firmware

Firmware sources and associated software projects for the Kampela hardware signer
https://kampe.la
GNU General Public License v3.0
4 stars 9 forks source link

moderately fast screen refresh #16

Open Slesarew opened 9 months ago

Slesarew commented 9 months ago

Implement intermediate screen refresh feature; use it as much as possible on all complete UI transitions except for device initialization and secure screen wipe steps.

SmallSharky commented 8 months ago

Sample code (C language):


/**
 * Ultrafast
 */
EPD_Text(0, 115, "Randomizing", 1, 0);
EPD_PartWriteFull(true);
EPD_DeepSleepNoWait();

void EPD_PartWriteFull(bool init)
{
    if (init)
    {
        EPD_reset();
        Epaper_Write_Command(0x3C); //BorderWavefrom,
        Epaper_Write_Data(0x80);
    }

    Epaper_Write_Command(0x24); //Write Black and White image to RAM

    DISP_CS(0);
    DISP_DC(1);
    SpiWriteArray(FrameBuffer, BUFSIZE);
    DISP_CS(1);

    EPD_Part_Update();
}

void EPD_Part_Update(void)
{
    Epaper_Write_Command(0x22); //Display Update Control
    Epaper_Write_Data(0xFF);
    Epaper_Write_Command(0x20); //Activate Display Update Sequence
    Delay(1);
    while (DISP_BUSY) ;
}

void EPD_DeepSleepNoWait(void)
{
    Epaper_Write_Command(0x10); //enter deep sleep
    Epaper_Write_Data(0x01);
}

/**
 * Fast
 */

EPD_HW_Init_Fast();
EPD_putLogo(grob, 0, sizeof(grob));  тут что-то нарисовать
EPD_WriteScreen_Buff_Fast();
while (DISP_BUSY) ;
EPD_DeepSleep();

void EPD_HW_Init_Fast(void)
{
    EPD_reset();

    while (DISP_BUSY) ;
    EPD_cmd8(0x12); //SWRESET
    while (DISP_BUSY) ;

    Epaper_Write_Command(0x18); //Read built-in temperature sensor
    Epaper_Write_Data(0x80);

    Epaper_Write_Command(0x22); // Load temperature value
    Epaper_Write_Data(0xB1);
    Epaper_Write_Command(0x20);
    while (DISP_BUSY) ;

    Epaper_Write_Command(0x1A); // Write to temperature register
    Epaper_Write_Data(0x64);
    Epaper_Write_Data(0x00);

    Epaper_Write_Command(0x22); // Load temperature value
    Epaper_Write_Data(0x91);
    Epaper_Write_Command(0x20);
    while (DISP_BUSY) ;
}

void EPD_WriteScreen_Buff_Fast()
{
    unsigned int i;
    Epaper_Write_Command(0x24); //write RAM for black(0)/white (1)
    for (i = 0; i < sizeof(FrameBuffer); i++)
    {
        Epaper_Write_Data(FrameBuffer[i]);
    }
    EPD_Update_Fast();
}

void EPD_Update_Fast(void)
{
    Epaper_Write_Command(0x22); //Display Update Control
    Epaper_Write_Data(0xC7); //C7
    Epaper_Write_Command(0x20); //Activate Display Update Sequence
    Delay(1);
    while (DISP_BUSY) ;
}