ZyLO

Plugin Development Manual

icon

ZyLO is the official plugin SDK for zLog, a powerful and extensible logging software for amateur radio contests.

ZyLO

image image badge badge

ZyLO is the official plugin SDK for zLog v2.8 or later. zLog is powerful and extensible logging software for amateur radio contests, and users can easily install plugins via plugin manager dialog.

Documents

Get Started

SDK

First, prepare the package management system (brew, choco, and apt) and install Go.

$ brew install go
$ choco install golang
$ sudo apt install -y golang-go

Then, run the following commands to set up the SDK.

$ go install github.com/nextzlog/zylo/zbuild@HEAD
$ zbuild setup

Template

Create a directory and the source file shown below in it in the same way as creating a Go package.

package main

import "zylo/reiwa"

func init() {
  // when plugin loaded
  reiwa.OnLaunchEvent = onLaunchEvent
  reiwa.OnFinishEvent = onFinishEvent
  reiwa.OnAttachEvent = onAttachEvent
  reiwa.OnAssignEvent = onAssignEvent
  reiwa.OnDetachEvent = onDetachEvent
  reiwa.OnInsertEvent = onInsertEvent
  reiwa.OnDeleteEvent = onDeleteEvent
  reiwa.OnVerifyEvent = onVerifyEvent
  reiwa.OnPointsEvent = onPointsEvent
}

func onLaunchEvent() {
  // when zLog launched
}

func onFinishEvent() {
  // when zLog finished
}

func onAttachEvent(contest, configs string) {
  // when contest attached
}

func onAssignEvent(contest, configs string) {
  // if CFG calls this DLL
}

func onDetachEvent(contest, configs string) {
  // when contest detached
}

func onInsertEvent(qso *reiwa.QSO) {
  // when insert this QSO
}

func onDeleteEvent(qso *reiwa.QSO) {
  // when delete this QSO
}

func onVerifyEvent(qso *reiwa.QSO) {
  // score and multiplier
}

func onPointsEvent(score, mults int) int {
  return score * mults
}

Build

Run zbuild inside the directory to build a plugin DLL with the same name as the directory.

$ zbuild build
$ zbuild build --version 2.8.3.0

Launch

To test the plugin, put the relative path to the DLL into zlog.ini as follows and launch zLog.

[zylo]
DLLs=hstest.dll,yltest.dll,rttest.dll

Publish

First, create a TOML file and include the download URL and md5 checksum in the dll table. You can include the checksum directly or include the URL of the md5 file.

# dll.<name>
[dll.sample]
url = "https://example.com/releases/sample.dll"
sum = "https://example.com/releases/sample.dll.md5"

You can also publish other files along with the DLL, such as CFG and DAT files.

# cfg.<name>
[cfg.sample]
url = "https://example.com/releases/sample.cfg"

# dat.<name>
[dat.sample]
url = "https://example.com/releases/sample.dat"

Finally, write the plugin meta information, which will be displayed in the plugin manager.

# pkg.<name>
[pkg.sample]
tag = "title"
msg = "description"
web = "https://example.com/sample/index.html"
doc = "https://example.com/sample/details.md"
use = ["cfg.sample", "dat.sample", "dll.sample"] # dependency
exp = "unstable" # or "stable"

Publish the TOML file to a Git repository, and make an issue at nextzlog/todo to request crawling.

GitHub Actions

The following workflow automates plugin releases.

name: 'build'
on:
  push:
    branches:
    - 'main'
jobs:
  BuildDLL:
    runs-on: ubuntu-latest
    steps:
    - uses: nextzlog/zylo@master
      with:
        token: $
        directory: /path/to/golang/files

Scoring

To delegate score calculation for user-defined contests to a plugin, add the following commands to the end of the CFG file.

exit
dll sample.dll # basename

The following functions are called only for DLLs specified in the CFG file.

  • OnAssignEvent invoked only once at the start of the scoring delegation.
  • OnVerifyEvent determines the score and multiplier of the communication.
  • OnPointsEvent determines the total score of the contest communications.

Windows API

Plugins can monitor button and menu clicks and keyboard input in zLog application.

package main

import "zylo/reiwa"

func init() {
  reiwa.OnLaunchEvent = onLaunchEvent
}

