Files
LoraSA/src/DFRobot_OSD.cpp
2024-08-13 14:49:51 +03:00

225 lines
5.0 KiB
C++

/*!
* @file DFRobot_OSD.cpp
* @brief Define the infrastructure DFRobot_OSD class
* @details This is a Library for OSD,the function is the superposition of characters.
* @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
* @license The MIT License (MIT)
* @author [Luyuhao](yuhao.lu@dfrobot.com)
* @maintainer [qsjhyy](yihuan.huang@dfrobot.com)
* @version V1.0
* @date 2022-05-19
* @url https://github.com/DFRobot/DFRobot_OSD
*/
#include <DFRobot_OSD.h>
#include <SPI.h>
void DFRobot_OSD::writeAddrData(unsigned char addr, unsigned char value)
{
digitalWrite(nCS, LOW);
SPI.transfer(addr);
SPI.transfer(value);
digitalWrite(nCS, HIGH);
}
void DFRobot_OSD::writeData(unsigned char value)
{
digitalWrite(nCS, LOW);
SPI.transfer(value);
digitalWrite(nCS, HIGH);
}
void DFRobot_OSD::clear(void)
{
unsigned int i;
writeAddrData(DMAH, 0x00); // address
writeAddrData(DMAL, 0);
writeAddrData(DMM, 0x01);
for (i = 0; i < (16 * 30); i++)
{
writeData(0);
}
writeData(0xff);
}
void DFRobot_OSD::displayChar(unsigned char row, unsigned char col, unsigned short addr)
{
unsigned short k;
unsigned char addrH, j;
k = row * 30 + col;
addrH = k >> 8;
writeAddrData(OSDBL, 0X00);
writeAddrData(DMM, 0x40);
writeAddrData(DMAH, addrH | 0x2);
writeAddrData(DMAL, k);
j = CHAR_LBC;
if ((addr >> 8) != 0)
j |= 0x10;
writeAddrData(DMDI, j);
writeAddrData(DMAH, addrH);
writeAddrData(DMAL, k);
writeAddrData(DMDI, addr);
writeAddrData(VM0, 0x48);
}
void DFRobot_OSD::displayString(unsigned char row, unsigned char col, const char *s)
{
unsigned short k;
unsigned char addrH, j;
unsigned char c;
unsigned short value;
c = *s++;
int flag = 0;
k = row * 30 + col;
writeAddrData(OSDBL, 0X00);
while (c != 0)
{
flag = 0;
int i = 0;
for (i = 0; i < 34; i++)
{
if (c == tAsciiAddr[i].ascii)
{
value = tAsciiAddr[i].addr;
flag = 1;
}
}
if (flag == 0)
{
if ((c >= '0') && (c <= '9'))
value = ((c == '0') ? 10 : c - '1' + 1);
else if ((c >= 'A') && (c <= 'Z'))
value = (c - 'A' + 11);
else if ((c >= 'a') && (c <= 'z'))
value = (c - 'a' + 37);
else
value = (0x00);
}
addrH = k >> 8;
writeAddrData(DMM, 0x40);
writeAddrData(DMAH, addrH | 0x2);
writeAddrData(DMAL, k);
j = CHAR_LBC;
if ((value >> 8) != 0)
j |= 0x10;
writeAddrData(DMDI, j);
writeAddrData(DMAH, addrH);
writeAddrData(DMAL, k);
writeAddrData(DMDI, value);
c = *s++;
k = k + 1;
}
writeAddrData(VM0, 0x48);
}
void DFRobot_OSD::displayString(unsigned char row, unsigned char col, String s)
{
const char *str = s.c_str();
displayString(row, col, str);
}
void DFRobot_OSD::init(int SCK, int MISO, int MOSI)
{
pinMode(nCS, OUTPUT);
SPI.begin(SCK, MISO, MOSI);
writeAddrData(VM0, 0x42); // Software Reset, takes 100us, PAL/NTSC????
writeAddrData(DMAH, 0x00); // address
writeAddrData(DMAL, 68);
writeAddrData(OSDM, 0x00);
}
DFRobot_OSD::DFRobot_OSD(int CS) { nCS = CS; }
DFRobot_OSD::~DFRobot_OSD() {}
void DFRobot_OSD::writeAT7456E(unsigned short addr, int *dt)
{
unsigned char addrH, n;
addrH = (addr >> 8);
writeAddrData(VM0, (0x00));
delay(30);
writeAddrData(CMAH, addr);
writeAddrData(DMM, 0);
for (n = 0; n < 54; n++)
{
char i = *dt;
writeAddrData(CMAL, n | (addrH << 6));
writeAddrData(CMDI, i);
dt++;
}
writeAddrData(CMM, RAM_NVM);
delay(10);
writeAddrData(VM0, 0x01 << 3);
}
void DFRobot_OSD::storeChar(unsigned short addr, const int temp[])
{
int buf[54] = {0};
int dt[54] = {0};
int i = 0;
int n = 0;
int *p;
for (i = 0; i < 54; i++)
{
if (i < 8)
{
dt[i] = 0;
}
else
dt[i] = temp[i - 8];
}
for (i = 0; i < 18; i++)
{
p = extend(dt[i * 2]);
buf[n++] = *p;
buf[n++] = *(p + 1);
p = extend(dt[i * 2 + 1]);
buf[n++] = *p;
}
writeAT7456E(addr, buf);
}
int *DFRobot_OSD::extend(int src)
{
int i = 0;
src = unified(src);
static int tar[2];
tar[0] = 0;
tar[1] = 0;
for (i = 0; i < 4; i++)
{
if ((src >> i) & 0x01)
{
tar[0] = 0x02 | (tar[0] << 2);
}
else
tar[0] = 0x01 | (tar[0] << 2);
}
for (i = 4; i < 8; i++)
{
if ((src >> i) & 0x01)
{
tar[1] = 0x02 | (tar[1] << 2);
}
else
tar[1] = 0x01 | (tar[1] << 2);
}
return tar;
}
int DFRobot_OSD::unified(int src)
{
int num = 0;
int i = 0;
for (i = 0; i < 8; i++)
{
num = (num << 1) | ((src >> i) & 0x01);
}
return num;
}