Skip to content

Commit

Permalink
Add RPi Pico support
Browse files Browse the repository at this point in the history
Fix a few code style issues
  • Loading branch information
bog-dan-ro committed Feb 11, 2024
1 parent 785469d commit 500af9a
Show file tree
Hide file tree
Showing 14 changed files with 330 additions and 120 deletions.
34 changes: 34 additions & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
add_library(Tiny4kOLED INTERFACE)

target_compile_definitions(Tiny4kOLED INTERFACE
RP2040
)

target_sources(Tiny4kOLED INTERFACE
${CMAKE_CURRENT_LIST_DIR}/font6x8caps.h
${CMAKE_CURRENT_LIST_DIR}/font6x8digits.h
${CMAKE_CURRENT_LIST_DIR}/font6x8.h
${CMAKE_CURRENT_LIST_DIR}/font6x8p.h
${CMAKE_CURRENT_LIST_DIR}/font8x16caps.h
${CMAKE_CURRENT_LIST_DIR}/font8x16capsp.h
${CMAKE_CURRENT_LIST_DIR}/font8x16digits.h
${CMAKE_CURRENT_LIST_DIR}/font8x16.h
${CMAKE_CURRENT_LIST_DIR}/font8x16p.h
${CMAKE_CURRENT_LIST_DIR}/Tiny4kOLED_bitbang.h
${CMAKE_CURRENT_LIST_DIR}/Tiny4kOLED_common.h
${CMAKE_CURRENT_LIST_DIR}/Tiny4kOLED.cpp
${CMAKE_CURRENT_LIST_DIR}/Tiny4kOLED.h
${CMAKE_CURRENT_LIST_DIR}/Tiny4kOLEDprintless.h
${CMAKE_CURRENT_LIST_DIR}/Tiny4kOLED_rp2040.h
${CMAKE_CURRENT_LIST_DIR}/Tiny4kOLED_tiny-i2c.h
${CMAKE_CURRENT_LIST_DIR}/Tiny4kOLED_TinyWireM.h
${CMAKE_CURRENT_LIST_DIR}/Tiny4kOLED_Wire.h
)

target_include_directories(Tiny4kOLED INTERFACE
${CMAKE_CURRENT_LIST_DIR}
)

target_link_libraries(Tiny4kOLED INTERFACE
hardware_i2c
)
164 changes: 99 additions & 65 deletions src/Tiny4kOLED.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,39 +31,44 @@ static uint8_t characterSpacing = 0;
static DCUnicodeCodepoint unicodeCodepoint = { 0 };
static uint8_t utf8Continuation = 0;

static void (*wireBeginFn)(void);
static bool (*wireBeginTransmissionFn)(void);
static void (*wireBeginFn)();
static bool (*wireBeginTransmissionFn)();
static bool (*wireWriteFn)(uint8_t byte);
static uint8_t (*wireEndTransmissionFn)(void);
static uint8_t (*wireEndTransmissionFn)();

static void (SSD1306Device::* decodeFn)(uint8_t c) = 0;
static void (SSD1306Device::* renderFn)(uint8_t c) = 0;
static uint8_t (*combineFn)(uint8_t x, uint8_t y, uint8_t b) = 0;
static uint8_t writesSinceSetCursor = 0;