func onLaunchEvent() {
  reiwa.HandleButton("MainForm.CWPlayButton", onButton)
  reiwa.HandleEditor("MainForm.CallsignEdit", onEditor)
}

func onButton(num int) {
  reiwa.DisplayToast("CWPlayButton was clicked")
}

func onEditor(key int) {
  reiwa.DisplayToast(reiwa.Query("QSO with $B"))
}

Plugins can obtain the window handle of a zLog component with the GetUI function. Plugins can also use Go binding of Windows API to add their own components and handle events.

package main

import (
  "fmt"
  "unsafe"
  "github.com/gonutz/w32"
  "zylo/reiwa"
)

func init() {
  reiwa.OnLaunchEvent = onLaunchEvent
  reiwa.OnWindowEvent = onWindowEvent
}

func onLaunchEvent() {
  h := w32.HMENU(reiwa.GetUI("MainForm.MainMenu"))
  w32.AppendMenu(h, w32.MF_STRING, 810, "My Menu")
  w32.DrawMenuBar(w32.HWND(reiwa.GetUI("MainForm")))
}

func onWindowEvent(msg uintptr) {
  m := (*w32.MSG)(unsafe.Pointer(msg))
  fmt.Printf("Window Message %v\n", m)
}

Delphi API

Plugins can get and set properties and execute methods of zLog components in the form of Delphi expressions.

package main

import "zylo/reiwa"

func init() {
  reiwa.OnLaunchEvent = onLaunchEvent
}

func onLaunchEvent() {
  reiwa.RunDelphi(`PluginMenu.Add(op.Put(MainMenu.CreateMenuItem(), "Name", "MyMenu"))`)
  reiwa.RunDelphi(`op.Put(MainMenu.FindComponent("MyMenu"), "Caption", "Special Menu")`)
}

The following built-in functions are available.

op.Int(number) // converts real value to int value and returns it
op.Put(obj, key, value) // sets properties and returns the object

Query

Plugins can retrieve the variables of the CW keyboard in zLog.

fmt.Println(reiwa.Query("$B,$X,$R,$F,$Z,$I,$Q,$V,$O,$S,$P,$A,$N,$L,$C,$E,$M"))

The following variables are also available.

fmt.Println(reiwa.Query("{V}")) // version number
fmt.Println(reiwa.Query("{F}")) // ZLO(ZLOX) file
fmt.Println(reiwa.Query("{C}")) // your call sign
fmt.Println(reiwa.Query("{B}")) // operating band
fmt.Println(reiwa.Query("{M}")) // operating mode

Contribution

Feel free to make issues at nextzlog/todo. Follow @nextzlog on Twitter.

License

Author

無線部開発班

  • JG1VPP
  • JS2FVO
  • JJ1GUJ

Clauses

MIT License

Components

The following is a list of objects in the zLog main window. They can be referenced by GetUI and RunDelphi functions.

