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

luci-app-ouad

This commit is contained in:
suyuan 2023-10-13 10:55:10 +08:00
parent 210e628655
commit 714452709f
33 changed files with 3018 additions and 3528 deletions

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

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

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

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

@ -4,11 +4,6 @@ function index()
if not nixio.fs.access("/etc/config/oled") then
return
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", "status"}, call("act_status"))
entry({"admin", "services", "oled", "setting"}, cbi("oled/setting"),_("Setting"),30).leaf = true

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

@ -40,9 +40,6 @@ o = s:taboption("info", Flag, "date", translate("Date"), translate('Format YYYY-
o.default=0
o = s:taboption("info", Flag, "lanip", translate("IP"), translate("LAN IP address"))
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.default=0
o = s:taboption("info", Flag, "cpufreq", translate("CPU frequency"))

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

View file

@ -1 +0,0 @@
zh_Hans

View file

@ -1 +0,0 @@
zh_Hant

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

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

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

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

View file

@ -1,115 +1,144 @@
#!/bin/sh /etc/rc.common
START=88
STOP=11
USE_PROCD=1
PROG=/usr/bin/oled
get_section() {
eval "export -n ${2}=\"$1\""
return 1
stop() {
kill -2 $(pgrep /usr/bin/oled)
kill -9 $(pgrep -f /usr/sbin/netspeed)
echo "oled exit..."
}
start_service() {
local mainsection
config_load oled
config_foreach get_section oled mainsection
local section=$mainsection
local enabled ; config_get enabled "$section" enable 0
if [[ $enabled -eq 0 ]]; then
return 1
start() {
enabled=$(uci get oled.@oled[0].enable)
if [ $enabled -eq 0 ]; then
exit 0
fi
procd_open_instance
procd_set_param command ${PROG}
procd_append_param command --needInit
autoswitch=$(uci get oled.@oled[0].autoswitch)
from=$(uci get oled.@oled[0].from)
to=$(uci get oled.@oled[0].to)
local param
# default /dev/i2c-0
config_get param "$section" path
[ "$param" != "" ] && procd_append_param command --i2cDevPath="$param"
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
# from begin_minitues to end_minitues
# default 0 - 1440
config_get param "$section" from
[ "$param" != "" ] && procd_append_param command --from="$param"
config_get param "$section" to
[ "$param" != "" ] && procd_append_param command --to="$param"
#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
config_get param "$section" date
[ "$param" == "1" ] && procd_append_param command --displayDate
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)
config_get param "$section" lanip
[ "$param" == "1" ] && procd_append_param command --displayIp
config_get param "$section" ipifname
if [ "$param" != "" ];then
procd_append_param command --ipIfName="$param"
if [ ${netspeed} -eq 1 ] && [ -z "$(pgrep -f netspeed)" ]; then
nohup /usr/sbin/netspeed ${netsource} >/dev/null 2>&1 &
else
procd_append_param command --ipIfName="br-lan"
[ -n "$(pgrep -f /usr/sbin/netspeed)" ] && kill -9 $(pgrep -f /usr/sbin/netspeed) 2>&1 >/dev/null
rm -f /tmp/netspeed
fi
config_get param "$section" cputemp
[ "$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
#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 &
nohup ${PROG} eth0 /dev/i2c-0 > /dev/null 2>&1 &
}
service_triggers() {
procd_add_reload_trigger "oled"
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)
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 Normal file → Executable file
View file

@ -1,23 +1,16 @@
#!/bin/sh
uci_write_config() {
[[ `uci -q get oled.@oled[0].showmenu` -eq 1 ]] && return
uci -q batch <<-EOF >/dev/null
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
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 1 eth0
uci_write_config '/dev/i2c-5' 1
;;
esac
@ -28,6 +21,5 @@ uci -q batch <<-EOF >/dev/null
commit ucitrack
EOF
sed -e "/\/etc\/init\.d\/oled/d" -i /etc/crontabs/root && /etc/init.d/cron reload
rm -rf /tmp/luci-*
exit 0

View 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

View file

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

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

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

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

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

@ -1,183 +0,0 @@
---
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
...

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

@ -8,833 +8,100 @@
*/
/* Lib Includes */
#include <getopt.h>
#include <libconfig.h>
#include <limits.h>
#include <pthread.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <signal.h>
/* Header Files */
#include "I2C.h"
#include "SSD1306_OLED.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 */
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 */
void ALARMhandler(int sig) {
/* Set flag */
flag = 5;
void ALARMhandler(int sig)
{
/* Set flag */
flag = 5;
}
void BreakDeal(int sig) {
printf("Recived a KILL signal!\n");
if (tid != 0) {
pthread_cancel(tid);
pthread_join(tid, NULL);
}
if (tid1 != 0) {
pthread_cancel(tid1);
pthread_join(tid1, NULL);
}
clearDisplay();
usleep(DISPLAY_INTERVAL);
Display();
exit(0);
void BreakDeal(int sig)
{
clearDisplay();
usleep(1000000);
Display();
exit(0);
}
int main(int argc, char *argv[]) {
int option;
int option_index = 0;
char *config_file = NULL;
unsigned long int rx_speed, tx_speed;
struct st_config *stcfg;
int main(int argc, char* argv[])
{
char *eth=argv[1];
char *path=argv[2];
static struct option long_options[] = {
{"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}};
if(path == NULL)
path = I2C_DEV0_PATH;
stcfg = (struct st_config *)malloc(sizeof(struct st_config));
memset(stcfg, 0, sizeof(struct st_config));
/* 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);
}
/* set default value for config */
stcfg->need_init = 1;
stcfg->interval = 60;
stcfg->from = 0;
stcfg->to = 1440;
/* Register the Alarm Handler */
signal(SIGALRM, ALARMhandler);
signal(SIGINT, BreakDeal);
//signal(SIGTERM, BreakDeal);
stcfg->ip_if_name = malloc(sizeof(char) * 20);
sprintf(stcfg->ip_if_name, "br-lan");
/* Run SDD1306 Initialization Sequence */
/* if (needinit==1)
display_Init_seq();
stcfg->speed_if_name = malloc(sizeof(char) * 20);
sprintf(stcfg->speed_if_name, "eth0");
if (rotate==1)
display_rotate();
else
display_normal();
*/
/* Clear display */
clearDisplay();
stcfg->scroll_text = malloc(sizeof(char) * 100);
sprintf(stcfg->scroll_text, "Hello");
// draw a single pixel
// drawPixel(0, 1, WHITE);
// Display();
// usleep(1000000);
// clearDisplay();
stcfg->i2c_dev_path = malloc(sizeof(char) * 20);
sprintf(stcfg->i2c_dev_path, "%s", I2C_DEV0_PATH);
/* The end of set default value for config */
// draw many lines
while(1){
//setCursor(0,0);
setTextColor(WHITE);
while ((option = getopt_long(argc, argv,
"c:hvDAa:Ss:TFIl:LWwCRrGgBEOo:d:HNf:t:",
long_options, &option_index)) != -1) {
switch (option) {
case 'c':
config_file = optarg;
break;
case 'h':
printHelp();
exit(EXIT_SUCCESS);
case 'v':
printVersion();
exit(EXIT_SUCCESS);
case '?':
// Invalid option or missing argument
exit(EXIT_FAILURE);
default:
// Handle other parameters
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);
testintfstatus(FULL, 0);
display_bitmap_uploaddownload();
testnetspeed(SPLIT, 120);
testvpsip(FULL, 52);
Display();
usleep(5000000);
clearDisplay();
testinfo1();
Display();
usleep(1000000);
clearDisplay();
testinfo2();
Display();
usleep(800000);
clearDisplay();
testinfo3();
Display();
usleep(200000);
clearDisplay();
}
}

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

File diff suppressed because it is too large Load diff

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

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

View file

@ -1,183 +0,0 @@
---
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 Normal file → Executable file
View file

@ -25,18 +25,17 @@ SOFTWARE.
*
* 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
* 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 <fcntl.h>
#include <linux/i2c-dev.h>
#include <stdio.h>
#include <sys/ioctl.h>
#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
@ -53,6 +52,7 @@ typedef char i2c_char_t;
/* Header Files */
#include "I2C.h"
/* Exposed objects for i2c-x */
I2C_DeviceT I2C_DEV_2;
@ -63,26 +63,30 @@ I2C_DeviceT I2C_DEV_2;
* 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)
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)
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
@ -91,13 +95,15 @@ int Close_device(int fd) {
* @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)
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
@ -105,15 +111,17 @@ int Set_slave_addr(int fd, unsigned char slave_addr) {
* Params @fd: File descriptor
* @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;
ret = write(fd, &data, I2C_ONE_BYTE);
if ((ret == -1) || (ret != 1))
if((ret == -1) || (ret != 1))
return -1;
else
return (ret);
return(ret);
}
/****************************************************************
* Function Name : i2c_read
* Description : Read a byte on SDA
@ -122,14 +130,18 @@ int i2c_write(int fd, unsigned char data) {
* @read_data: Points to the variable that stores
* 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;
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);
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
@ -139,19 +151,23 @@ int i2c_read(int fd, unsigned char *read_data) {
* @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 i2c_read_register(int fd, unsigned char read_addr, unsigned char *read_data)
{
int ret = 0;
if (i2c_write(fd, read_addr) == -1) {
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);
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
@ -163,18 +179,23 @@ int i2c_read_register(int fd, unsigned char read_addr,
* @buff_Ptr: Buffer to store the read bytes
****************************************************************/
int i2c_read_registers(int fd, int num, unsigned char starting_addr,
unsigned char *buff_Ptr) {
unsigned char *buff_Ptr)
{
int ret = 0;
if (i2c_write(fd, starting_addr) == -1) {
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);
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
@ -184,15 +205,17 @@ int i2c_read_registers(int fd, int num, unsigned char starting_addr,
* @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 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))
if((ret == -1) || (ret != num))
return -1;
else
return (ret);
return(ret);
}
/****************************************************************
* Function Name : i2c_write_register
* Description : Write a control byte or byte to a register
@ -203,19 +226,20 @@ int i2c_multiple_writes(int fd, int num, unsigned char *Ptr_buff) {
* @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) {
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))
if((ret == -1) || (ret != I2C_TWO_BYTES))
return -1;
else
return (ret);
return(ret);
}
/****************************************************************
* Function Name : config_i2c_struct
* Description : Initialize the I2C device structure
@ -224,13 +248,14 @@ int i2c_write_register(int fd, unsigned char reg_addr_or_cntrl,
* @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) {
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
@ -238,13 +263,16 @@ void config_i2c_struct(char *i2c_dev_path, unsigned char slave_addr,
* 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) {
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) {
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;
}

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

@ -26,29 +26,29 @@ SOFTWARE.
* Created on : Sep 4, 2017
* Author : Vinay Divakar
* Website : www.deeplyembedded.org
*/
*/
#ifndef I2C_H_
#define I2C_H_
#include <stdint.h>
#include<stdint.h>
/* No. of bytes per transaction */
#define I2C_ONE_BYTE 1
#define I2C_TWO_BYTES 2
#define I2C_THREE_BYTES 3
#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"
#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;
typedef struct{
char* i2c_dev_path;
int fd_i2c;
unsigned char i2c_slave_addr;
} I2C_DeviceT, *I2C_DevicePtr;
}I2C_DeviceT, *I2C_DevicePtr;
/* Exposed Generic I2C Functions */
extern int Open_device(char *i2c_dev_path, int *fd);
@ -56,17 +56,14 @@ 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_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);
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);
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);
extern int init_i2c_dev(const char* i2c_path, unsigned char slave_address);
#endif /* I2C_H_ */

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

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

@ -1,27 +1,16 @@
ifndef CC
CC = gcc
endif
ifndef LD
LD = ld
endif
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
ifndef CFLAGS
CFLAGS := -O2
endif
LDFLAGS := -lpthread -lconfig
CFLAGS := -g
oled: $(OBJS)
$(CC) $^ -o $@ $(LDFLAGS)
ssd1306: $(OBJS)
$(CC) $^ -o $@ $(LDFLAGS) --static
strip $@
$(CC) $^ -o $@
clean:
rm -rf oled ssd1306 $(OBJS)
rm -rf oled $(OBJS)
compile: oled

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

View file

@ -1,183 +0,0 @@
---
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
...

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

File diff suppressed because it is too large Load diff

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

@ -35,33 +35,33 @@ SOFTWARE.
#include <stdbool.h>
/* Find Min and Max - MACROS */
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
#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)
#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
#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
#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
#define SSD1306_CNTRL_CMD 0x00
#define SSD1306_CNTRL_DATA 0x40
/*-----------------------Enable the WxL of the Display
* ---------------------------*/
/*-----------------------Enable the WxL of the Display ---------------------------*/
#define SSD1306_128_64
//#define SSD1306_128_32
//#define SSD1306_96_16
@ -69,87 +69,85 @@ SOFTWARE.
/* LCD HxW i.e. 64x128 || WxL i.e. 128x64 */
#if defined SSD1306_128_64
#define SSD1306_LCDWIDTH 128
#define SSD1306_LCDHEIGHT 64
#define SSD1306_LCDWIDTH 128
#define SSD1306_LCDHEIGHT 64
#endif
#if defined SSD1306_128_32
#define SSD1306_LCDWIDTH 128
#define SSD1306_LCDHEIGHT 32
#define SSD1306_LCDWIDTH 128
#define SSD1306_LCDHEIGHT 32
#endif
#if defined SSD1306_96_16
#define SSD1306_LCDWIDTH 96
#define SSD1306_LCDHEIGHT 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
#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
#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
#define SSD1306_DISPCLK_DIV 0x80
#if defined SSD1306_128_64
#define SSD1306_MULT_64 0x3F
#define SSD1306_MULT_64 0x3F
#endif
#if defined SSD1306_128_32
#define SSD1306_MULT_64 0x1F
#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
#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
#define SSD1306_CONFIG_COM_PINS 0x12
#endif
#if defined SSD1306_128_32
#define SSD1306_CONFIG_COM_PINS 0x02
#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
#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();
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 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);
@ -161,40 +159,29 @@ extern short getCursorX();
extern short getCursorY();
extern unsigned char getRotation();
extern void invertDisplay(unsigned char i);
extern void display_rotate();
extern void display_normal();
/*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 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 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 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 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);
@ -214,3 +201,4 @@ 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_ */

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

@ -1,18 +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
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)
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_
#endif // _GFXFONT_H_