chore: upload current project state
This commit is contained in:
+226
-1
@@ -9,11 +9,191 @@ import (
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Area 检测区域结构体
|
||||
type Area struct {
|
||||
ID int `json:"id"`
|
||||
Pts []Point `json:"pts"`
|
||||
}
|
||||
|
||||
// Point 坐标点结构体
|
||||
type Point struct {
|
||||
X float64 `json:"x"`
|
||||
Y float64 `json:"y"`
|
||||
}
|
||||
|
||||
// 新的配置结构体
|
||||
|
||||
// ServiceConfig 服务配置结构体
|
||||
type ServiceConfig struct {
|
||||
HostUUID string `json:"host_uuid"`
|
||||
DeviceUUID string `json:"device_uuid"`
|
||||
Address string `json:"address"`
|
||||
TaskID string `json:"task_id"`
|
||||
CameraRTSP string `json:"camera_rtsp"`
|
||||
CameraIP string `json:"camera_ip"`
|
||||
Confidence int `json:"confidence"`
|
||||
DetectArea DetectAreaConfig `json:"detect_area"`
|
||||
Param ParamConfig `json:"param"`
|
||||
}
|
||||
|
||||
// DetectAreaConfig 检测区域配置
|
||||
type DetectAreaConfig struct {
|
||||
FireLeave []Area `json:"fire_leave"`
|
||||
FireCheck []Area `json:"fire_check"`
|
||||
}
|
||||
|
||||
// ParamConfig 参数配置
|
||||
type ParamConfig struct {
|
||||
FireCheck FireCheckParam `json:"fire_check"`
|
||||
FireLeave FireLeaveParam `json:"fire_leave"`
|
||||
}
|
||||
|
||||
// FireCheckParam 火检参数
|
||||
type FireCheckParam struct {
|
||||
Confidence string `json:"confidence"`
|
||||
DetectionTime string `json:"detection_time"`
|
||||
}
|
||||
|
||||
// FireLeaveParam 离岗参数
|
||||
type FireLeaveParam struct {
|
||||
PersonCount string `json:"person_count"`
|
||||
Confidence string `json:"confidence"`
|
||||
DetectionTime string `json:"detection_time"`
|
||||
TemperatureThreshold string `json:"temperature_threshold"`
|
||||
AlarmTime string `json:"alarm_time"`
|
||||
}
|
||||
|
||||
var (
|
||||
devicesBaseDir = "/data/devices"
|
||||
deviceDataList []DeviceData
|
||||
serviceConfigFile = "/usr/local/etc/service.conf"
|
||||
)
|
||||
|
||||
// LoadServiceConfig loads multiple device data from service config file
|
||||
func LoadServiceConfig() ([]DeviceData, error) {
|
||||
if _, err := os.Stat(serviceConfigFile); os.IsNotExist(err) {
|
||||
logger.Logger.Printf("Service config file does not exist: %s", serviceConfigFile)
|
||||
return nil, fmt.Errorf("service config file does not exist")
|
||||
}
|
||||
|
||||
data, err := os.ReadFile(serviceConfigFile)
|
||||
if err != nil {
|
||||
logger.Logger.Printf("Failed to read service config file: %v", err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Check if file content is empty
|
||||
if len(data) == 0 {
|
||||
logger.Logger.Printf("Service config file is empty")
|
||||
return nil, fmt.Errorf("service config file is empty")
|
||||
}
|
||||
|
||||
// Parse as ServiceConfig array
|
||||
var serviceConfigs []ServiceConfig
|
||||
if err := json.Unmarshal(data, &serviceConfigs); err != nil {
|
||||
logger.Logger.Printf("Failed to parse service config file: %v", err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Convert ServiceConfig to DeviceData
|
||||
var deviceDataList []DeviceData
|
||||
const FixedUploadURL = "http://192.168.80.168/api/v1/upload/video"
|
||||
|
||||
for _, config := range serviceConfigs {
|
||||
// Create DeviceData from ServiceConfig
|
||||
deviceData := DeviceData{
|
||||
DeviceUUID: config.DeviceUUID,
|
||||
TaskID: config.TaskID,
|
||||
CameraRTSP: config.CameraRTSP,
|
||||
CameraIP: config.CameraIP,
|
||||
Confidence: config.Confidence,
|
||||
HostUUID: config.HostUUID,
|
||||
Address: config.Address,
|
||||
UploadURL: FixedUploadURL,
|
||||
// Set new fields for new configuration format
|
||||
FireLeaveDetectArea: config.DetectArea.FireLeave,
|
||||
FireCheckDetectArea: config.DetectArea.FireCheck,
|
||||
FireLeaveParam: config.Param.FireLeave,
|
||||
FireCheckParam: config.Param.FireCheck,
|
||||
}
|
||||
|
||||
// Parse and set temperature threshold from FireLeaveParam
|
||||
if tempThresholdStr := config.Param.FireLeave.TemperatureThreshold; tempThresholdStr != "" {
|
||||
var tempThreshold float64
|
||||
if _, err := fmt.Sscanf(tempThresholdStr, "%f", &tempThreshold); err == nil && tempThreshold > 0 {
|
||||
deviceData.TemperatureThreshold = tempThreshold
|
||||
logger.Logger.Printf("Set temperature threshold from config: %.1f°C (DeviceUUID=%s)", tempThreshold, config.DeviceUUID)
|
||||
}
|
||||
}
|
||||
|
||||
// Filter out configurations with empty DeviceUUID
|
||||
if deviceData.DeviceUUID != "" {
|
||||
deviceDataList = append(deviceDataList, deviceData)
|
||||
}
|
||||
}
|
||||
|
||||
if len(deviceDataList) == 0 {
|
||||
logger.Logger.Printf("No valid device configurations found in service config file")
|
||||
return nil, fmt.Errorf("no valid device configurations")
|
||||
}
|
||||
|
||||
logger.Logger.Printf("Loaded %d device configurations from service config file", len(deviceDataList))
|
||||
return deviceDataList, nil
|
||||
}
|
||||
|
||||
// ProcessDetectAreaForInference processes detection area data, converts to format required by inference program
|
||||
func ProcessDetectAreaForInference(areas []Area) string {
|
||||
if len(areas) == 0 {
|
||||
return ""
|
||||
}
|
||||
|
||||
// Only take the first detection area
|
||||
area := areas[0]
|
||||
var points []string
|
||||
|
||||
for _, point := range area.Pts {
|
||||
// Directly round, remove decimals
|
||||
x := int(point.X)
|
||||
y := int(point.Y)
|
||||
points = append(points, fmt.Sprintf("%d,%d", x, y))
|
||||
}
|
||||
|
||||
return strings.Join(points, ",")
|
||||
}
|
||||
|
||||
// ProcessDeviceDataForInference processes device data, converts to format required by inference program
|
||||
func ProcessDeviceDataForInference(data DeviceData) DeviceData {
|
||||
// Create a copy, only process fields that need conversion
|
||||
processed := data
|
||||
|
||||
// For backward compatibility, process original DetectArea if FireLeaveDetectArea is empty
|
||||
if len(data.FireLeaveDetectArea) > 0 {
|
||||
processed.DetectAreaStr = ProcessDetectAreaForInference(data.FireLeaveDetectArea)
|
||||
} else {
|
||||
processed.DetectAreaStr = ProcessDetectAreaForInference(data.DetectArea)
|
||||
}
|
||||
|
||||
return processed
|
||||
}
|
||||
|
||||
// ProcessFireLeaveDataForInference processes device data for fire_leave inference
|
||||
func ProcessFireLeaveDataForInference(data DeviceData) DeviceData {
|
||||
processed := data
|
||||
if len(data.FireLeaveDetectArea) > 0 {
|
||||
processed.DetectAreaStr = ProcessDetectAreaForInference(data.FireLeaveDetectArea)
|
||||
}
|
||||
return processed
|
||||
}
|
||||
|
||||
// ProcessFireCheckDataForInference processes device data for fire_check inference
|
||||
func ProcessFireCheckDataForInference(data DeviceData) DeviceData {
|
||||
processed := data
|
||||
if len(data.FireCheckDetectArea) > 0 {
|
||||
processed.DetectAreaStr = ProcessDetectAreaForInference(data.FireCheckDetectArea)
|
||||
}
|
||||
return processed
|
||||
}
|
||||
|
||||
func InitializeDevicesFromServiceConfig() ([]DeviceData, error) {
|
||||
deviceDataMutex.Lock()
|
||||
defer deviceDataMutex.Unlock()
|
||||
@@ -94,8 +274,10 @@ func cleanDeviceData(data DeviceData) DeviceData {
|
||||
if cleaned.Temperature < 0 {
|
||||
cleaned.Temperature = 0
|
||||
}
|
||||
if cleaned.TemperatureThreshold <= 0 {
|
||||
// 只有当温度阈值真正为0时才设置默认值45.0°C,避免覆盖用户配置的值
|
||||
if cleaned.TemperatureThreshold == 0 {
|
||||
cleaned.TemperatureThreshold = 45.0
|
||||
logger.Logger.Printf("Set default temperature threshold: 45.0°C (DeviceUUID=%s)", cleaned.DeviceUUID)
|
||||
}
|
||||
|
||||
return cleaned
|
||||
@@ -195,3 +377,46 @@ func UpdateDeviceData(data DeviceData) error {
|
||||
logger.Logger.Printf("Device data update completed: DeviceUUID=%s", cleanedData.DeviceUUID)
|
||||
return nil
|
||||
}
|
||||
|
||||
// SaveServiceConfig saves multiple device configurations to service config file
|
||||
func SaveServiceConfig(deviceDataList []DeviceData) error {
|
||||
configData, err := json.MarshalIndent(deviceDataList, "", " ")
|
||||
if err != nil {
|
||||
logger.Logger.Printf("Failed to serialize service configuration: %v", err)
|
||||
return err
|
||||
}
|
||||
|
||||
if err := os.WriteFile(serviceConfigFile, configData, 0644); err != nil {
|
||||
logger.Logger.Printf("Failed to write service config file: %v", err)
|
||||
return err
|
||||
}
|
||||
|
||||
logger.Logger.Printf("Service configuration saved to: %s, %d devices", serviceConfigFile, len(deviceDataList))
|
||||
return nil
|
||||
}
|
||||
|
||||
// SaveSingleServiceConfig saves single device configuration (compatible with existing calls)
|
||||
func SaveSingleServiceConfig(deviceData DeviceData) error {
|
||||
// First read existing configuration
|
||||
existingConfigs, err := LoadServiceConfig()
|
||||
if err != nil {
|
||||
// If reading fails, create new configuration list
|
||||
existingConfigs = []DeviceData{deviceData}
|
||||
} else {
|
||||
// Find if configuration with same DeviceUUID already exists
|
||||
found := false
|
||||
for i, existing := range existingConfigs {
|
||||
if existing.DeviceUUID == deviceData.DeviceUUID {
|
||||
existingConfigs[i] = deviceData
|
||||
found = true
|
||||
break
|
||||
}
|
||||
}
|
||||
// If not exists, add to list
|
||||
if !found {
|
||||
existingConfigs = append(existingConfigs, deviceData)
|
||||
}
|
||||
}
|
||||
|
||||
return SaveServiceConfig(existingConfigs)
|
||||
}
|
||||
|
||||
+66
-16
@@ -4,10 +4,12 @@ import (
|
||||
"fmt"
|
||||
"os"
|
||||
"os/exec"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"FireLeave_tool/logger"
|
||||
"FireLeave_tool/portmanager"
|
||||
)
|
||||
|
||||
var (
|
||||
@@ -20,7 +22,12 @@ var (
|
||||
// UpdateInferenceHeartbeat 每收到一帧 /video/post 就调用这个
|
||||
func UpdateInferenceHeartbeat(deviceUUID string) {
|
||||
inferenceLastHeartbeat.Store(deviceUUID, time.Now())
|
||||
|
||||
// 输出心跳日志
|
||||
if strings.Contains(deviceUUID, "_fire_check") {
|
||||
logger.Logger.Printf("♥ 推理心跳收到 | 时间: %s | UUID: %s | 类型: fire_check", time.Now().Format("2006/01/02 15:04:05.000"), deviceUUID)
|
||||
} else {
|
||||
logger.Logger.Printf("♥ 推理心跳收到 | 时间: %s | UUID: %s | 类型: fire_leave", time.Now().Format("2006/01/02 15:04:05.000"), deviceUUID)
|
||||
}
|
||||
}
|
||||
|
||||
// ShouldRestartInference 判断是否需要重启推理程序
|
||||
@@ -48,41 +55,84 @@ func StopInferenceProcess(deviceUUID string) {
|
||||
// StartInferenceProcess 重启推理程序(保持原端口!)
|
||||
func StartInferenceProcess(deviceData *DeviceData) {
|
||||
|
||||
// 重启fire_leave推理程序
|
||||
StopInferenceProcess(deviceData.DeviceUUID)
|
||||
|
||||
port, err := GlobalPortManager.GetPort(deviceData.DeviceUUID)
|
||||
portFireLeave, err := portmanager.GlobalPortManager.GetPort(deviceData.DeviceUUID)
|
||||
if err != nil {
|
||||
logger.Logger.Printf("获取端口失败,无法重启推理程序 (DeviceUUID=%s): %v", deviceData.DeviceUUID, err)
|
||||
logger.Logger.Printf("获取fire_leave端口失败,无法重启推理程序 (DeviceUUID=%s): %v", deviceData.DeviceUUID, err)
|
||||
return
|
||||
}
|
||||
|
||||
detectAreaStr := ProcessDetectAreaForInference(deviceData.DetectArea)
|
||||
// 重启fire_check推理程序
|
||||
StopInferenceProcess(fmt.Sprintf("%s_fire_check", deviceData.DeviceUUID))
|
||||
|
||||
inferenceCmd := exec.Command(
|
||||
portFireCheck, err := portmanager.GlobalPortManager.GetPort(fmt.Sprintf("%s_fire_check", deviceData.DeviceUUID))
|
||||
if err != nil {
|
||||
logger.Logger.Printf("获取fire_check端口失败,无法重启推理程序 (DeviceUUID=%s): %v", deviceData.DeviceUUID, err)
|
||||
return
|
||||
}
|
||||
|
||||
// 为fire_leave推理程序获取检测区域
|
||||
fireLeaveDetectAreaStr := ProcessDetectAreaForInference(deviceData.FireLeaveDetectArea)
|
||||
|
||||
// 启动fire_leave推理程序
|
||||
inferenceCmdFireLeave := exec.Command(
|
||||
"./yolov5",
|
||||
"-s", deviceData.CameraRTSP,
|
||||
"-m", "model",
|
||||
"-c", deviceData.DeviceUUID,
|
||||
"-p", fmt.Sprintf("%d", port),
|
||||
"-w", detectAreaStr,
|
||||
"-p", fmt.Sprintf("%d", portFireLeave),
|
||||
"-w", fireLeaveDetectAreaStr,
|
||||
"-r", fmt.Sprintf("%d", deviceData.Confidence),
|
||||
)
|
||||
|
||||
inferenceCmd.Stdout = os.Stdout
|
||||
inferenceCmd.Stderr = os.Stderr
|
||||
inferenceCmdFireLeave.Stdout = os.Stdout
|
||||
inferenceCmdFireLeave.Stderr = os.Stderr
|
||||
|
||||
logger.Logger.Printf("正在重启推理程序 (使用原端口 %d): %v", port, inferenceCmd.Args)
|
||||
logger.Logger.Printf("正在重启fire_leave推理程序 (使用原端口 %d): %v", portFireLeave, inferenceCmdFireLeave.Args)
|
||||
|
||||
if err := inferenceCmd.Start(); err != nil {
|
||||
logger.Logger.Printf("推理程序重启失败 (DeviceUUID=%s): %v", deviceData.DeviceUUID, err)
|
||||
if err := inferenceCmdFireLeave.Start(); err != nil {
|
||||
logger.Logger.Printf("fire_leave推理程序重启失败 (DeviceUUID=%s): %v", deviceData.DeviceUUID, err)
|
||||
return
|
||||
}
|
||||
|
||||
// 保存进程对象
|
||||
InferenceProcesses.Store(deviceData.DeviceUUID, inferenceCmd)
|
||||
logger.Logger.Printf("推理程序已成功重启,PID=%d (DeviceUUID=%s, Port=%d)",
|
||||
inferenceCmd.Process.Pid, deviceData.DeviceUUID, port)
|
||||
// 保存fire_leave进程对象
|
||||
InferenceProcesses.Store(deviceData.DeviceUUID, inferenceCmdFireLeave)
|
||||
logger.Logger.Printf("fire_leave推理程序已成功重启,PID=%d (DeviceUUID=%s, Port=%d)",
|
||||
inferenceCmdFireLeave.Process.Pid, deviceData.DeviceUUID, portFireLeave)
|
||||
|
||||
// 为fire_check推理程序获取检测区域
|
||||
fireCheckDetectAreaStr := ProcessDetectAreaForInference(deviceData.FireCheckDetectArea)
|
||||
|
||||
// 启动fire_check推理程序
|
||||
inferenceCmdFireCheck := exec.Command(
|
||||
"./yolov5",
|
||||
"-s", deviceData.CameraRTSP,
|
||||
"-m", "fire_check",
|
||||
"-c", fmt.Sprintf("%s_fire_check", deviceData.DeviceUUID),
|
||||
"-p", fmt.Sprintf("%d", portFireCheck),
|
||||
"-w", fireCheckDetectAreaStr,
|
||||
"-r", fmt.Sprintf("%d", deviceData.Confidence),
|
||||
"-R",
|
||||
)
|
||||
|
||||
inferenceCmdFireCheck.Stdout = os.Stdout
|
||||
inferenceCmdFireCheck.Stderr = os.Stderr
|
||||
|
||||
logger.Logger.Printf("正在重启fire_check推理程序 (使用原端口 %d): %v", portFireCheck, inferenceCmdFireCheck.Args)
|
||||
|
||||
if err := inferenceCmdFireCheck.Start(); err != nil {
|
||||
logger.Logger.Printf("fire_check推理程序重启失败 (DeviceUUID=%s): %v", deviceData.DeviceUUID, err)
|
||||
return
|
||||
}
|
||||
|
||||
// 保存fire_check进程对象
|
||||
InferenceProcesses.Store(fmt.Sprintf("%s_fire_check", deviceData.DeviceUUID), inferenceCmdFireCheck)
|
||||
logger.Logger.Printf("fire_check推理程序已成功重启,PID=%d (DeviceUUID=%s, Port=%d)",
|
||||
inferenceCmdFireCheck.Process.Pid, deviceData.DeviceUUID, portFireCheck)
|
||||
|
||||
// 重启后立即刷新一次心跳,防止 30s 检测又触发
|
||||
UpdateInferenceHeartbeat(deviceData.DeviceUUID)
|
||||
UpdateInferenceHeartbeat(fmt.Sprintf("%s_fire_check", deviceData.DeviceUUID))
|
||||
}
|
||||
|
||||
+6
-130
@@ -4,8 +4,6 @@ import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
@@ -49,9 +47,7 @@ func (c *WSClient) IsConnected() bool {
|
||||
return c.connected
|
||||
}
|
||||
|
||||
const (
|
||||
serviceConfigFile = "/usr/local/etc/service.conf"
|
||||
)
|
||||
|
||||
|
||||
// DeviceData struct
|
||||
type DeviceData struct {
|
||||
@@ -74,6 +70,11 @@ type DeviceData struct {
|
||||
AlarmPauseUntil int64 `json:"-"` // Pause alarm untilw
|
||||
HostUUID string `json:"host_uuid"`
|
||||
Address string `json:"address"`
|
||||
// New fields for new configuration format
|
||||
FireLeaveDetectArea []Area `json:"fire_leave_detect_area,omitempty"`
|
||||
FireCheckDetectArea []Area `json:"fire_check_detect_area,omitempty"`
|
||||
FireLeaveParam FireLeaveParam `json:"fire_leave_param,omitempty"`
|
||||
FireCheckParam FireCheckParam `json:"fire_check_param,omitempty"`
|
||||
}
|
||||
|
||||
type InferenceParams struct {
|
||||
@@ -85,16 +86,6 @@ type InferenceParams struct {
|
||||
Port int `json:"port"` // HTTP server port
|
||||
}
|
||||
|
||||
type Area struct {
|
||||
ID int `json:"id"`
|
||||
Pts []Point `json:"pts"`
|
||||
}
|
||||
|
||||
type Point struct {
|
||||
X float64 `json:"x"`
|
||||
Y float64 `json:"y"`
|
||||
}
|
||||
|
||||
// WSMessage struct
|
||||
type WSMessage struct {
|
||||
ID int64 `json:"id,omitempty"`
|
||||
@@ -584,126 +575,11 @@ func (d *DeviceData) ToInferenceParams(port int) InferenceParams {
|
||||
}
|
||||
}
|
||||
|
||||
// SaveServiceConfig saves multiple device configurations to service config file
|
||||
func SaveServiceConfig(deviceDataList []DeviceData) error {
|
||||
configData, err := json.MarshalIndent(deviceDataList, "", " ")
|
||||
if err != nil {
|
||||
logger.Logger.Printf("Failed to serialize service configuration: %v", err)
|
||||
return err
|
||||
}
|
||||
|
||||
if err := os.WriteFile(serviceConfigFile, configData, 0644); err != nil {
|
||||
logger.Logger.Printf("Failed to write service config file: %v", err)
|
||||
return err
|
||||
}
|
||||
|
||||
logger.Logger.Printf("Service configuration saved to: %s, %d devices", serviceConfigFile, len(deviceDataList))
|
||||
return nil
|
||||
}
|
||||
|
||||
// SaveSingleServiceConfig saves single device configuration (compatible with existing calls)
|
||||
func SaveSingleServiceConfig(deviceData DeviceData) error {
|
||||
// First read existing configuration
|
||||
existingConfigs, err := LoadServiceConfig()
|
||||
if err != nil {
|
||||
// If reading fails, create new configuration list
|
||||
existingConfigs = []DeviceData{deviceData}
|
||||
} else {
|
||||
// Find if configuration with same DeviceUUID already exists
|
||||
found := false
|
||||
for i, existing := range existingConfigs {
|
||||
if existing.DeviceUUID == deviceData.DeviceUUID {
|
||||
existingConfigs[i] = deviceData
|
||||
found = true
|
||||
break
|
||||
}
|
||||
}
|
||||
// If not exists, add to list
|
||||
if !found {
|
||||
existingConfigs = append(existingConfigs, deviceData)
|
||||
}
|
||||
}
|
||||
|
||||
return SaveServiceConfig(existingConfigs)
|
||||
}
|
||||
|
||||
// LoadServiceConfig loads multiple device data from service config file
|
||||
func LoadServiceConfig() ([]DeviceData, error) {
|
||||
if _, err := os.Stat(serviceConfigFile); os.IsNotExist(err) {
|
||||
logger.Logger.Printf("Service config file does not exist: %s", serviceConfigFile)
|
||||
return nil, fmt.Errorf("service config file does not exist")
|
||||
}
|
||||
|
||||
data, err := os.ReadFile(serviceConfigFile)
|
||||
if err != nil {
|
||||
logger.Logger.Printf("Failed to read service config file: %v", err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Check if file content is empty
|
||||
if len(data) == 0 {
|
||||
logger.Logger.Printf("Service config file is empty")
|
||||
return nil, fmt.Errorf("service config file is empty")
|
||||
}
|
||||
|
||||
// Parse as DeviceData array
|
||||
var deviceDataList []DeviceData
|
||||
if err := json.Unmarshal(data, &deviceDataList); err != nil {
|
||||
logger.Logger.Printf("Failed to parse service config file: %v", err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Filter out configurations with empty DeviceUUID
|
||||
var validDeviceDataList []DeviceData
|
||||
for _, deviceData := range deviceDataList {
|
||||
if deviceData.DeviceUUID != "" {
|
||||
validDeviceDataList = append(validDeviceDataList, deviceData)
|
||||
}
|
||||
}
|
||||
const FixedUploadURL = "http://192.168.80.168/api/v1/upload/video"
|
||||
for i := range validDeviceDataList {
|
||||
if validDeviceDataList[i].UploadURL == "" {
|
||||
validDeviceDataList[i].UploadURL = FixedUploadURL
|
||||
logger.Logger.Printf("Auto-completed UploadURL: %s (DeviceUUID=%s)",
|
||||
FixedUploadURL, validDeviceDataList[i].DeviceUUID)
|
||||
}
|
||||
}
|
||||
if len(validDeviceDataList) == 0 {
|
||||
logger.Logger.Printf("No valid device configurations found in service config file")
|
||||
return nil, fmt.Errorf("no valid device configurations")
|
||||
}
|
||||
|
||||
logger.Logger.Printf("Loaded %d device configurations from service config file", len(validDeviceDataList))
|
||||
return validDeviceDataList, nil
|
||||
|
||||
}
|
||||
|
||||
// ProcessDetectAreaForInference processes detection area data, converts to format required by inference program
|
||||
func ProcessDetectAreaForInference(areas []Area) string {
|
||||
if len(areas) == 0 {
|
||||
return ""
|
||||
}
|
||||
|
||||
// Only take the first detection area
|
||||
area := areas[0]
|
||||
var points []string
|
||||
|
||||
for _, point := range area.Pts {
|
||||
// Directly round, remove decimals
|
||||
x := int(point.X)
|
||||
y := int(point.Y)
|
||||
points = append(points, fmt.Sprintf("%d,%d", x, y))
|
||||
}
|
||||
|
||||
return strings.Join(points, ",")
|
||||
}
|
||||
|
||||
func ProcessDeviceDataForInference(data DeviceData) DeviceData {
|
||||
// Create a copy, only process fields that need conversion
|
||||
processed := data
|
||||
processed.DetectAreaStr = ProcessDetectAreaForInference(data.DetectArea)
|
||||
return processed
|
||||
}
|
||||
|
||||
func (c *WSClient) SendAsync(message interface{}) {
|
||||
go func() {
|
||||
|
||||
Reference in New Issue
Block a user