mirror of
https://github.com/Genaker/LoraSA.git
synced 2026-03-28 17:42:59 +01:00
OSD integration
This commit is contained in:
224
include/DFRobot_OSD.cpp
Normal file
224
include/DFRobot_OSD.cpp
Normal file
@@ -0,0 +1,224 @@
|
||||
/*!
|
||||
* @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 << 5;
|
||||
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 << 5;
|
||||
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, 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;
|
||||
}
|
||||
Reference in New Issue
Block a user