HAMMAP Application Program Interface                         HAMMAP V11.0
====================================                         Gerhard Berg
File: HM-API.TXT                                             ex DJ6FM


HAMMAP for Windows provides a programming interface for program extensions.
The interface may be used by other programs under the following conditions:

- Usage of the HAMMAP API requires the permission of the author of HAMMAP.
- HAMMAP itself may NOT be distributed together with the program.
- A copy of the program must be provided to the HAMMAP author.
- The HAMMAP author is not liable for any damages that may be caused by HAMMAP.



1. OLE-/ActiveX Interface
=========================

The HAMMAP OLE-/ActiveX-Interface is available only for the 32 Bit Version
of HAMMAP. HAMMAP is an OLE-/ActiveX-Server.

HAMMAP exposes the 'vb5HAMMAP' Library with 'HAMMAP' class. The members of
HAMMAP can be seen with the Object Browser. They have the following meaning:


1.1 Methods
-----------
Function Action(CmdStr As String) As String

       The parameter CmdStr contains a Command List (see section 4) or a
       single command (see section 5). The function returns the result
       (or an empty string, if the command(s) have(has) no return value(s)).

       In case of an error condition, the function returns an error code
       as a string (see section 6). In addition HAMMAP sets the following
       properties of the Windows 'Err' Object:

           Err.Number:=80040000hex + 1004 + ErrNr
           Err.Source:="HAMMAP"
           Err.Description:=Description


Sub Disconnect()

       Only for HAMMAP Version 10.2 and later.
       This method removes the client from the client list in the server.
       It should be called immediately before deleting the HAMMAP object.



1.2 Properties
--------------
Property CallBackObject As Object

       This property should be set to an object of the OLE-/ActiveX-Client
       to allow callback-functions from HAMMAP (notification of events).
       See section 1.4 for more details.


Property CallbackMask As Integer
 
       This property must be set by the client if it wants to be notified
       by HAMMAP for any events. Each Bit in the Mask defines one event
       CallbackMask = 2 ^ (Mode - 1) (see section 1.3) .


Property ClientName As String

       When connecting to HAMMAP the Client should assign its Name to this
       property. The property is intended for diagnostic purposes.


Property ClientNr As Integer       (ReadOnly)

       HAMMAP assigns a sequential number to all clients connecting to HAMMAP.


Property Ready As Integer          (ReadOnly)

       HAMMAP returns True = -1, if it is ready to receive a command or
       False = 0, if it is busy. If a command is sent while HAMMAP
       is busy it returns a 'Busy' Error Condition.

 
Property Station As String

       When reading this property, HAMMAP returns the call of the currently
       selected station or an empty string if no station is selected.

       When setting the property HAMMAP selects the station specified by
       the string.



1.3 Events
----------
Beginning with version 9.0 HAMMAP uses events for notification of the
client(s) for certain conditions:


Terminate()

       HAMMAP raises this event when it is terminated by the user.
       The client should then disconnect from HAMMAP. The event has no
       parameters.


Sub Notify(EventNr As Integer, EventData as String)

       HAMMAP raises this event on certain conditions. The condition for
       which the event is raised can be selected by the client with the
       CallbackMask property.

       EventNr defines the condition. EventData provides information about
       the condition. The following events are supported with HAMMAP 9.0
       and later:

       EventNr Condition                 EventData                   Mask
       --------------------------------------------------------------------
       1      New Station selected      Call of selected Station    1
       2      Change of Busy/Ready      O=Busy, -l=Ready            2
       3      New Map Area selected     Co-ordinates of new area    4
       4      Map output                Co-ordinates of map area    8

       Event-Nr. 4 is supported with HAMMAP version 10.2 and later.



1.4 Callback-Object
-------------------
Using Callback-Objects is an alternative method of event notification.
It is provided for backward compatibility. New programs should use
events (see 1.3) and not Callback-Objects.

The Callback-Object should provide the following methods:


Sub Terminate

       HAMMAP calls this method when it is terminated by the user.
       The client should then disconnect from HAMMAP.


