Merge remote-tracking branch 'origin/master' into feature-webapp

This commit is contained in:
2025-10-14 14:20:08 +07:00
23 changed files with 212 additions and 162 deletions

View File

@@ -228,7 +228,7 @@ $(document).ready(function () {
let cells = window.selectedBroadcastZoneRow.find('td'); let cells = window.selectedBroadcastZoneRow.find('td');
/** @type {BroadcastZone} */ /** @type {BroadcastZone} */
let bz = { let bz = {
index: cells.eq(0).text(), index: Number(cells.eq(0).text()),
description: cells.eq(1).text(), description: cells.eq(1).text(),
SoundChannel: cells.eq(2).text(), SoundChannel: cells.eq(2).text(),
Box: cells.eq(3).text(), Box: cells.eq(3).text(),
@@ -250,7 +250,7 @@ $(document).ready(function () {
let cells = window.selectedBroadcastZoneRow.find('td'); let cells = window.selectedBroadcastZoneRow.find('td');
/** @type {BroadcastZone} */ /** @type {BroadcastZone} */
let bz = { let bz = {
index: cells.eq(0).text(), index: Number(cells.eq(0).text()),
description: cells.eq(1).text(), description: cells.eq(1).text(),
SoundChannel: cells.eq(2).text(), SoundChannel: cells.eq(2).text(),
Box: cells.eq(3).text(), Box: cells.eq(3).text(),

View File

@@ -175,7 +175,7 @@ $(document).ready(function () {
let cells = window.selectedlanguagerow.find('td'); let cells = window.selectedlanguagerow.find('td');
/** @type {Language} */ /** @type {Language} */
let ll = { let ll = {
index: cells.eq(0).text(), index: Number(cells.eq(0).text()),
tag: cells.eq(1).text(), tag: cells.eq(1).text(),
language: cells.eq(2).text() language: cells.eq(2).text()
} }
@@ -194,7 +194,7 @@ $(document).ready(function () {
let cells = window.selectedlanguagerow.find('td'); let cells = window.selectedlanguagerow.find('td');
/** @type {Language} */ /** @type {Language} */
let ll = { let ll = {
index: cells.eq(0).text(), index: Number(cells.eq(0).text()),
tag: cells.eq(1).text(), tag: cells.eq(1).text(),
language: cells.eq(2).text() language: cells.eq(2).text()
} }

View File

@@ -305,7 +305,7 @@ $(document).ready(function () {
let cells = window.selectedmessagerow.find('td'); let cells = window.selectedmessagerow.find('td');
/** @type {MessageBank} */ /** @type {MessageBank} */
let mb = { let mb = {
index: cells.eq(0).text(), index: Number(cells.eq(0).text()),
description: cells.eq(1).text(), description: cells.eq(1).text(),
language: cells.eq(2).text(), language: cells.eq(2).text(),
aNN_ID: parseInt(cells.eq(3).text()), aNN_ID: parseInt(cells.eq(3).text()),
@@ -329,7 +329,7 @@ $(document).ready(function () {
let cells = window.selectedmessagerow.find('td'); let cells = window.selectedmessagerow.find('td');
/** @type {MessageBank} */ /** @type {MessageBank} */
let mb = { let mb = {
index: cells.eq(0).text(), index: Number(cells.eq(0).text()),
description: cells.eq(1).text(), description: cells.eq(1).text(),
language: cells.eq(2).text(), language: cells.eq(2).text(),
aNN_ID: parseInt(cells.eq(3).text()), aNN_ID: parseInt(cells.eq(3).text()),

View File

@@ -252,7 +252,7 @@ $(document).ready(function () {
let cells = window.selectedschedulerow.find('td'); let cells = window.selectedschedulerow.find('td');
/** @type {ScheduleBank} */ /** @type {ScheduleBank} */
let sr = { let sr = {
index: cells.eq(0).text(), index: Number(cells.eq(0).text()),
description: cells.eq(1).text(), description: cells.eq(1).text(),
day: cells.eq(2).text(), day: cells.eq(2).text(),
time: cells.eq(3).text(), time: cells.eq(3).text(),
@@ -277,7 +277,7 @@ $(document).ready(function () {
let cells = window.selectedschedulerow.find('td'); let cells = window.selectedschedulerow.find('td');
/** @type {ScheduleBank} */ /** @type {ScheduleBank} */
let sr = { let sr = {
index: cells.eq(0).text(), index: Number(cells.eq(0).text()),
description: cells.eq(1).text(), description: cells.eq(1).text(),
day: cells.eq(2).text(), day: cells.eq(2).text(),
time: cells.eq(3).text(), time: cells.eq(3).text(),

View File

@@ -98,8 +98,9 @@ function fill_soundbanktablebody(vv) {
* @param {String} language * @param {String} language
* @param {String} category * @param {String} category
* @param {String} voiceType * @param {String} voiceType
* @param {Function} cb callback function when done
*/ */
function reloadSoundbankFiles(language, category, voiceType) { function reloadSoundbankFiles(language, category, voiceType, cb=null) {
window.select2data = []; window.select2data = [];
$('#modalpath').empty().trigger('change'); $('#modalpath').empty().trigger('change');
if (language && language.length > 0) { if (language && language.length > 0) {
@@ -117,6 +118,7 @@ function reloadSoundbankFiles(language, category, voiceType) {
width: '100%', width: '100%',
dropdownParent: $('#soundbankmodal') dropdownParent: $('#soundbankmodal')
}); });
if (cb) cb();
} }
}, (errdata) => { }, (errdata) => {
alert("Error loading soundbank files : " + errdata.message); alert("Error loading soundbank files : " + errdata.message);
@@ -278,6 +280,7 @@ $(document).ready(function () {
* @type {SoundBank} * @type {SoundBank}
*/ */
let nsb = { let nsb = {
index: 0,
Description: description, Description: description,
TAG: tag, TAG: tag,
Category: category, Category: category,
@@ -302,7 +305,7 @@ $(document).ready(function () {
let cells = window.selectedsoundrow.find('td'); let cells = window.selectedsoundrow.find('td');
/** @type {SoundBank} */ /** @type {SoundBank} */
let sb = { let sb = {
index: cells.eq(0).text(), index: Number(cells.eq(0).text()),
description: cells.eq(1).text(), description: cells.eq(1).text(),
tag: cells.eq(2).text(), tag: cells.eq(2).text(),
category: cells.eq(3).text(), category: cells.eq(3).text(),
@@ -325,7 +328,7 @@ $(document).ready(function () {
let cells = window.selectedsoundrow.find('td'); let cells = window.selectedsoundrow.find('td');
/** @type {SoundBank} */ /** @type {SoundBank} */
let sb = { let sb = {
index: cells.eq(0).text(), index: Number(cells.eq(0).text()),
Description: cells.eq(1).text(), Description: cells.eq(1).text(),
TAG: cells.eq(2).text(), TAG: cells.eq(2).text(),
Category: cells.eq(3).text(), Category: cells.eq(3).text(),
@@ -336,16 +339,24 @@ $(document).ready(function () {
if (confirm(`Are you sure to edit soundbank [${sb.index}] Description=${sb.Description} Tag=${sb.TAG}?`)) { if (confirm(`Are you sure to edit soundbank [${sb.index}] Description=${sb.Description} Tag=${sb.TAG}?`)) {
$modal.modal('show'); $modal.modal('show');
clearSoundbankModal(); clearSoundbankModal();
SetupEventForCategoryLanguageVoiceType();
$modalindex.val(sb.index).prop('disabled', true); $modalindex.val(sb.index).prop('disabled', true);
$modaldescription.val(sb.Description); $modaldescription.val(sb.Description);
$modaltag.val(sb.TAG); $modaltag.val(sb.TAG);
$modalcategory.val(sb.Category); $modalcategory.val(sb.Category);
selected_category = sb.Category;
$modallanguage.val(sb.Language); $modallanguage.val(sb.Language);
selected_language = sb.Language;
$modalvoicetype.val(sb.VoiceType); $modalvoicetype.val(sb.VoiceType);
$('#modalpath').val(sb.Path).trigger('change'); selected_voicetype = sb.VoiceType;
// load soundbank files for selected language, category, voiceType
reloadSoundbankFiles(selected_language, selected_category, selected_voicetype, () => {
// set selected path
$('#modalpath').val(getFilenameFromPath(sb.Path)).trigger('change');
});
SetupEventForCategoryLanguageVoiceType();
// event on Click save button // event on Click save button
$modal.off('click.soundbanksave').on('click.soundbanksave', '#soundbanksave', function () { $modal.off('click.soundbanksave').on('click.soundbanksave', '#soundbanksave', function () {
let description = $modaldescription.val().trim(); let description = $modaldescription.val().trim();
@@ -388,7 +399,7 @@ $(document).ready(function () {
sb.Language = language; sb.Language = language;
sb.VoiceType = voiceType; sb.VoiceType = voiceType;
sb.Path = path; sb.Path = path;
fetchAPI(APIURL + "UpdateByIndex/" + sb.index, "PUT", {}, sb, (okdata) => { fetchAPI(APIURL + "UpdateByIndex/" + sb.index, "PATCH", {}, sb, (okdata) => {
reloadSoundBank(APIURL); reloadSoundBank(APIURL);
alert("Success update soundbank : " + okdata.message); alert("Success update soundbank : " + okdata.message);
}, (errdata) => { }, (errdata) => {

View File

@@ -7,7 +7,6 @@
<title>AAS_NewGen_08OKT25</title> <title>AAS_NewGen_08OKT25</title>
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css"> <link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="assets/css/bss-overrides.css"> <link rel="stylesheet" href="assets/css/bss-overrides.css">
<link rel="stylesheet" href="assets/css/select2.min.css">
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css"> <link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
<link rel="stylesheet" href="assets/css/styles.css"> <link rel="stylesheet" href="assets/css/styles.css">
</head> </head>
@@ -287,7 +286,6 @@
<script src="assets/js/bs-init.js"></script> <script src="assets/js/bs-init.js"></script>
<script src="assets/js/soundchannel.js"></script> <script src="assets/js/soundchannel.js"></script>
<script src="assets/js/broadcastzones.js"></script> <script src="assets/js/broadcastzones.js"></script>
<script src="assets/js/select2.min.js"></script>
</body> </body>
</html> </html>

View File

@@ -7,7 +7,6 @@
<title>AAS_NewGen_08OKT25</title> <title>AAS_NewGen_08OKT25</title>
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css"> <link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="assets/css/bss-overrides.css"> <link rel="stylesheet" href="assets/css/bss-overrides.css">
<link rel="stylesheet" href="assets/css/select2.min.css">
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css"> <link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
<link rel="stylesheet" href="assets/css/styles.css"> <link rel="stylesheet" href="assets/css/styles.css">
</head> </head>
@@ -92,7 +91,6 @@
<script src="assets/bootstrap/js/bootstrap.min.js"></script> <script src="assets/bootstrap/js/bootstrap.min.js"></script>
<script src="assets/js/bs-init.js"></script> <script src="assets/js/bs-init.js"></script>
<script src="assets/js/languagelink.js"></script> <script src="assets/js/languagelink.js"></script>
<script src="assets/js/select2.min.js"></script>
</body> </body>
</html> </html>

View File

@@ -7,7 +7,6 @@
<title>AAS_NewGen_08OKT25</title> <title>AAS_NewGen_08OKT25</title>
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css"> <link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="assets/css/bss-overrides.css"> <link rel="stylesheet" href="assets/css/bss-overrides.css">
<link rel="stylesheet" href="assets/css/select2.min.css">
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css"> <link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
<link rel="stylesheet" href="assets/css/styles.css"> <link rel="stylesheet" href="assets/css/styles.css">
</head> </head>
@@ -54,7 +53,6 @@
<script src="assets/bootstrap/js/bootstrap.min.js"></script> <script src="assets/bootstrap/js/bootstrap.min.js"></script>
<script src="assets/js/bs-init.js"></script> <script src="assets/js/bs-init.js"></script>
<script src="assets/js/log.js"></script> <script src="assets/js/log.js"></script>
<script src="assets/js/select2.min.js"></script>
</body> </body>
</html> </html>

View File

@@ -7,7 +7,6 @@
<title>AAS NewGeneration 17092025</title> <title>AAS NewGeneration 17092025</title>
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css"> <link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="assets/css/bss-overrides.css"> <link rel="stylesheet" href="assets/css/bss-overrides.css">
<link rel="stylesheet" href="assets/css/select2.min.css">
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css"> <link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
<link rel="stylesheet" href="assets/css/styles.css"> <link rel="stylesheet" href="assets/css/styles.css">
</head> </head>
@@ -40,7 +39,6 @@
</section> </section>
<script src="assets/bootstrap/js/bootstrap.min.js"></script> <script src="assets/bootstrap/js/bootstrap.min.js"></script>
<script src="assets/js/bs-init.js"></script> <script src="assets/js/bs-init.js"></script>
<script src="assets/js/select2.min.js"></script>
</body> </body>
</html> </html>

View File

@@ -7,7 +7,6 @@
<title>AAS_NewGen_08OKT25</title> <title>AAS_NewGen_08OKT25</title>
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css"> <link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="assets/css/bss-overrides.css"> <link rel="stylesheet" href="assets/css/bss-overrides.css">
<link rel="stylesheet" href="assets/css/select2.min.css">
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css"> <link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
<link rel="stylesheet" href="assets/css/styles.css"> <link rel="stylesheet" href="assets/css/styles.css">
</head> </head>
@@ -134,7 +133,6 @@
<script src="assets/bootstrap/js/bootstrap.min.js"></script> <script src="assets/bootstrap/js/bootstrap.min.js"></script>
<script src="assets/js/bs-init.js"></script> <script src="assets/js/bs-init.js"></script>
<script src="assets/js/messagebank.js"></script> <script src="assets/js/messagebank.js"></script>
<script src="assets/js/select2.min.js"></script>
</body> </body>
</html> </html>

View File

@@ -7,7 +7,6 @@
<title>AAS_NewGen_08OKT25</title> <title>AAS_NewGen_08OKT25</title>
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css"> <link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="assets/css/bss-overrides.css"> <link rel="stylesheet" href="assets/css/bss-overrides.css">
<link rel="stylesheet" href="assets/css/select2.min.css">
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css"> <link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
<link rel="stylesheet" href="assets/css/styles.css"> <link rel="stylesheet" href="assets/css/styles.css">
</head> </head>
@@ -1325,7 +1324,6 @@
</div> </div>
<script src="assets/bootstrap/js/bootstrap.min.js"></script> <script src="assets/bootstrap/js/bootstrap.min.js"></script>
<script src="assets/js/bs-init.js"></script> <script src="assets/js/bs-init.js"></script>
<script src="assets/js/select2.min.js"></script>
</body> </body>
</html> </html>

View File

@@ -7,7 +7,6 @@
<title>AAS_NewGen_08OKT25</title> <title>AAS_NewGen_08OKT25</title>
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css"> <link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="assets/css/bss-overrides.css"> <link rel="stylesheet" href="assets/css/bss-overrides.css">
<link rel="stylesheet" href="assets/css/select2.min.css">
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css"> <link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
<link rel="stylesheet" href="assets/css/styles.css"> <link rel="stylesheet" href="assets/css/styles.css">
</head> </head>
@@ -20,7 +19,6 @@
</div> </div>
<script src="assets/bootstrap/js/bootstrap.min.js"></script> <script src="assets/bootstrap/js/bootstrap.min.js"></script>
<script src="assets/js/bs-init.js"></script> <script src="assets/js/bs-init.js"></script>
<script src="assets/js/select2.min.js"></script>
</body> </body>
</html> </html>

View File

@@ -7,7 +7,6 @@
<title>AAS_NewGen_08OKT25</title> <title>AAS_NewGen_08OKT25</title>
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css"> <link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="assets/css/bss-overrides.css"> <link rel="stylesheet" href="assets/css/bss-overrides.css">
<link rel="stylesheet" href="assets/css/select2.min.css">
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css"> <link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
<link rel="stylesheet" href="assets/css/styles.css"> <link rel="stylesheet" href="assets/css/styles.css">
</head> </head>
@@ -113,7 +112,6 @@
<script src="assets/bootstrap/js/bootstrap.min.js"></script> <script src="assets/bootstrap/js/bootstrap.min.js"></script>
<script src="assets/js/bs-init.js"></script> <script src="assets/js/bs-init.js"></script>
<script src="assets/js/soundbank.js"></script> <script src="assets/js/soundbank.js"></script>
<script src="assets/js/select2.min.js"></script>
</body> </body>
</html> </html>

View File

@@ -7,7 +7,6 @@
<title>AAS_NewGen_08OKT25</title> <title>AAS_NewGen_08OKT25</title>
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css"> <link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="assets/css/bss-overrides.css"> <link rel="stylesheet" href="assets/css/bss-overrides.css">
<link rel="stylesheet" href="assets/css/select2.min.css">
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css"> <link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
<link rel="stylesheet" href="assets/css/styles.css"> <link rel="stylesheet" href="assets/css/styles.css">
</head> </head>
@@ -32,7 +31,6 @@
</div> </div>
<script src="assets/bootstrap/js/bootstrap.min.js"></script> <script src="assets/bootstrap/js/bootstrap.min.js"></script>
<script src="assets/js/bs-init.js"></script> <script src="assets/js/bs-init.js"></script>
<script src="assets/js/select2.min.js"></script>
</body> </body>
</html> </html>

View File

@@ -7,7 +7,6 @@
<title>AAS_NewGen_08OKT25</title> <title>AAS_NewGen_08OKT25</title>
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css"> <link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="assets/css/bss-overrides.css"> <link rel="stylesheet" href="assets/css/bss-overrides.css">
<link rel="stylesheet" href="assets/css/select2.min.css">
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css"> <link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
<link rel="stylesheet" href="assets/css/styles.css"> <link rel="stylesheet" href="assets/css/styles.css">
</head> </head>
@@ -178,7 +177,6 @@
<script src="assets/bootstrap/js/bootstrap.min.js"></script> <script src="assets/bootstrap/js/bootstrap.min.js"></script>
<script src="assets/js/bs-init.js"></script> <script src="assets/js/bs-init.js"></script>
<script src="assets/js/schedulebank.js"></script> <script src="assets/js/schedulebank.js"></script>
<script src="assets/js/select2.min.js"></script>
</body> </body>
</html> </html>

View File

@@ -7,7 +7,6 @@
<title>AAS_NewGen_08OKT25</title> <title>AAS_NewGen_08OKT25</title>
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css"> <link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="assets/css/bss-overrides.css"> <link rel="stylesheet" href="assets/css/bss-overrides.css">
<link rel="stylesheet" href="assets/css/select2.min.css">
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css"> <link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
<link rel="stylesheet" href="assets/css/styles.css"> <link rel="stylesheet" href="assets/css/styles.css">
</head> </head>
@@ -200,7 +199,6 @@
</div> </div>
<script src="assets/bootstrap/js/bootstrap.min.js"></script> <script src="assets/bootstrap/js/bootstrap.min.js"></script>
<script src="assets/js/bs-init.js"></script> <script src="assets/js/bs-init.js"></script>
<script src="assets/js/select2.min.js"></script>
<script src="assets/js/usermanagement.js"></script> <script src="assets/js/usermanagement.js"></script>
</body> </body>

View File

@@ -31,7 +31,7 @@ lateinit var audioPlayer: AudioPlayer
val StreamerOutputs: MutableMap<String, BarixConnection> = HashMap() val StreamerOutputs: MutableMap<String, BarixConnection> = HashMap()
lateinit var udpreceiver: UDPReceiver lateinit var udpreceiver: UDPReceiver
lateinit var tcpreceiver: TCPReceiver lateinit var tcpreceiver: TCPReceiver
const val version = "0.0.5 (09/10/2025)" const val version = "0.0.6 (14/10/2025)"
// AAS 64 channels // AAS 64 channels
const val max_channel = 64 const val max_channel = 64

View File

@@ -20,7 +20,6 @@ class BarixConnection(val index: UInt, var channel: String, val ipaddress: Strin
private var _sd: Int = 0 private var _sd: Int = 0
private var _vu: Int = 0 private var _vu: Int = 0
private var _onlinecounter = 0 private var _onlinecounter = 0
private val udp = DatagramSocket(0)
private val inet = InetSocketAddress(ipaddress, port) private val inet = InetSocketAddress(ipaddress, port)
private val maxUDPsize = 1000 private val maxUDPsize = 1000
private var _tcp: Socket? = null private var _tcp: Socket? = null
@@ -105,7 +104,7 @@ class BarixConnection(val index: UInt, var channel: String, val ipaddress: Strin
fun SendData(data: ByteArray, cbOK: Consumer<String>, cbFail: Consumer<String>) { fun SendData(data: ByteArray, cbOK: Consumer<String>, cbFail: Consumer<String>) {
if (data.isNotEmpty()) { if (data.isNotEmpty()) {
CoroutineScope(Dispatchers.IO).launch { CoroutineScope(Dispatchers.IO).launch {
DatagramSocket().use{ udp ->
val bb = ByteBuffer.wrap(data) val bb = ByteBuffer.wrap(data)
while(bb.hasRemaining()){ while(bb.hasRemaining()){
try { try {
@@ -124,7 +123,7 @@ class BarixConnection(val index: UInt, var channel: String, val ipaddress: Strin
} }
} }
cbOK.accept("SendData to $channel ($ipaddress:$port) succeeded, ${data.size} bytes sent") cbOK.accept("SendData to $channel ($ipaddress:$port) succeeded, ${data.size} bytes sent")
}
} }
} else cbFail.accept("SendData to $ipaddress:$port failed, data is empty") } else cbFail.accept("SendData to $ipaddress:$port failed, data is empty")

View File

@@ -3,8 +3,10 @@ package barix
import codes.Somecodes.Companion.ValidString import codes.Somecodes.Companion.ValidString
import kotlinx.coroutines.* import kotlinx.coroutines.*
import org.tinylog.Logger import org.tinylog.Logger
import java.io.DataInputStream
import java.net.ServerSocket import java.net.ServerSocket
import java.net.Socket import java.net.Socket
import java.nio.ByteBuffer
import java.util.function.Consumer import java.util.function.Consumer
@Suppress("unused") @Suppress("unused")
@@ -38,14 +40,18 @@ class TCP_Barix_Command_Server {
socketMap[key] = socket socketMap[key] = socket
Logger.info { "Start communicating with Streamer Output with IP : $key" } Logger.info { "Start communicating with Streamer Output with IP : $key" }
try{ try{
val din = socket.getInputStream()
while (isActive) {
if (din.available()>0){ val din = DataInputStream(socket.getInputStream())
val bb = ByteArray(din.available()) while (isActive) {
din.read(bb) val length = ByteArray(4)
din.readFully(length)
val readlength = ByteBuffer.wrap(length).getInt()
//println("Read Length : $readlength")
val bb = ByteArray(readlength)
din.readFully(bb)
// B4A format, 4 bytes di depan adalah size // B4A format, 4 bytes di depan adalah size
val str = String(bb, 4, bb.size - 4) val str = String(bb)
//println("Received from $key : $str")
if (ValidString(str)) { if (ValidString(str)) {
// Valid command from Barix is in format $"STATUSBARIX;VU;BuffRemain;StatusData"$ // Valid command from Barix is in format $"STATUSBARIX;VU;BuffRemain;StatusData"$
pattern.find(str)?.let { matchResult -> pattern.find(str)?.let { matchResult ->
@@ -62,7 +68,7 @@ class TCP_Barix_Command_Server {
Logger.warn { "Invalid command format from $key : $str" } Logger.warn { "Invalid command format from $key : $str" }
} }
} }
}
} }
} catch (ex:Exception){ } catch (ex:Exception){
Logger.error { "Error in communication with Streamer Output with IP $key, Message : ${ex.message}" } Logger.error { "Error in communication with Streamer Output with IP $key, Message : ${ex.message}" }

View File

@@ -62,6 +62,14 @@ class Somecodes {
return Soundbank_directory.resolve(language.name).resolve(voice.name).resolve(category.name) return Soundbank_directory.resolve(language.name).resolve(voice.name).resolve(category.name)
} }
fun SoundbankDirectory(language: String, voice: String, category: String) : Path{
return SoundbankDirectory(
Language.valueOf(language),
VoiceType.valueOf(voice),
Category.valueOf(category)
)
}
fun ExtractFilesFromClassPath(resourcePath: String, outputDir: Path) { fun ExtractFilesFromClassPath(resourcePath: String, outputDir: Path) {
try { try {
val resource = Somecodes::class.java.getResource(resourcePath) val resource = Somecodes::class.java.getResource(resourcePath)

View File

@@ -104,7 +104,7 @@ class MariaDB(
List.clear() List.clear()
try { try {
val statement = connection.createStatement() val statement = connection.createStatement()
val resultSet = statement?.executeQuery("SELECT * FROM ${super.dbName}") val resultSet = statement?.executeQuery("SELECT * FROM ${super.dbName} ORDER BY Category, Language, VoiceType, TAG")
while (resultSet?.next() == true) { while (resultSet?.next() == true) {
val soundbank = Soundbank( val soundbank = Soundbank(
resultSet.getLong("index").toUInt(), resultSet.getLong("index").toUInt(),
@@ -225,7 +225,7 @@ class MariaDB(
// use a temporary table to reorder the index // use a temporary table to reorder the index
statement?.executeUpdate("CREATE TABLE IF NOT EXISTS $tempdb_name LIKE ${super.dbName}") statement?.executeUpdate("CREATE TABLE IF NOT EXISTS $tempdb_name LIKE ${super.dbName}")
statement?.executeUpdate("TRUNCATE TABLE $tempdb_name") statement?.executeUpdate("TRUNCATE TABLE $tempdb_name")
statement?.executeUpdate("INSERT INTO $tempdb_name (Description, TAG, Category, Language, VoiceType, Path) SELECT Description, TAG, Category, Language, VoiceType, Path FROM ${super.dbName} ORDER BY Description ") statement?.executeUpdate("INSERT INTO $tempdb_name (Description, TAG, Category, Language, VoiceType, Path) SELECT Description, TAG, Category, Language, VoiceType, Path FROM ${super.dbName} ORDER BY Category, Language, VoiceType, TAG ")
statement?.executeUpdate("TRUNCATE TABLE ${super.dbName}") statement?.executeUpdate("TRUNCATE TABLE ${super.dbName}")
statement?.executeUpdate("INSERT INTO ${super.dbName} (Description, TAG, Category, Language, VoiceType, Path) SELECT Description, TAG, Category, Language, VoiceType, Path FROM $tempdb_name") statement?.executeUpdate("INSERT INTO ${super.dbName} (Description, TAG, Category, Language, VoiceType, Path) SELECT Description, TAG, Category, Language, VoiceType, Path FROM $tempdb_name")
statement?.executeUpdate("DROP TABLE $tempdb_name") statement?.executeUpdate("DROP TABLE $tempdb_name")
@@ -1250,9 +1250,9 @@ class MariaDB(
// use a temporary table to reorder the index // use a temporary table to reorder the index
statement?.executeUpdate("CREATE TABLE IF NOT EXISTS $tempdb_name LIKE ${super.dbName}") statement?.executeUpdate("CREATE TABLE IF NOT EXISTS $tempdb_name LIKE ${super.dbName}")
statement?.executeUpdate("TRUNCATE TABLE $tempdb_name") statement?.executeUpdate("TRUNCATE TABLE $tempdb_name")
statement?.executeUpdate("INSERT INTO $tempdb_name (Date_Time, Source, Type, Message, SB_TAGS, BroadcastZones, Repeat, Language) SELECT Date_Time, Source, Type, Message, SB_TAGS, BroadcastZones, Repeat, Language FROM ${super.dbName} ORDER BY `index` ") statement?.executeUpdate("INSERT INTO $tempdb_name (Date_Time, Source, Type, Message, SB_TAGS, BroadcastZones, `Repeat`, Language) SELECT Date_Time, Source, Type, Message, SB_TAGS, BroadcastZones, `Repeat`, Language FROM ${super.dbName} ORDER BY `index` ")
statement?.executeUpdate("TRUNCATE TABLE ${super.dbName}") statement?.executeUpdate("TRUNCATE TABLE ${super.dbName}")
statement?.executeUpdate("INSERT INTO ${super.dbName} (Date_Time, Source, Type, Message, SB_TAGS, BroadcastZones, Repeat, Language) SELECT Date_Time, Source, Type, Message, SB_TAGS, BroadcastZones, Repeat, Language FROM $tempdb_name") statement?.executeUpdate("INSERT INTO ${super.dbName} (Date_Time, Source, Type, Message, SB_TAGS, BroadcastZones, `Repeat`, Language) SELECT Date_Time, Source, Type, Message, SB_TAGS, BroadcastZones, `Repeat`, Language FROM $tempdb_name")
statement?.executeUpdate("DROP TABLE $tempdb_name") statement?.executeUpdate("DROP TABLE $tempdb_name")
Logger.info("${super.dbName} table resorted by index" as Any) Logger.info("${super.dbName} table resorted by index" as Any)
// reload the local list // reload the local list

View File

@@ -1,5 +1,7 @@
package database package database
import content.Category
data class Soundbank( data class Soundbank(
var index: UInt, var index: UInt,
var Description: String, var Description: String,
@@ -8,4 +10,45 @@ data class Soundbank(
var Language: String, var Language: String,
var VoiceType: String, var VoiceType: String,
var Path: String, var Path: String,
) ){
/**
* Check if all fields are not empty
*/
fun isNotEmpty(): Boolean{
if (Description.isNotEmpty()){
if (TAG.isNotEmpty()){
if (Category.isNotEmpty()){
if (Language.isNotEmpty()){
if (VoiceType.isNotEmpty()){
if (Path.isNotEmpty()){
return true
}
}
}
}
}
}
return false
}
/**
* Check if Category is valid
*/
fun ValidCategory() : Boolean{
return content.Category.entries.any{ it.name == this.Category}
}
/**
* Check if VoiceType is valid
*/
fun ValidVoiceType() : Boolean{
return content.VoiceType.entries.any{ it.name == this.VoiceType}
}
/**
* Check if Language is valid
*/
fun ValidLanguage() : Boolean{
return content.Language.entries.any{ it.name == this.Language}
}
}

View File

@@ -254,17 +254,15 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
post("Add") { post("Add") {
try { try {
val addvalue = objectmapper.readValue(it.body(), Soundbank::class.java) val addvalue = objectmapper.readValue(it.body(), Soundbank::class.java)
if (ValidString(addvalue.Description)) { if (addvalue.isNotEmpty()){
if (ValidString(addvalue.TAG)) { // check apakah TAG sudah ada untuk language, category dan voicetype yang sama
if (ValidString(addvalue.Category)) {
if (ValidString(addvalue.Language)) {
if (ValidString(addvalue.Path)) {
// check apakah TAG sudah ada untuk language dan category yang sama
val exists = db.soundDB.List.any { sb -> val exists = db.soundDB.List.any { sb ->
sb.TAG == addvalue.TAG && sb.Language == addvalue.Language && sb.Category == addvalue.Category sb.TAG == addvalue.TAG && sb.Language == addvalue.Language && sb.Category == addvalue.Category && sb.VoiceType == addvalue.VoiceType
} }
if (!exists) { if (!exists) {
if (ValidFile(addvalue.Path)) { val absolutepath = Somecodes.SoundbankDirectory(Language.valueOf(addvalue.Language), VoiceType.valueOf(addvalue.VoiceType), Category.valueOf(addvalue.Category)).resolve(addvalue.Path)
if (Files.isRegularFile(absolutepath)) {
addvalue.Path = absolutepath.toAbsolutePath().toString()
if (db.soundDB.Add(addvalue)) { if (db.soundDB.Add(addvalue)) {
db.soundDB.Resort() db.soundDB.Resort()
it.result(objectmapper.writeValueAsString(resultMessage("OK"))) it.result(objectmapper.writeValueAsString(resultMessage("OK")))
@@ -274,13 +272,10 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
.result(objectmapper.writeValueAsString(resultMessage("Invalid Path, file does not exist"))) .result(objectmapper.writeValueAsString(resultMessage("Invalid Path, file does not exist")))
} else it.status(400) } else it.status(400)
.result(objectmapper.writeValueAsString(resultMessage("TAG=${addvalue.TAG} already exists for the same Language=${addvalue.Language} and Category=${addvalue.Category}"))) .result(objectmapper.writeValueAsString(resultMessage("TAG=${addvalue.TAG} already exists for the same Language=${addvalue.Language} and Category=${addvalue.Category}")))
} else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Path"))) } else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Some fields are empty")))
} else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Language")))
} else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Category"))) } catch (e: Exception) {
} else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid TAG"))) it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid request body, Message: ${e.message}")))
} else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Description")))
} catch (_: Exception) {
it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid request body")))
} }
} }
delete("List") { delete("List") {
@@ -309,68 +304,78 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
patch("UpdateByIndex/{index}") { patch("UpdateByIndex/{index}") {
// update by index // update by index
val index = it.pathParam("index").toUIntOrNull() val index = it.pathParam("index").toUIntOrNull()
if (index == null) { if (index!=null){
// tidak ada path param index
it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid index")))
} else {
val sb = db.soundDB.List.find { xx -> xx.index == index } val sb = db.soundDB.List.find { xx -> xx.index == index }
if (sb == null) { if (sb!=null){
// soundbank dengan index tersebut tidak ditemukan try{
it.status(404).result(objectmapper.writeValueAsString(resultMessage("Soundbank with index $index not found"))) //println("index=$index, body=${it.body()}")
} else { val newsb = objectmapper.readValue(it.body(), Soundbank::class.java)
// soundbank dengan index tersebut ditemukan, sekarang update //println("newsb=$newsb")
val json: JsonNode = objectmapper.readTree(it.body()) if (newsb.isNotEmpty()){
if (json.isEmpty) { var varchanged = false
it.status(400).result(objectmapper.writeValueAsString(resultMessage("UpdateByIndex with index=$index has empty body"))) if (newsb.Description != sb.Description) {
} else { sb.Description = newsb.Description
val _description = json.get("Description").asText("") varchanged = true
val _tag = json.get("TAG").asText("")
val _category = json.get("Category").asText("")
val _language = json.get("Language").asText("")
val _path = json.get("Path").asText("")
var changed = false
if (ValidString(_description) && _description != sb.Description) {
sb.Description = _description
changed = true
} }
if (ValidString(_tag) && _tag != sb.TAG) { if (newsb.TAG != sb.TAG) {
sb.TAG = _tag sb.TAG = newsb.TAG
changed = true varchanged = true
}
if (newsb.ValidCategory()) {
if (newsb.Category != sb.Category){
sb.Category = newsb.Category
varchanged = true
} }
if (ValidString(_category) && _category != sb.Category) {
if (Category.entries.any { cat ->
cat.name == _category
}) {
sb.Category = _category
changed = true
} else { } else {
it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Category"))) it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Category")))
return@patch return@patch
} }
if (newsb.ValidLanguage()) {
if (newsb.Language != sb.Language){
sb.Language = newsb.Language
varchanged = true
} }
if (ValidString(_language) && _language != sb.Language) {
sb.Language = _language
changed = true
}
if (ValidString(_path) && _path != sb.Path) {
if (ValidFile(_path)) {
sb.Path = _path
changed = true
} else { } else {
it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Path, file does not exist"))) it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Language")))
return@patch return@patch
} }
if (newsb.ValidVoiceType()) {
if (newsb.VoiceType != sb.VoiceType){
sb.VoiceType = newsb.VoiceType
varchanged = true
} }
if (changed) { } else {
it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid VoiceType")))
return@patch
}
val newpath = Somecodes.SoundbankDirectory(newsb.Language, newsb.VoiceType, newsb.Category).resolve(newsb.Path)
if (Files.isRegularFile(newpath)){
if (newpath.toAbsolutePath().toString() != sb.Path) {
sb.Path = newpath.toAbsolutePath().toString()
varchanged = true
}
} else {
it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid path")))
return@patch
}
if (varchanged) {
//println("Some fields changed for index=$index, updating...")
if (db.soundDB.UpdateByIndex(index.toInt(), sb)) { if (db.soundDB.UpdateByIndex(index.toInt(), sb)) {
db.soundDB.Resort() db.soundDB.Resort()
it.result(objectmapper.writeValueAsString(resultMessage("OK"))) it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to update soundbank with index $index"))) } else it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to update soundbank with index $index")))
} else it.status(400) } else it.status(400)
.result(objectmapper.writeValueAsString(resultMessage("Nothing has changed for soundbank with index $index"))) .result(objectmapper.writeValueAsString(resultMessage("Nothing has changed for soundbank with index $index")))
} else Exception("Some fields are empty")
} catch(e: Exception){
it.status(400).result(objectmapper.writeValueAsString(resultMessage("Unable to parse request body to Soundbank, Message: ${e.message}")))
} }
}
} } else it.status(404).result(objectmapper.writeValueAsString(resultMessage("Soundbank with index $index not found")))
} else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid index")))
} }
get("ExportXLSX") { get("ExportXLSX") {
val xlsxdata = db.soundDB.Export_XLSX() val xlsxdata = db.soundDB.Export_XLSX()