mirror of
https://github.com/coolsnowwolf/luci
synced 2025-01-07 07:06:41 +08:00
luci-app-oled: add new package for ssd1306
This commit is contained in:
parent
66d29de33e
commit
5cd327a0bd
20
applications/luci-app-oled/Makefile
Normal file
20
applications/luci-app-oled/Makefile
Normal file
@ -0,0 +1,20 @@
|
||||
#
|
||||
# Copyright (C) 2020 Nate Ding
|
||||
#
|
||||
# This is free software, licensed under the GUN General Public License v3.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
LUCI_Title:=LuCI support for ssd1306 oled display
|
||||
LUCI_DEPENDS:=+coreutils +coreutils-nohup +libuci
|
||||
LUCI_PKGARCH:=all
|
||||
|
||||
PKG_LICENSE:=GPLv3
|
||||
PKG_LINCESE_FILES:=LICENSE
|
||||
PKG_MAINTAINER:=natelol <natelol@github.com>
|
||||
|
||||
include ../../luci.mk
|
||||
|
||||
# call BuildPackage - OpenWrt buildroot signature
|
17
applications/luci-app-oled/luasrc/controller/oled.lua
Normal file
17
applications/luci-app-oled/luasrc/controller/oled.lua
Normal file
@ -0,0 +1,17 @@
|
||||
module("luci.controller.oled", package.seeall)
|
||||
|
||||
function index()
|
||||
if not nixio.fs.access("/etc/config/oled") then
|
||||
return
|
||||
end
|
||||
entry({"admin", "services", "oled"}, alias("admin", "services", "oled", "setting"),_("OLED"), 90).dependent = true
|
||||
entry({"admin", "services", "oled", "status"}, call("act_status"))
|
||||
entry({"admin", "services", "oled", "setting"}, cbi("oled/setting"),_("Setting"),30).leaf = true
|
||||
end
|
||||
|
||||
function act_status()
|
||||
local e={}
|
||||
e.running = luci.sys.call("pgrep -f /usr/bin/oled > /dev/null")==0
|
||||
luci.http.prepare_content("application/json")
|
||||
luci.http.write_json(e)
|
||||
end
|
84
applications/luci-app-oled/luasrc/model/cbi/oled/setting.lua
Normal file
84
applications/luci-app-oled/luasrc/model/cbi/oled/setting.lua
Normal file
@ -0,0 +1,84 @@
|
||||
m = Map("oled", translate("OLED"), translate("A LuCI app that helps you config your oled display (SSD1306, 0.91', 128X32) with screensavers! <br /> <br /> Any issues, please go to: ")..[[<a href="https://github.com/natelol/luci-app-oled" target="_blank">luci-app-oled</a>]])
|
||||
|
||||
--m.chain("luci")
|
||||
|
||||
m:section(SimpleSection).template="oled/status"
|
||||
|
||||
s = m:section(TypedSection, "oled", translate(""))
|
||||
s.anonymous=true
|
||||
s.addremove=false
|
||||
|
||||
--OPTIONS
|
||||
s:tab("info", translate("Info Display"))
|
||||
s:tab("screensaver", translate("screensaver"))
|
||||
|
||||
o = s:taboption("info", Flag, "enable", translate("Enable"))
|
||||
o.default=0
|
||||
o = s:taboption("info", Value, "path", translate("I2C PATH"))
|
||||
o.default='/dev/i2c-0'
|
||||
o = s:taboption("info", Flag, "rotate", translate("180 degree rotation"))
|
||||
o.default=0
|
||||
o = s:taboption("info", Flag, "autoswitch", translate("Enable Auto switch"))
|
||||
o.default=0
|
||||
from = s:taboption("info", ListValue, "from", translate("From"))
|
||||
to = s:taboption("info", ListValue, "to", translate("To"))
|
||||
for i=0,23 do
|
||||
for j=0,30,30 do
|
||||
from:value(i*60+j,string.format("%02d:%02d",i,j))
|
||||
to:value(i*60+j,string.format("%02d:%02d",i,j))
|
||||
end
|
||||
end
|
||||
from:value(1440,"24:00")
|
||||
to:value(1440,"24:00")
|
||||
from:depends("autoswitch",'1')
|
||||
to:depends("autoswitch",'1')
|
||||
from.default=0
|
||||
to.default=1440
|
||||
|
||||
--informtion options----
|
||||
o = s:taboption("info", Flag, "date", translate("Date"), translate('Format YYYY-MM-DD HH:MM:SS'))
|
||||
o.default=0
|
||||
o = s:taboption("info", Flag, "lanip", translate("IP"), translate("LAN IP address"))
|
||||
o.default=0
|
||||
o = s:taboption("info", Flag, "cputemp", translate("CPU temperature"))
|
||||
o.default=0
|
||||
o = s:taboption("info", Flag, "cpufreq", translate("CPU frequency"))
|
||||
o.default=0
|
||||
o = s:taboption("info", Flag, "netspeed", translate("Network speed"), translate("1Mbps(m/s)=1,000Kbps(k/s)=1,000,000bps(b/s)"))
|
||||
o.default=0
|
||||
o = s:taboption("info", Value, "netsource", translate("which eth to monitor"))
|
||||
o:depends("netspeed",'1')
|
||||
o.default='eth0'
|
||||
o = s:taboption("info", Value, "time", translate("Display interval(s)"), translate('Screensaver will activate in set seconds'))
|
||||
o.default=0
|
||||
|
||||
--screensaver options--
|
||||
o = s:taboption("screensaver", Flag, "scroll", translate("Scroll Text"))
|
||||
o.default=1
|
||||
o = s:taboption("screensaver", Value, "text", translate("Text you want to scroll"))
|
||||
o:depends("scroll",'1')
|
||||
o.default='OPENWRT'
|
||||
o = s:taboption("screensaver", Flag, "drawline", translate("Draw Many Lines"))
|
||||
o.default=0
|
||||
o = s:taboption("screensaver", Flag, "drawrect", translate("Draw Rectangles"))
|
||||
o.default=0
|
||||
o = s:taboption("screensaver", Flag, "fillrect", translate("Draw Multiple Rectangles"))
|
||||
o.default=0
|
||||
o = s:taboption("screensaver", Flag, "drawcircle", translate("Draw Multiple Circles"))
|
||||
o.default=0
|
||||
o = s:taboption("screensaver", Flag, "drawroundrect", translate("Draw a white circle, 10 pixel radius"))
|
||||
o.default=0
|
||||
o = s:taboption("screensaver", Flag, "fillroundrect", translate("Fill the Round Rectangles"))
|
||||
o.default=0
|
||||
o = s:taboption("screensaver", Flag, "drawtriangle", translate("Draw Triangles"))
|
||||
o.default=0
|
||||
o = s:taboption("screensaver", Flag, "filltriangle", translate("Fill Triangles"))
|
||||
o.default=0
|
||||
o = s:taboption("screensaver", Flag, "displaybitmap", translate("Display miniature bitmap"))
|
||||
o.default=0
|
||||
o = s:taboption("screensaver", Flag, "displayinvertnormal", translate("Invert Display Normalize it"))
|
||||
o.default=0
|
||||
o = s:taboption("screensaver", Flag, "drawbitmapeg", translate("Draw a bitmap and animate"))
|
||||
o.default=0
|
||||
|
||||
return m
|
22
applications/luci-app-oled/luasrc/view/oled/status.htm
Normal file
22
applications/luci-app-oled/luasrc/view/oled/status.htm
Normal file
@ -0,0 +1,22 @@
|
||||
<script type="text/javascript">//<![CDATA[
|
||||
XHR.poll(3, '<%=url([[admin]], [[services]], [[oled]], [[status]])%>', null,
|
||||
function(x, data) {
|
||||
var tb = document.getElementById('oled_status');
|
||||
if (data && tb) {
|
||||
if (data.running) {
|
||||
var links = '<em><b><font color=green>OLED <%:RUNNING%></font></b></em>';
|
||||
tb.innerHTML = links;
|
||||
} else {
|
||||
tb.innerHTML = '<em><b><font color=red>OLED <%:NOT RUNNING%></font></b></em>';
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
//]]>
|
||||
</script>
|
||||
<style>.mar-10 {margin-left: 50px; margin-right: 10px;}</style>
|
||||
<fieldset class="cbi-section">
|
||||
<p id="oled_status">
|
||||
<em><%:Collecting data...%></em>
|
||||
</p>
|
||||
</fieldset>
|
154
applications/luci-app-oled/po/zh-cn/oled.po
Normal file
154
applications/luci-app-oled/po/zh-cn/oled.po
Normal file
@ -0,0 +1,154 @@
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:1
|
||||
msgid ""
|
||||
"A LuCI app that helps you config your oled display (SSD1306, 0.91', 128X32) "
|
||||
"with screensavers! <br /> <br /> Any issues, please go to:"
|
||||
msgstr ""
|
||||
"这是一款支持在ssd1306,0.91寸,128x32像素的oled显示屏上显示你要的信息,包含屏"
|
||||
"保的程序。<br /> <br />任何问题请到:"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:24
|
||||
msgid "CPU frequency"
|
||||
msgstr "CPU 频率"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:22
|
||||
msgid "CPU temperature"
|
||||
msgstr "CPU 温度"
|
||||
|
||||
msgid "Scroll Text"
|
||||
msgstr "文字滚动"
|
||||
|
||||
msgid "Enable Auto switch"
|
||||
msgstr "启用定时开关"
|
||||
|
||||
msgid "From"
|
||||
msgstr "起始时间"
|
||||
|
||||
msgid "To"
|
||||
msgstr "结束时间"
|
||||
|
||||
msgid "Text you want to scroll"
|
||||
msgstr "你想要显示的文字"
|
||||
|
||||
msgid "which eth to monitor"
|
||||
msgstr "选择监控哪个网口"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/view/oled/status.htm:20
|
||||
msgid "Collecting data..."
|
||||
msgstr ""
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:18
|
||||
msgid "Date"
|
||||
msgstr "时间"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:48
|
||||
msgid "Display miniature bitmap"
|
||||
msgstr "小图案"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:28
|
||||
msgid "Display interval(s)"
|
||||
msgstr "信息显示间隔(秒)"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:28
|
||||
msgid "Screensaver will activate in set seconds"
|
||||
msgstr "屏保每间隔设置的时间运行一次"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:32
|
||||
msgid "Draw Many Lines"
|
||||
msgstr "直线"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:38
|
||||
msgid "Draw Multiple Circles"
|
||||
msgstr "多圆"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:36
|
||||
msgid "Draw Multiple Rectangles"
|
||||
msgstr "多方块"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:34
|
||||
msgid "Draw Rectangles"
|
||||
msgstr "方块"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:44
|
||||
msgid "Draw Triangles"
|
||||
msgstr "三角形"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:54
|
||||
msgid "Draw a bitmap and animate"
|
||||
msgstr "动图"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:52
|
||||
msgid "Draw a bitmap and animate movement"
|
||||
msgstr "变化图"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:40
|
||||
msgid "Draw a white circle, 10 pixel radius"
|
||||
msgstr "实心圆"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:15
|
||||
msgid "Enable"
|
||||
msgstr "启用"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:46
|
||||
msgid "Fill Triangles"
|
||||
msgstr "三角填充"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:42
|
||||
msgid "Fill the Round Rectangles"
|
||||
msgstr "方形填充"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:18
|
||||
msgid "Format YYYY-MM-DD HH:MM:SS"
|
||||
msgstr "日期格式 YYYY-MM-DD HH:MM:SS"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:17
|
||||
msgid "I2C PATH"
|
||||
msgstr "I2C 路径"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:20
|
||||
msgid "IP"
|
||||
msgstr ""
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:12
|
||||
msgid "Info Display"
|
||||
msgstr "显示信息"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:50
|
||||
msgid "Invert Display Normalize it"
|
||||
msgstr "反转"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:20
|
||||
msgid "LAN IP address"
|
||||
msgstr "LAN 地址"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/view/oled/status.htm:10
|
||||
msgid "NOT RUNNING"
|
||||
msgstr ""
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:26
|
||||
msgid "Network speed"
|
||||
msgstr "网速"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/controller/oled.lua:7
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:1
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:7
|
||||
msgid "OLED"
|
||||
msgstr ""
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/view/oled/status.htm:7
|
||||
msgid "RUNNING"
|
||||
msgstr ""
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/controller/oled.lua:9
|
||||
msgid "Setting"
|
||||
msgstr "设置"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:13
|
||||
msgid "screensaver"
|
||||
msgstr "屏保"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:19
|
||||
msgid "180 degree rotation"
|
||||
msgstr "180 度旋转"
|
137
applications/luci-app-oled/po/zh-tw/oled.po
Normal file
137
applications/luci-app-oled/po/zh-tw/oled.po
Normal file
@ -0,0 +1,137 @@
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:1
|
||||
msgid ""
|
||||
"A LuCI app that helps you config your oled display (SSD1306, 0.91', 128X32) "
|
||||
"with screensavers! <br /> <br /> Any issues, please go to:"
|
||||
msgstr ""
|
||||
"這是壹款支持在ssd1306,0.91寸,128x32像素的oled顯示屏上顯示妳要的信息,包含屏"
|
||||
"保的程序。<br /> <br />任何問題請到:"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:24
|
||||
msgid "CPU frequency"
|
||||
msgstr "CPU頻率"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:22
|
||||
msgid "CPU temperature"
|
||||
msgstr "CPU溫度"
|
||||
|
||||
msgid "Scroll Text"
|
||||
msgstr "文字滾動"
|
||||
|
||||
msgid "Text you want to scroll"
|
||||
msgstr "妳想要顯示的文字"
|
||||
|
||||
msgid "which eth to monitor"
|
||||
msgstr "選擇監控哪個網口"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/view/oled/status.htm:20
|
||||
msgid "Collecting data..."
|
||||
msgstr ""
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:18
|
||||
msgid "Date"
|
||||
msgstr "時間"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:48
|
||||
msgid "Display miniature bitmap"
|
||||
msgstr "小圖案"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:28
|
||||
msgid "Display interval(s)"
|
||||
msgstr "信息顯示間隔(秒)"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:28
|
||||
msgid "Screensaver will activate in set seconds"
|
||||
msgstr "屏保每間隔設置的時間運行壹次"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:32
|
||||
msgid "Draw Many Lines"
|
||||
msgstr "直線"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:38
|
||||
msgid "Draw Multiple Circles"
|
||||
msgstr "多圓"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:36
|
||||
msgid "Draw Multiple Rectangles"
|
||||
msgstr "多方塊"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:34
|
||||
msgid "Draw Rectangles"
|
||||
msgstr "方塊"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:44
|
||||
msgid "Draw Triangles"
|
||||
msgstr "三角形"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:54
|
||||
msgid "Draw a bitmap and animate"
|
||||
msgstr "動圖"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:52
|
||||
msgid "Draw a bitmap and animate movement"
|
||||
msgstr "變化圖"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:40
|
||||
msgid "Draw a white circle, 10 pixel radius"
|
||||
msgstr "實心圓"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:15
|
||||
msgid "Enable"
|
||||
msgstr "啟用"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:46
|
||||
msgid "Fill Triangles"
|
||||
msgstr "三角填充"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:42
|
||||
msgid "Fill the Round Rectangles"
|
||||
msgstr "方形填充"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:18
|
||||
msgid "Format YYYY-MM-DD HH:MM:SS"
|
||||
msgstr "日期格式 YYYY-MM-DD HH:MM:SS"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:20
|
||||
msgid "IP"
|
||||
msgstr ""
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:12
|
||||
msgid "Info Display"
|
||||
msgstr "顯示信息"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:50
|
||||
msgid "Invert Display Normalize it"
|
||||
msgstr "反轉"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:20
|
||||
msgid "LAN IP address"
|
||||
msgstr "LAN地址"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/view/oled/status.htm:10
|
||||
msgid "NOT RUNNING"
|
||||
msgstr ""
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:26
|
||||
msgid "Network speed"
|
||||
msgstr "網速"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/controller/oled.lua:7
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:1
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:7
|
||||
msgid "OLED"
|
||||
msgstr ""
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/view/oled/status.htm:7
|
||||
msgid "RUNNING"
|
||||
msgstr ""
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/controller/oled.lua:9
|
||||
msgid "Setting"
|
||||
msgstr "設置"
|
||||
|
||||
#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:13
|
||||
msgid "screensaver"
|
||||
msgstr "屏保"
|
27
applications/luci-app-oled/root/etc/config/oled
Normal file
27
applications/luci-app-oled/root/etc/config/oled
Normal file
@ -0,0 +1,27 @@
|
||||
config oled
|
||||
option enable '0'
|
||||
option cpufreq '1'
|
||||
option cputemp '1'
|
||||
option drawline '0'
|
||||
option drawrect '0'
|
||||
option fillrect '0'
|
||||
option drawcircle '0'
|
||||
option drawroundrect '0'
|
||||
option fillroundrect '0'
|
||||
option drawtriangle '0'
|
||||
option filltriangle '0'
|
||||
option displaybitmap '0'
|
||||
option displayinvertnormal '0'
|
||||
option drawbitmapeg '0'
|
||||
option date '1'
|
||||
option lanip '1'
|
||||
option time '60'
|
||||
option from '0'
|
||||
option to '1440'
|
||||
option rotate '0'
|
||||
option scroll '0'
|
||||
option netspeed '0'
|
||||
option autoswitch '0'
|
||||
option text 'OPENWRT'
|
||||
option netsource 'eth0'
|
||||
option path '/dev/i2c-0'
|
139
applications/luci-app-oled/root/etc/init.d/oled
Executable file
139
applications/luci-app-oled/root/etc/init.d/oled
Executable file
@ -0,0 +1,139 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
START=88
|
||||
STOP=88
|
||||
|
||||
PROG=/usr/bin/oled
|
||||
|
||||
stop() {
|
||||
kill -2 $(pgrep /usr/bin/oled)
|
||||
kill -9 $(pgrep -f /usr/sbin/netspeed)
|
||||
echo "oled exit..."
|
||||
}
|
||||
|
||||
start() {
|
||||
enabled=$(uci get oled.@oled[0].enable)
|
||||
if [ $enabled -eq 0 ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
autoswitch=$(uci get oled.@oled[0].autoswitch)
|
||||
from=$(uci get oled.@oled[0].from)
|
||||
to=$(uci get oled.@oled[0].to)
|
||||
|
||||
if [ ${autoswitch} -eq 1 ]; then
|
||||
hour=$(date +"%H")
|
||||
min=$(date +"%M")
|
||||
ihour=`expr $hour + 0`
|
||||
imin=`expr $min + 0`
|
||||
now=$(($ihour*60+$imin))
|
||||
if [[ $now -lt $from || $now -gt $to ]]; then
|
||||
stop
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
#crontab daemon
|
||||
if ! grep "/etc/init.d/oled \+restart" /etc/crontabs/root >/dev/null 2>&1; then
|
||||
echo "*/5 * * * * /etc/init.d/oled restart >/dev/null 2>&1" >> /etc/crontabs/root
|
||||
fi
|
||||
|
||||
date=$(uci get oled.@oled[0].date)
|
||||
lanip=$(uci get oled.@oled[0].lanip)
|
||||
cputemp=$(uci get oled.@oled[0].cputemp)
|
||||
cpufreq=$(uci get oled.@oled[0].cpufreq)
|
||||
netspeed=$(uci get oled.@oled[0].netspeed)
|
||||
time=$(uci get oled.@oled[0].time)
|
||||
drawline=$(uci get oled.@oled[0].drawline)
|
||||
drawrect=$(uci get oled.@oled[0].drawrect)
|
||||
fillrect=$(uci get oled.@oled[0].fillrect)
|
||||
drawcircle=$(uci get oled.@oled[0].drawcircle)
|
||||
drawroundrect=$(uci get oled.@oled[0].drawroundrect)
|
||||
fillroundrect=$(uci get oled.@oled[0].fillroundrect)
|
||||
drawtriangle=$(uci get oled.@oled[0].drawtriangle)
|
||||
filltriangle=$(uci get oled.@oled[0].filltriangle)
|
||||
displaybitmap=$(uci get oled.@oled[0].displaybitmap)
|
||||
displayinvertnormal=$(uci get oled.@oled[0].displayinvertnormal)
|
||||
drawbitmapeg=$(uci get oled.@oled[0].drawbitmapeg)
|
||||
rotate=$(uci get oled.@oled[0].rotate)
|
||||
scroll=$(uci get oled.@oled[0].scroll)
|
||||
text=$(uci get oled.@oled[0].text)
|
||||
netsource=$(uci get oled.@oled[0].netsource)
|
||||
path=$(uci get oled.@oled[0].path)
|
||||
|
||||
if [ ${netspeed} -eq 1 ]; then
|
||||
nohup /usr/sbin/netspeed ${netsource} >/dev/null 2>&1 &
|
||||
else
|
||||
kill -9 $(pgrep -f /usr/sbin/netspeed)
|
||||
rm -f /tmp/netspeed
|
||||
fi
|
||||
nohup ${PROG} ${date} ${lanip} ${cputemp} ${cpufreq} ${netspeed} ${time} ${drawline} ${drawrect} ${fillrect} ${drawcircle} ${drawroundrect} ${fillroundrect} ${drawtriangle} ${filltriangle} ${displaybitmap} ${displayinvertnormal} ${drawbitmapeg} ${scroll} "${text}" "${netsource}" "${path}" ${rotate} 1 > /dev/null 2>&1 &
|
||||
}
|
||||
|
||||
restart() {
|
||||
enabled=$(uci get oled.@oled[0].enable)
|
||||
pgrep -f ${PROG} >/dev/null
|
||||
if [ $? -eq 0 ]; then
|
||||
if [ $enabled -eq 1 ]; then
|
||||
autoswitch=$(uci get oled.@oled[0].autoswitch)
|
||||
from=$(uci get oled.@oled[0].from)
|
||||
to=$(uci get oled.@oled[0].to)
|
||||
if [ ${autoswitch} -eq 1 ]; then
|
||||
hour=$(date +"%H")
|
||||
min=$(date +"%M")
|
||||
ihour=`expr $hour + 0`
|
||||
imin=`expr $min + 0`
|
||||
now=$(($ihour*60+$imin))
|
||||
if [[ $now -lt $from || $now -gt $to ]]; then
|
||||
stop
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
date=$(uci get oled.@oled[0].date)
|
||||
lanip=$(uci get oled.@oled[0].lanip)
|
||||
cputemp=$(uci get oled.@oled[0].cputemp)
|
||||
cpufreq=$(uci get oled.@oled[0].cpufreq)
|
||||
netspeed=$(uci get oled.@oled[0].netspeed)
|
||||
time=$(uci get oled.@oled[0].time)
|
||||
drawline=$(uci get oled.@oled[0].drawline)
|
||||
drawrect=$(uci get oled.@oled[0].drawrect)
|
||||
fillrect=$(uci get oled.@oled[0].fillrect)
|
||||
drawcircle=$(uci get oled.@oled[0].drawcircle)
|
||||
drawroundrect=$(uci get oled.@oled[0].drawroundrect)
|
||||
fillroundrect=$(uci get oled.@oled[0].fillroundrect)
|
||||
drawtriangle=$(uci get oled.@oled[0].drawtriangle)
|
||||
filltriangle=$(uci get oled.@oled[0].filltriangle)
|
||||
displaybitmap=$(uci get oled.@oled[0].displaybitmap)
|
||||
displayinvertnormal=$(uci get oled.@oled[0].displayinvertnormal)
|
||||
drawbitmapeg=$(uci get oled.@oled[0].drawbitmapeg)
|
||||
rotate=$(uci get oled.@oled[0].rotate)
|
||||
scroll=$(uci get oled.@oled[0].scroll)
|
||||
text=$(uci get oled.@oled[0].text)
|
||||
netsource=$(uci get oled.@oled[0].netsource)
|
||||
path=$(uci get oled.@oled[0].path)
|
||||
|
||||
kill -9 $(pgrep /usr/bin/oled)
|
||||
kill -9 $(pgrep -f /usr/sbin/netspeed)
|
||||
|
||||
if [ ${netspeed} -eq 1 ]; then
|
||||
nohup /usr/sbin/netspeed ${netsource} >/dev/null 2>&1 &
|
||||
else
|
||||
kill -9 $(pgrep -f /usr/sbin/netspeed)
|
||||
rm -f /tmp/netspeed
|
||||
fi
|
||||
nohup ${PROG} ${date} ${lanip} ${cputemp} ${cpufreq} ${netspeed} ${time} ${drawline} ${drawrect} ${fillrect} ${drawcircle} ${drawroundrect} ${fillroundrect} ${drawtriangle} ${filltriangle} ${displaybitmap} ${displayinvertnormal} ${drawbitmapeg} ${scroll} "${text}" "${netsource}" "${path}" ${rotate} 0 > /dev/null 2>&1 &
|
||||
else
|
||||
stop
|
||||
fi
|
||||
else
|
||||
if [ $enabled -eq 1 ]; then
|
||||
start
|
||||
else
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
boot() {
|
||||
start
|
||||
}
|
31
applications/luci-app-oled/root/etc/uci-defaults/oled
Normal file
31
applications/luci-app-oled/root/etc/uci-defaults/oled
Normal file
@ -0,0 +1,31 @@
|
||||
#!/bin/sh
|
||||
|
||||
uci_write_config() {
|
||||
uci -q set oled.@oled[0].path="$1"
|
||||
uci -q set oled.@oled[0].rotate="$2"
|
||||
uci -q commit oled
|
||||
}
|
||||
|
||||
. /lib/functions/system.sh
|
||||
|
||||
case "$(board_name)" in
|
||||
hinlink,opc-h69k)
|
||||
uci_write_config '/dev/i2c-5' 1
|
||||
;;
|
||||
widora,mangopi-m28k)
|
||||
uci_write_config '/dev/i2c-6' 0
|
||||
;;
|
||||
widora,mangopi-m28k-pro)
|
||||
uci_write_config '/dev/i2c-8' 0
|
||||
;;
|
||||
esac
|
||||
|
||||
uci -q batch <<-EOF >/dev/null
|
||||
delete ucitrack.@oled[-1]
|
||||
add ucitrack oled
|
||||
set ucitrack.@oled[-1].init=oled
|
||||
commit ucitrack
|
||||
EOF
|
||||
|
||||
rm -rf /tmp/luci-*
|
||||
exit 0
|
20
applications/luci-app-oled/root/usr/sbin/netspeed
Executable file
20
applications/luci-app-oled/root/usr/sbin/netspeed
Executable file
@ -0,0 +1,20 @@
|
||||
#!/bin/ash
|
||||
IF=$1
|
||||
if [ -z "$IF" ]; then
|
||||
IF=`ls -1 /sys/class/net/ | head -1`
|
||||
fi
|
||||
RXPREV=-1
|
||||
TXPREV=-1
|
||||
echo "Listening $IF..."
|
||||
while [ 1 == 1 ] ; do
|
||||
RX=`cat /sys/class/net/${IF}/statistics/rx_bytes`
|
||||
TX=`cat /sys/class/net/${IF}/statistics/tx_bytes`
|
||||
if [ $RXPREV -ne -1 ] ; then
|
||||
let BWRX=$RX-$RXPREV
|
||||
let BWTX=$TX-$TXPREV
|
||||
echo "$BWRX $BWTX">/tmp/netspeed
|
||||
fi
|
||||
RXPREV=$RX
|
||||
TXPREV=$TX
|
||||
sleep 1
|
||||
done
|
238
applications/luci-app-oled/src/Example_Code/Main.c
Normal file
238
applications/luci-app-oled/src/Example_Code/Main.c
Normal file
@ -0,0 +1,238 @@
|
||||
/*
|
||||
* Main.c
|
||||
*
|
||||
* Created on : Sep 6, 2017
|
||||
* Author : Vinay Divakar
|
||||
* Description : Example usage of the SSD1306 Driver API's
|
||||
* Website : www.deeplyembedded.org
|
||||
*/
|
||||
|
||||
/* Lib Includes */
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <signal.h>
|
||||
|
||||
/* Header Files */
|
||||
#include "I2C.h"
|
||||
#include "SSD1306_OLED.h"
|
||||
#include "example_app.h"
|
||||
|
||||
/* Oh Compiler-Please leave me as is */
|
||||
volatile unsigned char flag = 0;
|
||||
|
||||
/* Alarm Signal Handler */
|
||||
void ALARMhandler(int sig)
|
||||
{
|
||||
/* Set flag */
|
||||
flag = 5;
|
||||
}
|
||||
|
||||
void BreakDeal(int sig)
|
||||
{
|
||||
clearDisplay();
|
||||
usleep(1000000);
|
||||
Display();
|
||||
exit(0);
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
int date=atoi(argv[1]);
|
||||
int lanip=atoi(argv[2]);
|
||||
int cputemp=atoi(argv[3]);
|
||||
int cpufreq=atoi(argv[4]);
|
||||
int netspeed=atoi(argv[5]);
|
||||
int time=atoi(argv[6]);
|
||||
int drawline=atoi(argv[7]);
|
||||
int drawrect=atoi(argv[8]);
|
||||
int fillrect=atoi(argv[9]);
|
||||
int drawcircle=atoi(argv[10]);
|
||||
int drawroundcircle=atoi(argv[11]);
|
||||
int fillroundcircle=atoi(argv[12]);
|
||||
int drawtriangle=atoi(argv[13]);
|
||||
int filltriangle=atoi(argv[14]);
|
||||
int displaybitmap=atoi(argv[15]);
|
||||
int displayinvertnormal=atoi(argv[16]);
|
||||
int drawbitmapeg=atoi(argv[17]);
|
||||
int scroll=atoi(argv[18]);
|
||||
char *text=argv[19];
|
||||
char *eth=argv[20];
|
||||
char *path=argv[21];
|
||||
int rotate=atoi(argv[22]);
|
||||
int needinit=atoi(argv[23]);
|
||||
|
||||
if(path == NULL)
|
||||
path = I2C_DEV0_PATH;
|
||||
|
||||
/* Initialize I2C bus and connect to the I2C Device */
|
||||
if(init_i2c_dev(path, SSD1306_OLED_ADDR) == 0)
|
||||
{
|
||||
printf("I2C: Bus Connected to SSD1306\r\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("I2C: OOPS! Something Went Wrong\r\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* Register the Alarm Handler */
|
||||
signal(SIGALRM, ALARMhandler);
|
||||
signal(SIGINT, BreakDeal);
|
||||
//signal(SIGTERM, BreakDeal);
|
||||
|
||||
/* Run SDD1306 Initialization Sequence */
|
||||
if (needinit==1)
|
||||
display_Init_seq();
|
||||
|
||||
if (rotate==1)
|
||||
display_rotate();
|
||||
else
|
||||
display_normal();
|
||||
|
||||
/* Clear display */
|
||||
clearDisplay();
|
||||
|
||||
// draw a single pixel
|
||||
// drawPixel(0, 1, WHITE);
|
||||
// Display();
|
||||
// usleep(1000000);
|
||||
// clearDisplay();
|
||||
|
||||
// draw many lines
|
||||
while(1){
|
||||
if(scroll){
|
||||
testscrolltext(text);
|
||||
usleep(1000000);
|
||||
clearDisplay();
|
||||
}
|
||||
|
||||
if(drawline){
|
||||
testdrawline();
|
||||
usleep(1000000);
|
||||
clearDisplay();
|
||||
}
|
||||
|
||||
// draw rectangles
|
||||
if(drawrect){
|
||||
testdrawrect();
|
||||
usleep(1000000);
|
||||
clearDisplay();
|
||||
}
|
||||
|
||||
// draw multiple rectangles
|
||||
if(fillrect){
|
||||
testfillrect();
|
||||
usleep(1000000);
|
||||
clearDisplay();
|
||||
}
|
||||
|
||||
// draw mulitple circles
|
||||
if(drawcircle){
|
||||
testdrawcircle();
|
||||
usleep(1000000);
|
||||
clearDisplay();
|
||||
}
|
||||
|
||||
// draw a white circle, 10 pixel radius
|
||||
if(drawroundcircle){
|
||||
testdrawroundrect();
|
||||
usleep(1000000);
|
||||
clearDisplay();
|
||||
}
|
||||
|
||||
// Fill the round rectangle
|
||||
if(fillroundcircle){
|
||||
testfillroundrect();
|
||||
usleep(1000000);
|
||||
clearDisplay();
|
||||
}
|
||||
|
||||
// Draw triangles
|
||||
if(drawtriangle){
|
||||
testdrawtriangle();
|
||||
usleep(1000000);
|
||||
clearDisplay();
|
||||
}
|
||||
// Fill triangles
|
||||
if(filltriangle){
|
||||
testfilltriangle();
|
||||
usleep(1000000);
|
||||
clearDisplay();
|
||||
}
|
||||
|
||||
// Display miniature bitmap
|
||||
if(displaybitmap){
|
||||
display_bitmap();
|
||||
Display();
|
||||
usleep(1000000);
|
||||
};
|
||||
|
||||
// Display Inverted image and normalize it back
|
||||
if(displayinvertnormal){
|
||||
display_invert_normal();
|
||||
clearDisplay();
|
||||
usleep(1000000);
|
||||
Display();
|
||||
}
|
||||
|
||||
// Generate Signal after 20 Seconds
|
||||
|
||||
// draw a bitmap icon and 'animate' movement
|
||||
if(drawbitmapeg){
|
||||
alarm(10);
|
||||
flag=0;
|
||||
testdrawbitmap_eg();
|
||||
clearDisplay();
|
||||
usleep(1000000);
|
||||
Display();
|
||||
}
|
||||
|
||||
//setCursor(0,0);
|
||||
setTextColor(WHITE);
|
||||
|
||||
// info display
|
||||
int sum = date+lanip+cpufreq+cputemp+netspeed;
|
||||
if (sum == 0) {
|
||||
clearDisplay();
|
||||
return 0;
|
||||
}
|
||||
|
||||
for(int i = 1; i < time; i++){
|
||||
if (sum == 1){//only one item for display
|
||||
if (date) testdate(CENTER, 8);
|
||||
if (lanip) testlanip(CENTER, 8);
|
||||
if (cpufreq) testcpufreq(CENTER, 8);
|
||||
if (cputemp) testcputemp(CENTER, 8);
|
||||
if (netspeed) testnetspeed(SPLIT,0);
|
||||
Display();
|
||||
usleep(1000000);
|
||||
clearDisplay();
|
||||
}else if (sum == 2){//two items for display
|
||||
if(date) {testdate(CENTER, 16*(date-1));}
|
||||
if(lanip) {testlanip(CENTER, 16*(date+lanip-1));}
|
||||
if(cpufreq) {testcpufreq(CENTER, 16*(date+lanip+cpufreq-1));}
|
||||
if(cputemp) {testcputemp(CENTER, 16*(date+lanip+cpufreq+cputemp-1));}
|
||||
if(netspeed) {testnetspeed(MERGE, 16*(date+lanip+cpufreq+cputemp+netspeed-1));}
|
||||
Display();
|
||||
usleep(1000000);
|
||||
clearDisplay();
|
||||
}else{//more than two items for display
|
||||
if(date) {testdate(FULL, 8*(date-1));}
|
||||
if(lanip) {testlanip(FULL, 8*(date+lanip-1));}
|
||||
if(cpufreq && cputemp) {
|
||||
testcpu(8*(date+lanip));
|
||||
if(netspeed) {testnetspeed(FULL, 8*(date+lanip+1+netspeed-1));}
|
||||
}else{
|
||||
if(cpufreq) {testcpufreq(FULL, 8*(date+lanip+cpufreq-1));}
|
||||
if(cputemp) {testcputemp(FULL, 8*(date+lanip+cpufreq+cputemp-1));}
|
||||
if(netspeed) {testnetspeed(FULL, 8*(date+lanip+cpufreq+cputemp+netspeed-1));}
|
||||
}
|
||||
Display();
|
||||
usleep(1000000);
|
||||
clearDisplay();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
639
applications/luci-app-oled/src/Example_Code/example_app.c
Normal file
639
applications/luci-app-oled/src/Example_Code/example_app.c
Normal file
@ -0,0 +1,639 @@
|
||||
/*
|
||||
* MIT License
|
||||
|
||||
Copyright (c) 2017 DeeplyEmbedded
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
* example_app.c
|
||||
*
|
||||
* Created on : Sep 6, 2017
|
||||
* Author : Vinay Divakar
|
||||
* Website : www.deeplyembedded.org
|
||||
*/
|
||||
|
||||
/* Lib Includes */
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include <signal.h>
|
||||
#include <unistd.h>
|
||||
#include <time.h>
|
||||
#include "SSD1306_OLED.h"
|
||||
#include "example_app.h"
|
||||
|
||||
#define BUFMAX SSD1306_LCDWIDTH*SSD1306_LCDHEIGHT
|
||||
|
||||
/* MACRO's */
|
||||
#define LOGO16_GLCD_HEIGHT 16
|
||||
#define LOGO16_GLCD_WIDTH 16
|
||||
#define NUMFLAKES 10
|
||||
#define XPOS 0
|
||||
#define YPOS 1
|
||||
#define DELTAY 2
|
||||
|
||||
#define TIMESIZE 64
|
||||
//temperature
|
||||
#define TEMPPATH "/sys/class/thermal/thermal_zone0/temp"
|
||||
#define TEMPSIZE 5
|
||||
//cpu
|
||||
#define FREQSIZE 8
|
||||
#define FREQPATH "cat /sys/devices/system/cpu/cpu[04]/cpufreq/cpuinfo_cur_freq"
|
||||
//ip
|
||||
#define IPPATH "ifconfig br-lan|grep 'inet addr:'|cut -d: -f2|awk '{print $1}'"
|
||||
#define IPSIZE 20
|
||||
//netspeed
|
||||
#define NETPATH "cat /tmp/netspeed"
|
||||
|
||||
/* Extern volatile */
|
||||
extern volatile unsigned char flag;
|
||||
|
||||
/* Bit Map - Taken from Adafruit SSD1306 OLED Library */
|
||||
static const unsigned char logo16_glcd_bmp[] =
|
||||
{
|
||||
0b00000000, 0b11000000,
|
||||
0b00000001, 0b11000000,
|
||||
0b00000001, 0b11000000,
|
||||
0b00000011, 0b11100000,
|
||||
0b11110011, 0b11100000,
|
||||
0b11111110, 0b11111000,
|
||||
0b01111110, 0b11111111,
|
||||
0b00110011, 0b10011111,
|
||||
0b00011111, 0b11111100,
|
||||
0b00001101, 0b01110000,
|
||||
0b00011011, 0b10100000,
|
||||
0b00111111, 0b11100000,
|
||||
0b00111111, 0b11110000,
|
||||
0b01111100, 0b11110000,
|
||||
0b01110000, 0b01110000,
|
||||
0b00000000, 0b00110000
|
||||
};
|
||||
|
||||
FILE *fp;
|
||||
char content_buff[BUFMAX];
|
||||
char buf[BUFMAX];
|
||||
int display_offset =7;
|
||||
|
||||
/* draw many lines */
|
||||
void testdrawline()
|
||||
{
|
||||
short i = 0;
|
||||
for (i=0; i<SSD1306_LCDWIDTH; i+=4)
|
||||
{
|
||||
drawLine(0, 0, i, SSD1306_LCDHEIGHT-1, WHITE);
|
||||
Display();
|
||||
usleep(1000);
|
||||
}
|
||||
for (i=0; i<SSD1306_LCDHEIGHT; i+=4)
|
||||
{
|
||||
drawLine(0, 0, SSD1306_LCDWIDTH-1, i, WHITE);
|
||||
Display();
|
||||
usleep(1000);
|
||||
}
|
||||
usleep(250000);
|
||||
|
||||
clearDisplay();
|
||||
for (i=0; i<SSD1306_LCDWIDTH; i+=4)
|
||||
{
|
||||
drawLine(0, SSD1306_LCDHEIGHT-1, i, 0, WHITE);
|
||||
Display();
|
||||
usleep(1000);
|
||||
}
|
||||
for (i=SSD1306_LCDHEIGHT-1; i>=0; i-=4)
|
||||
{
|
||||
drawLine(0, SSD1306_LCDHEIGHT-1, SSD1306_LCDWIDTH-1, i, WHITE);
|
||||
Display();
|
||||
usleep(1000);
|
||||
}
|
||||
usleep(250000);
|
||||
|
||||
clearDisplay();
|
||||
for (i=SSD1306_LCDWIDTH-1; i>=0; i-=4)
|
||||
{
|
||||
drawLine(SSD1306_LCDWIDTH-1, SSD1306_LCDHEIGHT-1, i, 0, WHITE);
|
||||
Display();
|
||||
usleep(1000);
|
||||
}
|
||||
for (i=SSD1306_LCDHEIGHT-1; i>=0; i-=4)
|
||||
{
|
||||
drawLine(SSD1306_LCDWIDTH-1, SSD1306_LCDHEIGHT-1, 0, i, WHITE);
|
||||
Display();
|
||||
usleep(1000);
|
||||
}
|
||||
usleep(250000);
|
||||
|
||||
clearDisplay();
|
||||
for (i=0; i<SSD1306_LCDHEIGHT; i+=4)
|
||||
{
|
||||
drawLine(SSD1306_LCDWIDTH-1, 0, 0, i, WHITE);
|
||||
Display();
|
||||
usleep(1000);
|
||||
}
|
||||
for (i=0; i<SSD1306_LCDWIDTH; i+=4) {
|
||||
drawLine(SSD1306_LCDWIDTH-1, 0, i, SSD1306_LCDHEIGHT-1, WHITE);
|
||||
Display();
|
||||
usleep(1000);
|
||||
}
|
||||
usleep(250000);
|
||||
}
|
||||
|
||||
/* draw rectangles */
|
||||
void testdrawrect()
|
||||
{
|
||||
short i = 0;
|
||||
for (i=0; i<SSD1306_LCDHEIGHT/2; i+=2)
|
||||
{
|
||||
drawRect(i, i,SSD1306_LCDWIDTH-2*i, SSD1306_LCDHEIGHT-2*i, WHITE);
|
||||
Display();
|
||||
usleep(1000);
|
||||
}
|
||||
}
|
||||
|
||||
/* draw multiple rectangles */
|
||||
void testfillrect()
|
||||
{
|
||||
unsigned char color = 1;
|
||||
short i = 0;
|
||||
for (i=0; i<SSD1306_LCDHEIGHT/2; i+=3)
|
||||
{
|
||||
// alternate colors
|
||||
fillRect(i, i, SSD1306_LCDWIDTH-i*2, SSD1306_LCDHEIGHT-i*2, color%2);
|
||||
Display();
|
||||
usleep(1000);
|
||||
color++;
|
||||
}
|
||||
}
|
||||
|
||||
/* draw mulitple circles */
|
||||
void testdrawcircle()
|
||||
{
|
||||
short i = 0;
|
||||
for (i=0; i<SSD1306_LCDHEIGHT; i+=2)
|
||||
{
|
||||
drawCircle(SSD1306_LCDWIDTH/2,SSD1306_LCDHEIGHT/2, i, WHITE);
|
||||
Display();
|
||||
usleep(1000);
|
||||
}
|
||||
}
|
||||
|
||||
/*draw a white circle, 10 pixel radius */
|
||||
void testdrawroundrect()
|
||||
{
|
||||
short i = 0;
|
||||
for (i=0; i<SSD1306_LCDHEIGHT/2-2; i+=2) {
|
||||
drawRoundRect(i, i,SSD1306_LCDWIDTH-2*i, SSD1306_LCDHEIGHT-2*i, SSD1306_LCDHEIGHT/4, WHITE);
|
||||
Display();
|
||||
usleep(1000);
|
||||
}
|
||||
}
|
||||
|
||||
/* Fill the round rectangle */
|
||||
void testfillroundrect()
|
||||
{
|
||||
short color = WHITE,i = 0;
|
||||
for (i=0; i<SSD1306_LCDHEIGHT/2-2; i+=2)
|
||||
{
|
||||
fillRoundRect(i, i, SSD1306_LCDWIDTH-2*i, SSD1306_LCDHEIGHT-2*i, SSD1306_LCDHEIGHT/4, color);
|
||||
if (color == WHITE)
|
||||
color = BLACK;
|
||||
else
|
||||
color = WHITE;
|
||||
Display();
|
||||
usleep(1000);
|
||||
}
|
||||
}
|
||||
|
||||
/* Draw triangles */
|
||||
void testdrawtriangle()
|
||||
{
|
||||
short i = 0;
|
||||
for (i=0; i<MIN(SSD1306_LCDWIDTH,SSD1306_LCDHEIGHT)/2; i+=5)
|
||||
{
|
||||
drawTriangle(SSD1306_LCDWIDTH/2, SSD1306_LCDHEIGHT/2-i,
|
||||
SSD1306_LCDWIDTH/2-i,SSD1306_LCDHEIGHT /2+i,
|
||||
SSD1306_LCDWIDTH/2+i, SSD1306_LCDHEIGHT/2+i, WHITE);
|
||||
Display();
|
||||
usleep(1000);
|
||||
}
|
||||
}
|
||||
|
||||
/* Fill triangles */
|
||||
void testfilltriangle()
|
||||
{
|
||||
unsigned char color = WHITE;
|
||||
short i = 0;
|
||||
for (i=MIN(SSD1306_LCDWIDTH,SSD1306_LCDHEIGHT)/2; i>0; i-=5)
|
||||
{
|
||||
fillTriangle(SSD1306_LCDWIDTH/2, SSD1306_LCDHEIGHT/2-i,
|
||||
SSD1306_LCDWIDTH/2-i, SSD1306_LCDHEIGHT/2+i,
|
||||
SSD1306_LCDWIDTH/2+i, SSD1306_LCDHEIGHT/2+i, WHITE);
|
||||
if (color == WHITE)
|
||||
color = BLACK;
|
||||
else
|
||||
color = WHITE;
|
||||
Display();
|
||||
usleep(1000);
|
||||
}
|
||||
}
|
||||
|
||||
/* Display a bunch of characters and emoticons */
|
||||
void testdrawchar()
|
||||
{
|
||||
unsigned char i = 0;
|
||||
setTextSize(1);
|
||||
setTextColor(WHITE);
|
||||
setCursor(0,0);
|
||||
|
||||
for (i=0; i < 168; i++)
|
||||
{
|
||||
if (i == '\n')
|
||||
continue;
|
||||
oled_write(i);
|
||||
if ((i > 0) && (i % 21 == 0))
|
||||
println();
|
||||
}
|
||||
Display();
|
||||
usleep(1000);
|
||||
}
|
||||
|
||||
/* Display "scroll" and scroll around */
|
||||
void testscrolltext(char* str)
|
||||
{
|
||||
setTextSize(2);
|
||||
setTextColor(WHITE);
|
||||
setCursor(10,8);
|
||||
sprintf(buf,"%s",str);
|
||||
print_strln(buf);
|
||||
Display();
|
||||
usleep(1000);
|
||||
startscrollright(0x00, 0x0F);
|
||||
usleep(5000000);
|
||||
stopscroll();
|
||||
usleep(1000000);
|
||||
startscrollleft(0x00, 0x0F);
|
||||
usleep(5000000);
|
||||
stopscroll();
|
||||
usleep(1000000);
|
||||
startscrolldiagright(0x00, 0x07);
|
||||
usleep(5000000);
|
||||
startscrolldiagleft(0x00, 0x07);
|
||||
usleep(5000000);
|
||||
stopscroll();
|
||||
}
|
||||
|
||||
/* Display Texts */
|
||||
void display_texts()
|
||||
{
|
||||
setTextSize(1);
|
||||
setTextColor(WHITE);
|
||||
setCursor(10,0);
|
||||
print_str("HELLO FELLAS!");
|
||||
println();
|
||||
printFloat_ln(3.141592, 4); //Print 4 No's after the decimal Pt.
|
||||
printNumber_L_ln(-1234, DEC);
|
||||
printNumber_UC_ln(170, BIN);
|
||||
setTextSize(2);
|
||||
setTextColor(WHITE);
|
||||
print_str("0x");
|
||||
printNumber_UL_ln(0xDEADBEEF, HEX);
|
||||
}
|
||||
|
||||
/* Display miniature bitmap */
|
||||
void display_bitmap()
|
||||
{
|
||||
drawBitmap(30, 16, logo16_glcd_bmp, 16, 16, 1);
|
||||
}
|
||||
|
||||
/* Invert Display and Normalize it */
|
||||
void display_invert_normal()
|
||||
{
|
||||
invertDisplay(SSD1306_INVERT_DISPLAY);
|
||||
usleep(1000000);
|
||||
invertDisplay(SSD1306_NORMALIZE_DISPLAY);
|
||||
usleep(1000000);
|
||||
}
|
||||
|
||||
/* Draw a bitmap and 'animate' movement */
|
||||
void testdrawbitmap(const unsigned char *bitmap, unsigned char w, unsigned char h)
|
||||
{
|
||||
unsigned char icons[NUMFLAKES][3], f = 0;
|
||||
|
||||
// initialize
|
||||
for (f=0; f< NUMFLAKES; f++)
|
||||
{
|
||||
icons[f][XPOS] = rand() % SSD1306_LCDWIDTH;
|
||||
icons[f][YPOS] = 0;
|
||||
icons[f][DELTAY] = (rand() % 5) + 1;
|
||||
|
||||
/* Looks kinna ugly to me - Un-Comment if you need it */
|
||||
//print_str("x: ");
|
||||
//printNumber_UC(icons[f][XPOS], DEC);
|
||||
//print_str("y: ");
|
||||
//printNumber_UC(icons[f][YPOS], DEC);
|
||||
//print_str("dy: ");
|
||||
//printNumber_UC(icons[f][DELTAY], DEC);
|
||||
}
|
||||
|
||||
while (flag != 5)
|
||||
{
|
||||
// draw each icon
|
||||
for (f=0; f< NUMFLAKES; f++)
|
||||
{
|
||||
drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, WHITE);
|
||||
}
|
||||
Display();
|
||||
usleep(200000);
|
||||
|
||||
// then erase it + move it
|
||||
for (f=0; f< NUMFLAKES; f++)
|
||||
{
|
||||
drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, BLACK);
|
||||
|
||||
// move it
|
||||
icons[f][YPOS] += icons[f][DELTAY];
|
||||
|
||||
// if its gone, reinit
|
||||
if (icons[f][YPOS] > SSD1306_LCDHEIGHT)
|
||||
{
|
||||
icons[f][XPOS] = rand() % SSD1306_LCDWIDTH;
|
||||
icons[f][YPOS] = 0;
|
||||
icons[f][DELTAY] = (rand() % 5) + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Draw bitmap and animate */
|
||||
void testdrawbitmap_eg()
|
||||
{
|
||||
setTextSize(1);
|
||||
setTextColor(WHITE);
|
||||
setCursor(10,0);
|
||||
testdrawbitmap(logo16_glcd_bmp, LOGO16_GLCD_HEIGHT, LOGO16_GLCD_WIDTH);
|
||||
}
|
||||
|
||||
/* Intro */
|
||||
void deeplyembedded_credits()
|
||||
{
|
||||
setTextSize(1);
|
||||
setTextColor(WHITE);
|
||||
setCursor(1,0);
|
||||
print_strln("deeplyembedded.org");
|
||||
println();
|
||||
print_strln("Author:Vinay Divakar");
|
||||
println();
|
||||
println();
|
||||
print_strln("THANK YOU");
|
||||
}
|
||||
|
||||
void testdate(int mode, int y)
|
||||
{
|
||||
time_t rawtime;
|
||||
time_t curtime;
|
||||
uint8_t timebuff[TIMESIZE];
|
||||
curtime = time(NULL);
|
||||
time(&rawtime);
|
||||
switch (mode)
|
||||
{
|
||||
case CENTER:
|
||||
setTextSize(2);
|
||||
strftime(timebuff,80,"%H:%M",localtime(&rawtime));
|
||||
sprintf(buf,"%s",timebuff);
|
||||
setCursor((127-strlen(buf)*11)/2-4, y);
|
||||
break;
|
||||
case FULL:
|
||||
setTextSize(1);
|
||||
strftime(timebuff,80,"%Y-%m-%d %H:%M:%S",localtime(&rawtime));
|
||||
sprintf(buf,"%s",timebuff);
|
||||
setCursor(display_offset, y);
|
||||
break;
|
||||
}
|
||||
print_strln(buf);
|
||||
}
|
||||
|
||||
void testlanip(int mode, int y)
|
||||
{
|
||||
setTextSize(1);
|
||||
if((fp=popen(IPPATH,"r"))!=NULL)
|
||||
{
|
||||
fscanf(fp,"%s",content_buff);
|
||||
fclose(fp);
|
||||
//ipbuff[strlen(ipbuff)-1]=32;
|
||||
switch(mode)
|
||||
{
|
||||
case CENTER:
|
||||
setTextSize(1);
|
||||
sprintf(buf,"%s",content_buff);
|
||||
setCursor((127-strlen(buf)*6)/2, y+4);
|
||||
break;
|
||||
case FULL:
|
||||
setTextSize(1);
|
||||
sprintf(buf,"IP:%s",content_buff);
|
||||
setCursor(display_offset, y);
|
||||
break;
|
||||
}
|
||||
print_strln(buf);
|
||||
}
|
||||
}
|
||||
|
||||
void testcputemp(int mode, int y)
|
||||
{
|
||||
if((fp=fopen(TEMPPATH,"r"))!=NULL)
|
||||
{
|
||||
fgets(content_buff,TEMPSIZE,fp);
|
||||
fclose(fp);
|
||||
switch (mode)
|
||||
{
|
||||
case CENTER:
|
||||
setTextSize(2);
|
||||
sprintf(buf, "%.2f",atoi(content_buff)/100.0);
|
||||
setCursor((127-(strlen(buf)+2)*11)/2-4, y);
|
||||
print_str(buf);
|
||||
oled_write(0);
|
||||
oled_write(67);
|
||||
drawCircle(getCursorX()-16, getCursorY()+3, 2, WHITE);
|
||||
break;
|
||||
case FULL:
|
||||
setTextSize(1);
|
||||
sprintf(buf,"CPU TEMP:%.2f",atoi(content_buff)/100.0);
|
||||
setCursor(display_offset, y);
|
||||
print_str(buf);
|
||||
oled_write(0);
|
||||
oled_write(67);
|
||||
drawCircle(getCursorX()-8, getCursorY()+1, 1, WHITE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void testcpufreq(int mode, int y)
|
||||
{
|
||||
if((fp=popen(FREQPATH,"r")) != NULL)
|
||||
{
|
||||
fgets(content_buff,FREQSIZE,fp);
|
||||
fclose(fp);
|
||||
switch(mode)
|
||||
{
|
||||
case CENTER:
|
||||
setTextSize(2);
|
||||
sprintf(buf,"%4dMHz",atoi(content_buff)/1000);
|
||||
setCursor((127-strlen(buf)*11)/2-4, y);
|
||||
break;
|
||||
case FULL:
|
||||
setTextSize(1);
|
||||
sprintf(buf,"CPU FREQ:%4dMHz",atoi(content_buff)/1000);
|
||||
setCursor(display_offset, y);
|
||||
break;
|
||||
}
|
||||
print_strln(buf);
|
||||
}
|
||||
}
|
||||
|
||||
void testnetspeed(int mode, int y)
|
||||
{
|
||||
int rx,tx;
|
||||
if((fp=popen(NETPATH,"r")) != NULL)
|
||||
{
|
||||
fscanf(fp,"%d %d", &rx, &tx);
|
||||
fclose(fp);
|
||||
rx = rx;
|
||||
tx = tx;
|
||||
switch(mode)
|
||||
{
|
||||
case SPLIT:
|
||||
setTextSize(2);
|
||||
if (tx < 1000) sprintf(buf, "%03dB", tx);
|
||||
else if (tx > 1000000) sprintf(buf, "%03dM", tx/1000000);
|
||||
else sprintf(buf, "%03dK", tx/1000);
|
||||
setCursor((127-(strlen(buf)+1)*11)/2,0);
|
||||
oled_write(24);
|
||||
print_str(buf);
|
||||
|
||||
if (rx < 1000) sprintf(buf, "%03dB", rx);
|
||||
else if (rx > 1000000) sprintf(buf, "%03dM", rx/1000000);
|
||||
else sprintf(buf, "%03dK", rx/1000);
|
||||
setCursor((127-(strlen(buf)+1)*11)/2,16);
|
||||
oled_write(25);
|
||||
print_str(buf);
|
||||
break;
|
||||
case MERGE:
|
||||
setTextSize(1);
|
||||
if (tx < 1000) sprintf(buf, "%03dB ", tx);
|
||||
else if (tx > 1000000) sprintf(buf, "%03dM", tx/1000000);
|
||||
else sprintf(buf, "%03dK ", tx/1000);
|
||||
setCursor((127-(2*strlen(buf)-1)*6)/2-4, y+4);
|
||||
oled_write(24);
|
||||
print_str(buf);
|
||||
|
||||
if (rx < 1000) sprintf(buf, "%03dB", rx);
|
||||
else if (rx > 1000000) sprintf(buf, "%03dM", rx/1000000);
|
||||
else sprintf(buf, "%03dK", rx/1000);
|
||||
oled_write(25);
|
||||
print_str(buf);
|
||||
break;
|
||||
case FULL:
|
||||
setTextSize(1);
|
||||
setCursor(display_offset, y);
|
||||
oled_write(24);
|
||||
if (tx < 1000) sprintf(buf, "%03dB ", tx);
|
||||
else if (tx > 1000000) sprintf(buf, "%03dM", tx/1000000);
|
||||
else sprintf(buf, "%03dK ", tx/1000);
|
||||
print_str(buf);
|
||||
|
||||
oled_write(25);
|
||||
if (rx < 1000) sprintf(buf, "%03dB", rx);
|
||||
else if (rx > 1000000) sprintf(buf, "%03dM", rx/1000000);
|
||||
else sprintf(buf, "%03dK", rx/1000);
|
||||
print_str(buf);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void testcpu(int y)
|
||||
{
|
||||
//freq
|
||||
setTextSize(1);
|
||||
setCursor(display_offset, y);
|
||||
if((fp=popen(FREQPATH,"r")) != NULL)
|
||||
{
|
||||
fgets(content_buff,FREQSIZE,fp);
|
||||
fclose(fp);
|
||||
sprintf(buf,"CPU:%4dMHz ", atoi(content_buff)/1000);
|
||||
print_str(buf);
|
||||
}
|
||||
|
||||
//temp
|
||||
if((fp=fopen(TEMPPATH,"r"))!=NULL)
|
||||
{
|
||||
fgets(content_buff,TEMPSIZE,fp);
|
||||
fclose(fp);
|
||||
sprintf(buf, "%.2f",atoi(content_buff)/100.0);
|
||||
print_str(buf);
|
||||
oled_write(0);
|
||||
oled_write(67);
|
||||
drawCircle(getCursorX()-8, getCursorY()+1, 1, WHITE);
|
||||
}
|
||||
}
|
||||
|
||||
void testprintinfo()
|
||||
{
|
||||
setTextSize(1);
|
||||
setTextColor(WHITE);
|
||||
setCursor(0,0);
|
||||
|
||||
//date
|
||||
time_t rawtime;
|
||||
time_t curtime;
|
||||
uint8_t timebuff[TIMESIZE];
|
||||
curtime = time(NULL);
|
||||
time(&rawtime);
|
||||
strftime(timebuff,80,"%Y-%m-%d_%w %H:%M:%S",localtime(&rawtime));
|
||||
sprintf(buf,"%s",timebuff);
|
||||
print_strln(buf);
|
||||
|
||||
//br-lan ip
|
||||
if((fp=popen(IPPATH,"r"))!=NULL)
|
||||
{
|
||||
fscanf(fp,"%s",content_buff);
|
||||
fclose(fp);
|
||||
//ipbuff[strlen(ipbuff)-1]=32;
|
||||
sprintf(buf,"IP:%s",content_buff);
|
||||
print_strln(buf);
|
||||
}
|
||||
|
||||
//cpu temp
|
||||
if((fp=popen(FREQPATH,"r")) != NULL)
|
||||
{
|
||||
fgets(content_buff,FREQSIZE,fp);
|
||||
fclose(fp);
|
||||
sprintf(buf,"CPU freq:%d MHz ",atoi(content_buff)/1000);
|
||||
print_strln(buf);
|
||||
}
|
||||
|
||||
//cpu freq
|
||||
if((fp=fopen(TEMPPATH,"r"))!=NULL)
|
||||
{
|
||||
fgets(content_buff,TEMPSIZE,fp);
|
||||
fclose(fp);
|
||||
sprintf(buf,"CPU temp:%.2f C",atoi(content_buff)/100.0);
|
||||
print_strln(buf);
|
||||
}
|
||||
}
|
28
applications/luci-app-oled/src/Example_Code/example_app.h
Normal file
28
applications/luci-app-oled/src/Example_Code/example_app.h
Normal file
@ -0,0 +1,28 @@
|
||||
#define CENTER 0 //single item display
|
||||
#define SPLIT 1 //two items
|
||||
#define MERGE 2
|
||||
#define FULL 3
|
||||
|
||||
void testdrawline();
|
||||
void testdrawrect();
|
||||
void testfillrect();
|
||||
void testdrawcircle();
|
||||
void testdrawroundrect();
|
||||
void testfillroundrect();
|
||||
void testdrawtriangle();
|
||||
void testfilltriangle();
|
||||
void testdrawchar();
|
||||
void testscrolltext(char *str);
|
||||
void display_texts();
|
||||
void display_bitmap();
|
||||
void display_invert_normal();
|
||||
void testdrawbitmap(const unsigned char *bitmap, unsigned char w, unsigned char h);
|
||||
void testdrawbitmap_eg();
|
||||
void deeplyembedded_credits();
|
||||
void testprintinfo();
|
||||
void testdate(int mode, int y);
|
||||
void testlanip(int mode, int y);
|
||||
void testcpufreq(int mode, int y);
|
||||
void testcputemp(int mode, int y);
|
||||
void testnetspeed(int mode, int y);
|
||||
void testcpu(int y);
|
281
applications/luci-app-oled/src/I2C_Library/I2C.c
Normal file
281
applications/luci-app-oled/src/I2C_Library/I2C.c
Normal file
@ -0,0 +1,281 @@
|
||||
/*
|
||||
* MIT License
|
||||
|
||||
Copyright (c) 2017 DeeplyEmbedded
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
* I2C.c
|
||||
*
|
||||
* Created on : September 19, 2017
|
||||
* Author : Vinay Divakar
|
||||
* Description : This is an I2C Library for the BeagleBone that consists of the API's to support the standard
|
||||
* I2C operations.
|
||||
* Website : www.deeplyembedded.org
|
||||
*/
|
||||
|
||||
/*Libs Includes*/
|
||||
#include<stdio.h>
|
||||
#include<fcntl.h>
|
||||
#include<sys/ioctl.h>
|
||||
#include <unistd.h>
|
||||
#include <linux/i2c-dev.h>
|
||||
// heuristic to guess what version of i2c-dev.h we have:
|
||||
// the one installed with `apt-get install libi2c-dev`
|
||||
// would conflict with linux/i2c.h, while the stock
|
||||
// one requires linus/i2c.h
|
||||
#ifndef I2C_SMBUS_BLOCK_MAX
|
||||
// If this is not defined, we have the "stock" i2c-dev.h
|
||||
// so we include linux/i2c.h
|
||||
#include <linux/i2c.h>
|
||||
typedef unsigned char i2c_char_t;
|
||||
#else
|
||||
typedef char i2c_char_t;
|
||||
#endif
|
||||
|
||||
/* Header Files */
|
||||
#include "I2C.h"
|
||||
|
||||
|
||||
/* Exposed objects for i2c-x */
|
||||
I2C_DeviceT I2C_DEV_2;
|
||||
|
||||
/****************************************************************
|
||||
* Function Name : Open_device
|
||||
* Description : Opens the I2C device to use
|
||||
* Returns : 0 on success, -1 on failure
|
||||
* Params @i2c_dev_path: Path to the I2C device
|
||||
* @fd: Variable to store the file handler
|
||||
****************************************************************/
|
||||
int Open_device(char *i2c_dev_path, int *fd)
|
||||
{
|
||||
if((*fd = open(i2c_dev_path, O_RDWR))<0)
|
||||
return -1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************
|
||||
* Function Name : Close_device
|
||||
* Description : Closes the I2C device in use
|
||||
* Returns : 0 on success, -1 on failure
|
||||
* Params : @fd: file descriptor
|
||||
****************************************************************/
|
||||
int Close_device(int fd)
|
||||
{
|
||||
if(close(fd) == -1)
|
||||
return -1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************
|
||||
* Function Name : Set_slave_addr
|
||||
* Description : Connect to the Slave device
|
||||
* Returns : 0 on success, -1 on failure
|
||||
* Params @fd: File descriptor
|
||||
* @slave_addr: Address of the slave device to
|
||||
* talk to.
|
||||
****************************************************************/
|
||||
int Set_slave_addr(int fd, unsigned char slave_addr)
|
||||
{
|
||||
if(ioctl(fd, I2C_SLAVE, slave_addr) < 0)
|
||||
return -1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************
|
||||
* Function Name : i2c_write
|
||||
* Description : Write a byte on SDA
|
||||
* Returns : No. of bytes written on success, -1 on failure
|
||||
* Params @fd: File descriptor
|
||||
* @data: data to write on SDA
|
||||
****************************************************************/
|
||||
int i2c_write(int fd, unsigned char data)
|
||||
{
|
||||
int ret = 0;
|
||||
ret = write(fd, &data, I2C_ONE_BYTE);
|
||||
if((ret == -1) || (ret != 1))
|
||||
return -1;
|
||||
else
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************
|
||||
* Function Name : i2c_read
|
||||
* Description : Read a byte on SDA
|
||||
* Returns : No. of bytes read on success, -1 on failure
|
||||
* Params @fd: File descriptor
|
||||
* @read_data: Points to the variable that stores
|
||||
* the read data byte
|
||||
****************************************************************/
|
||||
int i2c_read(int fd, unsigned char *read_data)
|
||||
{
|
||||
int ret = 0;
|
||||
ret = read(fd, &read_data, I2C_ONE_BYTE);
|
||||
if(ret == -1)
|
||||
perror("I2C: Failed to read |");
|
||||
if(ret == 0)
|
||||
perror("I2C: End of FILE |");
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************
|
||||
* Function Name : i2c_read_register
|
||||
* Description : Read a single register of the slave device
|
||||
* Returns : No. of bytes read on success, -1 on failure
|
||||
* Params @fd: File descriptor
|
||||
* @read_addr: Register address to be read
|
||||
* @read_data: Points to the variable that stores
|
||||
* the read data byte
|
||||
****************************************************************/
|
||||
int i2c_read_register(int fd, unsigned char read_addr, unsigned char *read_data)
|
||||
{
|
||||
int ret = 0;
|
||||
if(i2c_write(fd, read_addr) == -1)
|
||||
{
|
||||
perror("I2C: Failed to write |");
|
||||
return -1;
|
||||
}
|
||||
ret = read(fd, &read_data, I2C_ONE_BYTE);
|
||||
if(ret == -1)
|
||||
perror("I2C: Failed to read |");
|
||||
if(ret == 0)
|
||||
perror("I2C: End of FILE |");
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************
|
||||
* Function Name : i2c_read_registers
|
||||
* Description : Read a multiple registers on the slave device
|
||||
* from starting address
|
||||
* Returns : No. of bytes read on success, -1 on failure
|
||||
* Params @fd: File descriptor
|
||||
* @num: Number of registers/bytes to read from.
|
||||
* @starting_addr: Starting address to read from
|
||||
* @buff_Ptr: Buffer to store the read bytes
|
||||
****************************************************************/
|
||||
int i2c_read_registers(int fd, int num, unsigned char starting_addr,
|
||||
unsigned char *buff_Ptr)
|
||||
{
|
||||
int ret = 0;
|
||||
if(i2c_write(fd, starting_addr) == -1)
|
||||
{
|
||||
perror("I2C: Failed to write |");
|
||||
return -1;
|
||||
}
|
||||
ret = read(fd, buff_Ptr, num);
|
||||
if(ret == -1)
|
||||
perror("I2C: Failed to read |");
|
||||
if(ret == 0)
|
||||
perror("I2C: End of FILE |");
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************
|
||||
* Function Name : i2c_multiple_writes
|
||||
* Description : Write multiple bytes on SDA
|
||||
* Returns : No. of bytes written on success, -1 on failure
|
||||
* Params @fd: file descriptor
|
||||
* @num: No. of bytes to write
|
||||
* @Ptr_buff: Pointer to the buffer containing the
|
||||
* bytes to be written on the SDA
|
||||
****************************************************************/
|
||||
int i2c_multiple_writes(int fd, int num, unsigned char *Ptr_buff)
|
||||
{
|
||||
int ret = 0;
|
||||
ret = write(fd, Ptr_buff, num);
|
||||
if((ret == -1) || (ret != num))
|
||||
return -1;
|
||||
else
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************
|
||||
* Function Name : i2c_write_register
|
||||
* Description : Write a control byte or byte to a register
|
||||
* Returns : No. of bytes written on success, -1 on failure
|
||||
* Params @fd: file descriptor
|
||||
* @reg_addr_or_cntrl: Control byte or Register
|
||||
* address to be written
|
||||
* @val: Command or value to be written in the
|
||||
* addressed register
|
||||
****************************************************************/
|
||||
int i2c_write_register(int fd, unsigned char reg_addr_or_cntrl, unsigned char val)
|
||||
{
|
||||
unsigned char buff[2];
|
||||
int ret = 0;
|
||||
buff[0] = reg_addr_or_cntrl;
|
||||
buff[1] = val;
|
||||
ret = write(fd, buff, I2C_TWO_BYTES);
|
||||
if((ret == -1) || (ret != I2C_TWO_BYTES))
|
||||
return -1;
|
||||
else
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************
|
||||
* Function Name : config_i2c_struct
|
||||
* Description : Initialize the I2C device structure
|
||||
* Returns : NONE
|
||||
* Params @i2c_dev_path: Device path
|
||||
* @slave_addr: Slave device address
|
||||
* @i2c_dev: Pointer to the device structure
|
||||
****************************************************************/
|
||||
void config_i2c_struct(char *i2c_dev_path, unsigned char slave_addr, I2C_DevicePtr i2c_dev)
|
||||
{
|
||||
i2c_dev->i2c_dev_path = i2c_dev_path;
|
||||
i2c_dev->fd_i2c = 0;
|
||||
i2c_dev->i2c_slave_addr = slave_addr;
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************
|
||||
* Function Name : init_i2c_dev
|
||||
* Description : Connect the i2c bus to the slave device
|
||||
* Returns : 0 on success, -1 on failure
|
||||
* Params @i2c_path: the path to the device
|
||||
* @slave_addr: Slave device address
|
||||
****************************************************************/
|
||||
int init_i2c_dev(const char* i2c_path, unsigned char slave_address)
|
||||
{
|
||||
config_i2c_struct((char*)i2c_path, slave_address, &I2C_DEV_2);
|
||||
if(Open_device(I2C_DEV_2.i2c_dev_path, &I2C_DEV_2.fd_i2c) == -1)
|
||||
{
|
||||
perror("I2C: Failed to open device |");
|
||||
return -1;
|
||||
}
|
||||
if(Set_slave_addr(I2C_DEV_2.fd_i2c, I2C_DEV_2.i2c_slave_addr) == -1)
|
||||
{
|
||||
perror("I2C: Failed to connect to slave device |");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
69
applications/luci-app-oled/src/I2C_Library/I2C.h
Normal file
69
applications/luci-app-oled/src/I2C_Library/I2C.h
Normal file
@ -0,0 +1,69 @@
|
||||
/*
|
||||
* MIT License
|
||||
|
||||
Copyright (c) 2017 DeeplyEmbedded
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
* I2C.h
|
||||
*
|
||||
* Created on : Sep 4, 2017
|
||||
* Author : Vinay Divakar
|
||||
* Website : www.deeplyembedded.org
|
||||
*/
|
||||
|
||||
#ifndef I2C_H_
|
||||
#define I2C_H_
|
||||
|
||||
#include<stdint.h>
|
||||
|
||||
/* No. of bytes per transaction */
|
||||
#define I2C_ONE_BYTE 1
|
||||
#define I2C_TWO_BYTES 2
|
||||
#define I2C_THREE_BYTES 3
|
||||
|
||||
/*Definitions specific to i2c-x */
|
||||
#define I2C_DEV0_PATH "/dev/i2c-0"
|
||||
#define I2C_DEV1_PATH "/dev/i2c-1"
|
||||
#define I2C_DEV2_PATH "/dev/i2c-2"
|
||||
|
||||
/*I2C device configuration structure*/
|
||||
typedef struct{
|
||||
char* i2c_dev_path;
|
||||
int fd_i2c;
|
||||
unsigned char i2c_slave_addr;
|
||||
}I2C_DeviceT, *I2C_DevicePtr;
|
||||
|
||||
/* Exposed Generic I2C Functions */
|
||||
extern int Open_device(char *i2c_dev_path, int *fd);
|
||||
extern int Close_device(int fd);
|
||||
extern int Set_slave_addr(int fd, unsigned char slave_addr);
|
||||
extern int i2c_write(int fd, unsigned char data);
|
||||
extern int i2c_read(int fd, unsigned char *read_data);
|
||||
extern int i2c_read_register(int fd, unsigned char read_addr, unsigned char *read_data);
|
||||
extern int i2c_read_registers(int fd, int num, unsigned char starting_addr,
|
||||
unsigned char *buff_Ptr);
|
||||
extern void config_i2c_struct(char *i2c_dev_path, unsigned char slave_addr, I2C_DevicePtr i2c_dev);
|
||||
extern int i2c_multiple_writes(int fd, int num, unsigned char *Ptr_buff);
|
||||
extern int i2c_write_register(int fd, unsigned char reg_addr_or_cntrl, unsigned char val);
|
||||
|
||||
/* Exposed I2C-x Specific Functions */
|
||||
extern int init_i2c_dev(const char* i2c_path, unsigned char slave_address);
|
||||
|
||||
#endif /* I2C_H_ */
|
19
applications/luci-app-oled/src/Makefile
Normal file
19
applications/luci-app-oled/src/Makefile
Normal file
@ -0,0 +1,19 @@
|
||||
CC = gcc
|
||||
LD = gcc
|
||||
|
||||
SOURCES = SSD1306_OLED_Library/SSD1306_OLED.c Example_Code/Main.c Example_Code/example_app.c I2C_Library/I2C.c
|
||||
OBJS := $(SOURCES:.c=.o)
|
||||
CPPFLAGS := -I SSD1306_OLED_Library -I I2C_Library
|
||||
CFLAGS := -g
|
||||
|
||||
oled: $(OBJS)
|
||||
$(CC) $^ -o $@
|
||||
|
||||
clean:
|
||||
rm -rf oled $(OBJS)
|
||||
|
||||
compile: oled
|
||||
|
||||
install: compile
|
||||
mkdir -p $(DESTDIR)/usr/bin
|
||||
cp oled $(DESTDIR)/usr/bin/oled
|
2761
applications/luci-app-oled/src/SSD1306_OLED_Library/SSD1306_OLED.c
Normal file
2761
applications/luci-app-oled/src/SSD1306_OLED_Library/SSD1306_OLED.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,205 @@
|
||||
/*
|
||||
* MIT License
|
||||
|
||||
Copyright (c) 2017 DeeplyEmbedded
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
* SSD1306_OLED.h
|
||||
*
|
||||
* Created on : Sep 21, 2017
|
||||
* Author : Vinay Divakar
|
||||
* Website : www.deeplyembedded.org
|
||||
*/
|
||||
|
||||
#ifndef SSD1306_OLED_H_
|
||||
#define SSD1306_OLED_H_
|
||||
|
||||
/* Lib's */
|
||||
#include <stdbool.h>
|
||||
|
||||
/* Find Min and Max - MACROS */
|
||||
#define MIN(a,b) (((a)<(b))?(a):(b))
|
||||
#define MAX(a,b) (((a)>(b))?(a):(b))
|
||||
|
||||
/* I2C Address of SSD1306 */
|
||||
#define SSD1306_OLED_ADDR 0x3C
|
||||
#define DISPLAY_BUFF_SIZE (SSD1306_LCDWIDTH*SSD1306_LCDHEIGHT/8)
|
||||
|
||||
/* COLOR MACROS */
|
||||
#define WHITE 1
|
||||
#define BLACK 0
|
||||
#define INVERSE 2
|
||||
|
||||
/* Number output format */
|
||||
#define DEC 10
|
||||
#define HEX 16
|
||||
#define OCT 8
|
||||
#define BIN 2
|
||||
#define DEFAULT 0
|
||||
|
||||
/*D/C# bit is '0' indicating that following
|
||||
* byte is a command. '1' is for data
|
||||
*/
|
||||
#define SSD1306_CNTRL_CMD 0x00
|
||||
#define SSD1306_CNTRL_DATA 0x40
|
||||
|
||||
|
||||
/*-----------------------Enable the WxL of the Display ---------------------------*/
|
||||
//#define SSD1306_128_64
|
||||
#define SSD1306_128_32
|
||||
//#define SSD1306_96_16
|
||||
/*--------------------------------------------------------------------------------*/
|
||||
|
||||
/* LCD HxW i.e. 64x128 || WxL i.e. 128x64 */
|
||||
#if defined SSD1306_128_64
|
||||
#define SSD1306_LCDWIDTH 128
|
||||
#define SSD1306_LCDHEIGHT 64
|
||||
#endif
|
||||
#if defined SSD1306_128_32
|
||||
#define SSD1306_LCDWIDTH 128
|
||||
#define SSD1306_LCDHEIGHT 32
|
||||
#endif
|
||||
#if defined SSD1306_96_16
|
||||
#define SSD1306_LCDWIDTH 96
|
||||
#define SSD1306_LCDHEIGHT 16
|
||||
#endif
|
||||
|
||||
/* SSD1306 Commands */
|
||||
#define SSD1306_DISPLAY_OFF 0xAE
|
||||
#define SSD1306_SET_DISP_CLK 0xD5
|
||||
#define SSD1306_SET_MULTIPLEX 0xA8
|
||||
#define SSD1306_SET_DISP_OFFSET 0xD3
|
||||
#define SSD1306_SET_DISP_START_LINE 0x40
|
||||
#define SSD1306_CONFIG_CHARGE_PUMP 0x8D
|
||||
#define SSD1306_SET_MEM_ADDR_MODE 0x20
|
||||
#define SSD1306_SEG_REMAP (0xA0 | 0x01)
|
||||
#define SSD1306_SEG_REMAP1 0xA0
|
||||
#define SSD1306_SET_COMSCANDEC 0xC8
|
||||
#define SSD1306_SET_COMSCANDEC1 0xC0
|
||||
#define SSD1306_SET_COMPINS 0xDA
|
||||
#define SSD1306_SET_CONTRAST 0x81
|
||||
#define SSD1306_SET_PRECHARGE 0xD9
|
||||
#define SSD1306_SET_VCOMDETECT 0xDB
|
||||
#define SSD1306_DISPLAYALLON_RESUME 0xA4
|
||||
#define SSD1306_NORMAL_DISPLAY 0xA6
|
||||
#define SSD1306_DISPLAYON 0xAF
|
||||
#define SSD1306_SET_COL_ADDR 0x21
|
||||
#define SSD1306_PAGEADDR 0x22
|
||||
#define SSD1306_INVERT_DISPLAY 0x01
|
||||
#define SSD1306_NORMALIZE_DISPLAY 0x00
|
||||
|
||||
/* SDD1306 Scroll Commands */
|
||||
#define SSD1306_SET_VERTICAL_SCROLL_AREA 0xA3
|
||||
#define SSD1306_ACTIVATE_SCROLL 0x2F
|
||||
#define SSD1306_DEACTIVATE_SCROLL 0x2E
|
||||
#define SSD1306_RIGHT_HORIZONTAL_SCROLL 0x26
|
||||
#define SSD1306_LEFT_HORIZONTAL_SCROLL 0x27
|
||||
#define SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL 0x29
|
||||
#define SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL 0x2A
|
||||
#define SSD1306_INVERTDISPLAY 0xA7
|
||||
|
||||
/* SSD1306 Configuration Commands */
|
||||
#define SSD1306_DISPCLK_DIV 0x80
|
||||
#if defined SSD1306_128_64
|
||||
#define SSD1306_MULT_64 0x3F
|
||||
#endif
|
||||
#if defined SSD1306_128_32
|
||||
#define SSD1306_MULT_64 0x1F
|
||||
#endif
|
||||
#define SSD1306_MULT_64 0x1F
|
||||
#define SSD1306_DISP_OFFSET_VAL 0x00
|
||||
#define SSD1306_COL_START_ADDR 0x00 //Reset to = 0
|
||||
#define SSD1306_COL_END_ADDR (SSD1306_LCDWIDTH - 1) //Reset to = 127
|
||||
#define SSD1306_PG_START_ADDR 0x00
|
||||
#define SSD1306_PG_END_ADDR 7
|
||||
#define SSD1306_CHARGE_PUMP_EN 0x14
|
||||
#if defined SSD1306_128_64
|
||||
#define SSD1306_CONFIG_COM_PINS 0x12
|
||||
#endif
|
||||
#if defined SSD1306_128_32
|
||||
#define SSD1306_CONFIG_COM_PINS 0x02
|
||||
#endif
|
||||
#define SSD1306_CONTRAST_VAL 0xCF //207
|
||||
#define SSD1306_PRECHARGE_VAL 0xF1
|
||||
#define SSD1306_VCOMH_VAL 0x40
|
||||
#define SSD1306_MULT_DAT (SSD1306_LCDHEIGHT - 1)
|
||||
#define SSD1306_HOR_MM 0x00
|
||||
|
||||
/*SSD1306 Display API's */
|
||||
extern void clearDisplay();
|
||||
extern void display_Init_seq();
|
||||
extern void display_normal();
|
||||
extern void display_rotate();
|
||||
extern void Display();
|
||||
extern void Init_Col_PG_addrs(unsigned char col_start_addr, unsigned char col_end_addr,
|
||||
unsigned char pg_start_addr, unsigned char pg_end_addr);
|
||||
extern void setRotation(unsigned char x);
|
||||
extern void startscrollright(unsigned char start, unsigned char stop);
|
||||
extern void startscrollleft(unsigned char start, unsigned char stop);
|
||||
extern void startscrolldiagright(unsigned char start, unsigned char stop);
|
||||
extern void startscrolldiagleft(unsigned char start, unsigned char stop);
|
||||
extern void stopscroll();
|
||||
extern void setCursor(short x, short y);
|
||||
extern short getCursorX();
|
||||
extern short getCursorY();
|
||||
extern unsigned char getRotation();
|
||||
extern void invertDisplay(unsigned char i);
|
||||
|
||||
/*SSD1306 Graphics Handling API's */
|
||||
extern signed char drawPixel(short x, short y, short color);
|
||||
extern void writeLine(short x0, short y0, short x1, short y1, short color);
|
||||
extern void drawCircleHelper( short x0, short y0, short r, unsigned char cornername, short color);
|
||||
extern void drawLine(short x0, short y0, short x1, short y1, short color);
|
||||
extern void drawRect(short x, short y, short w, short h, short color);
|
||||
extern void fillRect(short x, short y, short w, short h, short color);
|
||||
extern void drawCircle(short x0, short y0, short r, short color);
|
||||
extern void fillCircleHelper(short x0, short y0, short r, unsigned char cornername, short delta, short color);
|
||||
extern void fillCircle(short x0, short y0, short r, short color);
|
||||
extern void drawTriangle(short x0, short y0, short x1, short y1, short x2, short y2, short color);
|
||||
extern void fillTriangle(short x0, short y0, short x1, short y1, short x2, short y2, short color);
|
||||
extern void drawRoundRect(short x, short y, short w, short h, short r, short color);
|
||||
extern void fillRoundRect(short x, short y, short w, short h, short r, short color);
|
||||
extern void drawBitmap(short x, short y, const unsigned char bitmap[], short w, short h, short color);
|
||||
extern short oled_write(unsigned char c);
|
||||
|
||||
/*SSD1306 Text and Character Handling API's */
|
||||
extern void setTextSize(unsigned char s);
|
||||
extern void setTextColor(short c);
|
||||
extern void setTextWrap(bool w);
|
||||
extern void drawChar(short x, short y, unsigned char c, short color, short bg, unsigned char size);
|
||||
extern short print_str(const unsigned char *strPtr);
|
||||
extern short println();
|
||||
extern short print_strln(const unsigned char *strPtr);
|
||||
|
||||
/*SSD1306 Number Handling API's */
|
||||
extern short printNumber(unsigned long n, unsigned char base);
|
||||
extern short printNumber_UL(unsigned long n, int base);
|
||||
extern short printNumber_UL_ln(unsigned long num, int base);
|
||||
extern short printNumber_UI(unsigned int n, int base);
|
||||
extern short printNumber_UI_ln(unsigned int n, int base);
|
||||
extern short printNumber_UC(unsigned char b, int base);
|
||||
extern short printNumber_UC_ln(unsigned char b, int base);
|
||||
extern short printNumber_L(long n, int base);
|
||||
extern short printNumber_L_ln(long num, int base);
|
||||
extern short printNumber_I(int n, int base);
|
||||
extern short printNumber_I_ln(int n, int base);
|
||||
extern short printFloat(double number, unsigned char digits);
|
||||
extern short printFloat_ln(double num, int digits);
|
||||
#endif /* SSD1306_OLED_H_ */
|
@ -0,0 +1,18 @@
|
||||
#ifndef _GFXFONT_H_
|
||||
#define _GFXFONT_H_
|
||||
|
||||
typedef struct { // Data stored PER GLYPH
|
||||
unsigned short bitmapOffset; // Pointer into GFXfont->bitmap
|
||||
unsigned char width, height; // Bitmap dimensions in pixels
|
||||
unsigned char xAdvance; // Distance to advance cursor (x axis)
|
||||
char xOffset, yOffset; // Dist from cursor pos to UL corner
|
||||
} GFXglyphT, *GFXglyphPtr;
|
||||
|
||||
typedef struct { // Data stored for FONT AS A WHOLE:
|
||||
unsigned char *bitmap; // Glyph bitmaps, concatenated
|
||||
GFXglyphPtr glyph; // Glyph array
|
||||
unsigned char first, last; // ASCII extents
|
||||
unsigned char yAdvance; // Newline distance (y axis)
|
||||
} GFXfontT, *GFXfontPtr;
|
||||
|
||||
#endif // _GFXFONT_H_
|
Loading…
Reference in New Issue
Block a user