Sub Notify(EventNr, EventData as String)

       HAMMAP calls this methods on certain events. The events to be notified
       can be selected by the client with the CallbackMask property.

       Usage of EventNr and EventData are identical to Events (see 1.3).



2. DDE-Interface
================

The HAMMAP DDE-interface is available for the 16 and 32 Bit Version of HAMMAP.

HAMMAP is a DDE-Source (Server).

Application: HMWIN
Topic:       MAP
Item:        Result      - contains the result of a commands or the error code
             ClientName* - the name of the Client should be poked into it
             Station     - contains the call of the selected station
             Ready*      - contains -1 when HAMMAP is ready or 0 when busy
             Area*       - contains the co-ordinates of the current map area
             NewMap*     - contains the co-ordinates of the current map area
                           (to cause a change for each map output,
                           a space is appended on every 2nd map output)

Items marked with * are only available in version 10.2 and later.

Commands are executed with the Link-Execute command. Program control returns
when the execution is terminated (or a timeout occurs).

In case of no error, HAMMAP returns a positive acknowledge and the specified
result (if any) or an empty string. In case of an error, HAMMAP returns a
negative acknowledge and an error code (see section 6).



3. Overlays:         (only HAMMAP Version 11.0 and later)
============
Normally API commands are executed immediately. An alternate method is
available for drawing commands (see section 5.2). By transferring these
commands as Overlays the commands are not executed immediately, but stored
in HAMMAP and executed each time the map is drawn and/or printed by HAMMAP.
There are two kinds of overlays:

- Foreground Overlays are drawn after the complete map has been drawn.
- Background Overlays are drawn before the complete map has been drawn.
  (For vector map this is after the land and water is coloured and before
  coasts, borders, rivers, stations, links etc. are drawn. For pixel maps
  this is after the pixel map has been drawn and before stations and links
  are drawn.)

Overlay command:
----------------
Overlay:Mode         - Control Overlay Transfer / Delete Overlay

                       Mode: 1 = Begin of Foreground Overlay Transfer
                             2 = Begin of Background Overlay Transfer
                             0 = End of Forground/Background Overlay
                             -1 = Delete Foreground Overlay
                             -2 = Delete Background Overlay

Besides the Overlay command, only the following commands (see section 5)
are allowed in Overlays:

DRAWFIGURE, DRAWSHAPE, DRAWLINE, DRAWSYMBOL, DRAWTEXT,
DRAWSTN, MARKSTN, DRAWSTNS, DRAWLINK, DRAWLINKS, DRAWGRID,
SETPAR, SELSTN, NOOP or ';', STOREMAP, RESTOREMAP


4. Command List:     (only HAMMAP Version 8.0 and later)
================

A command list contains of a series of commands separated by CR/LF.
The command list can be executed with a single Link-Execute command (DDE)
or Action Method (OLE).

  command [ CR/LF command CR/LF command ... ]

The result is also a list consisting of a series of results separated
by CR/LF (one result line per command).

Overlay commands (see section 3) cannot be used in command lists. They must
always be executed as individual commands.



5. Command Syntax:
==================

5.1 Information Commands:
-------------------------

GetAnzStn[:Mode]               - Return number of stations in current area

                                 Mode: 0=without Filter
                                       1=with Filter
                                       (Mode only with version 8.0 and later)


GetStn[:[n][,Mode]]            - Return call of station in current area

                                 n:   number of station (1...)
                                       default: next station

                                 Mode: 0=without Filter
                                       1=with Filter


GetStnLines:Call               - Return available lines (0...9)
                                 for specified station


GetStnInfo:Call[,[Line][,Mode]] - Return Info for specified station

                                 Line: Line-Nr. for station info

                                 Mode: 0 = return Status,Type,Hardware, Soft-
                                             ware as 2 character abbreviation.
                                           return date as yymm
                                       1 = return Status,Type,Hardware,
                                             Software with full text.
                                           return date as mm.yy


