
/*
 * display.cpp
 *
 *  Created on: 30 Nov 2020
 *      Author: mike
 */

#include "main.h"
#include "display.h"
#include "timing.h"
#include <cstring>
#include "libOLED/stm32_halDisplay.H"
#include "libOLED/fontclass.H"
#include "libOLED/displayDial.H"
#include "libOLED/displayXY.H"
#include "libPlx/displayInfo.H"
#include "libOLED/ap_math.h"
#include "libSmallPrintf/small_printf.h"
#include "splash.H"

namespace
{
	int const WIDTH = 128;
	int const HEIGHT = 64;
	int const DISPLAY_RAMWIDTH = 132;

	int x = 500;
	int y = 20;
	int ph = 0;


}

uint8_t displayBuffer[2][dataSize(WIDTH, HEIGHT)];

stm32_halDisplay_t displays[MAX_DISPLAYS] =
	{
		stm32_halDisplay_t(WIDTH, HEIGHT, DISPLAY_RAMWIDTH, displayBuffer[0],
						   &hspi1,
						   SPI_CD_GPIO_Port,
						   SPI_CD_Pin,
						   SPI_RESET_GPIO_Port,
						   SPI_RESET_Pin,
						   SPI_NSS1_GPIO_Port,
						   SPI_NSS1_Pin),
};
// display from 0 to 1000 rpm , and 0 to 1000mB 
displayXY_t dispXY(displays[0], 500, 6000, 1000, 0);

// set up sine tables
ap_math m;

#if defined __cplusplus
extern "C"
{
#endif

	void
	cc_init()
	{
		for (auto i = 0; i < MAX_DISPLAYS; i++)
		{
			display_t &display = displays[i];
			if (i == 0)
				display.reset();
			display.init();
			display.clearDisplay(BLACK);
			display.display();
			displaySplash(display);
			display.gotoxy(8, 32);
			display.printString(large_font, i == 0 ? "1" : "2", 1, BLACK);
			display.display();
		}
	}

	int
	cc_display(int dialIndex)
	{

		if (dialIndex < 0 && dialIndex > MAX_DISPLAYS)
			return -1;
		stm32_halDisplay_t &display = displays[dialIndex];
		display.clearDisplay(BLACK);
		dispXY.drawAxes();
		x += 50;
		y = m.ap_sin(ph + (x / 20))  + 1000-256;  // wobbling about 1000 mB down to about 490mB

		if (x > 6000)
		{
			ph += 200;
			if (ph > 360 * m.SINE_SCALING)
				ph -= 360 * m.SINE_SCALING;

			x = 500;
		}
		display.dim(false);
		char buff[10];
		char buff1[10];
		char buff2[10];
		small_sprintf(buff1, "x=%4d", x);
		small_sprintf(buff2, "y=%4d", y);
		int tim = timing(x,1000-y);
		small_sprintf(buff, "%2d.%1d\xb0",tim/10, tim%10 );

		dispXY.plotPoint(x, y, buff, buff1, buff2);
		display.dim(true);
		display.display();

		return 0;
	}

#if defined __cplusplus
}
#endif
