Files
LoraSA/include/DFRobot_OSD.h
2024-09-19 16:00:38 -07:00

270 lines
8.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*!
* @file DFRobot_OSD.h
* @brief Define infrastructure of 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
*/
#ifndef _DFRobot_OSD_H_
#define _DFRobot_OSD_H_
#define MAX_POWER_LEVELS 33
#include <Arduino.h>
/*Define Custom characters Example*/
static const int buf0[36] = {0x02, 0x80, 0x02, 0x40, 0x7F, 0xE0, 0x42, 0x00,
0x42, 0x00, 0x7A, 0x40, 0x4A, 0x40, 0x4A, 0x80,
0x49, 0x20, 0x5A, 0xA0, 0x44, 0x60, 0x88, 0x20};
static constexpr uint16_t levels[10] = {
0x105, // 0
0x10E, // 1
0x10D, // 2
0x10C, // 3
0x10B, // 4
0x10A, // 5
0x109, // 6
0x108, // 7
0x107, // 8
0x106, // 9
};
static constexpr uint16_t power_level[MAX_POWER_LEVELS + 1] = {
0x10E, // 0
0x10E, // 1
0x10D, // 2
0x10C, // 3
0x10B, // 4
0x10A, // 5
0x109, // 6
0x108, // 7
0x107, // 8
0x106, // 9 not using 106 to accent rise
// new line
0x10E, // 10
0x10D, // 11
0x10C, // 12
0x10B, // 13
0x10A, // 14
0x109, // 15
0x108, // 16
0x107, // 17
0x106, // 18 not using 106
// new line
0x10E, // 19
0x10D, // 20
0x10C, // 21
0x10B, // 22
0x10A, // 23
0x109, // 24
0x108, // 25
0x107, // 26
0x106, // 27
0x105, // 28 ---
0x105, // 29
0x105, // 30
0x105, // 31
0x105, // 32
0x105 // 33
};
// #define ENABLE_DBG //!< Open this macro and you can see the details of the program
#ifdef ENABLE_DBG
#define DBG(...) \
{ \
Serial.print("["); \
Serial.print(__FUNCTION__); \
Serial.print("(): "); \
Serial.print(__LINE__); \
Serial.print(" ] "); \
Serial.println(__VA_ARGS__); \
}
#else
#define DBG(...)
#endif
/* at7456 */
#define VM0 0x00 ///< Video Mode0
#define VM1 0x01 ///< Video Mode1
#define HOS 0x02 ///< Horizontal Offset
#define VOS 0x03 ///< Vertical Offset
#define DMM 0x04 ///< Display Memory Mode
#define DMAH 0x05 ///< Display Memory Address High
#define DMAL 0x06 ///< Display Memory Address Low
#define DMDI 0x07 ///< Display Memory Data In
#define CMM 0x08 ///< Character Memory Mode
#define CMAH 0x09 ///< Character Memory Address High
#define CMAL 0x0a ///< Character Memory Address Low
#define CMDI 0x0b ///< Character Memory Data In
#define OSDM 0x0c ///< OSD Insertion Mux
#define RB0 0x10 ///< Row 0 Brightness
#define RB1 0x11 ///< Row 1 Brightness
#define RB2 0x12 ///< Row 2 Brightness
#define RB3 0x13 ///< Row 3 Brightness
#define RB4 0x14 ///< Row 4 Brightness
#define RB5 0x15 ///< Row 5 Brightness
#define RB6 0x16 ///< Row 6 Brightness
#define RB7 0x17 ///< Row 7 Brightness
#define RB8 0x18 ///< Row 8 Brightness
#define RB9 0x19 ///< Row 9 Brightness
#define RB10 0x1a ///< Row 10 Brightness
#define RB11 0x1b ///< Row 11 Brightness
#define RB12 0x1c ///< Row 12 Brightness
#define RB13 0x1d ///< Row 13 Brightness
#define RB14 0x1e ///< Row 14 Brightness
#define RB15 0x1f ///< Row 15 Brightness
#define OSDBL 0x6c ///< OSD Black Level
#define STAT 0x20 ///< Status
#define DMDO 0x30 ///< Display Memory Data Out
#define CMDO 0x40 ///< Character Memory Data Out
#define NVM_RAM 0x50 ///< Read the fonts in the NVM into the mirror RAM
#define RAM_NVM 0xa0 ///< Write the database data in the mirror RAM to the NVM
/* VM0 */
#define NTSC (0 << 6) ///< D6 --- Vidoe Standard Select
#define PAL (1 << 6)
#define SYNC_AUTO (0 << 4) ///< D5,D4 --- Sync Select Mode
#define SYNC_EXTERNAL (2 << 4)
#define SYNC_INTERNAL (3 << 4)
#define OSD_ENABLE (1 << 3) ///< D3 --- Enable Display of OSD image
#define OSD_DISABLE (0 << 3)
#define SOFT_RESET (1 << 1) ///< D1 --- Software Reset
#define VOUT_ENABLE (0 << 0)
#define VOUT_DISABLE (1 << 0)
/* VM1 */
#define BACKGND_0 (0 << 4) ///< Background level WHT%
#define BACKGND_7 (1 << 4)
#define BACKGND_14 (2 << 4)
#define BACKGND_21 (3 << 4)
#define BACKGND_28 (4 << 4)
#define BACKGND_35 (5 << 4)
#define BACKGND_42 (6 << 4)
#define BACKGND_49 (7 << 4)
#define BLINK_TIME40 (0 << 2) ///< Blink cycle, ms
#define BLINK_TIME80 (1 << 2)
#define BLINK_TIME120 (2 << 2)
#define BLINK_TIME160 (3 << 2) ///< Scintillation ratio(ON : OFF)
#define BLINK_DUTY_1_1 0 ///< BT : BT
#define BLINK_DUTY_1_2 1 ///< BT : 2BT
#define BLINK_DUTY_1_3 2 ///< BT : 3BT
#define BLINK_DUTY_3_1 3 ///< 3BT : BT // DMM
#define SPI_BIT16 \
(0 << 6) ///< use 16bit When writing characters, and the character attribute is from
///< the DMM[5:3]
#define SPI_BIT8 \
(1 << 6) ///< Write characters in 8bit, and character attributes are written
///< separately
#define CHAR_LBC (1 << 5) ///< The local background
#define CHAR_BLK (1 << 4) ///< blinking display
#define CHAR_INV (1 << 3) ///< display negative image
#define CLEAR_SRAM (1 << 2) ///< clear20us
#define VETICAL_SYNC (1 << 1) ///< The command is in sync with the action
#define AUTO_INC (1 << 0) ///< The character address automatically increases
/* RBi */
#define BLACK_LEVEL_0 (0 << 2) ///< 0% white level
#define BLACK_LEVEL_10 (1 << 2) ///< 10% white level
#define BLACK_LEVEL_20 (2 << 2) ///< 20% white level
#define BLACK_LEVEL_30 (3 << 2) ///< 30% white level
#define WHITE_LEVEL_120 (0 << 0) ///< 120% white level
#define WHITE_LEVEL_100 (1 << 0) ///< 110% white level
#define WHITE_LEVEL_90 (2 << 0) ///< 90% white level
#define WHITE_LEVEL_80 (3 << 0) ///< 80% white level
/* STAT */
#define PAL_DETECT (1 << 0) ///< Check the PAL signal
#define NTSC_DETECT (1 << 1) ///< Check the NTSC signal
#define LOS_DETECT (1 << 2) ///< Check the LOS signal
#define VSYNC (1 << 4) ///< synchronous
/**
* @struct AsciiAddr
* @brief Ascii corresponding address struct
*/
typedef struct
{
char ascii;
short addr;
} AsciiAddr;
const AsciiAddr tAsciiAddr[] = {
{' ', 0x00}, {'(', 0x3f}, {')', 0x40}, {'.', 0x41}, {'?', 0x42}, {';', 0x43},
{':', 0x44}, {',', 0x45}, {'\'', 0x46}, {'/', 0x47}, {'"', 0x48}, {'-', 0x49},
{'<', 0x4a}, {'>', 0x4b}, {'@', 0x4c}, {'!', 0x121}, {'#', 0x123}, {'$', 0x124},
{'%', 0x125}, {'&', 0x126}, {'(', 0x128}, {')', 0x129}, {'*', 0x12a}, {'+', 0x12b},
{'_', 0x12d}, {'=', 0x13d}, {'[', 0x15b}, {']', 0x15d}, {'^', 0x15e}, {'`', 0x160},
{'{', 0x17b}, {'|', 0x17c}, {'}', 0x17d}, {'~', 0x17e},
};
class DFRobot_OSD
{
public:
/**
* @fn DFRobot_OSD
* @brief Constructor
* @param CS - CS selection pin
* @return None
*/
DFRobot_OSD(int CS);
~DFRobot_OSD();
/**
* @fn init
* @brief Init function
* @return None
*/
void init(int OSD_SCK, int OSD_MISO, int OSD_MOSI);
/**
* @fn displayChar
* @brief display char
* @param row - Horizontal coordinate, range(0,15)
* @param col - Vertical coordinate, range(0,29)
* @param value - addr of char in eeprom
* @return None
*/
void displayChar(unsigned char row, unsigned char col, unsigned short addr);
/**
* @fn displayChar
* @brief display string
* @param row - Horizontal coordinate, range(0,15)
* @param col - Vertical coordinate, range(0,29)
* @param s - String
* @return None
*/
void displayString(unsigned char row, unsigned char col, const char *s);
void displayString(unsigned char row, unsigned char col, String s);
/**
* @fn clear
* @brief Clear screen
* @return None
*/
void clear(void);
/**
* @fn storeChar
* @brief Write the custom character to the OSD, replacing the original character
* @param addr - Address of the stored character
* @param dt - Array generated through the tool
* @return None
*/
void storeChar(unsigned short addr, const int dt[]);
private:
void writeAddrData(unsigned char addr, unsigned char dat);
void writeAT7456E(unsigned short addr, int *dt);
void writeData(unsigned char dat);
int *extend(int src);
int unified(int src);
private:
int nCS;
};
#endif