/*
* display.cpp
*
* Created on: 30 Nov 2020
* Author: mike
*/
#include "main.h"
#include "display.h"
#include "libIgnTiming/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;
uint32_t atmPress; // actual atmospheric pressure
uint32_t press; // pressure millibar * 100 based on normalised pressure
int32_t temp; // temperature * 10
int rpm; // engine RPM
int timing; // timing value .
}
uint8_t displayBuffer[MAX_DISPLAYS][dataSize(WIDTH, HEIGHT)];
stm32_halDisplay_t displays[MAX_DISPLAYS] =
{
stm32_halDisplay_t(WIDTH, HEIGHT, DISPLAY_RAMWIDTH, displayBuffer[0],
&hspi1,
SPI1_CD_GPIO_Port,
SPI1_CD_Pin,
SPI1_RESET_GPIO_Port,
SPI1_RESET_Pin,
SPI1_NSS_GPIO_Port,
SPI1_NSS_Pin),
};
// display from 0 to 1000 rpm , and 0 to 1000mB
displayXY_t dispXY(displays[0], 500, 6000, 1050, 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.gotoxy(8, 32);
display.printString(large_font, "mikeJ", 5, BLACK);
display.display();
}
}
int
cc_display(uint8_t dialIndex, uint8_t intensity, uint8_t do_reset)
{
if (dialIndex < 0 && dialIndex > MAX_DISPLAYS)
return -1;
stm32_halDisplay_t &display = displays[dialIndex];
if (do_reset)
{
display.reset();
display.init();
}
display.clearDisplay(BLACK);
display.dim(intensity == 2 ? 255 : 0);
if (intensity > 0)
{
dispXY.drawAxes();
char buff1[20]; // manifold / atmospheric pressure
char buff2[20]; // temp / rpm string
char buff[10]; // timing code
small_sprintf(buff, "%2d.%01d", timing / 10, timing % 10);
small_sprintf(buff1, "M%4ld A%4ld.%1ld", press / 100, atmPress / 100,(atmPress/10)%10);
small_sprintf(buff2, "%2ld.%ldC %4drpm", temp / 100, (temp /10) % 10, rpm);
dispXY.plotPoint(rpm, press / 100, buff, buff1, buff2 );
}
display.display();
return 0;
}
void cc_feed_env(uint32_t atmPressVal, uint32_t pressVal, int32_t tempVal)
{
atmPress = atmPressVal;
press = pressVal;
temp = tempVal;
}
void cc_feed_timing(int timing_)
{
timing = timing_;
}
void cc_feed_rpm(int rpm_)
{
rpm = rpm_;
}
#if defined __cplusplus
}
#endif