object MainForm: TMainForm
  object TLabel
  object StatusLine: TStatusBar
  object MainPanel: TPanel
    object EditPanel1R: TPanel
      object RcvdRSTEdit1: TEdit
      object BandEdit1: TEdit
      object ModeEdit1: TEdit
      object PointEdit1: TEdit
      object OpEdit1: TEdit
      object SerialEdit1: TEdit
      object PowerEdit1: TEdit
      object CallsignEdit1: TOvrEdit
      object NumberEdit1: TOvrEdit
      object MemoEdit1: TOvrEdit
      object TimeEdit1: TOvrEdit
      object DateEdit1: TOvrEdit
    object EditPanel2R: TPanel
      object RigPanelC: TPanel
        object RigPanelShape2C: TShape
        object ledTx2C: TJvLED
        object labelRig3Title: TLabel
        object CallsignEdit2C: TOvrEdit
        object NumberEdit2C: TOvrEdit
        object RcvdRSTEdit2C: TEdit
        object BandEdit2C: TEdit
        object ModeEdit2C: TEdit
        object SerialEdit2C: TEdit
        object checkUseRig3: TCheckBox
        object checkWithRig1: TCheckBox
        object checkWithRig2: TCheckBox
      object EditUpperLeftPanel: TPanel
        object DateEdit2: TOvrEdit
        object TimeEdit2: TOvrEdit
      object EditUpperRightPanel: TGridPanel
        object RigPanelA: TPanel
          object RigPanelShape2A: TShape
          object ledTx2A: TJvLED
          object labelRig1Title: TLabel
          object CallsignEdit2A: TOvrEdit
          object NumberEdit2A: TOvrEdit
          object RcvdRSTEdit2A: TEdit
          object BandEdit2A: TEdit
          object ModeEdit2A: TEdit
          object SerialEdit2A: TEdit
        object RigPanelB: TPanel
          object RigPanelShape2B: TShape
          object ledTx2B: TJvLED
          object labelRig2Title: TLabel
          object CallsignEdit2B: TOvrEdit
          object NumberEdit2B: TOvrEdit
          object RcvdRSTEdit2B: TEdit
          object BandEdit2B: TEdit
          object ModeEdit2B: TEdit
          object SerialEdit2B: TEdit
    object Grid: TStringGrid
  object ToolBarPanel: TPanel
    object CWToolBar: TPanel
      object CWStopButton: TSpeedButton
      object CWPauseButton: TSpeedButton
      object buttonCwKeyboard: TSpeedButton
      object SpeedLabel: TLabel
      object CWPlayButton: TSpeedButton
      object CWF1: THemisphereButton
      object CWF2: THemisphereButton
      object CWF3: THemisphereButton
      object CWF4: THemisphereButton
      object CWF5: THemisphereButton
      object CWF6: THemisphereButton
      object CWF7: THemisphereButton
      object CWF8: THemisphereButton
      object CWCQ1: THemisphereButton
      object CWCQ2: THemisphereButton
      object CWCQ3: THemisphereButton
      object CWF9: THemisphereButton
      object CWF10: THemisphereButton
      object CWF11: THemisphereButton
      object CWF12: THemisphereButton
      object SideToneButton: TSpeedButton
      object SpeedBar: TTrackBar
    object SSBToolBar: TPanel
      object VoiceStopButton: TSpeedButton
      object VoicePauseButton: TSpeedButton
      object buttonVoiceOption: TSpeedButton
      object VoicePlayButton: TSpeedButton
      object VoiceF1: THemisphereButton
      object VoiceF3: THemisphereButton
      object VoiceF2: THemisphereButton
      object VoiceF4: THemisphereButton
      object VoiceF5: THemisphereButton
      object VoiceF6: THemisphereButton
      object VoiceF7: THemisphereButton
      object VoiceF8: THemisphereButton
      object VoiceCQ1: THemisphereButton
      object VoiceCQ2: THemisphereButton
      object VoiceCQ3: THemisphereButton
      object VoiceF9: THemisphereButton
      object VoiceF10: THemisphereButton
      object VoiceF11: THemisphereButton
      object VoiceF12: THemisphereButton
    object MainToolBar: TPanel
      object SpeedButton4: TSpeedButton
      object SpeedButton5: TSpeedButton
      object SpeedButton6: TSpeedButton
      object PartialCheckButton: TSpeedButton
      object ScoreButton: TSpeedButton
      object MultiButton: TSpeedButton
      object RateButton: TSpeedButton
      object LogButton: TSpeedButton
      object OptionsButton: TSpeedButton
      object SuperCheckButtpn: TSpeedButton
      object PacketClusterButton: TSpeedButton
      object ZServerIcon: TImage
      object panelCQMode: TPanel
      object comboBandPlan: TComboBox
  object MainMenu: TMainMenu
    object FileMenu: TMenuItem
      object FileNewItem: TMenuItem
      object FileOpenItem: TMenuItem
      object FileSaveItem: TMenuItem
      object FileSaveAsItem: TMenuItem
      object MergeFile1: TMenuItem
      object Backup1: TMenuItem
      object Export1: TMenuItem
      object mSummaryFile: TMenuItem
      object mPXListWPX: TMenuItem
      object N1: TMenuItem
      object menuCorrectStartTime: TMenuItem
      object menuCorrectNR: TMenuItem
      object N2: TMenuItem
      object FilePrintItem: TMenuItem
      object CreateELogJARL1: TMenuItem
      object CreateELogJARL2: TMenuItem
      object CreateDupeCheckSheetZPRINT1: TMenuItem
      object mnMMTTY: TMenuItem
      object N4: TMenuItem
      object FileExitItem: TMenuItem
    object Windows1: TMenuItem
      object Score1: TMenuItem
      object Multipliers1: TMenuItem
      object QSOrate1: TMenuItem
      object QSORateEx1: TMenuItem
      object SuperCheck1: TMenuItem
      object N11: TMenuItem
      object PartialCheck1: TMenuItem
      object CheckCall1: TMenuItem
      object mnCheckMulti: TMenuItem
      object mnCheckCountry: TMenuItem
      object CWKeyboard1: TMenuItem
      object CWMessagePad1: TMenuItem
      object RigControl1: TMenuItem
      object PacketCluster1: TMenuItem
      object ZLinkmonitor1: TMenuItem
      object ZServer1: TMenuItem
      object Console1: TMenuItem
      object Scratchsheet1: TMenuItem
      object Bandscope1: TMenuItem
      object RunningFrequencies1: TMenuItem
      object mnTTYConsole: TMenuItem
      object menuAnalyze: TMenuItem
      object menuShowFunctionKeyPanel: TMenuItem
      object menuShowQSYInfo: TMenuItem
      object menuShowSO2RNeoCp: TMenuItem
      object menuShowInformation: TMenuItem
      object ShowMessageManagerSO2R1: TMenuItem
    object menuSettings: TMenuItem
      object menuOptions: TMenuItem
      object menuBandPlanSettings: TMenuItem
      object menuQSORateSettings: TMenuItem
      object menuTargetEditor: TMenuItem
      object menuPluginManager: TMenuItem
    object Network1: TMenuItem
      object ConnecttoZServer1: TMenuItem
      object N6: TMenuItem
      object mnDownload: TMenuItem
      object mnMerge: TMenuItem
    object PluginMenu: TMenuItem
    object View1: TMenuItem
      object ShowCurrentBandOnly: TMenuItem
      object N10: TMenuItem
      object Sort1: TMenuItem
        object menuSortByCallsign: TMenuItem
        object menuSortByTime: TMenuItem
        object menuSortByBand: TMenuItem
        object menuSortByMode: TMenuItem
        object menuSortByPower: TMenuItem
        object menuSortByTxNo: TMenuItem
        object menuSortByPoint: TMenuItem
        object menuSortByOperator: TMenuItem
        object menuSortByMemo: TMenuItem
      object N9: TMenuItem
      object mnHideCWPhToolBar: TMenuItem
      object mnHideMenuToolbar: TMenuItem
      object N12: TMenuItem
      object IncreaseFontSize1: TMenuItem
      object DecreaseFontSize1: TMenuItem
    object Help1: TMenuItem
      object menuAbout: TMenuItem
      object menuQuickReference: TMenuItem
      object N5: TMenuItem
      object menuPortal: TMenuItem
      object menuUsersGuide: TMenuItem
      object HelpZyLO: TMenuItem
  object OpenDialog: TOpenDialog
  object SaveDialog: TSaveDialog
  object BandMenu: TPopupMenu
    object N19MHz: TMenuItem
    object N35MHz: TMenuItem
    object N7MHz: TMenuItem
    object N10MHz1: TMenuItem
    object N14MHz: TMenuItem
    object N18MHz1: TMenuItem
    object N21MHz: TMenuItem
    object N24MHz1: TMenuItem
    object N28MHz: TMenuItem
    object N50MHz: TMenuItem
    object N144MHz: TMenuItem
    object N430MHz: TMenuItem
    object N1200MHz: TMenuItem
    object N2400MHz: TMenuItem
    object N5600MHz: TMenuItem
    object N10GHzup1: TMenuItem
  object ModeMenu: TPopupMenu
    object CW1: TMenuItem
    object SSB1: TMenuItem
    object FM1: TMenuItem
    object AM1: TMenuItem
    object RTTY1: TMenuItem
    object FT41: TMenuItem
    object FT81: TMenuItem
    object Other1: TMenuItem
  object GridMenu: TPopupMenu
    object EditQSO: TMenuItem
    object DeleteQSO1: TMenuItem
    object InsertQSO1: TMenuItem
    object N7: TMenuItem
    object GBand: TMenuItem
      object G1R9MHz: TMenuItem
      object G3R5MHz: TMenuItem
      object G7MHz: TMenuItem
      object G10MHz: TMenuItem
      object G14MHz: TMenuItem
      object G18MHz: TMenuItem
      object G21MHz: TMenuItem
      object G24MHz: TMenuItem
      object G28MHz: TMenuItem
      object G50MHz: TMenuItem
      object G144MHz: TMenuItem
      object G430MHz: TMenuItem
      object G1200MHz: TMenuItem
      object G2400MHz: TMenuItem
      object G5600MHz: TMenuItem
      object G10GHz: TMenuItem
    object Changemode: TMenuItem
      object CW2: TMenuItem
      object SSB2: TMenuItem
      object FM2: TMenuItem
      object AM2: TMenuItem
      object RTTY2: TMenuItem
      object Other2: TMenuItem
    object mChangePower: TMenuItem
      object H2: TMenuItem
      object M2: TMenuItem
      object L2: TMenuItem
      object P2: TMenuItem
    object GOperator: TMenuItem
      object Clear1: TMenuItem
    object mnChangeTXNr: TMenuItem
    object N13: TMenuItem
    object menuEditStatus: TMenuItem
    object N8: TMenuItem
    object SendSpot1: TMenuItem
    object mnGridAddNewPX: TMenuItem
  object OpMenu: TPopupMenu
  object Timer1: TTimer
  object FileExportDialog: TSaveDialog
  object CWFMenu: TPopupMenu
    object Edit1: TMenuItem
  object NewPowerMenu: TPopupMenu
    object P1: TMenuItem
    object L1: TMenuItem
    object M1: TMenuItem
    object H1: TMenuItem
  object GeneralSaveDialog: TSaveDialog
  object ActionList1: TActionList
    object actionQuickQSY01: TAction
    object actionQuickQSY02: TAction
    object actionQuickQSY03: TAction
    object actionQuickQSY04: TAction
    object actionQuickQSY05: TAction
    object actionQuickQSY06: TAction
    object actionQuickQSY07: TAction
    object actionQuickQSY08: TAction
    object actionShowSuperCheck: TAction
    object actionShowZlinkMonitor: TAction
    object actionPlayMessageA01: TAction
    object actionPlayMessageA02: TAction
    object actionPlayMessageA03: TAction
    object actionPlayMessageA04: TAction
    object actionPlayMessageA05: TAction
    object actionPlayMessageA06: TAction
    object actionPlayMessageA07: TAction
    object actionPlayMessageA08: TAction
    object actionCheckMulti: TAction
    object actionShowCheckPartial: TAction
    object actionPlayCQA2: TAction
    object actionPlayCQA3: TAction
    object actionPlayMessageB01: TAction
    object actionPlayMessageB02: TAction
    object actionPlayMessageB03: TAction
    object actionPlayMessageB04: TAction
    object actionPlayMessageB05: TAction
    object actionPlayMessageB06: TAction
    object actionPlayMessageB07: TAction
    object actionPlayMessageB08: TAction
    object actionPlayCQB2: TAction
    object actionPlayCQB3: TAction
    object actionInsertBandScope: TAction
    object actionInsertBandScope2: TAction
    object actionInsertBandScope3: TAction
    object actionIncreaseFontSize: TAction
    object actionDecreaseFontSize: TAction
    object actionPageUp: TAction
    object actionPageDown: TAction
    object actionMoveTop: TAction
    object actionMoveLeft: TAction
    object actionDeleteOneChar: TAction
    object actionMoveLast: TAction
    object actionMoveRight: TAction
    object actionPullQso: TAction
    object actionDeleteLeftOneChar: TAction
    object actionGetPartialCheck: TAction
    object actionDeleteRight: TAction
    object actionClearCallAndRpt: TAction
    object actionShowCurrentBandOnly: TAction
    object actionDecreaseTime: TAction
    object actionIncreaseTime: TAction
    object actionQTC: TAction
    object actionReversePaddle: TAction
    object actionCwTune: TAction
    object actionPushQso: TAction
    object actionFieldClear: TAction
    object actionCQRepeat: TAction
    object actionBackup: TAction
    object actionFocusCallsign: TAction
    object actionShowCWKeyboard: TAction
    object actionFocusMemo: TAction
    object actionFocusNumber: TAction
    object actionFocusOp: TAction
    object actionShowPacketCluster: TAction
    object actionShowConsolePad: TAction
    object actionFocusRst: TAction
    object actionShowScratchSheet: TAction
    object actionShowRigControl: TAction
    object actoinClearCallAndNumAftFocus: TAction
    object actionShowZServerChat: TAction
    object actionToggleRig: TAction
    object actionShowBandScope: TAction
    object actionShowFreqList: TAction
    object actionShowTeletypeConsole: TAction
    object actionShowAnalyze: TAction
    object actionShowScore: TAction
    object actionShowMultipliers: TAction
    object actionShowQsoRate: TAction
    object actionShowCheckCall: TAction
    object actionShowCheckMulti: TAction
    object actionShowCheckCountry: TAction
    object actionQsoStart: TAction
    object actionQsoComplete: TAction
    object actionNop: TAction
    object actionRegNewPrefix: TAction
    object actionControlPTT: TAction
    object actionShowSuperCheck2: TAction
    object actionGetSuperCheck2: TAction
    object actionChangeBand: TAction
    object actionChangeMode: TAction
    object actionChangePower: TAction
    object actionChangeCwBank: TAction
    object actionChangeR: TAction
    object actionChangeS: TAction
    object actionSetCurTime: TAction
    object actionDecreaseCwSpeed: TAction
    object actionIncreaseCwSpeed: TAction
    object actionCQRepeat2: TAction
    object actionToggleVFO: TAction
    object actionEditLastQSO: TAction
    object actionQuickMemo1: TAction
    object actionQuickMemo2: TAction
    object actionCwMessagePad: TAction
    object actionCorrectSentNr: TAction
    object actionSetLastFreq: TAction
    object actionQuickMemo3: TAction
    object actionQuickMemo4: TAction
    object actionQuickMemo5: TAction
    object actionPlayMessageA09: TAction
    object actionPlayMessageA10: TAction
    object actionPlayMessageB09: TAction
    object actionPlayMessageB10: TAction
    object actionCQAbort: TAction
    object actionPlayMessageA11: TAction
    object actionPlayMessageA12: TAction
    object actionPlayCQA1: TAction
    object actionPlayMessageB11: TAction
    object actionPlayMessageB12: TAction
    object actionPlayCQB1: TAction
    object actionToggleCqSp: TAction
    object actionCQRepeatIntervalUp: TAction
    object actionCQRepeatIntervalDown: TAction
    object actionSetCQMessage1: TAction
    object actionSetCQMessage2: TAction
    object actionSetCQMessage3: TAction
    object actionToggleRit: TAction
    object actionToggleXit: TAction
    object actionRitClear: TAction
    object actionToggleAntiZeroin: TAction
    object actionAntiZeroin: TAction
    object actionFunctionKeyPanel: TAction
    object actionShowQsoRateEx: TAction
    object actionShowQsyInfo: TAction
    object actionShowSo2rNeoCp: TAction
    object actionSo2rNeoSelRx1: TAction
    object actionSo2rNeoSelRx2: TAction
    object actionSo2rNeoSelRxBoth: TAction
    object actionSelectRig1: TAction
    object actionSelectRig2: TAction
    object actionSelectRig3: TAction
    object actionSo2rNeoCanRxSel: TAction
    object actionShowInformation: TAction
    object actionToggleSo2r2bsiq: TAction
    object actionSo2rNeoToggleAutoRxSelect: TAction
    object actionToggleTx: TAction
    object actionToggleSo2rWait: TAction
    object actionToggleRx: TAction
    object actionMatchRxToTx: TAction
    object actionMatchTxToRx: TAction
    object actionSo2rToggleRigPair: TAction
    object actionChangeTxNr0: TAction
    object actionChangeTxNr1: TAction
    object actionChangeTxNr2: TAction
    object actionPseQsl: TAction
    object actionNoQsl: TAction
    object actionShowMsgMgr: TAction
    object actionChangeBand2: TAction
    object actionChangeMode2: TAction
    object actionChangePower2: TAction
    object actionToggleTxNr: TAction
  object SPCMenu: TPopupMenu
  object VoiceFMenu: TPopupMenu
    object menuVoiceEdit: TMenuItem
  object timerCqRepeat: TTimer
  object FileImportDialog: TOpenDialog

