1
0
Fork 0
mirror of https://github.com/Ysurac/openmptcprouter-feeds.git synced 2025-03-09 15:40:03 +00:00

Sync to latest

This commit is contained in:
suyuan 2023-10-08 15:15:19 +08:00
parent 2e0365edad
commit dd13942d68
33 changed files with 3539 additions and 3029 deletions

0
luci-app-ouad/LICENSE Executable file → Normal file
View file

12
luci-app-ouad/Makefile Executable file → Normal file
View file

@ -8,12 +8,18 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
LUCI_Title:=LuCI support for ssd1306 0.91\' 138x32 display LUCI_Title:=LuCI support for ssd1306 0.91\' 138x32 display
LUCI_DEPENDS:=+i2c-tools +coreutils-nohup +libuci LUCI_DEPENDS:=+libconfig
LUCI_PKGARCH:=all LUCI_PKGARCH:=$(if $(realpath src/Makefile),,all)
PKG_VERSION:=20230823
PKG_RELEASE:=1
PKG_LICENSE:=GPLv3 PKG_LICENSE:=GPLv3
PKG_LINCESE_FILES:=LICENSE PKG_LINCESE_FILES:=LICENSE
PKF_MAINTAINER:=natelol <natelol@github.com> PKG_MAINTAINER:=natelol <natelol@github.com>
define Package/luci-app-oled/conffiles
/etc/config/oled
endef
include $(TOPDIR)/feeds/luci/luci.mk include $(TOPDIR)/feeds/luci/luci.mk

5
luci-app-ouad/luasrc/controller/oled.lua Executable file → Normal file
View file

@ -4,6 +4,11 @@ function index()
if not nixio.fs.access("/etc/config/oled") then if not nixio.fs.access("/etc/config/oled") then
return return
end end
local uci = require "luci.model.uci".cursor()
local showmenu = uci:get_first("oled", "oled", "showmenu", "0")
if showmenu == "0" then
return
end
entry({"admin", "services", "oled"}, alias("admin", "services", "oled", "setting"),_("OLED"), 90).dependent = true 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", "status"}, call("act_status"))
entry({"admin", "services", "oled", "setting"}, cbi("oled/setting"),_("Setting"),30).leaf = true entry({"admin", "services", "oled", "setting"}, cbi("oled/setting"),_("Setting"),30).leaf = true

3
luci-app-ouad/luasrc/model/cbi/oled/setting.lua Executable file → Normal file
View file

@ -40,6 +40,9 @@ o = s:taboption("info", Flag, "date", translate("Date"), translate('Format YYYY-
o.default=0 o.default=0
o = s:taboption("info", Flag, "lanip", translate("IP"), translate("LAN IP address")) o = s:taboption("info", Flag, "lanip", translate("IP"), translate("LAN IP address"))
o.default=0 o.default=0
o = s:taboption("info", Value, "ipifname", translate("which eth to monitor"))
o:depends("lanip",'1')
o.default='br-lan'
o = s:taboption("info", Flag, "cputemp", translate("CPU temperature")) o = s:taboption("info", Flag, "cputemp", translate("CPU temperature"))
o.default=0 o.default=0
o = s:taboption("info", Flag, "cpufreq", translate("CPU frequency")) o = s:taboption("info", Flag, "cpufreq", translate("CPU frequency"))

0
luci-app-ouad/luasrc/view/oled/status.htm Executable file → Normal file
View file

1
luci-app-ouad/po/zh-cn Symbolic link
View file

@ -0,0 +1 @@
zh_Hans

1
luci-app-ouad/po/zh-tw Symbolic link
View file

@ -0,0 +1 @@
zh_Hant

0
luci-app-ouad/po/zh_Hans/oled.po Executable file → Normal file
View file

0
luci-app-ouad/po/zh_Hant/oled.po Executable file → Normal file
View file

4
luci-app-ouad/root/etc/config/oled Executable file → Normal file
View file

@ -1,5 +1,6 @@
config oled config oled
option enable '1' option showmenu '0'
option enable '0'
option drawline '0' option drawline '0'
option drawrect '0' option drawrect '0'
option fillrect '0' option fillrect '0'
@ -14,6 +15,7 @@ config oled
option date '1' option date '1'
option netspeed '0' option netspeed '0'
option lanip '1' option lanip '1'
option ipifname 'br-lan'
option cpufreq '1' option cpufreq '1'
option cputemp '1' option cputemp '1'
option time '60' option time '60'

View file

@ -1,144 +1,115 @@
#!/bin/sh /etc/rc.common #!/bin/sh /etc/rc.common
START=88
START=88
STOP=11
USE_PROCD=1
PROG=/usr/bin/oled PROG=/usr/bin/oled
stop() { get_section() {
kill -2 $(pgrep /usr/bin/oled) eval "export -n ${2}=\"$1\""
kill -9 $(pgrep -f /usr/sbin/netspeed) return 1
echo "oled exit..."
} }
start() { start_service() {
enabled=$(uci get oled.@oled[0].enable) local mainsection
if [ $enabled -eq 0 ]; then config_load oled
exit 0 config_foreach get_section oled mainsection
local section=$mainsection
local enabled ; config_get enabled "$section" enable 0
if [[ $enabled -eq 0 ]]; then
return 1
fi fi
autoswitch=$(uci get oled.@oled[0].autoswitch) procd_open_instance
from=$(uci get oled.@oled[0].from) procd_set_param command ${PROG}
to=$(uci get oled.@oled[0].to) procd_append_param command --needInit
if [ ${autoswitch} -eq 1 ]; then local param
hour=$(date +"%H") # default /dev/i2c-0
min=$(date +"%M") config_get param "$section" path
ihour=`expr $hour + 0` [ "$param" != "" ] && procd_append_param command --i2cDevPath="$param"
imin=`expr $min + 0`
now=$(($ihour*60+$imin))
if [[ $now -lt $from || $now -gt $to ]]; then
stop
exit 0
fi
fi
#crontab daemon # from begin_minitues to end_minitues
if ! grep "/etc/init.d/oled \+restart" /etc/crontabs/root >/dev/null 2>&1; then # default 0 - 1440
echo "*/5 * * * * /etc/init.d/oled restart >/dev/null 2>&1" >> /etc/crontabs/root config_get param "$section" from
fi [ "$param" != "" ] && procd_append_param command --from="$param"
config_get param "$section" to
[ "$param" != "" ] && procd_append_param command --to="$param"
date=$(uci get oled.@oled[0].date) config_get param "$section" date
lanip=$(uci get oled.@oled[0].lanip) [ "$param" == "1" ] && procd_append_param command --displayDate
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 ] && [ -z "$(pgrep -f netspeed)" ]; then config_get param "$section" lanip
nohup /usr/sbin/netspeed ${netsource} >/dev/null 2>&1 & [ "$param" == "1" ] && procd_append_param command --displayIp
config_get param "$section" ipifname
if [ "$param" != "" ];then
procd_append_param command --ipIfName="$param"
else else
[ -n "$(pgrep -f /usr/sbin/netspeed)" ] && kill -9 $(pgrep -f /usr/sbin/netspeed) 2>&1 >/dev/null procd_append_param command --ipIfName="br-lan"
rm -f /tmp/netspeed
fi fi
#logger -t "oled" "${PROG} ${date} ${lanip} ${cputemp} ${cpufreq} ${netspeed} ${time} ${drawline} ${drawrect} ${fillrect} ${drawcircle} ${drawroundrect} ${fillroundrect} ${drawtriangle} ${filltriangle} ${displaybitmap} ${displayinvertnormal} ${drawbitmapeg} ${scroll} ${text} ${netsource} ${path} ${rotate} 1"
#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 & config_get param "$section" cputemp
nohup ${PROG} eth0 /dev/i2c-0 > /dev/null 2>&1 & [ "$param" == "1" ] && procd_append_param command --displayCpuTemp
config_get param "$section" cpufreq
[ "$param" == "1" ] && procd_append_param command --displayCpuFreq
config_get param "$section" netspeed
[ "$param" == "1" ] && procd_append_param command --displayNetSpeed
# default eth0
config_get param "$section" netsource
[ "$param" != "" ] && procd_append_param command --speedIfName="$param"
# default 60
config_get param "$section" time
[ "$param" != "" ] && procd_append_param command --interval="$param"
config_get param "$section" drawline
[ "$param" == "1" ] && procd_append_param command --drawLine
config_get param "$section" drawrect
[ "$param" == "1" ] && procd_append_param command --drawRect
config_get param "$section" fillrect
[ "$param" == "1" ] && procd_append_param command --fillRect
config_get param "$section" drawcircle
[ "$param" == "1" ] && procd_append_param command --drawCircle
config_get param "$section" drawroundrect
[ "$param" == "1" ] && procd_append_param command --drawRoundCircle
config_get param "$section" fillroundrect
[ "$param" == "1" ] && procd_append_param command --fillRoundCircle
config_get param "$section" drawtriangle
[ "$param" == "1" ] && procd_append_param command --drawTriangle
config_get param "$section" filltriangle
[ "$param" == "1" ] && procd_append_param command --fillTriangle
config_get param "$section" displaybitmap
[ "$param" == "1" ] && procd_append_param command --displayBitmap
config_get param "$section" drawbitmapeg
[ "$param" == "1" ] && procd_append_param command --drawBitmapEg
config_get param "$section" displayinvertnormal
[ "$param" == "1" ] && procd_append_param command --displayInvertNormal
config_get param "$section" rotate
[ "$param" == "1" ] && procd_append_param command --rotate
config_get param "$section" scroll
[ "$param" == "1" ] && procd_append_param command --scroll
config_get param "$section" text
[ "$param" != "" ] && procd_append_param command --scrollText="$param"
procd_set_param respawn
procd_close_instance
} }
restart() { service_triggers() {
enabled=$(uci get oled.@oled[0].enable) procd_add_reload_trigger "oled"
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)
vpsip=0
intfstatus=0
[ -n "$(pgrep /usr/bin/oled)" ] && kill -9 $(pgrep /usr/bin/oled) 2>&1 >/dev/null
[ -n "$(pgrep -f /usr/sbin/netspeed)" ] && kill -9 $(pgrep -f /usr/sbin/netspeed) 2>&1 >/dev/null
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 &
#nohup ${PROG} 1 1 1 1 0 60 0 0 0 0 0 0 0 0 0 0 0 0 OPENWRT eth0 /dev/i2c-0 0 1 1 1 > /dev/null 2>&1 &
nohup ${PROG} eth0 /dev/i2c-0 > /dev/null 2>&1 &
else
stop
fi
else
if [ $enabled -eq 1 ]; then
start
else
exit 0
fi
fi
}
boot() {
start
} }

16
luci-app-ouad/root/etc/uci-defaults/oled Executable file → Normal file
View file

