commit 24/09/2025
This commit is contained in:
144
src/Main.kt
144
src/Main.kt
@@ -1,12 +1,18 @@
|
||||
import audio.AudioPlayer
|
||||
import barix.BarixConnection
|
||||
import barix.TCP_Barix_Command_Server
|
||||
import codes.Somecodes.Companion.Get_ANN_ID
|
||||
import codes.Somecodes.Companion.ValidFile
|
||||
import codes.Somecodes.Companion.dateformat1
|
||||
import codes.Somecodes.Companion.timeformat2
|
||||
import com.sun.jna.Platform
|
||||
import content.ContentCache
|
||||
import content.Language
|
||||
import content.ScheduleDay
|
||||
import content.VoiceType
|
||||
import database.MariaDB
|
||||
import database.Messagebank
|
||||
import database.QueuePaging
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.delay
|
||||
@@ -34,25 +40,118 @@ fun main() {
|
||||
audioPlayer.InitAudio(1)
|
||||
val content = ContentCache()
|
||||
val db = MariaDB()
|
||||
|
||||
// Coroutine untuk cek Paging Queue dan AAS Queue setiap detik
|
||||
CoroutineScope(Dispatchers.Default).launch {
|
||||
while (isActive) {
|
||||
/**
|
||||
* Fungsi untuk cek apakah semua broadcast zone valid
|
||||
* @param bz List of broadcast zone (SoundChannel)
|
||||
* @return true jika semua valid, false jika ada yang tidak valid
|
||||
*/
|
||||
fun AllBroadcastZonesValid(bz: List<String>): Boolean {
|
||||
if (bz.isNotEmpty()){
|
||||
val validchannels = bz
|
||||
// check apakah tiap zone ada di database broadcast zones
|
||||
.filter {
|
||||
z1 -> db.BroadcastZoneList.find { z2 -> z2.SoundChannel==z1 } != null
|
||||
}
|
||||
// check apakah tiap zone ada di SoundChannelList dan Online
|
||||
.filter {
|
||||
z3 -> StreamerOutputs.any { sc -> sc.value.channel==z3 && sc.value.isOnline() }
|
||||
}
|
||||
|
||||
// kalau jumlah valid channel sama dengan jumlah broadcast zone, berarti semua valid
|
||||
return validchannels.size==bz.size
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
/**
|
||||
* Fungsi untuk cek apakah semua broadcast zone idle
|
||||
* @param bz List of broadcast zone (SoundChannel)
|
||||
* @return true jika semua idle, false jika ada yang tidak idle
|
||||
*/
|
||||
fun AllBroadcastZoneIdle(bz: List<String>): Boolean {
|
||||
if (bz.isNotEmpty()){
|
||||
return bz.all {
|
||||
z1 -> StreamerOutputs.any { sc -> sc.value.channel==z1 && sc.value.isIdle() }
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// dipakai untuk ambil messagebank berdasarkan id
|
||||
val urutan_bahasa = listOf(
|
||||
Language.INDONESIA.name,
|
||||
Language.LOCAL.name,
|
||||
Language.ENGLISH.name,
|
||||
Language.CHINESE.name,
|
||||
Language.JAPANESE.name,
|
||||
Language.ARABIC.name
|
||||
)
|
||||
|
||||
// dipakai untuk pilih voice type, bisa diganti via web nanti
|
||||
var selected_voice = VoiceType.VOICE_1.name
|
||||
|
||||
/**
|
||||
* Fungsi untuk ambil messagebank berdasarkan ANN_ID, diurutkan berdasarkan urutan bahasa di urutan_bahasa
|
||||
* @param id ANN_ID dari messagebank
|
||||
* @return List of Messagebank
|
||||
*/
|
||||
fun Get_MessageBank_by_id(id: Int) : ArrayList<Messagebank>{
|
||||
val mb_list = ArrayList<Messagebank>()
|
||||
urutan_bahasa.forEach {
|
||||
lang -> db.MessagebankList.find { mb -> mb.ANN_ID==id.toUInt() && mb.Language==lang && mb.Voice_Type==selected_voice }?.let {
|
||||
mb_list.add(it)
|
||||
}
|
||||
}
|
||||
return mb_list
|
||||
}
|
||||
|
||||
jobloop@ while (isActive) {
|
||||
delay(1000)
|
||||
|
||||
// baca dulu queue paging, prioritas 1
|
||||
db.Read_Queue_Paging().forEach {
|
||||
// cek apakah queue paging ada broadcast zone nya
|
||||
if (it.BroadcastZones.isNotBlank()) {
|
||||
// prioritas 1 , habisin queue paging
|
||||
for(it in db.Read_Queue_Paging()){
|
||||
if (it.BroadcastZones.isNotBlank()){
|
||||
val zz = it.BroadcastZones.split(";")
|
||||
// cek apakah semua target broadcast zone dari queue paging ada di dalam database broadcast zones
|
||||
if (zz.all { z -> db.BroadcastZoneList.any { bz -> bz.equals(z) } }) {
|
||||
// semua target broadcast zone valid, sekarang cek apakah semua target broadcast zone idle
|
||||
if (AllBroadcastZonesValid(zz)){
|
||||
if (AllBroadcastZoneIdle(zz)){
|
||||
if (it.Source=="PAGING"){
|
||||
// nama file ada di Message
|
||||
if (ValidFile(it.Message)){
|
||||
val afi = audioPlayer.LoadAudioFile(it.Message)
|
||||
zz.forEach {
|
||||
z1 -> StreamerOutputs.values.find { it.channel==z1 }?.SendData(afi.bytes, {db.Add_Log("AAS", it) }, {db.Add_Log("AAS", it)} )
|
||||
}
|
||||
val logmessage = "Broadcast started PAGING with Filename '${it.Message}' to zones: ${it.BroadcastZones}"
|
||||
Logger.info { logmessage}
|
||||
db.Add_Log("AAS", logmessage)
|
||||
db.Delete_Queue_Paging_by_index(it.index)
|
||||
|
||||
continue@jobloop
|
||||
} else {
|
||||
// file tidak valid, delete from queue paging
|
||||
db.Delete_Queue_Paging_by_index(it.index)
|
||||
db.Add_Log("AAS", "Cancelled paging message with index ${it.index} due to invalid audio file" )
|
||||
}
|
||||
} else if (it.Source=="SHALAT"){
|
||||
val ann_id = Get_ANN_ID(it.Message)
|
||||
if (ann_id>0){
|
||||
Get_MessageBank_by_id(ann_id).forEach {
|
||||
|
||||
}
|
||||
} else{
|
||||
// invalid ann_id, delete from queue paging
|
||||
db.Delete_Queue_Paging_by_index(it.index)
|
||||
db.Add_Log("AAS", "Cancelled Shalat message with index ${it.index} due to invalid ANN_ID" )
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// ada broadcast zone yang tidak valid, delete from queue paging
|
||||
db.Delete_Queue_Paging_by_index(it.index)
|
||||
db.Add_Log("AAS", "Cancelled paging message with index ${it.index} due to invalid broadcast zone"
|
||||
)
|
||||
db.Add_Log("AAS", "Cancelled paging message with index ${it.index} due to invalid broadcast zone" )
|
||||
}
|
||||
} else {
|
||||
// invalid broadcast zone, delete from queue paging
|
||||
@@ -60,19 +159,25 @@ fun main() {
|
||||
db.Add_Log("AAS", "Cancelled paging message with index ${it.index} due to empty broadcast zone")
|
||||
}
|
||||
}
|
||||
// baca kemudian queue table, prioritas 2
|
||||
db.Read_Queue_Table().forEach {
|
||||
if (it.BroadcastZones.isNotBlank()) {
|
||||
val zz = it.BroadcastZones.split(";")
|
||||
// cek apakah semua target broadcast zone dari queue table ada di dalam database broadcast zones
|
||||
if (zz.all { z -> db.BroadcastZoneList.any { bz -> bz.equals(z) } }) {
|
||||
// semua target broadcast zone valid, sekarang cek apakah semua target broadcast zone idle
|
||||
|
||||
|
||||
// prioritas 2, habisin queue table
|
||||
db.Read_Queue_Table().forEach {
|
||||
if (it.BroadcastZones.isNotEmpty()){
|
||||
val zz = it.BroadcastZones.split(";")
|
||||
if (AllBroadcastZonesValid(zz)){
|
||||
if (AllBroadcastZoneIdle(zz)){
|
||||
if (it.Type=="SOUNDBANK"){
|
||||
|
||||
} else if (it.Type=="TIMER"){
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
} else {
|
||||
// ada broadcast zone yang tidak valid, delete from queue table
|
||||
db.Delete_Queue_Table_by_index(it.index)
|
||||
db.Add_Log("AAS", "Cancelled table message with index ${it.index} due to invalid broadcast zone"
|
||||
)
|
||||
db.Add_Log("AAS", "Cancelled table message with index ${it.index} due to invalid broadcast zone")
|
||||
}
|
||||
} else {
|
||||
// invalid broadcast zone, delete from queue table
|
||||
@@ -80,6 +185,7 @@ fun main() {
|
||||
db.Add_Log("AAS", "Cancelled table message with index ${it.index} due to empty broadcast zone")
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user