Просмотр исходного кода

修正任务同时触发异常的问题

root 3 недель назад
Родитель
Сommit
105576a592

+ 1 - 2
cmd/main.go

@@ -20,7 +20,6 @@ func main() {
 	initVersion()
 
 	// 解析配置文件
-	configs.ConfigPath = "/data/test/configs/config.yaml"
 	configs.DecodeConfig()
 
 	configs.ConfigGlobal.LogLevel = logrus.InfoLevel
@@ -64,7 +63,7 @@ func main() {
 		lfshook.NewLogger().Logger.SetReportCaller(true)
 
 	}
-
+	utils.InitLog()
 	app.StartApp()
 	utils.Exit()
 	//return nil

+ 109 - 2
internal/app/ami/action/call.go

@@ -149,7 +149,7 @@ func InterruptRunningTask(toRunTask string) string {
 			return ""
 		}
 	}
-
+	utils.LoggerDebug.Printf("InterruptRunningTask  RunningTask:%+v", taskName)
 	lfshook.NewLogger().Infof("InterruptRunningTask RunningTask:%+v  ", task)
 	//same type return
 	if toRunTask == taskName {
@@ -681,6 +681,7 @@ func CPAConfbridgeKick(confnum string) (res map[string]string, err error) {
 }
 
 func CPAConfbridgeReinvite(confID string) {
+	utils.LoggerDebug.Printf("CPA CPAConfbridgeReinvite , resume CPA .")
 	time.Sleep(time.Millisecond * 500)
 	for _, ext := range Speakers {
 		ConfbridgeReinvite(ext, "call-speakers-cpa", confID)
@@ -703,7 +704,7 @@ func EMGConfbridgeKick(confnum string) (res map[string]string, err error) {
 }
 
 func EMGConfbridgeReinvite(confID string) {
-
+	utils.LoggerDebug.Printf("EMG ConfbridgeReinvite , resume EMG .")
 	time.Sleep(time.Millisecond * 500)
 	for _, ext := range Speakers {
 		ConfbridgeReinvite(ext, "call-speakers-emg", confID)
@@ -791,3 +792,109 @@ func ICPConfbridgeReinvite(confID, paType string) {
 
 	}
 }
+
+// 设置全局变量控制任务创建过程,避免被其他任务打乱任务创建过程
+func WaitTaskCreate(task string, args ...string) { //arg1(task chan)
+	utils.LoggerDebug.Printf("%s check task creating ..... ", task)
+
+	switch priority.TaskCreating {
+	case "C2C":
+		if /*task == "PA" ||*/ task == "CPA" {
+			//获取正在创建的任务的优先级
+			priorityC2C := priority.GetPriorityByKey("C2C")
+			//获取将要创建的任务的优先级
+			priorityTask := priority.GetPriorityByKey(task)
+			//比较优先级,确定是否终止正在创建的任务
+
+			if priorityC2C < priorityTask {
+				utils.LoggerDebug.Printf("%s check task C2C creating , hangup CPA %s ", task, args[0])
+
+				//结束task(CPA)
+				if len(args) > 0 {
+					Hangup(args[0])
+					goto DELAY
+				}
+			} else {
+				//结束C2C,PA 则不需要挂断ICP(由ICP自行处理优先级)
+				utils.LoggerDebug.Printf("%s check task C2C creating , hangup C2C ICPs ", task)
+				HangupICP()
+				goto DELAY
+			}
+		}
+		return
+	case "CPA":
+		if task == "PA" || task == "C2C" {
+			//获取正在创建的任务的优先级
+			priorityCPA := priority.GetPriorityByKey("CPA")
+			//获取将要创建的任务的优先级
+			priorityTask := priority.GetPriorityByKey(task)
+			//比较优先级,确定是否终止正在创建的任务
+
+			if priorityCPA < priorityTask {
+				utils.LoggerDebug.Printf("%s check task CPA creating , hangup %s %s", task, task, args[0])
+				//结束task(PA,CPA)
+				if len(args) > 0 {
+					Hangup(args[0])
+					goto DELAY
+				}
+			} else {
+				//结束CPA,获取CPA通道
+				if active.ActivedCab == "1" {
+					utils.LoggerDebug.Printf("%s check task  creating , hangup CPA %s ", task, args[0])
+					Hangup("1481")
+					goto DELAY
+				} else if active.ActivedCab == "8" {
+					utils.LoggerDebug.Printf("%s check task C2C creating , hangup CPA %s ", task, args[0])
+					Hangup("1411")
+					goto DELAY
+				}
+			}
+		}
+		return
+	case "PA":
+		if task == "CPA" /*|| task == "C2C"*/ {
+			//获取正在创建的任务的优先级
+			priorityPA := priority.GetPriorityByKey("PA")
+			//获取将要创建的任务的优先级
+			priorityTask := priority.GetPriorityByKey(task)
+			//比较优先级,确定是否终止正在创建的任务
+
+			if priorityPA < priorityTask {
+				utils.LoggerDebug.Printf("%s check task PA creating , hangup CPA %s ", task, args[0])
+				//结束task(CPA)
+				if len(args) > 0 {
+					Hangup(args[0])
+					goto DELAY
+				}
+			} else {
+				//结束PA,获取PA通道
+				if active.ActivedCab == "1" {
+					utils.LoggerDebug.Printf("%s check task PA creating , hangup PA %s ", task, "2311")
+					Hangup("2311")
+					goto DELAY
+				} else if active.ActivedCab == "8" {
+					utils.LoggerDebug.Printf("%s check task PA creating , hangup PA %s ", task, "2381")
+					Hangup("2381")
+					goto DELAY
+				}
+			}
+		}
+		return
+	case "*":
+		for i := 0; i < 4; i++ {
+			if priority.TaskCreating != "" {
+				utils.LoggerDebug.Printf("%s waiting previous task:%s creating ..... ", task, priority.TaskCreating)
+				time.Sleep(time.Millisecond * 500)
+			} else {
+				priority.TaskCreating = task
+				return
+			}
+		}
+		priority.TaskCreating = task
+		utils.LoggerDebug.Printf("%s waiting previous task:%s creating timeout ! Set TaskCreating=%s", task, priority.TaskCreating, task)
+		return
+	}
+
+DELAY:
+	time.Sleep(100 * time.Millisecond)
+}

+ 185 - 158
internal/app/ami/action/index.go

@@ -35,14 +35,14 @@ func HandleAMI(event map[string]string) {
 			switch event["Digit"] {
 			case "#":
 				//lfshook.NewLogger().Infof("===PA interrupt PAD====== ")
-
+				utils.LoggerDebug.Printf("Get DTMF '#', PA interrupt other !")
 				runningTaskName := InterruptRunningTask("PA")
 				if runningTaskName != "" {
 					time.Sleep(time.Millisecond * 200) //wait endpoint release
 				}
 			case "*": //Cab cab interrupt PAD
-				lfshook.NewLogger().Infof("===Cab cab interrupt PAD and====== ")
-
+				//lfshook.NewLogger().Infof("===Cab cab interrupt PAD and====== ")
+				utils.LoggerDebug.Printf("Get DTMF '*', CabCab interrupt other !")
 				runningTaskName := InterruptRunningTask("C2C")
 				//Hangup("2311")
 				//Hangup("2381")
@@ -56,6 +56,7 @@ func HandleAMI(event map[string]string) {
 		lfshook.NewLogger().Infof("========event:%s   File:%s", event["Event"], event["FILENAME"])
 
 		if event["UserEvent"] == "CONTINUE" && event["Type"] != "" {
+			utils.LoggerDebug.Printf("Get UserEvent Type=CONTINUE , Send %s continue status !", event["Type"])
 			alstatus.PaStatus("", event["Type"], "continue")
 			return
 		}
@@ -63,20 +64,19 @@ func HandleAMI(event map[string]string) {
 		if event["UserEvent"] == "CallType" && (event["Type"] == "PA" || event["Type"] == "CPA") { //PA start; check manual PA priority
 			//PA & CPA interrupt others
 			if utils.IsICP(event["CallerIDNum"]) { //PA
-
+				utils.LoggerDebug.Printf("Get UserEvent , %s calling !", event["Type"])
 				if active.ActivedCab == "" { //No active Signal on both side,Hangup caller
 					Hangup(event["CallerIDNum"])
 				}
 
-				active.WaitTaskCreate("PA")
-				if active.TaskCreating == "" {
-					active.TaskCreating = "PA"
-				}
+				WaitTaskCreate("PA", event["CallerIDNum"])
 
 				if priority.CheckPriority("ManuPa") {
 
 					//hangup others if priority is higher
-					lfshook.NewLogger().Infof("UserEvent event :PA start")
+					//lfshook.NewLogger().Infof("UserEvent event :PA start")
+					utils.LoggerDebug.Printf("PA calling, check priority return true !")
+
 					runningTaskName := InterruptRunningTask("PA") //PA interrupt other
 					if runningTaskName != "" {
 						time.Sleep(time.Millisecond * 100) //wait endpoint release
@@ -86,18 +86,24 @@ func HandleAMI(event map[string]string) {
 					Hangup(event["CallerIDNum"]) //lowwer priority ,hangup caller
 				}
 
-			} else if utils.IsIO(event["CallerIDNum"]) { // CPA
-				active.WaitTaskCreate("CPA")
-				if active.TaskCreating == "" {
-					active.TaskCreating = "CPA"
+				time.Sleep(2 * time.Second)
+				if priority.TaskCreating == "PA" {
+					priority.TaskCreating = ""
 				}
+			} else if utils.IsIO(event["CallerIDNum"]) { // CPA
+
+				utils.LoggerDebug.Printf("Get UserEvent , %s calling !", event["Type"])
+				WaitTaskCreate("CPA", event["CallerIDNum"])
 
 				if priority.CheckPriority("CPA") {
 
-					lfshook.NewLogger().Infof("========event:%s  ========devide:%d", event["Event"], active.TrainDevide)
+					//lfshook.NewLogger().Infof("========event:%s  ========devide:%d", event["Event"], active.TrainDevide)
+					utils.LoggerDebug.Printf("CPA calling, check priority return true !")
 					if active.TrainDevide == 1 || active.RadioFault == 1 { // 列车没有断开的情况下限制如下;列车断开之后CPA无任何限制
-						lfshook.NewLogger().Infof("===active.TrainDevide == 1 || active.RadioFault == 1====")
+						utils.LoggerDebug.Printf("TrainDevide = %d,  RadioFault = %d , CPA calling unlimit !", active.TrainDevide, active.RadioFault)
+						//lfshook.NewLogger().Infof("===active.TrainDevide == 1 || active.RadioFault == 1====")
 					} else {
+						utils.LoggerDebug.Printf("CPA calling  , ActivedCab = %s !", active.ActivedCab)
 						if active.ActivedCab == "" { //No active Signal on both side,Hangup caller
 							Hangup(event["CallerIDNum"])
 						} else if active.ActivedCab == "1" && event["CallerIDNum"] == "1411" {
@@ -113,15 +119,18 @@ func HandleAMI(event map[string]string) {
 						time.Sleep(time.Millisecond * 100) //wait endpoint release
 					}
 				} else {
+					utils.LoggerDebug.Printf("CPA calling failed , check priority return false !")
 					Hangup(event["CallerIDNum"]) //lowwer priority ,hangup caller
 				}
-			}
-		} else if event["UserEvent"] == "CallType" && event["Type"] == "C2C" { //CabCab start; check cab cab priority
 
-			active.WaitTaskCreate("C2C")
-			if active.TaskCreating == "" {
-				active.TaskCreating = "C2C"
+				time.Sleep(2 * time.Second)
+				if priority.TaskCreating == "CPA" {
+					priority.TaskCreating = ""
+				}
 			}
+		} else if event["UserEvent"] == "CallType" && event["Type"] == "C2C" { //CabCab start; check cab cab priority
+			utils.LoggerDebug.Printf("Get UserEvent , %s calling !", event["Type"])
+			WaitTaskCreate("C2C", event["CallerIDNum"])
 
 			if priority.CheckPriority("CabCab") { // interrupt OCC-PAD
 				//C2C start PAD interrupt
@@ -129,16 +138,18 @@ func HandleAMI(event map[string]string) {
 				taskName, _, ok := priority.RegistryTask.HighestPriorityRunningTask1()
 
 				lfshook.NewLogger().Infof("HighestPriorityRunningTask get task :%+v", taskName)
+				utils.LoggerDebug.Printf("C2C calling, check priority return true !")
 				if ok {
 					if taskName == "PAD-ICP" || taskName == "PAD-TMS" || taskName == "PA" {
-
+						utils.LoggerDebug.Printf("%s Start CabCab ,interrupt other  !", event["CallerIDNum"])
 						runningTaskName := InterruptRunningTask("C2C")
 						if runningTaskName != "" {
 							time.Sleep(time.Millisecond * 100) //wait endpoint release
 						}
 
 					} else {
-						lfshook.NewLogger().Infof("CabCab  hangup other the one caller %s", event["CallerIDNum"])
+						//lfshook.NewLogger().Infof("CabCab  hangup other the one caller %s", event["CallerIDNum"])
+						utils.LoggerDebug.Printf("%s Start CabCab ,check and hangup the other ICP first", event["CallerIDNum"])
 						if event["CallerIDNum"] == "2311" {
 							Hangup("2381")
 						} else {
@@ -148,37 +159,49 @@ func HandleAMI(event map[string]string) {
 				}
 
 			} else { // hangup caller; C2C start failed
-				lfshook.NewLogger().Infof("CabCab  hangup caller %s", event["CallerIDNum"])
+				//lfshook.NewLogger().Infof("CabCab  hangup caller %s", event["CallerIDNum"])
+				utils.LoggerDebug.Printf("C2C calling failed , check priority return false !")
 				Hangup(event["CallerIDNum"])
 			}
+
+			time.Sleep(2 * time.Second)
+			if priority.TaskCreating == "C2C" {
+				priority.TaskCreating = ""
+			}
+
 			break
 
 			//Get  record file name ,encode and upload
 		} else if event["UserEvent"] == "SetRecordFile" {
 
-			if configs.ConfigGlobal.ProcessRecord != "yes" {
-				break
-			}
+			if len(event["FILENAME"]) > 0 {
+				if configs.ConfigGlobal.ProcessRecord != "yes" {
+					break
+				}
 
-			//检测录音文件是否存在;最多检测5次,每次间隔1秒
-			var fileExists bool
-			for i := 0; i < 5; i++ {
-				time.Sleep(time.Second) // 等待1秒
+				//检测录音文件是否存在;最多检测5次,每次间隔1秒
+				var fileExists bool
+				for i := 0; i < 5; i++ {
+					time.Sleep(time.Second) // 等待1秒
 
-				if _, err := os.Stat(event["FILENAME"]); err == nil {
-					fileExists = true
-					//lfshook.NewLogger().Infof("File found: %s", event["FILENAME"])
-					break
-				} else if os.IsNotExist(err) {
-					//lfshook.NewLogger().Infof("File not found (attempt %d): %s", i+1, event["FILENAME"])
-				} else {
-					//lfshook.NewLogger().Infof("Error checking file: %v", err)
+					if _, err := os.Stat(event["FILENAME"]); err == nil {
+						fileExists = true
+						//lfshook.NewLogger().Infof("File found: %s", event["FILENAME"])
+						break
+					} else if os.IsNotExist(err) {
+						//lfshook.NewLogger().Infof("File not found (attempt %d): %s", i+1, event["FILENAME"])
+					} else {
+						//lfshook.NewLogger().Infof("Error checking file: %v", err)
+					}
 				}
-			}
 
-			if !fileExists { //5秒内没有生成录音文件
-				lfshook.NewLogger().Infof("File %s not found after 5 attempts", event["FILENAME"])
-				break
+				if !fileExists { //5秒内没有生成录音文件
+					//lfshook.NewLogger().Infof("File %s not found after 5 attempts", event["FILENAME"])
+					utils.LoggerDebug.Printf("Record File %s not found after 5 attempts", event["FILENAME"])
+					break
+				}
+			} else {
+				return
 			}
 
 			//获取录音文件时长,检测录音文件是否超过3min;
@@ -191,15 +214,17 @@ func HandleAMI(event map[string]string) {
 			//转wav文件的采样率到22kHz,并切割位180秒每段
 			var FileNames []string
 			if duration >= 2000 { //超过2000秒的超长文件,不处理
-				lfshook.NewLogger().Infof("Audio file time length over 2000 seconds, Ignored !")
+				//lfshook.NewLogger().Infof("Audio file time length over 2000 seconds, Ignored !")
+				utils.LoggerDebug.Printf("Audio file time length over 2000 seconds, Ignored !")
 				break
 			} else if duration < 2000 { //小于2000秒文件进行转换和切割
 				FileNames, err = utils.ConvertAndSegmentWAV(event["FILENAME"], strings.Replace(event["FILENAME"], ".wav", "", -1))
 				if err != nil {
-					lfshook.NewLogger().Infof("%s  Get duration err: %+v", event["FILENAME"], err)
+					//	lfshook.NewLogger().Infof("%s  Get duration err: %+v", event["FILENAME"], err)
+					utils.LoggerDebug.Printf("Split and convert record file failed : %+v !", err)
 					break
 				}
-				//lfshook.NewLogger().Infof("=============== File %+v found after convert", FileNames)
+				utils.LoggerDebug.Printf("Audio file split to file :%+v ", FileNames)
 			}
 
 			//执行加密操作,并将录音信息写入日志文件
@@ -210,10 +235,10 @@ func HandleAMI(event map[string]string) {
 					file := strings.Replace(filepathFull, ".wav", "", -1)
 					DstFile = fmt.Sprintf("%s-encrypted.wav", file)
 
-					//lfshook.NewLogger().Infof("Bin file====%s", DstFile)
 					err = utils.AudioFileEncode(DstFile, filepathFull)
 					if err != nil {
-						lfshook.NewLogger().Infof("Encode file: %s err: %+v", DstFile, err)
+						//lfshook.NewLogger().Infof("Encode file: %s err: %+v", DstFile, err)
+						utils.LoggerDebug.Printf("Encrypt file %s err: %+v", DstFile, err)
 						continue
 					}
 					//切割&加密之后发送生成的文件名到STC;
@@ -221,18 +246,14 @@ func HandleAMI(event map[string]string) {
 
 					trainInfo = fmt.Sprintf("TrainNumber %s  ", active.TrainNum)
 
+					utils.LoggerDebug.Printf("Write record log !")
+
 					if strings.Contains(event["FILENAME"], "PAD") {
 						_, caller, callee := utils.GetPadInfo(event["FILENAME"])
 
 						carNum := int(caller[2] - '0')
-						//carNum := 4
-						//trainInfo = fmt.Sprintf("TrainNumber %s  CarNumber %s ", active.TrainNum, active.TrainInfoMap[active.TrainNum][int(caller[2])])
-						//lfshook.NewLogger().Infof("Train info carNum===caller[2]==========:%d===============", carNum)
-
 						trainInfo = fmt.Sprintf("TrainNumber %s  CarNumber %s ", active.TrainNum, active.TrainInfoMap[active.TrainNum][carNum])
 
-						//lfshook.NewLogger().Infof("Train info=============%s===============", trainInfo)
-
 						if len(caller) == 4 && len(caller) > 0 {
 							utils.Logger.Printf("Train Information: %s, MessageType: PAD , LocationCode: %c, Connected: %s, RecordFileName:%s", trainInfo, caller[3], callee, DstFile)
 						} else {
@@ -269,37 +290,38 @@ func HandleAMI(event map[string]string) {
 				xmlFileName := strings.Replace(rcdFileName, "wav", "xml", 1)
 				xmlFilePath := path + "/" + xmlFileName
 
-				lfshook.NewLogger().Infof("Train info= xml path============%s===============", xmlFilePath)
+				//lfshook.NewLogger().Infof("Train info= xml path============%s===============", xmlFilePath)
+
+				utils.LoggerDebug.Printf("Write record info xml : %s !", xmlFilePath)
 				err := active.GenerateXML(xmlFilePath)
 				if err != nil {
-					lfshook.NewLogger().Infof("Generate recording XML err:%+v", err)
+					//lfshook.NewLogger().Infof("Generate recording XML err:%+v", err)
+					utils.LoggerDebug.Printf("Write record info xml : %s ERR: %+v ", xmlFilePath, err)
+					break
 				}
 
 			} else {
-				lfshook.NewLogger().Infof("No files to upload!!!")
+				//lfshook.NewLogger().Infof("No files to upload!!!")
 				break
 			}
 		}
 
 	case "Hangup":
 
-		lfshook.NewLogger().Infof("%s", event["Event"])
+		//lfshook.NewLogger().Infof("%s", event["Event"])
 		//OCC answer PAD, hangup, redirect the next PAD to OCC
 		if utils.IsIO(event["CallerIDNum"]) && (event["ConnectedLineNum"] == "ano1" || event["ConnectedLineNum"] == "ano8") && event["Context"] == "default" {
-			lfshook.NewLogger().Infof("Hangup OCC-PAD event: %+v", event)
-
-			// OCC hangup detected, hangup other running channels
-			runningTaskName := InterruptRunningTask("PAD-OCC")
-			if runningTaskName != "" {
-				time.Sleep(time.Millisecond * 100) //wait endpoint release
-			}
 
+			utils.LoggerDebug.Printf("Check PAD-OCC queue if there are PADs need to be redirect to OCC !")
 			res, _ := QueueStatus("0301", "") // check OCC queue ,if empty PAD end
 			if res == nil {
+				utils.LoggerDebug.Printf("Check PAD-OCC queue , return nill . exit !")
 				return
 			}
 
 			if res.Calls == "0" { //OCC queue is empty
+				utils.LoggerDebug.Printf("Check PAD-OCC queue no PAD now ! Send PAD-OCC end to STC .")
+
 				alstatus.OccPad("end")
 				priority.OCCAnswer = 0
 				priority.PADOccStart = 0
@@ -322,7 +344,14 @@ func HandleAMI(event map[string]string) {
 				//break
 			} else { //OCC queue is not empty
 
-				time.Sleep(time.Millisecond * 100) //wait io idle
+				utils.LoggerDebug.Printf("PAD goto OCC , interrupt other task !")
+				// OCC hangup detected, hangup other running channels
+				runningTaskName := InterruptRunningTask("PAD-OCC")
+				if runningTaskName != "" {
+					time.Sleep(time.Millisecond * 100) //wait endpoint release
+				}
+
+				//time.Sleep(time.Millisecond * 100) //wait io idle
 				//lfshook.NewLogger().Infof("====Start OCC-PAD===next==%+v", res)
 				if active.ActivedCab == "1" && ExtenStatus("1411") == "Idle" { //check active and OCC status
 					time.Sleep(time.Second)
@@ -331,21 +360,25 @@ func HandleAMI(event map[string]string) {
 					if res.Entrys != nil {
 						for _, chanEntry := range res.Entrys {
 							lfshook.NewLogger().Infof("PAD answered by OCC1 pos:%s chan:%s", chanEntry.Position, chanEntry.Channel)
+
 							if chanEntry.Position == "1" {
 								PADChan = chanEntry.Channel
+								utils.LoggerDebug.Printf("PAD-OCC , Get the first PAD(%s) in the queue !", PADChan)
 								break
 							}
 						}
 
 						if PADChan != "" {
 							Ext := strings.Split(strings.Split(res.Entrys[0].Channel, "/")[1], "-")[0]
-
 							alstatus.AlarmStatus(Ext, "connect")
+
+							utils.LoggerDebug.Printf("PAD goto OCC1 , redirect %s to OCC1 !", PADChan)
 							go RedirectInQueue(PADChan, "1411", "pad-page-occ-icp", Ext) //PAD Page(OCC+ICPs)
 
 							go Dial("0401", "0512", "pad-rule-pacus-occ", "ano1", "ano1", "1") // PACUs dial OCC1
 						} else {
 							lfshook.NewLogger().Infof("OCC-QueueStatus PADCchan NULL")
+							utils.LoggerDebug.Printf("PAD-OCC , OCC Queue Status PADCchan return NULL .")
 						}
 					}
 					break
@@ -358,14 +391,16 @@ func HandleAMI(event map[string]string) {
 							lfshook.NewLogger().Infof("PAD answered by OCC1 pos:%s chan:%s", chanEntry.Position, chanEntry.Channel)
 							if chanEntry.Position == "1" {
 								PADChan = chanEntry.Channel
+								utils.LoggerDebug.Printf("PAD-OCC , Get the first PAD(%s) in the queue !", PADChan)
 								break
 							}
 						}
 
 						if PADChan != "" {
 							Ext := strings.Split(strings.Split(res.Entrys[0].Channel, "/")[1], "-")[0]
-
 							alstatus.AlarmStatus(Ext, "connect")
+
+							utils.LoggerDebug.Printf("PAD goto OCC8 , redirect %s to OCC8 !", PADChan)
 							go RedirectInQueue(PADChan, "1481", "pad-page-occ-icp", Ext) //PAD Page(OCC+ICPs)
 
 							go Dial("0401", "0512", "pad-rule-pacus-occ", "ano8", "ano8", "8") // PACUs dial OCC1
@@ -412,6 +447,7 @@ func HandleAMI(event map[string]string) {
 				res, _ := QueueStatus("0300", "")  // check ICP queue ,if empty PAD end
 				res1, _ := QueueStatus("0301", "") // check OCC queue ,if empty PAD end
 				if res == nil || res1 == nil {
+					utils.LoggerDebug.Printf("PAD Hangup , check ICP|OCC queue return nil, exit.")
 					return
 				}
 				lfshook.NewLogger().Infof("===Hangup  PAD====== ICP Queue calls:%s  OCC Queue calls:%s", res.Calls, res1.Calls)
@@ -469,6 +505,7 @@ func HandleAMI(event map[string]string) {
 		lfshook.NewLogger().Infof("=========%s", event["Event"])
 
 		if priority.OCCAnswer == 1 && event["Queue"] == "0300" { //New PAD Goto the OCC queue in the first time, if OCC answered
+			utils.LoggerDebug.Printf("Redirect PAD %s to OCC queue .", event["CallerIDNum"])
 			alstatus.AlarmStatus(event["CallerIDNum"], "queue") //send status to STC
 			go RedirectInQueue(event["CallerIDNum"], "0301", "queues-occ", event["CallerIDNum"])
 			break
@@ -493,14 +530,11 @@ func HandleAMI(event map[string]string) {
 				if ok {
 					//lfshook.NewLogger().Infof("=1==QueueCallerJoin===runing:%d=====toRun:=%d==Status:%s", taskTmp, toRunpriority, event["ChannelStateDesc"])
 					if taskTmp.Priority < toRunpriority { //higher priority task running ,do not set timer
+						utils.LoggerDebug.Printf("The First PAD %s enter ICP queue , %s running do not set PAD timeout.", taskTmp.RunType, event["CallerIDNum"])
 						break
 					}
 				}
 
-				//lfshook.NewLogger().Infof("==2=QueueCallerJoin===runing:%d=====toRun:=%d==Status:%s", taskTmp, toRunpriority, event["ChannelStateDesc"])
-
-				//if (priority.RunningTypePriority > toRunpriority || priority.RunningTypePriority == 0) && event["ChannelStateDesc"] != "Up" {
-				//active.SetTimer = true
 				//lfshook.NewLogger().Logger.Infof("=========Start PAD timer !=============")
 				if active.QueueTimer != nil {
 					if active.QueueTimer.Stop() {
@@ -509,7 +543,8 @@ func HandleAMI(event map[string]string) {
 						lfshook.NewLogger().Logger.Infof("=========Release PAD timer false ! ============")
 					}
 				}
-				lfshook.NewLogger().Logger.Infof("=========Start PAD timer !======%d=======", active.PADTimeout)
+				//lfshook.NewLogger().Logger.Infof("=========Start PAD timer !======%d=======", active.PADTimeout)
+				utils.LoggerDebug.Printf("The first PAD %s enter ICP queue , set PAD timeout %d sec .", event["CallerIDNum"], active.PADTimeout)
 				active.QueueTimer = time.AfterFunc(time.Duration(active.PADTimeout)*time.Second, func() { // check the PAD 30s timeout
 					//active.QueueTimer = time.AfterFunc(30*time.Second, func() { // check the PAD 30s timeout
 					//if both not active , return
@@ -541,26 +576,13 @@ func HandleAMI(event map[string]string) {
 							for _, caller := range resCaller.Entrys {
 								priority.ICPAnswer = 0
 								//lfshook.NewLogger().Infof("====QueueCallerJoin==QueueTimer===%s", event["Event"])
-								lfshook.NewLogger().Infof("Redirect to 0301 extension:%s Pos:%s", caller.CallerIDNum, caller.Position)
+								//lfshook.NewLogger().Infof("Redirect to 0301 extension:%s Pos:%s", caller.CallerIDNum, caller.Position)
 								//order by pos
+								utils.LoggerDebug.Printf("Redirect %s to OCC queue Pos:%s", caller.CallerIDNum, caller.Position)
 								RedirectInQueue(caller.CallerIDNum, "0301", "queues-occ", caller.CallerIDNum) // redirect All ICP-PAD redirect to OCC queue
 								time.Sleep(time.Millisecond * 100)                                            //200 ms delay
 							}
 						}
-
-						//==============test info =====================
-						/*
-							time.Sleep(2 * time.Second)
-							occque, err1 := QueueStatus("0301", "") // check ICP queue, get entries
-							if err1 != nil {
-								lfshook.NewLogger().Infof("ICP QueueStatus err:%+v", err)
-								return
-							}
-
-							for _, caller := range occque.Entrys {
-								lfshook.NewLogger().Infof("Q301====666666=SetPadTimer= entry:%s=Pos:%s==", caller.CallerIDNum, caller.Position)
-							}*/
-
 					}
 				})
 			}
@@ -573,10 +595,8 @@ func HandleAMI(event map[string]string) {
 		//PAD Page OCC+ICPs;
 		if utils.IsPAIU(event["CallerIDNum"]) && event["Queue"] == "0301" && priority.OCCAnswer == 0 { // The first PAD to OCC ,caller is PAD
 
-			active.WaitTaskCreate("PAD-OCC")
-			if active.TaskCreating == "" {
-				active.TaskCreating = "PAD-OCC"
-			}
+			utils.LoggerDebug.Printf("The first PAD to OCC queue .")
+			WaitTaskCreate("PAD-OCC")
 
 			if priority.CheckPriority("PAD-OCC") {
 
@@ -589,20 +609,20 @@ func HandleAMI(event map[string]string) {
 
 				time.Sleep(time.Millisecond * 300)
 
-				if active.TrainDevide == 0 { //列车没有断开
-					if active.ActivedCab == "1" && ExtenStatus("1411") == "Idle" { //check active and OCC status
-
-						alstatus.AlarmStatus(event["CallerIDNum"], "connect")
-						go RedirectInQueue(event["Channel"], "1411", "pad-page-occ-icp", event["CallerIDNum"]) //PAD Page(OCC+ICPs)
-						go Dial("0401", "0512", "pad-rule-pacus-occ", "ano1", "ano1", "1")                     // PACUs dial OCC1
-
-					} else if active.ActivedCab == "8" && ExtenStatus("1481") == "Idle" {
+				//if active.TrainDevide == 0 { //列车没有断开
+				if active.ActivedCab == "1" && ExtenStatus("1411") == "Idle" { //check active and OCC status
+					utils.LoggerDebug.Printf("PAD %s goto OCC1 .", event["CallerIDNum"])
+					alstatus.AlarmStatus(event["CallerIDNum"], "connect")
+					go RedirectInQueue(event["Channel"], "1411", "pad-page-occ-icp", event["CallerIDNum"]) //PAD Page(OCC+ICPs)
+					go Dial("0401", "0512", "pad-rule-pacus-occ", "ano1", "ano1", "1")                     // PACUs dial OCC1
 
-						alstatus.AlarmStatus(event["CallerIDNum"], "connect")
-						go RedirectInQueue(event["Channel"], "1481", "pad-page-occ-icp", event["CallerIDNum"]) //PAD Page(OCC+ICPs)
-						go Dial("0401", "0512", "pad-rule-pacus-occ", "ano8", "ano8", "8")                     // PACUs dial OCC8
-					}
-				} else { //列车断开模式下
+				} else if active.ActivedCab == "8" && ExtenStatus("1481") == "Idle" {
+					utils.LoggerDebug.Printf("PAD %s goto OCC8 .", event["CallerIDNum"])
+					alstatus.AlarmStatus(event["CallerIDNum"], "connect")
+					go RedirectInQueue(event["Channel"], "1481", "pad-page-occ-icp", event["CallerIDNum"]) //PAD Page(OCC+ICPs)
+					go Dial("0401", "0512", "pad-rule-pacus-occ", "ano8", "ano8", "8")                     // PACUs dial OCC8
+				}
+				/*} else { //列车断开模式下
 					if active.ActivedCab == "1" && ExtenStatus("1411") == "Idle" { //check active and OCC status
 
 						alstatus.AlarmStatus(event["CallerIDNum"], "connect")
@@ -615,20 +635,20 @@ func HandleAMI(event map[string]string) {
 						go RedirectInQueue(event["Channel"], "1481", "pad-page-occ-icp", event["CallerIDNum"]) //PAD Page(OCC+ICPs)
 						go Dial("0401", "0512", "pad-rule-pacus-occ", "ano8", "ano8", "8")                     // PACUs dial OCC8
 					}
-				}
+				}*/
 			} else {
 				lfshook.NewLogger().Infof("====PAD-OCC Priority false===")
 			}
 
-			time.Sleep(1 * time.Second)
-			if active.TaskCreating == "PAD-OCC" {
-				active.TaskCreating = ""
+			time.Sleep(2 * time.Second)
+			if priority.TaskCreating == "PAD-OCC" {
+				priority.TaskCreating = ""
 			}
 		}
 
 	case "ConfbridgeJoin":
 		lfshook.NewLogger().Infof("=========%+v", event["Event"])
-		lfshook.NewLogger().Infof("=========%+v", event)
+		//lfshook.NewLogger().Infof("=========%+v", event)
 		//set priority and send PA status msg
 		switch event["CallerIDName"] {
 		case "EMG":
@@ -642,10 +662,11 @@ func HandleAMI(event map[string]string) {
 					ConfbridgeID: event["Conference"],
 					Running:      true,
 				}
-				if active.TaskCreating == "EMG" {
-					active.TaskCreating = ""
-				}
+				utils.LoggerDebug.Printf("%s Runing , Set %s task info %+v .", event["CallerIDName"], event["CallerIDName"], task)
 				priority.RegistryTask.Register("EMG", task)
+				if priority.TaskCreating == "EMG" {
+					priority.TaskCreating = ""
+				}
 
 				alstatus.PaStatus("", "EMG", "start")
 				//check PAD timer
@@ -672,12 +693,12 @@ func HandleAMI(event map[string]string) {
 					ConfbridgeID: event["Conference"],
 					Running:      true,
 				}
-				if active.TaskCreating == "SPC" {
-					active.TaskCreating = ""
-				}
-
+				utils.LoggerDebug.Printf("%s Runing , Set %s task info %+v .", event["CallerIDName"], event["CallerIDName"], task)
 				priority.RegistryTask.Register("SPC", task)
 				alstatus.PaStatus("", "SPC", "start")
+				if priority.TaskCreating == "SPC" {
+					priority.TaskCreating = ""
+				}
 
 				//check PAD timer
 				if priority.AllTasks.PADOCC.Priority > priority.AllTasks.SPC.Priority {
@@ -703,12 +724,13 @@ func HandleAMI(event map[string]string) {
 					ConfbridgeID: event["Conference"],
 					Running:      true,
 				}
-				if active.TaskCreating == "DCS" {
-					active.TaskCreating = ""
-				}
-
+				utils.LoggerDebug.Printf("%s Runing , Set %s task info %+v .", event["CallerIDName"], event["CallerIDName"], task)
 				priority.RegistryTask.Register("DCS", task)
 				alstatus.PaStatus("", "DCS", "start")
+				if priority.TaskCreating == "DCS" {
+					priority.TaskCreating = ""
+				}
+
 				//check PAD timer
 				if priority.AllTasks.PADOCC.Priority > priority.AllTasks.DCS.Priority {
 					if active.QueueTimer != nil {
@@ -734,12 +756,12 @@ func HandleAMI(event map[string]string) {
 					ConfbridgeID: event["Conference"],
 					Running:      true,
 				}
-				if active.TaskCreating == "STN" {
-					active.TaskCreating = ""
-				}
-
+				utils.LoggerDebug.Printf("%s Runing , Set %s task info %+v .", event["CallerIDName"], event["CallerIDName"], task)
 				priority.RegistryTask.Register("STN", task)
 				alstatus.PaStatus("", "STN", "start")
+				if priority.TaskCreating == "STN" {
+					priority.TaskCreating = ""
+				}
 
 				//check PAD timer
 				if priority.AllTasks.PADOCC.Priority > priority.AllTasks.STN.Priority {
@@ -766,12 +788,12 @@ func HandleAMI(event map[string]string) {
 					ConfbridgeID: event["Conference"],
 					Running:      true,
 				}
-				if active.TaskCreating == "CHK" {
-					active.TaskCreating = ""
-				}
-
+				utils.LoggerDebug.Printf("%s Runing , Set %s task info %+v .", event["CallerIDName"], event["CallerIDName"], task)
 				priority.RegistryTask.Register("CHK", task)
 				alstatus.PaStatus("", "CHK", "start")
+				if priority.TaskCreating == "CHK" {
+					priority.TaskCreating = ""
+				}
 
 				//check PAD timer
 				if priority.AllTasks.PADOCC.Priority > priority.AllTasks.CHK.Priority {
@@ -796,12 +818,12 @@ func HandleAMI(event map[string]string) {
 					ConfbridgeID: event["Conference"],
 					Running:      true,
 				}
-				if active.TaskCreating == "VOL" {
-					active.TaskCreating = ""
-				}
-
+				utils.LoggerDebug.Printf("%s Runing , Set %s task info %+v .", event["CallerIDName"], event["CallerIDName"], task)
 				priority.RegistryTask.Register("VOL", task)
 				alstatus.PaStatus("", "VOL", "start")
+				if priority.TaskCreating == "VOL" {
+					priority.TaskCreating = ""
+				}
 
 				//check PAD timer
 				if priority.AllTasks.PADOCC.Priority > priority.AllTasks.VOL.Priority {
@@ -826,9 +848,6 @@ func HandleAMI(event map[string]string) {
 		*/
 		//Send PA start msg to STC
 		if utils.IsICP(event["CallerIDNum"]) && event["Exten"] == "0500" { // PA start
-			if active.TaskCreating == "PA" {
-				active.TaskCreating = ""
-			}
 
 			alstatus.PaStatus(event["CallerIDNum"], "PA", "start")
 			//================================
@@ -840,7 +859,11 @@ func HandleAMI(event map[string]string) {
 				ConfbridgeID: event["Conference"],
 				Running:      true,
 			}
+			utils.LoggerDebug.Printf("PA Runing , Set PA task info %+v .", task)
 			priority.RegistryTask.Register("PA", task)
+			if priority.TaskCreating == "PA" {
+				priority.TaskCreating = ""
+			}
 
 			//check PAD timer
 			if priority.AllTasks.PADOCC.Priority > priority.AllTasks.PA.Priority {
@@ -856,10 +879,6 @@ func HandleAMI(event map[string]string) {
 			break
 		} else if utils.IsIO(event["CallerIDNum"]) && event["Exten"] == "0501" { //CPA start
 
-			if active.TaskCreating == "CPA" {
-				active.TaskCreating = ""
-			}
-
 			alstatus.PaStatus(event["CallerIDNum"], "CPA", "start")
 			//================================
 			task := priority.TaskInfo{
@@ -870,8 +889,11 @@ func HandleAMI(event map[string]string) {
 				ConfbridgeID: event["Conference"],
 				Running:      true,
 			}
+			utils.LoggerDebug.Printf("CPA Runing , Set CPA task info %+v .", task)
 			priority.RegistryTask.Register("CPA", task)
-
+			if priority.TaskCreating == "CPA" {
+				priority.TaskCreating = ""
+			}
 			//check PAD timer
 			if priority.AllTasks.PADOCC.Priority > priority.AllTasks.CPA.Priority {
 				if active.QueueTimer != nil {
@@ -890,7 +912,7 @@ func HandleAMI(event map[string]string) {
 		//PAD chanspy ICP1
 		//ICP8 call PAD
 		if event["ConnectedLineNum"] == "ani1" && event["Exten"] == "0511" { //PAD answered by ICP; PACUs connected ICP1
-			lfshook.NewLogger().Infof("====PAD answered by ICP1:%s=====", event["ConnectedLineName"])
+			//lfshook.NewLogger().Infof("====PAD answered by ICP1:%s=====", event["ConnectedLineName"])
 			alstatus.AlarmStatus(event["ConnectedLineName"], "connect")
 
 			//================================
@@ -903,11 +925,11 @@ func HandleAMI(event map[string]string) {
 				Running:      true,
 			}
 			priority.RegistryTask.Register("PAD-ICP", task)
-			if active.TaskCreating == "PAD-ICP" {
-				active.TaskCreating = ""
+			if priority.TaskCreating == "PAD-ICP" {
+				priority.TaskCreating = ""
 			}
-
-			lfshook.NewLogger().Infof("=========PAD-ICP answer==ListAll===%+v", priority.RegistryTask.ListAll())
+			utils.LoggerDebug.Printf("PAD %s answered by ICP1 , set task info :%+v .", event["ConnectedLineName"], task)
+			//lfshook.NewLogger().Infof("=========PAD-ICP answer==ListAll===%+v", priority.RegistryTask.ListAll())
 			go RedirectInQueue(event["ConnectedLineName"], "2311", "chanspy-rule-whisper", event["ConnectedLineName"]) //PAD chanspy(EqW) ICP1
 
 			if ExtenStatus("2381") == "Idle" {
@@ -928,11 +950,11 @@ func HandleAMI(event map[string]string) {
 				Running:      true,
 			}
 			priority.RegistryTask.Register("PAD-ICP", task)
-			if active.TaskCreating == "PAD-ICP" {
-				active.TaskCreating = ""
+			if priority.TaskCreating == "PAD-ICP" {
+				priority.TaskCreating = ""
 			}
-
-			lfshook.NewLogger().Infof("=========PAD-ICP answer==ListAll===%+v", priority.RegistryTask.ListAll())
+			utils.LoggerDebug.Printf("PAD %s answered by ICP8 , set task info :%+v .", event["ConnectedLineName"], task)
+			//lfshook.NewLogger().Infof("=========PAD-ICP answer==ListAll===%+v", priority.RegistryTask.ListAll())
 			go RedirectInQueue(event["ConnectedLineName"], "2381", "chanspy-rule-whisper", event["ConnectedLineName"]) //PAD chanspy(EqW) ICP8
 
 			if ExtenStatus("2311") == "Idle" {
@@ -955,7 +977,10 @@ func HandleAMI(event map[string]string) {
 				Running:      true,
 			}
 			priority.RegistryTask.Register("PAD-OCC", task)
-
+			if priority.TaskCreating == "PAD-OCC" {
+				priority.TaskCreating = ""
+			}
+			utils.LoggerDebug.Printf("PAD %s answered by OCC , set task info :%+v .", event["CallerIDNum"], task)
 			break
 		}
 
@@ -1150,10 +1175,12 @@ func HandleAMI(event map[string]string) {
 				ConfbridgeID: "",
 				Running:      true,
 			}
-			active.TaskCreating = ""
-			priority.RegistryTask.Register("C2C", task)
 
+			priority.RegistryTask.Register("C2C", task)
 			alstatus.PaStatus(event["CallerIDNum"], "C2C", "start")
+			if priority.TaskCreating == "C2C" {
+				priority.TaskCreating = ""
+			}
 
 			//check PAD timer
 			if priority.AllTasks.PADOCC.Priority > priority.AllTasks.C2C.Priority {
@@ -1194,8 +1221,8 @@ func HandleAMI(event map[string]string) {
 				Running:      true,
 			}
 			priority.RegistryTask.Register("PAD-TMS", task)
-			if active.TaskCreating == "PAD-TMS" {
-				active.TaskCreating = ""
+			if priority.TaskCreating == "PAD-TMS" {
+				priority.TaskCreating = ""
 			}
 			lfshook.NewLogger().Infof("=========PAD-TMS answer==ListAll===%+v", priority.RegistryTask.ListAll())
 
@@ -1258,8 +1285,8 @@ func HandleAMI(event map[string]string) {
 		if utils.IsIO(event["CallerIDNum"]) && utils.IsPAIU(event["ConnectedLineNum"]) {
 			if priority.PADOccStart == 0 {
 
-				if active.TaskCreating == "PAD-OCC" {
-					active.TaskCreating = ""
+				if priority.TaskCreating == "PAD-OCC" {
+					priority.TaskCreating = ""
 				}
 
 				alstatus.OccPad("start")
@@ -1311,8 +1338,8 @@ func HandleAMI(event map[string]string) {
 				Running:      true,
 			}
 			priority.RegistryTask.Register("PAD-TMS", task)
-			if active.TaskCreating == "PAD-TMS" {
-				active.TaskCreating = ""
+			if priority.TaskCreating == "PAD-TMS" {
+				priority.TaskCreating = ""
 			}
 			lfshook.NewLogger().Infof("=========PAD-TMS answer==ListAll===%+v", priority.RegistryTask.ListAll())
 

+ 1 - 1
internal/app/index.go

@@ -32,7 +32,7 @@ func StartApp() {
 	//Get cab number acording to IP
 	socket.SetMasterCabNum()
 
-	utils.LoggerDebug.Printf("Get CabNumber:%s  Master:%+v", active.CabNum, active.Master)
+	utils.LoggerDebug.Printf("Get CabNumber:%s  Init Master:%+v", active.CabNum, active.Master)
 
 	//init the active status
 	//active.ActivedCab = ""

+ 0 - 18
internal/app/stc/active/index.go

@@ -14,13 +14,10 @@ var CabNum string
 var ActivedCab = "1"
 var PADTimeout = 30
 var Master = false
-var MasterTag = 0
 
 var TrainDevide = 0
 var RadioFault = 0
 
-var TaskCreating = ""
-
 var TrainInfoMap = make(map[string]map[int]string)
 
 // 初始化所有列车号
@@ -155,18 +152,3 @@ func InitTrainInfoMap() {
 		}
 	}
 }
-
-func WaitTaskCreate(task string) {
-	utils.LoggerDebug.Printf("Check task creating ..... ")
-
-	for i := 0; i < 4; i++ {
-		if TaskCreating != "" {
-			utils.LoggerDebug.Printf("%s waiting previous task:%s creating ..... ", task, TaskCreating)
-			time.Sleep(time.Millisecond * 500)
-		} else {
-			TaskCreating = task
-			return
-		}
-	}
-	utils.LoggerDebug.Printf("%s waiting previous task:%s creating timeout ! ", task, TaskCreating)
-}

+ 37 - 75
internal/app/stc/broadcast/stc-broadcast.go

@@ -44,15 +44,6 @@ func HandleStcCmd(ctx context.Context, conn net.Conn) {
 				}
 				buf.Write(tmp[:n])
 			}
-
-			/*for {
-				packet, err := msgdata.ExtractPacket(&buf)
-				if err != nil {
-					lfshook.NewLogger().Logger.Infof("ExtractPacket:%+v", err)
-					break
-				}
-				go processPacket(packet)
-			}*/
 			//lfshook.NewLogger().Logger.Infof("buf:%x==============================", buf.Bytes())
 			for {
 				packet, err := msgdata.ExtractPacket(&buf)
@@ -150,7 +141,7 @@ func getInfofromSTC(info []byte) {
 func processPacket(packet []byte) {
 
 	if len(packet) < 6 {
-		utils.LoggerDebug.Printf("Get data wrong length from STC !")
+		utils.LoggerDebug.Printf("Get data wrong length from STC ! Data:%x", packet)
 		return
 	}
 
@@ -182,10 +173,7 @@ func processPacket(packet []byte) {
 	case 0x02: // STN
 		if active.ActivedCab != "" {
 			//检查是否有任务正在创建
-			active.WaitTaskCreate("STN")
-			if active.TaskCreating == "" {
-				active.TaskCreating = "STN"
-			}
+			action.WaitTaskCreate("STN")
 
 			if priority.CheckPriority("STN") {
 
@@ -200,17 +188,14 @@ func processPacket(packet []byte) {
 		}
 
 		time.Sleep(3 * time.Second)
-		if active.TaskCreating == "STN" {
-			active.TaskCreating = ""
+		if priority.TaskCreating == "STN" {
+			priority.TaskCreating = ""
 		}
 
 	case 0x05: // SPC
 		if active.ActivedCab != "" {
 			//检查是否有任务正在创建
-			active.WaitTaskCreate("SPC")
-			if active.TaskCreating == "" {
-				active.TaskCreating = "SPC"
-			}
+			action.WaitTaskCreate("SPC")
 
 			if priority.CheckPriority("SPC") {
 
@@ -225,18 +210,15 @@ func processPacket(packet []byte) {
 		}
 
 		time.Sleep(3 * time.Second)
-		if active.TaskCreating == "SPC" {
-			active.TaskCreating = ""
+		if priority.TaskCreating == "SPC" {
+			priority.TaskCreating = ""
 		}
 
 	case 0x06: // EMG
 
 		if active.ActivedCab != "" {
 			//检查是否有任务正在创建
-			active.WaitTaskCreate("EMG")
-			if active.TaskCreating == "" {
-				active.TaskCreating = "EMG"
-			}
+			action.WaitTaskCreate("EMG")
 
 			if priority.CheckPriority("EMG") {
 
@@ -251,8 +233,8 @@ func processPacket(packet []byte) {
 		}
 
 		time.Sleep(3 * time.Second)
-		if active.TaskCreating == "EMG" {
-			active.TaskCreating = ""
+		if priority.TaskCreating == "EMG" {
+			priority.TaskCreating = ""
 		}
 
 	case 0x07: // STOP
@@ -262,10 +244,7 @@ func processPacket(packet []byte) {
 
 		if active.ActivedCab != "" {
 			//检查是否有任务正在创建
-			active.WaitTaskCreate("DCS")
-			if active.TaskCreating == "" {
-				active.TaskCreating = "DCS"
-			}
+			action.WaitTaskCreate("DCS")
 
 			if priority.CheckPriority("DCS") {
 
@@ -280,18 +259,15 @@ func processPacket(packet []byte) {
 		}
 
 		time.Sleep(3 * time.Second)
-		if active.TaskCreating == "DCS" {
-			active.TaskCreating = ""
+		if priority.TaskCreating == "DCS" {
+			priority.TaskCreating = ""
 		}
 
 	case 0x09: // SELF CHECK
 
 		if active.ActivedCab != "" {
 			//检查是否有任务正在创建
-			active.WaitTaskCreate("CHK")
-			if active.TaskCreating == "" {
-				active.TaskCreating = "CHK"
-			}
+			action.WaitTaskCreate("CHK")
 
 			if priority.CheckPriority("CHK") {
 
@@ -306,17 +282,14 @@ func processPacket(packet []byte) {
 		}
 
 		time.Sleep(3 * time.Second)
-		if active.TaskCreating == "CHK" {
-			active.TaskCreating = ""
+		if priority.TaskCreating == "CHK" {
+			priority.TaskCreating = ""
 		}
 
 	case 0x0a: // Tone-test
 		if active.ActivedCab != "" {
 			//检查是否有任务正在创建
-			active.WaitTaskCreate("VOL")
-			if active.TaskCreating == "" {
-				active.TaskCreating = "VOL"
-			}
+			action.WaitTaskCreate("VOL")
 
 			if priority.CheckPriority("VOL") {
 
@@ -331,8 +304,8 @@ func processPacket(packet []byte) {
 		}
 
 		time.Sleep(3 * time.Second)
-		if active.TaskCreating == "VOL" {
-			active.TaskCreating = ""
+		if priority.TaskCreating == "VOL" {
+			priority.TaskCreating = ""
 		}
 
 	case 0x0e: //TMS answer PAD
@@ -356,10 +329,7 @@ func processPacket(packet []byte) {
 		}
 
 		//检查是否有任务正在创建
-		active.WaitTaskCreate("PAD-TMS")
-		if active.TaskCreating == "" {
-			active.TaskCreating = "PAD-TMS"
-		}
+		action.WaitTaskCreate("PAD-TMS")
 
 		if priority.CheckPriority("PAD-TMS") {
 
@@ -387,8 +357,8 @@ func processPacket(packet []byte) {
 		}
 
 		time.Sleep(3 * time.Second)
-		if active.TaskCreating == "PAD-TMS" {
-			active.TaskCreating = ""
+		if priority.TaskCreating == "PAD-TMS" {
+			priority.TaskCreating = ""
 		}
 
 	case 0x0b: // reset all PAD
@@ -421,10 +391,7 @@ func processPacket(packet []byte) {
 		}
 
 		//检查是否有任务正在创建
-		active.WaitTaskCreate("PAD-ICP")
-		if active.TaskCreating == "" {
-			active.TaskCreating = "PAD-ICP"
-		}
+		action.WaitTaskCreate("PAD-ICP")
 
 		if priority.CheckPriority("PAD-ICP") {
 
@@ -438,6 +405,7 @@ func processPacket(packet []byte) {
 			}
 
 			if active.QueueTimer != nil {
+				utils.LoggerDebug.Printf("PAD Timeout timer != nil !")
 				if active.QueueTimer.Stop() {
 					utils.LoggerDebug.Printf("Stop PAD timer true !")
 				} else {
@@ -451,8 +419,8 @@ func processPacket(packet []byte) {
 		}
 
 		time.Sleep(3 * time.Second)
-		if active.TaskCreating == "PAD-ICP" {
-			active.TaskCreating = ""
+		if priority.TaskCreating == "PAD-ICP" {
+			priority.TaskCreating = ""
 		}
 
 		//case 0xf1: //Set remote master
@@ -485,6 +453,8 @@ func StationAnn(data []byte) (err error) {
 	//set spc voice tag
 	priority.SpecialVoice = specialVoice
 
+	utils.LoggerDebug.Printf("Type:STN	FileName:%x	Count:%x	SpecialVoice:%+v	Interval:%+v", filename, cycleCount, specialVoice, delay)
+
 	action.PlaybackPacu(strconv.Quote(filename), int(cycleCount), int(delay), "STN")
 	return nil
 }
@@ -610,6 +580,7 @@ func SpecialAnn(data []byte) {
 
 	filename := msgdata.SubstrByRune(string(data[11:]), 0, datalen-4)
 
+	utils.LoggerDebug.Printf("Type:SPC	FileName:%x	Count:%x	Interval:%+v", filename, cycleCount, delay)
 	if int(cycleCount) == 255 {
 		action.PlaybackPacu(strconv.Quote(filename), 9999999, int(delay), "SPC")
 	} else {
@@ -625,6 +596,7 @@ func EmgMsg(data []byte) {
 
 	filename := msgdata.SubstrByRune(string(data[11:]), 0, datalen-4)
 
+	utils.LoggerDebug.Printf("Type:EMG	FileName:%x	Count:%x	Interval:%+v", filename, cycleCount, delay)
 	if int(cycleCount) == 255 {
 		action.PlaybackPacu(strconv.Quote(filename), 9999999, int(delay), "EMG")
 	} else {
@@ -636,6 +608,7 @@ func EmgMsg(data []byte) {
 func AnnStop(data [4]byte) {
 
 	//lfshook.NewLogger().Logger.Infof("=========AnnStop Type  %x", data[0])
+	utils.LoggerDebug.Printf("Stop PA Type:%x (DCS=3,EMG=4,SPC=7,STN=8,SelfCheck=9,ToneTest=10)", data[0])
 
 	switch data[0] {
 	case 0x03:
@@ -676,6 +649,7 @@ func DcsAnn(data []byte) {
 
 	filename := msgdata.SubstrByRune(string(data[11:]), 0, datalen-4)
 
+	utils.LoggerDebug.Printf("Type:DCS	FileName:%x	Count:%x	Interval:%+v", filename, cycleCount, delay)
 	if int(cycleCount) == 255 {
 		action.PlaybackPacu(strconv.Quote(filename), 9999999, int(delay), "DCS")
 	} else {
@@ -693,6 +667,7 @@ func ToneTest(data []byte) {
 
 	filename := msgdata.SubstrByRune(string(data[12:]), 0, datalen-4)
 
+	utils.LoggerDebug.Printf("Type:ToneTest	FileName:%x	 Count:%x	Interval:%+v	Action:%x (0x01=start/0x02=stop)", filename, cycleCount, delay, check)
 	switch check {
 	case 0x01: //start
 		action.PlaybackPacu(strconv.Quote(filename), int(cycleCount), int(delay), "VOL")
@@ -713,6 +688,7 @@ func SelfCheck(data []byte) {
 
 	filename := msgdata.SubstrByRune(string(data[12:]), 0, datalen-4)
 
+	utils.LoggerDebug.Printf("Type:SelfCehck	FileName:%x	 Count:%x	Interval:%+v	Action:%x (0x01=start/0x02=stop)", filename, cycleCount, delay, check)
 	switch check {
 	case 0x01: //start
 
@@ -740,6 +716,7 @@ func AlarmHandleICP(data []byte) {
 	pos := data[13]
 	exten := fmt.Sprintf("24%c%c", carr, pos)
 
+	utils.LoggerDebug.Printf("ICP Handle PAD:%s	Action:%x (answer=1,hold=2,hangup=3)", exten, handler)
 	switch handler {
 	case 0x01: //answer(ICP+Alarm+PACU)
 		//NotifyPaiu(exten, "answer")
@@ -791,22 +768,7 @@ func AlarmHandleTMS(data []byte) {
 	exten := fmt.Sprintf("24%c%c", carr, pos)
 	PacuNum := fmt.Sprintf("21%c1", carr)
 
-	key := suppressKey(exten, handler)
-
-	//Drop other handler in 2 sec
-	// 只对 handler == 0x01 做 2 秒去重
-	if handler == 0x01 {
-		if _, loaded := suppressedExts.LoadOrStore(key, struct{}{}); loaded {
-			utils.LoggerDebug.Printf("Suppressed duplicate ICP Alarm (handler=0x01) for PAD:%s within 4 seconds", exten)
-			return // 已存在,说明在2秒窗口期内,直接丢弃
-		}
-
-		// 设置4秒后删除该 key,允许下次通过
-		time.AfterFunc(4*time.Second, func() {
-			suppressedExts.Delete(key)
-			utils.LoggerDebug.Printf("Suppression released for key: %s", key)
-		})
-	}
+	utils.LoggerDebug.Printf("TMS Handle PAD:%s	PACU:%s	Action:%x (answer=1,hold=2,hangup=3)", exten, PacuNum, handler)
 
 	switch handler {
 	case 0x01: //answer(ICP+Alarm+PACU)
@@ -853,7 +815,7 @@ func AlarmHandleTMS(data []byte) {
 
 // 挂断所有报警器
 func AlarmHoldResetAll(handler byte) {
-
+	utils.LoggerDebug.Printf("Alarm Hold/Reset All !")
 	//hangup all actived PAD
 	action.HangupAllPAD()
 

+ 3 - 3
internal/app/stc/data/msgdata.go

@@ -154,7 +154,7 @@ func ExtractPacket(buf *bytes.Buffer) ([]byte, error) {
 
 	// Step 2: 安全读取 DataLength(偏移 startIdx+6 ~ startIdx+8)
 	if startIdx+8 > len(data) {
-		utils.LoggerDebug.Printf("startIdx=%d, need data[%d:%d] for DataLength but len=%d → insufficient data .",
+		utils.LoggerDebug.Printf("Data Error: startIdx=%d, need data[%d:%d] for DataLength but len=%d → insufficient data .",
 			startIdx, startIdx+6, startIdx+8, len(data))
 		return nil, nil // 数据不够,等下次读取
 	}
@@ -165,7 +165,7 @@ func ExtractPacket(buf *bytes.Buffer) ([]byte, error) {
 	// Step 3: 计算理论包结束位置:startIdx + 8(头长) + dataLen + 1(0xFE)
 	endPosTheo := startIdx + 8 + int(dataLen) + 1
 	if endPosTheo > len(data) {
-		utils.LoggerDebug.Printf("theoretical endPos=%d > data len=%d → need more data .", endPosTheo, len(data))
+		utils.LoggerDebug.Printf("Data Error: theoretical endPos=%d > data len=%d → need more data .", endPosTheo, len(data))
 		return nil, nil // 包未收全,等下次读取
 	}
 	//lfshook.NewLogger().Logger.Infof("t=================end================%x", data[endPosTheo])
@@ -185,7 +185,7 @@ func ExtractPacket(buf *bytes.Buffer) ([]byte, error) {
 	}
 
 	if endIdx == -1 {
-		utils.LoggerDebug.Printf("0xFE not found in expected range [%d,%d), dataLen=%d .", searchStart, searchEnd, dataLen)
+		utils.LoggerDebug.Printf("Data Error: End tag 0xFE not found in expected range [%d,%d), dataLen=%d .", searchStart, searchEnd, dataLen)
 		return nil, nil // 结束符缺失,但可能是延迟到达,继续等
 	}
 

+ 1 - 0
internal/app/stc/index.go

@@ -253,6 +253,7 @@ func Sendheartbeat(ctx context.Context, conn net.Conn) {
 	protocol.DataLength = 0x04
 	protocol.Data = make([]byte, 4)
 
+	utils.LoggerDebug.Printf("Start Sendheartbeat to STC .")
 	// 初始化协议...
 	ticker := time.NewTicker(2 * time.Second)
 	defer ticker.Stop()

+ 6 - 0
internal/app/stc/priority/index.go

@@ -17,6 +17,12 @@ var PADStart = 0
 var PADTMSStart = 0
 var PADOccStart = 0
 
+var TaskCreating = ""
+
+var PACreating = 0
+var C2CCreating = 0
+var CPACreating = 0
+
 var InterruptedPad = ""
 var filePath = "/etc/asterisk/priority.conf"
 

+ 3 - 28
internal/pkg/configs/decode.go

@@ -20,49 +20,24 @@ type Config struct {
 	AsteriskAMIUser   string `yaml:"asteriskAMIUser"`   // User
 	AsteriskAMISecret string `yaml:"asteriskAMISecret"` // Secret
 
-	//AsteriskAGIPort string `yaml:"asteriskAGIPort"` // AGIPort
-
-	//AsteriskTriggerPath      string `yaml:"asteriskTriggerPath"`      // 广播触发规则
-	//AsteriskPagingPath       string `yaml:"asteriskPagingPath"`       // 广播规则
-	//AsteriskBroadcastTimeout int64  `yaml:"asteriskBroadcastTimeout"` // 广播响铃时长
-	//AsteriskBroadcastName    string `yaml:"asteriskBroadcastName"`    // 广播时名称
-	//AsteriskBroadcastID      string `yaml:"asteriskBroadcastID"`      // 广播时ID
-
-	//MysqlDBHost   string `yaml:"mysqlDBHost"`   // Host
-	//MysqlDBUser   string `yaml:"mysqlDBUser"`   // User
-	//MysqlDBSecret string `yaml:"mysqlDBSecret"` // Secret
-	//MysqlDBName   string `yaml:"mysqlDBName"`   // Name
-
-	//RedisDBHost   string `yaml:"redisDBHost"`   // Host
-	//RedisDBPort   string `yaml:"redisDBPort"`   // User
-	//RedisDBSecret string `yaml:"redisDBSecret"` // Secret
-
 	LogInfoPath    string `yaml:"logInfoPath"`    //logInfoPath
 	LogErrorPath   string `yaml:"logErrorPath"`   //logErrorPath
 	RecordEventLog string `yaml:"recordingEvent"` //recordingEventfile
+	DebugLogPath   string `yaml:"debugLog"`       //debugLog
 	ProcessRecord  string `yaml:"processRecord"`  //processRecord
 
-	//StoragePath string `yaml:"storagePath"` // 存储目录
-
-	//AllEventPushUrl string `yaml:"allEventPushUrl"`
-
-	//WebHost string `yaml:"webhost"` //Host
-	//WebPort int64  `yaml:"webport"` //port
-
-	//AllowOrigin string `yaml:"allowOrigin"` // allowOrigin
-	//AllowOrigin string `yaml:"allowOrigin"` // allowOrigin
-
 	LogLevel log.Level //logLevel
 }
 
 // ConfigPath 配置文件路径
-var ConfigPath = "/data/test/configs/config.yaml"
+var ConfigPath = "/data/PA/configs/config.yaml"
 
 // ConfigGlobal 全局配置变量
 var ConfigGlobal *Config
 
 // DecodeConfig 解析配置
 func DecodeConfig() {
+
 	_, err := os.Stat(ConfigPath)
 	if err != nil {
 		lfshook.NewLogger().Errorf("config file not exist %+v", err)

+ 5 - 3
pkg/utils/file.go

@@ -8,6 +8,7 @@ import (
 	"os"
 	"os/exec"
 	"path/filepath"
+	"pbx-api-gin/internal/pkg/configs"
 	"pbx-api-gin/pkg/lfshook"
 	"strconv"
 	"strings"
@@ -133,13 +134,14 @@ func extractFilenamesFromFFmpegOutput(prefix string) []string {
 var Logger *log.Logger
 var LoggerDebug *log.Logger
 
-func init() {
-	file, _ := os.OpenFile("/data/test/log/recordEvent.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
+func InitLog() {
+	lfshook.NewLogger().Logger.Infof("=======模式匹配错误:%+v ! ============", configs.ConfigGlobal)
+	file, _ := os.OpenFile(configs.ConfigGlobal.RecordEventLog, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
 	//Logger = log.New(file, "", log.LstdFlags) // 自动带时间戳
 	Logger = log.New(file, "", log.LstdFlags|log.Lmicroseconds)
 	//lfshook.NewLogger().Printf("software version: V10.01")
 
-	fileDebug, _ := os.OpenFile("/data/test/log/debug.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
+	fileDebug, _ := os.OpenFile(configs.ConfigGlobal.DebugLogPath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
 	//Logger = log.New(file, "", log.LstdFlags) // 自动带时间戳
 	LoggerDebug = log.New(fileDebug, "", log.LstdFlags|log.Lmicroseconds|log.Llongfile)
 }