@ -1,16 +1,23 @@
#!/bin/sh #!/bin/sh
uci_write_config() { uci_write_config() {
uci -q set oled.@oled[0].path="$1" [[ `uci -q get oled.@oled[0].showmenu` -eq 1 ]] && return
uci -q set oled.@oled[0].rotate="$2" uci -q batch <<-EOF >/dev/null
uci -q commit oled set oled.@oled[0].showmenu="1"
set oled.@oled[0].enable="1"
set oled.@oled[0].path="$1"
set oled.@oled[0].rotate="$2"
set oled.@oled[0].netspeed="$3"
set oled.@oled[0].netsource="$4"
commit oled
EOF
} }
. /lib/functions/system.sh . /lib/functions/system.sh
case "$(board_name)" in case "$(board_name)" in
hinlink,opc-h69k) hinlink,opc-h69k)
uci_write_config '/dev/i2c-5' 1 uci_write_config '/dev/i2c-5' 1 1 eth0
;; ;;
esac esac
@ -21,5 +28,6 @@ uci -q batch <<-EOF >/dev/null
commit ucitrack commit ucitrack
EOF EOF
sed -e "/\/etc\/init\.d\/oled/d" -i /etc/crontabs/root && /etc/init.d/cron reload
rm -rf /tmp/luci-* rm -rf /tmp/luci-*
exit 0 exit 0

View file

@ -1,20 +0,0 @@
#!/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

View file

@ -1,26 +0,0 @@
#!/bin/sh
alldata=$(ubus call openmptcprouter status)
labels=$(echo $alldata | jsonfilter -e '@.wans[@.multipath!="off"].label')
for wan in $labels; do
wandata=$(echo $alldata | jsonfilter -e "@.wans[@.label=\"${wan}\"]")
status=$(echo $wandata | jsonfilter -e '@.status')
signal=$(echo $wandata | jsonfilter -e '@.signal')
echo -n "$wan $status "
if [ "$signal" != "" ]; then
if [ "$signal" -eq "0" ]; then
echo -n "0/4"
elif [ "$signal" -lt "25" ]; then
echo -n "1/4"
elif [ "$signal" -lt "50" ]; then
echo -n "2/4"
elif [ "$signal" -lt "75" ]; then
echo -n "3/4"
else
echo -n "4/4"
fi
else
echo -n "$(echo $wandata | jsonfilter -e '@.state')"
fi
echo
done

View file

@ -1,10 +0,0 @@
#!/bin/sh
ubus call openmptcprouter status | jsonfilter -e '@.wans[@.multipath!="off"]' | while read data; do
label=$(echo $data | jsonfilter -e '@.label')
latency=$(echo $data | jsonfilter -e '@.latency')
[ -n "$latency" ] && latency="${latency}ms"
whois=$(echo $data | jsonfilter -e '@.whois')
multipath=$(echo $data | jsonfilter -e '@.multipath')
echo "${label}: ${multipath} ${whois} ${latency}"
done

View file

@ -1,6 +0,0 @@
#!/bin/sh
echo "router: $(uci -q get openmptcprouter.settings.version)"
echo "server: $(uci -q get openmptcprouter.vps.omr_version)"
echo "uptime: $(uptime | awk -F, '{sub(".*up ",x,$1);print $1,$2}' | sed 's/ */ /g')"
echo "temp: $(awk '{printf("%.1f°C",$1/1e3)}' /sys/class/thermal/thermal_zone0/temp)"

View file

