2023-09-29 16:16:33 +02:00
const { ALERT , ERROR , WARNING , NOTICE , INFO , DEBUG } = require ( 'DOUGAL_ROOT/debug' ) ( _ _filename ) ;
2021-05-24 13:48:53 +02:00
class DetectSOLEOL {
2022-04-29 14:48:21 +02:00
2023-10-14 20:53:42 +02:00
author = ` * ${ this . constructor . name } * ` ;
prev = null ;
2022-04-29 14:48:21 +02:00
2023-10-14 20:53:42 +02:00
constructor ( ) {
DEBUG ( ` ${ this . author } instantiated ` ) ;
2021-05-24 13:48:53 +02:00
}
2022-04-29 14:48:21 +02:00
2023-10-14 20:53:42 +02:00
async run ( data , ctx ) {
2021-05-24 18:30:53 +02:00
if ( ! data || data . channel !== "realtime" ) {
2021-05-24 13:48:53 +02:00
return ;
}
if ( ! ( data . payload && data . payload . new && data . payload . new . meta ) ) {
return ;
}
2022-04-29 14:48:21 +02:00
2023-10-14 20:53:42 +02:00
if ( ! this . prev ) {
DEBUG ( "Initialising `prev`" ) ;
this . prev = data ;
return ;
}
2022-04-29 14:48:21 +02:00
2023-10-14 20:53:42 +02:00
try {
DEBUG ( "Running" ) ;
// DEBUG("%j", data);
const cur = data ? . payload ? . new ? . meta ;
const prev = this . prev ? . payload ? . new ? . meta ;
const sequence = Number ( cur . _sequence ) ;
2022-04-29 14:48:21 +02:00
2023-10-14 20:53:42 +02:00
// DEBUG("%j", prev);
// DEBUG("%j", cur);
DEBUG ( "prv.lineName: %s\ncur.lineName: %s\nprv._sequence: %s\ncur._sequence: %s\nprv.lineStatus: %s\ncur.lineStatus: %s" , prev . lineName , cur . lineName , prev . _sequence , cur . _sequence , prev . lineStatus , cur . lineStatus ) ;
if ( prev . lineName == cur . lineName && prev . _sequence == cur . _sequence &&
prev . lineStatus != "online" && cur . lineStatus == "online" && sequence ) {
INFO ( "Transition to ONLINE detected" ) ;
// We must use schema2pid because the pid may not have been
// populated for this event.
2025-08-15 14:45:46 +02:00
const projectId = await ctx . schema2pid ( cur . _schema ? ? prev . _schema ) ;
2023-10-14 20:53:42 +02:00
const labels = [ "FSP" , "FGSP" ] ;
const remarks = ` SEQ ${ cur . _sequence } , SOL ${ cur . lineName } , BSP: ${ ( cur . speed * 3.6 / 1.852 ) . toFixed ( 1 ) } kt, Water depth: ${ Number ( cur . waterDepth ) . toFixed ( 0 ) } m.` ;
const payload = {
type : "sequence" ,
sequence ,
point : cur . _point ,
remarks ,
labels ,
meta : { auto : true , author : ` * ${ this . constructor . name } * ` }
}
INFO ( "Posting event" , projectId , payload ) ;
2025-08-15 14:45:46 +02:00
if ( ctx . dryRun ) {
DEBUG ( ` DRY RUN: await ctx.db.event.post( ${ projectId } , ${ payload } ); ` ) ;
} else {
await ctx . db . event . post ( projectId , payload ) ;
}
2023-10-14 20:53:42 +02:00
} else if ( prev . lineName == cur . lineName && prev . _sequence == cur . _sequence &&
prev . lineStatus == "online" && cur . lineStatus != "online" && sequence ) {
INFO ( "Transition to OFFLINE detected" ) ;
2025-08-15 14:45:46 +02:00
const projectId = await ctx . schema2pid ( prev . _schema ? ? cur . _schema ) ;
2023-10-14 20:53:42 +02:00
const labels = [ "LSP" , "LGSP" ] ;
2025-08-15 14:45:46 +02:00
const remarks = ` SEQ ${ prev . _sequence } , EOL ${ prev . lineName } , BSP: ${ ( prev . speed * 3.6 / 1.852 ) . toFixed ( 1 ) } kt, Water depth: ${ Number ( prev . waterDepth ) . toFixed ( 0 ) } m.` ;
2023-10-14 20:53:42 +02:00
const payload = {
type : "sequence" ,
sequence ,
2025-08-15 14:47:39 +02:00
point : prev . _point ,
2023-10-14 20:53:42 +02:00
remarks ,
labels ,
meta : { auto : true , author : ` * ${ this . constructor . name } * ` }
}
INFO ( "Posting event" , projectId , payload ) ;
2025-08-15 14:45:46 +02:00
if ( ctx . dryRun ) {
DEBUG ( ` DRY RUN: await ctx.db.event.post( ${ projectId } , ${ payload } ); ` ) ;
} else {
await ctx . db . event . post ( projectId , payload ) ;
}
2023-10-14 20:53:42 +02:00
}
2022-04-29 14:48:21 +02:00
2023-10-14 20:53:42 +02:00
} catch ( err ) {
DEBUG ( ` ${ this . author } error ` , err ) ;
throw err ;
} finally {
this . prev = data ;
2021-05-24 13:48:53 +02:00
}
}
2023-10-14 20:53:42 +02:00
2021-05-24 13:48:53 +02:00
}
module . exports = DetectSOLEOL ;