
/*
 * stm32_halDisplay.cpp
 *
 *  Created on: 1 Nov 2020
 *      Author: mike
 */
#include "main.h"

#include "libOLED/stm32_halDisplay.H"

stm32_halDisplay_t::stm32_halDisplay_t (int const width, int const height,
					int const ramwidth, uint8_t *const data,
					SPI_HandleTypeDef *const spiInterface,
					GPIO_TypeDef *const CD_GPIO,
					uint16_t CD_GPIO_Pin,
					GPIO_TypeDef *const RESET_GPIO,
					uint16_t RESET_GPIO_Pin,
					GPIO_TypeDef *const NSS_GPIO,
					uint16_t NSS_GPIO_Pin) :
    display_t (width, height, ramwidth, data), m_spiInterface (spiInterface), m_CD_GPIO (
	CD_GPIO), m_CD_GPIO_Pin (CD_GPIO_Pin), m_RESET_GPIO (RESET_GPIO), m_RESET_GPIO_Pin (
	RESET_GPIO_Pin), m_NSS_GPIO (NSS_GPIO), m_NSS_GPIO_Pin (NSS_GPIO_Pin)
{
}

void
stm32_halDisplay_t::oledSetCD (uint8_t cd)
{
  HAL_GPIO_WritePin (m_CD_GPIO, m_CD_GPIO_Pin, cd ? GPIO_PIN_SET : GPIO_PIN_RESET);
}

void
stm32_halDisplay_t::oledReset (void)
{

  HAL_GPIO_WritePin (m_RESET_GPIO, m_RESET_GPIO_Pin, GPIO_PIN_SET);
  // VDD (3.3V) goes high at start, lets just chill for a ms
  HAL_Delay (1);
  // bring reset low
  HAL_GPIO_WritePin (m_RESET_GPIO, m_RESET_GPIO_Pin, GPIO_PIN_RESET);
  // wait 10ms
  HAL_Delay (10);
  // bring out of reset
  HAL_GPIO_WritePin (m_RESET_GPIO, m_RESET_GPIO_Pin, GPIO_PIN_SET);
}

void
stm32_halDisplay_t::oledWrite (uint8_t c)
{
  uint8_t buffer[1];
  buffer[0] = c;

  HAL_GPIO_WritePin (m_NSS_GPIO, m_NSS_GPIO_Pin, GPIO_PIN_RESET);

  HAL_SPI_Transmit (m_spiInterface, buffer, 1, 2); // allow 2mS for transfer

  HAL_GPIO_WritePin (m_NSS_GPIO, m_NSS_GPIO_Pin, GPIO_PIN_SET);
}

void
stm32_halDisplay_t::oledWrite (uint8_t *buffer, uint8_t len)
{
  HAL_GPIO_WritePin (m_NSS_GPIO, m_NSS_GPIO_Pin, GPIO_PIN_RESET);

  HAL_SPI_Transmit (m_spiInterface, buffer, len, 100); // allow 100mS for transfer

  HAL_GPIO_WritePin (m_NSS_GPIO, m_NSS_GPIO_Pin, GPIO_PIN_SET);

}