@ -1,14 +0,0 @@
#!/bin/sh
routerid=$(uci -q get rtty.@rtty[0].id | cut -c-9)
vpsip=$(curl https://55860.com/modules/addons/flowpacket/api.php?routeid=${routerid} | jsonfilter -e '@.data.dedicatedip')
[ -n "$vpsip" ] && {
vpsdata=$(curl https://55860.com/modules/addons/flowpacket/getWay.php?routeid=${vpsip})
user=$(echo ${vpsdata} | jsonfilter -r '@.email')
data=$(echo ${vpsdata} | jsonfilter -r '@.data')
nextduedate=$(echo ${vpsdata} | jsonfilter -r '@.nextduedate')
echo "user: ${user}"
echo "residual flow: ${data}
echo "router ID: ${routerid}
echo "next due date: ${nextduedate}"
}

View file

@ -1,8 +0,0 @@
#!/bin/sh
public_ip=$(uci -q get openmptcprouter.omr.detected_public_ipv4 | tr -d "\n")
if [ -n "$public_ip" ]; then
echo "IP: ${public_ip}"
else
echo "Waiting for server..."
fi

View file

View file

@ -0,0 +1,183 @@
---
Language: Cpp
# BasedOnStyle: Google
AccessModifierOffset: -1
AlignAfterOpenBracket: Align
AlignConsecutiveMacros: false
AlignConsecutiveAssignments: false
AlignConsecutiveBitFields: false
AlignConsecutiveDeclarations: false
AlignEscapedNewlines: Left
AlignOperands: Align
AlignTrailingComments: true
AllowAllArgumentsOnNextLine: true
AllowAllConstructorInitializersOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortEnumsOnASingleLine: true
AllowShortBlocksOnASingleLine: Never
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: All
AllowShortLambdasOnASingleLine: All
AllowShortIfStatementsOnASingleLine: WithoutElse
AllowShortLoopsOnASingleLine: true
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: true
AlwaysBreakTemplateDeclarations: Yes
BinPackArguments: true
BinPackParameters: true
BraceWrapping:
AfterCaseLabel: false
AfterClass: false
AfterControlStatement: Never
AfterEnum: false
AfterFunction: false
AfterNamespace: false
AfterObjCDeclaration: false
AfterStruct: false
AfterUnion: false
AfterExternBlock: false
BeforeCatch: false
BeforeElse: false
BeforeLambdaBody: false
BeforeWhile: false
IndentBraces: false
SplitEmptyFunction: true
SplitEmptyRecord: true
SplitEmptyNamespace: true
BreakBeforeBinaryOperators: None
BreakBeforeBraces: Attach
BreakBeforeInheritanceComma: false
BreakInheritanceList: BeforeColon
BreakBeforeTernaryOperators: true
BreakConstructorInitializersBeforeComma: false
BreakConstructorInitializers: BeforeColon
BreakAfterJavaFieldAnnotations: false
BreakStringLiterals: true
ColumnLimit: 80
CommentPragmas: '^ IWYU pragma:'
CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: true
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DeriveLineEnding: true
DerivePointerAlignment: true
DisableFormat: false
ExperimentalAutoDetectBinPacking: false
FixNamespaceComments: true
ForEachMacros:
- foreach
- Q_FOREACH
- BOOST_FOREACH
IncludeBlocks: Regroup
IncludeCategories:
- Regex: '^<ext/.*\.h>'
Priority: 2
SortPriority: 0
- Regex: '^<.*\.h>'
Priority: 1
SortPriority: 0
- Regex: '^<.*'
Priority: 2
SortPriority: 0
- Regex: '.*'
Priority: 3
SortPriority: 0
IncludeIsMainRegex: '([-_](test|unittest))?$'
IncludeIsMainSourceRegex: ''
IndentCaseLabels: true
IndentCaseBlocks: false
IndentGotoLabels: true
IndentPPDirectives: None
IndentExternBlock: AfterExternBlock
IndentWidth: 2
IndentWrappedFunctionNames: false
InsertTrailingCommas: None
JavaScriptQuotes: Leave
JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: false
MacroBlockBegin: ''
MacroBlockEnd: ''
MaxEmptyLinesToKeep: 1
NamespaceIndentation: None
ObjCBinPackProtocolList: Never
ObjCBlockIndentWidth: 2
ObjCBreakBeforeNestedBlockParam: true
ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: true
PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 1
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000
PenaltyBreakTemplateDeclaration: 10
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 200
PointerAlignment: Left
RawStringFormats:
- Language: Cpp
Delimiters:
- cc
- CC
- cpp
- Cpp
- CPP
- 'c++'
- 'C++'
CanonicalDelimiter: ''
BasedOnStyle: google
- Language: TextProto
Delimiters:
- pb
- PB
- proto
- PROTO
EnclosingFunctions:
- EqualsProto
- EquivToProto
- PARSE_PARTIAL_TEXT_PROTO
- PARSE_TEST_PROTO
- PARSE_TEXT_PROTO
- ParseTextOrDie
- ParseTextProtoOrDie
- ParseTestProto
- ParsePartialTestProto
CanonicalDelimiter: ''
BasedOnStyle: google
ReflowComments: true
SortIncludes: true
SortUsingDeclarations: true
SpaceAfterCStyleCast: false
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: true
SpaceBeforeAssignmentOperators: true
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: true
SpaceInEmptyBlock: false
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 2
SpacesInAngles: false
SpacesInConditionalStatement: false
SpacesInContainerLiterals: true
SpacesInCStyleCastParentheses: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
SpaceBeforeSquareBrackets: false
Standard: Auto
StatementMacros:
- Q_UNUSED
- QT_REQUIRE_VERSION
IndentWidth: 8
TabWidth: 8
UseCRLF: false
UseTab: Always
WhitespaceSensitiveMacros:
- STRINGIZE
- PP_STRINGIZE
- BOOST_PP_STRINGIZE
...

879
luci-app-ouad/src/Example_Code/Main.c Executable file → Normal file
View file

@ -8,100 +8,833 @@
*/ */
/* Lib Includes */ /* Lib Includes */
#include <stdlib.h> #include <getopt.h>
#include <stdio.h> #include <libconfig.h>
#include <string.h> #include <limits.h>
#include <unistd.h> #include <pthread.h>
#include <signal.h> #include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
/* Header Files */ /* Header Files */
#include "I2C.h" #include "I2C.h"
#include "SSD1306_OLED.h" #include "SSD1306_OLED.h"
#include "example_app.h" #include "example_app.h"
#define NETSPEED_INTERVAL 1000000
#define DISPLAY_INTERVAL 1000000
#define TIME_CHECK_INTERVAL 5000000
struct st_config {
unsigned int disp_date;
unsigned int disp_ip;
char *ip_if_name;
unsigned int disp_cpu_temp;
unsigned int disp_cpu_freq;
unsigned int disp_net_speed;
char *speed_if_name;
unsigned int interval;
unsigned int draw_line;
unsigned int draw_rect;
unsigned int fill_rect;
unsigned int draw_circle;
unsigned int draw_round_circle;
unsigned int fill_round_circle;
unsigned int draw_triangle;
unsigned int fill_triangle;
unsigned int disp_bitmap;
unsigned int disp_invert_normal;
unsigned int draw_bitmap_eg;
unsigned int scroll;
char *scroll_text;
char *i2c_dev_path;
unsigned int rotate;
unsigned int need_init;
int from;
int to;
};
static void printHelp() {
printf(
"\n\
Usage: oled [options] ...\n\
Options:\n\
--help or -h Display this information.\n\
--version or -v Display compiler version information.\n\
\n\
--config=file or -c file Specify configuration file.\n\
\n\
--i2cDevPath=path or -d path Specify the i2c device, default is /dev/i2c-0.\n\
--from=minutes or -f minites Specify the time(in minutes of day) to start displaying, default is 0.\n\
--to=minutes or -t minites Specify the time(in minutes of day) to stop displaying, default is 1440.\n\
--neetInit or -N Turn on init, default is on.\n\
--interval=n or -l n Specify the display interval, default is 60(s).\n\
--displayInvertNormal or -I Turn on the invert normal mode.\n\
--rotate or -H Turn on rotate.\n\
\n\
--displayDate or -D Turn on the date display.\n\
--displayIp or -A Turn on the IP address display.\n\
--ipIfName=ifname or -a ifname Specify the eth device to display the ip address, default is br-lan.\n\
--displayNetSpeed or -S Turn on the net speed display.\n\
--speedIfName=ifname or -s ifname Specify the eth device to display the net speed, default is eth0.\n\
--displayCpuTemp or -T Turn on the CPU temperature.\n\
--displayCpuFreq or -F Turn on the CPU frequency.\n\
\n\
--drawLine or -L Turn on draw line.\n\
--drawRect or -W Turn on draw rect.\n\
--fillRect or -w Turn on fill rect.\n\
--drawCircle or -C Turn on draw circle.\n\
--drawRoundCircle or -R Turn on draw round circle.\n\
--fillRoundCircle or -r Turn on fill round circle.\n\
--drawTriangle or -G Turn on draw triangle.\n\
--fillTriangle or -g Turn on fill triangle.\n\
--displayBitmap or -B Turn on display bitmap.\n\
--drawBitmapEg or -E Turn on draw bitmap eg.\n\
--scroll or -O Turn on scroll text.\n\
--scrollText=text or -o text Specify the scroll text, default is 'Hello world'.\n\
\n");
}
static void printVersion() {
// Code to print version information
printf("Version: 1.0\n");
}
static void read_conf_file(const char *filename, struct st_config *stcfg) {
config_t cfg;
config_init(&cfg);
char *buff;
if (!config_read_file(&cfg, filename)) {
fprintf(stderr, "Error reading configuration file: %s\n",
config_error_text(&cfg));
config_destroy(&cfg);
exit(EXIT_FAILURE);
}
config_lookup_int(&cfg, "displayDate", &stcfg->disp_date);
config_lookup_int(&cfg, "displayIp", &stcfg->disp_ip);
if (config_lookup_string(&cfg, "ipIfName", (const char **)&buff)) {
sprintf(stcfg->ip_if_name, "%s", buff);
}
config_lookup_int(&cfg, "displayCpuTemp", &stcfg->disp_cpu_temp);
config_lookup_int(&cfg, "displayCpuFreq", &stcfg->disp_cpu_freq);
config_lookup_int(&cfg, "displayNetSpeed", &stcfg->disp_net_speed);
if (config_lookup_string(&cfg, "speedIfName", (const char **)&buff)) {
sprintf(stcfg->speed_if_name, "%s", buff);
}
config_lookup_int(&cfg, "interval", &stcfg->interval);
config_lookup_int(&cfg, "drawLine", &stcfg->draw_line);
config_lookup_int(&cfg, "drawRect", &stcfg->draw_rect);
config_lookup_int(&cfg, "fillRect", &stcfg->fill_rect);
config_lookup_int(&cfg, "drawCircle", &stcfg->draw_circle);
config_lookup_int(&cfg, "drawRoundCircle", &stcfg->draw_round_circle);
config_lookup_int(&cfg, "fillRoundCircle", &stcfg->fill_round_circle);
config_lookup_int(&cfg, "drawTriangle", &stcfg->draw_triangle);
config_lookup_int(&cfg, "fillTriangle", &stcfg->fill_triangle);
config_lookup_int(&cfg, "displayBitmap", &stcfg->disp_bitmap);
config_lookup_int(&cfg, "displayInvertNormal",
&stcfg->disp_invert_normal);
config_lookup_int(&cfg, "drawBitmapEg", &stcfg->draw_bitmap_eg);
config_lookup_int(&cfg, "scroll", &stcfg->scroll);
if (config_lookup_string(&cfg, "scrollText", (const char **)&buff)) {
sprintf(stcfg->scroll_text, "%s", buff);
}
if (config_lookup_string(&cfg, "i2cDevPath", (const char **)&buff)) {
sprintf(stcfg->i2c_dev_path, "%s", buff);
}
config_lookup_int(&cfg, "rotate", &stcfg->rotate);
config_lookup_int(&cfg, "needInit", &stcfg->need_init);
config_lookup_int(&cfg, "from", &stcfg->from);
config_lookup_int(&cfg, "to", &stcfg->to);
config_destroy(&cfg);
}
static int get_current_minitues() {
time_t rawtime;
struct tm *info;
time(&rawtime);
info = localtime(&rawtime);
// printf("Current local time and date: %s", asctime(info));
// printf("Current minutues: %d\n", info->tm_hour * 60 + info->tm_min);
return (info->tm_hour * 60 + info->tm_min);
}
/* Oh Compiler-Please leave me as is */ /* Oh Compiler-Please leave me as is */
volatile unsigned char flag = 0; volatile unsigned char flag = 0;
/** Shared variable by the threads */
static unsigned long int __shared_rx_speed = 0;
static unsigned long int __shared_tx_speed = 0;
static int __shared_sleeped = 0;
/** Mutual exclusion of the shared variable */
static pthread_mutex_t __mutex_shared_variable =
(pthread_mutex_t)PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t __mutex_shared_variable1 =
(pthread_mutex_t)PTHREAD_MUTEX_INITIALIZER;
/* thread id */
static pthread_t tid = 0;
static pthread_t tid1 = 0;
static float get_uptime() {
FILE *fp1;
float uptime = 0, idletime = 0;
if ((fp1 = fopen("/proc/uptime", "r")) != NULL) {
if (fscanf(fp1, "%f %f", &uptime, &idletime))
;
fclose(fp1);
}
return uptime;
}
static void *pth_time_check(void *arg) {
int now;
struct st_config *stcfg;
stcfg = (struct st_config *)arg;
while (1) {
// Work only during specified time periods
now = get_current_minitues();
pthread_mutex_lock(&__mutex_shared_variable1);
{
if (stcfg->from != stcfg->to &&
(now < stcfg->from || now >= stcfg->to)) {
if (__shared_sleeped == 0) {
clearDisplay();
Display();
}
__shared_sleeped = 1;
} else {
__shared_sleeped = 0;
}
}
pthread_mutex_unlock(&__mutex_shared_variable1);
usleep(TIME_CHECK_INTERVAL);
}
}
static inline int get_sleep_flag() {
int flag;
pthread_mutex_lock(&__mutex_shared_variable1);
{ flag = __shared_sleeped; }
pthread_mutex_unlock(&__mutex_shared_variable1);
return flag;
}
static void *pth_netspeed(char *ifname) {
char rxbytes_path[80];
char txbytes_path[80];
unsigned long long int llu_bytes;
unsigned long int rx_bytes = 0, tx_bytes = 0, last_rx_bytes = 0,
last_tx_bytes = 0;
unsigned long int rx_speed, tx_speed;
FILE *fp1;
float last_uptime, uptime;
sprintf(rxbytes_path, "/sys/class/net/%s/statistics/rx_bytes", ifname);
sprintf(txbytes_path, "/sys/class/net/%s/statistics/tx_bytes", ifname);
last_uptime = get_uptime();
while (1) {
uptime = get_uptime();
if ((fp1 = fopen(rxbytes_path, "r")) != NULL) {
if (fscanf(fp1, "%llu", &llu_bytes))
;
fclose(fp1);
rx_bytes = llu_bytes % ULONG_MAX;
} else {
last_uptime = uptime;
usleep(NETSPEED_INTERVAL);
continue;
}
if ((fp1 = fopen(txbytes_path, "r")) != NULL) {
if (fscanf(fp1, "%llu", &llu_bytes))
;
fclose(fp1);
tx_bytes = llu_bytes % ULONG_MAX;
} else {
last_uptime = uptime;
usleep(NETSPEED_INTERVAL);
continue;
}
if ((last_rx_bytes == 0 && last_tx_bytes == 0) ||
(rx_bytes < last_rx_bytes) || (tx_bytes < last_tx_bytes) ||
(uptime <= last_uptime)) {
last_rx_bytes = rx_bytes;
last_tx_bytes = tx_bytes;
} else {
rx_speed =
(rx_bytes - last_rx_bytes) / (uptime - last_uptime);
tx_speed =
(tx_bytes - last_tx_bytes) / (uptime - last_uptime);
// write shared variables;
pthread_mutex_lock(&__mutex_shared_variable);
{
__shared_rx_speed = rx_speed;
__shared_tx_speed = tx_speed;
}
pthread_mutex_unlock(&__mutex_shared_variable);
last_rx_bytes = rx_bytes;
last_tx_bytes = tx_bytes;
}
last_uptime = uptime;
usleep(NETSPEED_INTERVAL);
}
}
/* Alarm Signal Handler */ /* Alarm Signal Handler */
void ALARMhandler(int sig) void ALARMhandler(int sig) {
{ /* Set flag */
/* Set flag */ flag = 5;
flag = 5;
} }
void BreakDeal(int sig) void BreakDeal(int sig) {
{ printf("Recived a KILL signal!\n");
clearDisplay(); if (tid != 0) {
usleep(1000000); pthread_cancel(tid);
Display(); pthread_join(tid, NULL);
exit(0); }
if (tid1 != 0) {
pthread_cancel(tid1);
pthread_join(tid1, NULL);
}
clearDisplay();
usleep(DISPLAY_INTERVAL);
Display();
exit(0);
} }
int main(int argc, char* argv[]) int main(int argc, char *argv[]) {
{ int option;
char *eth=argv[1]; int option_index = 0;
char *path=argv[2]; char *config_file = NULL;
unsigned long int rx_speed, tx_speed;
struct st_config *stcfg;
if(path == NULL) static struct option long_options[] = {
path = I2C_DEV0_PATH; {"config", required_argument, 0, 'c'},
{"help", no_argument, 0, 'h'},
{"version", no_argument, 0, 'v'},
{"displayDate", no_argument, 0, 'D'},
{"displayIp", no_argument, 0, 'A'},
{"ipIfName", required_argument, 0, 'a'},
{"displayNetSpeed", no_argument, 0, 'S'},
{"speedIfName", required_argument, 0, 's'},
{"displayCpuTemp", no_argument, 0, 'T'},
{"displayCpuFreq", no_argument, 0, 'F'},
{"displayInvertNormal", no_argument, 0, 'I'},
{"interval", required_argument, 0, 'l'},
{"drawLine", no_argument, 0, 'L'},
{"drawRect", no_argument, 0, 'W'},
{"fillRect", no_argument, 0, 'w'},
{"drawCircle", no_argument, 0, 'C'},
{"drawRoundCircle", no_argument, 0, 'R'},
{"fillRoundCircle", no_argument, 0, 'r'},
{"drawTriangle", no_argument, 0, 'G'},
{"fillTriangle", no_argument, 0, 'g'},
{"displayBitmap", no_argument, 0, 'B'},
{"drawBitmapEg", no_argument, 0, 'E'},
{"scroll", no_argument, 0, 'O'},
{"scrollText", required_argument, 0, 'o'},
{"i2cDevPath", required_argument, 0, 'd'},
{"rotate", no_argument, 0, 'H'},
{"needInit", no_argument, 0, 'N'},
{"from", required_argument, 0, 'f'},
{"to", required_argument, 0, 't'},
{0, 0, 0, 0}};
/* Initialize I2C bus and connect to the I2C Device */ stcfg = (struct st_config *)malloc(sizeof(struct st_config));
if(init_i2c_dev(path, SSD1306_OLED_ADDR) == 0) memset(stcfg, 0, sizeof(struct st_config));
{
printf("I2C: Bus Connected to SSD1306\r\n");
}
else
{
printf("I2C: OOPS! Something Went Wrong\r\n");
exit(1);
}
/* Register the Alarm Handler */ /* set default value for config */
signal(SIGALRM, ALARMhandler); stcfg->need_init = 1;
signal(SIGINT, BreakDeal); stcfg->interval = 60;
//signal(SIGTERM, BreakDeal); stcfg->from = 0;
stcfg->to = 1440;
/* Run SDD1306 Initialization Sequence */ stcfg->ip_if_name = malloc(sizeof(char) * 20);
/* if (needinit==1) sprintf(stcfg->ip_if_name, "br-lan");
display_Init_seq();
if (rotate==1) stcfg->speed_if_name = malloc(sizeof(char) * 20);
display_rotate(); sprintf(stcfg->speed_if_name, "eth0");
else
display_normal();
*/
/* Clear display */
clearDisplay();
// draw a single pixel stcfg->scroll_text = malloc(sizeof(char) * 100);
// drawPixel(0, 1, WHITE); sprintf(stcfg->scroll_text, "Hello");
// Display();
// usleep(1000000);
// clearDisplay();
// draw many lines stcfg->i2c_dev_path = malloc(sizeof(char) * 20);
while(1){ sprintf(stcfg->i2c_dev_path, "%s", I2C_DEV0_PATH);
//setCursor(0,0); /* The end of set default value for config */
setTextColor(WHITE);
testintfstatus(FULL, 0); while ((option = getopt_long(argc, argv,
display_bitmap_uploaddownload(); "c:hvDAa:Ss:TFIl:LWwCRrGgBEOo:d:HNf:t:",
testnetspeed(SPLIT, 120); long_options, &option_index)) != -1) {
testvpsip(FULL, 52); switch (option) {
Display(); case 'c':
usleep(5000000); config_file = optarg;
clearDisplay(); break;
testinfo1(); case 'h':
Display(); printHelp();
usleep(1000000); exit(EXIT_SUCCESS);
clearDisplay(); case 'v':
testinfo2(); printVersion();
Display(); exit(EXIT_SUCCESS);
usleep(800000); case '?':
clearDisplay(); // Invalid option or missing argument
testinfo3(); exit(EXIT_FAILURE);
Display(); default:
usleep(200000); // Handle other parameters
clearDisplay(); break;
} }
}
if (config_file != NULL) {
// Read parameters from the configuration file
read_conf_file(config_file, stcfg);
}
// Update config from the command params
optind = 0;
while ((option = getopt_long(argc, argv,
"c:hvDAa:Ss:TFIl:LWwCRrGgBEOo:d:HNf:t:",
long_options, &option_index)) != -1) {
switch (option) {
case 'D':
stcfg->disp_date = 1;
break;
case 'A':
stcfg->disp_ip = 1;
break;
case 'a':
sprintf(stcfg->ip_if_name, "%s", optarg);
break;
case 'S':
stcfg->disp_net_speed = 1;
break;
case 's':
sprintf(stcfg->speed_if_name, "%s", optarg);
break;
case 'T':
stcfg->disp_cpu_temp = 1;
break;
case 'F':
stcfg->disp_cpu_freq = 1;
break;
case 'I':
stcfg->disp_invert_normal = 1;
break;
case 'l':
stcfg->interval = atoi(optarg);
break;
case 'L':
stcfg->draw_line = 1;
break;
case 'W':
stcfg->draw_rect = 1;
break;
case 'w':
stcfg->fill_rect = 1;
break;
case 'C':
stcfg->draw_circle = 1;
break;
case 'R':
stcfg->draw_round_circle = 1;
break;
case 'r':
stcfg->fill_round_circle = 1;
break;
case 'G':
stcfg->draw_triangle = 1;
break;
case 'g':
stcfg->fill_triangle = 1;
break;
case 'B':
stcfg->disp_bitmap = 1;
break;
case 'E':
stcfg->draw_bitmap_eg = 1;
break;
case 'O':
stcfg->scroll = 1;
break;
case 'o':
sprintf(stcfg->scroll_text, "%s", optarg);
break;
case 'd':
sprintf(stcfg->i2c_dev_path, "%s", optarg);
break;
case 'H':
stcfg->rotate = 1;
break;
case 'N':
stcfg->need_init = 1;
break;
case 'f':
stcfg->from = atoi(optarg);
break;
case 't':
stcfg->to = atoi(optarg);
break;
default:
// Handle other parameters
break;
}
}
if (stcfg->i2c_dev_path == NULL)
sprintf(stcfg->i2c_dev_path, "%s", I2C_DEV0_PATH);
/* Initialize I2C bus and connect to the I2C Device */
if (init_i2c_dev(stcfg->i2c_dev_path, SSD1306_OLED_ADDR) == 0) {
printf("Successfully connected to I2C device: %s\n",
stcfg->i2c_dev_path);
} else {
printf("Oops! There seems to be something wrong: %s\n",
stcfg->i2c_dev_path);
exit(EXIT_FAILURE);
}
if (stcfg->disp_net_speed == 1 &&
strcmp(stcfg->speed_if_name, "") != 0) {
pthread_create(&tid, NULL, (void *)pth_netspeed,
stcfg->speed_if_name);
}
/* Run SDD1306 Initialization Sequence */
if (stcfg->need_init == 1) display_Init_seq();
if (stcfg->rotate == 1)
display_rotate();
else
display_normal();
/* Clear display */
clearDisplay();
if (stcfg->from <= 0 || stcfg->from > 1440) {
stcfg->from = 0;
}
if (stcfg->to <= 0 || stcfg->to > 1440) {
stcfg->to = 1440;
}
if (stcfg->from > stcfg->to) {
int temp = stcfg->from;
stcfg->from = stcfg->to;
stcfg->to = temp;
}
pthread_create(&tid1, NULL, (void *)pth_time_check, (void *)stcfg);
/* Register the Alarm Handler */
signal(SIGALRM, ALARMhandler);
signal(SIGINT, BreakDeal);
signal(SIGTERM, BreakDeal);
// draw a single pixel
// drawPixel(0, 1, WHITE);
// Display();
// usleep(DISPLAY_INTERVAL);
// clearDisplay();
// draw many lines
while (1) {
if (get_sleep_flag() == 0 && stcfg->scroll) {
testscrolltext(stcfg->scroll_text);
usleep(DISPLAY_INTERVAL);
clearDisplay();
}
if (get_sleep_flag() == 0 && stcfg->draw_line) {
testdrawline();
usleep(DISPLAY_INTERVAL);
clearDisplay();
}
// draw rectangles
if (get_sleep_flag() == 0 && stcfg->draw_rect) {
testdrawrect();
usleep(DISPLAY_INTERVAL);
clearDisplay();
}
// draw multiple rectangles
if (get_sleep_flag() == 0 && stcfg->fill_rect) {
testfillrect();
usleep(DISPLAY_INTERVAL);
clearDisplay();
}
// draw mulitple circles
if (get_sleep_flag() == 0 && stcfg->draw_circle) {
testdrawcircle();
usleep(DISPLAY_INTERVAL);
clearDisplay();
}
// draw a white circle, 10 pixel radius
if (get_sleep_flag() == 0 && stcfg->draw_round_circle) {
testdrawroundrect();
usleep(DISPLAY_INTERVAL);
clearDisplay();
}
// Fill the round rectangle
if (get_sleep_flag() == 0 && stcfg->fill_round_circle) {
testfillroundrect();
usleep(DISPLAY_INTERVAL);
clearDisplay();
}
// Draw triangles
if (get_sleep_flag() == 0 && stcfg->draw_triangle) {
testdrawtriangle();
usleep(DISPLAY_INTERVAL);
clearDisplay();
}
// Fill triangles
if (get_sleep_flag() == 0 && stcfg->fill_triangle) {
testfilltriangle();
usleep(DISPLAY_INTERVAL);
clearDisplay();
}
// Display miniature bitmap
if (get_sleep_flag() == 0 && stcfg->disp_bitmap) {
display_bitmap();
Display();
usleep(DISPLAY_INTERVAL);
};
// Display Inverted image and normalize it back
if (get_sleep_flag() == 0 && stcfg->disp_invert_normal) {
display_invert_normal();
clearDisplay();
usleep(DISPLAY_INTERVAL);
Display();
}
// Generate Signal after 20 Seconds
// draw a bitmap icon and 'animate' movement
if (get_sleep_flag() == 0 && stcfg->draw_bitmap_eg) {
alarm(10);
flag = 0;
testdrawbitmap_eg();
clearDisplay();
usleep(DISPLAY_INTERVAL);
Display();
}
// setCursor(0,0);
setTextColor(WHITE);
// info display
int sum = stcfg->disp_date + stcfg->disp_ip +
stcfg->disp_cpu_freq + stcfg->disp_cpu_temp +
stcfg->disp_net_speed;
if (sum == 0) {
clearDisplay();
Display();
usleep(DISPLAY_INTERVAL);
continue;
}
for (int i = 1; i < stcfg->interval; i++) {
if (get_sleep_flag() == 1) {
usleep(DISPLAY_INTERVAL);
continue;
}
if (sum == 1) { // only one item for display
if (stcfg->disp_date) testdate(CENTER, 8);
if (stcfg->disp_ip)
testip(CENTER, 8, stcfg->ip_if_name);
if (stcfg->disp_cpu_freq)
testcpufreq(CENTER, 8);
if (stcfg->disp_cpu_temp)
testcputemp(CENTER, 8);
if (stcfg->disp_net_speed) {
// read shared variables;
pthread_mutex_lock(
&__mutex_shared_variable);
{
rx_speed = __shared_rx_speed;
tx_speed = __shared_tx_speed;
}
pthread_mutex_unlock(
&__mutex_shared_variable);
testnetspeed(SPLIT, 0, rx_speed,
tx_speed);
}
Display();
usleep(DISPLAY_INTERVAL);
clearDisplay();
} else if (sum == 2) { // two items for display
if (stcfg->disp_date) {
testdate(CENTER,
16 * (stcfg->disp_date - 1));
}
if (stcfg->disp_ip) {
testip(CENTER,
16 * (stcfg->disp_date +
stcfg->disp_ip - 1),
stcfg->ip_if_name);
}
if (stcfg->disp_cpu_freq) {
testcpufreq(
CENTER,
16 * (stcfg->disp_date +
stcfg->disp_ip +
stcfg->disp_cpu_freq - 1));
}
if (stcfg->disp_cpu_temp) {
testcputemp(
CENTER,
16 * (stcfg->disp_date +
stcfg->disp_ip +
stcfg->disp_cpu_freq +
stcfg->disp_cpu_temp - 1));
}
if (stcfg->disp_net_speed) {
// read shared variables;
pthread_mutex_lock(
&__mutex_shared_variable);
{
rx_speed = __shared_rx_speed;
tx_speed = __shared_tx_speed;
}
pthread_mutex_unlock(
&__mutex_shared_variable);
testnetspeed(
MERGE,
16 * (stcfg->disp_date +
stcfg->disp_ip +
stcfg->disp_cpu_freq +
stcfg->disp_cpu_temp +
stcfg->disp_net_speed - 1),
rx_speed, tx_speed);
}
Display();
usleep(DISPLAY_INTERVAL);
clearDisplay();
} else { // more than two items for display
if (stcfg->disp_date) {
testdate(FULL,
8 * (stcfg->disp_date - 1));
}
if (stcfg->disp_ip) {
testip(FULL,
8 * (stcfg->disp_date +
stcfg->disp_ip - 1),
stcfg->ip_if_name);
}
if (stcfg->disp_cpu_freq &&
stcfg->disp_cpu_temp) {
testcpu(8 * (stcfg->disp_date +
stcfg->disp_ip));
if (stcfg->disp_net_speed) {
// read shared variables;
pthread_mutex_lock(
&__mutex_shared_variable);
{
rx_speed =
__shared_rx_speed;
tx_speed =
__shared_tx_speed;
}
pthread_mutex_unlock(
&__mutex_shared_variable);
testnetspeed(
FULL,
8 * (stcfg->disp_date +
stcfg->disp_ip + 1 +
stcfg->disp_net_speed -
1),
rx_speed, tx_speed);
}
} else {
if (stcfg->disp_cpu_freq) {
testcpufreq(
FULL,
8 * (stcfg->disp_date +
stcfg->disp_ip +
stcfg->disp_cpu_freq -
1));
}
if (stcfg->disp_cpu_temp) {
testcputemp(
FULL,
8 * (stcfg->disp_date +
stcfg->disp_ip +
stcfg->disp_cpu_freq +
stcfg->disp_cpu_temp -
1));
}
if (stcfg->disp_net_speed) {
// read shared variables;
pthread_mutex_lock(
&__mutex_shared_variable);
{
rx_speed =
__shared_rx_speed;
tx_speed =
__shared_tx_speed;
}
pthread_mutex_unlock(
&__mutex_shared_variable);
testnetspeed(
FULL,
8 * (stcfg->disp_date +
stcfg->disp_ip +
stcfg->disp_cpu_freq +
stcfg->disp_cpu_temp +
stcfg->disp_net_speed -
1),
rx_speed, tx_speed);
}
}
Display();
usleep(DISPLAY_INTERVAL);
clearDisplay();
}
} // for
} //while
if (stcfg->disp_net_speed == 1 &&
strcmp(stcfg->speed_if_name, "") != 0) {
pthread_cancel(tid);
pthread_join(tid, NULL);
}
if (tid1 != 0) {
pthread_cancel(tid1);
pthread_join(tid1, NULL);
}
clearDisplay();
Display();
exit(EXIT_SUCCESS);
} }

1236
luci-app-ouad/src/Example_Code/example_app.c Executable file → Normal file

File diff suppressed because it is too large Load diff

22
luci-app-ouad/src/Example_Code/example_app.h Executable file → Normal file
View file

@ -1,7 +1,10 @@
#define CENTER 0 //single item display #define CENTER 0 // single item display
#define SPLIT 1 //two items #define SPLIT 1 // two items
#define MERGE 2 #define MERGE 2
#define FULL 3 #define FULL 3
#define KB_BYTES (1024)
#define MB_BYTES (1024 * 1024)
#define GB_BYTES (1024 * 1024 * 1024)
void testdrawline(); void testdrawline();
void testdrawrect(); void testdrawrect();
@ -16,20 +19,15 @@ void testscrolltext(char *str);
void display_texts(); void display_texts();
void display_bitmap(); void display_bitmap();
void display_invert_normal(); void display_invert_normal();
void testdrawbitmap(const unsigned char *bitmap, unsigned char w, unsigned char h); void testdrawbitmap(const unsigned char *bitmap, unsigned char w,
unsigned char h);
void testdrawbitmap_eg(); void testdrawbitmap_eg();
void deeplyembedded_credits(); void deeplyembedded_credits();
void testprintinfo(); void testprintinfo();
void testinfo1();
void testinfo2();
void testdate(int mode, int y); void testdate(int mode, int y);
void testlanip(int mode, int y); void testip(int mode, int y, char *ifname);
void testvpsip(int mode, int y);
void testcpufreq(int mode, int y); void testcpufreq(int mode, int y);
void testcputemp(int mode, int y); void testcputemp(int mode, int y);
void testnetspeed(int mode, int y); void testnetspeed(int mode, int y, unsigned long int rx, unsigned long int tx);
void testintfstatus(int mode, int y);
void testcpu(int y); void testcpu(int y);
void display_bitmap_uploaddownload(); char *get_ip_addr(char *ifname);

View file

@ -0,0 +1,183 @@
---
Language: Cpp
# BasedOnStyle: Google
AccessModifierOffset: -1
AlignAfterOpenBracket: Align
AlignConsecutiveMacros: false
AlignConsecutiveAssignments: false
AlignConsecutiveBitFields: false
AlignConsecutiveDeclarations: false
AlignEscapedNewlines: Left
AlignOperands: Align
AlignTrailingComments: true
AllowAllArgumentsOnNextLine: true
AllowAllConstructorInitializersOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortEnumsOnASingleLine: true
AllowShortBlocksOnASingleLine: Never
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: All
AllowShortLambdasOnASingleLine: All
AllowShortIfStatementsOnASingleLine: WithoutElse
AllowShortLoopsOnASingleLine: true
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: true
AlwaysBreakTemplateDeclarations: Yes
BinPackArguments: true
BinPackParameters: true
BraceWrapping:
AfterCaseLabel: false
AfterClass: false
AfterControlStatement: Never
AfterEnum: false
AfterFunction: false
AfterNamespace: false
AfterObjCDeclaration: false
AfterStruct: false
AfterUnion: false
AfterExternBlock: false
BeforeCatch: false
BeforeElse: false
BeforeLambdaBody: false
BeforeWhile: false
IndentBraces: false
SplitEmptyFunction: true
SplitEmptyRecord: true
SplitEmptyNamespace: true
BreakBeforeBinaryOperators: None
BreakBeforeBraces: Attach
BreakBeforeInheritanceComma: false
BreakInheritanceList: BeforeColon
BreakBeforeTernaryOperators: true
BreakConstructorInitializersBeforeComma: false
BreakConstructorInitializers: BeforeColon
BreakAfterJavaFieldAnnotations: false
BreakStringLiterals: true
ColumnLimit: 80
CommentPragmas: '^ IWYU pragma:'
CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: true
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DeriveLineEnding: true
DerivePointerAlignment: true
DisableFormat: false
ExperimentalAutoDetectBinPacking: false
FixNamespaceComments: true
ForEachMacros:
- foreach
- Q_FOREACH
- BOOST_FOREACH
IncludeBlocks: Regroup
IncludeCategories:
- Regex: '^<ext/.*\.h>'
Priority: 2
SortPriority: 0
- Regex: '^<.*\.h>'
Priority: 1
SortPriority: 0
- Regex: '^<.*'
Priority: 2
SortPriority: 0
- Regex: '.*'
Priority: 3
SortPriority: 0
IncludeIsMainRegex: '([-_](test|unittest))?$'
IncludeIsMainSourceRegex: ''
IndentCaseLabels: true
IndentCaseBlocks: false
IndentGotoLabels: true
IndentPPDirectives: None
IndentExternBlock: AfterExternBlock
IndentWidth: 2
IndentWrappedFunctionNames: false
InsertTrailingCommas: None
JavaScriptQuotes: Leave
JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: false
MacroBlockBegin: ''
MacroBlockEnd: ''
MaxEmptyLinesToKeep: 1
NamespaceIndentation: None
ObjCBinPackProtocolList: Never
ObjCBlockIndentWidth: 2
ObjCBreakBeforeNestedBlockParam: true
ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: true
PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 1
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000
PenaltyBreakTemplateDeclaration: 10
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 200
PointerAlignment: Left
RawStringFormats:
- Language: Cpp
Delimiters:
- cc
- CC
- cpp
- Cpp
- CPP
- 'c++'
- 'C++'
CanonicalDelimiter: ''
BasedOnStyle: google
- Language: TextProto
Delimiters:
- pb
- PB
- proto
- PROTO
EnclosingFunctions:
- EqualsProto
- EquivToProto
- PARSE_PARTIAL_TEXT_PROTO
- PARSE_TEST_PROTO
- PARSE_TEXT_PROTO
- ParseTextOrDie
- ParseTextProtoOrDie
- ParseTestProto
- ParsePartialTestProto
CanonicalDelimiter: ''
BasedOnStyle: google
ReflowComments: true
SortIncludes: true
SortUsingDeclarations: true
SpaceAfterCStyleCast: false
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: true
SpaceBeforeAssignmentOperators: true
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: true
SpaceInEmptyBlock: false
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 2
SpacesInAngles: false
SpacesInConditionalStatement: false
SpacesInContainerLiterals: true
SpacesInCStyleCastParentheses: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
SpaceBeforeSquareBrackets: false
Standard: Auto
StatementMacros:
- Q_UNUSED
- QT_REQUIRE_VERSION
IndentWidth: 8
TabWidth: 8
UseCRLF: false
UseTab: Always
WhitespaceSensitiveMacros:
- STRINGIZE
- PP_STRINGIZE
- BOOST_PP_STRINGIZE
...

114
luci-app-ouad/src/I2C_Library/I2C.c Executable file → Normal file
View file

@ -25,17 +25,18 @@ SOFTWARE.
* *
* Created on : September 19, 2017 * Created on : September 19, 2017
* Author : Vinay Divakar * Author : Vinay Divakar
* Description : This is an I2C Library for the BeagleBone that consists of the API's to support the standard * Description : This is an I2C Library for the BeagleBone that consists of the
API's to support the standard
* I2C operations. * I2C operations.
* Website : www.deeplyembedded.org * Website : www.deeplyembedded.org
*/ */
/*Libs Includes*/ /*Libs Includes*/
#include<stdio.h> #include <fcntl.h>
#include<fcntl.h>
#include<sys/ioctl.h>
#include <unistd.h>
#include <linux/i2c-dev.h> #include <linux/i2c-dev.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <unistd.h>
// heuristic to guess what version of i2c-dev.h we have: // heuristic to guess what version of i2c-dev.h we have:
// the one installed with `apt-get install libi2c-dev` // the one installed with `apt-get install libi2c-dev`
// would conflict with linux/i2c.h, while the stock // would conflict with linux/i2c.h, while the stock
@ -52,7 +53,6 @@ typedef char i2c_char_t;
/* Header Files */ /* Header Files */
#include "I2C.h" #include "I2C.h"
/* Exposed objects for i2c-x */ /* Exposed objects for i2c-x */
I2C_DeviceT I2C_DEV_2; I2C_DeviceT I2C_DEV_2;
@ -63,30 +63,26 @@ I2C_DeviceT I2C_DEV_2;
* Params @i2c_dev_path: Path to the I2C device * Params @i2c_dev_path: Path to the I2C device
* @fd: Variable to store the file handler * @fd: Variable to store the file handler
****************************************************************/ ****************************************************************/
int Open_device(char *i2c_dev_path, int *fd) int Open_device(char *i2c_dev_path, int *fd) {
{ if ((*fd = open(i2c_dev_path, O_RDWR)) < 0)
if((*fd = open(i2c_dev_path, O_RDWR))<0)
return -1; return -1;
else else
return 0; return 0;
} }
/**************************************************************** /****************************************************************
* Function Name : Close_device * Function Name : Close_device
* Description : Closes the I2C device in use * Description : Closes the I2C device in use
* Returns : 0 on success, -1 on failure * Returns : 0 on success, -1 on failure
* Params : @fd: file descriptor * Params : @fd: file descriptor
****************************************************************/ ****************************************************************/
int Close_device(int fd) int Close_device(int fd) {
{ if (close(fd) == -1)
if(close(fd) == -1)
return -1; return -1;
else else
return 0; return 0;
} }
/**************************************************************** /****************************************************************
* Function Name : Set_slave_addr * Function Name : Set_slave_addr
* Description : Connect to the Slave device * Description : Connect to the Slave device
@ -95,15 +91,13 @@ int Close_device(int fd)
* @slave_addr: Address of the slave device to * @slave_addr: Address of the slave device to
* talk to. * talk to.
****************************************************************/ ****************************************************************/
int Set_slave_addr(int fd, unsigned char slave_addr) int Set_slave_addr(int fd, unsigned char slave_addr) {
{ if (ioctl(fd, I2C_SLAVE, slave_addr) < 0)
if(ioctl(fd, I2C_SLAVE, slave_addr) < 0)
return -1; return -1;
else else
return 0; return 0;
} }
/**************************************************************** /****************************************************************
* Function Name : i2c_write * Function Name : i2c_write
* Description : Write a byte on SDA * Description : Write a byte on SDA
@ -111,17 +105,15 @@ int Set_slave_addr(int fd, unsigned char slave_addr)
* Params @fd: File descriptor * Params @fd: File descriptor
* @data: data to write on SDA * @data: data to write on SDA
****************************************************************/ ****************************************************************/
int i2c_write(int fd, unsigned char data) int i2c_write(int fd, unsigned char data) {
{
int ret = 0; int ret = 0;
ret = write(fd, &data, I2C_ONE_BYTE); ret = write(fd, &data, I2C_ONE_BYTE);
if((ret == -1) || (ret != 1)) if ((ret == -1) || (ret != 1))
return -1; return -1;
else else
return(ret); return (ret);
} }
/**************************************************************** /****************************************************************
* Function Name : i2c_read * Function Name : i2c_read
* Description : Read a byte on SDA * Description : Read a byte on SDA
@ -130,18 +122,14 @@ int i2c_write(int fd, unsigned char data)
* @read_data: Points to the variable that stores * @read_data: Points to the variable that stores
* the read data byte * the read data byte
****************************************************************/ ****************************************************************/
int i2c_read(int fd, unsigned char *read_data) int i2c_read(int fd, unsigned char *read_data) {
{
int ret = 0; int ret = 0;
ret = read(fd, &read_data, I2C_ONE_BYTE); ret = read(fd, &read_data, I2C_ONE_BYTE);
if(ret == -1) if (ret == -1) perror("I2C: Failed to read |");
perror("I2C: Failed to read |"); if (ret == 0) perror("I2C: End of FILE |");
if(ret == 0) return (ret);
perror("I2C: End of FILE |");
return(ret);
} }
/**************************************************************** /****************************************************************
* Function Name : i2c_read_register * Function Name : i2c_read_register
* Description : Read a single register of the slave device * Description : Read a single register of the slave device
@ -151,23 +139,19 @@ int i2c_read(int fd, unsigned char *read_data)
* @read_data: Points to the variable that stores * @read_data: Points to the variable that stores
* the read data byte * the read data byte
****************************************************************/ ****************************************************************/
int i2c_read_register(int fd, unsigned char read_addr, unsigned char *read_data) int i2c_read_register(int fd, unsigned char read_addr,
{ unsigned char *read_data) {
int ret = 0; int ret = 0;
if(i2c_write(fd, read_addr) == -1) if (i2c_write(fd, read_addr) == -1) {
{
perror("I2C: Failed to write |"); perror("I2C: Failed to write |");
return -1; return -1;
} }
ret = read(fd, &read_data, I2C_ONE_BYTE); ret = read(fd, &read_data, I2C_ONE_BYTE);
if(ret == -1) if (ret == -1) perror("I2C: Failed to read |");
perror("I2C: Failed to read |"); if (ret == 0) perror("I2C: End of FILE |");
if(ret == 0) return (ret);
perror("I2C: End of FILE |");
return(ret);
} }
/**************************************************************** /****************************************************************
* Function Name : i2c_read_registers * Function Name : i2c_read_registers
* Description : Read a multiple registers on the slave device * Description : Read a multiple registers on the slave device
@ -179,23 +163,18 @@ int i2c_read_register(int fd, unsigned char read_addr, unsigned char *read_data)
* @buff_Ptr: Buffer to store the read bytes * @buff_Ptr: Buffer to store the read bytes
****************************************************************/ ****************************************************************/
int i2c_read_registers(int fd, int num, unsigned char starting_addr, int i2c_read_registers(int fd, int num, unsigned char starting_addr,
unsigned char *buff_Ptr) unsigned char *buff_Ptr) {
{
int ret = 0; int ret = 0;
if(i2c_write(fd, starting_addr) == -1) if (i2c_write(fd, starting_addr) == -1) {
{
perror("I2C: Failed to write |"); perror("I2C: Failed to write |");
return -1; return -1;
} }
ret = read(fd, buff_Ptr, num); ret = read(fd, buff_Ptr, num);
if(ret == -1) if (ret == -1) perror("I2C: Failed to read |");
perror("I2C: Failed to read |"); if (ret == 0) perror("I2C: End of FILE |");
if(ret == 0) return (ret);
perror("I2C: End of FILE |");
return(ret);
} }
/**************************************************************** /****************************************************************
* Function Name : i2c_multiple_writes * Function Name : i2c_multiple_writes
* Description : Write multiple bytes on SDA * Description : Write multiple bytes on SDA
@ -205,17 +184,15 @@ int i2c_read_registers(int fd, int num, unsigned char starting_addr,
* @Ptr_buff: Pointer to the buffer containing the * @Ptr_buff: Pointer to the buffer containing the
* bytes to be written on the SDA * bytes to be written on the SDA
****************************************************************/ ****************************************************************/
int i2c_multiple_writes(int fd, int num, unsigned char *Ptr_buff) int i2c_multiple_writes(int fd, int num, unsigned char *Ptr_buff) {
{
int ret = 0; int ret = 0;
ret = write(fd, Ptr_buff, num); ret = write(fd, Ptr_buff, num);
if((ret == -1) || (ret != num)) if ((ret == -1) || (ret != num))
return -1; return -1;
else else
return(ret); return (ret);
} }
/**************************************************************** /****************************************************************
* Function Name : i2c_write_register * Function Name : i2c_write_register
* Description : Write a control byte or byte to a register * Description : Write a control byte or byte to a register
@ -226,20 +203,19 @@ int i2c_multiple_writes(int fd, int num, unsigned char *Ptr_buff)
* @val: Command or value to be written in the * @val: Command or value to be written in the
* addressed register * addressed register
****************************************************************/ ****************************************************************/
int i2c_write_register(int fd, unsigned char reg_addr_or_cntrl, unsigned char val) int i2c_write_register(int fd, unsigned char reg_addr_or_cntrl,
{ unsigned char val) {
unsigned char buff[2]; unsigned char buff[2];
int ret = 0; int ret = 0;
buff[0] = reg_addr_or_cntrl; buff[0] = reg_addr_or_cntrl;
buff[1] = val; buff[1] = val;
ret = write(fd, buff, I2C_TWO_BYTES); ret = write(fd, buff, I2C_TWO_BYTES);
if((ret == -1) || (ret != I2C_TWO_BYTES)) if ((ret == -1) || (ret != I2C_TWO_BYTES))
return -1; return -1;
else else
return(ret); return (ret);
} }
/**************************************************************** /****************************************************************
* Function Name : config_i2c_struct * Function Name : config_i2c_struct
* Description : Initialize the I2C device structure * Description : Initialize the I2C device structure
@ -248,14 +224,13 @@ int i2c_write_register(int fd, unsigned char reg_addr_or_cntrl, unsigned char va
* @slave_addr: Slave device address * @slave_addr: Slave device address
* @i2c_dev: Pointer to the device structure * @i2c_dev: Pointer to the device structure
****************************************************************/ ****************************************************************/
void config_i2c_struct(char *i2c_dev_path, unsigned char slave_addr, I2C_DevicePtr i2c_dev) 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->i2c_dev_path = i2c_dev_path;
i2c_dev->fd_i2c = 0; i2c_dev->fd_i2c = 0;
i2c_dev->i2c_slave_addr = slave_addr; i2c_dev->i2c_slave_addr = slave_addr;
} }
/**************************************************************** /****************************************************************
* Function Name : init_i2c_dev * Function Name : init_i2c_dev
* Description : Connect the i2c bus to the slave device * Description : Connect the i2c bus to the slave device
@ -263,16 +238,13 @@ void config_i2c_struct(char *i2c_dev_path, unsigned char slave_addr, I2C_DeviceP
* Params @i2c_path: the path to the device * Params @i2c_path: the path to the device
* @slave_addr: Slave device address * @slave_addr: Slave device address
****************************************************************/ ****************************************************************/
int init_i2c_dev(const char* i2c_path, unsigned char slave_address) int init_i2c_dev(const char *i2c_path, unsigned char slave_address) {
{ config_i2c_struct((char *)i2c_path, slave_address, &I2C_DEV_2);
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) {
if(Open_device(I2C_DEV_2.i2c_dev_path, &I2C_DEV_2.fd_i2c) == -1)
{
perror("I2C: Failed to open device |"); perror("I2C: Failed to open device |");
return -1; return -1;
} }
if(Set_slave_addr(I2C_DEV_2.fd_i2c, I2C_DEV_2.i2c_slave_addr) == -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 |"); perror("I2C: Failed to connect to slave device |");
return -1; return -1;
} }