zylo/reiwa

const (
	CW = iota
	SSB
	FM
	AM
	RTTY
	OTHER
)

Enum of modes.

const (
	K1900 = iota
	K3500
	M7
	M10
	M14
	M18
	M21
	M24
	M28
	M50
	M144
	M430
	M1200
	M2400
	M5600
	G10UP
)

Enum of bands.

const ResponseCapacity = 256

Length limit of query response.

const SettingsFileName = "zlog.ini"

zlog.ini.

var CityMultiList string

Variable for embedding zLog DAT file.

var FileExtFilter string

File extension filter for I/O plugin.

var MinVersion = "2.8.3.0"

zLog version where this plugin works.

var OnAcceptEvent = func(qso *QSO) {
	qso.SetMul1(qso.GetRcvd())
}

Sets QSO point and multiplier.

var OnAssignEvent = func(contest, configs string) {}

Called when scoring is delegated.

var OnAttachEvent = func(contest, configs string) {}

Called just after opening the contest.

var OnDeleteEvent = func(qso *QSO) {}

Called when a QSO record is deleted. Deletion is performed before addition.

var OnDetachEvent = func(contest, configs string) {}

Called just after closing the contest.

var OnExportEvent = func(source, format string) error {
	return nil
}

Converts a ZLO file to a file in another format.

