Skip to content

Commit

Permalink
support firmware v4 spectrum format, add spectrum_accum() function
Browse files Browse the repository at this point in the history
  • Loading branch information
cdump committed Jun 18, 2023
1 parent 89cb49d commit e5a52b1
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 6 deletions.
46 changes: 42 additions & 4 deletions radiacode/decoders/spectrum.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,52 @@
from typing import List
import datetime

from radiacode.bytes_buffer import BytesBuffer
from radiacode.types import Spectrum


def decode_RC_VS_SPECTRUM(br: BytesBuffer) -> Spectrum:
ts, a0, a1, a2 = br.unpack('<Ifff')
counts = []
def decode_counts_v0(br: BytesBuffer) -> List[int]:
ret = []
while br.size() > 0:
counts.append(br.unpack('<I')[0])
ret.append(br.unpack('<I')[0])
return ret


def decode_counts_v1(br: BytesBuffer) -> List[int]:
ret = []
last = 0
while br.size() > 0:
u16 = br.unpack('<H')[0]
cnt = (u16 >> 4) & 0x0FFF
vlen = u16 & 0x0F
for _ in range(cnt):
if vlen == 0:
v = 0
elif vlen == 1:
v = br.unpack('<B')[0]
elif vlen == 2:
v = last + br.unpack('<b')[0]
elif vlen == 3:
v = last + br.unpack('<h')[0]
elif vlen == 4:
a, b, c = br.unpack('<BBb')
v = last + ((c << 16) | (b << 8) | a)
elif vlen == 5:
v = last + br.unpack('<i')[0]
else:
raise Exception(f'unspported vlen={vlen} in decode_RC_VS_SPECTRUM version=1', vlen)

last = v
ret.append(v)
return ret


def decode_RC_VS_SPECTRUM(br: BytesBuffer, format_version: int) -> Spectrum:
ts, a0, a1, a2 = br.unpack('<Ifff')

assert format_version in {0, 1}, f'unspported format_version={format_version}'
counts = decode_counts_v0(br) if format_version == 0 else decode_counts_v1(br)

return Spectrum(
duration=datetime.timedelta(seconds=ts),
a0=a0,
Expand Down
16 changes: 15 additions & 1 deletion radiacode/radiacode.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,12 @@ def __init__(self, bluetooth_mac: Optional[str] = None):
self.set_local_time(self._base_time)
self.device_time(0)

self._spectrum_format_version = 0
for line in self.configuration().split('\n'):
if line.startswith('SpecFormatVersion'):
self._spectrum_format_version = int(line.split('=')[1])
break

def base_time(self) -> datetime.datetime:
return self._base_time

Expand Down Expand Up @@ -106,6 +112,10 @@ def configuration(self) -> str:
r = self.read_request(VS.CONFIGURATION)
return r.data().decode('cp1251')

def text_message(self) -> str:
r = self.read_request(VS.TEXT_MESSAGE)
return r.data().decode('ascii')

def serial_number(self) -> str:
r = self.read_request(8)
return r.data().decode('ascii')
Expand All @@ -124,7 +134,11 @@ def data_buf(self) -> List[Union[CountRate, DoseRate, DoseRateDB, RareData, Even

def spectrum(self) -> Spectrum:
r = self.read_request(VS.SPECTRUM)
return decode_RC_VS_SPECTRUM(r)
return decode_RC_VS_SPECTRUM(r, self._spectrum_format_version)

def spectrum_accum(self) -> Spectrum:
r = self.read_request(VS.SPEC_ACCUM)
return decode_RC_VS_SPECTRUM(r, self._spectrum_format_version)

# used in spectrum_channel_to_energy
def energy_calib(self) -> List[float]:
Expand Down
6 changes: 5 additions & 1 deletion radiacode/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,12 +99,16 @@ class VSFR(Enum):
def __int__(self) -> int:
return self.value


class VS(Enum):
CONFIGURATION = 2
TEXT_MESSAGE = 15
DATA_BUF = 256
SPECTRUM = 512
ENERGY_CALIB = 514
SPEC_ACCUM = 517
SPEC_DIFF = 518 # TODO: what's that? Can be decoded by spectrum decoder
# UNKNOWN_13 = 13
# UNKNOWN_240 = 240

def __int__(self) -> int:
return self.value
Expand Down

0 comments on commit e5a52b1

Please sign in to comment.