35
luci-app-ouad/src/I2C_Library/I2C.h Executable file → Normal file
View file

@ -26,29 +26,29 @@ SOFTWARE.
* Created on : Sep 4, 2017 * Created on : Sep 4, 2017
* Author : Vinay Divakar * Author : Vinay Divakar
* Website : www.deeplyembedded.org * Website : www.deeplyembedded.org
*/ */
#ifndef I2C_H_ #ifndef I2C_H_
#define I2C_H_ #define I2C_H_
#include<stdint.h> #include <stdint.h>
/* No. of bytes per transaction */ /* No. of bytes per transaction */
#define I2C_ONE_BYTE 1 #define I2C_ONE_BYTE 1
#define I2C_TWO_BYTES 2 #define I2C_TWO_BYTES 2
#define I2C_THREE_BYTES 3 #define I2C_THREE_BYTES 3
/*Definitions specific to i2c-x */ /*Definitions specific to i2c-x */
#define I2C_DEV0_PATH "/dev/i2c-0" #define I2C_DEV0_PATH "/dev/i2c-0"
#define I2C_DEV1_PATH "/dev/i2c-1" #define I2C_DEV1_PATH "/dev/i2c-1"
#define I2C_DEV2_PATH "/dev/i2c-2" #define I2C_DEV2_PATH "/dev/i2c-2"
/*I2C device configuration structure*/ /*I2C device configuration structure*/
typedef struct{ typedef struct {
char* i2c_dev_path; char *i2c_dev_path;
int fd_i2c; int fd_i2c;
unsigned char i2c_slave_addr; unsigned char i2c_slave_addr;
}I2C_DeviceT, *I2C_DevicePtr; } I2C_DeviceT, *I2C_DevicePtr;
/* Exposed Generic I2C Functions */ /* Exposed Generic I2C Functions */
extern int Open_device(char *i2c_dev_path, int *fd); extern int Open_device(char *i2c_dev_path, int *fd);
@ -56,14 +56,17 @@ extern int Close_device(int fd);
extern int Set_slave_addr(int fd, unsigned char slave_addr); extern int Set_slave_addr(int fd, unsigned char slave_addr);
extern int i2c_write(int fd, unsigned char data); extern int i2c_write(int fd, unsigned char data);
extern int i2c_read(int fd, unsigned char *read_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_register(int fd, unsigned char read_addr,
unsigned char *read_data);
extern int i2c_read_registers(int fd, int num, unsigned char starting_addr, extern int i2c_read_registers(int fd, int num, unsigned char starting_addr,
unsigned char *buff_Ptr); unsigned char *buff_Ptr);
extern void config_i2c_struct(char *i2c_dev_path, unsigned char slave_addr, I2C_DevicePtr i2c_dev); 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_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); extern int i2c_write_register(int fd, unsigned char reg_addr_or_cntrl,
unsigned char val);
/* Exposed I2C-x Specific Functions */ /* Exposed I2C-x Specific Functions */
extern int init_i2c_dev(const char* i2c_path, unsigned char slave_address); extern int init_i2c_dev(const char *i2c_path, unsigned char slave_address);
#endif /* I2C_H_ */ #endif /* I2C_H_ */