var OnFinishEvent = func() {}

Called when the plugin is finished.

var OnImportEvent = func(source, target string) error {
	return nil
}

Converts a file in another format to a ZLO file.

var OnInsertEvent = func(qso *QSO) {}

Called when a QSO record is added.

var OnLaunchEvent = func() {}

Called when the plugin is launched.

var OnPointsEvent = func(score, mul1s int) int {
	return score * mul1s
}

Calculates total score.

var OnVerifyEvent = func(qso *QSO) {
	ok := true
	ok = ok && qso.VerifyDupe()
	ok = ok && qso.VerifyBand()
	ok = ok && qso.VerifyMode()
	ok = ok && qso.VerifySent()
	ok = ok && qso.VerifyRcvd()
	if ok {
		OnAcceptEvent(qso)
	} else {
		qso.Invalid()
	}
}

Determines QSO score and multiplier. Empty multiplier for an invalid QSO. Called several times before the QSO is recorded.

var OnWindowEvent = func(msg uintptr) {}

Receives window messages.

var PluginName = ""

The name of this plugin.

func AllowBand

func AllowBand(bands ...byte)

Allows the specified bands.

func AllowBandRange

func AllowBandRange(lo, hi byte)

Allows the specified bands.

func AllowCall

func AllowCall(pattern string)

