/* Test SH1106 OLED displeje
 * (c) Jirka Chráska 2026; jirka@lixis.cz
 */

#include <string.h>
#include "sh1106_i2c.h"
#include "font.h"

sh1106_t disp;

extern bitmapFONT font_spleen_6x12;
extern bitmapFONT font_spleen_8x16;
extern bitmapFONT font_spleen_16x32;
extern bitmapFONT font_10x20;
extern bitmapFONT font_9x15;


#define WHITE 1
#define BLACK 0

void screen1( void )
{
    SH1106_clear(&disp);
    SH1106_drawString(&disp, 0, 0, &font_spleen_8x16, "Maličký ježeček", WHITE);
    SH1106_drawString(&disp, 0, 16, &font_spleen_8x16, "žere jablíčka", WHITE);
    SH1106_draw(&disp); 
}

void screen2( void )
{
    SH1106_clear(&disp);
    SH1106_drawString(&disp, 0, 0, &font_9x15, "ΑBΓΔEΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ", WHITE);
    SH1106_drawString(&disp, 0, 32, &font_9x15, "αβγδεζηϑικλμνξοπρσςτυφχψω", WHITE); 
    SH1106_draw(&disp);
}

void screen3( void )
{
    SH1106_clear(&disp);
    SH1106_drawString(&disp, 0, 0, &font_spleen_8x16, "Здравствуйте.", WHITE);
    SH1106_drawString(&disp, 0, 16, &font_spleen_8x16, "Χριστός ανέστη!", WHITE);
    SH1106_draw(&disp); 
}

void screen( const char *str )
{
    SH1106_clear(&disp);
    SH1106_drawString(&disp, 0, 0, &font_spleen_8x16, str, WHITE);
    SH1106_draw(&disp);
}




void setup_i2c( void )
{
    i2c_init(i2c0, 1000000);
    gpio_set_function(4, GPIO_FUNC_I2C);
    gpio_set_function(5, GPIO_FUNC_I2C);
    gpio_pull_up(4);
    gpio_pull_up(5);
    sleep_ms(150);
}


