Skip to content

Commit

Permalink
ZLOX: FT4/FT8
Browse files Browse the repository at this point in the history
  • Loading branch information
JG1VPP committed Jun 2, 2024
1 parent ab7ff5b commit a51fb9f
Show file tree
Hide file tree
Showing 10 changed files with 901 additions and 723 deletions.
222 changes: 24 additions & 198 deletions src/main/java/gaas/table/ZBinDecoder.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,16 @@
*******************************************************************************/
package gaas.table;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;

import qxsl.draft.Qxsl;
import qxsl.model.Item;
import qxsl.draft.Band;
import qxsl.draft.Mode;
import qxsl.draft.Watt;
import qxsl.model.Node;
import qxsl.table.BasicDecoder;

import gaas.table.ZBinFactory.BandEnum;
import gaas.table.ZBinFactory.DateTime;
import gaas.table.ZBinFactory.ModeEnum;
import gaas.table.ZBinFactory.WattEnum;
import static qxsl.table.BasicFactory.FieldSet;

/**
* zLogのZLO書式で永続化された交信記録を解読します。
Expand All @@ -28,9 +24,10 @@
*
* @since 2013/02/23
*/
public final class ZBinDecoder extends BasicDecoder {
private final DataInputStream source;
private DateTime tDTime;
public final class ZBinDecoder extends ZLogDecoder {
private final FieldSet<Band> bandSet;
private final FieldSet<Mode> modeSet;
private final FieldSet<Watt> wattSet;

/**
* 指定された入力を読み込むデコーダを構築します。
Expand All @@ -39,31 +36,10 @@ public final class ZBinDecoder extends BasicDecoder {
* @param stream 入力
*/
public ZBinDecoder(InputStream stream) {
super("zbin");
this.source = new DataInputStream(stream);
}

/**
* タイムゾーンを設定します。
*
*
* @param zone タイムゾーン
*
* @since 2022/06/22
*/
protected final void setTimeZone(short zone) {
this.tDTime = DateTime.newInstance(zone);
}

/**
* ストリームを閉じて資源を解放します。
*
*
* @throws IOException 解放に失敗した場合
*/
@Override
public final void close() throws IOException {
source.close();
super("zbin", stream);
this.bandSet = ZBinFactory.getBandSet();
this.modeSet = ZBinFactory.getModeSet();
this.wattSet = ZBinFactory.getWattSet();
}

/**
Expand All @@ -86,51 +62,15 @@ public final void head() throws IOException {
}

/**
* ストリームの交信記録の末尾を読み取ります
* 次の交信記録までバイト列を読み飛ばします
*
*
* @throws IOException 読み取りに失敗した場合
*
* @since 2020/09/04
*/
@Override
public final void foot() throws IOException {}

/**
* ストリームの現在位置の交信記録を読み取ります。
*
*
* @return 読み取った交信記録
*
* @throws IOException 読み取りに失敗した場合
*
* @since 2020/09/04
* @since 2024/06/02
*/
@Override
public final Item next() throws IOException {
final var item = new Item();
time(item.getBoth());
call(item.getBoth());
code(item.getSent());
code(item.getRcvd());
source.skipBytes(1);
rstq(item.getSent());
rstq(item.getRcvd());
source.skipBytes(4);
mode(item.getBoth());
band(item.getBoth());
watt(item.getSent());
mul1(item.getBoth());
mul2(item.getBoth());
source.skipBytes(3);
name(item.getBoth());
note(item.getBoth());
source.skipBytes(4);
source.skipBytes(4); // Pow2
source.skipBytes(4); // Rsv2
source.skipBytes(4); // Rsv3
return item;
}
public final void skip() throws IOException {}

/**
* ストリームに交信記録が存在するかを確認します。
Expand All @@ -147,71 +87,6 @@ public final boolean hasNext() throws IOException {
return source.available() > 0;
}

/**
* 指定された長さまでの文字列を読み取ります。
*
*
* @param max 最大文字数
*
* @return 読み込んだ文字列
*
* @throws IOException 読み取りに失敗した場合
*/
private final String read(int max) throws IOException {
final var buff = new byte[source.read()];
source.readFully(buff);
source.skipBytes(max - buff.length);
return new String(buff, "SJIS");
}

/**
* 交信記録に交信日時を読み取ります。
*
*
* @param node 設定する交信記録
*
* @throws IOException 読み取りに失敗した場合
*/
private final void time(Node node) throws IOException {
node.set(tDTime.decode(source.readLong()));
}

/**
* 交信記録に呼出符号を読み取ります。
*
*
* @param node 設定する交信記録
*
* @throws IOException 読み取りに失敗した場合
*/
private final void call(Node node) throws IOException {
node.set(cache(Qxsl.CALL, read(12)));
}

/**
* 交信記録にナンバーを読み取ります。
*
*
* @param node 設定する交信記録
*
* @throws IOException 読み取りに失敗した場合
*/
private final void code(Node node) throws IOException {
node.set(cache(Qxsl.CODE, read(30)));
}

/**
* 交信記録にレポートを読み取ります。
*
*
* @param node 設定する交信記録
*
* @throws IOException 読み取りに失敗した場合
*/
private final void rstq(Node node) throws IOException {
node.set(cache(Qxsl.RSTQ, Short.reverseBytes(source.readShort())));
}

/**
* 交信記録に通信方式を読み取ります。
*
Expand All @@ -220,8 +95,9 @@ private final void rstq(Node node) throws IOException {
*
* @throws IOException 読み取りに失敗した場合
*/
private final void mode(Node node) throws IOException {
node.set(ModeEnum.forIndex(source.read()).toMode());
@Override
public final void mode(Node node) throws IOException {
node.set(modeSet.valueOf(source.read()));
}

/**
Expand All @@ -232,8 +108,9 @@ private final void mode(Node node) throws IOException {
*
* @throws IOException 読み取りに失敗した場合
*/
private final void band(Node node) throws IOException {
node.set(BandEnum.forIndex(source.read()).toBand());
@Override
public final void band(Node node) throws IOException {
node.set(bandSet.valueOf(source.read()));
}

/**
Expand All @@ -244,59 +121,8 @@ private final void band(Node node) throws IOException {
*
* @throws IOException 読み取りに失敗した場合
*/
private final void watt(Node node) throws IOException {
node.set(WattEnum.forIndex(source.read()).toWatt());
}

/**
* 交信記録に獲得番号を読み取ります。
*
*
* @param node 設定する交信記録
*
* @throws IOException 読み取りに失敗した場合
*
* @since 2020/10/28
*/
private final void mul1(Node node) throws IOException {
node.set(cache(Qxsl.MUL1, read(30)));
}

/**
* 交信記録に追加番号を読み取ります。
*
*
* @param node 設定する交信記録
*
* @throws IOException 読み取りに失敗した場合
*
* @since 2020/10/28
*/
private final void mul2(Node node) throws IOException {
node.set(cache(Qxsl.MUL2, read(30)));
}

/**
* 交信記録に運用者名を読み取ります。
*
*
* @param node 設定する交信記録
*
* @throws IOException 読み取りに失敗した場合
*/
private final void name(Node node) throws IOException {
node.set(cache(Qxsl.NAME, read(14)));
}

/**
* 交信記録に交信の備考を読み取ります。
*
*
* @param node 設定する交信記録
*
* @throws IOException 読み取りに失敗した場合
*/
private final void note(Node node) throws IOException {
node.set(cache(Qxsl.NOTE, read(64)));
@Override
public final void watt(Node node) throws IOException {
node.set(wattSet.valueOf(source.read()));
}
}
Loading

0 comments on commit a51fb9f

Please sign in to comment.