0
luci-app-ouad/src/LICENSE Executable file → Normal file
View file

21
luci-app-ouad/src/Makefile Executable file → Normal file
View file

@ -1,16 +1,27 @@
ifndef CC
CC = gcc CC = gcc
LD = gcc endif
ifndef LD
LD = ld
endif
SOURCES = SSD1306_OLED_Library/SSD1306_OLED.c Example_Code/Main.c Example_Code/example_app.c I2C_Library/I2C.c SOURCES = SSD1306_OLED_Library/SSD1306_OLED.c Example_Code/main.c Example_Code/example_app.c I2C_Library/I2C.c
OBJS := $(SOURCES:.c=.o) OBJS := $(SOURCES:.c=.o)
CPPFLAGS := -I SSD1306_OLED_Library -I I2C_Library CPPFLAGS := -I SSD1306_OLED_Library -I I2C_Library
CFLAGS := -g ifndef CFLAGS
CFLAGS := -O2
endif
LDFLAGS := -lpthread -lconfig
oled: $(OBJS) oled: $(OBJS)
$(CC) $^ -o $@ $(CC) $^ -o $@ $(LDFLAGS)
ssd1306: $(OBJS)
$(CC) $^ -o $@ $(LDFLAGS) --static
strip $@
clean: clean:
rm -rf oled $(OBJS) rm -rf oled ssd1306 $(OBJS)
compile: oled compile: oled