Allows call signs of the pattern.

func AllowDupe

func AllowDupe()

Allows duplicate QSO.

func AllowMode

func AllowMode(modes ...byte)

Allows the specified modes.

func AllowModeRange

func AllowModeRange(lo, hi byte)

Allows the specified modes.

func AllowRcvd

func AllowRcvd(pattern string)

Allows received contest numbers of the pattern.

func AllowSent

func AllowSent(pattern string)

Allows submitted contest numbers of the pattern.

func DisplayModal

func DisplayModal(msg string, args ...interface{})

Displays the specified string in a dialog.

func DisplayPanic

func DisplayPanic()

Catch a panic and display it in a dialog.

defer DisplayPanic()

func DisplayToast

func DisplayToast(msg string, args ...interface{})

Displays the specified string in a toast.

func DumpZLO

func DumpZLO(qso ...QSO) (bin []byte)

Converts QSOs to byte sequence with header information.

func GetINI

func GetINI(section, key string) string

Gets the specified setting.

func GetUI

func GetUI(expression string) uintptr

Gets the specified window handle.

GetUI("MainForm.FileOpenItem")
GetUI("MenuForm.CancelButton")

func HandleButton

func HandleButton(name string, handler func(int))

Registers an event handler for the button with the given name. Subsequent registrations after plugin startup will be ignored.