static void ssd1306_begin(void) {
wireBeginFn();
static void ssd1306_begin()
{
wireBeginFn();
}

static void ssd1306_send_start(void) {
wireBeginTransmissionFn();
static void ssd1306_send_start()
{
wireBeginTransmissionFn();
}

static bool ssd1306_send_byte(uint8_t byte) {
return wireWriteFn(byte);
}

static void ssd1306_send_stop(void) {
wireEndTransmissionFn();
static void ssd1306_send_stop()
{
wireEndTransmissionFn();
}

static void ssd1306_send_command_start(void) {
ssd1306_send_start();
static void ssd1306_send_command_start()
{
ssd1306_send_start();
ssd1306_send_byte(SSD1306_COMMAND);
}

static void ssd1306_send_data_start(void) {
ssd1306_send_start();
static void ssd1306_send_data_start()
{
ssd1306_send_start();
ssd1306_send_byte(SSD1306_DATA);
}

Expand Down Expand Up @@ -133,15 +138,20 @@ static uint8_t invertByte(uint8_t x, uint8_t y, uint8_t byte) {
return byte ^ 0xff;
}

SSD1306Device::SSD1306Device(void (*wireBeginFunc)(void), bool (*wireBeginTransmissionFunc)(void), bool (*wireWriteFunc)(uint8_t byte), uint8_t (*wireEndTransmissionFunc)(void)) {
wireBeginFn = wireBeginFunc;
SSD1306Device::SSD1306Device(void (*wireBeginFunc)(),
bool (*wireBeginTransmissionFunc)(),
bool (*wireWriteFunc)(uint8_t byte),
uint8_t (*wireEndTransmissionFunc)())
{
wireBeginFn = wireBeginFunc;
wireBeginTransmissionFn = wireBeginTransmissionFunc;
wireWriteFn = wireWriteFunc;
wireEndTransmissionFn = wireEndTransmissionFunc;
}

void SSD1306Device::begin(void) {
begin(sizeof(tiny4koled_init_128x32r), tiny4koled_init_128x32r);
void SSD1306Device::begin()
{
begin(sizeof(tiny4koled_init_128x32r), tiny4koled_init_128x32r);
}

void SSD1306Device::begin(uint8_t init_sequence_length, const uint8_t init_sequence []) {
Expand Down Expand Up @@ -318,8 +328,9 @@ uint8_t SSD1306Device::getCursorY() {
return oledY;
}

void SSD1306Device::clear(void) {
fill(0x00);
void SSD1306Device::clear()
{
fill(0x00);
}

void SSD1306Device::fill(uint8_t fill) {
Expand All @@ -339,8 +350,9 @@ void SSD1306Device::newLine(uint8_t fontHeight) {
setCursor(0, oledY);
}

void SSD1306Device::newLine(void) {
newLine(oledFont->height);
void SSD1306Device::newLine()
{
newLine(oledFont->height);
}

size_t SSD1306Device::write(byte c) {
Expand Down Expand Up @@ -395,12 +407,14 @@ void SSD1306Device::renderOriginalSize(uint8_t c) {
while (--line);
}

uint8_t SSD1306Device::getExpectedUtf8Bytes(void) {
return utf8Continuation;
uint8_t SSD1306Device::getExpectedUtf8Bytes()
{
return utf8Continuation;
}

void SSD1306Device::RenderUnicodeSpace(void) {
uint8_t spaceWidth = (oledUnicodeFont->space_width + characterSpacing) << doubleSize;
void SSD1306Device::RenderUnicodeSpace()
{
uint8_t spaceWidth = (oledUnicodeFont->space_width + characterSpacing) << doubleSize;
if (oledX > ((uint8_t)oledWidth - spaceWidth)) {
newLine(oledFont->height);
} else {
Expand All @@ -422,8 +436,9 @@ void SSD1306Device::RenderUnicodeSpace(void) {
}
}

bool SSD1306Device::SelectUnicodeBlock(void) {
if (oledUnicodeFont->fonts[unicodeFontNum].unicode_block == unicodeCodepoint.unicode.block &&
bool SSD1306Device::SelectUnicodeBlock()
{
if (oledUnicodeFont->fonts[unicodeFontNum].unicode_block == unicodeCodepoint.unicode.block &&
oledUnicodeFont->fonts[unicodeFontNum].unicode_plane == unicodeCodepoint.unicode.plane &&
oledUnicodeFont->fonts[unicodeFontNum].font->first <= unicodeCodepoint.unicode.offset &&
oledUnicodeFont->fonts[unicodeFontNum].font->last >= unicodeCodepoint.unicode.offset) return true;
Expand Down Expand Up @@ -596,8 +611,9 @@ void SSD1306Device::bitmap(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, const
setCursor(0, 0);
}

void SSD1306Device::clearToEOL(void) {
fillToEOL(0x00);
void SSD1306Device::clearToEOL()
{
fillToEOL(0x00);
}

void SSD1306Device::fillToEOL(uint8_t fill) {
Expand All @@ -613,8 +629,9 @@ void SSD1306Device::fillToEOL(uint8_t fill) {
while (--pagesToClear);
}

void SSD1306Device::clearToEOP(void) {
fillToEOP(0x00);
void SSD1306Device::clearToEOP()
{
fillToEOP(0x00);
}

void SSD1306Device::fillToEOP(uint8_t fill) {
Expand All @@ -629,8 +646,9 @@ void SSD1306Device::fillLength(uint8_t fill, uint8_t length) {
ssd1306_send_stop();
}

void SSD1306Device::startData(void) {
ssd1306_send_data_start();
void SSD1306Device::startData()
{
ssd1306_send_data_start();
}

void SSD1306Device::sendData(const uint8_t data) {
Expand All @@ -647,8 +665,9 @@ void SSD1306Device::clearData(uint8_t length) {
repeatData(0, length);
}

void SSD1306Device::endData(void) {
ssd1306_send_stop();
void SSD1306Device::endData()
{
ssd1306_send_stop();
}

void SSD1306Device::invertOutput(bool enable) {
Expand Down Expand Up @@ -787,26 +806,31 @@ void SSD1306Device::clipTextP(uint16_t startPixel, uint8_t width, DATACUTE_F_MAC

// Double Buffering Commands

void SSD1306Device::switchRenderFrame(void) {
renderingFrame ^= 0x04;
void SSD1306Device::switchRenderFrame()
{
renderingFrame ^= 0x04;
}

void SSD1306Device::switchDisplayFrame(void) {
drawingFrame ^= 0x20;
void SSD1306Device::switchDisplayFrame()
{
drawingFrame ^= 0x20;
ssd1306_send_command(drawingFrame);
}

void SSD1306Device::switchFrame(void) {
switchDisplayFrame();
void SSD1306Device::switchFrame()
{
switchDisplayFrame();
switchRenderFrame();
}

uint8_t SSD1306Device::currentRenderFrame(void) {
return (renderingFrame >> 2) & 0x01;
uint8_t SSD1306Device::currentRenderFrame()
{
return (renderingFrame >> 2) & 0x01;
}

uint8_t SSD1306Device::currentDisplayFrame(void) {
return (drawingFrame >> 5) & 0x01;
uint8_t SSD1306Device::currentDisplayFrame()
{
return (drawingFrame >> 5) & 0x01;
}

// 1. Fundamental Command Table
Expand All @@ -829,20 +853,23 @@ void SSD1306Device::setInverse(bool enable) {
ssd1306_send_command(0xA6);
}

void SSD1306Device::setExternalIref(void) {
ssd1306_send_command2(0xAD, 0x00);
void SSD1306Device::setExternalIref()
{
ssd1306_send_command2(0xAD, 0x00);
}

void SSD1306Device::setInternalIref(bool bright) {
ssd1306_send_command2(0xAD, ((bright & 0x01) << 5) | 0x10);
}

void SSD1306Device::off(void) {
ssd1306_send_command(0xAE);
void SSD1306Device::off()
{
ssd1306_send_command(0xAE);
}

void SSD1306Device::on(void) {
ssd1306_send_command(0xAF);
void SSD1306Device::on()
{
ssd1306_send_command(0xAF);
}

// 2. Scrolling Command Table
Expand Down Expand Up @@ -871,12 +898,14 @@ void SSD1306Device::scrollContentLeft(uint8_t startPage, uint8_t endPage, uint8_
ssd1306_send_command7(0x2D, 0x00, startPage + oledOffsetY, 0x01, endPage + oledOffsetY, startColumn + oledOffsetX, endColumn + oledOffsetX);
}

void SSD1306Device::deactivateScroll(void) {
ssd1306_send_command(0x2E);
void SSD1306Device::deactivateScroll()
{
ssd1306_send_command(0x2E);
}

void SSD1306Device::activateScroll(void) {
ssd1306_send_command(0x2F);
void SSD1306Device::activateScroll()
{
ssd1306_send_command(0x2F);
}

void SSD1306Device::setVerticalScrollArea(uint8_t top, uint8_t rows) {
Expand Down Expand Up @@ -945,8 +974,9 @@ void SSD1306Device::setVcomhDeselectLevel(uint8_t level) {
ssd1306_send_command2(0xDB, (level & 0x07) << 4);
}

void SSD1306Device::nop(void) {
ssd1306_send_command(0xE3);
void SSD1306Device::nop()
{
ssd1306_send_command(0xE3);
}

// 6. Advance Graphic Command table
Expand All @@ -959,16 +989,19 @@ void SSD1306Device::blink(uint8_t interval) {
ssd1306_send_command2(0x23, (0x30 | (interval & 0x0F)));
}

void SSD1306Device::disableFadeOutAndBlinking(void) {
ssd1306_send_command2(0x23, 0x00);
void SSD1306Device::disableFadeOutAndBlinking()
{
ssd1306_send_command2(0x23, 0x00);
}

void SSD1306Device::enableZoomIn(void) {
ssd1306_send_command2(0xD6, 0x01);
void SSD1306Device::enableZoomIn()
{
ssd1306_send_command2(0xD6, 0x01);
}

void SSD1306Device::disableZoomIn(void) {
ssd1306_send_command2(0xD6, 0x00);
void SSD1306Device::disableZoomIn()
{
ssd1306_send_command2(0xD6, 0x00);
}

// Charge Pump Settings
Expand All @@ -977,8 +1010,9 @@ void SSD1306Device::enableChargePump(uint8_t voltage) {
ssd1306_send_command2(0x8D, ((voltage | 0x14) & 0xD5));
}

void SSD1306Device::disableChargePump(void) {
ssd1306_send_command2(0x8D, 0x10);
void SSD1306Device::disableChargePump()
{
ssd1306_send_command2(0x8D, 0x10);
}

// ----------------------------------------------------------------------------
2 changes: 2 additions & 0 deletions src/Tiny4kOLED.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
#include "Tiny4kOLED_TinyWireM.h"
#elif defined(TinyI2CMaster_h)
#include "Tiny4kOLED_tiny-i2c.h"
#elif defined(RP2040)
#include "Tiny4kOLED_rp2040.h"
#else
#include <Wire.h>
#include "Tiny4kOLED_Wire.h"
Expand Down
Loading

0 comments on commit 500af9a

Please sign in to comment.