GetLinks:Call[,Mode]           - Return Links for specified Station

                                 Mode: 0 = return Status,Type,Hardware, Soft-
                                             ware as 2 character abbreviation.
                                           return date as yymm
                                       1 = return Status,Type,Hardware,
                                             Software with full text.
                                           return date as mm.yy


GetLinkInfo:Call1,Call2[,Mode] - Return Info for specified Link

                                 Mode: 0 = return Status,Type,Hardware, Soft-
                                             ware as 2 character abbreviation.
                                           return date as yymm
                                       1 = return Status,Type,Hardware,
                                             Software with full text.
                                           return date as mm.yy


GetRoute:Call1,Call2[,[Flags],NotVia]
                               - Return Route between specified stations

                                 Flags:   (Only version 5.2a and later)
                                           1=Fastest Route
                                           2=Draw Route
                                           4=Mark Route

                                 Not Via: (Only version 5.2a and later)
                                           Stations not used in route
                                           (one call or several Calls separated
                                           by space)


GetCoord                       - Return current coordinates
                                 (xmin,ymin,xmax,ymax)

GetMaxCoord                    - Return maximum coordinates
                                 (xmin,ymin,xmax,ymax)
                                   (only version 9.0 and later)

GetMapType                     - Return type of map
                                 (only in version 10.2 and later)
                                 0=none, 1=Vector, 2=BMP, 3=RLE


GetSize                        - Return MapWidth,MapHeight,
                                 WindowWidth,WindowHeight,
                                 PrintWidth,PrintHeight


CopyMap                        - Copy Map to Clipboard




5.2 Draw Commands:
------------------
DrawMap[:xmin,ymin,xmax,ymax[,Mode]] - Draw Map (default: Current Coordinates)
                                       (in version 10.0 and later map file is
                                       selected automatically)
                                       Mode: (only Version 8.0 and later)
                                             default: defined by HM parameter
                                             0 = only map (without towns, grid,
                                                 links, stations)
                                             1 = with towns (as in HM parameter)
                                             2 = as 1 but also with town names


SelStn[:Call]                        - Select Station (default: none)

DrawStn:Call[,Color]                 - Draw Station
                                       (in version 8.1 or later color may be
                                       specified in hex. - min. 3 characters long)

MarkStn:Call[,[Color][,Text]]        - Mark Station
                                       Default Text: Callsign
                                       (Text only with version 5.2 and later.)

DrawStns[:Mode]                      - Draw all stations
                                       (only in version 8.0 and later)
                                       Mode: 0 = without calls (default)
                                             1 = with calls

StoreMap (only Version 8.0 and later)  - Store current map

RestoreMap (only Version 8.0 and later) - Restore previously stored map

Draw Symbol (only Version 5.2 and later)
  DrawSymbol:Qth[,[Color][,[Symbol][,Text]]]
  DrawSymbol:Lon,Lat[,[Color][,[Symbol][,Text]]]
                                       (in version 8.1 or later color may be
                                       specified in hex. - min. 3 characters
                                       long)


DrawLink                             - Draw Link between Call1 and Call2
  DrawLink:Call1,Call2[,[Color][,Pattern],[Width]]
                                       (Width only in version 8.1 and later)

DrawLinks                            - Draw all links
                                       (only in version 8.0 and later)
                                       DrawLinks should be used before DrawStns


DrawGrid (only Version 5.2 and later) - Draw QTH-Locator Grid
  DrawGrid:Mode[,Locator]              Mode: 1 = Largest Locator Square
                                             2 = Large  Locator Square
                                             3 = Small  Locator Square
                                       Locator: (only Version 8.0 and later)
                                             default: defined by HM parameter
                                             0 = Locator not written in grid
                                             1 = Locator written in grid corners
                                             2 = Locator written in all fields

DrawLine (only Version 5.2 and later) - Draw Line
  DrawLine:Lon1,Lat1,Lon2,Lat2[,[Color][,Pattern],[Width]]
                                       (Width only in version 8.0 and later)

