|
|
|
-- I2C address of display |
|
sla = 0x3c |
|
|
|
-- select Lua or C callback |
|
use_lua_i2c_byte_cb = false |
|
|
|
|
|
I2C = require("periphery").I2C |
|
i2c = I2C("/dev/i2c-1") |
|
|
|
|
|
ffi = require("ffi") |
|
|
|
dofile("u8g2_header.lua") |
|
|
|
u8g2lib = ffi.load("build/u8g2.so") |
|
|
|
|
|
|
|
if use_lua_i2c_byte_cb then |
|
-- |
|
-- i2c byte callback implemented in Lua |
|
-- |
|
|
|
u8g2_data = ffi.new("u8g2_t") |
|
|
|
-- cache constants |
|
U8X8_MSG_BYTE_SEND = u8g2lib.lu8x8_msg_byte_send |
|
U8X8_MSG_BYTE_INIT = u8g2lib.lu8x8_msg_byte_init |
|
U8X8_MSG_BYTE_SET_DC = u8g2lib.lu8x8_msg_byte_set_dc |
|
U8X8_MSG_BYTE_START_TRANSFER = u8g2lib.lu8x8_msg_byte_start_transfer |
|
U8X8_MSG_BYTE_END_TRANSFER = u8g2lib.lu8x8_msg_byte_end_transfer |
|
|
|
function i2c_byte_cb(u8x8, msg, arg_int, arg_ptr) |
|
--print(string.format("i2c called - msg: %i, arg_int: %i", msg, arg_int)) |
|
local data = ffi.cast("uint8_t *", arg_ptr) |
|
|
|
if msg == U8X8_MSG_BYTE_SEND then |
|
for idx = 0, arg_int-1, 1 do |
|
i2c_buffer[#i2c_buffer+1] = data[idx] |
|
end |
|
|
|
elseif msg == U8X8_MSG_BYTE_INIT then |
|
i2c_buffer = {} |
|
|
|
elseif msg == U8X8_MSG_BYTE_START_TRANSFER then |
|
i2c_buffer = {} |
|
|
|
elseif msg == U8X8_MSG_BYTE_END_TRANSFER then |
|
if false then |
|
local str = string.format("sending %d bytes ", #i2c_buffer) |
|
for idx = 1, #i2c_buffer, 1 do |
|
str = string.format("%s 0x%02x", str, i2c_buffer[idx]) |
|
end |
|
print(str) |
|
end |
|
|
|
i2c_buffer.flags = I2C.I2C_M_IGNORE_NAK |
|
i2c:transfer(sla, {i2c_buffer}) |
|
|
|
elseif msg == U8X8_MSG_BYTE_SET_DC then |
|
|
|
else |
|
return 0 |
|
end |
|
|
|
|
|
return 1 |
|
end |
|
|
|
u8g2lib.u8g2_Setup_ssd1306_i2c_128x64_noname_f(u8g2_data, u8g2lib.u8g2_cb_r0, i2c_byte_cb, u8g2lib.u8x8_dummy_cb) |
|
|
|
|
|
else |
|
|
|
-- |
|
-- i2c byte callback implemented in C |
|
-- |
|
|
|
u8g2_nodemcu = ffi.new("u8g2_nodemcu_t") |
|
u8g2_nodemcu.hal = ffi.cast("void *", i2c) |
|
u8g2_data = ffi.cast("u8g2_t *", u8g2_nodemcu) |
|
u8g2_data.u8x8.i2c_address = sla |
|
|
|
u8g2lib.u8g2_Setup_ssd1306_i2c_128x64_noname_f(u8g2_data, u8g2lib.u8g2_cb_r0, u8g2lib.i2c_byte_cperiphery_cb, u8g2lib.u8x8_dummy_cb) |
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
u8g2lib.u8x8_InitDisplay( ffi.cast("u8x8_t *", u8g2_data) ) |
|
u8g2lib.u8x8_ClearDisplay( ffi.cast("u8x8_t *", u8g2_data) ) |
|
u8g2lib.u8x8_SetPowerSave( ffi.cast("u8x8_t *", u8g2_data), 0 ) |
|
|
|
|
|
u8g2lib.u8g2_SetFont(u8g2_data, u8g2lib.u8g2_font_6x10_tf) |
|
u8g2lib.u8g2_SetFontRefHeightExtendedText(u8g2_data) |
|
u8g2lib.u8g2_SetDrawColor(u8g2_data, 1) |
|
u8g2lib.u8g2_SetFontPosTop(u8g2_data) |
|
u8g2lib.u8g2_SetFontDirection(u8g2_data, 0) |
|
|
|
u8g2lib.u8g2_DrawStr(u8g2_data, 0, 0, "drawBox") |
|
|
|
u8g2lib.u8g2_DrawBox(u8g2_data, 5,10,20,10) |
|
u8g2lib.u8g2_SendBuffer(u8g2_data) |