#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include "pico/stdlib.h"
#include "hardware/i2c.h"
#include "hardware/timer.h"
#include "ssd1306.h"
#include "image.h"
#include "UART.h"
#include "acme_5_outlines_font.h"
#include "bubblesstandard_font.h"
#include "crackers_font.h"
#include "BMSPA_font.h"
#include "renew_font.h"
#include "fivexfive_font.h"
#include "encoder.h"


const uint8_t num_chars_per_disp[]={7,7,7,5};
const uint8_t *fonts[6]= {acme_font, bubblesstandard_font, crackers_font, BMSPA_font, renew_font, fivexfive_font};

#define SLEEPTIME 25


void setup_gpios(void);
void display_write(char *str1);  // show strings on 1306
 


//github for the 1306 lib is here. https://github.com/daschr/pico-ssd1306

int main() {
     stdio_init_all();


    printf("Welcome to encoder madness...\n");

    printf("initialed serial printing (or you wouldn't be reading this)...\n");

    printf("configuring pins...\n");
    setup_gpios(); // configure GPIOs for I2C (below)

    //configure GPIO for Encoder
    encoder_init();
    
    //write test message to SSD1306
    display_write("Welcome");

    while (2 > 0)
    {

 

    //get encoder reading.
    read_from_encoder();
   
 
    }
}
/*wiring.
POWER for 1306--connect to "-5 3V3 OUT"
The library by default uses I2C1 
use these PICO pins from dev board to the 1306 board.
SDA GP2/pin 4  
SCL GP3/pin 5

YES the 1306 can run from 3.3V supply Pico "3V3 OUT" 
MAKE SURE to ground the 1306 to the GND pin on PICO

ADDRESSING

7 bit address for 1306 by default is 0x3C
the address silked on the back 
of the shitty Chinese BoB's assumes MSB is 1--
that's slave
write to master--not what we are doing here.
So bit shift right the address on the back.
and put it into  ssd1306_init below.
*/

void setup_gpios(void) {
    i2c_init(i2c1, 400000);
    gpio_set_function(2, GPIO_FUNC_I2C);
    gpio_set_function(3, GPIO_FUNC_I2C);
    gpio_pull_up(2);
    gpio_pull_up(3);
}


void display_write(char *str1)
{
// send string to 1306

//initialize display
    ssd1306_t disp;  // instantiate from struct
    disp.external_vcc=false;
    ssd1306_init(&disp, 128, 64, 0x3C, i2c1);
    ssd1306_clear(&disp); //blank display

/*
	@brief draw string with given font

	@param[in] p : instance of display
	@param[in] x : x starting position of text
	@param[in] y : y starting position of text
	@param[in] scale : scale font to n times of original size (default should be 1)
	@param[in] font : pointer to font
	@param[in] s : text to draw
*/
 
    ssd1306_clear(&disp);
    ssd1306_draw_string_with_font(&disp, 8, 24, 2, fonts[4], str1);
    ssd1306_show(&disp);  

} 
 


pico:GP0
pico:GP1
pico:GND.1
pico:GP2
pico:GP3
pico:GP4
pico:GP5
pico:GND.2
pico:GP6
pico:GP7
pico:GP8
pico:GP9
pico:GND.3
pico:GP10
pico:GP11
pico:GP12
pico:GP13
pico:GND.4
pico:GP14
pico:GP15
pico:GP16
pico:GP17
pico:GND.5
pico:GP18
pico:GP19
pico:GP20
pico:GP21
pico:GND.6
pico:GP22
pico:RUN
pico:GP26
pico:GP27
pico:GND.7
pico:GP28
pico:ADC_VREF
pico:3V3
pico:3V3_EN
pico:GND.8
pico:VSYS
pico:VBUS
oled1:GND
oled1:VCC
oled1:SCL
oled1:SDA
encoder1:CLK
encoder1:DT
encoder1:SW
encoder1:VCC
encoder1:GND