Draw Shape (only Version 8.0) - Draw Shape
  (in Version 8.1 and later this function is provided only for compatibility
  reasons - for new programs or updates, the function DrawFigure should be
  used instead)
  DrawShape:Lon1,Lat1,Lon2,Lat2[,[Color][,Shape],[Width]]
  DrawShape:Qth[,[Color][,Shape],[Width]]                             
                                       Shape: 0 = Line
                                               1 = Cross
                                               3 = Box
                                               4 = filled Box
                                               10 = Circle/Ellipse
                                               11 = filled Circle/Ellipse

Draw Figure (only Version 8.1 and later) - Draw Figure
  DrawFigure:Lon1,Lat1,Lon2,Lat2,Figure[,[DrawColor][,[FillColor][,[DrawWidth][,[Pattern][,[FillStyle]]]]]]
  DrawFigure:Qth,Figure[,[DrawColor][,[FillColor][,[Width][,[Pattern][,[FillStyle]]]]]]

                   Figure: 0 = nothing        10 = Circle / Ellipse
                           1 = Point          11 = Square
                           2 = Line           12 = Diamond
                           3 = +              13 = Triangle (pointing up)
                           4 = x              14 = Triangle (pointing down)
                           5 = Star           15 = Triangle (pointing right)
                                               16 = Triangle (pointing left)

                   DrawColor: see Color (default: black)
                   FillColor: see Color (default: no filling)
                   FillStyle: 0 = solid (default if no FillColor specified)
                               1 = transparent (default if FillColor is specified)


DrawText (only Version 5.2 and later) - Output Text
  DrawText:Lon,Lat,[Color],[Size],Text Lon,Lat = upper left corner
                                       (version 8.0 and later output also to printer)

PrintMap[:xmin,ymin,xmax,ymax]       - Print Map as defined by HM parameter
                                       (default: Current Coordinates)
                                       Note: With coordinates correct only with
                                       version 5.0a and later.
                                       (Preferred: StartPrint,DrawMap,...StopPrint)

StartPrint[:Mode]                    - Start Printer Output
                                       (only Version 5.2 and later)
                                       Mode:  (only Version 8.1 and later)
                                         1 = Screen
                                         2 = Printer
                                         4 = Print-Preview
                                         (values may be added)
                                       Default Mode = 3 in Versions 8.2 and later.
                                       (Caution!! V8.1 default mode=0 = no output.)

StopPrint (only Version 5.2 and later)   - Terminate Printer Output

KillPrint (only Version 8.0 and later)   - Abort Printer Output


Color:   Color Nr.   0...15 (default: HAMMAP color)
         RGB-Color   xxxxxx (only Version 8.0 and later)
                           RGB value of color in hex. (min.3 characters)
                           (e.g. 0FF=red, FF00=green,FF0000=blue)
                           8000000x = Windows system color

Symbol:  Symbol Nr.  0...12 (default: 0)
Pattern: Pattern Nr. 0...6 (see Visual Basic DrawStyle Property)

Width:   Drawing Width in pixels (default: 1)
         only version 8.0 and later
         applies to DrawLine, DrawFigure and DrawShape

Qth:     QTH-Locator (2, 4, 6, or 8 characters)

Lon:     Longitude (east)
Lat:     Latitude (north)
           Longitude and latitude are given in degrees. Decimal fractions are
           separated by period. Western longitude and southern latitude are
           represented by negative values (e.g. 8:30 W is given as -8.5).


5.3 System Commands:
--------------------
Noop                           - No Operation (use to test link)

;any text                      - Comment line in scripts (same as Noop)
                                   (only version 8.0 and later)

Test:String                    - Test: Return specified String

GetVer                         - Return HAMMAP Version (e.g. 8.1)

GetStnAbv:n                    - Return station abbreviations
                                     n: 1=Stations-Status
                                       2=Stations-Typ
                                       3=Software
                                       4=Hardware
                                       5=Link-Status

GetMsg:MsgNr                   - Return specified message

GetHammapDir                   - Return HAMMAP base directory
                                   (only version 9.0 and later)

