Skip to content

Commit

Permalink
TxActivity implemented
Browse files Browse the repository at this point in the history
  • Loading branch information
PiotrTopa committed Jul 4, 2022
1 parent 991f0fe commit 02df79c
Show file tree
Hide file tree
Showing 8 changed files with 142 additions and 21 deletions.
2 changes: 2 additions & 0 deletions dispatcher.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ func dispatchStateChangeEvents(events <-chan model.Js8callEvent) (<-chan model.W
f = rxActivityNotifier
case model.EVENT_TYPE_RX_SPOT:
f = rxSpotNotifier
case model.EVENT_TYPE_TX_FRAME:
f = txFrameNotifier
case model.EVENT_TYPE_RIG_STATUS:
f = rigStatusNotifier
case model.EVENT_TYPE_STATION_CALLSIGN, model.EVENT_TYPE_STATION_GRID, model.EVENT_TYPE_STATION_INFO, model.EVENT_TYPE_STATION_STATUS:
Expand Down
21 changes: 21 additions & 0 deletions model/js8callEvent.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,3 +53,24 @@ type Js8callEventParams struct {
RptSent string `json:"RPT.SENT"`
RptRecv string `json:"RPT.RECV"`
}

func calcCahnnelFromOffset(offset uint16) uint16 {
return uint16(offset / 50)
}

func speedName(speed int) string {
switch speed {
case 0:
return "normal"
case 1:
return "fast"
case 2:
return "turbo"
case 4:
return "slow"
case 8:
return "ultra"
default:
return "unknown"
}
}
6 changes: 4 additions & 2 deletions model/rigStatus.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ type RigStatusWsEvent struct {
Dial uint32
Freq uint32
Offset uint16
Speed int
Channel uint16
Speed string
Selected string
}

Expand All @@ -24,7 +25,8 @@ func CreateRigStatusWsEvent(event *Js8callEvent) (*RigStatusWsEvent, error) {
o.Dial = event.Params.Dial
o.Freq = event.Params.Freq
o.Offset = event.Params.Offset
o.Channel = calcCahnnelFromOffset(o.Offset)
o.Selected = event.Params.Selected
o.Speed = event.Params.Speed
o.Speed = speedName(event.Params.Speed)
return o, nil
}
19 changes: 1 addition & 18 deletions model/rxPacket.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,23 +31,6 @@ type RxPacketObj struct {
Extra string
}

func speedName(speed int) string {
switch speed {
case 0:
return "normal"
case 1:
return "fast"
case 2:
return "turbo"
case 4:
return "slow"
case 8:
return "ultra"
default:
return "unknown"
}
}

func CreateRxPacketObj(event *Js8callEvent) (*RxPacketObj, error) {
if event.Type != EVENT_TYPE_RX_ACTIVITY && event.Type != EVENT_TYPE_RX_DIRECTED && event.Type != EVENT_TYPE_RX_DIRECTED_ME {
return nil, errors.New("wrong event type, cannot parse params")
Expand All @@ -57,9 +40,9 @@ func CreateRxPacketObj(event *Js8callEvent) (*RxPacketObj, error) {
o.Timestamp = fromJs8Timestamp(event.Params.UTC)
o.Type = event.Type
o.Dial = event.Params.Dial
o.Channel = uint16(event.Params.Offset / 50)
o.Freq = event.Params.Freq
o.Offset = event.Params.Offset
o.Channel = calcCahnnelFromOffset(o.Offset)
o.Snr = event.Params.Snr
o.Mode = MODE_JS8
o.Speed = speedName(event.Params.Speed)
Expand Down
2 changes: 1 addition & 1 deletion model/rxSpot.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ func CreateRxSpotObj(event *Js8callEvent) (*RxSpotObj, error) {
o.Grid = event.Params.Grid
o.Snr = event.Params.Snr
o.Dial = event.Params.Dial
o.Channel = uint16(event.Params.Offset / 50)
o.Channel = calcCahnnelFromOffset(event.Params.Offset)
o.Freq = event.Params.Freq
o.Offset = event.Params.Offset

Expand Down
80 changes: 80 additions & 0 deletions model/txPacket.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package model

import (
"database/sql"
"encoding/json"
"errors"
"fmt"
"time"
)

var (
SQL_TX_FRAME_INSERT = "INSERT INTO `TX_FRAME` (`TIMESTAMP`, `CHANNEL`, `DIAL`, `FREQ`, `OFFSET`, `MODE`, `SPEED`, `SELECTED`, `TONES`) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
)

type TxFrameObj struct {
Id int64
Timestamp time.Time
Channel uint16
Dial uint32
Freq uint32
Offset uint16
Mode string
Speed string
Selected string
Tones string
}

func CreateTxFrameObj(event *Js8callEvent) (*TxFrameObj, error) {
if event.Type != EVENT_TYPE_TX_FRAME {
return nil, errors.New("wrong event type, cannot parse params")
}

o := new(TxFrameObj)
o.Timestamp = time.Now().UTC()
return o, nil
}

func (obj *TxFrameObj) ApplyRigStatus(rig *RigStatusWsEvent) {
obj.Channel = rig.Channel
obj.Offset = rig.Offset
obj.Dial = rig.Dial
obj.Freq = rig.Freq
obj.Speed = rig.Speed
obj.Selected = rig.Selected
}

func (obj *TxFrameObj) Insert(db *sql.DB) error {
stmt, err := db.Prepare(SQL_TX_FRAME_INSERT)
if err != nil {
return fmt.Errorf("error preparing SQL query fo inserting new TxFrame record, caused by %w", err)
}
defer stmt.Close()

marshalledTones, err := json.Marshal(obj.Tones)
if err != nil {
return fmt.Errorf("unable to marshall tones %w", err)
}

res, err := stmt.Exec(
toSqlTime(obj.Timestamp),
&obj.Channel,
&obj.Dial,
&obj.Freq,
&obj.Offset,
&obj.Mode,
&obj.Speed,
&obj.Selected,
&marshalledTones,
)
if err != nil {
return fmt.Errorf("error executing SQL query inserting new TxFrame record, becouse of %w", err)
}

obj.Id, _ = res.LastInsertId()
return nil
}

func (obj *TxFrameObj) Save(db *sql.DB) error {
return obj.Insert(db)
}
16 changes: 16 additions & 0 deletions res/initDb.sql
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,22 @@ CREATE TABLE `RX_SPOT` (

CREATE INDEX RX_SPOT_DAY_IDX ON `RX_SPOT`(date(`TIMESTAMP`));

CREATE TABLE `TX_FRAME` (
`ID` INTEGER PRIMARY KEY AUTOINCREMENT,
`TIMESTAMP` TEXT NOT NULL,
`CHANNEL` INTEGER,
`DIAL` INTEGER,
`FREQ` INTEGER,
`OFFSET` INTEGER,
`MODE` TEXT,
`SPEED` TEXT,
`SELECTED` TEXT,
`TONES` TEXT
);

CREATE INDEX TX_FRAME_DAY_IDX ON `TX_FRAME`(date(`TIMESTAMP`));


CREATE TABLE `STATION_INFO` (
`ID` INTEGER PRIMARY KEY AUTOINCREMENT,
`TIMESTAMP` TEXT NOT NULL,
Expand Down
17 changes: 17 additions & 0 deletions txActivity.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package main

import (
"errors"

"github.com/PiotrTopa/js8web/model"
)

func txFrameNotifier(event *model.Js8callEvent, websocketEvents chan<- model.WebsocketEvent, databaseObjects chan<- model.DbObj) error {
obj, err := model.CreateTxFrameObj(event)
if err != nil {
return errors.New("can not convert TxFrame event to db object")
}
obj.ApplyRigStatus(&rigStatusCache)
databaseObjects <- obj
return nil
}

0 comments on commit 02df79c

Please sign in to comment.