0
luci-app-ouad/src/README.md Executable file → Normal file
View file

View file

@ -0,0 +1,183 @@
---
Language: Cpp
# BasedOnStyle: Google
AccessModifierOffset: -1
AlignAfterOpenBracket: Align
AlignConsecutiveMacros: false
AlignConsecutiveAssignments: false
AlignConsecutiveBitFields: false
AlignConsecutiveDeclarations: false
AlignEscapedNewlines: Left
AlignOperands: Align
AlignTrailingComments: true
AllowAllArgumentsOnNextLine: true
AllowAllConstructorInitializersOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortEnumsOnASingleLine: true
AllowShortBlocksOnASingleLine: Never
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: All
AllowShortLambdasOnASingleLine: All
AllowShortIfStatementsOnASingleLine: WithoutElse
AllowShortLoopsOnASingleLine: true
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: true
AlwaysBreakTemplateDeclarations: Yes
BinPackArguments: true
BinPackParameters: true
BraceWrapping:
AfterCaseLabel: false
AfterClass: false
AfterControlStatement: Never
AfterEnum: false
AfterFunction: false
AfterNamespace: false
AfterObjCDeclaration: false
AfterStruct: false
AfterUnion: false
AfterExternBlock: false
BeforeCatch: false
BeforeElse: false
BeforeLambdaBody: false
BeforeWhile: false
IndentBraces: false
SplitEmptyFunction: true
SplitEmptyRecord: true
SplitEmptyNamespace: true
BreakBeforeBinaryOperators: None
BreakBeforeBraces: Attach
BreakBeforeInheritanceComma: false
BreakInheritanceList: BeforeColon
BreakBeforeTernaryOperators: true
BreakConstructorInitializersBeforeComma: false
BreakConstructorInitializers: BeforeColon
BreakAfterJavaFieldAnnotations: false
BreakStringLiterals: true
ColumnLimit: 80
CommentPragmas: '^ IWYU pragma:'
CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: true
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DeriveLineEnding: true
DerivePointerAlignment: true
DisableFormat: false
ExperimentalAutoDetectBinPacking: false
FixNamespaceComments: true
ForEachMacros:
- foreach
- Q_FOREACH
- BOOST_FOREACH
IncludeBlocks: Regroup
IncludeCategories:
- Regex: '^<ext/.*\.h>'
Priority: 2
SortPriority: 0
- Regex: '^<.*\.h>'
Priority: 1
SortPriority: 0
- Regex: '^<.*'
Priority: 2
SortPriority: 0
- Regex: '.*'
Priority: 3
SortPriority: 0
IncludeIsMainRegex: '([-_](test|unittest))?$'
IncludeIsMainSourceRegex: ''
IndentCaseLabels: true
IndentCaseBlocks: false
IndentGotoLabels: true
IndentPPDirectives: None
IndentExternBlock: AfterExternBlock
IndentWidth: 2
IndentWrappedFunctionNames: false
InsertTrailingCommas: None
JavaScriptQuotes: Leave
JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: false
MacroBlockBegin: ''
MacroBlockEnd: ''
MaxEmptyLinesToKeep: 1
NamespaceIndentation: None
ObjCBinPackProtocolList: Never
ObjCBlockIndentWidth: 2
ObjCBreakBeforeNestedBlockParam: true
ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: true
PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 1
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000
PenaltyBreakTemplateDeclaration: 10
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 200
PointerAlignment: Left
RawStringFormats:
- Language: Cpp
Delimiters:
- cc
- CC
- cpp
- Cpp
- CPP
- 'c++'
- 'C++'
CanonicalDelimiter: ''
BasedOnStyle: google
- Language: TextProto
Delimiters:
- pb
- PB
- proto
- PROTO
EnclosingFunctions:
- EqualsProto
- EquivToProto
- PARSE_PARTIAL_TEXT_PROTO
- PARSE_TEST_PROTO
- PARSE_TEXT_PROTO
- ParseTextOrDie
- ParseTextProtoOrDie
- ParseTestProto
- ParsePartialTestProto
CanonicalDelimiter: ''
BasedOnStyle: google
ReflowComments: true
SortIncludes: true
SortUsingDeclarations: true
SpaceAfterCStyleCast: false
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: true
SpaceBeforeAssignmentOperators: true
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: true
SpaceInEmptyBlock: false
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 2
SpacesInAngles: false
SpacesInConditionalStatement: false
SpacesInContainerLiterals: true
SpacesInCStyleCastParentheses: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
SpaceBeforeSquareBrackets: false
Standard: Auto
StatementMacros:
- Q_UNUSED
- QT_REQUIRE_VERSION
IndentWidth: 8
TabWidth: 8
UseCRLF: false
UseTab: Always
WhitespaceSensitiveMacros:
- STRINGIZE
- PP_STRINGIZE
- BOOST_PP_STRINGIZE
...

