A Python package wrapping stormpci.h via PyBind11 for interfacing with StormPCI and reading binary files
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

225 lines
9.2 KiB

#ifndef STORMPCI_H
#define STORMPCI_H
#include <linux/types.h>
/**
* \brief
* \~english Capture Buffer goes from 0 - 511 = 512 bytes.
* \~russian Размер буфера данных с платы. 512 байт.
*/
#define BOLTEK_BUFFERSIZE 512
/**
* \brief
* \~english tSATELLITETYPE is the detailed satellite info from the gps
* \~russian tSATELLITETYPE Подробная информация о спутнике
*/
struct StormProcess_tSATELLITETYPE
{
/**
* \brief
* \~english Satellite ID. 0..37
* \~russian ID спутника. 0..37
*/
char SVID;
/** 0..8
* where 0 = code search 5 = message sync detect
* 1 = code acquire 6 = satellite time available
* 2 = AGC set 7 = ephemeris acquire
* 3 = freq acquire 8 available for position
* 4 = bit sync detect
*/
char mode;
unsigned char signal_strength; ///< 0..255
/** 16 bits
* where (msb) bit 15 = reserved
* bit 14 = reserved
* bit 13 = reserved
* bit 12 = narrow-band search mode
* bit 11 = channel used for time solution
* bit 10 = differential corrections available
* bit 9 = invalid data
* bit 8 = parity error
* bit 7 = channel used for position fix
* bit 6 = satellite momentum alert flag
* bit 5 = satellite anti-spoof flag set
* bit 4 = satellite reported unhealthy
* bit 3 = satellite accuracy (msb)
* bit 2 = satellite accuracy
* bit 1 = satellite accuracy
* bit 0 = satellite accuracy (lsb)
*/
unsigned short channel_status;
};
/** \brief
* \~english tTIMESTAMPINFO is the detailed gps and timestamp data
* \~russian tTIMESTAMPINFO Детальная информация
*/
typedef struct
{
int TS_valid;
unsigned long TS_Osc; ///< actual frequency of timestamp's 50MHz osc
unsigned long TS_time; ///< 0..999,999,999 ns of trigger (вообще-то это число колебаний осциллятора)
unsigned char TS_10ms; ///< 0..99 (сколько раз прошло по 10 ms с предыдущей секунды)
unsigned long capture_time; ///< 0..999,999,999 ns of first peak
int gps_data_valid;
unsigned char month; ///< 1..12
unsigned char day; ///< 1..31
unsigned short year; ///< 1998 to 2079
unsigned char hours; ///< 0..23
unsigned char minutes; ///< 0..59
unsigned char seconds; ///< 0..60
int latitude_mas; ///< 324,000,000..324,000,000 (-90°..+90°)
int longitude_mas; ///< 648,000,000..648,000,000 (-180°..+176°)
char latitude_ns; ///< 'N' or 'S'
char longitude_ew; ///< 'E' or 'W'
int height_cm; ///< -100,000..+1,800,000 (-1000..+18,000m)
unsigned short dop; ///< 0..999 (0.0 to 99.9 DOP)
unsigned char satellites_visible; ///< 0..12
unsigned char satellites_tracked; ///< 0..12
struct StormProcess_tSATELLITETYPE satellite[12]; ///< individual satellite data
/** 16 bits
* where (msb) bit 15..13 111 = 3D fix
* 110 = 2D fix
* 101 = propogate mode
* 100 = position hold
* 011 = acquiring satellites
* 010 = bad geometry
* 001 = reserved
* 000 = reserved
* bit 12..11 = reserved
* bit 10 = narrow band tracking mode
* bit 9 = fast acquisition position
* bit 8 = filter reset to raw gps solution
* bit 7 = cold start (no almanac or almanac out of date or time & position unknown)
* bit 6 = differential fix
* bit 5 = position lock
* bit 4 = autosurvey mode
* bit 3 = insufficient visible satellites
* bit 2..1 = antenna sense
* where 00 = Ok
* 01 = over current
* 10 = under current
* 11 = no bias voltage
* bit 0 = code location
*/
unsigned short receiver_status;
short oscillator_temperature; ///< -110..250 half degrees C (-55..+125°C)
short serial_number;
} StormProcess_tTIMESTAMPINFO;
typedef struct StormProcess_tBOARDDATA_t
{
int EFieldBuf[BOLTEK_BUFFERSIZE]; ///< essentially a 1 bit a-to-d converter
int NorthBuf[BOLTEK_BUFFERSIZE]; ///< 0-255 data, we use int so we have room to filter the data
int EastBuf[BOLTEK_BUFFERSIZE]; ///< 0-255 data, we use int so we have room to filter the data
StormProcess_tTIMESTAMPINFO lts2_data; ///< timestamp and gps data
int NorthMaxPos, NorthMinPos, EastMaxPos, EastMinPos; ///< pos of signal peaks
int North_Pk, East_Pk; ///< signal pk-pk amplitude
int NorthPol, EastPol, EFieldPol; ///< signal polarity
} StormProcess_tBOARDDATA;
/// this is the structure passed to the device driver GET_DATA ioctl
typedef struct stormpci_packed_data
{
__u16 usNorth[BOLTEK_BUFFERSIZE];
__u16 usWest [BOLTEK_BUFFERSIZE];
} StormProcess_tPACKEDDATA;
typedef struct StormProcess_tSTRIKE {
int valid; ///< data appars to be valid signal, not just noise
float distance; ///< miles away, for close strike detection
float distance_averaged; ///< miles away, for close strike detection
float direction; ///< 0-360 degrees
} StormProcess_tSTRIKE;
#define STORMTRACKER_DEVICE_NAME "/dev/lightning-0"
#ifdef __cplusplus
extern "C" {
#endif
/** \brief
* \~english connect to the StormTracker card - non-zero on success
* \~russian Инициализация PCI-карты Boltek StromTracker. Возвращает не 0 в случае успеха.
*/
int StormPCI_OpenPciCard(void);
/** \brief
* \~english clean up, all done
* \~russian Деинициализация PCI-карты Boltek StromTracker.
*/
void StormPCI_ClosePciCard(void);
/** \brief
* \~english after reading the data, wait for the next strike
* \~russian После считывания данных ждать следующую вспышку.
*/
void StormPCI_RestartBoard(void);
/** \brief
* \~english force StormTracker to give you a capture
* \~russian Принудить PCI-карту Boltek StromTracker очуществить захват данных.
*/
void StormPCI_ForceTrigger(void);
/** \brief
* \~english check if a strike is waiting to be read by GetCapture()
* \~russian Проверить, не захвачена ли вспышка. Возвращает не ноль, если захвачена.
*/
int StormPCI_StrikeReady(void);
/** \brief
* \~english 0-15, 0:most sensitive (preferred), 15: least sensitive
* \~russian Установить чувствительность, значения из диапазона 0-15. 0 - самая высокая чуствительность, 15 - самая низкая.
*/
void StormPCI_SetSquelch(char trig_level);
/** \brief
* \~english retrieve the waiting capture
* \~russian Получить упакованные захваченные данные с PCI-платы Boltek StormTracker.
*
* \param board_data
* \~english Packed data
* \~russian Упакованные даные будут помещены в структуру по этому адресу.
*/
void StormPCI_GetBoardData(StormProcess_tPACKEDDATA* board_data);
/** \brief
* \~english Unpack raw data from board. GPS timestamps, 1 bit electric field and two 8 bit magnetic fields extracted.
* \~russian Распаковать первичные данные с платы: метку точного времени, 1-битное электрическое поле и два перпендикулярных 8-битных магнитных поля.
*
* \param packed_data
* \~english Raw data from board
* \~russian Первичные данные с платы
*
* \param board_data
* \~english Unpacked data
* \~russian Распакованные данные: метка точного времени, 1-битное электрическое поле и два перпендикулярных 8-битных магнитных поля.
*/
void StormProcess_UnpackCaptureData(StormProcess_tPACKEDDATA *packed_data, StormProcess_tBOARDDATA* board_data);
/**
* \brief
* \~english Process capture data: calculate lightning direction and distance.
* \~russian Обработка распакованного сигнала: определение положения вспышки.
*/
StormProcess_tSTRIKE StormProcess_SSProcessCapture(StormProcess_tBOARDDATA* capture);
#ifdef __cplusplus
}
#endif
#endif