tcadif
Read and write data in Amateur Data Interchange Format (ADIF) with node.js.
Examples
Synchronous ADIF Reading and Writing
Reading
To parse ADIF text, simply call ADIF.parse(text)
. The result is an ADIF
instance. To transform it into a plain old JavaScript object, call .toObject();
const { ADIF } = require('tcadif');
const fs = require('fs');
const path = require('path');
const input = fs.readFileSync(path.join(__dirname, 'sample.adi')).toString();
const adif = ADIF.parse(input);
console.log(adif.toObject());
Writing
To write ADIF text, simply instantiate an ADIF instance with an optional header
and qsos. Then call .stringify()
.
const { ADIF } = require('tcadif');
const fs = require('fs');
const path = require('path');
const input = {
qsos: [
{
BAND: '20m',
CALL: 'KG9JP',
FREQ: '14',
MODE: 'SSB',
NOTES: 'POTA K-4293 WI',
QSL_RCVD: 'N',
QSL_SENT: 'N',
QSO_DATE: '20230217',
QSO_DATE_OFF: '20230217',
RST_RCVD: '57',
RST_SENT: '59',
TIME_OFF: '172600',
TIME_ON: '172600',
TX_PWR: '20'
}
]
};
const adif = new ADIF(input);
console.log(adif.stringify());
.stringify(options = {})
accepts an optional object argument which influences the output:
-
fieldDelim
- a string to insert between fields. Default end-of-line sequence (\n
or\r\n
). -
recordDelim
- a string to insert between records (header and QSOs). Default two end-of-line sequences (\n
or\r\n
). -
programName
- the name of your application. Defaults to this modules package.name (i.e.tcadif
). -
programVersion
- the version of your application. Defaults to this module's package.version (e.g.1.6.1
). -
verbosity
- controls which fields are included in the output -
full
- all fields (default). -
compact
- only the required fieldsQSO_DATE
,TIME_ON
,CALL
,BAND
orFREQ
, andMODE
.
Streaming ADIF Reading and Writing
AdifReader
Read a text stream and ouputs an object stream:
'use strict';
const { AdifReader } = require('tcadif');
const fs = require('fs');
const path = require('path');
const input = fs.createReadStream(path.join(__dirname, 'sample.adi'));
const reader = new AdifReader();
reader.on('data', record => console.log('data', record));
reader.on('error', err => console.error('err', err));
input.pipe(reader);
AdifWriter
Reads an object stream and outputs a text stream:
'use strict';
const { AdifWriter } = require('tcadif');
const writer = new AdifWriter();
writer.pipe(process.stdout);
writer.write({
BAND: '20m',
CALL: 'VA2EPR',
MODE: 'CW',
QSO_DATE: '20230306',
TIME_ON: '1728',
OPERATOR: 'VA2NW',
});
Passthrough
Reads a text stream, transforms it into an object stream, transforms it back into a text stream, and writes a text stream:
'use strict';
const { AdifReader, AdifWriter } = require('tcadif');
const fs = require('fs');
const path = require('path');
const input = fs.createReadStream(path.join(__dirname, 'sample.adi'));
const reader = new AdifReader();
const writer = new AdifWriter();
const output = fs.createWriteStream(path.join(__dirname, 'sample-2.adi'));
input
.pipe(reader)
.pipe(writer)
.pipe(output);
Application-defined Fields
Field | Data Type | Sub Type | Description |
---|---|---|---|
APP_TCADIF_KEY |
Enumeration |
App TCADIF Key Enumeration | the contacted station's Morse key. |
APP_TCADIF_KEY_INFO |
String |
the contacted station's Morse key information (make, model, etc). | |
APP_TCADIF_LICW |
String |
the contacted station's Long Island CW Club (LICW) member information. | |
APP_TCADIF_MY_KEY |
Enumeration |
App TCADIF Key Enumeration | the logging station's Morse key. |
APP_TCADIF_MY_KEY_INFO |
String |
the logging station's Morse key information (make, model, etc). | |
APP_TCADIF_QSO_ID |
Uuid |
App TCADIF QSO Identifier | Universally Unique IDentifier (UUID) for this QSO. |
Data Types
Data Type Name | Data Type Indicator | Description |
---|---|---|
Uuid |
A string representation of a Universally Unique IDentifier. See RFC4122. |
App TCADIF Key Enumeration
Abbreviation | Key |
---|---|
SK |
Straight key |
SS |
Sideswiper |
BUG |
Bug |
SLP |
Single-Lever Paddle |
DLP |
Dual-Lever Paddle |
CPU |
Computer |
ADIF Implementation Notes
- QSO valid requires the following fields:
QSO_DATE
,TIME_ON
,CALL
,BAND
orFREQ
,MODE
. - Unknown Application-defined Fields, User-defined Fields, and Deprecated Fields are ignored.
- No referential integrity checks have been implemented (e.g. there are no checks that the state is valid for the country, the band is valid for the frequency, etc)).
- If a field appears more than once in a record, the last instance is the one used.