mirror of
https://github.com/Bodmer/TFT_eSPI.git
synced 2025-08-06 06:04:42 +02:00
@@ -22,6 +22,11 @@
|
|||||||
// Processor ID reported by getSetup()
|
// Processor ID reported by getSetup()
|
||||||
#define PROCESSOR_ID 0x2040
|
#define PROCESSOR_ID 0x2040
|
||||||
|
|
||||||
|
// Transactions always supported
|
||||||
|
#ifndef SUPPORT_TRANSACTIONS
|
||||||
|
#define SUPPORT_TRANSACTIONS
|
||||||
|
#endif
|
||||||
|
|
||||||
// Include processor specific header
|
// Include processor specific header
|
||||||
// None
|
// None
|
||||||
|
|
||||||
@@ -285,6 +290,25 @@
|
|||||||
spi.transfer(0); spi.transfer((C)>>8); \
|
spi.transfer(0); spi.transfer((C)>>8); \
|
||||||
spi.transfer(0); spi.transfer((C)>>0)
|
spi.transfer(0); spi.transfer((C)>>0)
|
||||||
|
|
||||||
|
#elif defined (ILI9225_DRIVER) // Needs gaps between commands + data bytes, so use slower transfer functions
|
||||||
|
|
||||||
|
// These all end in 8 bit mode
|
||||||
|
#define tft_Write_8(C) spi.transfer(C);
|
||||||
|
|
||||||
|
// Note: the following macros do not wait for the end of transmission
|
||||||
|
|
||||||
|
#define tft_Write_16(C) spi.transfer16(C)
|
||||||
|
|
||||||
|
#define tft_Write_16N(C) spi.transfer16(C)
|
||||||
|
|
||||||
|
#define tft_Write_16S(C) spi.transfer16((C)<<8 | (C)>>8)
|
||||||
|
|
||||||
|
#define tft_Write_32(C) spi.transfer16((C)>>16); spi.transfer16(C)
|
||||||
|
|
||||||
|
#define tft_Write_32C(C,D) spi.transfer16(C); spi.transfer16(D)
|
||||||
|
|
||||||
|
#define tft_Write_32D(C) spi.transfer16(C); spi.transfer16(C)
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
// This swaps to 8 bit mode, then back to 16 bit mode
|
// This swaps to 8 bit mode, then back to 16 bit mode
|
||||||
|
89
Processors/pio_SPI_18bit.pio
Normal file
89
Processors/pio_SPI_18bit.pio
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
// Raspberry Pi Pico PIO program to output 18 bit data to a TFT
|
||||||
|
// controller via a SPI output data path.
|
||||||
|
|
||||||
|
//"Set" set: 1 output pin, TFT_DC
|
||||||
|
// Side set: 1 output pin, TFT_SCLK
|
||||||
|
// Data set: 1 output pin, TFT_MOSI
|
||||||
|
|
||||||
|
.program tft_io
|
||||||
|
.side_set 1 opt ; The TFT_SCLK output.
|
||||||
|
|
||||||
|
// The C++ code switches between the 8 bits and 16 bits loops
|
||||||
|
// by waiting for the SM to be idle and setting its PC.
|
||||||
|
//
|
||||||
|
|
||||||
|
// 8 bit transfer
|
||||||
|
public start_8:
|
||||||
|
// Pull the next 32 bit value from the TX FIFO.
|
||||||
|
pull side 0
|
||||||
|
// Lose the top 24 bits, send 1st bit
|
||||||
|
out pins, 25
|
||||||
|
// Now send remaining bits
|
||||||
|
jmp spi_out side 1
|
||||||
|
|
||||||
|
public set_addr_window:
|
||||||
|
// Loop count in x for caset, paset and ramwr
|
||||||
|
set x, 2 side 0
|
||||||
|
pull_cmd:
|
||||||
|
// Set DC low
|
||||||
|
set pins, 0
|
||||||
|
// Fetch and output LS byte (caset, paset or ramwr), discarding top 24 bits, set WR low
|
||||||
|
pull side 0
|
||||||
|
out pins, 25
|
||||||
|
nop side 1
|
||||||
|
next_cmd_bit:
|
||||||
|
out pins, 1 side 0
|
||||||
|
jmp !osre, next_cmd_bit side 1
|
||||||
|
// Set DC high
|
||||||
|
set pins, 1 side 0
|
||||||
|
// Finish if 3rd cmd byte ramwr sent (x == 0)
|
||||||
|
jmp !x, start_tx
|
||||||
|
pull
|
||||||
|
next_xy:
|
||||||
|
// send 32 bit start and end coordinates
|
||||||
|
out pins, 1 side 0
|
||||||
|
jmp !osre, next_xy side 1
|
||||||
|
// Loop back for next command
|
||||||
|
jmp x--, pull_cmd side 0
|
||||||
|
// End
|
||||||
|
jmp start_tx
|
||||||
|
|
||||||
|
public block_fill:
|
||||||
|
// Fetch colour value
|
||||||
|
pull side 0
|
||||||
|
// Move colour to x
|
||||||
|
mov x, osr
|
||||||
|
// Fetch pixel count
|
||||||
|
pull
|
||||||
|
// Move pixel count to y
|
||||||
|
mov y, osr
|
||||||
|
next_16:
|
||||||
|
// Copy colour value back into osr
|
||||||
|
mov osr, x side 0
|
||||||
|
// Lose the top 8 bits, send 1st bit
|
||||||
|
out pins, 9 side 0
|
||||||
|
nop side 1
|
||||||
|
next_bit:
|
||||||
|
// Output next remaining bits
|
||||||
|
out pins, 1 side 0
|
||||||
|
// Set TFT_SCLK high and jump for next bit
|
||||||
|
jmp !osre, next_bit side 1
|
||||||
|
// Decrement count and loop
|
||||||
|
jmp y--, next_16 side 0
|
||||||
|
// Now drop back to 16 bit output
|
||||||
|
|
||||||
|
.wrap_target
|
||||||
|
public start_tx:
|
||||||
|
// Pull the next 32 bit value from the TX FIFO.
|
||||||
|
// Send the bottom 24 bits
|
||||||
|
pull side 0
|
||||||
|
// Drop the first 8 bits, write first bit
|
||||||
|
out pins, 9 side 0
|
||||||
|
nop side 1
|
||||||
|
spi_out:
|
||||||
|
// Output the remaining bits
|
||||||
|
out pins, 1 side 0
|
||||||
|
// Set TFT_SCLK high and jump for next bit
|
||||||
|
jmp !osre, spi_out side 1
|
||||||
|
// Return to start
|
||||||
|
.wrap
|
73
Processors/pio_SPI_18bit.pio.h
Normal file
73
Processors/pio_SPI_18bit.pio.h
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
// -------------------------------------------------- //
|
||||||
|
// This file is autogenerated by pioasm; do not edit! //
|
||||||
|
// -------------------------------------------------- //
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#if !PICO_NO_HARDWARE
|
||||||
|
#include "hardware/pio.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ------ //
|
||||||
|
// tft_io //
|
||||||
|
// ------ //
|
||||||
|
|
||||||
|
#define tft_io_wrap_target 27
|
||||||
|
#define tft_io_wrap 31
|
||||||
|
|
||||||
|
#define tft_io_offset_start_8 0u
|
||||||
|
#define tft_io_offset_set_addr_window 3u
|
||||||
|
#define tft_io_offset_block_fill 17u
|
||||||
|
#define tft_io_offset_start_tx 27u
|
||||||
|
|
||||||
|
static const uint16_t tft_io_program_instructions[] = {
|
||||||
|
0x90a0, // 0: pull block side 0
|
||||||
|
0x6019, // 1: out pins, 25
|
||||||
|
0x181e, // 2: jmp 30 side 1
|
||||||
|
0xf022, // 3: set x, 2 side 0
|
||||||
|
0xe000, // 4: set pins, 0
|
||||||
|
0x90a0, // 5: pull block side 0
|
||||||
|
0x6019, // 6: out pins, 25
|
||||||
|
0xb842, // 7: nop side 1
|
||||||
|
0x7001, // 8: out pins, 1 side 0
|
||||||
|
0x18e8, // 9: jmp !osre, 8 side 1
|
||||||
|
0xf001, // 10: set pins, 1 side 0
|
||||||
|
0x003b, // 11: jmp !x, 27
|
||||||
|
0x80a0, // 12: pull block
|
||||||
|
0x7001, // 13: out pins, 1 side 0
|
||||||
|
0x18ed, // 14: jmp !osre, 13 side 1
|
||||||
|
0x1044, // 15: jmp x--, 4 side 0
|
||||||
|
0x001b, // 16: jmp 27
|
||||||
|
0x90a0, // 17: pull block side 0
|
||||||
|
0xa027, // 18: mov x, osr
|
||||||
|
0x80a0, // 19: pull block
|
||||||
|
0xa047, // 20: mov y, osr
|
||||||
|
0xb0e1, // 21: mov osr, x side 0
|
||||||
|
0x7009, // 22: out pins, 9 side 0
|
||||||
|
0xb842, // 23: nop side 1
|
||||||
|
0x7001, // 24: out pins, 1 side 0
|
||||||
|
0x18f8, // 25: jmp !osre, 24 side 1
|
||||||
|
0x1095, // 26: jmp y--, 21 side 0
|
||||||
|
// .wrap_target
|
||||||
|
0x90a0, // 27: pull block side 0
|
||||||
|
0x7009, // 28: out pins, 9 side 0
|
||||||
|
0xb842, // 29: nop side 1
|
||||||
|
0x7001, // 30: out pins, 1 side 0
|
||||||
|
0x18fe, // 31: jmp !osre, 30 side 1
|
||||||
|
// .wrap
|
||||||
|
};
|
||||||
|
|
||||||
|
#if !PICO_NO_HARDWARE
|
||||||
|
static const struct pio_program tft_io_program = {
|
||||||
|
.instructions = tft_io_program_instructions,
|
||||||
|
.length = 32,
|
||||||
|
.origin = -1,
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline pio_sm_config tft_io_program_get_default_config(uint offset) {
|
||||||
|
pio_sm_config c = pio_get_default_sm_config();
|
||||||
|
sm_config_set_wrap(&c, offset + tft_io_wrap_target, offset + tft_io_wrap);
|
||||||
|
sm_config_set_sideset(&c, 2, true, false);
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
#endif
|
@@ -1,7 +1,7 @@
|
|||||||
// Change the width and height if required (defined in portrait mode)
|
// Change the width and height if required (defined in portrait mode)
|
||||||
// or use the constructor to over-ride defaults
|
// or use the constructor to over-ride defaults
|
||||||
|
|
||||||
#if defined (ILI9341_DRIVER) || ILI9341_2_DRIVER
|
#if defined (ILI9341_DRIVER) || defined (ILI9341_2_DRIVER)
|
||||||
#define TFT_WIDTH 240
|
#define TFT_WIDTH 240
|
||||||
#define TFT_HEIGHT 320
|
#define TFT_HEIGHT 320
|
||||||
#elif defined (ILI9342_DRIVER)
|
#elif defined (ILI9342_DRIVER)
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
//
|
//
|
||||||
// See ST7735_Setup.h file for an alternative format
|
// See ST7735_Setup.h file for an alternative format
|
||||||
|
|
||||||
#if defined (ILI9341_DRIVER) | defined (ILI9342_DRIVER)
|
#if defined (ILI9341_DRIVER) || defined (ILI9342_DRIVER)
|
||||||
{
|
{
|
||||||
writecommand(0xEF);
|
writecommand(0xEF);
|
||||||
writedata(0x03);
|
writedata(0x03);
|
||||||
|
@@ -16,7 +16,7 @@
|
|||||||
#ifndef _TFT_eSPIH_
|
#ifndef _TFT_eSPIH_
|
||||||
#define _TFT_eSPIH_
|
#define _TFT_eSPIH_
|
||||||
|
|
||||||
#define TFT_ESPI_VERSION "2.4.44"
|
#define TFT_ESPI_VERSION "2.4.45"
|
||||||
|
|
||||||
// Bit level feature flags
|
// Bit level feature flags
|
||||||
// Bit 0 set: viewport capability
|
// Bit 0 set: viewport capability
|
||||||
|
45
keywords.txt
45
keywords.txt
@@ -12,13 +12,17 @@ drawFastHLine KEYWORD2
|
|||||||
fillRect KEYWORD2
|
fillRect KEYWORD2
|
||||||
height KEYWORD2
|
height KEYWORD2
|
||||||
width KEYWORD2
|
width KEYWORD2
|
||||||
|
readPixel KEYWORD2
|
||||||
|
setWindow KEYWORD2
|
||||||
|
pushColor KEYWORD2
|
||||||
|
|
||||||
setRotation KEYWORD2
|
setRotation KEYWORD2
|
||||||
getRotation KEYWORD2
|
getRotation KEYWORD2
|
||||||
invertDisplay KEYWORD2
|
invertDisplay KEYWORD2
|
||||||
setAddrWindow KEYWORD2
|
setAddrWindow KEYWORD2
|
||||||
setWindow KEYWORD2
|
|
||||||
|
|
||||||
setViewport KEYWORD2
|
setViewport KEYWORD2
|
||||||
|
checkViewport KEYWORD2
|
||||||
resetViewport KEYWORD2
|
resetViewport KEYWORD2
|
||||||
getViewportX KEYWORD2
|
getViewportX KEYWORD2
|
||||||
getViewportY KEYWORD2
|
getViewportY KEYWORD2
|
||||||
@@ -26,28 +30,23 @@ getViewportWidth KEYWORD2
|
|||||||
getViewportHeight KEYWORD2
|
getViewportHeight KEYWORD2
|
||||||
getViewportDatum KEYWORD2
|
getViewportDatum KEYWORD2
|
||||||
frameViewport KEYWORD2
|
frameViewport KEYWORD2
|
||||||
|
resetViewport KEYWORD2
|
||||||
# Smooth (anti-aliased) graphics functions
|
clipAddrWindow KEYWORD2
|
||||||
fillRectHGradient KEYWORD2
|
clipWindow KEYWORD2
|
||||||
fillRectVGradient KEYWORD2
|
|
||||||
fillSmoothCircle KEYWORD2
|
|
||||||
fillSmoothRoundRect KEYWORD2
|
|
||||||
drawSpot KEYWORD2
|
|
||||||
drawWideLine KEYWORD2
|
|
||||||
drawWedgeLine KEYWORD2
|
|
||||||
|
|
||||||
pushColor KEYWORD2
|
|
||||||
pushColors KEYWORD2
|
pushColors KEYWORD2
|
||||||
pushBlock KEYWORD2
|
pushBlock KEYWORD2
|
||||||
pushPixels KEYWORD2
|
pushPixels KEYWORD2
|
||||||
readPixel KEYWORD2
|
|
||||||
tft_Read_8 KEYWORD2
|
tft_Read_8 KEYWORD2
|
||||||
begin_SDA_Read KEYWORD2
|
begin_SDA_Read KEYWORD2
|
||||||
end_SDA_Read KEYWORD2
|
end_SDA_Read KEYWORD2
|
||||||
|
|
||||||
fillScreen KEYWORD2
|
fillScreen KEYWORD2
|
||||||
|
|
||||||
drawRect KEYWORD2
|
drawRect KEYWORD2
|
||||||
drawRoundRect KEYWORD2
|
drawRoundRect KEYWORD2
|
||||||
fillRoundRect KEYWORD2
|
fillRoundRect KEYWORD2
|
||||||
|
|
||||||
drawCircle KEYWORD2
|
drawCircle KEYWORD2
|
||||||
drawCircleHelper KEYWORD2
|
drawCircleHelper KEYWORD2
|
||||||
fillCircle KEYWORD2
|
fillCircle KEYWORD2
|
||||||
@@ -56,22 +55,28 @@ drawEllipse KEYWORD2
|
|||||||
fillEllipse KEYWORD2
|
fillEllipse KEYWORD2
|
||||||
drawTriangle KEYWORD2
|
drawTriangle KEYWORD2
|
||||||
fillTriangle KEYWORD2
|
fillTriangle KEYWORD2
|
||||||
|
|
||||||
setSwapBytes KEYWORD2
|
setSwapBytes KEYWORD2
|
||||||
getSwapBytes KEYWORD2
|
getSwapBytes KEYWORD2
|
||||||
|
|
||||||
drawBitmap KEYWORD2
|
drawBitmap KEYWORD2
|
||||||
drawXBitmap KEYWORD2
|
drawXBitmap KEYWORD2
|
||||||
|
|
||||||
setPivot KEYWORD2
|
setPivot KEYWORD2
|
||||||
getPivotX KEYWORD2
|
getPivotX KEYWORD2
|
||||||
getPivotY KEYWORD2
|
getPivotY KEYWORD2
|
||||||
|
|
||||||
readRect KEYWORD2
|
readRect KEYWORD2
|
||||||
pushRect KEYWORD2
|
pushRect KEYWORD2
|
||||||
pushImage KEYWORD2
|
pushImage KEYWORD2
|
||||||
readRectRGB KEYWORD2
|
readRectRGB KEYWORD2
|
||||||
|
|
||||||
drawNumber KEYWORD2
|
drawNumber KEYWORD2
|
||||||
drawFloat KEYWORD2
|
drawFloat KEYWORD2
|
||||||
drawString KEYWORD2
|
drawString KEYWORD2
|
||||||
drawCentreString KEYWORD2
|
drawCentreString KEYWORD2
|
||||||
drawRightString KEYWORD2
|
drawRightString KEYWORD2
|
||||||
|
|
||||||
setCursor KEYWORD2
|
setCursor KEYWORD2
|
||||||
getCursorX KEYWORD2
|
getCursorX KEYWORD2
|
||||||
getCursorY KEYWORD2
|
getCursorY KEYWORD2
|
||||||
@@ -90,13 +95,16 @@ decodeUTF8 KEYWORD2
|
|||||||
write KEYWORD2
|
write KEYWORD2
|
||||||
setCallback KEYWORD2
|
setCallback KEYWORD2
|
||||||
fontsLoaded KEYWORD2
|
fontsLoaded KEYWORD2
|
||||||
|
|
||||||
spiwrite KEYWORD2
|
spiwrite KEYWORD2
|
||||||
writecommand KEYWORD2
|
writecommand KEYWORD2
|
||||||
|
writeRegister KEYWORD2
|
||||||
writedata KEYWORD2
|
writedata KEYWORD2
|
||||||
commandList KEYWORD2
|
commandList KEYWORD2
|
||||||
readcommand8 KEYWORD2
|
readcommand8 KEYWORD2
|
||||||
readcommand16 KEYWORD2
|
readcommand16 KEYWORD2
|
||||||
readcommand32 KEYWORD2
|
readcommand32 KEYWORD2
|
||||||
|
|
||||||
color565 KEYWORD2
|
color565 KEYWORD2
|
||||||
color8to16 KEYWORD2
|
color8to16 KEYWORD2
|
||||||
color16to8 KEYWORD2
|
color16to8 KEYWORD2
|
||||||
@@ -104,15 +112,18 @@ color16to24 KEYWORD2
|
|||||||
color24to16 KEYWORD2
|
color24to16 KEYWORD2
|
||||||
alphaBlend KEYWORD2
|
alphaBlend KEYWORD2
|
||||||
alphaBlend24 KEYWORD2
|
alphaBlend24 KEYWORD2
|
||||||
|
|
||||||
initDMA KEYWORD2
|
initDMA KEYWORD2
|
||||||
deInitDMA KEYWORD2
|
deInitDMA KEYWORD2
|
||||||
pushImageDMA KEYWORD2
|
pushImageDMA KEYWORD2
|
||||||
pushPixelsDMA KEYWORD2
|
pushPixelsDMA KEYWORD2
|
||||||
dmaBusy KEYWORD2
|
dmaBusy KEYWORD2
|
||||||
dmaWait KEYWORD2
|
dmaWait KEYWORD2
|
||||||
|
|
||||||
startWrite KEYWORD2
|
startWrite KEYWORD2
|
||||||
writeColor KEYWORD2
|
writeColor KEYWORD2
|
||||||
endWrite KEYWORD2
|
endWrite KEYWORD2
|
||||||
|
|
||||||
setAttribute KEYWORD2
|
setAttribute KEYWORD2
|
||||||
getAttribute KEYWORD2
|
getAttribute KEYWORD2
|
||||||
getSetup KEYWORD2
|
getSetup KEYWORD2
|
||||||
@@ -128,6 +139,14 @@ getTouch KEYWORD2
|
|||||||
calibrateTouch KEYWORD2
|
calibrateTouch KEYWORD2
|
||||||
setTouch KEYWORD2
|
setTouch KEYWORD2
|
||||||
|
|
||||||
|
# Smooth (anti-aliased) graphics functions
|
||||||
|
fillRectHGradient KEYWORD2
|
||||||
|
fillRectVGradient KEYWORD2
|
||||||
|
fillSmoothCircle KEYWORD2
|
||||||
|
fillSmoothRoundRect KEYWORD2
|
||||||
|
drawSpot KEYWORD2
|
||||||
|
drawWideLine KEYWORD2
|
||||||
|
drawWedgeLine KEYWORD2
|
||||||
|
|
||||||
# Smooth font functions
|
# Smooth font functions
|
||||||
|
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "TFT_eSPI",
|
"name": "TFT_eSPI",
|
||||||
"version": "2.4.44",
|
"version": "2.4.45",
|
||||||
"keywords": "Arduino, tft, display, ttgo, LilyPi, WT32_SC01, ePaper, display, Pico, RP2040 Nano Connect, RP2040, STM32, ESP8266, NodeMCU, ESP32, M5Stack, ILI9341, ST7735, ILI9163, S6D02A1, ILI9481, ILI9486, ILI9488, ST7789, ST7796, RM68140, SSD1351, SSD1963, ILI9225, HX8357D, GC9A01, R61581",
|
"keywords": "Arduino, tft, display, ttgo, LilyPi, WT32_SC01, ePaper, display, Pico, RP2040 Nano Connect, RP2040, STM32, ESP8266, NodeMCU, ESP32, M5Stack, ILI9341, ST7735, ILI9163, S6D02A1, ILI9481, ILI9486, ILI9488, ST7789, ST7796, RM68140, SSD1351, SSD1963, ILI9225, HX8357D, GC9A01, R61581",
|
||||||
"description": "A TFT and ePaper SPI graphics library with optimisation for Raspberry Pi Pico, RP2040, ESP8266, ESP32 and STM32",
|
"description": "A TFT and ePaper SPI graphics library with optimisation for Raspberry Pi Pico, RP2040, ESP8266, ESP32 and STM32",
|
||||||
"repository":
|
"repository":
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
name=TFT_eSPI
|
name=TFT_eSPI
|
||||||
version=2.4.44
|
version=2.4.45
|
||||||
author=Bodmer
|
author=Bodmer
|
||||||
maintainer=Bodmer
|
maintainer=Bodmer
|
||||||
sentence=TFT graphics library for Arduino processors with performance optimisation for RP2040, STM32, ESP8266 and ESP32
|
sentence=TFT graphics library for Arduino processors with performance optimisation for RP2040, STM32, ESP8266 and ESP32
|
||||||
|
@@ -96,16 +96,16 @@ sketch.
|
|||||||
|
|
||||||
In 2019 the library was adapted to be able to use it with any 32 bit Arduino
|
In 2019 the library was adapted to be able to use it with any 32 bit Arduino
|
||||||
compatible processor. It will run on 8 bit and 16 bit processors but will be
|
compatible processor. It will run on 8 bit and 16 bit processors but will be
|
||||||
slow due to extensive use of 32 bit varaibles.
|
slow due to extensive use of 32 bit variables.
|
||||||
|
|
||||||
Many of the example sketches are original work, that contain code created
|
Many of the example sketches are original work that contain code created
|
||||||
for my own projects. For all the original code the FreeBSD licence applies
|
for my own projects. For all the original code the FreeBSD licence applies
|
||||||
and is compatible with the GNU GPL.
|
and is compatible with the GNU GPL.
|
||||||
|
|
||||||
vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvStartvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
|
vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvStartvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
|
||||||
Software License Agreement (FreeBSD License)
|
Software License Agreement (FreeBSD License)
|
||||||
|
|
||||||
Copyright (c) 2020 Bodmer (https://github.com/Bodmer)
|
Copyright (c) 2022 Bodmer (https://github.com/Bodmer)
|
||||||
|
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user