GetMapFile                     - Return map file name
                                   (only version 9.0 and later)

LoadMapFile:Filename           - Load specified map file
                                   (only version 9.0 and later)

GetMsgFile                     - Return message file name

GetHlpFile                     - Return help file name

GetParFile                     - Return parameter file name

GetPar:ParName[,Id]            - Return value of specified parameter

SetPar:ParName=Value           - Set Parameter to specified value


The SETPAR commands should be used only with full understanding
of the HAMMAP program, because some parameters must not be modified
through the HAMMAP interface. The parameter assignments may change with
future versions of HAMMAP.



6. Return values:
-----------------
-5 - program error (e.g. out of string space)
-4 - bad command
-3 - bad parameter (out of range)
-2 - I/O-error
-1 - busy
0  - ok (or empty string)
1  - object not in current map area
2  - unknown QTH
3  - station not found
4  - bad callsign format
5  - link not found
6  - no route found



7. Demo Program
===============
The following programs are available to examine the HAMMAP programme interface
(DDE and OLE-/ActiveX):

HMAPI.EXE      - API-interface for 16 bit version (DDE only)
HMAPI32.EXE    - API-interface for 32 bit version (DDE and OLE-/ActiveX)



8. Sample Code
==============
This section shows typical Visual Basic Code (VB5 and later) of a simple
demo program 'ApiDemo' for the HAMMAP API.


Form ApiDemo.frm
----------------
VERSION 5.00
Begin VB.Form frmApiDemo
   AutoRedraw      =   -1  'True
   Caption         =   "HAMMAP-API Demo"
   ClientHeight    =   3165
   ClientLeft      =   9150
   ClientTop       =   3585
   ClientWidth     =   4740
   Icon            =   "ApiDemo_x.frx":0000
   LinkTopic       =   "Form1"
   ScaleHeight     =   3165
   ScaleWidth      =   4740
   Begin VB.TextBox txtCommand
     Height         =  495
     Left           =  1560
     TabIndex       =  1
     Text           =  "GetVer"
     Top            =  240
     Width          =  2895
   End
   Begin VB.Line Line1
     X1             =  0
     X2             =  4680
     Y1             =  0
     Y2             =  0
   End
   Begin VB.Label fldEvent
     BorderStyle    =  1  'Fixed Single
     Height         =  495
     Left           =  1560
     TabIndex       =  7
     Top            =  2400
     Width          =  2895
   End
   Begin VB.Label fldResult
     BorderStyle    =  1  'Fixed Single
     Height         =  495
     Left           =  1560
     TabIndex       =  6
     Top            =  1680
     Width          =  2895
   End
   Begin VB.Label lblCommand
     Caption        =  "Command:"
     Height         =  255
     Left           =  240
     TabIndex       =  5
     Top            =  360
     Width          =  975
   End
   Begin VB.Label lblEvent
     Caption        =  "Last Event:"
     Height         =  255
     Left           =  240
     TabIndex       =  4
     Top            =  2520
     Width          =  975
   End
   Begin VB.Label lblResult
     Caption        =  "Result:"
     Height         =  255
     Left           =  240
     TabIndex       =  3
     Top            =  1800
     Width          =  975
   End
   Begin VB.Label lblStatus
     Caption        =  "Status:"
     Height         =  255
     Left           =  240
     TabIndex       =  2
     Top            =  1080
     Width          =  975
   End
   Begin VB.Label fldStatus
     BorderStyle    =  1  'Fixed Single
     Height         =  495
     Left           =  1560
     TabIndex       =  0
     Top            =  960
     Width          =  2895
   End
   Begin VB.Menu mnuQuit
     Caption        =  "&Quit"
   End
   Begin VB.Menu mnuCommand
     Caption        =  "&Execeute"
   End
End
Attribute VB_Name = "frmApiDemo"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
DefLng A-Z
Option Explicit

Dim HMClient As HammapClient

