P/S: Rex, come back, dear! It's boring without you.
Code: Select all
:global iotLine do={
:global ioLineNONC
:local arrayPin {3; 5; 12; 13; 15; 16}
:local ioLine 6
:local act;
:if ([:len $ioLineNONC]=0) do={:set $ioLineNONC true}
:if ($1="help") do={
/terminal style varname
:put ""
:put "Function works with GPIO RBM33G"
:put "version 1.2"
:put "by Sertik 30/10/2023"
:put ""
:put "\$1 - action: on/off/enable/disable/direction/info/help"
:put "\$2 - line number, if not define - all"
:put "\$3 - input/output for direction"
:put "\$ioLineNONC - true (or not specified) - line for NO rele/ false - line for NC rele"
:put ""
/terminal style none}
:if ([:len [/system routerboard settings get gpio-function]]!=0) do={
:local gpioanswer "Pin 12-16 is not set on GPIO.\n\rPlease reset routerboard gpio-function and reboot Router."
:put ("ERROR $0 function"."\r\n"."$gpioanswer")
:log error ("ERROR $0 function"."\r\n"."$gpioanswer")
:return $gpioanswer}
if (($1="info") and ([:len $2]=0)) do={
:local gio [/iot gpio digital print as-value]
:local count 0; local name; :local comment; :local script; :local dir; :local output; :local input;
:foreach i in=$gio do={
:set name ($gio->$count->"name")
:set comment ($gio->$count->"comment")
:set script ($gio->$count->"script")
:set dir ($gio->$count->"direction")
:set input ($gio->$count->"intput")
:set output ($gio->$count->"output")
:set count ($count+1)
:put ("$count "."$name "."$dir "."$output "."$input "."$comment "."$script")
:log warning ("$count "."$name "."$dir "."$output "."$input "."$comment "."$script")
}
:return $gio}
:if (($1="info") && ([:len $2]=1)) do={
:if (([:tonum $2]<=0) or ([:tonum $2]>$ioLine)) do={:return Error}
do {
:local state [/iot gpio digital get "pin$($arrayPin->([:tonum $2]-1))"]
:return $state
} on-error={:return Error}
}
:if (($1="enable") and ([:len $2]=1)) do={
:if (([:tonum $2]<=0) or ([:tonum $2]>$ioLine)) do={:return Error}
do {
[/iot gpio digital set "pin$($arrayPin->([:tonum $2]-1))" disabled=no]
:local pinSet ([/iot gpio digital get "pin$($arrayPin->([:tonum $2]-1))"]->"disabled")
:if (!$pinSet) do={:return "Done"} else={:return "Not set"}
} on-error={:return Error}
}
:if (($1="disable") and ([:len $2]=1)) do={
:if (([:tonum $2]<=0) or ([:tonum $2]>$ioLine)) do={:return Error}
do {
[/iot gpio digital set "pin$($arrayPin->([:tonum $2]-1))" disabled=yes]
:local pinSet ([/iot gpio digital get "pin$($arrayPin->([:tonum $2]-1))"]->"disabled")
:if ($pinSet) do={:return "Done"} else={:return "Not set"}
} on-error={:return Error}
}
:if (($1="disable") and ([:len $2]=0)) do={
do {
:foreach Xpin in=$arrayPin do={
/iot gpio digital set "pin$Xpin" disabled=yes
}
} on-error={:return Error}
:return Done}
:if (($1="enable") and ([:len $2]=0)) do={
do {
:foreach Xpin in=$arrayPin do={
/iot gpio digital set "pin$Xpin" disabled=no
}
} on-error={:return Error}
:return Done}
:if (($1="direction") and ([:len $3]=0)) do={
:if (($2="input") or ($2="output")) do={
do {
:foreach Xpin in=$arrayPin do={
/iot gpio digital set "pin$Xpin" direction=$2
}
} on-error={:return Error}
} else={:return Error}
:return Done}
:if (($1="direction") and ([:len $2]=1) and ([:len $3]>1)) do={
:if (($3="input") or ($3="output")) do={
:if ([:tonum $2]>$ioLine) do={:return "Error"}
:do {
/iot gpio digital set "pin$($arrayPin->[:tonum $2])" direction=$3
} on-error={:return Error}
} else={:return Error}
:return Done}
:if (($1="on") && ($ioLineNONC=true)) do={:set act 1}
:if (($1="on") && ($ioLineNONC=false)) do={:set act 0}
:if (($1="off") && ($ioLineNONC=true)) do={:set act 0}
:if (($1="off") && ($ioLineNONC=false)) do={:set act 1}
:if ([:len $act]>0) do={
:if ([:len $2]>0) do={
:do {
:if (([:tonum $2]<=0) or ([:tonum $2]>$ioLine)) do={:return Error}
# check direction output - error
:if ([/iot gpio digital get "pin$($arrayPin->([:tonum $2]-1))" direction]="input") do={:return "Error line $2 is set on INPUT"}
/iot gpio digital set "pin$($arrayPin->([:tonum $2]-1))" output=$act
} on-error={:return Error}
} else={
:foreach Xpin in=$arrayPin do={
#check direction output for group line - sckip input line
:if ([/iot gpio digital get "pin$Xpin" direction]="output") do={
/iot gpio digital set "pin$Xpin" output=$act}
}
}
:return "Done"} else={:return "Error"}
}
# Examles (:global ioLineNONC true or non for NO line type rele, :global ioLineNONC false for line NC-type)
# [$iotLine help]
# [$iotLine info]
# :local R3 [$iotLine info 3]
# :put ([$iotLine info 2]->"disabled")
# [$iotLine direction 3 output]
# [$iotLine direction input]
# :log error ("Logical 1 on line 3 "."$[$iotLine on 3]")
# :delay 2s
# :log warning ("Logical 0 on line 3 "."$[$iotLine off 3]")
# [$iotLine on]
# [$iotLine off]
# [$iotLine enable/disable 1]
# [$iotLine enable/disable]