lestnica_dvizh/pkg/app/main.go

113 строки
2,2 КиБ
Go

package app
import (
"my/go-controller/analog"
"my/go-controller/digital"
"my/go-controller/serial"
"my/go-controller/task"
"my/go-controller/timer"
)
const VREMYA_SVETA uint32 = 20000
var loopBlockTime task.TickType = task.MS_TO_TICKS(1000)
var vklYarkBlockTime task.TickType = task.MS_TO_TICKS(10)
var vyklYarkBlockTime task.TickType = task.MS_TO_TICKS(50)
var vkl bool
var kogdaVyklyuchit uint32
func initSvet() {
vkl = false
kogdaVyklyuchit = 0
Vyklyuchit()
}
func DvizhEst(start int) {
kogdaVyklyuchit = timer.Millis() + VREMYA_SVETA
if !vkl {
vkl = true
if DEBUG {
serial.Println("Vkl svet")
}
PlavnoVklyuchit(start)
}
}
func DvizhaNet() {
if kogdaVyklyuchit > timer.Millis() {
return
}
if vkl {
vkl = false
if DEBUG {
serial.Println("Vykl")
}
PlavnoVyklyuchit()
}
}
func PlavnoVklyuchit(start int) {
digital.Write(SVET_ONOFF_PIN, 1)
var i int
for i = start; i >= 0; i-- {
analog.Write(SVET_YARK_PIN, i)
if DEBUG {
serial.Println(i)
}
timer.Delay(5)
}
Vklyuchit()
}
func PlavnoVyklyuchit() {
var v int
var i int
for i = 0; i <= 255; i++ {
analog.Write(SVET_YARK_PIN, i)
if DEBUG {
serial.Println(i)
}
v = task.TaskNotifyTake(0, vyklYarkBlockTime)
if v > 0 {
DvizhEst(i)
return
}
}
Vyklyuchit()
}
func Vklyuchit() {
digital.Write(SVET_YARK_PIN, 0) // логика яркости инвертирована
digital.Write(SVET_ONOFF_PIN, 1)
}
func Vyklyuchit() {
digital.Write(SVET_YARK_PIN, 1) // логика яркости инвертирована
digital.Write(SVET_ONOFF_PIN, 0)
}
func TaskSveta() {
var v int
for {
/* Block to wait for a notification. Here the RTOS
task notification is being used as a counting semaphore.
The task's notification value is incremented each time
the ISR calls vTaskNotifyGiveFromISR(), and decremented
each time the RTOS task calls ulTaskNotifyTake() - so in
effect holds a count of the number of outstanding interrupts.
The first parameter is set to pdFALSE, so the notification
value is only decremented and not cleared to zero, and one
deferred interrupt event is processed at a time. */
v = task.TaskNotifyTake(0, loopBlockTime)
if v > 0 {
DvizhEst(255)
} else {
DvizhaNet()
}
}
}