Private Sub Form_Load()

  Dim ErrorFlag
 
  App.Title = "HAMMAP-API Demo"
 
  Set HMClient = New HammapClient
 
  'Connect to HAMMAP
  ErrorFlag = HMClient.Connect
 
  If ErrorFlag Then
   fldResult.Caption = "Error starting HAMMAP"
   Call HMClient.Terminate
  Else
   HMClient.CallbackMask = -1   'all Events
  End If

End Sub

Private Sub Form_Unload(Cancel As Integer)

  Call mnuQuit_Click
 
End Sub

Private Sub mnuCommand_Click()

  Dim ErrorFlag, Result$
 
  ErrorFlag = HMClient.Command(txtCommand.Text, Result$)
 
  If ErrorFlag Then Result$ = "Error: " & Result$
 
  fldResult.Caption = Result$

End Sub

Private Sub mnuQuit_Click()

  HMClient.Terminate
  Set HMClient = Nothing
 
End Sub



Module ApiDemo.bas
------------------
Attribute VB_Name = "modApiDemo"
DefLng A-Z
Option Explicit

Sub HMNotify(EventNr As Integer, EventData As String)

  Dim msg$
 
  With frmApiDemo
 
   Select Case EventNr
   Case 1
     If Len(EventData) > 0 Then
       .fldEvent.Caption = "New station selected: " & EventData
     Else
       .fldEvent.Caption = "No station selected"
     End If
    
   Case 2
     If Val(EventData) Then
       .fldStatus.Caption = "HAMMAP Ready"
     Else
       .fldStatus.Caption = "HAMMAP Busy"
     End If
    
   Case 3
     .fldEvent.Caption = "New map area selected: " & EventData
  
   Case 4
     .fldEvent.Caption = "New map output: " & EventData
    
   End Select
 
  End With
 
End Sub

Sub HammapTerminate()

  Unload frmApiDemo
  Set frmApiDemo = Nothing
 
End Sub



Class Module HMClient.cls
-------------------------
VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = "HammapClient"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
DefInt A-Z
Option Explicit

Private WithEvents HM As HAMMAP
Attribute HM.VB_VarHelpID = -1

Friend Function Connect(Optional Timeout = 10)

  Dim Start As Date  'Date and Time
 
  Connect = True
 
  '--- Connect to HAMMAP ---
  Start = Now
 
  'Wait until HAMMAP Object is created
  Do
   On Error Resume Next
   Set HM = New HAMMAP
   On Error GoTo 0
   If Second(Now - Start) > Timeout Then Exit Function
  Loop While HM Is Nothing
 
  'Wait until HAMMAP is Ready
  Do
   DoEvents
   If Second(Now - Start) > Timeout Then Exit Function
  Loop Until HM.Ready

  HM.ClientName = App.Title
 
  Connect = False

End Function

Property Get Station() As String

  Station = HM.Station
 
End Property

Property Get Ready() As String

  Ready = HM.Ready
 
End Property

Property Let CallbackMask(Mask)

  HM.CallbackMask = Mask
 
End Property

Private Sub HM_Notify(EventNr As Integer, EventData As String)

  Call HmNotify(EventNr, EventData)

End Sub

Friend Function Command(Cmd$, Result$) As Long

  On Error Resume Next
  Result$ = HM.Action(Cmd$)
  If Err.Number Then
   Result$ = Err.Description
   If Err.Number < vbObjectError Then
     Command = -6     'OLE-Error
   Else
     Command = Err.Number - vbObjectError - 1004
   End If
  End If
  On Error GoTo 0
 
End Function

Private Sub HM_Terminate()

  'Terminate Event from HAMMAP
  Call Terminate
 
End Sub

Friend Function Terminate()

  'Terminate OLE from HAMMAP or Client
  Static Busy
 
  'Avoid recursive calls when unloading forms
  If Busy Then Exit Function
 
  Busy = True
 
  On Error Resume Next
  HM.Disconnect
  Set HM = Nothing
  Terminate = Err
  On Error GoTo 0
 
  'Perform program specific Terminate
  Call HammapTerminate
  DoEvents
 
  Busy = False
 
End Function