You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

442 lines
9.6 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package m9zApi
import (
"fmt"
"github.com/gogf/gf/v2/errors/gerror"
"math"
"sort"
"strings"
"sync"
"tgk-touch/internal/library/m9z"
"time"
"github.com/towgo/towgo/towgo"
)
func getDeviceId(rpc towgo.JsonRpcConnection) (string, []uint) {
var p struct {
CommUid string `json:"comm_uid"`
Idxs []uint `json:"idxs"`
}
rpc.ReadParams(&p)
if p.CommUid == "" {
panic(gerror.New("comm_uid is empty"))
}
return p.CommUid, p.Idxs
}
// // 获取设备输出状态参数
func getOutStatus(rpc towgo.JsonRpcConnection) {
cuid, _ := getDeviceId(rpc)
read, err := m9z.DeviceOutStatusRead(cuid)
if err != nil {
panic(err)
}
rpc.WriteResult(read)
}
// todo 有问题 不管写入什么模式返回都是FF 获取设备编程模式 1-3 对应模式01~模式03 编程模式0~2
func getDeviceMode(rpc towgo.JsonRpcConnection) {
cuid, _ := getDeviceId(rpc)
read, err := m9z.ModeRead(cuid)
if err != nil {
panic(err)
}
rpc.WriteResult(read)
}
// 读取手动控制信息
func getDeviceManualInfo(rpc towgo.JsonRpcConnection) {
cuid, _ := getDeviceId(rpc)
manual, err := m9z.ManualRead(cuid)
if err != nil {
panic(err)
}
if !manual.Able {
// 如果当前非手动控制模式就读取设备状态后赋值给手动控制对象
//读取设备状态
time.Sleep(time.Second)
read, err := m9z.DeviceStatusRead(cuid)
if err != nil {
panic(err)
}
for i, _ := range manual.Loops {
manual.Loops[i].IsOpen = read.Relays[i]
manual.Loops[i].Pwm = int(read.PWMOutputs[i])
}
}
rpc.WriteResult(manual)
}
// 获取设备上的时间
func getDeviceTime(rpc towgo.JsonRpcConnection) {
cuid, _ := getDeviceId(rpc)
deviceTime, timestampSec, err := m9z.DeviceTimeRead(cuid)
if err != nil {
panic(err)
}
result := make(map[string]interface{})
result["deviceTime"] = deviceTime.Format("2006-01-02 15:04:05")
result["timestampSec"] = timestampSec
rpc.WriteResult(result)
}
// 获取设备经纬度信息
func getLgnLatData(rpc towgo.JsonRpcConnection) {
cuid, _ := getDeviceId(rpc)
manual, err := m9z.LgnLatRead(cuid)
if err != nil {
panic(err)
}
r := map[string]interface{}{}
r["lgn"] = manual.Lgn
r["lat"] = manual.Lat
r["loc"] = manual.Loc.String()
rpc.WriteResult(r)
}
// 获取日出日落时间偏差
func getSunRiseSet(rpc towgo.JsonRpcConnection) {
cuid, _ := getDeviceId(rpc)
read, err := m9z.SunRiseSetRead(cuid)
if err != nil {
panic(err)
}
rpc.WriteResult(read)
}
// 获取设备的状态
func getDeviceStatus(rpc towgo.JsonRpcConnection) {
cuid, _ := getDeviceId(rpc)
read, err := m9z.DeviceStatusRead(cuid)
if err != nil {
panic(err)
}
rpc.WriteResult(read)
}
type DeviceStatusLoop struct {
m9z.Loop
V float32
A float32
Kw float32
HasFault bool `json:"has_fault"`
FaultMsg string `json:"fault_msg"`
FaultCode string `json:"fault_code"`
Faults []m9z.LoopFault `json:"faults"`
}
type DeviceStatus struct {
m9z.DeviceStatus
ScanDeviceCount int `json:"scan_device_count"`
Loops []DeviceStatusLoop `json:"Loops"`
}
// 实时监控数据
func getDeviceStatus2(rpc towgo.JsonRpcConnection) {
cuid, _ := getDeviceId(rpc)
read, err := m9z.DeviceStatusRead(cuid)
if err != nil {
panic(err)
}
d := new(DeviceStatus)
d.DeviceStatus = *read
loopCount := configuredLoopCount()
d.ScanDeviceCount = loopCount
loops := make([]DeviceStatusLoop, loopCount)
var wg sync.WaitGroup
for i := 0; i < loopCount; i++ {
idx := i
wg.Add(1)
go func() {
defer wg.Done()
var loop DeviceStatusLoop
loop.Name = fmt.Sprintf("#%+v", idx+1)
loop.Index = idx
loop.IsOpen = read.Relays[idx]
loop.Pwm = int(read.PWMOutputs[idx])
parametersRead, _ := m9z.SubLoopParametersRead(cuid, uint(idx))
if parametersRead != nil {
loop.V = parametersRead.DCVoltage
loop.A = parametersRead.DCCurrent
kw := float64(loop.V*loop.A) / 1000
loop.Kw = float32(math.Round(kw*1000) / 1000)
loop.Faults = m9z.BuildLoopFaults(uint(idx+1), parametersRead.AlarmStatus, parametersRead.AlarmCode)
loop.HasFault = len(loop.Faults) > 0
loop.FaultMsg = joinLoopFaultMessages(loop.Faults)
loop.FaultCode = joinLoopFaultCodes(loop.Faults)
}
loops[idx] = loop
}()
}
wg.Wait()
d.Loops = loops
// 按 Timestamp 排序(最早的在前)
sort.Slice(d.Loops, func(i, j int) bool {
return d.Loops[i].Index < d.Loops[j].Index
})
for _, loop := range d.Loops {
if loop.HasFault {
recordLoopFaults(cuid, uint(loop.Index+1), loop.V, loop.Faults)
}
}
rpc.WriteResult(d)
}
func joinLoopFaultMessages(faults []m9z.LoopFault) string {
messages := make([]string, 0, len(faults))
for _, fault := range faults {
if fault.Message != "" {
messages = append(messages, fault.Message)
}
}
return strings.Join(messages, "")
}
func joinLoopFaultCodes(faults []m9z.LoopFault) string {
codes := make([]string, 0, len(faults))
for _, fault := range faults {
if fault.Code != "" {
codes = append(codes, fault.Code)
}
}
return strings.Join(codes, ",")
}
// 获取设备的配置
func getDeviceConfig(rpc towgo.JsonRpcConnection) {
cuid, _ := getDeviceId(rpc)
read, err := m9z.DeviceConfigRead(cuid)
if err != nil {
panic(err)
}
rpc.WriteResult(read)
}
// 获取日出日落时间
func getDeviceSunRiseTime(rpc towgo.JsonRpcConnection) {
cuid, _ := getDeviceId(rpc)
read, err := m9z.SunRiseTimeRead(cuid)
if err != nil {
panic(err)
}
rpc.WriteResult(read)
}
// 读取开始任务 (优化指令 CMD=0x13)
func getStartTask(rpc towgo.JsonRpcConnection) {
var p struct {
CommUid string `json:"comm_uid"`
Mode uint8 `json:"mode"` // 0x00-0x02
}
rpc.ReadParams(&p)
if p.CommUid == "" {
panic(gerror.New("comm_uid is empty"))
}
read, err := m9z.StartTaskRead(p.CommUid, p.Mode)
if err != nil {
panic(err)
}
/*program, err := m9z.ControlTaskToTaskProgram(m9z.DefaultStopTask, p.Mode)
if err != nil {
panic(err)
}*/
/*err = m9z.StartTaskWriteByTaskCfg(p.CommUid, p.Mode, m9z.DefaultStartTask)
if err != nil {
panic(err)
}*/
rpc.WriteResult(read)
}
// 读取中间任务 (优化指令 CMD=0x14)
func getMiddleTaskRead(rpc towgo.JsonRpcConnection) {
var p struct {
CommUid string `json:"comm_uid"`
Mode uint8 `json:"mode"` // 0x00-0x02
}
rpc.ReadParams(&p)
if p.CommUid == "" {
panic(gerror.New("comm_uid is empty"))
}
read, err := m9z.MiddleTaskRead(p.CommUid, p.Mode)
if err != nil {
panic(err)
}
rpc.WriteResult(read)
}
// 读取结束任务 (优化指令 CMD=0x15)
func getStopTaskRead(rpc towgo.JsonRpcConnection) {
var p struct {
CommUid string `json:"comm_uid"`
Mode uint8 `json:"mode"` // 0x00-0x02
}
rpc.ReadParams(&p)
if p.CommUid == "" {
panic(gerror.New("comm_uid is empty"))
}
read, err := m9z.StopTaskRead(p.CommUid, p.Mode)
if err != nil {
panic(err)
}
rpc.WriteResult(read)
}
func getStartTask2(rpc towgo.JsonRpcConnection) {
var p struct {
CommUid string `json:"comm_uid"`
Mode uint8 `json:"mode"` // 0x00-0x02
}
rpc.ReadParams(&p)
if p.CommUid == "" {
panic(gerror.New("comm_uid is empty"))
}
read, err := m9z.StartTaskRead(p.CommUid, p.Mode)
if err != nil {
panic(gerror.Wrap(err, ""))
}
task, err := m9z.TaskProgramToControlTask(read)
if err != nil {
panic(err)
}
if task.TimeType == 1 {
timeRead, err := m9z.SunRiseTimeRead(p.CommUid)
if err != nil {
panic(err)
}
task.ExecTime = timeRead.Sunrise
}
rpc.WriteResult(task)
}
func getStopTask2(rpc towgo.JsonRpcConnection) {
var p struct {
CommUid string `json:"comm_uid"`
Mode uint8 `json:"mode"` // 0x00-0x02
}
rpc.ReadParams(&p)
if p.CommUid == "" {
panic(gerror.New("comm_uid is empty"))
}
read, err := m9z.StopTaskRead(p.CommUid, p.Mode)
if err != nil {
panic(err)
}
task, err := m9z.TaskProgramToControlTask(read)
if err != nil {
panic(err)
}
if task.TimeType == 1 {
timeRead, err := m9z.SunRiseTimeRead(p.CommUid)
if err != nil {
panic(err)
}
task.ExecTime = timeRead.Sunset
}
rpc.WriteResult(task)
}
func getMiddleTask2(rpc towgo.JsonRpcConnection) {
var p struct {
CommUid string `json:"comm_uid"`
Mode uint8 `json:"mode"` // 0x00-0x02
}
rpc.ReadParams(&p)
if p.CommUid == "" {
panic(gerror.New("comm_uid is empty"))
}
read, err := m9z.MiddleTaskRead(p.CommUid, p.Mode)
if err != nil {
panic(err)
}
/*program, err := m9z.MiddleControlTaskToTaskProgram(m9z.DefaultMiddleTask, p.Mode)
if err != nil {
panic(err)
}*/
task, err := m9z.TaskProgramToMiddleControlTask(read)
if err != nil {
panic(err)
}
rpc.WriteResult(task)
}
func getSubLoopParameters(rpc towgo.JsonRpcConnection) {
var p struct {
CommUid string `json:"comm_uid"`
Idx uint `json:"idx"`
}
rpc.ReadParams(&p)
if p.CommUid == "" {
panic(gerror.New("comm_uid is empty"))
}
r, err := m9z.SubLoopParametersRead(p.CommUid, p.Idx)
if err != nil {
panic(err)
}
rpc.WriteResult(r)
}
func getAllSubLoopParameter(rpc towgo.JsonRpcConnection) {
var p struct {
CommUid string `json:"comm_uid"`
}
rpc.ReadParams(&p)
if p.CommUid == "" {
panic(gerror.New("comm_uid is empty"))
}
result := make(map[string]interface{})
subLoopData := make([]*m9z.LoopFullParameters, 0)
subLoopMap := make(map[string]*m9z.LoopFullParameters)
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
subLoop, err := m9z.SubLoopParametersRead(p.CommUid, uint(i))
if err != nil || subLoop == nil {
return
}
subLoopMap[subLoop.LoopAddress] = subLoop
}()
}
wg.Wait()
for _, v := range subLoopMap {
subLoopData = append(subLoopData, v)
}
result["subLoopData"] = subLoopData
totalP := 0.0
for _, subLoop := range subLoopData {
totalP = totalP + float64(subLoop.DCVoltage*subLoop.DCCurrent)
}
result["totalP"] = totalP
rpc.WriteResult(result)
}