func HandleEditor

func HandleEditor(name string, handler func(int))

Registers an event handler for the editor with the given name. Subsequent registrations after plugin startup will be ignored.

func Query

func Query(text string) string

Makes the specified query.

func RunDelphi

func RunDelphi(exp string, args ...interface{}) int

Calls the specified Delphi script. Limited to zLog 2.8.3.0 and later.

func SetINI

func SetINI(section, key, value string)

Sets the specified setting.

type QSO

type QSO struct {
	SRST int16
	RRST int16

	Mode byte
	Band byte
	Pow1 byte

	Score byte

	Dupe bool

	TxID byte
	Pow2 int32
}

zLog QSO structure.

func LoadZLO

func LoadZLO(bin []byte) (logs []QSO)

Converts byte sequence with header information to QSOs.

func (*QSO) Delete

func (qso *QSO) Delete()

Deletes the QSO record in zLog.

func (*QSO) DumpWithoutHead

func (qso *QSO) DumpWithoutHead(w io.Writer)

Dumps QSO structure without header information.

func (*QSO) GetCall

func (qso *QSO) GetCall() string

Returns the call sign.

func (*QSO) GetCallSign

func (qso *QSO) GetCallSign() string

Returns the canonical call sign, excluding the portable designator.

func (*QSO) GetID