int main() {
char buf1[128];
char buf2[128];
    memset(buf1,'\0',128);
    memset(buf2,'\0',128);

    stdio_init_all();
    setup_i2c();
    SH1106_init(&disp, i2c0, 0x3C, 128, 64);
    screen("Příliš žluťoučkýkůň pěl ďábelské ódy.");
    sleep_ms(5000);
    screen2();
    sleep_ms(5000);
    screen3();
    sleep_ms(5000);
    
    SH1106_clear(&disp);
    SH1106_drawRectangle(&disp, 0, 0, 127, 63, WHITE);
    SH1106_drawString(&disp, 10, 10, &font_spleen_8x16, "Obdélník bílý", BLACK);
    SH1106_draw(&disp); 
    sleep_ms(5000);
    SH1106_clear(&disp);
    SH1106_drawRectangle(&disp, 0, 0, 127, 63,BLACK);
    SH1106_drawString(&disp, 10, 10, &font_spleen_8x16, "Obdélník černý", WHITE);
    SH1106_draw(&disp); 
    sleep_ms(2000);
    
    while (1) {
        screen("Test kreslení   čar");
        sleep_ms(2000);
        for( int i=0; i<64; i++) {
            SH1106_clear(&disp);
            SH1106_drawLine(&disp,0,0,127,0,WHITE);
            SH1106_drawLine(&disp,0,0,0,63,WHITE);
            SH1106_drawLine(&disp,0,63,127,63,WHITE);
            SH1106_drawLine(&disp,127,0,127,63,WHITE);
            SH1106_drawLine(&disp,0,i,127,63-i,WHITE);
            SH1106_draw(&disp); // zobrazíme na displeji
            //sleep_ms(100);
        }
        sleep_ms(2000);
        SH1106_clear(&disp);
        for( int k=0; k<127; k++) {
            SH1106_drawLine(&disp,0,0,127,0,WHITE);
            SH1106_drawLine(&disp,0,0,0,63,WHITE);
            SH1106_drawLine(&disp,0,63,127,63,WHITE);
            SH1106_drawLine(&disp,127,0,127,63,WHITE);
            SH1106_drawLine(&disp,k,0,127-k,63,WHITE);
            SH1106_draw(&disp); // zobrazíme na displeji
            //sleep_ms(100);
        }
        sleep_ms(2000);       
        SH1106_clear(&disp);
        for( int k=0; k<64; k++) {
            SH1106_drawLine(&disp,0,0,127,0,WHITE);
            SH1106_drawLine(&disp,0,0,0,63,WHITE);
            SH1106_drawLine(&disp,0,63,127,63,WHITE);
            SH1106_drawLine(&disp,127,0,127,63,WHITE);
            
            SH1106_drawLine(&disp,0,k,127,63-k,WHITE);
            // SH1106_drawLine(&disp,125-k,63,k,0);
            
            SH1106_draw(&disp); // zobrazíme na displeji
            //sleep_ms(100);
        }
        sleep_ms(2000);  
        
        screen("Test kreslení   kružnic");
        SH1106_clear(&disp);
        for( int k=0; k<32; k++) {
            SH1106_drawLine(&disp,0,0,127,0,WHITE);
            SH1106_drawLine(&disp,0,0,0,63,WHITE);
            SH1106_drawLine(&disp,0,63,127,63,WHITE);
            SH1106_drawLine(&disp,127,0,127,63,WHITE);
            SH1106_drawCircle(&disp,64,32,k,WHITE);
            SH1106_draw(&disp); // zobrazíme na displeji
            sleep_ms(10);
        }
        sleep_ms(1000);  
        for( int k=0; k<31; k++) {
            SH1106_drawLine(&disp,0,0,127,0,WHITE);
            SH1106_drawLine(&disp,0,0,0,63,WHITE);
            SH1106_drawLine(&disp,0,63,127,63,WHITE);
            SH1106_drawLine(&disp,127,0,127,63,WHITE);
            // problém při kreslení větších kružnic než r==32, sekne se to
            SH1106_drawCircle(&disp,64,32,k,BLACK);
            SH1106_draw(&disp); // zobrazíme na displeji
            sleep_ms(10);
        }
        sleep_ms(2000);  
        SH1106_clear(&disp);          
        screen("Všechna písmena Spleen 16x32");
        sleep_ms(2000);
        for( int j = 0; j < font_spleen_16x32.Chars; j++  ) {
            sprintf(buf1, "Index :%d", j);
            sprintf(buf2, "CodePt:%x", font_spleen_16x32.Index[j] );
            SH1106_clear(&disp);
            //SH1106_drawRectangle(&disp, 0, 0, 127, 31,0);
            SH1106_drawLine(&disp,0,0,127,0,WHITE);
            SH1106_drawLine(&disp,0,0,0,63,WHITE);
            SH1106_drawLine(&disp,0,63,127,63,WHITE);
            SH1106_drawLine(&disp,127,0,127,63,WHITE);
            SH1106_drawString(&disp,14,2,&font_spleen_6x12,"Font Spleen 16x32",WHITE);
            SH1106_drawLine(&disp,0,15,127,15,WHITE);
            SH1106_drawChar(&disp, 3, 20, &font_spleen_16x32, j, j%2 );
            SH1106_drawString(&disp, 30, 20, &font_spleen_8x16, buf1, WHITE);
            SH1106_drawString(&disp, 30, 36, &font_spleen_8x16, buf2, WHITE);
            SH1106_draw(&disp); // zobrazíme písmenka na displeji
            sleep_ms(500);
        }

        screen("Všechna písmena Font 9x15");
        sleep_ms(2000);
        for( int j = 0; j < font_9x15.Chars; j++  ) {
            sprintf(buf1, "Index :%d", j);
            sprintf(buf2, "CodePt:%x", font_9x15.Index[j] );
            SH1106_clear(&disp);
            SH1106_drawLine(&disp,0,0,125,0,WHITE);
            SH1106_drawLine(&disp,0,0,0,63,WHITE);
            SH1106_drawLine(&disp,0,63,125,63,WHITE);
            SH1106_drawLine(&disp,125,0,125,63,WHITE);
            SH1106_drawString(&disp,14,2,&font_spleen_6x12,"Font 9x15",WHITE);
            SH1106_drawChar(&disp, 3, 20, &font_9x15, j ,WHITE);
            SH1106_drawString(&disp, 30, 20, &font_spleen_8x16, buf1, WHITE);
            SH1106_drawString(&disp, 30, 36, &font_spleen_8x16, buf2, WHITE);
            SH1106_draw(&disp); // zobrazíme písmenka na displeji
            sleep_ms(500);
        }
    }

return 0;
}