3163
luci-app-ouad/src/SSD1306_OLED_Library/SSD1306_OLED.c Executable file → Normal file

File diff suppressed because it is too large Load diff

176
luci-app-ouad/src/SSD1306_OLED_Library/SSD1306_OLED.h Executable file → Normal file
View file

@ -35,119 +35,121 @@ SOFTWARE.
#include <stdbool.h> #include <stdbool.h>
/* Find Min and Max - MACROS */ /* Find Min and Max - MACROS */
#define MIN(a,b) (((a)<(b))?(a):(b)) #define MIN(a, b) (((a) < (b)) ? (a) : (b))
#define MAX(a,b) (((a)>(b))?(a):(b)) #define MAX(a, b) (((a) > (b)) ? (a) : (b))
/* I2C Address of SSD1306 */ /* I2C Address of SSD1306 */
#define SSD1306_OLED_ADDR 0x3C #define SSD1306_OLED_ADDR 0x3C
#define DISPLAY_BUFF_SIZE (SSD1306_LCDWIDTH*SSD1306_LCDHEIGHT/8) #define DISPLAY_BUFF_SIZE (SSD1306_LCDWIDTH * SSD1306_LCDHEIGHT / 8)
/* COLOR MACROS */ /* COLOR MACROS */
#define WHITE 1 #define WHITE 1
#define BLACK 0 #define BLACK 0
#define INVERSE 2 #define INVERSE 2
/* Number output format */ /* Number output format */
#define DEC 10 #define DEC 10
#define HEX 16 #define HEX 16
#define OCT 8 #define OCT 8
#define BIN 2 #define BIN 2
#define DEFAULT 0 #define DEFAULT 0
/*D/C# bit is '0' indicating that following /*D/C# bit is '0' indicating that following
* byte is a command. '1' is for data * byte is a command. '1' is for data
*/ */
#define SSD1306_CNTRL_CMD 0x00 #define SSD1306_CNTRL_CMD 0x00
#define SSD1306_CNTRL_DATA 0x40 #define SSD1306_CNTRL_DATA 0x40
/*-----------------------Enable the WxL of the Display
/*-----------------------Enable the WxL of the Display ---------------------------*/ * ---------------------------*/
#define SSD1306_128_64 //#define SSD1306_128_64
//#define SSD1306_128_32 #define SSD1306_128_32
//#define SSD1306_96_16 //#define SSD1306_96_16
/*--------------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------------*/
/* LCD HxW i.e. 64x128 || WxL i.e. 128x64 */ /* LCD HxW i.e. 64x128 || WxL i.e. 128x64 */
#if defined SSD1306_128_64 #if defined SSD1306_128_64
#define SSD1306_LCDWIDTH 128 #define SSD1306_LCDWIDTH 128
#define SSD1306_LCDHEIGHT 64 #define SSD1306_LCDHEIGHT 64
#endif #endif
#if defined SSD1306_128_32 #if defined SSD1306_128_32
#define SSD1306_LCDWIDTH 128 #define SSD1306_LCDWIDTH 128
#define SSD1306_LCDHEIGHT 32 #define SSD1306_LCDHEIGHT 32
#endif #endif
#if defined SSD1306_96_16 #if defined SSD1306_96_16
#define SSD1306_LCDWIDTH 96 #define SSD1306_LCDWIDTH 96
#define SSD1306_LCDHEIGHT 16 #define SSD1306_LCDHEIGHT 16
#endif #endif
/* SSD1306 Commands */ /* SSD1306 Commands */
#define SSD1306_DISPLAY_OFF 0xAE #define SSD1306_DISPLAY_OFF 0xAE
#define SSD1306_SET_DISP_CLK 0xD5 #define SSD1306_SET_DISP_CLK 0xD5
#define SSD1306_SET_MULTIPLEX 0xA8 #define SSD1306_SET_MULTIPLEX 0xA8
#define SSD1306_SET_DISP_OFFSET 0xD3 #define SSD1306_SET_DISP_OFFSET 0xD3
#define SSD1306_SET_DISP_START_LINE 0x40 #define SSD1306_SET_DISP_START_LINE 0x40
#define SSD1306_CONFIG_CHARGE_PUMP 0x8D #define SSD1306_CONFIG_CHARGE_PUMP 0x8D
#define SSD1306_SET_MEM_ADDR_MODE 0x20 #define SSD1306_SET_MEM_ADDR_MODE 0x20
#define SSD1306_SEG_REMAP (0xA0 | 0x01) #define SSD1306_SEG_REMAP (0xA0 | 0x01)
#define SSD1306_SEG_REMAP1 0xA0 #define SSD1306_SEG_REMAP1 0xA0
#define SSD1306_SET_COMSCANDEC 0xC8 #define SSD1306_SET_COMSCANDEC 0xC8
#define SSD1306_SET_COMSCANDEC1 0xC0 #define SSD1306_SET_COMSCANDEC1 0xC0
#define SSD1306_SET_COMPINS 0xDA #define SSD1306_SET_COMPINS 0xDA
#define SSD1306_SET_CONTRAST 0x81 #define SSD1306_SET_CONTRAST 0x81
#define SSD1306_SET_PRECHARGE 0xD9 #define SSD1306_SET_PRECHARGE 0xD9
#define SSD1306_SET_VCOMDETECT 0xDB #define SSD1306_SET_VCOMDETECT 0xDB
#define SSD1306_DISPLAYALLON_RESUME 0xA4 #define SSD1306_DISPLAYALLON_RESUME 0xA4
#define SSD1306_NORMAL_DISPLAY 0xA6 #define SSD1306_NORMAL_DISPLAY 0xA6
#define SSD1306_DISPLAYON 0xAF #define SSD1306_DISPLAYON 0xAF
#define SSD1306_SET_COL_ADDR 0x21 #define SSD1306_SET_COL_ADDR 0x21
#define SSD1306_PAGEADDR 0x22 #define SSD1306_PAGEADDR 0x22
#define SSD1306_INVERT_DISPLAY 0x01 #define SSD1306_INVERT_DISPLAY 0x01
#define SSD1306_NORMALIZE_DISPLAY 0x00 #define SSD1306_NORMALIZE_DISPLAY 0x00
/* SDD1306 Scroll Commands */ /* SDD1306 Scroll Commands */
#define SSD1306_SET_VERTICAL_SCROLL_AREA 0xA3 #define SSD1306_SET_VERTICAL_SCROLL_AREA 0xA3
#define SSD1306_ACTIVATE_SCROLL 0x2F #define SSD1306_ACTIVATE_SCROLL 0x2F
#define SSD1306_DEACTIVATE_SCROLL 0x2E #define SSD1306_DEACTIVATE_SCROLL 0x2E
#define SSD1306_RIGHT_HORIZONTAL_SCROLL 0x26 #define SSD1306_RIGHT_HORIZONTAL_SCROLL 0x26
#define SSD1306_LEFT_HORIZONTAL_SCROLL 0x27 #define SSD1306_LEFT_HORIZONTAL_SCROLL 0x27
#define SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL 0x29 #define SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL 0x29
#define SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL 0x2A #define SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL 0x2A
#define SSD1306_INVERTDISPLAY 0xA7 #define SSD1306_INVERTDISPLAY 0xA7
/* SSD1306 Configuration Commands */ /* SSD1306 Configuration Commands */
#define SSD1306_DISPCLK_DIV 0x80 #define SSD1306_DISPCLK_DIV 0x80
#if defined SSD1306_128_64 #if defined SSD1306_128_64
#define SSD1306_MULT_64 0x3F #define SSD1306_MULT_64 0x3F
#endif #endif
#if defined SSD1306_128_32 #if defined SSD1306_128_32
#define SSD1306_MULT_64 0x1F #define SSD1306_MULT_64 0x1F
#endif #endif
#define SSD1306_MULT_64 0x1F #define SSD1306_MULT_64 0x1F
#define SSD1306_DISP_OFFSET_VAL 0x00 #define SSD1306_DISP_OFFSET_VAL 0x00
#define SSD1306_COL_START_ADDR 0x00 //Reset to = 0 #define SSD1306_COL_START_ADDR 0x00 // Reset to = 0
#define SSD1306_COL_END_ADDR (SSD1306_LCDWIDTH - 1) //Reset to = 127 #define SSD1306_COL_END_ADDR (SSD1306_LCDWIDTH - 1) // Reset to = 127
#define SSD1306_PG_START_ADDR 0x00 #define SSD1306_PG_START_ADDR 0x00
#define SSD1306_PG_END_ADDR 7 #define SSD1306_PG_END_ADDR 7
#define SSD1306_CHARGE_PUMP_EN 0x14 #define SSD1306_CHARGE_PUMP_EN 0x14
#if defined SSD1306_128_64 #if defined SSD1306_128_64
#define SSD1306_CONFIG_COM_PINS 0x12 #define SSD1306_CONFIG_COM_PINS 0x12
#endif #endif
#if defined SSD1306_128_32 #if defined SSD1306_128_32
#define SSD1306_CONFIG_COM_PINS 0x02 #define SSD1306_CONFIG_COM_PINS 0x02
#endif #endif
#define SSD1306_CONTRAST_VAL 0xCF //207 #define SSD1306_CONTRAST_VAL 0xCF // 207
#define SSD1306_PRECHARGE_VAL 0xF1 #define SSD1306_PRECHARGE_VAL 0xF1
#define SSD1306_VCOMH_VAL 0x40 #define SSD1306_VCOMH_VAL 0x40
#define SSD1306_MULT_DAT (SSD1306_LCDHEIGHT - 1) #define SSD1306_MULT_DAT (SSD1306_LCDHEIGHT - 1)
#define SSD1306_HOR_MM 0x00 #define SSD1306_HOR_MM 0x00
/*SSD1306 Display API's */ /*SSD1306 Display API's */
extern void clearDisplay(); extern void clearDisplay();
extern void display_Init_seq(); extern void display_Init_seq();
extern void Display(); extern void Display();
extern void Init_Col_PG_addrs(unsigned char col_start_addr, unsigned char col_end_addr, extern void Init_Col_PG_addrs(unsigned char col_start_addr,
unsigned char pg_start_addr, unsigned char pg_end_addr); unsigned char col_end_addr,
unsigned char pg_start_addr,
unsigned char pg_end_addr);
extern void setRotation(unsigned char x); extern void setRotation(unsigned char x);
extern void startscrollright(unsigned char start, unsigned char stop); extern void startscrollright(unsigned char start, unsigned char stop);
extern void startscrollleft(unsigned char start, unsigned char stop); extern void startscrollleft(unsigned char start, unsigned char stop);
@ -159,29 +161,40 @@ extern short getCursorX();
extern short getCursorY(); extern short getCursorY();
extern unsigned char getRotation(); extern unsigned char getRotation();
extern void invertDisplay(unsigned char i); extern void invertDisplay(unsigned char i);
extern void display_rotate();
extern void display_normal();
/*SSD1306 Graphics Handling API's */ /*SSD1306 Graphics Handling API's */
extern signed char drawPixel(short x, short y, short color); 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 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 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 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 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 fillRect(short x, short y, short w, short h, short color);
extern void drawCircle(short x0, short y0, short r, 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 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 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 drawTriangle(short x0, short y0, short x1, short y1, short x2,
extern void fillTriangle(short x0, short y0, short x1, short y1, short x2, short y2, short color); short y2, short color);
extern void drawRoundRect(short x, short y, short w, short h, short r, short color); extern void fillTriangle(short x0, short y0, short x1, short y1, short x2,
extern void fillRoundRect(short x, short y, short w, short h, short r, short color); short y2, short color);
extern void drawBitmap(short x, short y, const unsigned char bitmap[], short w, short h, 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); extern short oled_write(unsigned char c);
/*SSD1306 Text and Character Handling API's */ /*SSD1306 Text and Character Handling API's */
extern void setTextSize(unsigned char s); extern void setTextSize(unsigned char s);
extern void setTextColor(short c); extern void setTextColor(short c);
extern void setTextWrap(bool w); extern void setTextWrap(bool w);
extern void drawChar(short x, short y, unsigned char c, short color, short bg, unsigned char size); 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 print_str(const unsigned char *strPtr);
extern short println(); extern short println();
extern short print_strln(const unsigned char *strPtr); extern short print_strln(const unsigned char *strPtr);
@ -201,4 +214,3 @@ extern short printNumber_I_ln(int n, int base);
extern short printFloat(double number, unsigned char digits); extern short printFloat(double number, unsigned char digits);
extern short printFloat_ln(double num, int digits); extern short printFloat_ln(double num, int digits);
#endif /* SSD1306_OLED_H_ */ #endif /* SSD1306_OLED_H_ */

22
luci-app-ouad/src/SSD1306_OLED_Library/gfxfont.h Executable file → Normal file
View file

@ -1,18 +1,18 @@
#ifndef _GFXFONT_H_ #ifndef _GFXFONT_H_
#define _GFXFONT_H_ #define _GFXFONT_H_
typedef struct { // Data stored PER GLYPH typedef struct { // Data stored PER GLYPH
unsigned short bitmapOffset; // Pointer into GFXfont->bitmap unsigned short bitmapOffset; // Pointer into GFXfont->bitmap
unsigned char width, height; // Bitmap dimensions in pixels unsigned char width, height; // Bitmap dimensions in pixels
unsigned char xAdvance; // Distance to advance cursor (x axis) unsigned char xAdvance; // Distance to advance cursor (x axis)
char xOffset, yOffset; // Dist from cursor pos to UL corner char xOffset, yOffset; // Dist from cursor pos to UL corner
} GFXglyphT, *GFXglyphPtr; } GFXglyphT, *GFXglyphPtr;
typedef struct { // Data stored for FONT AS A WHOLE: typedef struct { // Data stored for FONT AS A WHOLE:
unsigned char *bitmap; // Glyph bitmaps, concatenated unsigned char *bitmap; // Glyph bitmaps, concatenated
GFXglyphPtr glyph; // Glyph array GFXglyphPtr glyph; // Glyph array
unsigned char first, last; // ASCII extents unsigned char first, last; // ASCII extents
unsigned char yAdvance; // Newline distance (y axis) unsigned char yAdvance; // Newline distance (y axis)
} GFXfontT, *GFXfontPtr; } GFXfontT, *GFXfontPtr;
#endif // _GFXFONT_H_ #endif // _GFXFONT_H_