func (qso *QSO) GetID() int32

Returns the QSO ID.

func (*QSO) GetMul1

func (qso *QSO) GetMul1() string

Returns the primary multiplier.

func (*QSO) GetMul2

func (qso *QSO) GetMul2() string

Returns the secondary multiplier.

func (*QSO) GetName

func (qso *QSO) GetName() string

Returns the operator name.

func (*QSO) GetNote

func (qso *QSO) GetNote() string

Returns remarks.

func (*QSO) GetRcvd

func (qso *QSO) GetRcvd() string

Returns the received contest number.

func (*QSO) GetRcvdGroups

func (qso *QSO) GetRcvdGroups() []string

Groups received contest numbers by regular expression.

func (*QSO) GetSent

func (qso *QSO) GetSent() string

Returns the submitted contest number.

func (*QSO) GetSentGroups

func (qso *QSO) GetSentGroups() []string

Groups submitted contest numbers by regular expression.

func (*QSO) GetTime

func (qso *QSO) GetTime() time.Time

Returns the time of the QSO.

func (*QSO) Insert

func (qso *QSO) Insert()

Adds the QSO record to zLog.

func (*QSO) Invalid

func (qso *QSO) Invalid()

Makes the QSO an invalid QSO.

func (*QSO) LoadWithoutHead

func (qso *QSO) LoadWithoutHead(r io.Reader)

Reads QSO structure without header information.

func (*QSO) SetCall

func (qso *QSO) SetCall(value string)

Sets the call sign.

func (*QSO) SetMul1

func (qso *QSO) SetMul1(value string)

Sets the primary multiplier.

func (*QSO) SetMul2

func (qso *QSO) SetMul2(value string)

Sets the secondary multiplier.

func (*QSO) SetName

func (qso *QSO) SetName(value string)

Sets the operator name.

func (*QSO) SetNote

func (qso *QSO) SetNote(value string)

Sets remarks.

func (*QSO) SetRcvd

func (qso *QSO) SetRcvd(value string)

Sets the received contest number.

func (*QSO) SetSent

func (qso *QSO) SetSent(value string)

Sets the submitted contest number.

func (*QSO) Update

func (qso *QSO) Update()

Updates the QSO record in zLog.

func (*QSO) VerifyBand

func (qso *QSO) VerifyBand() bool

Checks the band. Returns true if the QSO is valid.

func (*QSO) VerifyCall

func (qso *QSO) VerifyCall() bool

Checks the call sign. Returns true if the QSO is valid.

func (*QSO) VerifyDupe

func (qso *QSO) VerifyDupe() bool

Checks for duplicate QSOs. Returns true if the QSO is valid.

func (*QSO) VerifyMode

func (qso *QSO) VerifyMode() bool

Checks the mode. Returns true if the QSO is valid.

func (*QSO) VerifyRcvd

func (qso *QSO) VerifyRcvd() bool

Checks the received contest number. Returns true if the QSO is valid.

func (*QSO) VerifySent

func (qso *QSO) VerifySent() bool

Checks the submitted contest number. Returns true if the QSO is valid.

zylo/win32

var DefaultWindowH = 640

Default window height.

var DefaultWindowW = 640

Default window width.

func NewForm

func NewForm(parent winc.Controller) *winc.Form

Creates a form with a dedicated class name for this plugin.

func NewPanel

func NewPanel(parent winc.Controller) *winc.Panel

Creates a panel with a dedicated class name for this plugin.