Full Code of merbanan/rtl_433 for AI

master fd765cfc5331 cached
493 files
3.8 MB
1.0M tokens
2674 symbols
1 requests
Download .txt
Showing preview only (4,017K chars total). Download the full file or copy to clipboard to get everything.
Repository: merbanan/rtl_433
Branch: master
Commit: fd765cfc5331
Files: 493
Total size: 3.8 MB

Directory structure:
gitextract_m2nsv5xx/

├── .ci/
│   └── scripts/
│       ├── do_sysroot.sh
│       └── do_tests.sh
├── .clang-format
├── .deploy/
│   ├── WINDOWS-MINGWW64.txt
│   ├── WINDOWS-MSVC.txt
│   ├── gen_nightly_info.sh
│   └── gen_release_info.py
├── .github/
│   ├── actions/
│   │   └── style-check/
│   │       ├── action.yml
│   │       └── index.js
│   └── workflows/
│       ├── check.yml
│       └── release.yml
├── .gitignore
├── AUTHORS
├── CHANGELOG.md
├── CMakeLists.txt
├── COPYING
├── Doxyfile.in
├── README.md
├── cmake/
│   ├── Modules/
│   │   ├── FindGperftools.cmake
│   │   ├── FindLibRTLSDR.cmake
│   │   ├── FindLibUSB.cmake
│   │   ├── GetGitRevisionDescription.cmake
│   │   └── GetGitRevisionDescription.cmake.in
│   ├── Toolchain-aarch64-linux-gnu.cmake
│   ├── Toolchain-arm-linux-gnueabi.cmake
│   ├── Toolchain-arm-linux-gnueabihf.cmake
│   ├── Toolchain-gcc-mingw-w64-i686.cmake
│   ├── Toolchain-gcc-mingw-w64-x86-64.cmake
│   └── cmake_uninstall.cmake.in
├── conf/
│   ├── CAME-TOP432.conf
│   ├── CMakeLists.txt
│   ├── ContinentalRemote.conf
│   ├── Dewenwils_BHV.conf
│   ├── DrivewayAlarm_I8-W1901.conf
│   ├── DrivewayAlert.conf
│   ├── EV1527-4Button-Universal-Remote.conf
│   ├── EV1527-DDS-Sgooway.conf
│   ├── EV1527-PIR-Sgooway.conf
│   ├── FAN-53T.conf
│   ├── GhostControls.conf
│   ├── HeatmiserPRT-W.conf
│   ├── Hormann-blue.conf
│   ├── LeakDetector.conf
│   ├── MightyMule-FM231.conf
│   ├── MondeoRemote.conf
│   ├── PHOX.conf
│   ├── Reolink-doorbell.conf
│   ├── SMC5326-Remote.conf
│   ├── SWETUP-garage-opener.conf
│   ├── SalusRT300RF.conf
│   ├── Skylink_HA-434TL.conf
│   ├── Thomson-doorbell.conf
│   ├── adlm_fprf.conf
│   ├── atc-technology_lmt-430.conf
│   ├── car_fob.conf
│   ├── chungear_bcf-0019x2.conf
│   ├── dooya_curtain.conf
│   ├── elro_ab440r.conf
│   ├── energy_count_3000.conf
│   ├── fan-11t.conf
│   ├── friedlandevo.conf
│   ├── ge_smartremote_plus.conf
│   ├── heatilator.conf
│   ├── honeywell-fan.conf
│   ├── hornbach-msrc-sal.conf
│   ├── ivac_pro.conf
│   ├── led-light-remote.conf
│   ├── oma-blind-remote.conf
│   ├── pir-ef4.conf
│   ├── quinetic_switch.conf
│   ├── qx-30x.conf
│   ├── rako_wireless_lighting.conf
│   ├── restaurant_pager.conf
│   ├── rolleaseacmedia.conf
│   ├── rtl_433.example.conf
│   ├── silverline_doorbell.conf
│   ├── sonoff_rm433.conf
│   ├── steffen_switch.conf
│   ├── tesla_charge-port-opener.conf
│   ├── tyreguard400.conf
│   ├── valeo_car_key.conf
│   ├── verisure_alarm.conf
│   └── xmas-tree-remote-2APJZ-CW002.conf
├── docs/
│   ├── .gitignore
│   ├── .vuepress/
│   │   ├── config.js
│   │   └── styles/
│   │       └── index.scss
│   ├── ANALYZE.md
│   ├── BINARY_BUILDS.md
│   ├── BUILDING.md
│   ├── CONTRIBUTING.md
│   ├── DATA_FORMAT.md
│   ├── HARDWARE.md
│   ├── INTEGRATION.md
│   ├── IQ_FORMATS.md
│   ├── LINKS.md
│   ├── OPERATION.md
│   ├── PRIMER.md
│   ├── STARTING.md
│   ├── build-docs.sh
│   └── package.json
├── examples/
│   ├── README.md
│   ├── mqtt_filter.py
│   ├── mqtt_rtl_433_test_client.py
│   ├── open_rtl433.py
│   ├── rtl_433_collectd_pipe.py
│   ├── rtl_433_custom.php
│   ├── rtl_433_custom.py
│   ├── rtl_433_gps.py
│   ├── rtl_433_graphite_relay.py
│   ├── rtl_433_http_cmd.py
│   ├── rtl_433_http_cmd.sh
│   ├── rtl_433_http_events.py
│   ├── rtl_433_http_stream.php
│   ├── rtl_433_http_stream.py
│   ├── rtl_433_http_ws.py
│   ├── rtl_433_influxdb_relay.py
│   ├── rtl_433_json_to_rtlwmbus.py
│   ├── rtl_433_mqtt_hass.py
│   ├── rtl_433_mqtt_relay.py
│   ├── rtl_433_prometheus_relay.py
│   ├── rtl_433_rrd_relay.py
│   ├── rtl_433_statsd_pipe.py
│   └── rtl_433_statsd_relay.py
├── include/
│   ├── CMakeLists.txt
│   ├── abuf.h
│   ├── am_analyze.h
│   ├── baseband.h
│   ├── bit_util.h
│   ├── bitbuffer.h
│   ├── c_util.h
│   ├── compat_paths.h
│   ├── compat_pthread.h
│   ├── compat_time.h
│   ├── confparse.h
│   ├── data.h
│   ├── data_tag.h
│   ├── decoder.h
│   ├── decoder_util.h
│   ├── fatal.h
│   ├── fileformat.h
│   ├── http_server.h
│   ├── jsmn.h
│   ├── list.h
│   ├── logger.h
│   ├── mongoose.h
│   ├── optparse.h
│   ├── output_file.h
│   ├── output_influx.h
│   ├── output_log.h
│   ├── output_mqtt.h
│   ├── output_rtltcp.h
│   ├── output_trigger.h
│   ├── output_udp.h
│   ├── pulse_analyzer.h
│   ├── pulse_data.h
│   ├── pulse_detect.h
│   ├── pulse_detect_fsk.h
│   ├── pulse_slicer.h
│   ├── r_api.h
│   ├── r_device.h
│   ├── r_private.h
│   ├── r_util.h
│   ├── raw_output.h
│   ├── rfraw.h
│   ├── rtl_433.h
│   ├── rtl_433_devices.h
│   ├── samp_grab.h
│   ├── sdr.h
│   ├── term_ctl.h
│   └── write_sigrok.h
├── maintainer_update.py
├── man/
│   └── man1/
│       └── rtl_433.1
├── rtl433.pc.in
├── src/
│   ├── CMakeLists.txt
│   ├── abuf.c
│   ├── am_analyze.c
│   ├── baseband.c
│   ├── bit_util.c
│   ├── bitbuffer.c
│   ├── compat_paths.c
│   ├── compat_time.c
│   ├── confparse.c
│   ├── data.c
│   ├── data_tag.c
│   ├── decoder_util.c
│   ├── devices/
│   │   ├── abmt.c
│   │   ├── acurite.c
│   │   ├── acurite_01185m.c
│   │   ├── akhan_100F14.c
│   │   ├── alecto.c
│   │   ├── ambient_weather.c
│   │   ├── ambientweather_tx8300.c
│   │   ├── ambientweather_wh31e.c
│   │   ├── ant_antplus.c
│   │   ├── apator_metra_eitn30.c
│   │   ├── apator_metra_erm30.c
│   │   ├── arad_ms_meter.c
│   │   ├── archos_tbh.c
│   │   ├── arexx_ml.c
│   │   ├── atech_ws308.c
│   │   ├── auriol_4ld5661.c
│   │   ├── auriol_aft77b2.c
│   │   ├── auriol_afw2a1.c
│   │   ├── auriol_ahfl.c
│   │   ├── auriol_hg02832.c
│   │   ├── badger_orion_endpoint.c
│   │   ├── badger_water.c
│   │   ├── baldr_rain.c
│   │   ├── baldr_therm.c
│   │   ├── blueline.c
│   │   ├── blyss.c
│   │   ├── bm5.c
│   │   ├── brennenstuhl_rcs_2044.c
│   │   ├── bresser_3ch.c
│   │   ├── bresser_5in1.c
│   │   ├── bresser_6in1.c
│   │   ├── bresser_7in1.c
│   │   ├── bresser_leakage.c
│   │   ├── bresser_lightning.c
│   │   ├── bresser_st1005h.c
│   │   ├── bt_rain.c
│   │   ├── burnhardbbq.c
│   │   ├── calibeur.c
│   │   ├── cardin.c
│   │   ├── cavius.c
│   │   ├── ced7000.c
│   │   ├── celsia_czc1.c
│   │   ├── chamberlain_cwpirc.c
│   │   ├── chuango.c
│   │   ├── cmr113.c
│   │   ├── companion_wtr001.c
│   │   ├── cotech_36_7959.c
│   │   ├── current_cost.c
│   │   ├── danfoss.c
│   │   ├── deltadore_x3d.c
│   │   ├── digitech_xc0324.c
│   │   ├── directv.c
│   │   ├── dish_remote_6_3.c
│   │   ├── dsc.c
│   │   ├── ec3k.c
│   │   ├── ecodhome.c
│   │   ├── ecowitt.c
│   │   ├── efergy_e2_classic.c
│   │   ├── efergy_optical.c
│   │   ├── efth800.c
│   │   ├── elro_db286a.c
│   │   ├── elv.c
│   │   ├── emax.c
│   │   ├── emontx.c
│   │   ├── emos_e6016.c
│   │   ├── emos_e6016_rain.c
│   │   ├── enocean_erp1.c
│   │   ├── ert_idm.c
│   │   ├── ert_scm.c
│   │   ├── esa.c
│   │   ├── esic_emt7110.c
│   │   ├── esperanza_ews.c
│   │   ├── eurochron.c
│   │   ├── fineoffset.c
│   │   ├── fineoffset_wh1050.c
│   │   ├── fineoffset_wh1080.c
│   │   ├── fineoffset_wh31l.c
│   │   ├── fineoffset_wh43.c
│   │   ├── fineoffset_wh45.c
│   │   ├── fineoffset_wh46.c
│   │   ├── fineoffset_wh55.c
│   │   ├── fineoffset_wn34.c
│   │   ├── fineoffset_ws80.c
│   │   ├── fineoffset_ws85.c
│   │   ├── fineoffset_ws90.c
│   │   ├── flex.c
│   │   ├── flowis.c
│   │   ├── fordremote.c
│   │   ├── fs20.c
│   │   ├── ft004b.c
│   │   ├── funkbus.c
│   │   ├── gasmate_ba1008.c
│   │   ├── ge_coloreffects.c
│   │   ├── geevon.c
│   │   ├── geevon_tx19.c
│   │   ├── generic_motion.c
│   │   ├── generic_remote.c
│   │   ├── generic_temperature_sensor.c
│   │   ├── geo_minim.c
│   │   ├── govee.c
│   │   ├── gridstream.c
│   │   ├── gt_tmbbq05.c
│   │   ├── gt_wt_02.c
│   │   ├── gt_wt_03.c
│   │   ├── hcs200.c
│   │   ├── hideki.c
│   │   ├── holman_ws5029.c
│   │   ├── homelead_hg9901.c
│   │   ├── hondaremote.c
│   │   ├── honeywell.c
│   │   ├── honeywell_cm921.c
│   │   ├── honeywell_wdb.c
│   │   ├── ht680.c
│   │   ├── ibis_beacon.c
│   │   ├── ikea_sparsnas.c
│   │   ├── infactory.c
│   │   ├── inkbird_ith20r.c
│   │   ├── inovalley-kw9015b.c
│   │   ├── insteon.c
│   │   ├── interlogix.c
│   │   ├── intertechno.c
│   │   ├── jasco.c
│   │   ├── kedsum.c
│   │   ├── kerui.c
│   │   ├── klimalogg.c
│   │   ├── lacrosse.c
│   │   ├── lacrosse_breezepro.c
│   │   ├── lacrosse_r1.c
│   │   ├── lacrosse_th3.c
│   │   ├── lacrosse_tx141x.c
│   │   ├── lacrosse_tx31u.c
│   │   ├── lacrosse_tx34.c
│   │   ├── lacrosse_tx35.c
│   │   ├── lacrosse_wr1.c
│   │   ├── lacrosse_ws7000.c
│   │   ├── lacrossews.c
│   │   ├── lightwave_rf.c
│   │   ├── m_bus.c
│   │   ├── markisol.c
│   │   ├── marlec_solar.c
│   │   ├── maverick_et73.c
│   │   ├── maverick_et73x.c
│   │   ├── maverick_xr30.c
│   │   ├── maverick_xr50.c
│   │   ├── mebus.c
│   │   ├── megacode.c
│   │   ├── missil_ml0757.c
│   │   ├── mueller_hotrod.c
│   │   ├── neptune_r900.c
│   │   ├── new_template.c
│   │   ├── newkaku.c
│   │   ├── nexa.c
│   │   ├── nexus.c
│   │   ├── nice_flor_s.c
│   │   ├── norgo.c
│   │   ├── oil_smart.c
│   │   ├── oil_standard.c
│   │   ├── oil_watchman.c
│   │   ├── oil_watchman_advanced.c
│   │   ├── opus_xt300.c
│   │   ├── oregon_scientific.c
│   │   ├── oregon_scientific_sl109h.c
│   │   ├── oregon_scientific_v1.c
│   │   ├── oria_wa150km.c
│   │   ├── philips_aj3650.c
│   │   ├── philips_aj7010.c
│   │   ├── proflame2.c
│   │   ├── prologue.c
│   │   ├── proove.c
│   │   ├── quhwa.c
│   │   ├── quinetic.c
│   │   ├── radiohead_ask.c
│   │   ├── rainpoint.c
│   │   ├── rainpoint_hcs012arf.c
│   │   ├── regency_fan.c
│   │   ├── revolt_nc5462.c
│   │   ├── revolt_zx7717.c
│   │   ├── rftech.c
│   │   ├── risco_agility.c
│   │   ├── rojaflex.c
│   │   ├── rosstech_dcu706.c
│   │   ├── rubicson.c
│   │   ├── rubicson_48659.c
│   │   ├── rubicson_pool_48942.c
│   │   ├── s3318p.c
│   │   ├── sainlogic_sa8.c
│   │   ├── schou_72543_rain.c
│   │   ├── schraeder.c
│   │   ├── scmplus.c
│   │   ├── secplus_v1.c
│   │   ├── secplus_v2.c
│   │   ├── sharp_spc775.c
│   │   ├── silvercrest.c
│   │   ├── simplisafe.c
│   │   ├── simplisafe_gen3.c
│   │   ├── smoke_gs558.c
│   │   ├── solight_te44.c
│   │   ├── somfy_iohc.c
│   │   ├── somfy_rts.c
│   │   ├── springfield.c
│   │   ├── srsmith_pool_srs_2c_tx.c
│   │   ├── steelmate.c
│   │   ├── telldus_ft0385r.c
│   │   ├── tfa_14_1504_v2.c
│   │   ├── tfa_30_3196.c
│   │   ├── tfa_30_3221.c
│   │   ├── tfa_drop_30.3233.c
│   │   ├── tfa_marbella.c
│   │   ├── tfa_pool_thermometer.c
│   │   ├── tfa_twin_plus_30.3049.c
│   │   ├── thermopro_tp11.c
│   │   ├── thermopro_tp12.c
│   │   ├── thermopro_tp211b.c
│   │   ├── thermopro_tp28b.c
│   │   ├── thermopro_tp82xb.c
│   │   ├── thermopro_tp862b.c
│   │   ├── thermopro_tx2.c
│   │   ├── thermopro_tx2c.c
│   │   ├── thermopro_tx7b.c
│   │   ├── thermor.c
│   │   ├── tpms_abarth124.c
│   │   ├── tpms_airpuxem.c
│   │   ├── tpms_ave.c
│   │   ├── tpms_bmw.c
│   │   ├── tpms_bmw_g3.c
│   │   ├── tpms_citroen.c
│   │   ├── tpms_eezrv.c
│   │   ├── tpms_elantra2012.c
│   │   ├── tpms_ford.c
│   │   ├── tpms_gm.c
│   │   ├── tpms_hyundai_vdo.c
│   │   ├── tpms_jansite.c
│   │   ├── tpms_jansite_solar.c
│   │   ├── tpms_kia.c
│   │   ├── tpms_nissan.c
│   │   ├── tpms_pmv107j.c
│   │   ├── tpms_porsche.c
│   │   ├── tpms_renault.c
│   │   ├── tpms_renault_0435r.c
│   │   ├── tpms_toyota.c
│   │   ├── tpms_truck.c
│   │   ├── tpms_trw.c
│   │   ├── tpms_tyreguard400.c
│   │   ├── ts_ft002.c
│   │   ├── ttx201.c
│   │   ├── universalfanctrl.c
│   │   ├── vaillant_vrt340f.c
│   │   ├── vauno_en8822c.c
│   │   ├── vevor_7in1.c
│   │   ├── visonic_powercode.c
│   │   ├── wallarge_cltx001.c
│   │   ├── watts_thermostat.c
│   │   ├── waveman.c
│   │   ├── wec2103.c
│   │   ├── wg_pb12v1.c
│   │   ├── ws2032.c
│   │   ├── wssensor.c
│   │   ├── wt0124.c
│   │   ├── wt450.c
│   │   ├── x10_rf.c
│   │   ├── x10_sec.c
│   │   └── yale_hsa.c
│   ├── fileformat.c
│   ├── getopt/
│   │   ├── getopt.c
│   │   └── getopt.h
│   ├── http_server.c
│   ├── jsmn.c
│   ├── list.c
│   ├── logger.c
│   ├── mongoose.c
│   ├── mongoose_bool.patch
│   ├── mongoose_broadcast.patch
│   ├── mongoose_ipv6.patch
│   ├── mongoose_lenchk.patch
│   ├── mongoose_libressl.patch
│   ├── mongoose_msvcdbg.patch
│   ├── mongoose_pedantic.patch
│   ├── mongoose_sigpipe.patch
│   ├── mongoose_warn.patch
│   ├── optparse.c
│   ├── output_file.c
│   ├── output_influx.c
│   ├── output_log.c
│   ├── output_mqtt.c
│   ├── output_rtltcp.c
│   ├── output_trigger.c
│   ├── output_udp.c
│   ├── pulse_analyzer.c
│   ├── pulse_data.c
│   ├── pulse_detect.c
│   ├── pulse_detect_fsk.c
│   ├── pulse_slicer.c
│   ├── r_api.c
│   ├── r_util.c
│   ├── raw_output.c
│   ├── rfraw.c
│   ├── rtl_433.c
│   ├── samp_grab.c
│   ├── sdr.c
│   ├── term_ctl.c
│   └── write_sigrok.c
└── tests/
    ├── CMakeLists.txt
    ├── baseband-test.c
    ├── data-test.c
    ├── exitcode-for-output.sh
    ├── pulse-eval.c
    ├── style-check.c
    └── symbolizer.py

================================================
FILE CONTENTS
================================================

================================================
FILE: .ci/scripts/do_sysroot.sh
================================================
#!/bin/bash

set -e

libusb_ver=1.0.29
rtlsdr_ver=2.0.2
pothos_ver=2021.07.25-vc16

[ "$(uname)" = "Darwin" ] && export tools=/opt/local

# prefer GNU commands
realpath=$(command -v grealpath || :)
realpath="${realpath:-realpath}"
sed=$(command -v gsed || :)
sed="${sed:-sed}"

# from https://libusb.info/
if [ ! -e libusb/include/libusb.h ]
then
    [ -e libusb-${libusb_ver}.7z ] || curl -L -O https://github.com/libusb/libusb/releases/download/v${libusb_ver}/libusb-${libusb_ver}.7z
    mkdir -p libusb
    7z x -olibusb -y libusb-${libusb_ver}.7z
fi

# remove this script name and two dir levels to get the source root
source_dir=$(dirname $(dirname $(dirname $($realpath -s $0))))
sysroot32=$(pwd)/sysroot32
sysroot64=$(pwd)/sysroot64
sysroot32static=$(pwd)/sysroot32static
sysroot64static=$(pwd)/sysroot64static

mkdir -p sysroot{32,64}{,static}/usr/{include,lib,bin}

cp libusb/include/libusb.h $sysroot32/usr/include
cp libusb/include/libusb.h $sysroot64/usr/include
cp libusb/include/libusb.h $sysroot32static/usr/include
cp libusb/include/libusb.h $sysroot64static/usr/include

cp libusb/MinGW32/static/libusb-1.0.a $sysroot32static/usr/lib
cp libusb/MinGW64/static/libusb-1.0.a $sysroot64static/usr/lib

cp libusb/MinGW32/dll/libusb-1.0.dll $sysroot32/usr/bin
cp libusb/MinGW32/static/libusb-1.0.dll.a $sysroot32/usr/lib
cp libusb/MinGW64/dll/libusb-1.0.dll $sysroot64/usr/bin
cp libusb/MinGW64/static/libusb-1.0.dll.a $sysroot64/usr/lib

if [ ! -d rtl-sdr-${rtlsdr_ver} ]
then
    # or git clone https://github.com/osmocom/rtl-sdr.git
    [ -e rtl-sdr-${rtlsdr_ver}.tar.gz ] || curl -L -o rtl-sdr-${rtlsdr_ver}.tar.gz https://github.com/osmocom/rtl-sdr/archive/v${rtlsdr_ver}.tar.gz
    tar xzf rtl-sdr-${rtlsdr_ver}.tar.gz
fi

cd rtl-sdr-${rtlsdr_ver}

if [ ! -e $sysroot32/usr/lib/librtlsdr.a ]
then
    export CMAKE_SYSROOT=$sysroot32 ; echo $CMAKE_SYSROOT
    cmake -DCMAKE_TOOLCHAIN_FILE=$source_dir/cmake/Toolchain-gcc-mingw-w64-i686.cmake \
        -DLIBUSB_FOUND=1 \
        -DLIBUSB_LIBRARIES=$CMAKE_SYSROOT/usr/lib/libusb-1.0.dll.a \
        -DLIBUSB_INCLUDE_DIRS=$CMAKE_SYSROOT/usr/include \
        -B build-tmp && cmake --build build-tmp && cmake --install build-tmp
    rm -rf build-tmp
    mv $CMAKE_SYSROOT/usr/lib/librtlsdr_static.a $CMAKE_SYSROOT/usr/lib/librtlsdr.a
fi

if [ ! -e $sysroot32static/usr/lib/librtlsdr.a ]
then
    export CMAKE_SYSROOT=$sysroot32static ; echo $CMAKE_SYSROOT
    cmake -DCMAKE_TOOLCHAIN_FILE=$source_dir/cmake/Toolchain-gcc-mingw-w64-i686.cmake \
        -DLIBUSB_FOUND=1 \
        -DLIBUSB_LIBRARIES=$CMAKE_SYSROOT/usr/lib/libusb-1.0.a \
        -DLIBUSB_INCLUDE_DIRS=$CMAKE_SYSROOT/usr/include \
        -DBUILD_SHARED_LIBS:BOOL=OFF \
        -B build-tmp && cmake --build build-tmp && cmake --install build-tmp
    rm -rf build-tmp
    mv $CMAKE_SYSROOT/usr/lib/librtlsdr_static.a $CMAKE_SYSROOT/usr/lib/librtlsdr.a
    rm $CMAKE_SYSROOT/usr/lib/librtlsdr.dll.a
    rm $CMAKE_SYSROOT/usr/bin/librtlsdr.dll
fi

if [ ! -e $sysroot64/usr/lib/librtlsdr.a ]
then
    export CMAKE_SYSROOT=$sysroot64 ; echo $CMAKE_SYSROOT
    cmake -DCMAKE_TOOLCHAIN_FILE=$source_dir/cmake/Toolchain-gcc-mingw-w64-x86-64.cmake \
        -DLIBUSB_FOUND=1 \
        -DLIBUSB_LIBRARIES=$CMAKE_SYSROOT/usr/lib/libusb-1.0.dll.a \
        -DLIBUSB_INCLUDE_DIRS=$CMAKE_SYSROOT/usr/include \
        -B build-tmp && cmake --build build-tmp && cmake --install build-tmp
    rm -rf build-tmp
    mv $CMAKE_SYSROOT/usr/lib/librtlsdr_static.a $CMAKE_SYSROOT/usr/lib/librtlsdr.a
fi

if [ ! -e $sysroot64static/usr/lib/librtlsdr.a ]
then
    export CMAKE_SYSROOT=$sysroot64static ; echo $CMAKE_SYSROOT
    cmake -DCMAKE_TOOLCHAIN_FILE=$source_dir/cmake/Toolchain-gcc-mingw-w64-x86-64.cmake \
        -DLIBUSB_FOUND=1 \
        -DLIBUSB_LIBRARIES=$CMAKE_SYSROOT/usr/lib/libusb-1.0.a \
        -DLIBUSB_INCLUDE_DIRS=$CMAKE_SYSROOT/usr/include \
        -DBUILD_SHARED_LIBS:BOOL=OFF \
        -B build-tmp && cmake --build build-tmp && cmake --install build-tmp
    rm -rf build-tmp
    mv $CMAKE_SYSROOT/usr/lib/librtlsdr_static.a $CMAKE_SYSROOT/usr/lib/librtlsdr.a
    rm $CMAKE_SYSROOT/usr/lib/librtlsdr.dll.a
    rm $CMAKE_SYSROOT/usr/bin/librtlsdr.dll
fi

cd ..

if [ ! -e $sysroot64/usr/bin/SoapySDR.dll -o ! -e $sysroot64/usr/lib/SoapySDR.lib ]
then
    # from https://downloads.myriadrf.org/builds/PothosSDR/
    [ -e PothosSDR-${pothos_ver}-x64.exe ] || curl -L -O https://downloads.myriadrf.org/builds/PothosSDR/PothosSDR-${pothos_ver}-x64.exe
    mkdir -p pothos
    7z x -opothos -y PothosSDR-${pothos_ver}-x64.exe
    # workaround: 7-Zip 9.20 creates strange root directories
    [ -e pothos/bin ] || mv pothos/*/* pothos/ || :
    cp pothos/bin/SoapySDR.dll $sysroot64/usr/bin
    cp -R pothos/include/SoapySDR $sysroot64/usr/include
    cp pothos/lib/SoapySDR.lib $sysroot64/usr/lib
    cp -R pothos/cmake $sysroot64/usr
    $sed -i 's/.*INTERFACE_COMPILE_OPTIONS.*//g' $sysroot64/usr/cmake/SoapySDRExport.cmake
fi

# build rtl_433

export CMAKE_SYSROOT=$sysroot32 ; echo $CMAKE_SYSROOT
cmake -DCMAKE_TOOLCHAIN_FILE=$source_dir/cmake/Toolchain-gcc-mingw-w64-i686.cmake -S $source_dir -B build-tmp && cmake --build build-tmp && cmake --install build-tmp
rm -rf build-tmp
# Non-static 32-bit binary from w64 compiler is broken with
# missing libgcc_s_sjlj-1.dll, libwinpthread-1.dll
# neither CMAKE_EXE_LINKER_FLAGS="-static-libgcc"
# nor target_link_libraries(rtl_433 -static-libgcc)
# fix this. Ideas welcome.
mv $CMAKE_SYSROOT/usr/bin/rtl_433.exe $CMAKE_SYSROOT/usr/bin/rtl_433_32bit_nonstatic_broken.exe

export CMAKE_SYSROOT=$sysroot32static ; echo $CMAKE_SYSROOT
cmake -DCMAKE_TOOLCHAIN_FILE=$source_dir/cmake/Toolchain-gcc-mingw-w64-i686.cmake -S $source_dir -B build-tmp && cmake --build build-tmp && cmake --install build-tmp
rm -rf build-tmp
mv $CMAKE_SYSROOT/usr/bin/rtl_433.exe $CMAKE_SYSROOT/usr/bin/rtl_433_32bit_static.exe

export CMAKE_SYSROOT=$sysroot64 ; echo $CMAKE_SYSROOT
cmake -DENABLE_SOAPYSDR=ON -DCMAKE_TOOLCHAIN_FILE=$source_dir/cmake/Toolchain-gcc-mingw-w64-x86-64.cmake -S $source_dir -B build-tmp && cmake --build build-tmp && cmake --install build-tmp
rm -rf build-tmp

export CMAKE_SYSROOT=$sysroot64static ; echo $CMAKE_SYSROOT
cmake -DCMAKE_TOOLCHAIN_FILE=$source_dir/cmake/Toolchain-gcc-mingw-w64-x86-64.cmake -S $source_dir -B build-tmp && cmake --build build-tmp && cmake --install build-tmp
rm -rf build-tmp
mv $CMAKE_SYSROOT/usr/bin/rtl_433.exe $CMAKE_SYSROOT/usr/bin/rtl_433_64bit_static.exe

# collect package

cp $source_dir/.deploy/WINDOWS-MINGWW64.txt README.txt

echo Packing rtl_433-win-x32.zip
zip --junk-paths rtl_433-win-x32.zip sysroot32*/usr/bin/*.dll sysroot32*/usr/bin/rtl_433*.exe README.txt

echo Packing rtl_433-win-x64.zip
zip --junk-paths rtl_433-win-x64.zip sysroot64*/usr/bin/*.dll sysroot64*/usr/bin/rtl_433*.exe README.txt


================================================
FILE: .ci/scripts/do_tests.sh
================================================
#!/bin/bash

# This script is for internal CI use only

set -e
set -x

# prefer GNU commands
realpath=$(command -v grealpath || :)
realpath="${realpath:-realpath}"

# remove this script name and two dir levels to get the source root
source_dir=$(dirname $(dirname $(dirname $($realpath -s $0))))

cd "${source_dir}/.."
[ -e rtl_433_tests ] || git clone --depth 1 https://github.com/merbanan/rtl_433_tests.git
cd rtl_433_tests
export PATH="${source_dir}/build/src:$PATH"
test -f "${source_dir}/build/src/rtl_433"

# python3 -m venv .venv
# source .venv/bin/activate
# pip install deepdiff
make test


================================================
FILE: .clang-format
================================================
UseTab: Never
IndentWidth: 4
ContinuationIndentWidth: 8
BreakBeforeBraces: Stroustrup
AlignAfterOpenBracket: DontAlign
AlignEscapedNewlines: DontAlign
AlignConsecutiveAssignments: true
AlignConsecutiveMacros: AcrossEmptyLines
AllowShortIfStatementsOnASingleLine: false
AllowShortCaseLabelsOnASingleLine: true
IndentCaseLabels: false
ColumnLimit: 0
SortIncludes: false


================================================
FILE: .deploy/WINDOWS-MINGWW64.txt
================================================
# rtl_433 Windows MinGW-W64 build

The "static" builds are self-contained but do not include SoapySDR support.
The regular builds depend on LibUSB, RTL-SDR, and SoapySDR libraries.

There are no TLS builds (mqtts and influxs) currently.

For the SoapySDR builds you need PothosSDR installed https://downloads.myriadrf.org/builds/PothosSDR/
Any recent version should work, currently built with 2021.07.25-vc16:
https://downloads.myriadrf.org/builds/PothosSDR/PothosSDR-2021.07.25-vc16-x64.exe
When installing choose "Add PothosSDR to the system PATH for the current user"

Remove the SoapySDR.dll in this directory, it's for testing only and won't load any driver modules.
To run with SoapySDR you need to copy `rtl_433.exe` to `PothosSDR\bin` (usually `C:\Program Files\PothosSDR`).
Otherwise SoapySDR driver modules won't be found.

An alternative to installing SoapySDR from PothosSDR is to extract the installer
and copy the builds (.exe) from this release to the `bin` directory in PothosSDR.

## Quick start

To run rtl_433 you have to open Windows Command Prompt (cmd.exe) or Windows Terminal,
then type "cd (rtl_433 folder directory, not rtl_433.exe)"
Example: "cd C:\Users\(name)\Downloads\(rtl_433 folder)"
If typed correctly, the command prompt should change to your rtl_433 folder directory,
then type "rtl_433 (option(s))" and enter, rtl_433 will then start running with the options given.

Running the "-F http" option would look like this:
(directory)> rtl_433 -F http
Press enter and rtl_433 should successfully launch.
When it does, go to http://127.0.0.1:8433/


================================================
FILE: .deploy/WINDOWS-MSVC.txt
================================================
# rtl_433 Windows MSVC build

For the SoapySDR builds you need PothosSDR installed https://downloads.myriadrf.org/builds/PothosSDR/
Any recent version should work, currently built with 2021.07.25-vc16:
https://downloads.myriadrf.org/builds/PothosSDR/PothosSDR-2021.07.25-vc16-x64.exe
When installing choose "Add PothosSDR to the system PATH for the current user"

Remove the SoapySDR.dll in this directory, it's for testing only and won't load any driver modules.
To run with SoapySDR you need to copy `rtl_433-rtlsdr-soapysdr.exe` to `PothosSDR\bin` (usually `C:\Program Files\PothosSDR`).
Otherwise SoapySDR driver modules won't be found.

For the TLS builds (mqtts and influxs) you need OpenSSL installed.
E.g. install Chocolatey https://chocolatey.org/install
then run `choco install openssl.light`

An alternative to installing SoapySDR from PothosSDR is to extract the installer
and copy the builds (.exe) from this release to the `bin` directory in PothosSDR.

This release includes the Microsoft Visual C++ Redistributable for Visual Studio 2015, 2017 and 2019.
S.a. https://support.microsoft.com/en-us/topic/the-latest-supported-visual-c-downloads-2647da03-1eea-4433-9aff-95f26a218cc0

## Quick start

To run rtl_433 you have to open Windows Command Prompt (cmd.exe) or Windows Terminal,
then type "cd (rtl_433 folder directory, not rtl_433.exe)"
Example: "cd C:\Users\(name)\Downloads\(rtl_433 folder)"
If typed correctly, the command prompt should change to your rtl_433 folder directory,
then type "rtl_433 (option(s))" and enter, rtl_433 will then start running with the options given.

Running the "-F http" option would look like this:
(directory)> rtl_433 -F http
Press enter and rtl_433 should successfully launch.
When it does, go to http://127.0.0.1:8433/


================================================
FILE: .deploy/gen_nightly_info.sh
================================================
#!/bin/bash

git log $(git describe --tags --abbrev=0 HEAD^)..HEAD --oneline |egrep -v 'minor:|build:|docs:' |sed -e 's/[^ ]*/-/' >RELEASEINFO.md


================================================
FILE: .deploy/gen_release_info.py
================================================
#!/usr/bin/env python

with open('CHANGELOG.md') as r, open('RELEASEINFO.md', 'w') as w:
    # skip over possible 'Unreleased'
    for line in r:
        if line.startswith('## Release'):
            # w.write(line[1:])
            break
    for line in r:
        if line.startswith('## '):
            break
        # if line.startswith('#'):
        #     line = line[1:]
        w.write(line)


================================================
FILE: .github/actions/style-check/action.yml
================================================
name: 'Style Check'
description: 'Check for common code style warnings'
runs:
  using: 'node20'
  main: 'index.js'


================================================
FILE: .github/actions/style-check/index.js
================================================
#!/usr/bin/env node
/** @file
    Source code style checks.

    Copyright (C) 2020 by Christian Zuckschwerdt <zany@triq.net>

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
*/

const path = require('path')
const fs = require('fs')
const log = console.error
const MAX_LEN = 300 // this should likely be around 160
const replacement_character = '\uFFFD'

// console.log(process.cwd()) // /home/runner/work/rtl_433/rtl_433
// console.log(__dirname) // /home/runner/work/rtl_433/rtl_433/.github/actions/style-check

process.exitCode = [
  'include',
  'src',
  'src/devices',
].flatMap(glob_dir).concat([
  'CMakeLists.txt',
  'conf/CMakeLists.txt',
  'tests/CMakeLists.txt',
])
  .filter(discard_vendor)
  .reduce((e, f) => e + style_check(f), 0) > 0 ? 1 : 0

function discard_vendor(filename) {
  return filename.indexOf('/jsmn.') < 0 && filename.indexOf('/mongoose.') < 0
}

function glob_dir(dir) {
  return fs.readdirSync(dir)
    .filter(filename =>
      filename.endsWith('.h') ||
      filename.endsWith('.c') ||
      filename.endsWith('.txt')
    )
    .map(filename =>
      path.join(dir, filename)
    )
}

function style_check(filename) {
  const strict = filename.indexOf('/devices/') >= 0
  const txt = filename.endsWith('.txt')

  let errors = 0

  let leading_tabs = 0
  let leading_spcs = 0
  let mixed_ws = 0
  let need_cond = 0
  let in_comment = false

  let line_number = 0

  fs.readFileSync(filename, 'utf8')
    .split('\n')
    .map(line => {
      line_number++
      const len = line.length
      if (len < 0) {
        log(`::error file=${filename},line=${line_number}::READ error`)
        errors++
      }
      if (len >= MAX_LEN - 1) {
        log(`::error file=${filename},line=${line_number},col=${MAX_LEN}::LONG line error`)
        errors++
      }
      if (line[len - 1] == '\r' || (len > 1 && line[len - 2] == '\r')) {
        log(`::error file=${filename},line=${line_number},col=${len - 1}::CRLF error`)
        errors++
      }
      if (line.indexOf('/*')) {
        in_comment = true
      }

      if (line[0] == '\t') {
        log(`::error file=${filename},line=${line_number},col=0::TAB indented line`)
        leading_tabs++
      }
      if (len >= 4 && line[0] == ' ' && line[1] == ' ' && line[2] == ' ' && line[3] == ' ') {
        leading_spcs++
      }
      if (line[len - 1] == ' ' || line[len - 1] == '\t') {
        log(`::error file=${filename},line=${line_number},col=${len - 1}::TRAILING whitespace error`)
        errors++
      }

      const invchr = line.indexOf(replacement_character)
      if (invchr >= 0) {
        log(`::error file=${filename},line=${line_number},col=${invchr + 1}::INVALID-UTF8 character error`)
        errors++
      }
      const nonasc = line.search(/[^ -~]/)
      if (!in_comment && nonasc >= 0) {
        log(`::error file=${filename},line=${line_number},col=${nonasc + 1}::NON-ASCII character error`)
        errors++
      }
      else if (nonasc >= 0) {
        //log(`::warning file=${filename},line=${line_number},col=${nonasc + 1}::NON-ASCII character`)
      }
      if (line.indexOf('(r_device *decoder') >= 0 && line[len - 1] == '{') {
        log(`::error file=${filename},line=${line_number},col=${len - 1}::BRACE function on newline error`)
        errors++
      }

      if (line.indexOf('){') >= 0 && line.indexOf('}') < 0) {
        log(`::error file=${filename},line=${line_number},col=${len - 1}::STICKY-BRACE error`)
        errors++
      }
      if (!txt && (line.indexOf('if(') >= 0 || line.indexOf('for(') >= 0 || line.indexOf('while(') >= 0)) {
        log(`::error file=${filename},line=${line_number},col=${len - 1}::STICKY-PAREN error`)
        errors++
      }

      if (strict && line.indexOf('stdout') >= 0) {
        log(`::error file=${filename},line=${line_number},col=${len - 1}::STDOUT line`)
        errors++
      }
      const p = line.indexOf('printf')
      if (strict && p >= 0) {
        if (p == 0 || line[p - 1] < '_' || line[p - 1] > 'z') {
          log(`::error file=${filename},line=${line_number},col=${len - 1}::PRINTF line`)
          errors++
        }
      }
      if (need_cond && line.indexOf('if (!') < 0) {
        // we had an alloc but no check on the following line
        log(`::error file=${filename},line=${line_number},col=${len - 1}::ALLOC check error`)
        errors++
      }
      need_cond = 0
      if (line.indexOf('alloc(') >= 0 && line.indexOf('alloc()') < 0) {
        need_cond++
      }
      if (line.indexOf('strdup(') >= 0 && line.indexOf('strdup()') < 0) {
        need_cond++
      }

      if (line.indexOf('*/')) {
        in_comment = false
      }
    })

  if (leading_tabs && leading_spcs) {
    mixed_ws = leading_tabs > leading_spcs ? leading_spcs : leading_tabs
    log(`::error file=${filename}::${mixed_ws} MIXED tab/spaces errors.`)
  }

  return errors + mixed_ws + leading_tabs
}


================================================
FILE: .github/workflows/check.yml
================================================
name: Build Analyze Check
on: [push, pull_request]
jobs:
  macos_check_job:
    strategy:
      fail-fast: false
      matrix:
        os: [macos-14, macos-15]
    runs-on: ${{ matrix.os }}
    name: Build on ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v4
      - name: Setup
        run: brew install soapysdr librtlsdr
      - name: Configure
        run: cmake -B build
      - name: Build
        run: cmake --build build

  build_check_job:
    runs-on: ubuntu-latest
    name: Build with CMake
    steps:
      - uses: actions/checkout@v4
      - name: Setup
        run: |
          sudo apt-get update -q -y
          sudo apt-get install -q -y --no-install-recommends cmake ninja-build
          sudo apt-get install -q -y libsoapysdr-dev librtlsdr-dev
      - name: Configure CMake+Ninja
        run: cmake -GNinja -B ${{ runner.workspace }}/b/ninja -DENABLE_RTLSDR=OFF -DENABLE_SOAPYSDR=OFF
      - name: Build CMake+Ninja
        run: cmake --build ${{ runner.workspace }}/b/ninja
      - name: Configure CMake+UnixMakefiles
        run: cmake -G"Unix Makefiles" -B ${{ runner.workspace }}/b/unixmakefiles -DENABLE_RTLSDR=OFF -DENABLE_SOAPYSDR=OFF
      - name: Build CMake+UnixMakefiles
        run: cmake --build ${{ runner.workspace }}/b/unixmakefiles

  doc_check_job:
    runs-on: ubuntu-latest
    name: Build documentation
    steps:
      - uses: actions/checkout@v4
      - name: Install Doxygen
        run: |
          sudo apt-get update -q -y
          sudo apt-get install -q -y --no-install-recommends cmake ninja-build
          sudo apt-get install -q -y doxygen
      - name: Configure CMake+Ninja
        run: cmake -GNinja -B ${{ runner.workspace }}/b/ninja -DBUILD_DOCUMENTATION=ON -DENABLE_RTLSDR=OFF -DENABLE_SOAPYSDR=OFF
      - name: Build CMake+Ninja
        run: cmake --build ${{ runner.workspace }}/b/ninja -- doc_doxygen

  style_check_job:
    runs-on: ubuntu-latest
    name: Check code style
    steps:
      - uses: actions/checkout@v4
      - name: Style Check
        uses: ./.github/actions/style-check

  maintainer_update_check_job:
    runs-on: ubuntu-latest
    name: Needs maintainer_update
    steps:
      - uses: actions/checkout@v4
      - name: Working directory clean excluding untracked files
        run: |
          ./maintainer_update.py
          [ -z "$(git status --untracked-files=no --porcelain)" ]

  symbolizer_check_job:
    runs-on: ubuntu-latest
    name: Check symbol errors
    steps:
      - uses: actions/checkout@v4
      - name: Symbolizer report
        run: |
          ./tests/symbolizer.py check

  analyzer_check_job:
    # https://github.com/actions/virtual-environments
    # - Ubuntu 24.04 ubuntu-24.04
    # - Ubuntu 22.04 ubuntu-22.04
    # - Ubuntu 20.04 ubuntu-20.04
    # https://apt.llvm.org/
    # - Noble (24.04)
    # - Jammy (22.04)
    # - Focal (20.04)
    # - Bionic (18.04)
    runs-on: ubuntu-24.04
    name: Analyze with Clang
    steps:
      - uses: actions/checkout@v4
      - name: Install Clang
        run: |
          wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key 2>/dev/null | sudo apt-key add -
          sudo add-apt-repository 'deb http://apt.llvm.org/noble/ llvm-toolchain-noble-20 main' -y
          sudo apt-get update -q
          sudo apt-get install -q -y clang-20 lld-20 libc++-20-dev libc++abi-20-dev clang-tools-20
      - name: Clang Analyzer
        # excludes include/mongoose.h src/mongoose.c include/jsmn.h src/jsmn.c
        # exit code 1 if there is output
        run: |
          clang -Iinclude -DTHREADS --analyze -Xanalyzer -analyzer-output=text -Xanalyzer -analyzer-disable-checker=deadcode.DeadStores include/[a-ikln-z]*.h src/[a-ikln-z]*.c src/devices/*.c 2>&1 | tee analyzer.out
          [ ! -s analyzer.out ]


================================================
FILE: .github/workflows/release.yml
================================================
name: Release
on:
  workflow_dispatch:
  push:
    tags:
    - '*'

env:
  # from https://downloads.myriadrf.org/builds/PothosSDR/
  pothos-ver: 2021.07.25-vc16
  pothos-exe: PothosSDR-2021.07.25-vc16-x64.exe

jobs:
  downloads_job:
    name: Downloads
    #runs-on: ubuntu-latest
    runs-on: windows-latest
    steps:
    - uses: actions/cache@v4
      id: downloads
      with:
        path: ${{ runner.workspace }}/${{ env.pothos-exe }}
        key: download-${{ env.pothos-ver }}
    - name: Run Downloads
      if: steps.downloads.outputs.cache-hit != 'true'
      shell: bash
      working-directory: ${{ runner.workspace }}
      run: curl -L -O https://downloads.myriadrf.org/builds/PothosSDR/${{ env.pothos-exe }}

  release_job:
    name: Create release
    runs-on: ubuntu-latest
    outputs:
      upload_url: ${{ steps.create_release.outputs.upload_url }}
      release_version: ${{ env.RELEASE_VERSION }}
    steps:
    - uses: actions/checkout@v4
      with:
        fetch-depth: 0
    - name: Create Release info
      # e.g. refs/tags/23.01
      if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/2')
      run: |
        echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
        echo "RELEASE_NAME=Release ${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
        echo "PRERELEASE=false" >> $GITHUB_ENV
        ./.deploy/gen_release_info.py
    - name: Create Pre-Release info
      # e.g. refs/tags/nightly or refs/heads/master
      if: github.event_name != 'push' || !startsWith(github.ref, 'refs/tags/2')
      run: |
        echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
        echo "RELEASE_NAME=Pre-Release ${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
        echo "PRERELEASE=true" >> $GITHUB_ENV
        ./.deploy/gen_nightly_info.sh
    - uses: softprops/action-gh-release@v2
      id: create_release
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:
        tag_name: ${{ env.RELEASE_VERSION }}
        name: ${{ env.RELEASE_NAME }}
        body_path: RELEASEINFO.md
        #draft: true
        prerelease: ${{ env.PRERELEASE }}

  macos_build_job:
    needs: release_job
    strategy:
      fail-fast: false
      matrix:
        os: [macos-14]
        feat: [rtlsdr, soapysdr]
        include:
          #- os: macos-13
          #  arch: x86_64
          - os: macos-14
            arch: arm64
    runs-on: ${{ matrix.os }}
    name: Build with ${{ matrix.feat }} for ${{ matrix.arch }} on ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v4
      - name: Setup tools
        run: brew install librtlsdr openssl@3
      - name: Setup SoapySDR deps
        if: matrix.feat == 'soapysdr'
        run: brew install soapysdr
      - name: Configure
        run: cmake -B build
      - name: Build
        run: cmake --build build
      - name: Adjust binary to run with MacPorts or Homebrew
        # Homebrew has x86 in /usr/local and arm64 in /opt/homebrew
        run: >
          install_name_tool
          -change /opt/homebrew/opt/openssl@3/lib/libssl.3.dylib @rpath/libssl.3.dylib
          -change /opt/homebrew/opt/openssl@3/lib/libcrypto.3.dylib @rpath/libcrypto.3.dylib
          -change /opt/homebrew/opt/libusb/lib/libusb-1.0.0.dylib @rpath/libusb-1.0.0.dylib
          -change /opt/homebrew/opt/librtlsdr/lib/librtlsdr.2.dylib @rpath/librtlsdr.2.dylib
          -change /opt/homebrew/opt/soapysdr/lib/libSoapySDR.0.8.dylib @rpath/libSoapySDR.0.8.dylib
          -change /usr/local/opt/openssl@3/lib/libssl.3.dylib @rpath/libssl.3.dylib
          -change /usr/local/opt/openssl@3/lib/libcrypto.3.dylib @rpath/libcrypto.3.dylib
          -change /usr/local/opt/libusb/lib/libusb-1.0.0.dylib @rpath/libusb-1.0.0.dylib
          -change /usr/local/opt/librtlsdr/lib/librtlsdr.2.dylib @rpath/librtlsdr.2.dylib
          -change /usr/local/opt/soapysdr/lib/libSoapySDR.0.8.dylib @rpath/libSoapySDR.0.8.dylib
          -add_rpath /opt/homebrew/opt/openssl@3/lib
          -add_rpath /opt/homebrew/opt/libusb/lib
          -add_rpath /opt/homebrew/opt/librtlsdr/lib
          -add_rpath /opt/homebrew/opt/soapysdr/lib
          -add_rpath /usr/local/opt/openssl@3/lib
          -add_rpath /usr/local/opt/libusb/lib
          -add_rpath /usr/local/opt/librtlsdr/lib
          -add_rpath /usr/local/opt/soapysdr/lib
          -add_rpath /opt/local/libexec/openssl3/lib
          -add_rpath /opt/local/lib
          build/src/rtl_433
      - name: Check final binary
        run: otool -L build/src/rtl_433
      - name: "Upload Release Asset"
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          ZIP_FILE: rtl_433-${{ matrix.feat }}-MacOS-${{ matrix.arch }}-${{ needs.release_job.outputs.release_version }}.zip
        run: |
          zip --junk-paths $ZIP_FILE build/src/rtl_433
          gh release upload ${{ needs.release_job.outputs.release_version }} $ZIP_FILE

  native_build_job:
    needs: release_job
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-24.04]
        feat: [rtlsdr, soapysdr]
        arch: [amd64]
    runs-on: ${{ matrix.os }}
    name: Build with ${{ matrix.feat }} for ${{ matrix.arch }} on ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v4
      - name: Setup tools
        run: |
          sudo apt-get update -q -y
          sudo apt-get install -y --no-install-recommends cmake ninja-build
      - name: Setup deps
        run: |
          sudo apt-get install -q -y librtlsdr-dev libssl-dev
      - name: Setup SoapySDR deps
        if: matrix.feat == 'soapysdr'
        run: |
          sudo apt-get install -q -y libsoapysdr-dev
      - name: Configure
        run: cmake -GNinja -B build
      - name: Build
        run: cmake --build build
      - name: Check final binary
        run: ldd build/src/rtl_433
      - name: "Upload Release Asset"
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          ZIP_FILE: rtl_433-${{ matrix.feat }}-Linux-${{ matrix.arch }}-${{ needs.release_job.outputs.release_version }}.zip
        run: |
          zip --junk-paths $ZIP_FILE build/src/rtl_433
          gh release upload ${{ needs.release_job.outputs.release_version }} $ZIP_FILE

  cross_build_job:
    needs: release_job
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-22.04]
        arch: [armhf, arm64]
        feat: [rtlsdr, soapysdr]
        include:
          #- arch: armel
          #  compiler: arm-linux-gnueabi
          - arch: armhf
            compiler: arm-linux-gnueabihf
          - arch: arm64
            compiler: aarch64-linux-gnu
    runs-on: ${{ matrix.os }}
    name: Build with ${{ matrix.feat }} for ${{ matrix.arch }} on ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v4
      - name: Setup tools
        run: |
          sudo apt-get update -q -y
          sudo apt-get install -y --no-install-recommends cmake ninja-build
      - name: Purge conflicting dev that confuse cross linking
        run: |
          sudo apt-get purge -y libssl-dev libusb-1.0-0-dev
      - name: Setup compiler
        run: |
          sudo apt-get install -q -y gcc-${{ matrix.compiler }}
      - name: Restrict sources.list
        run: |
          sudo sed -i'' -E 's/^(deb|deb-src) mirror\+file/\1 [arch=amd64,i386] mirror\+file/' /etc/apt/sources.list
      - uses: ryankurte/action-apt@v0.4.0
        if: matrix.feat != 'soapysdr'
        with:
          arch: ${{ matrix.arch }}
          packages: "librtlsdr-dev:${{ matrix.arch }} libssl-dev:${{ matrix.arch }}"
      - uses: ryankurte/action-apt@v0.4.0
        if: matrix.feat == 'soapysdr'
        with:
          arch: ${{ matrix.arch }}
          packages: "librtlsdr-dev:${{ matrix.arch }} libssl-dev:${{ matrix.arch }} libsoapysdr-dev:${{ matrix.arch }}"
      - name: Configure
        run: cmake -DCMAKE_TOOLCHAIN_FILE="$(pwd)/cmake/Toolchain-${{ matrix.compiler }}.cmake" -GNinja -B build
      - name: Build
        run: cmake --build build
      - name: Check final binary
        run: ${{ matrix.compiler }}-readelf -a build/src/rtl_433 | grep "Shared library:"
      - name: "Upload Release Asset"
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          ZIP_FILE: rtl_433-${{ matrix.feat }}-Linux-${{ matrix.arch }}-${{ needs.release_job.outputs.release_version }}.zip
        run: |
          zip --junk-paths $ZIP_FILE build/src/rtl_433
          gh release upload ${{ needs.release_job.outputs.release_version }} $ZIP_FILE

  container_build_job:
    needs: release_job
    strategy:
      fail-fast: false
      matrix:
        arch: [armel]
        feat: [rtlsdr, soapysdr]
        include:
          - arch: armel
            compiler: arm-linux-gnueabi
          #- arch: armhf
          #  compiler: arm-linux-gnueabihf
          #- arch: arm64
          #  compiler: aarch64-linux-gnu
    runs-on: ubuntu-latest
    name: Build with ${{ matrix.feat }} for ${{ matrix.arch }}
    container:
      image: debian:trixie-slim
      env:
        GH_VERSION: 2.83.2
    steps:
      - name: Setup base tools
        run: |
          apt-get update -q -y
          apt-get install -q -y --no-install-recommends git ca-certificates curl file zip
      - uses: actions/checkout@v4
      - name: Fix Ownership issue
        run: git config --global --add safe.directory $GITHUB_WORKSPACE
      - name: Add Architecture
        run: |
          dpkg --add-architecture ${{ matrix.arch }}
          apt-get update -q -y
      - name: Setup build tools
        run: apt-get install -q -y --no-install-recommends cmake ninja-build
      - name: Setup GH cli
        run: |
          curl -L -O https://github.com/cli/cli/releases/download/v${GH_VERSION}/gh_${GH_VERSION}_linux_amd64.deb
          dpkg -i gh_${GH_VERSION}_linux_amd64.deb
      - name: Setup compiler
        run: apt-get install -q -y gcc-${{ matrix.compiler }}
      - name: Purge conflicting dev that confuse cross linking
        run: apt-get purge -y libssl-dev libusb-1.0-0-dev
      - name: Install deps
        if: matrix.feat != 'soapysdr'
        run: apt-get install -q -y librtlsdr-dev:${{ matrix.arch }} libssl-dev:${{ matrix.arch }}
      - name: Install deps
        if: matrix.feat == 'soapysdr'
        run: apt-get install -q -y librtlsdr-dev:${{ matrix.arch }} libssl-dev:${{ matrix.arch }} libsoapysdr-dev:${{ matrix.arch }}
      - name: Configure
        run: cmake -DCMAKE_TOOLCHAIN_FILE="$(pwd)/cmake/Toolchain-${{ matrix.compiler }}.cmake" -GNinja -B build
      - name: Build
        run: cmake --build build
      - name: Check final binary
        run: file build/src/rtl_433
      - name: Check final binary
        run: ${{ matrix.compiler }}-readelf -a build/src/rtl_433 | grep "Shared library:"
      - name: "Upload Release Asset"
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          ZIP_FILE: rtl_433-${{ matrix.feat }}-Linux-${{ matrix.arch }}-${{ needs.release_job.outputs.release_version }}.zip
        run: |
          zip --junk-paths $ZIP_FILE build/src/rtl_433
          gh release upload ${{ needs.release_job.outputs.release_version }} $ZIP_FILE

  build_mingw_job:
    needs: release_job
    if: ${{ needs.release_job.result != 'failure' }}
    strategy:
      fail-fast: false
      matrix:
        arch: [i686, x86-64]
    runs-on: ubuntu-latest
    name: Build with Mingw-w64 on ${{ matrix.arch }}
    steps:
    - uses: actions/checkout@v4
    - name: "Install Mingw-w64"
      run: |
        sudo apt-get update -q -y
        sudo apt-get install -q -y gcc-mingw-w64-base binutils-mingw-w64-${{ matrix.arch }} gcc-mingw-w64-${{ matrix.arch }} mingw-w64-${{ matrix.arch }}-dev gcc-mingw-w64 gcc-multilib p7zip-full
    - name: "Configure with Mingw-w64"
      run: cmake -DCMAKE_TOOLCHAIN_FILE=cmake/Toolchain-gcc-mingw-w64-${{ matrix.arch }}.cmake -DENABLE_RTLSDR=OFF -B build
    - name: "Build with Mingw-w64"
      run: cmake --build build
    - name: "Sysroot Build with Mingw-w64"
      run: ./.ci/scripts/do_sysroot.sh
    - name: "Upload Release Asset"
      if: matrix.arch == 'x86-64'
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        ZIP_FILE: rtl_433-win-x64-${{ needs.release_job.outputs.release_version }}.zip
      run: |
        mv rtl_433-win-x64.zip $ZIP_FILE
        gh release upload ${{ needs.release_job.outputs.release_version }} $ZIP_FILE
    - name: "Upload Release Asset"
      if: matrix.arch == 'x86-64'
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        ZIP_FILE: rtl_433-win-x32-${{ needs.release_job.outputs.release_version }}.zip
      run: |
        mv rtl_433-win-x32.zip $ZIP_FILE
        gh release upload ${{ needs.release_job.outputs.release_version }} $ZIP_FILE

  build_msvc_job:
    needs: [downloads_job, release_job]
    if: ${{ needs.downloads_job.result != 'failure' && needs.release_job.result != 'failure'  }}
    strategy:
      fail-fast: false
      matrix:
        os: [windows-2022, windows-2025]
        platform: [x64, Win32]
        # from https://downloads.myriadrf.org/builds/PothosSDR/
        #pothos-ver: [2021.07.25-vc16]
        include:
          - os: windows-2022
            generator: Visual Studio 17 2022
          - os: windows-2025
            generator: Visual Studio 17 2022
    runs-on: ${{ matrix.os }}
    name: ${{ matrix.generator }} ${{ matrix.platform }} CMake (MSBuild) on ${{ matrix.os }}
    steps:
    - run: choco install openssl --yes --no-progress
      if: matrix.platform == 'x64'
    - uses: actions/checkout@v4
    - uses: actions/cache@v4
      id: downloads
      if: matrix.platform == 'x64'
      with:
        path: ${{ runner.workspace }}/${{ env.pothos-exe }}
        key: download-${{ env.pothos-ver }}
    - name: Run Downloads
      if: matrix.platform == 'x64' && steps.downloads.outputs.cache-hit != 'true'
      shell: bash
      working-directory: ${{ runner.workspace }}
      run: curl -L -O https://downloads.myriadrf.org/builds/PothosSDR/${{ env.pothos-exe }}
    - name: Install Deps
      if: matrix.platform == 'x64'
      shell: bash
      working-directory: ${{ runner.workspace }}
      run: |
        mkdir -p pothos
        7z x -opothos -y ${{ env.pothos-exe }}
        echo "POTHOS_PATH=$(pwd)/pothos" >> $GITHUB_ENV
    - name: Get latest CMake and Ninja
      uses: lukka/get-cmake@latest
    # Note: this assumes ${{ runner.workspace }} == ${{ github.workspace }}/..
    - name: CMake+None
      uses: lukka/run-cmake@v10
      with:
        configurePreset: dummy
        configurePresetCmdString: "[`-B`, `../b/rtl_433`, `-G${{ matrix.generator }}`, `-A${{ matrix.platform }}`, `-DENABLE_RTLSDR=OFF`, `-DENABLE_SOAPYSDR=OFF`, `-DENABLE_OPENSSL=OFF`]"
        buildPreset: dummy
        buildPresetCmdString: "[`--build`, `../b/rtl_433`, `--config`, `Release`]"
    - name: CMake+RTLSDR+SOAPYSDR+TLS
      uses: lukka/run-cmake@v10
      env:
        CMAKE_PREFIX_PATH: ${{ runner.workspace }}\pothos
      if: matrix.platform == 'x64'
      with:
        configurePreset: dummy
        configurePresetCmdString: "[`-B`, `../b/rtl_433-rtlsdr-soapysdr-tls`, `-G${{ matrix.generator }}`, `-A${{ matrix.platform }}`, `-DCMAKE_PREFIX_PATH=${{ env.POTHOS_PATH }}`, `-DENABLE_RTLSDR=ON`, `-DENABLE_SOAPYSDR=ON`, `-DENABLE_OPENSSL=ON`]"
        buildPreset: dummy
        buildPresetCmdString: "[`--build`, `../b/rtl_433-rtlsdr-soapysdr-tls`, `--config`, `Release`]"
    - name: CMake+RTLSDR+SOAPYSDR
      uses: lukka/run-cmake@v10
      env:
        CMAKE_PREFIX_PATH: ${{ runner.workspace }}\pothos
      if: matrix.platform == 'x64'
      with:
        configurePreset: dummy
        configurePresetCmdString: "[`-B`, `../b/rtl_433-rtlsdr-soapysdr`, `-G${{ matrix.generator }}`, `-A${{ matrix.platform }}`, `-DCMAKE_PREFIX_PATH=${{ env.POTHOS_PATH }}`, `-DENABLE_RTLSDR=ON`, `-DENABLE_SOAPYSDR=ON`, `-DENABLE_OPENSSL=OFF`]"
        buildPreset: dummy
        buildPresetCmdString: "[`--build`, `../b/rtl_433-rtlsdr-soapysdr`, `--config`, `Release`]"
    - name: CMake+RTLSDR+TLS
      uses: lukka/run-cmake@v10
      env:
        CMAKE_PREFIX_PATH: ${{ runner.workspace }}\pothos
      if: matrix.platform == 'x64'
      with:
        configurePreset: dummy
        configurePresetCmdString: "[`-B`, `../b/rtl_433-rtlsdr-tls`, `-G${{ matrix.generator }}`, `-A${{ matrix.platform }}`, `-DCMAKE_PREFIX_PATH=${{ env.POTHOS_PATH }}`, `-DENABLE_RTLSDR=ON`, `-DENABLE_SOAPYSDR=OFF`, `-DENABLE_OPENSSL=ON`]"
        buildPreset: dummy
        buildPresetCmdString: "[`--build`, `../b/rtl_433-rtlsdr-tls`, `--config`, `Release`]"
    - name: CMake+RTLSDR
      uses: lukka/run-cmake@v10
      env:
        CMAKE_PREFIX_PATH: ${{ runner.workspace }}\pothos
      if: matrix.platform == 'x64'
      with:
        configurePreset: dummy
        configurePresetCmdString: "[`-B`, `../b/rtl_433-rtlsdr`, `-G${{ matrix.generator }}`, `-A${{ matrix.platform }}`, `-DCMAKE_PREFIX_PATH=${{ env.POTHOS_PATH }}`, `-DENABLE_RTLSDR=ON`, `-DENABLE_SOAPYSDR=OFF`, `-DENABLE_OPENSSL=OFF`]"
        buildPreset: dummy
        buildPresetCmdString: "[`--build`, `../b/rtl_433-rtlsdr`, `--config`, `Release`]"
    - name: Package dist
      if: matrix.platform == 'x64'
      shell: bash
      working-directory: ${{ runner.workspace }}
      run: |
        mkdir -p dist
        cp pothos/bin/{SoapySDR.dll,libusb-1.0.dll,rtlsdr.dll,vcruntime140.dll,vcruntime140_1.dll,pthreadVC2.dll} dist
        cp b/rtl_433-rtlsdr-soapysdr-tls/src/Release/rtl_433.exe dist/rtl_433-rtlsdr-soapysdr-tls.exe
        cp b/rtl_433-rtlsdr-soapysdr/src/Release/rtl_433.exe     dist/rtl_433-rtlsdr-soapysdr.exe
        cp b/rtl_433-rtlsdr-tls/src/Release/rtl_433.exe          dist/rtl_433-rtlsdr-tls.exe
        cp b/rtl_433-rtlsdr/src/Release/rtl_433.exe              dist/rtl_433-rtlsdr.exe
        cp b/rtl_433/src/Release/rtl_433.exe                     dist/rtl_433.exe
        cp rtl_433/.deploy/WINDOWS-MSVC.txt                      dist/README.txt
        ls -al dist
        7z a rtl_433-win-msvc-x64.zip ./dist/*
    - name: "Upload Release Asset"
      if: matrix.os == 'windows-2022' && matrix.platform == 'x64'
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        GH_TOKEN: ${{ github.token }}
        GH_REPO: ${{ github.repository }}
        ZIP_FILE: rtl_433-win-msvc-x64-${{ needs.release_job.outputs.release_version }}.zip
      shell: bash
      working-directory: ${{ runner.workspace }}
      run: |
        mv rtl_433-win-msvc-x64.zip $ZIP_FILE
        gh release upload ${{ needs.release_job.outputs.release_version }} $ZIP_FILE

  build_arch_job:
    if: ${{ false }}  # disable for now
    needs: release_job
    # The host should always be Linux
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      # jessie, ubuntu16.04 has no SoapySDR
      # jessie has trouble linking libusb-1.0
      # stretch has SoapySDR 0.5 which we don't support
      # buster has broken librtlsdr pkg-config
      # fedora_latest packages need to be verified
      # alpine_latest packages need to be verified
      matrix:
        # arch: [armv6, armv7, aarch64, s390x, ppc64le]
        arch: [armv7, aarch64, ppc64le]
        # distro: [jessie, stretch, buster, ubuntu16.04, ubuntu18.04, ubuntu20.04, fedora_latest, alpine_latest]
        distro: [stretch, buster, ubuntu16.04, ubuntu18.04, ubuntu20.04, fedora_latest]
        include:
          - arch: armv6
            distro: stretch
          - arch: armv6
            distro: buster
    name: Build on ${{ matrix.distro }} ${{ matrix.arch }}
    steps:
      - uses: actions/checkout@v4
      - uses: uraimo/run-on-arch-action@v2.0.8
        id: runcmd
        with:
          arch: ${{ matrix.arch }}
          distro: ${{ matrix.distro }}

          # Not required, speed up builds by storing container images in
          # GitHub package registry.
          #githubToken: ${{ github.token }}

          # Install dependencies in the cached container.
          install: |
            case "${{ matrix.distro }}" in
              jessie|stretch|ubuntu16.04)
                apt-get update -q -y
                apt-get install -q -y lsb-release build-essential libtool pkg-config cmake librtlsdr-dev libssl-dev
                ;;
              buster|ubuntu*)
                apt-get update -q -y
                apt-get install -q -y lsb-release build-essential libtool pkg-config cmake librtlsdr-dev libsoapysdr-dev libssl-dev
                ;;
              fedora*)
                dnf -y update
                dnf -y install redhat-lsb make gcc libtool pkg-config cmake rtl-sdr-devel SoapySDR-devel openssl-devel
                ;;
              alpine*)
                apk update
                apk add lsb-release build-essential libtool pkg-config cmake librtlsdr-dev libsoapysdr-dev libssl-dev
                ;;
            esac

          run: |
            uname -a
            lsb_release -sc || echo NO lsb_release
            echo Release ${{ needs.release_job.outputs.release_version }}
            cmake -DCMAKE_INSTALL_PREFIX:PATH=../dist -B build
            cmake --build build
            cmake --build build --target install

      - name: Install FPM
        run: |
          sudo apt-get update -q -y
          sudo apt-get install -q -y ruby ruby-dev rubygems
          sudo gem install --no-document fpm

      - name: Package with FPM
        run: |
          ls -al "${PWD}/dist"
          case "${{ matrix.distro }}" in
            stretch)
              libsoapy=libsoapysdr0.5-2 ;;
            buster)
              libsoapy=libsoapysdr0.6 ;;
            fedora*)
              libsoapy=SoapySDR ;;
            *)
              libsoapy=libsoapysdr0.7 ;;
          esac
          fpm -s dir -t deb -n rtl433 -v ${{ needs.release_job.outputs.release_version }}-1${{ matrix.distro }} -C "${PWD}/dist" \
            -d libusb-1.0-0 -d libssl1.1 -d librtlsdr0 -d $libsoapy \
            --deb-suggests soapysdr-module-all \
            --deb-suggests soapysdr-tools \
            --architecture ${{ matrix.arch }} \
            --maintainer zany@triq.net \
            --description "Program to decode radio transmissions" \
            --url https://triq.org/
          ls -al
          ls -al "${PWD}/dist"
      - name: "Upload Release Asset"
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          gh release upload ${{ needs.release_job.outputs.release_version }} rtl433_${{ needs.release_job.outputs.release_version }}-1${{ matrix.distro }}_${{ matrix.arch }}.deb


================================================
FILE: .gitignore
================================================
# CMake out-of-tree builds
build*/

# IDE files
.cproject
.settings
.project
.cache
.vs
.idea
cmake-build-debug/

# Editor files
*.orig
*.bak
*~
*.tlog
*.ipdb
*.iobj
*.idb
*.lastbuildstate
*.db
*.opendb

# Development files
/_*/
/rtl_433_tests

# File manager files
.DS_Store
.history


================================================
FILE: AUTHORS
================================================
Benjamin Larsson <banan@ludd.ltu.se>
Christian W. Zuckschwerdt <zany@triq.net>

Sven Killig <sven@killig.de>
rct <rct+github@r-t.org>
johan <johan@E6410>
Thomas Kerpe <toke@toke.de>
Jens Jensen <zerog2k@yahoo.com>
Sven <sonic@sonic-VGN-Z41WD-B.(none)>
Martin Hauke <mardnh@gmx.de>
magellannh <pi@raspberrypi.(none)>
jules69350 <julien.sangouard@gmail.com>
arantius <arantius@gmail.com>
andreaaizza <andrea@andreaaizza.com>
Trueffelwurm <jens@trueffelwurm.de>
Tomasz Brzezina <tombrz@Bonawentura.brzezina.pl>
Paul F-Y <pbfy00@gmail.com>
Corné van Strien <github@atilas.nl>
Baruch Even <baruch@ev-en.org>
Andrea <andrea@andreaaizza.com>
Helge Weissig <helgew@grajagan.org>
Robert Fraczkiewicz <aromring@gmail.com>
Nicola Quiriti <nik@wifi4all.it>
Petr Konecny <pekon@google.com>
Tom Felker <tomfelker@gmail.com>
Pasquale 'sid' Fiorillo <me@pasqualefiorillo.it>
Tommy Vestermark <tovsurf@vestermark.dk>
Aaron Spangler <aaron777@gmail.com>


================================================
FILE: CHANGELOG.md
================================================
# Changelog

## Release 25.12 (2025-12-12)

### Breaking Changes

- Changed all uv fields to uvi, BREAKING change to UV sensors (#3131)
- Removed Python 2.7 support (#3320)

### Highlights

- Added support for GIF2020OCECNA to Orion-Endpoint (#3392)
- Added support for Voltcraft Energy Count 3000 (ec3k) (#3373)
- Added support for ORIA WA150KM freezer thermometer (#3143)
- Added support for Fine Offset Electronics WS85 weather station (#3354)
- Added support for UniFan-24V universal 24V fan controller (#3142)
- Added support for BM5-v2 battery monitor  (#3126)
- Added support for Baldr-E0666TH Thermo-Hygrometer (#3360)
- Added support for more Interlogix-Security sensor types (#3361)
- Added support for Fine Offset WH43 air quality sensor (#3303)
- Added support for newer smoke alarms to Interlogix-Security (#3163)
- Added support for Orion Endpoint Badger water meter GIF2014W-OSE (#3374)
- Added support for TFA 30.3802.02 to LaCrosse-R3 (#3366)
- Added support for Maverick-XR50 BBQ meat thermometer (#3293)
- Added support for Homelead-HG9901 soil sensor (#3299)
- Added support for Nexus-Sauna (#3327)
- Added support for ThermoPro TX-7B Outdoor Thermometer Hygrometer (#3311)
- Added support for Oregon Scientific THGR228N (closes #3121)
- Added support for BMW GEN2 TPMS (#3302)
- Added support for Apator Metra E-RM 30 water meter (#3203)
- Added support for RainPoint HCS012ARF Rain Gauge sensor (#3240)
- Added support for Oregon Scientific V3 models (#3234)
- Changed dB estimate to display true RSSI (#3283)
- Added gap+pulse period distribution to analyzer (#3263)
- Added availability online/offline MQTT LWT option (#1547)

### Changed

- Change Oil-SonicAdv depth to 12 bits (#3411)
- Added TX-Button to Oregon-THGR810 (closes #3413)
- Updated Windows cross-build to rtlsdr-2.0.2 (closes #3349)
- Updated AVE TPMS to battery_pct
- Fixed Visonic-Powercode decode on bad reception (#3340)
- Fixed overflow in rfraw test data parsing (closes #3375)
- Added decode_mc flex option
- Fixed unit_of_measurement for windspeed to mph in rtl_433_mqtt_hass.py (#3337)
- Fixed Steelmate pressure formula (#3209)
- Added demod state reset between input files (#3310)
- Fixed battery_ok in EcoWitt-WH40 (closes #3298)
- Added UCS vendor to LandisGyr-GS (#3280)
- Improve Truck TPMS decoder (#3272)
- Fixed HA script class for energy_kWh (closes #3255)
- Added Auriol HG11911 to list of supported devices (#3244)
- Fixed negative temperatures on RainPoint-Soil (#3212)

## Release 25.02 (2025-02-19)

### Breaking Changes

- Changed state key value to ON/OFF, BREAKING CHANGE for Waveman-Switch (#2946)

### Highlights

- Added support for General Motors TPMS (#3191)
- Added Globe Thermometer for 8-in-1 sensor to Bresser-7in1 (#3193)
- Added rain start detection feature for WS90 sensor (#3183)
- Added id key to IDM and NETIDM (#3164)
- Added decoder conf for Hormann remotes (#3162)
- Added client cert option to HA script (#3160)
- Added support for Revolt ZX-7717 power meter (#3125)
- Added support for Gridstream RF protocol from Landis & Gyr meters (#2616)
- Added decoder conf for Rako wireless lighting controls (#3124)
- Added support for Quinetic Switches and Sensors (#3098)
- Added support for DeltaDore X3D (#1911)
- Fixed Prometheus exposition format for metrics endpoint (#3107)
- Added support for Bresser/Explore Scientific ST1005H (#3092)
- Improved HA script to round battery level display (#3100)
- Fixed M-Bus Mode C Format B for wmbusmeters (#3091)
- Added support for Thermopro TP828B Meat Thermometers 2 probes (#3085)
- Added support for Arexx TL-3TSN, TSN-33MN and similar sensors (#3076)
- Improved decoder conf qx-30x to support multiple switches and multi-gang versions (#3008)

### Changed

- Changed LandisGyr-GS location output (#3185)
- Changed Rubicson, Nexus, Solight-TE44, Baldr-Rain priority (#3175)
- Added energy msg to Revolt-ZX7717
- Added broadcast flag for syslog output (#3171)
- Fixed argument handling in sigrok file generation (#3161)
- Fixed MQTT reconnect timer (closes #3145)
- Added reconnect throttling to Influx output (#3135)
- Added reconnect throttling to MQTT output (#3134)

## Release 24.10 (2024-10-30)

### Breaking Changes

- Changed to pm_2_5_ug_m3, pm_10_ug_m3, BREAKING change to Bresser-7in1 (#2953)
- Changed Smoke-GS558, Akhan-100F14 to default disabled BREAKING CHANGE (#2958)
- Changed distance_km to storm_dist_km, BREAKING change to Bresser-Lightning (#2855)

### Highlights

- Added support for Technoline TX960 to Acurite-606TX decoder (#3078)
- Added support for Risco 2 way Agility protocol, Risco PIR/PET Sensor RWX95PA (#3066)
- Added support for Rosstech Digital Control Unit DCU-706/Sundance/Jacuzzi (#2612)
- Added support for Arexx Multilogger (#2487)
- Updated Fineoffset-WS90 to new FW timings (#3063)
- Added decoder conf for oma blind remote (#3058)
- Added decoder conf for iVac Pro remote (#3049)
- Added Vevor Weather Station 7-in-1 (#3023)
- Added support for Ecowitt WH46 air quality sensor (#3010)
- Added open in browser script (#2158)
- Added decoder conf for Hornbach MSRC-SAL Awning remote (#3009)
- Added support for Geevon TX16-3 outdoor sensor (#2910)
- Added support for Arad Master Meter water utility meter (#2984)
- Added support for ThermoPro TP829b and Improve rtl_433_mqtt_hass.py (#2964)
- Added Support for Chamberlain CWPIRC pir sensor (#2962)
- Added support for Nice One to Nice-FlorS (#2960)
- Added Support for Ecowitt WN34D and improve FineOffset WN34 (#2944)
- Added decoder conf for rolleaseacmedia blind controller (#2947)
- Added decoder conf for Thomson kinetic doorbell (#2940)
- Added ST389 temperature sensor for ORIA WA50 freezer thermometer (#2937)
- Added decoder conf for Dewenwils BH-V (#2926)
- Added Support BMW Gen3 TPMS (#2900)
- Added decoder conf for self powered QX-305 & QX-302 switches (#2903)
- Improved BMW Gen4-Gen5 TPMS and Add Support Audi TPMS Pressure Alert (#2901)
- Added support for Audi TPMS and BMW Gen4 TPMS (#2897)
- Added support for ThermoPro TP28b (#2882)
- Added Support for Mueller Hot Rod water meter (#2887)
- Added Support for Thermor DG950 Weather Station (#2886)
- Added darker colors for light terminal backgrounds (#2864)
- Added support for Watts WFHT-RF thermostat (#2648)
- Added honor the NO_COLOR env var
- Added RTL433_COLOR=always/never/auto env var
- Added support for BMW Gen5 TPMS multi-brand HUF, Continental, Schrader/Sensata (#2834)
- Added support for Bresser CO2 PN 7009977 and HCHO/VOC PN 7009978 sensors (#2815)
- Added support for Fine Offset WN32B (closes #2303)
- Added support for Fine Offset / Ecowitt WH55 water leak sensor (closes #2756)
- Added support for TechniSat IMETEO X6 and improve Holman-AOK (#2759)
- Added Motonet MTX, MarQuant Rain note to Schou-72543 (#2686)

### Changed

- Added extract_bytes_uart_parity utility function
- Fixed Acurite-590TX timings (closes #3039)
- Changed rtl_433_mqtt_hass.py to add supercap_V key
- examples: Added dup filtering to mqtt_relay (#3018)
- Fixed wmbus raw data output length (#2749)
- examples: Added ability for mqtt_relay to use a config file (#3013)
- Added MQTT dedup republish filter example (closes #2990)
- Added TX-Button to inFactory-TH
- examples: Changed mqtt_relay to always use id in topic (#3014) (#3014)
- examples: Improved mqtt_relay to make individual and json topics optional (#2975)
- examples: Removed obsolete sigrok example scripts (#2979)
- Changed Klimalogg-Pro max humidity (closes #2967)
- Changed to type-safe data_append alternative (#2667)
- Fixed rain_rate_in_h template in HA script (#2782)
- Improved Ecowitt WH53 (#2934)
- Fixed Bresser-5in1 omit temp/hum on error
- Improved Wireless-MBus 3of6 decoding (#2883)
- Added HA script compat for paho-mqtt 2.0.0 via legacy callback API (#2916)
- Fixed Nissan TPMS pressure_PSI key (#2915)
- Changed HA script power to energy and UV index to float (#2913)
- Fixed Cotech-367959 lux and uv value (#2073)
- Fixed TPMS Nissan pressure_psi value (#2906)
- Fixed Bresser-6in1 rain vs temp (closes #2184)
- Changed a HA script device trigger to avoid duplicate trigger (#2829)
- Added some known fields to Marlec-Solar
- Added log rotate support for dumper files (#2876)
- Added contact_open reed_open mappings to rtl_433_mqtt_hass.py (#2881)
- Added microseconds to OOK pulse data outputs
- Added OpenMetrics/Prometheus API (#2863)
- Added strict checks to flex argument parsing
- Fixed EcoWitt-WS68 wind unit and decoding (#2871)
- Fixed event callback on shutdown (closes #2869)
- Fixed Badger-ORION return on decode success (#2854)
- Improved Bresser lightning correct msg length and lfsr digest check
- Improved FS20 decoding, add FHT support (#1783)
- Fixed properly install to /etc for /usr prefix (closes #2827)
- Added compatible model TST-507 TPMS to EezTire E618 (#2832)
- Fixed Bresser-7in1 to exclude unavailable sensor values (#2817)
- Added HTTP cmd API examples
- Fixed TPMS Elantra2012 for longer desync (closes #2806)
- Fixed KlikAanKlikUit-Switch for DIO remotes (#2789)
- Fixed rtl_433_mqtt_hass.py rain_in value template (#2801)
- Fixed Bresser-Lightning decoding of 'count' (#2797)
- Fixed detection of Bresser-ProRainGauge (#2431)
- Improved EcoWitt-WS68 LUX and UVI decoding and add units (#2790)
- Fixed Fineoffset-WS90 to support newer firmware (closes #2732)
- Added Ecowitt air quality sensors to rtl_433_mqtt_hass.py (#2772)
- Added mqtt base topic option (closes #2768)
- Added reading mqtt auth from env vars (closes #2769)
- Fixed converting inches to mm (#2755)
- Changed rtl_433_mqtt_hass.py to support storm_dist_km from WH31L (#2748)
- Added channel/button to Acurite-606TX
- Fixed TFA-303151 negative temps (closes #2538)
- Fixed temperature for Bresser 3-in-1 Wind Gauge (closes #2523)
- Improved code and annotations for cpplint (#2683)

## Release 23.11 (2023-11-28)

### Breaking Changes

- Changed conf dir defaults to just SYSCONFDIR (#2660)
- Changed verbosity of Protocols Registered output (#1700)
- Changed example conf file to use defaults (#2670)
- Changed help texts to print to stdout (#2542)
- Fixed Oregon Scientific channel renumbering, BREAKING change to THN132N channel 3 (#2033)
- Changed MQTT client ID to contain all params (#1129)
- Fixed GEO-minim matching, BREAKING change to id field (#2363)
- Changed Inkbird-ITH20R temperature2_C to temperature_2_C BREAKING change (#2220)

### Highlights

- Added support for Schou 72543 rain sensor (#2686)
- Added support for Bresser Lightning and Bresser Air Quality (#2698)
- Added support for Tekelek oil gauge (#2306)
- Added support for Nissan Leaf TPMS (#2536)
- Added support for Carchet TPMS (#2677)
- Added support for Bresser water leakage sensor PN: 7009975 (#2590)
- Added support for discovering Govee water sensors to rtl_433_mqtt_hass (#2605)
- Added support for newer Chuango DWC-102 close command (#2630)
- Added support for TFA Stratos 30.3151 and improve Fineoffset WH1050 (#2549)
- Added support for IROX ETS69 to Ewig Emos-TTX201 (#2547)
- Added support for ThermoPro TX-2C (#2466)
- Added support for Fineoffset WS90 (#2448)
- Added support for Acurite 592TX (#2457)
- Added support for Oregon Scientific AWR129 BBQ thermometer (#2439)
- Added support for Celsia CZC1 (#2391)
- Added support for Baldr/Rainpoint rain gauge (#2394)
- Added support for EezTire-E618 TPMS10ATC (#2387)
- Added support for LaCrosse TX31U-IT (#2386)
- Added support for Revolt Energy Monitor NC-5462 (#2361)
- Added support for Emax EM3551H with Gust without UV/Lux to Emax-W6 (#2376)
- Added support for Wireless M-Bus Mode T Downlink (#2366)
- Added support for Gasmate-BA1008 (#2359)
- Added support for Oil-SonicSmart (#2279)
- Added support for Watchman Sonic Advanced / Plus decoder (#2323)
- Added support for CED7000 timer (#2319)
- Added support for Emax Weather Sensor, improves Altronics X7064 sensor (#2300)
- Added support for TFA Dostmann 14.1504 Radio-controlled grill and meat thermometer (#2296)
- Added support for new revision of Govee H5054 water leak detector (#2273)
- Added support for Vauno EN8822C (#2231)
- Added support for WEC-2103 temperature/humidity sensor (#2185)
- Added support for Neptune R900 flow meters (#2180)
- Added support for SRSmith SRS-2C-TX Pool Remote Control (#2147)
- Added support for Kia Rio III (UB) and Hyundai TPMS sensors (#2083)
- Added support for TyreGuard 400 TPMS (#1976)
- Added support for GEO minim+ energy monitor (#1970)
- Added support for longer EFTH800 messages (#2278)
- Added decoder conf for PHOX garage gate opener (#2560)
- Added decoder conf for Driveway alarm motion sensor I8-W1901 (#2493)
- Added decoder conf for Reolink doorbell (#2277)
- Added decoder conf for SWETUP garage door remote (#2403)
- Added decoder conf for ELRO AB440 remote (#2066)
- Added decoder conf for xmas tree remote 2APJZ-CW002 (#2250)
- Added decoder conf for GE Smartremote Plus (#2249)
- Added standardized detect key for Govee-Water (#2625)
- Added restartable SDR device (#2411)
- Changed to async SDR acquire thread (#1978)
- Changed to second Ctrl-C is a hard abort
- Added log output, log redirect, colored KV log (#2254)

### Changed

- Changed rtl_433_mqtt_hass.py to use moisture class (#2726)
- Changed rtl_433_mqtt_hass.py to add battery_mV (#2725)
- Changed Fineoffset-WS90 packet size check (#2702)
- Fixed logging message in HA script (#2696)
- Added Pool/Spa Thermometer PN 7009973 note to Bresser-6in1 (#2689)
- Added php example stream script (#2687)
- Added checksum and battery_ok to WEC-2103 (#2662)
- Changed version number to exclude nightly tag
- Changed EezTire-E618 checksum, include flags (#2664)
- Changed startup help text to the actual help page (#2659)
- Improved some strcpy strncpy to snprintf
- Improved all plain sprintf to snprintf
- Fixed Somfy-IOHC length check (#2655)
- Added warning if firewall blocks loopback (#2621)
- Improved HA script with precipitation and wind speed class (#2643)
- Fixed Honeywell-CM921 temperature msg (#2637)
- Added Lidl Auriol 4-LD6313 and 4-LD5972 temperature/rain sensor (#2633)
- Improved HA script with current class (#2626)
- Improved handling of units within HA UI (#2624)
- Improved HA script with detailed units (#2607)
- Fixed HA script allow list id typo (#2602)
- Fixed Fineoffset-WH1050 return value (#2600)
- Fixed Inkbird-ITH20R battery_ok key and range (#2596)
- Fixed HA script remove device name from entities (#2594)
- Fixed HA script topics (#2593)
- Fixed malformed json on empty row print (#2588)
- Fixed Ecowitt-WS90 extra data output (#2585)
- Added description of startup bit to Bresser-5in1 (#2583)
- Fixed various spelling (#2579)
- Added lower temp bounds to Acurite-5n1, Acurite-Atlas (#2571)
- Added humidity_1, humidity_2 to rtl_433_mqtt_hass (#2567)
- Added timestamp to logs in rtl_433_mqtt_hass (#2566)
- Fixed HASS script rain_rate_mm_h typo (#2565)
- Fixed Eurochron-EFTH800 radio_clock hour decoding (#2526)
- Changed Fineoffset-WS90 to add firmware version (#2517)
- Changed ThermoPro TX-2C to enable humidity (#2514)
- Added radio clock to Fineoffset-WH1050 (#2463)
- Added battery voltage to EcoWitt-WH40 (#2488)
- Changed EMOS-E6016 wind speed and battery  (#2484)
- Improved Holman ws5029, Add support for AOK-5056 and correction for Emax (#2419)
- Fixed current frequency and sample rate info (#2468)
- Changed rtl_433_mqtt_hass to enable passing custom topics (PR #2289)
- Added extra digit to Oregon Scientific for AWR129 (#2446)
- Changed Acurite 896 rain gauge to default enabled (#2430)
- Changed CM160 output to double (#2428)
- Fixed CM160 energy calculation factor (#2427)
- Changed r_device.fields to constant pointer (#2421)
- Added total energy kWh to CM160 readings (#2418)
- Fixed Fitipower FC0012 gain quirk (#2417)
- Added unlockable rtl_tcp control (#2412)
- Fixed rtl_tcp for slow send buffers
- Fixed LibreSSL PSK error (#1569)
- Fixed Oil-SonicAdv missing messages
- Fixed LaCrosse-R1/LaCrosse-R3 rain value (#2313)
- Added char const check to symbolizer (#2390)
- Fixed flowis protocol decoding, alarm and back flow parameters.
- Changed literals to string const for strict discarded-qualifiers warnings (#2379)
- Added Schrader 3039 TPMS for Infiniti Nissan Renault note to Schrader-SMD3MA4
- Fixed Emax units (#2374)
- Added TLS debug info for influxs and mqtts
- Fixed Emax LUX decoding (#2346)
- Fixed Vauno-EN8822C false positives (#2364)
- Added Flowis protocol decoder (#2357)
- Added Wireless M-Bus, Mode T Downlink (#2366)
- Fixed out-of-bounds in Klimalogg-Pro (#2362)
- Fixed Somfy-RTS for wrong bitrate (#2356)
- Changed all r_device declarations to const (#2352)
- Fixed pointer restrict for C++ compilers (#2351)
- Fixed TFA-141504v2 decoder length check (#2339)
- Added radio clock decode to Eurochron-EFTH800 (#2331)
- Changed Somfy-IOHC to recognize more messages (#2258)
- Fixed Oregon Scientific negative temp, add BCD sanity checks (#2086)
- Added ESIC/SCMplus fields to rtl_433_mqtt_hass (#2114)
- Changed LaCrosse TX invalid humidity handling (#2335)
- Fixed json keys for wmbus to be unique (#2316)
- Fixed Bresser-ProRainGauge rain digits (#2312)
- Fixed light reading on Cotech-367959 when no sensor installed (#2305)
- Fixed HCS200 serial ID decoding (#2308)
- Added TLS options to InfluxDB output
- Added output log level options (#2282)
- Added ANSI colors for Windows 10 (#2280)
- Fixed to use pthread compat on WIN32 always
- Fixed battery flag in AmbientWeather-WH31E/WH31B (#2272)
- Changed more fprintf to log prints
- Changed fprintf to log prints (#2266)
- Changed verbosity to match log level (#2264)
- Added basic logger (#2263)
- Fixed JSON output string escaping
- Fixed Win32 thread calling convention
- Added decode_dm flex option (#2241)

## Release 22.11 (2022-11-19)

### Breaking Changes

- Fixed irregular model names (#1883)
    - "Inkbird ITH-20R" -> "Inkbird-ITH20R"
    - "LaCrosse-WS7000-27/28" -> "LaCrosse-WS700027"
    - "LaCrosse-WS7000-22/25" -> "LaCrosse-WS700022"
    - "LaCrosse-WS7000-16" -> "LaCrosse-WS700016"
    - "LaCrosse-WS7000-15" -> "LaCrosse-WS700015"
    - "LaCrosse-WS7000-20" -> "LaCrosse-WS700020"
    - "LaCrosse-WS2500-19" -> "LaCrosse-WS250019"
    - "Abarth 124 Spider" -> "Abarth-124Spider"
    - "Jansite Solar" -> "Jansite-Solar"
    - "Klimalogg Pro" -> "Klimalogg-Pro"
    - "Secplus_v1" -> "Secplus-v1"
    - "SCM+" -> "SCMplus"
- Changed light_klx to light_lux in Bresser-7in1 (#2061)
- Removed VS15 project files

### Highlights

- Added rtl_tcp pass-through output (#1915)
- Added realtime replay option for file inputs
- Added support for Badger ORION water meter (#2089)
- Added support for Rubicson pool thermometer 48942 (#2137)
- Added support for Fine Offset WN34 temperature sensor (#2122)
- Added support for KS200/KS300 to ELV WS2000 (#2103)
- Added support for Maverick XR-30 (#2090)
- Added support for Fine Offset WH45 air quality sensor
- Added support for HCS200/HCS300 based remotes with FSK transmitters (#2052)
- Added support for Emos E6016 Rain Gauge (#2032)
- Added support for ANT and ANT+ devices (#2004)
- Added support for Altronics X7064 sensor (#2000)
- Added support for EMOS 6016 (#1983)
- Added support for FineOffset WS80 weather station (#1965)
- Added support for Renault-0435R TPMS (#1924)
- Added support for AcuRite 01190 Leak Detector (#1953)
- Added support for Regency ceiling fans (#1948)
- Added support for Microchip HCS300 KeeLoq remotes BREAKING CHANGE (#1752)
- Added support for Yale HSA (#1929)
- Added support for SimpliSafe-Gen3 (#1257)
- Added support for AVE TPMS (#1909)
- Added decoder conf for sgooway door detector (#1707)
- Added decoder conf for ContinentalRemote (#2125)
- Added decoder conf for Mondeo remote (#1282)
- Added decoder conf for LeakDetector
- Added decoder conf for Heatilator-Gas-Log (#1963)
- Added decoder conf for Honeywell-Fan (#1962)
- Added decoder conf for DrivewayAlert (#1928)
- Added decoder conf for GhostControls (#1922)
- Added Threads if available

### Changed

- Added note regarding WH51 915MHz decoding (#2236)
- Added publish secret knocks as device automations
- Added time, channel, and button device automation triggers
- Improved false positives for acurite_01185m (#2214)
- Changed rtl_433_mqtt_hass rain value template round to two digits (#2210)
- Changed rtl_433_mqtt_hass value templates round to one digit (#2209)
- Fixed Chuango devices with some zeroes in their ID (#2205)
- Changed Proove/Nexa/Kaku to support Smartwares SH4-90152 (#2174)
- Changed Acurite TXR decoder to improve validation (#2162)
- Fixed Efergy-e2CT current above 53 Amp (#2166)
- Added sanity check to Ambient Weather F007th (#2155)
- Added decode symbol helper and flex option (#2161)
- Added InFactory PT-310 support to Rubicson (#2123)
- Added HTTP API example scripts
- Changed rain gauge multiplier for Auriol-4LD5661 (#2129)
- Added CSV names for flex getters with unique mode
- Added php example script (#2087)
- Improved Ford TPMS decoder (#2071)
- Fixed crash when reading a conf file (#2068)
- Changed SDR data buffers to persist valid
- Added ERT-SCM consumption data to mqtt hass mappings (#2023)
- Added id filter to mqtt hass (#1988)
- Fixed overflow in Acurite-00275rm (#2012)
- Changed the PCM/NRZ/RZ naming
- Added cmake option to select IPv6 support
- Fixed EMOS-6016 checksum, add DCF77
- Added bitbuffer_find_repeated_prefix function
- Fixed pulse reset on spurious pulses (#1982)
- Removed confusing -G register all option
- Changed hass script duplicate dict key 'light_lux' back to 'lux' for legacy reasons (#1989)
- Added Honeywell-cm921 Ticker and Heat Demand commands (#1985)
- Changed most decoder-verbose to log level
- Changed fprintf in decoders to decoder_log
- Added decoder log to replace bitbuffer bitrow print
- Added decoder log to replace fprintf
- Fixed Digitech-XC0324 humidity readings (FT-005TH Sensor) (#1971)
- Changed wt0124 to use additional checksum (#1959)
- Added diagnostic entity category to mqtt hass example (#1952)
- Removed invalid "weather" device class in HASS script (#1584)
- Added trigger stream output (#1910)
- Changed Hideki to accept short sync (#1908)

## Release 21.12 (2021-12-14)

### Highlights

- Added noise stats, autolevel, and squelch (#1763)
- Added automatic file format detection from filename
- Added support for SmartFire Proflame 2 remote control (#1905)
- Added support for Lacrosse TX34 rain gauge (#1890)
- Added support for Telldus-FT0385R (#1841)
- Added support for GE Choice Alert wireless alarm sensors (#1768)
- Added support for Porsche Boxter/Cayman TPMS
- Added support for Funkbus/Instafunk (#1896)
- Added support for Truck TPMS (#1893)
- Added support for LaCrosse LTV-W1 wind sensor (#1855)
- Added support for Auriol 4-LD5661 temperature/rain sensor (#1843)
- Added support for Linear Megacode Remote (#1834)
- Added support for EnOcean ERP1 decoder (#1829)
- Added support for Acurite-01185M (#1824)
- Added support for ATech-WS308 temperature sensor (#1605)
- Added support for RainPoint sensor (#1781)
- Added support for Inkbird ITH-20R
- Added support for Clipsal CMR112 cent-a-meter power meter (#1814)
- Added support for Govee Water Leak Detector H5054 and Govee Contact Sensor B5023 (#1653)
- Added support for Markisol curtain remote (#1775)
- Added support for Oregon Scientific BTHR918 (#1767)
- Added UV index add decimals to Bresser-7in1 (#1789)
- Changed InfluxDB output of 'mic' from field to tag (#1773)
- Added biastee, digital_agc, direct_samp, offset_tune option for rtlsdr and rtl_tcp (#1788)
- Added QoS to MQTT options (#1769)

### Changed

- Changed PCM slicer to measure bit length in more cases (#1897)
- Added CS8 as file input format
- Added decoder priority stages (#1895)
- Fixed fprintf to use an unsigned marker when an unsigned value is given (#1872)
- Added RTL_433_REDUCE_STACK_USE to reduce size of bitbuffers (#1863)
- Fixed rainpoint msg buffer must be initialized (#1862)
- Fixed Reduce stack use in slicers (#1860)
- Fixed Windows CreateTimerQueueTimer alarm handle is not valid for CloseHandle (#1859)
- Changed HASS script to logging (#1851)
- Added SwitchDocLabs SM23 note
- Added SwitchDocLabs F016TH note
- Added SwitchDocLabs FT020T note
- Fixed Inovalley-kw9015b rain bits (#1660)
- Added battery_ok to Bresser-7in1 (#1795)
- Added HASS long term statistics (#1835)
- Added bitbuffer row spill
- Updated Govee Leak Sensor with new parity check (#1810)
- Fixed Springfield-Soil/AlectoV1 false positives
- Fixed LaCrosse-TH3 checksum (#1398)
- Added cmake found lib versions output

## Release 21.05 (2021-05-09)

### Highlights

- Last release to support Autotools (autoconf, automake) builds (#1644)
- Last release to offer "oldmodel" keys (deprecated since 2020)
- Added Github Release builds for Windows
- Added GPSd tags option (#1636)
- Added optional TLS support to MQTT (#1633)
- Added OpenSSL support for influxs TLS (#1569)
- Added support for ELK-319DWM, Alula RE101 to Interlogix (#1711)
- Added conf for Tesla charge port opener (#1704)
- Added support for  Hyundai-VDO TPMS (#1643)
- Added support for TX25U dual channel temp sensor
- Added support for Honeywell CM921/BDR91/Evohome (#1336)
- Added support for Auriol AFT 77 B2
- Added support for Auriol AHFL (#1683)
- Added support for Bresser Professional Rain Gauge (#1676)
- Added support for TFA Marbella pool thermometer (#1675)
- Added support for Amazon Basics Meat Thermometer (#1671)
- Added support for Owl 180i support
- Added support for Jansite TPMS Model Solar (#1663)
- Added support for Cavius alarms (#1648)
- Added support for Security plus v1 (#1483)
- Added conf for Skylink HA-434TL motion sensor (s.a. #814)
- Added support for Burnhard BBQ thermometer (#1624)
- Added support for wmbus water meter Maddalena (#1610)
- Added conf for ATC Technology LMT-430 (#1600)
- Added support for Blueline PowerCost Monitor
- Added conf for FAN-53T (#1588)
- Added support for Acurite 515 fridge/freezer sensors (#1579)
- Added support for TelFix-RadioLoop (#1571)
- Added conf for Salus RT300RF thermostat, Heatmiser PRT-W thermostat (#1573)

### Changed

- Added Release build workflow
- Added pressure_kPa key for HA (#1712)
- Added support for ELK-319DWM, Alula RE101 to Interlogix (#1711)
- Fixed and style Honeywell CM921
- Added option to set force_update for all sensors (#1695)
- Added Tesla charge port opener decoder conf (#1704)
- Added battery flags to Bresser 7in1 (#1703)
- Fixed Hyundai-VDO TPMS
- Added Hyundai-VDO TPMS (#1643)
- Added X10 Dim, Bright, All Lights ON, and All Off commands (#1687)
- Added support for TX25U dual channel temp sensor
- Fixed code warnings
- Fixed code style
- Added forgotten id
- Added Honeywell CM921/BDR91/Evohome decoder (#1336)
- Added Auriol AFT 77 B2 protocol decoder
- Fixed Holman-WS5029 rain count (#1686)
- Fixed explanation of supposed PM10 (estimated) value (#1678)
- Added support for Auriol AHFL protocol (#1683)
- Fixed PSI calculation for Ford TPMS
- Added support for higher pressure range in Ford TPMS
- Fixed secplus_v1 endless loop (#1662)
- Fixed secplus_v1 overflow
- Added support for some Ecowitt WH41 sensor signals
- Added comment regarding PM10 readings in the FineOffset WH0290 decoder
- Added support for Bresser Professional Rain Gauge (#1676)
- Added TFA Marbella pool thermometer protocol decoder (#1675)
- Added Amazon Basics Meat Thermometer decoder (#1671)
- Fixed exit if http server can't start
- Fixed missing sdr_stop for WIN32
- Added Owl 180i support
- Added website and sensor specifications for Jansite TPMS Model Solar (#1666)
- Added decoder for jansite solar tpms (#1663)
- Added Ford TPMS pressure and temperature (#1654)
- Fixed http redirect to index for Chrome
- Added support for Cavius alarms (#1648)
- Added mqtt token slash accepts any character
- Added variable fm low pass filter option
- Added support for Security plus v1 (#1483)
- Added GPSd tags option (#1636)
- Added FineOffset WH0290 extra fields (#1639)
- Fixed Hideki Gust speed by Udo Kirsten
- Added option for multiple data tags
- Added optional TLS support to MQTT (#1633)
- Added OpenSSL support for influxs TLS (#1569)
- Added LaCrosse TX141TH-Bv2 checksum
- Changed rain field format for WS2032
- Added m_bus decoded values + HCA (#1630)
- Changed battery_ok, rain field for WS2032
- Fixed m_bus Show invalid dates as invalid (#1628)
- Fixed mqtt retain on hass script (#1602)
- Added Skylink HA-434TL motion sensor conf (s.a. #814)
- Added support for Burnhard BBQ thermometer (#1624)
- Added TFA 30.3208.02 note (#1622)
- Added raw pulse printing mode
- Added support for parsing timedate in wbus (#1616)
- Added Battery Level for Fineoffset WH0290 Wireless Air Quality Monitor (#1617)
- Fixed Blueline tweaks and improvements (#1590)
- Added support for wmbus water meter Maddalena (#1610)
- Changed soil moisture to percent display (#1595)
- Added ATC Technology LMT-430 conf (#1600)
- Fixed buffer length in honeywell (#1598)
- Fixed buffer size error (#1596)
- Fixed FineOffset WH1050 field widths (#1592)
- Added support for Blueline PowerCost Monitor
- Added FAN-53T decoder conf (#1588)
- Added support for Acurite 515 fridge/freezer sensors (#1579)
- Fixed invalid HASS "weather" device_class (#1548)
- Fixed rtlsdr_read_async() abort on read stall (#1581)
- Fixed rtlsdr_set_freq_correction non-error code
- Added support for UV index and light intensity readings in Cotech (#1575)
- Fixed false positive bug in Nexus (#1576)
- Added support for TelFix-RadioLoop to Somfy (#1571)
- Added Thermostat example conf files with mqtt outputs (#1573)
- Added lacrosse decoder sanity checks

## Release 20.11 (2020-11-13)

### Highlights

- HTTP server, JSON-RPC
- Added RfRaw analyzer output and format input support
- Added support for LaCrosse Technology View LTV-R1 Rainfall Gauge
- Added support for ECODHOME smart socket
- Added support for LaCrosse Technology View TH2 Thermo/Hygro sensor
- Added support for Bresser 6-in-1, 7-in-1 weather station
- Added support for LaCrosse Technology View TH3 Thermo/Hygro Sensor
- Added support for LaCrosse LTV-WR1 Multi Sensor
- Added support for Nice Flor-s remote
- Added support for Schrader TPMS SMD3MA4 (Subaru)
- Added support for MightyMule Driveway Alarm FM231
- Added support for Somfy RTS
- Added support for LaCrosse LTV-WSDTH01
- Added support for TFA 30.3221.02 Temperature/Humidity sensor
- Added support for Security plus v2 keyfob
- Added support for Acurite Atlas and Atlas Lightning Detector
- Added support for Acurite 590TX
- Added support for ThermoPro TX2
- Added support for IDM and NetIDM decoders
- Added support for Insteon decoder
- Added support for LaCrosse TX141B
- Added support for Sharp SPC775
- Added support for Missil ML0757
- Added support for Fineoffset WH32
- Added support for Abarth124 TPMS sensor
- Added support for Fine Offset WH1080 FSK version
- Added support for SCM+ decoder
- Added support for Kerui WD51 Water leak sensor
- Added support for Cotech 36-7959
- Added support for Eurochron EFTH-800
- Added support for Visonic Powercode devices
- Added support for Klimalogg decoder and needed nrzs demodulator

### Changed

- Added support for LaCrosse Technology View R1 Rainfall Gauge (#1553)
- Added http server (#871)
- Added jsmn json lib
- Added support for ECODHOME smart socket (#1544)
- Fixed Lacrosse-THx hardcoded strings to support data extractor scripts
- Added support for LaCrosse Technology View TH2 Thermo/Hygro sensor (#1552)
- Added stats start time reporting
- Fixed Analyzer FSK/OOK hint (#1557)
- Improved unit tests for bitbuffer with extra assertions
- Fixed UNUSED in term_ctl
- Removed "http" as "influx" alias
- Added arguments and docs to Home Assistant MQTT auto discovery script (#1546)
- Changed LaCrosse LTV-WR1 to wind_avg_km_h key (#1549)
- Fixed rfraw builder overflow (#1539)
- Added Dooya Curtain Remote conf (#1545)
- Added SDR loop api
- Changed to sig_atomic_t for sighandler
- Fixed wmbus csv output parameters
- Fixed flags field for TPMS Jansite (#1538)
- Added note for TFA Dostmann 30.3159.IT (#1537)
- Added SDR runtime settings api
- Changed exit async naming
- Added SDR device info
- Added support for Bresser 6-in-1, 7-in-1 weather station (#1225)
- Added support for LaCrosse Technology View TH3 Thermo/Hygro Sensor (#1536)
- Added support for LaCrosse LTV-WR1 Multi Sensor (#1533)
- Added support for Nice Flor-s remote (#1526)
- Changed remove DSC subtype key (#1522)
- Changed Acurite subtype key to message_type (#1520)
- Added support for WH31E RCC packet type (#1528)
- Fixed wmbus mode S buffer length issue for Lansen meters
- Added SoapySDR to MinGW-w64 build
- Added output format option to flex getters (#1532)
- Added TFA 30.3209 note to Nexus (#1516)
- Added TFA-Dostmann 30.3161 rain scale (#1531)
- Fixed Insteon string overflow
- Fixed missing CSV fields, add a debug check
- Added named output tag option (#1517)
- Added support for Schrader TPMS SMD3MA4 (Subaru) (#1511)
- Removed unneeded update_protocol
- Changed width calc from r_device to slicers (#1513)
- Added support for mightymule driveway alarm FM231 (#1407) (#1515)
- Changed rfraw parse to accept multiple codes
- Fixed include for memcmp in rfraw (#1507)
- Added id key to scmplus (#1503)
- Removed list of supported device protocols from man page (#1345)
- Added RfRaw analyzer output support
- Added RfRaw format input support
- Removed FSK_PULSE_MANCHESTER_ZEROBIT from ook_demods
- Fixed Inovalley kw9015b temp/rain fields proper
- Fixed Inovalley kw9015b temp/rain fields (#1501)
- Added support for Somfy RTS (#1496)
- Added 7-bit clean strings check to actions
- Added maintainer_update check
- Fixed Security+ 2.0 decoder for new gap_limit rows (#1498)
- Added clang-analyzer action
- Added build action
- Added style check action
- Improved PCM NRZ 0-bit slicing precision
- Fixed output keys for FineOffset WH51 (#1495)
- Fixed index bug in TFA 30.3221
- Fixed simplisafe non-printable character output
- Added support for LaCrosse LTV-WSDTH01 (#1485)
- Added gap_limit to PCM demod
- Fixed invalid dumpers on ook input (#1463)
- Added support for TFA 30.3221.02 Temperature/Humidity sensor (#1426)
- Fixed Acurite 6045 temperature 2.0F too low (#1482 #1401)
- Added support for Security plus v2 keyfob (#1480)
- Fixed opus_xt300 added sanity check to data values (#1470)
- Fixed runtime error 'left shift of 229 by 24 places cannot be represented in type int (#1479)
- Fixed bad conf for Fan-11t (#1477)
- Added came top432 flex decoder config (#1474)
- Fixed wmbus raw telegram output, mainly for wmbusmeters use
- Fixed efergy_e2_classic False Trigger (#1475)
- FIXed check manchester_decode check decoded bit length in a consistent method, removed superfluous comment
- FIXed check manchester_decode result length
- Fixed current_cost 8 bytes required
- Fixed TPMS Abarth124 false positive (#1466)
- Fixed alectov1 csv fields (#1457)
- Added Atlas Lightning Detector support (#1418)
- Added Acurite Atlas support (#1124)
- Added Nexus-TE82s compatibility note (#1455)
- Updated idm scmplus Meter type list (#1445)
- Added Acurite 590TX support (#1411)
- Added ThermoPro TX2 support (#1450)
- Improved program exit code in case of error (#1451)
- Improved Home Assistant MQTT auto discovery (#1390)
- Fixed Many False Positives (#1444)
- Fixed Globaltronics QUIGG GT-TMBBQ-05 false positives (#1443)
- Fixed Oregon Scientific SL109H false positives (#1442)
- Added IDM and NetIDM decoders (#1421)
- Changed Fineoffset WH32 to exclude pressure
- Added Insteon decoder (#1285)
- Added Friedland EVO door bell conf
- Added support for LaCrosse TX141B (#1434)
- Added missing parts for Sharp SPC775 decoder
- Added Sharp SPC775 support (#1433)
- Added support for Missil ML0757
- Fixed use of return code in Abarth Spider decoder
- Added conditional to data_make (#1432)
- Added support for Fineoffset WH32 (#1431)
- Added bit reversed output for HCS200 decoder to match official tools
- Added reverse32 function
- Improved x10sec add sensors, tamper, crc (#1413)
- Improved inFactory e.g. MIC (#1325)
- Changed Kerui to break out additional fields from state (#1018)
- Updated rtl_433.example.conf
- Improved validations checks for smoke_gs558 protocol
- Added Equation/Siemens ADLM FPRF remote conf
- Added Abarth124 tpms sensor support
- Added missing protocol to readme
- Added attenuation histogram output (#1387)
- Added Fine Offset WH1080 FSK version support
- Improved FSK demodulation of distorted signals better
- Added SCM+ decoder (#1410)
- Added support for Kerui WD51 Water leak sensor (#1406)
- Fixed cancel watchdog when reading from file input
- Fixed ERT Endpoint Type extraction (#1379)
- Added custom data processor example
- Improved Honeywell sensor support (#1384)
- Added delay and low battery codes for DS10A door sensor (#1397)
- Fixed free results from SoapySDR API
- Fixed handle empty filenames
- Added support for Cotech 36-7959 (#1382)
- Removed deprecated positional flex syntax
- Changed div 10 to mul 0.1 in all decoders
- Changed value scaling for double to float in all decoders
- Changed checks on Rubicson/Nexus/Solight
- Fixed Bresser 5in1 Wind calculation (#1353)
- Improved MQTT Home Assistant example (#1357)
- Added decode_uart util (#1376)
- Fixed Eurochron EFTH-800 missing mic
- Added Eurochron EFTH-800 support (#1375)
- Fixed MQTTT mgr free
- Fixed Soapy string leaks
- Added Prometheus/OpenMetrics relay example (#1371)
- Fixed missing levels with minmax demod (fixes #1363)
- Fixed socket portability
- Fixed visonic device battery reporting
- Improved visonic_powercode
- Fixed rtl_tcp gain/rate/freq status output
- Fixed missing WSAStartup in rtl_tcp
- Added support for Visonic Powercode devices (#1349)
- Added message length check for ESIC EMT7110.
- Updated Acurite 6045 to capture all 8 bits of strike counter (#1348)
- Added configuration file for SMC5326 (#1346)
- Updated template guideline for verbosity (#1344)
- Fixed failing style-check test by adding allocation check to write-sigrok
- Added support for sigrok convert on windows (#1341)
- Fixed flex map parse
- Changed -l n to -Y level=n
- Changed detector level limits to dB
- Fixed Fineoffset-WHx080 temperature (#1327)
- Fixed Ecowitt-WH53, Maverick-ET73 timings
- Fixed Klimalogg device settings, tolerance was set to low
- Added Klimalogg decoder and needed nrzs demodulator
- Fixed negative temperatures in wmbus decoder
- Added pulse-eval example

## Release 20.02 (2020-02-17)

### Highlights

- Added InfluxDB output (#1192)
- Added native Sigrok writer (#1297)
- Changed to newmodel keys default
- Fixed SoapySDR for 0.8 API
- Added new minmax FSK pulse detector
- Changed default to use new minmax detector and sample rate of 1MS/s for frequency above 800MHz
- Changed -a and -G option to discourage usage
- Improvements and support for many more sensors

### Changed

- Changed CurrentCost and EfergyOptical keys to have units (#1313)
- Added command line information when new defaults are active
- Added mic to csv output in the ert decoder
- Added subtype to DSC (#1318)
- Added meta to OOK output
- Fixed json escaping (#1299)
- Added ERT SCM protocol decoder
- Added return codes for most devices
- Changed remaining wind dir keys (see #1019)
- Fixed optparse strtod with rounding (#1308)
- Fixed for wmbus records parser
- Added integrity check for Thermopro TP11 and TP12
- Fixed conf eol comments (#1307)
- Added config for unknown car key.
- Fixed sync word for Honeywell CMI alarm systems
- Fixed Wno-format-security for nixos gcc9 (#1306)
- Fixed negative length in data_array (#1305)
- Added native Sigrok writer (#1297)
- Added checksum check for Rubicson 48659 meat thermometer
- Changed Updated Fan 11t conf (#1287)
- Fixed failure on low sample rates (#1290)
- Improved format conversions
- Fixed radiohead-ask buffer overflow (#1289)
- Changed Enable IKEA Sparsnäs by default
- Changed cmake build to static lib
- Changed to newmodel keys default
- Changed model TFA-Drop-30.3233.01 to TFA-Drop
- Added config for Fan-11T fan remote (#1284)
- Added preliminary EcoWitt WS68 Anemometer support (#1283)
- Added EcoWitt WH40 support (#1275)
- Improved PCM RZ bit width detection
- Fixed for #1114 DSC Security Contact WS4945 (#1188)
- Fixed LaCrosse TX145wsdth repeat requirement
- Added preliminary LaCrosse TX141TH-BV3 support
- Fixed SoapySDR for 0.8 API
- Fixed Auriol AFW2A1 missing check
- Changed flex decode to count as successful output
- Added Nexus compatible sensor descriptions
- Improved LaCrosse TX29-IT support (#1279)
- Added LaCrosse TX145wsdth support (#1272)
- Changed KNX-RF output
- Added support for Lansen wmbus door/window sensor
- Improved PCM bit period detection
- Fixed OS PCR800 and RGR968 displayed unit name
- Fixed battery_level in Fineoffset-WH51
- Fixed type of battery_mv in Fineoffset-WH51 (#1274)
- Added reflected LFSR util
- Added support for TFA Drop 30.3233.01 (#1255)
- Added Auriol AFW2A1 support (#1230)
- Added Verisure Alarm config file
- Added wmbus mode S support and KNX RF telegram support.
- Added support for decoding Lansen and Bmeters wmbus based temperature/hygrometers
- Improved Honeywell 2Gig support
- Changed -a and -G option to discourage usage
- Added support for WS2032 weather station (#1208)
- Added timezone offset print option (#1207)
- Added LaCrosse TX141W support
- Added battery level to Fineoffset WH51
- Added Archos-TBH support (#1199)
- Added Oregon ID_THGR810a ID_WGR800a version ids (#1258)
- Improved OWL CM180 support (#1247)
- Added Holman iWeather WS5029 older PWM (#947)
- Added support for FineOffset/ECOWITT WH51 (#1242)
- Added config for 21 key remote
- Added rtlsdr_find_tuner_gain for exact gains
- Improved fineoffset more heuristics to separate WH65B and WH24
- Fixed missing csv fields on default disabled
- Improved Efergy Optical decoder (#1229)
- Added TX-button to some decoders (#1205)
- Improved for TFA pool temperature sensor (#1219)
- Added pulse analyzer support for read OOK data (#1216)
- Fixed ook input support bug from a9de888 (#1215)
- Fixed missing hop_time when reading file (#1211)
- Fixed Acurite 899 rain_mm conversion value (#1203)
- Fixed build files (#1201)
- Added more input format validation
- Changed FSK pulse detector mode option
- Fixed overlong msg in Radiohead (#1190)
- Added optional CSA checker to tests
- Added InfluxDB output (#1192)
- Fixed Hondaremote for missing first bit
- Fixed integer promotion for uint32_t fields (#1193)
- Fixed data format in ELV (#1187)
- Fixed closing brace bug in test bitbuffer (#1186)
- Fixed issue where bt_rain  decoder uses -1 as index
- Changed if the set frequency is > 800MHz then set sample rate to 1MS/s
- Added new minmax FSK pulse detector
- Added InfluxDB relay example script
- Fixed radiohead buffer underflow (#1181)
- Fixed range clamping on RSSI (#1179)
- Fixed unaligned sample buffer length (#1177)
- Fixed bad event return value in elantra (#1176)
- Fixed accounting if decoder misbehaves (#1175)
- Fixed ge_coloreffects undef behav (#1173)
- Added protocol selection to test bitbuffer input
- Added streaming test bitbuffers (#1062)
- Fixed parsing oversized bitbuffer (#1171)
- Added length check for interlogix device and update return codes (#1169)
- Added preamble check for microchip hcs200 to reduce false positives (#1170)
- Added unboxed types for data
- Added warnings on alloc failure
- Added alloc checks, fixes #1156
- Improved Compact doubles in mqtt devices topics
- Added Auriol-HG02832 support (#1166)
- Improved Honeywell for 2Gig, RE208 (#747)
- Changed Upgrade Mongoose 6.13+patches to 6.16+patches
- Fixed expand Efergy-e2CT exp range (#1163)
- Added RTL-SDR error code output
- Added Hyundai Elantra 2012 TPMS support (#1158)
- Added Norgo NGE101 support (#1042)
- Improved Convert read OOK pulse_data to current sample rate (#1160)
- Fixed Acurite 899 rain_mm format (#1154)
- Added gt_tmbbq05 parity check
- Changed GT-WT-03 added checksum (#1149)
- Changed Updated QUIGG GT-TMBBQ-05 with MIC
- Changed GT-TMBBQ-05 added ID, finetuned pulse lengths (#1152)
- Added Sonoff RM433 conf example (#1150)
- Added support for Globaltronics GT-WT-03 (#1149)
- Added support for QUIGG GT-TMBBQ-05 (#1151)
- Improved Reorder some keys, normalize some keys (#998)
- Improved Oregon Scientific V3 preamble match
- Added support for Oregon Scientific WGR800X (#1045)
- Added Integration docs
- Added RRD example script

## Release 19.08 (2019-08-29)

### Highlights

- Added MQTT output (#1016)
- Added stats reporting (#733)
- Added SoapySDR general keyword settings option, e.g. antenna
- Added new model keys option
- Changed Normalize odd general keys on devices (#1010)
- Changed Use battery_ok instead of battery for newmodel
- Added report model description option (#987)
- Added pulse data text file support (#967)
- Added color to console help output
- Fixed CF32 loader; addeded CS8, CF32 dumper

### Changed

- Added CurrentCost EnviR support (#1115)
- Added ESIC-EMT7170 power meter (#1132)
- Added LaCrosse-TX141Bv3 support (#1134)
- Added channel to inFactory-TH (#1133)
- Added man page rtl_433.1 (#1121)
- Added color to console help output
- Added support for Philips AJ7010 (#1047)
- Added frequency hopping signal support for win32 (#1128)
- Added Holman WS5029 decoder
- Added Acurite Rain 899 support
- Added support for Oregon scientific THGR328N and RTGR328N (#1107) (#1109)
- Added frequency hop on USR1 signal
- Added '-E hop' option
- Added option for multiple hop times
- Added sensor similar to GT-WT-02 (#1080)
- Added Rubicson 48659 Cooking Thermometer
- Added TFA Dostmann 30.3196 decoder (#983)
- Added support for HCS200 KeeLoq encoder (#1081)
- Added channel output to lacrosse_TX141TH_Bv2 (#1097)
- Added IKEA Sparsnäs decoder.
- Added support for Eurochron weather station sensor (#1090)
- Added MQTT topic format strings (#1079)
- Added two EV1527 based sample configurations (#1087)
- Added DirecTV RC66RX Remote Control
- Added support for Ecowitt temperature sensor
- Added Companion WTR001 decoder (#1055)
- Changed Thermopro TP12 also supports TP20 (#1061)
- Added configuration for PIR-EF4 sensor (#1049)
- Added Alecto WS-1200 v1/v2/DCF decoders to Fineoffset (#975)
- Added TS-FT002 decoder (#1015)
- Added Fine Offset WH32B support (#1040)
- Added LaCrosse-WS3600 support, change LaCrosse-WS to LaCrosse-WS2310
- Added LaCrosse WS7000 support (#1029) (#1030)
- Changed Omit humidity on Prologue if invalid
- Added MQTT output (#1016)
- Added stats reporting (#733)
- Added Interface Specification for data output (#827)
- Added checksum to Ambient Weather TX-8300
- Added Interlogix glassbreak subtype
- Added Jansite TPMS support (#1020)
- Added Oregon Scientific RTHN129 support (#941)
- Changed Use battery_ok instead of battery for newmodel
- Changed Update battery_low, temperatureN keys
- Changed Normalize odd general keys on devices (#1010)
- Fixed Efergy-e2 current reading exponent
- Added FS20 remote decoder (#999)
- Added SoapySDR general keyword settings option
- Added option to select antenna on SoapySDR devices (#968)
- Fixed CF32 loader; added CS8, CF32 dumper
- Added ASAN to Debug builds
- Changed tfa_twin_plus_30.3049: Add mic to output
- Added new model keys option
- Enhanced Kedsum, S3318, Esperanza with MIC (#985)
- Added support for XT300/XH300 soil moisture sensor (#946)
- Changed Schrader unit from bar to kPa
- Added report model description option (#987)
- Added native scale for SDRplay
- Added Chungear BCF-0019x2 example conf
- Changed GT-WT-02 to support newer timings; changed model name
- Added pulse data text file support (#967)
- Added Digitech XC0346 support to Fine Offset WH1050 (#922)
- Added bitbuffer NRZI(NRZS/NRZM) decodes
- Added Rosenborg/WH5 quirk to Fineoffset
- Added support for Silverline doorbells (#942)
- Changed TPMS Toyota to match shorter preamble
- Changed TPMS Citroen data readings
- Changed TPMS Renault data readings
- Added Digitech XC-0324 temperature sensor decoder (#849)
- Added sample rate switching
- Added Mongoose

## Release 18.12 (2018-12-16)

### Highlights

- Added conf file support with examples in etc/rtl_433/
- Default KV output has pretty colors on console
- Added meta data for levels, precision time, protocol, debug, tagging
- Added rtl_tcp input (#894)
- Added SoapySDR support with CU8/CS16/F32 input/output conversions (#842)
- Added VCD output, Sigrok pulseview converter

### Changed

- Install example conf files will to etc/rtl_433/
- Default output is terse with just the most important info
- Deprecate option q and D for new v to set verbosity
- Default KV output has pretty colors on console
- Added debug bits output option
- Added protocol number meta data option
- Added precision time and time report options (#905)
- Deprecate option t and I for new S none|all|unknown|known
- Changed to use pulse detect to track and grab frames
- Added rtl_tcp input (#894)
- Added bitrow debugging output helper
- Added bitbuffer_debug, bitrow_print, bitrow_debug
- Changed flex to use keys for all values (#885)
- Allow multiple input files, positional args are input files
- Added option for output tagging
- Added conf examples for generic SCV2260 and PT2260
- Added a conf file parser (#790)
- Added negative protocol numbers to disable a device
- Added Freq/RSSI/SNR output to data_acquired_handler (#865)
- Added flex suggestion to analyzer output, switch to unit of us
- Added null output option (suppress default KV)
- Added option to skip the tests to be built. (#832)
- Added SoapySDR support (#842)
- Added CU8/CS16 output conversion
- Improved dumpers to allow multiple dumpers
- Removed rtlsdr sync mode
- Added VCD output
- Added Sigrok pulseview converter
- Added f32 output modes
- Added flex getter (#786)
- Added version (-V) and help (-h) option (#810)
- Added example MS Visual Studio 2015 project (#789)
- Added CS16 input and output (#773)
- Added preamble option to flex decoder

### Added and improved devices

- Added Gust to Hideki, report proper mph (#891)
- Changed raincounter_raw field to rain_inch for acurite (#893)
- Removed EC3k, converted to flex conf
- Removed Valeo, converted to flex conf
- Removed Steffen, converted to flex conf
- Changed ELV-EM1000, ELV-WS2000 to structured output
- Changed X10-RF to structured output
- Changed Lightwave-RF to structured output
- Added confs ported from old devices
- Improved Fine Offset WH-3080 to support new version Watts/m value calculation
- Added support for Bresser Weather Center 5-in-1
- Added Biltema rain gauge protocol decoder, disabled by default
- Added ESA 1000/2000 protocol decoder
- Added support for Honeywell Wireless Doorbell
- Improved inFactory with added checks, enabled by default
- Added Maverick et73
- Added Ambient Weather WH31E (#882)
- Added AmbientWeather-TX8300 (TFA 30.3211.02) support
- Added Emos TTX201 (#782)
- Added Hideki / Cresta temperature sensor (#858)
- Added Fine Offset WH65B support (#845)
- Added AcuRite 3-n-1 (#720)
- Added PMV-107J TPMS (#825)
- Added Fine Offset WH65b support
- Added Fine Offset WH24 (#809)
- Added TP08 remote thermometer (#750)
- Added WT0124 Pool Thermometer
- Added Hyundai WS sensor (#779)
- Added M-Bus (EN 13757-4) - Data Link layer (#768)
- Improved RadioHead to unify the applications
- Added Sensible Living protocol (#742)
- Added Oregon Scientific UVR128 UV sensor (#738)
- Added Pacific PMV-C210 TMPS support (#717)
- Added SimpliSafe Sensor (#721)

## Release 18.05 (2018-05-02)

### Highlights

- Preparations for features like MQTT and SoapySDR
- Syslog for simple network output
- Rewritten demodulators to support a "precise" mode using a given tolerance and optional sync symbols
- Simplified data output layers

### Changed

- Added conversion hPA/inHG, kPa/PSI (#711)
- Added remote syslog output
- Added a flexible general purpose decoder (#647)
- Added git version info to usage output if available
- Added number suffixes on e.g. frequency, samplerate, duration, hoptime
- Added Profile build type using GPerfTools
- Changed grab file name to gNNN_FFFM_RRRk.cu8 (#642)
- Added option to use receiver serial number -d :SERIAL (#648)
- Added option to stop after outputting successful event(s)
- Changed to new data API
- Added option to verify simulated decoding of raw data

### Added and improved devices

- Added decoder for Dish Network UHF Remote 6.3 (#700)
- Added interlogix devices driver (#649)
- Added Euroster 3000TX, Elro DB270 (#683)
- Added x10_sec device for decoding X10 Security RF signals (#671)
- Added device LaCrosse TX141 support to lacrosse_TX141TH_Bv2.c (#670)
- Added GE Color Effects Remote indent and MAX_PROTOCOLS
- Added support for Telldus variants of fineoffset (#639)
- Added support to Oregon Scientific RTGN129
- Added device NEXA LMST-606 magnetic sensor
- Added support for Philips outdoor temperature sensor
- Added support for Ford car remote.
- Added support for the Thermopro TP-12.
- Added infactory sensor
- Added Renault TPMS sensor
- Added Ford TPMS sensor
- Added Toyota TPMS sensor
- Added GE Color Effects remote control
- Added Generic off-brand wireless motion sensor and alarm system
- Added Wireless Smoke and Heat Detector GS 558
- Added Solight TE44 wireless thermometer


================================================
FILE: CMakeLists.txt
================================================
########################################################################
# Project setup
########################################################################
cmake_minimum_required(VERSION 2.6...3.10)
# Fix behavior of CMAKE_C_STANDARD when targeting macOS.
if(POLICY CMP0025)
    cmake_policy(SET CMP0025 NEW)
endif()
# Only interpret if() arguments as variables or keywords when unquoted.
if(POLICY CMP0054)
    cmake_policy(SET CMP0054 NEW)
endif()

project(rtl433 C)

#select the release build type by default to get optimization flags
if(NOT CMAKE_BUILD_TYPE)
   set(CMAKE_BUILD_TYPE "Release")
   message(STATUS "Build type not specified: defaulting to release.")
endif(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "")

list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/Modules)

########################################################################
# Get version info from Git
########################################################################
include(GetGitRevisionDescription)
get_git_head_revision(GIT_REFSPEC GIT_COMMIT)
if(GIT_COMMIT) # is a git repo
    # shorten branch spec
    string(REGEX REPLACE ".*/" "" GIT_BRANCH "${GIT_REFSPEC}")
    # use lightweight (non-annotated) tags
    git_describe(GIT_VERSION "--tags" "--exclude=nightly")
    git_timestamp(GIT_TIMESTAMP)
    message(STATUS "Found Git version: ${GIT_REFSPEC} commit ${GIT_COMMIT} from ${GIT_TIMESTAMP_ISO}")
    message(STATUS "Using Git version tag: ${GIT_VERSION} on ${GIT_BRANCH} at ${GIT_TIMESTAMP}")
    ADD_DEFINITIONS(-DGIT_VERSION=${GIT_VERSION})
    ADD_DEFINITIONS(-DGIT_BRANCH=${GIT_BRANCH})
    ADD_DEFINITIONS(-DGIT_TIMESTAMP=${GIT_TIMESTAMP})
endif()

########################################################################
# Fallback to get release version info from Changelog
########################################################################
if(NOT GIT_COMMIT AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/CHANGELOG.md")
    # parse the CHANGELOG.md, this is clever, i.e. might go wrong ;)
    file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/CHANGELOG.md" CHANGELOG LIMIT_COUNT 42)
    # list(FILTER ...) needs CMake 3.6+
    foreach(item ${CHANGELOG})
        string(REGEX MATCH "^## Release (.+)" item ${item})
        if(CMAKE_MATCH_1)
            list(APPEND RELEASE_VERSIONS ${CMAKE_MATCH_1})
        endif()
    endforeach()
    if(RELEASE_VERSIONS)
        list(GET RELEASE_VERSIONS 0 RELEASE_VERSION)
        message(STATUS "Found Release version: ${RELEASE_VERSION}")
        ADD_DEFINITIONS(-DGIT_VERSION=${RELEASE_VERSION})
    endif()
endif()

########################################################################
# Compiler specific setup
########################################################################
set(CMAKE_C_EXTENSIONS OFF)
set(CMAKE_C_STANDARD 99)
if(("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_C_COMPILER_ID}" MATCHES "Clang") AND NOT WIN32)
    ADD_DEFINITIONS(-Wall)
    ADD_DEFINITIONS(-Wextra)
    ADD_DEFINITIONS(-Wvla)
    ADD_DEFINITIONS(-Wsign-compare)
    ADD_DEFINITIONS(-std=c99)
    ADD_DEFINITIONS(-pedantic)
    ADD_DEFINITIONS(-Wshadow)
    ADD_DEFINITIONS(-Wmissing-prototypes)
    if("${CMAKE_C_COMPILER_ID}" MATCHES "Clang" OR NOT "7.0.0" VERSION_GREATER CMAKE_C_COMPILER_VERSION)
        ADD_DEFINITIONS(-Wimplicit-fallthrough)
    endif()
    #ADD_DEFINITIONS(-Wfloat-equal)
    #ADD_DEFINITIONS(-Wbad-function-cast)
    #ADD_DEFINITIONS(-Wdocumentation)
    add_definitions(-Wno-deprecated-declarations)

    # for strdup, setenv, use either
    #ADD_DEFINITIONS(-D_POSIX_C_SOURCE=200809) # does not work with uClibc
    ADD_DEFINITIONS(-D_GNU_SOURCE)
    #http://gcc.gnu.org/wiki/Visibility
    add_definitions(-fvisibility=hidden)

    # CMake Release default for GCC/Clang is "-O3 -DNDEBUG"
    # set(CMAKE_C_FLAGS_RELEASE -O2)
    # CMake Debug default for GCC/Clang is "-g -DNDEBUG"
    # set(CMAKE_C_FLAGS_DEBUG -g3 -O0)
    # make use of ASAN
    set(CMAKE_C_FLAGS_DEBUG "-ggdb -fsanitize=undefined -fsanitize=address -fno-omit-frame-pointer")
endif()
if("${CMAKE_C_COMPILER_ID}" MATCHES "Clang")
    # make sure we don't accidentally copy more than an int
    ADD_DEFINITIONS(-Wlarge-by-value-copy=8)
endif()

# Enable Static analysis on GCC13.2.0+
if("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" AND NOT "13.2.0" VERSION_GREATER CMAKE_C_COMPILER_VERSION)
    message(STATUS "Using GCC Static analysis")
    add_definitions(-fanalyzer)
endif()

# Shut MSVC up about strdup and strtok
if(MSVC)
    ADD_DEFINITIONS(-D_CRT_NONSTDC_NO_DEPRECATE)
    ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
    ADD_DEFINITIONS(-DNOMINMAX)
    # don't warn on type truncation
    add_compile_options("/wd4244")
    add_compile_options("/wd4267")
    add_compile_options("/wd4305")
endif()

# Fix printf %zu
if(MINGW)
    add_definitions(-D__USE_MINGW_ANSI_STDIO)
endif()

# Make sure we get M_PI
if(WIN32)
    add_definitions(-D_USE_MATH_DEFINES)
endif()

# On Unix pass the SYSCONFDIR through to conf file loader
if(NOT WIN32)
    include(GNUInstallDirs)
    add_definitions(-DINSTALL_SYSCONFDIR=${CMAKE_INSTALL_FULL_SYSCONFDIR})
endif()

########################################################################
# Use pkg-config
########################################################################
find_package(PkgConfig)

########################################################################
# Option to force ANSI-colored build output (for Ninja)
########################################################################
option(FORCE_COLORED_BUILD "Always produce ANSI-colored build output (GNU/Clang only)." FALSE)
if(FORCE_COLORED_BUILD)
    if("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU")
       add_compile_options(-fdiagnostics-color=always)
    elseif("${CMAKE_C_COMPILER_ID}" MATCHES "Clang")
       add_compile_options(-fcolor-diagnostics)
    endif()
endif()

########################################################################
# Enable IPv6 support
########################################################################
option(ENABLE_IPV6 "Enable IPv6 support" TRUE)
if(ENABLE_IPV6)
    message(STATUS "IPv6 support enabled.")
    ADD_DEFINITIONS(-DMG_ENABLE_IPV6=1)
    if(MINGW)
        # IPv6 requires at least Vista for inet_pton, inet_ntop
        add_definitions(-D_WIN32_WINNT=0x0600)
    endif()
else()
    message(STATUS "IPv6 support disabled.")
endif()

########################################################################
# Find Threads support build dependencies
########################################################################
set(ENABLE_THREADS AUTO CACHE STRING "Enable Threads support")
set_property(CACHE ENABLE_THREADS PROPERTY STRINGS AUTO ON OFF)
if(ENABLE_THREADS) # AUTO / ON

find_package(Threads)
if(Threads_FOUND)
    message(STATUS "Threads support will be compiled.")
    ADD_DEFINITIONS(-DTHREADS)
elseif(ENABLE_THREADS STREQUAL "AUTO")
    message(STATUS "Threads support not found, some features will be disabled.")
else()
    message(FATAL_ERROR "Threads support not found.")
endif()

else()
    message(STATUS "Threads support disabled.")
endif()

########################################################################
# Find OpenSSL build dependencies
########################################################################
set(ENABLE_OPENSSL AUTO CACHE STRING "Enable OpenSSL TLS support")
set_property(CACHE ENABLE_OPENSSL PROPERTY STRINGS AUTO ON OFF)
if(ENABLE_OPENSSL) # AUTO / ON

find_package(OpenSSL)
# Get actual libs from pkg-config to support edge cases (static on Sparc)
# This will break Win32 builds, exclude that platform
pkg_check_modules(PC_OPENSSL QUIET openssl)
if(PC_OPENSSL_FOUND AND NOT WIN32)
    set(OPENSSL_LIBRARIES ${PC_OPENSSL_LINK_LIBRARIES})
    message(STATUS "Using OpenSSL: ${OPENSSL_LIBRARIES}")
endif()
if(OPENSSL_FOUND)
    message(STATUS "OpenSSL TLS support will be compiled. Found version ${OPENSSL_VERSION}")
    include_directories(${OPENSSL_INCLUDE_DIR})
    list(APPEND SDR_LIBRARIES ${OPENSSL_LIBRARIES})
    ADD_DEFINITIONS(-DOPENSSL)
    ADD_DEFINITIONS(-DMG_ENABLE_SSL)
elseif(ENABLE_OPENSSL STREQUAL "AUTO")
    message(STATUS "OpenSSL development files not found, TLS won't be possible.")
else()
    message(FATAL_ERROR "OpenSSL development files not found.")
endif()

else()
    message(STATUS "OpenSSL TLS disabled.")
endif()

########################################################################
# Find LibRTLSDR build dependencies
########################################################################
set(ENABLE_RTLSDR ON CACHE STRING "Enable RTL-SDR (lbrtlsdr) driver support")
set_property(CACHE ENABLE_RTLSDR PROPERTY STRINGS AUTO ON OFF)
if(ENABLE_RTLSDR) # AUTO / ON

find_package(LibRTLSDR)
find_package(LibUSB)
if(LibRTLSDR_FOUND)
    message(STATUS "RTL-SDR device input will be compiled. Found version ${LibRTLSDR_VERSION}")
    include_directories(${LibRTLSDR_INCLUDE_DIRS})
    list(APPEND SDR_LIBRARIES ${LibRTLSDR_LIBRARIES})
    ADD_DEFINITIONS(-DRTLSDR)

if(LibUSB_FOUND)
    message(STATUS "libusb-1.0 error messages are available. Found version ${LibUSB_VERSION}")
    include_directories(${LibUSB_INCLUDE_DIRS})
    list(APPEND SDR_LIBRARIES ${LibUSB_LIBRARIES})
    ADD_DEFINITIONS(-DLIBUSB1)
else()
    message(STATUS "libusb-1.0 error messages are not available.")
endif()

elseif(ENABLE_RTLSDR STREQUAL "AUTO")
    message(STATUS "RTL-SDR development files not found, RTL-SDR device input won't be possible.")
else()
    message(FATAL_ERROR "RTL-SDR development files not found.")
endif()

else()
    message(STATUS "RTL-SDR device input disabled.")
endif()

########################################################################
# Find SoapySDR build dependencies
########################################################################
set(ENABLE_SOAPYSDR AUTO CACHE STRING "Enable SoapySDR driver support")
set_property(CACHE ENABLE_SOAPYSDR PROPERTY STRINGS AUTO ON OFF)
if(ENABLE_SOAPYSDR) # AUTO / ON

find_package(SoapySDR "0.6" NO_MODULE)
if(SoapySDR_FOUND)
    message(STATUS "SoapySDR device input will be compiled. Found version ${SoapySDR_VERSION}")
    include_directories(${SoapySDR_INCLUDE_DIRS})
    list(APPEND SDR_LIBRARIES ${SoapySDR_LIBRARIES})
    ADD_DEFINITIONS(-DSOAPYSDR)
elseif(ENABLE_SOAPYSDR STREQUAL "AUTO")
    message(STATUS "SoapySDR development files not found, SoapySDR device input won't be possible.")
else()
    message(FATAL_ERROR "SoapySDR development files not found.")
endif()

else()
    message(STATUS "SoapySDR device input disabled.")
endif()

########################################################################
# Setup optional Profiling with GPerfTools
########################################################################
# cmake -DCMAKE_BUILD_TYPE=Profile ..
# CPUPROFILE=prof.out ./src/rtl_433 ...
# pprof -text ./src/rtl_433 prof.out
if("${CMAKE_BUILD_TYPE}" STREQUAL "Profile")
    message(STATUS "Build type set to Profile. Linking GPerfTools.")
    find_package(Gperftools REQUIRED)
    include_directories(${GPERFTOOLS_INCLUDE_DIR})
    list(APPEND SDR_LIBRARIES ${GPERFTOOLS_LIBRARIES} -Wl,-no_pie)
    ADD_DEFINITIONS(-g)
    ADD_DEFINITIONS(-fno-builtin-malloc)
    ADD_DEFINITIONS(-fno-builtin-calloc)
    ADD_DEFINITIONS(-fno-builtin-realloc)
    ADD_DEFINITIONS(-fno-builtin-free)
endif()

########################################################################
# Setup the include and linker paths
########################################################################
if(MINGW OR MSVC)
list(APPEND NET_LIBRARIES ws2_32 mswsock netapi32)
endif()

include_directories(
    BEFORE
    ${PROJECT_SOURCE_DIR}/include
)

########################################################################
# Create uninstall target
########################################################################
configure_file(
    ${PROJECT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in
    ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake
@ONLY)

add_custom_target(uninstall
    ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake
)

########################################################################
# Build documentation with Doxygen
########################################################################
option(BUILD_DOCUMENTATION "Create and install the HTML based API
documentation (requires Doxygen)" OFF)

find_package(Doxygen)
if(BUILD_DOCUMENTATION)
    if(NOT DOXYGEN_FOUND)
        message(FATAL_ERROR "Doxygen is needed to build the documentation.")
    endif()

    set(DOXYGEN_IN ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in)
    set(DOXYGEN_OUT ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)
    if(DOXYGEN_DOT_FOUND)
        set(HAVE_DOT "YES")
    else()
        set(HAVE_DOT "NO")
    endif()

    configure_file(${DOXYGEN_IN} ${DOXYGEN_OUT} @ONLY)
    message(STATUS "Doxygen build started")

    # note the option ALL which allows to build the docs together with the application
    add_custom_target(doc_doxygen ALL
        COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_OUT}
        WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
        COMMENT "Generating API documentation with Doxygen"
        VERBATIM)
    #    install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/doc/html DESTINATION share/doc)
endif()

########################################################################
# Build tests with analyzer
########################################################################
option(BUILD_TESTING_ANALYZER "Build the testing tree with static
analyzer (requires Clang)" OFF)

########################################################################
# Build tests
########################################################################
include(CTest) # note: this adds a BUILD_TESTING which defaults to ON

########################################################################
# Add subdirectories
########################################################################
add_subdirectory(include)
add_subdirectory(src)
if(BUILD_TESTING)
    add_subdirectory(tests)
endif(BUILD_TESTING)
add_subdirectory(conf)

# use space-separation format for the pc file
STRING(REPLACE ";" " " RTL433_PC_CFLAGS "${RTL433_PC_CFLAGS}")
STRING(REPLACE ";" " " RTL433_PC_LIBS "${RTL433_PC_LIBS}")

# unset these vars to avoid hard-coded paths to cross environment
IF(CMAKE_CROSSCOMPILING)
    UNSET(RTL433_PC_CFLAGS)
    UNSET(RTL433_PC_LIBS)
ENDIF(CMAKE_CROSSCOMPILING)

set(prefix ${CMAKE_INSTALL_PREFIX})
set(exec_prefix \${prefix})
set(libdir \${exec_prefix}/lib)
set(includedir \${prefix}/include)

INSTALL(
    FILES
    DESTINATION lib/pkgconfig
)

install(DIRECTORY man
    DESTINATION share
    PATTERN ".md" EXCLUDE)


================================================
FILE: COPYING
================================================
		    GNU GENERAL PUBLIC LICENSE
		       Version 2, June 1991

 Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

			    Preamble

  The licenses for most software are designed to take away your
freedom to share and change it.  By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users.  This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it.  (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.)  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.

  To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have.  You must make sure that they, too, receive or can get the
source code.  And you must show them these terms so they know their
rights.

  We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.

  Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software.  If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.

  Finally, any free program is threatened constantly by software
patents.  We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary.  To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.

  The precise terms and conditions for copying, distribution and
modification follow.

		    GNU GENERAL PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License.  The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language.  (Hereinafter, translation is included without limitation in
the term "modification".)  Each licensee is addressed as "you".

Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope.  The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.

  1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.

You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.

  2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:

    a) You must cause the modified files to carry prominent notices
    stating that you changed the files and the date of any change.

    b) You must cause any work that you distribute or publish, that in
    whole or in part contains or is derived from the Program or any
    part thereof, to be licensed as a whole at no charge to all third
    parties under the terms of this License.

    c) If the modified program normally reads commands interactively
    when run, you must cause it, when started running for such
    interactive use in the most ordinary way, to print or display an
    announcement including an appropriate copyright notice and a
    notice that there is no warranty (or else, saying that you provide
    a warranty) and that users may redistribute the program under
    these conditions, and telling the user how to view a copy of this
    License.  (Exception: if the Program itself is interactive but
    does not normally print such an announcement, your work based on
    the Program is not required to print an announcement.)

These requirements apply to the modified work as a whole.  If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works.  But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.

Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.

In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.

  3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:

    a) Accompany it with the complete corresponding machine-readable
    source code, which must be distributed under the terms of Sections
    1 and 2 above on a medium customarily used for software interchange; or,

    b) Accompany it with a written offer, valid for at least three
    years, to give any third party, for a charge no more than your
    cost of physically performing source distribution, a complete
    machine-readable copy of the corresponding source code, to be
    distributed under the terms of Sections 1 and 2 above on a medium
    customarily used for software interchange; or,

    c) Accompany it with the information you received as to the offer
    to distribute corresponding source code.  (This alternative is
    allowed only for noncommercial distribution and only if you
    received the program in object code or executable form with such
    an offer, in accord with Subsection b above.)

The source code for a work means the preferred form of the work for
making modifications to it.  For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable.  However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.

If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.

  4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License.  Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.

  5. You are not required to accept this License, since you have not
signed it.  However, nothing else grants you permission to modify or
distribute the Program or its derivative works.  These actions are
prohibited by law if you do not accept this License.  Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.

  6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions.  You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.

  7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all.  For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.

If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.

It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices.  Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.

This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.

  8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded.  In such case, this License incorporates
the limitation as if written in the body of this License.

  9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

Each version is given a distinguishing version number.  If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation.  If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.

  10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission.  For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this.  Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.

			    NO WARRANTY

  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.

  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.

		     END OF TERMS AND CONDITIONS

	    How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License along
    with this program; if not, write to the Free Software Foundation, Inc.,
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

Also add information on how to contact you by electronic and paper mail.

If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:

    Gnomovision version 69, Copyright (C) year name of author
    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.

You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary.  Here is a sample; alter the names:

  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
  `Gnomovision' (which makes passes at compilers) written by James Hacker.

  <signature of Ty Coon>, 1 April 1989
  Ty Coon, President of Vice

This General Public License does not permit incorporating your program into
proprietary programs.  If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library.  If this is what you want to do, use the GNU Lesser General
Public License instead of this License.


================================================
FILE: Doxyfile.in
================================================
# Doxyfile 1.8.16

# This file describes the settings to be used by the documentation system
# doxygen (www.doxygen.org) for a project.
#
# All text after a double hash (##) is considered a comment and is placed in
# front of the TAG it is preceding.
#
# All text after a single hash (#) is considered a comment and will be ignored.
# The format is:
# TAG = value [value, ...]
# For lists, items can also be appended using:
# TAG += value [value, ...]
# Values that contain spaces should be placed between quotes (\" \").

#---------------------------------------------------------------------------
# Project related configuration options
#---------------------------------------------------------------------------

# This tag specifies the encoding used for all characters in the configuration
# file that follow. The default is UTF-8 which is also the encoding used for all
# text before the first occurrence of this tag. Doxygen uses libiconv (or the
# iconv built into libc) for the transcoding. See
# https://www.gnu.org/software/libiconv/ for the list of possible encodings.
# The default value is: UTF-8.

DOXYFILE_ENCODING      = UTF-8

# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
# double-quotes, unless you are using Doxywizard) that should identify the
# project for which the documentation is generated. This name is used in the
# title of most generated pages and in a few other places.
# The default value is: My Project.

PROJECT_NAME           = rtl433

# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
# could be handy for archiving the generated documentation or if some version
# control system is used.

PROJECT_NUMBER         = @VERSION@

# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer a
# quick idea about the purpose of the project. Keep the description short.

PROJECT_BRIEF          = "RTL-433 utility"

# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
# in the documentation. The maximum height of the logo should not exceed 55
# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
# the logo to the output directory.

PROJECT_LOGO           =

# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
# into which the generated documentation will be written. If a relative path is
# entered, it will be relative to the location where doxygen was started. If
# left blank the current directory will be used.

OUTPUT_DIRECTORY       = @CMAKE_CURRENT_BINARY_DIR@/doc

# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
# directories (in 2 levels) under the output directory of each output format and
# will distribute the generated files over these directories. Enabling this
# option can be useful when feeding doxygen a huge amount of source files, where
# putting all generated files in the same directory would otherwise causes
# performance problems for the file system.
# The default value is: NO.

CREATE_SUBDIRS         = NO

# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
# characters to appear in the names of generated files. If set to NO, non-ASCII
# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
# U+3044.
# The default value is: NO.

ALLOW_UNICODE_NAMES    = NO

# The OUTPUT_LANGUAGE tag is used to specify the language in which all
# documentation generated by doxygen is written. Doxygen will use this
# information to generate all constant output in the proper language.
# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
# Ukrainian and Vietnamese.
# The default value is: English.

OUTPUT_LANGUAGE        = English

# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
# descriptions after the members that are listed in the file and class
# documentation (similar to Javadoc). Set to NO to disable this.
# The default value is: YES.

BRIEF_MEMBER_DESC      = YES

# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
# description of a member or function before the detailed description
#
# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
# brief descriptions will be completely suppressed.
# The default value is: YES.

REPEAT_BRIEF           = YES

# This tag implements a quasi-intelligent brief description abbreviator that is
# used to form the text in various listings. Each string in this list, if found
# as the leading text of the brief description, will be stripped from the text
# and the result, after processing the whole list, is used as the annotated
# text. Otherwise, the brief description is used as-is. If left blank, the
# following values are used ($name is automatically replaced with the name of
# the entity):The $name class, The $name widget, The $name file, is, provides,
# specifies, contains, represents, a, an and the.

ABBREVIATE_BRIEF       =

# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
# doxygen will generate a detailed section even if there is only a brief
# description.
# The default value is: NO.

ALWAYS_DETAILED_SEC    = NO

# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
# inherited members of a class in the documentation of that class as if those
# members were ordinary class members. Constructors, destructors and assignment
# operators of the base classes will not be shown.
# The default value is: NO.

INLINE_INHERITED_MEMB  = NO

# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
# before files name in the file list and in the header files. If set to NO the
# shortest path that makes the file name unique will be used
# The default value is: YES.

FULL_PATH_NAMES        = YES

# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
# Stripping is only done if one of the specified strings matches the left-hand
# part of the path. The tag can be used to show relative paths in the file list.
# If left blank the directory from which doxygen is run is used as the path to
# strip.
#
# Note that you can specify absolute paths here, but also relative paths, which
# will be relative from the directory where doxygen is started.
# This tag requires that the tag FULL_PATH_NAMES is set to YES.

STRIP_FROM_PATH        =

# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
# path mentioned in the documentation of a class, which tells the reader which
# header file to include in order to use a class. If left blank only the name of
# the header file containing the class definition is used. Otherwise one should
# specify the list of include paths that are normally passed to the compiler
# using the -I flag.

STRIP_FROM_INC_PATH    =

# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
# less readable) file names. This can be useful is your file systems doesn't
# support long names like on DOS, Mac, or CD-ROM.
# The default value is: NO.

SHORT_NAMES            = NO

# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
# first line (until the first dot) of a Javadoc-style comment as the brief
# description. If set to NO, the Javadoc-style will behave just like regular Qt-
# style comments (thus requiring an explicit @brief command for a brief
# description.)
# The default value is: NO.

JAVADOC_AUTOBRIEF      = YES

# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line
# such as
# /***************
# as being the beginning of a Javadoc-style comment "banner". If set to NO, the
# Javadoc-style will behave just like regular comments and it will not be
# interpreted by doxygen.
# The default value is: NO.

JAVADOC_BANNER         = NO

# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
# line (until the first dot) of a Qt-style comment as the brief description. If
# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
# requiring an explicit \brief command for a brief description.)
# The default value is: NO.

QT_AUTOBRIEF           = NO

# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
# a brief description. This used to be the default behavior. The new default is
# to treat a multi-line C++ comment block as a detailed description. Set this
# tag to YES if you prefer the old behavior instead.
#
# Note that setting this tag to YES also means that rational rose comments are
# not recognized any more.
# The default value is: NO.

MULTILINE_CPP_IS_BRIEF = NO

# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
# documentation from any documented member that it re-implements.
# The default value is: YES.

INHERIT_DOCS           = YES

# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
# page for each member. If set to NO, the documentation of a member will be part
# of the file/class/namespace that contains it.
# The default value is: NO.

SEPARATE_MEMBER_PAGES  = NO

# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
# uses this value to replace tabs by spaces in code fragments.
# Minimum value: 1, maximum value: 16, default value: 4.

TAB_SIZE               = 8

# This tag can be used to specify a number of aliases that act as commands in
# the documentation. An alias has the form:
# name=value
# For example adding
# "sideeffect=@par Side Effects:\n"
# will allow you to put the command \sideeffect (or @sideeffect) in the
# documentation, which will result in a user-defined paragraph with heading
# "Side Effects:". You can put \n's in the value part of an alias to insert
# newlines (in the resulting output). You can put ^^ in the value part of an
# alias to insert a newline as if a physical newline was in the original file.
# When you need a literal { or } or , in the value part of an alias you have to
# escape them by means of a backslash (\), this can lead to conflicts with the
# commands \{ and \} for these it is advised to use the version @{ and @} or use
# a double escape (\\{ and \\})

ALIASES                =

# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
# only. Doxygen will then generate output that is more tailored for C. For
# instance, some of the names that are used will be different. The list of all
# members will be omitted, etc.
# The default value is: NO.

OPTIMIZE_OUTPUT_FOR_C  = YES

# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
# Python sources only. Doxygen will then generate output that is more tailored
# for that language. For instance, namespaces will be presented as packages,
# qualified scopes will look different, etc.
# The default value is: NO.

OPTIMIZE_OUTPUT_JAVA   = NO

# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
# sources. Doxygen will then generate output that is tailored for Fortran.
# The default value is: NO.

OPTIMIZE_FOR_FORTRAN   = NO

# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
# sources. Doxygen will then generate output that is tailored for VHDL.
# The default value is: NO.

OPTIMIZE_OUTPUT_VHDL   = NO

# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice
# sources only. Doxygen will then generate output that is more tailored for that
# language. For instance, namespaces will be presented as modules, types will be
# separated into more groups, etc.
# The default value is: NO.

OPTIMIZE_OUTPUT_SLICE  = NO

# Doxygen selects the parser to use depending on the extension of the files it
# parses. With this tag you can assign which parser to use for a given
# extension. Doxygen has a built-in mapping, but you can override or extend it
# using this tag. The format is ext=language, where ext is a file extension, and
# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice,
# Fortran (fixed format Fortran: FortranFixed, free formatted Fortran:
# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser
# tries to guess whether the code is fixed or free formatted code, this is the
# default for Fortran type files), VHDL, tcl. For instance to make doxygen treat
# .inc files as Fortran files (default is PHP), and .f files as C (default is
# Fortran), use: inc=Fortran f=C.
#
# Note: For files without extension you can use no_extension as a placeholder.
#
# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
# the files are not read by doxygen.

EXTENSION_MAPPING      =

# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
# according to the Markdown format, which allows for more readable
# documentation. See https://daringfireball.net/projects/markdown/ for details.
# The output of markdown processing is further processed by doxygen, so you can
# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
# case of backward compatibilities issues.
# The default value is: YES.

MARKDOWN_SUPPORT       = YES

# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up
# to that level are automatically included in the table of contents, even if
# they do not have an id attribute.
# Note: This feature currently applies only to Markdown headings.
# Minimum value: 0, maximum value: 99, default value: 5.
# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.

TOC_INCLUDE_HEADINGS   = 0

# When enabled doxygen tries to link words that correspond to documented
# classes, or namespaces to their corresponding documentation. Such a link can
# be prevented in individual cases by putting a % sign in front of the word or
# globally by setting AUTOLINK_SUPPORT to NO.
# The default value is: YES.

AUTOLINK_SUPPORT       = YES

# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
# to include (a tag file for) the STL sources as input, then you should set this
# tag to YES in order to let doxygen match functions declarations and
# definitions whose arguments contain STL classes (e.g. func(std::string);
# versus func(std::string) {}). This also make the inheritance and collaboration
# diagrams that involve STL classes more complete and accurate.
# The default value is: NO.

BUILTIN_STL_SUPPORT    = NO

# If you use Microsoft's C++/CLI language, you should set this option to YES to
# enable parsing support.
# The default value is: NO.

CPP_CLI_SUPPORT        = NO

# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen
# will parse them like normal C++ but will assume all classes use public instead
# of private inheritance when no explicit protection keyword is present.
# The default value is: NO.

SIP_SUPPORT            = NO

# For Microsoft's IDL there are propget and propput attributes to indicate
# getter and setter methods for a property. Setting this option to YES will make
# doxygen to replace the get and set methods by a property in the documentation.
# This will only work if the methods are indeed getting or setting a simple
# type. If this is not the case, or you want to show the methods anyway, you
# should set this option to NO.
# The default value is: YES.

IDL_PROPERTY_SUPPORT   = YES

# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
# tag is set to YES then doxygen will reuse the documentation of the first
# member in the group (if any) for the other members of the group. By default
# all members of a group must be documented explicitly.
# The default value is: NO.

DISTRIBUTE_GROUP_DOC   = NO

# If one adds a struct or class to a group and this option is enabled, then also
# any nested class or struct is added to the same group. By default this option
# is disabled and one has to add nested compounds explicitly via \ingroup.
# The default value is: NO.

GROUP_NESTED_COMPOUNDS = NO

# Set the SUBGROUPING tag to YES to allow class member groups of the same type
# (for instance a group of public functions) to be put as a subgroup of that
# type (e.g. under the Public Functions section). Set it to NO to prevent
# subgrouping. Alternatively, this can be done per class using the
# \nosubgrouping command.
# The default value is: YES.

SUBGROUPING            = YES

# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
# are shown inside the group in which they are included (e.g. using \ingroup)
# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
# and RTF).
#
# Note that this feature does not work in combination with
# SEPARATE_MEMBER_PAGES.
# The default value is: NO.

INLINE_GROUPED_CLASSES = NO

# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
# with only public data fields or simple typedef fields will be shown inline in
# the documentation of the scope in which they are defined (i.e. file,
# namespace, or group documentation), provided this scope is documented. If set
# to NO, structs, classes, and unions are shown on a separate page (for HTML and
# Man pages) or section (for LaTeX and RTF).
# The default value is: NO.

INLINE_SIMPLE_STRUCTS  = NO

# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
# enum is documented as struct, union, or enum with the name of the typedef. So
# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
# with name TypeT. When disabled the typedef will appear as a member of a file,
# namespace, or class. And the struct will be named TypeS. This can typically be
# useful for C code in case the coding convention dictates that all compound
# types are typedef'ed and only the typedef is referenced, never the tag name.
# The default value is: NO.

TYPEDEF_HIDES_STRUCT   = NO

# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
# cache is used to resolve symbols given their name and scope. Since this can be
# an expensive process and often the same symbol appears multiple times in the
# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
# doxygen will become slower. If the cache is too large, memory is wasted. The
# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
# symbols. At the end of a run doxygen will report the cache usage and suggest
# the optimal cache size from a speed point of view.
# Minimum value: 0, maximum value: 9, default value: 0.

LOOKUP_CACHE_SIZE      = 0

#---------------------------------------------------------------------------
# Build related configuration options
#---------------------------------------------------------------------------

# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
# documentation are documented, even if no documentation was available. Private
# class members and static file members will be hidden unless the
# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
# Note: This will also disable the warnings about undocumented members that are
# normally produced when WARNINGS is set to YES.
# The default value is: NO.

EXTRACT_ALL            = YES

# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
# be included in the documentation.
# The default value is: NO.

EXTRACT_PRIVATE        = NO

# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual
# methods of a class will be included in the documentation.
# The default value is: NO.

EXTRACT_PRIV_VIRTUAL   = NO

# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
# scope will be included in the documentation.
# The default value is: NO.

EXTRACT_PACKAGE        = NO

# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
# included in the documentation.
# The default value is: NO.

EXTRACT_STATIC         = YES

# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
# locally in source files will be included in the documentation. If set to NO,
# only classes defined in header files are included. Does not have any effect
# for Java sources.
# The default value is: YES.

EXTRACT_LOCAL_CLASSES  = YES

# This flag is only useful for Objective-C code. If set to YES, local methods,
# which are defined in the implementation section but not in the interface are
# included in the documentation. If set to NO, only methods in the interface are
# included.
# The default value is: NO.

EXTRACT_LOCAL_METHODS  = NO

# If this flag is set to YES, the members of anonymous namespaces will be
# extracted and appear in the documentation as a namespace called
# 'anonymous_namespace{file}', where file will be replaced with the base name of
# the file that contains the anonymous namespace. By default anonymous namespace
# are hidden.
# The default value is: NO.

EXTRACT_ANON_NSPACES   = NO

# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
# undocumented members inside documented classes or files. If set to NO these
# members will be included in the various overviews, but no documentation
# section is generated. This option has no effect if EXTRACT_ALL is enabled.
# The default value is: NO.

HIDE_UNDOC_MEMBERS     = NO

# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
# undocumented classes that are normally visible in the class hierarchy. If set
# to NO, these classes will be included in the various overviews. This option
# has no effect if EXTRACT_ALL is enabled.
# The default value is: NO.

HIDE_UNDOC_CLASSES     = NO

# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
# (class|struct|union) declarations. If set to NO, these declarations will be
# included in the documentation.
# The default value is: NO.

HIDE_FRIEND_COMPOUNDS  = NO

# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
# documentation blocks found inside the body of a function. If set to NO, these
# blocks will be appended to the function's detailed documentation block.
# The default value is: NO.

HIDE_IN_BODY_DOCS      = NO

# The INTERNAL_DOCS tag determines if documentation that is typed after a
# \internal command is included. If the tag is set to NO then the documentation
# will be excluded. Set it to YES to include the internal documentation.
# The default value is: NO.

INTERNAL_DOCS          = NO

# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
# names in lower-case letters. If set to YES, upper-case letters are also
# allowed. This is useful if you have classes or files whose names only differ
# in case and if your file system supports case sensitive file names. Windows
# (including Cygwin) ands Mac users are advised to set this option to NO.
# The default value is: system dependent.

CASE_SENSE_NAMES       = YES

# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
# their full class and namespace scopes in the documentation. If set to YES, the
# scope will be hidden.
# The default value is: NO.

HIDE_SCOPE_NAMES       = NO

# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
# append additional text to a page's title, such as Class Reference. If set to
# YES the compound reference will be hidden.
# The default value is: NO.

HIDE_COMPOUND_REFERENCE= NO

# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
# the files that are included by a file in the documentation of that file.
# The default value is: YES.

SHOW_INCLUDE_FILES     = YES

# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
# grouped member an include statement to the documentation, telling the reader
# which file to include in order to use the member.
# The default value is: NO.

SHOW_GROUPED_MEMB_INC  = NO

# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
# files with double quotes in the documentation rather than with sharp brackets.
# The default value is: NO.

FORCE_LOCAL_INCLUDES   = NO

# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
# documentation for inline members.
# The default value is: YES.

INLINE_INFO            = YES

# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
# (detailed) documentation of file and class members alphabetically by member
# name. If set to NO, the members will appear in declaration order.
# The default value is: YES.

SORT_MEMBER_DOCS       = YES

# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
# descriptions of file, namespace and class members alphabetically by member
# name. If set to NO, the members will appear in declaration order. Note that
# this will also influence the order of the classes in the class list.
# The default value is: NO.

SORT_BRIEF_DOCS        = NO

# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
# (brief and detailed) documentation of class members so that constructors and
# destructors are listed first. If set to NO the constructors will appear in the
# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
# member documentation.
# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
# detailed member documentation.
# The default value is: NO.

SORT_MEMBERS_CTORS_1ST = NO

# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
# of group names into alphabetical order. If set to NO the group names will
# appear in their defined order.
# The default value is: NO.

SORT_GROUP_NAMES       = NO

# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
# fully-qualified names, including namespaces. If set to NO, the class list will
# be sorted only by class name, not including the namespace part.
# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
# Note: This option applies only to the class list, not to the alphabetical
# list.
# The default value is: NO.

SORT_BY_SCOPE_NAME     = NO

# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
# type resolution of all parameters of a function it will reject a match between
# the prototype and the implementation of a member function even if there is
# only one candidate or it is obvious which candidate to choose by doing a
# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
# accept a match between prototype and implementation in such cases.
# The default value is: NO.

STRICT_PROTO_MATCHING  = NO

# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
# list. This list is created by putting \todo commands in the documentation.
# The default value is: YES.

GENERATE_TODOLIST      = YES

# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
# list. This list is created by putting \test commands in the documentation.
# The default value is: YES.

GENERATE_TESTLIST      = YES

# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
# list. This list is created by putting \bug commands in the documentation.
# The default value is: YES.

GENERATE_BUGLIST       = YES

# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
# the deprecated list. This list is created by putting \deprecated commands in
# the documentation.
# The default value is: YES.

GENERATE_DEPRECATEDLIST= YES

# The ENABLED_SECTIONS tag can be used to enable conditional documentation
# sections, marked by \if <section_label> ... \endif and \cond <section_label>
# ... \endcond blocks.

ENABLED_SECTIONS       =

# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
# initial value of a variable or macro / define can have for it to appear in the
# documentation. If the initializer consists of more lines than specified here
# it will be hidden. Use a value of 0 to hide initializers completely. The
# appearance of the value of individual variables and macros / defines can be
# controlled using \showinitializer or \hideinitializer command in the
# documentation regardless of this setting.
# Minimum value: 0, maximum value: 10000, default value: 30.

MAX_INITIALIZER_LINES  = 30

# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
# the bottom of the documentation of classes and structs. If set to YES, the
# list will mention the files that were used to generate the documentation.
# The default value is: YES.

SHOW_USED_FILES        = YES

# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
# will remove the Files entry from the Quick Index and from the Folder Tree View
# (if specified).
# The default value is: YES.

SHOW_FILES             = YES

# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
# page. This will remove the Namespaces entry from the Quick Index and from the
# Folder Tree View (if specified).
# The default value is: YES.

SHOW_NAMESPACES        = YES

# The FILE_VERSION_FILTER tag can be used to specify a program or script that
# doxygen should invoke to get the current version for each file (typically from
# the version control system). Doxygen will invoke the program by executing (via
# popen()) the command command input-file, where command is the value of the
# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
# by doxygen. Whatever the program writes to standard output is used as the file
# version. For an example see the documentation.

FILE_VERSION_FILTER    =

# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
# by doxygen. The layout file controls the global structure of the generated
# output files in an output format independent way. To create the layout file
# that represents doxygen's defaults, run doxygen with the -l option. You can
# optionally specify a file name after the option, if omitted DoxygenLayout.xml
# will be used as the name of the layout file.
#
# Note that if you run doxygen from a directory containing a file called
# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
# tag is left empty.

LAYOUT_FILE            =

# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
# the reference definitions. This must be a list of .bib files. The .bib
# extension is automatically appended if omitted. This requires the bibtex tool
# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info.
# For LaTeX the style of the bibliography can be controlled using
# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
# search path. See also \cite for info how to create references.

CITE_BIB_FILES         =

#---------------------------------------------------------------------------
# Configuration options related to warning and progress messages
#---------------------------------------------------------------------------

# The QUIET tag can be used to turn on/off the messages that are generated to
# standard output by doxygen. If QUIET is set to YES this implies that the
# messages are off.
# The default value is: NO.

QUIET                  = NO

# The WARNINGS tag can be used to turn on/off the warning messages that are
# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
# this implies that the warnings are on.
#
# Tip: Turn warnings on while writing the documentation.
# The default value is: YES.

WARNINGS               = YES

# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
# will automatically be disabled.
# The default value is: YES.

WARN_IF_UNDOCUMENTED   = YES

# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
# potential errors in the documentation, such as not documenting some parameters
# in a documented function, or documenting parameters that don't exist or using
# markup commands wrongly.
# The default value is: YES.

WARN_IF_DOC_ERROR      = YES

# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
# are documented, but have no documentation for their parameters or return
# value. If set to NO, doxygen will only warn about wrong or incomplete
# parameter documentation, but not about the absence of documentation. If
# EXTRACT_ALL is set to YES then this flag will automatically be disabled.
# The default value is: NO.

WARN_NO_PARAMDOC       = NO

# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
# a warning is encountered.
# The default value is: NO.

WARN_AS_ERROR          = YES

# The WARN_FORMAT tag determines the format of the warning messages that doxygen
# can produce. The string should contain the $file, $line, and $text tags, which
# will be replaced by the file and line number from which the warning originated
# and the warning text. Optionally the format may contain $version, which will
# be replaced by the version of the file (if it could be obtained via
# FILE_VERSION_FILTER)
# The default value is: $file:$line: $text.

WARN_FORMAT            = "$file:$line: $text"

# The WARN_LOGFILE tag can be used to specify a file to which warning and error
# messages should be written. If left blank the output is written to standard
# error (stderr).

WARN_LOGFILE           =

#---------------------------------------------------------------------------
# Configuration options related to the input files
#---------------------------------------------------------------------------

# The INPUT tag is used to specify the files and/or directories that contain
# documented source files. You may enter file names like myfile.cpp or
# directories like /usr/src/myproject. Separate the files or directories with
# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
# Note: If this tag is empty the current directory is searched.

INPUT                  = @CMAKE_CURRENT_SOURCE_DIR@/include \
                         @CMAKE_CURRENT_SOURCE_DIR@/src

# This tag can be used to specify the character encoding of the source files
# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
# documentation (see: https://www.gnu.org/software/libiconv/) for the list of
# possible encodings.
# The default value is: UTF-8.

INPUT_ENCODING         = UTF-8

# If the value of the INPUT tag contains directories, you can use the
# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
# *.h) to filter out the source-files in the directories.
#
# Note that for custom extensions or not directly supported extensions you also
# need to set EXTENSION_MAPPING for the extension otherwise the files are not
# read by doxygen.
#
# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08,
# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, *.qsf and *.ice.

FILE_PATTERNS          = *.h *.c

# The RECURSIVE tag can be used to specify whether or not subdirectories should
# be searched for input files as well.
# The default value is: NO.

RECURSIVE              = YES

# The EXCLUDE tag can be used to specify files and/or directories that should be
# excluded from the INPUT source files. This way you can easily exclude a
# subdirectory from a directory tree whose root is specified with the INPUT tag.
#
# Note that relative paths are relative to the directory from which doxygen is
# run.

EXCLUDE                =

# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
# directories that are symbolic links (a Unix file system feature) are excluded
# from the input.
# The default value is: NO.

EXCLUDE_SYMLINKS       = NO

# If the value of the INPUT tag contains directories, you can use the
# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
# certain files from those directories.
#
# Note that the wildcards are matched against the file with absolute path, so to
# exclude all test directories for example use the pattern */test/*

EXCLUDE_PATTERNS       = mongoose.*

# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
# (namespaces, classes, functions, etc.) that should be excluded from the
# output. The symbol name can be a fully qualified name, a word, or if the
# wildcard * is used, a substring. Examples: ANamespace, AClass,
# AClass::ANamespace, ANamespace::*Test
#
# Note that the wildcards are matched against the file with absolute path, so to
# exclude all test directories use the pattern */test/*

EXCLUDE_SYMBOLS        =

# The EXAMPLE_PATH tag can be used to specify one or more files or directories
# that contain example code fragments that are included (see the \include
# command).

EXAMPLE_PATH           =

# If the value of the EXAMPLE_PATH tag contains directories, you can use the
# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
# *.h) to filter out the source-files in the directories. If left blank all
# files are included.

EXAMPLE_PATTERNS       =

# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
# searched for input files to be used with the \include or \dontinclude commands
# irrespective of the value of the RECURSIVE tag.
# The default value is: NO.

EXAMPLE_RECURSIVE      = NO

# The IMAGE_PATH tag can be used to specify one or more files or directories
# that contain images that are to be included in the documentation (see the
# \image command).

IMAGE_PATH             =

# The INPUT_FILTER tag can be used to specify a program that doxygen should
# invoke to filter for each input file. Doxygen will invoke the filter program
# by executing (via popen()) the command:
#
# <filter> <input-file>
#
# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
# name of an input file. Doxygen will then use the output that the filter
# program writes to standard output. If FILTER_PATTERNS is specified, this tag
# will be ignored.
#
# Note that the filter must not add or remove lines; it is applied before the
# code is scanned, but not when the output code is generated. If lines are added
# or removed, the anchors will not be placed correctly.
#
# Note that for custom extensions or not directly supported extensions you also
# need to set EXTENSION_MAPPING for the extension otherwise the files are not
# properly processed by doxygen.

INPUT_FILTER           =

# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
# basis. Doxygen will compare the file name with each pattern and apply the
# filter if there is a match. The filters are a list of the form: pattern=filter
# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
# patterns match the file name, INPUT_FILTER is applied.
#
# Note that for custom extensions or not directly supported extensions you also
# need to set EXTENSION_MAPPING for the extension otherwise the files are not
# properly processed by doxygen.

FILTER_PATTERNS        =

# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
# INPUT_FILTER) will also be used to filter the input files that are used for
# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
# The default value is: NO.

FILTER_SOURCE_FILES    = NO

# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
# it is also possible to disable source filtering for a specific pattern using
# *.ext= (so without naming a filter).
# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.

FILTER_SOURCE_PATTERNS =

# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
# is part of the input, its contents will be placed on the main page
# (index.html). This can be useful if you have a project on for instance GitHub
# and want to reuse the introduction page also for the doxygen output.

USE_MDFILE_AS_MAINPAGE =

#---------------------------------------------------------------------------
# Configuration options related to source browsing
#---------------------------------------------------------------------------

# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
# generated. Documented entities will be cross-referenced with these sources.
#
# Note: To get rid of all source code in the generated output, make sure that
# also VERBATIM_HEADERS is set to NO.
# The default value is: NO.

SOURCE_BROWSER         = NO

# Setting the INLINE_SOURCES tag to YES will include the body of functions,
# classes and enums directly into the documentation.
# The default value is: NO.

INLINE_SOURCES         = NO

# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
# special comment blocks from generated source code fragments. Normal C, C++ and
# Fortran comments will always remain visible.
# The default value is: YES.

STRIP_CODE_COMMENTS    = YES

# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
# entity all documented functions referencing it will be listed.
# The default value is: NO.

REFERENCED_BY_RELATION = YES

# If the REFERENCES_RELATION tag is set to YES then for each documented function
# all documented entities called/used by that function will be listed.
# The default value is: NO.

REFERENCES_RELATION    = YES

# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
# to YES then the hyperlinks from functions in REFERENCES_RELATION and
# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
# link to the documentation.
# The default value is: YES.

REFERENCES_LINK_SOURCE = YES

# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
# source code will show a tooltip with additional information such as prototype,
# brief description and links to the definition and documentation. Since this
# will make the HTML file larger and loading of large files a bit slower, you
# can opt to disable this feature.
# The default value is: YES.
# This tag requires that the tag SOURCE_BROWSER is set to YES.

SOURCE_TOOLTIPS        = YES

# If the USE_HTAGS tag is set to YES then the references to source code will
# point to the HTML generated by the htags(1) tool instead of doxygen built-in
# source browser. The htags tool is part of GNU's global source tagging system
# (see https://www.gnu.org/software/global/global.html). You will need version
# 4.8.6 or higher.
#
# To use it do the following:
# - Install the latest version of global
# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file
# - Make sure the INPUT points to the root of the source tree
# - Run doxygen as normal
#
# Doxygen will invoke htags (and that will in turn invoke gtags), so these
# tools must be available from the command line (i.e. in the search path).
#
# The result: instead of the source browser generated by doxygen, the links to
# source code will now point to the output of htags.
# The default value is: NO.
# This tag requires that the tag SOURCE_BROWSER is set to YES.

USE_HTAGS              = NO

# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
# verbatim copy of the header file for each class for which an include is
# specified. Set to NO to disable this.
# See also: Section \class.
# The default value is: YES.

VERBATIM_HEADERS       = YES

#---------------------------------------------------------------------------
# Configuration options related to the alphabetical class index
#---------------------------------------------------------------------------

# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
# compounds will be generated. Enable this if the project contains a lot of
# classes, structs, unions or interfaces.
# The default value is: YES.

ALPHABETICAL_INDEX     = NO

# In case all classes in a project start with a common prefix, all classes will
# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
# can be used to specify a prefix (or a list of prefixes) that should be ignored
# while generating the index headers.
# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.

IGNORE_PREFIX          =

#---------------------------------------------------------------------------
# Configuration options related to the HTML output
#---------------------------------------------------------------------------

# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
# The default value is: YES.

GENERATE_HTML          = YES

# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
# it.
# The default directory is: html.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_OUTPUT            = html

# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
# generated HTML page (for example: .htm, .php, .asp).
# The default value is: .html.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_FILE_EXTENSION    = .html

# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
# each generated HTML page. If the tag is left blank doxygen will generate a
# standard header.
#
# To get valid HTML the header file that includes any scripts and style sheets
# that doxygen needs, which is dependent on the configuration options used (e.g.
# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
# default header using
# doxygen -w html new_header.html new_footer.html new_stylesheet.css
# YourConfigFile
# and then modify the file new_header.html. See also section "Doxygen usage"
# for information on how to generate the default header that doxygen normally
# uses.
# Note: The header is subject to change so you typically have to regenerate the
# default header when upgrading to a newer version of doxygen. For a description
# of the possible markers and block names see the documentation.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_HEADER            =

# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
# generated HTML page. If the tag is left blank doxygen will generate a standard
# footer. See HTML_HEADER for more information on how to generate a default
# footer and what special commands can be used inside the footer. See also
# section "Doxygen usage" for information on how to generate the default footer
# that doxygen normally uses.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_FOOTER            =

# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
# sheet that is used by each HTML page. It can be used to fine-tune the look of
# the HTML output. If left blank doxygen will generate a default style sheet.
# See also section "Doxygen usage" for information on how to generate the style
# sheet that doxygen normally uses.
# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
# it is more robust and this tag (HTML_STYLESHEET) will in the future become
# obsolete.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_STYLESHEET        =

# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
# cascading style sheets that are included after the standard style sheets
# created by doxygen. Using this option one can overrule certain style aspects.
# This is preferred over using HTML_STYLESHEET since it does not replace the
# standard style sheet and is therefore more robust against future updates.
# Doxygen will copy the style sheet files to the output directory.
# Note: The order of the extra style sheet files is of importance (e.g. the last
# style sheet in the list overrules the setting of the previous ones in the
# list). For an example see the documentation.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_EXTRA_STYLESHEET  =

# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
# other source files which should be copied to the HTML output directory. Note
# that these files will be copied to the base HTML output directory. Use the
# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
# files will be copied as-is; there are no commands or markers available.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_EXTRA_FILES       =

# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
# will adjust the colors in the style sheet and background images according to
# this color. Hue is specified as an angle on a colorwheel, see
# https://en.wikipedia.org/wiki/Hue for more information. For instance the value
# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
# purple, and 360 is red again.
# Minimum value: 0, maximum value: 359, default value: 220.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_COLORSTYLE_HUE    = 220

# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
# in the HTML output. For a value of 0 the output will use grayscales only. A
# value of 255 will produce the most vivid colors.
# Minimum value: 0, maximum value: 255, default value: 100.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_COLORSTYLE_SAT    = 100

# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
# luminance component of the colors in the HTML output. Values below 100
# gradually make the output lighter, whereas values above 100 make the output
# darker. The value divided by 100 is the actual gamma applied, so 80 represents
# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
# change the gamma.
# Minimum value: 40, maximum value: 240, default value: 80.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_COLORSTYLE_GAMMA  = 80

# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
# page will contain the date and time when the page was generated. Setting this
# to YES can help to show when doxygen was last run and thus if the
# documentation is up to date.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_TIMESTAMP         = YES

# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML
# documentation will contain a main index with vertical navigation menus that
# are dynamically created via Javascript. If disabled, the navigation index will
# consists of multiple levels of tabs that are statically embedded in every HTML
# page. Disable this option to support browsers that do not have Javascript,
# like the Qt help browser.
# The default value is: YES.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_DYNAMIC_MENUS     = YES

# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
# documentation will contain sections that can be hidden and shown after the
# page has loaded.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_DYNAMIC_SECTIONS  = NO

# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
# shown in the various tree structured indices initially; the user can expand
# and collapse entries dynamically later on. Doxygen will expand the tree to
# such a level that at most the specified number of entries are visible (unless
# a fully collapsed tree already exceeds this amount). So setting the number of
# entries 1 will produce a full collapsed tree by default. 0 is a special value
# representing an infinite number of entries and will result in a full expanded
# tree by default.
# Minimum value: 0, maximum value: 9999, default value: 100.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_INDEX_NUM_ENTRIES = 100

# If the GENERATE_DOCSET tag is set to YES, additional index files will be
# generated that can be used as input for Apple's Xcode 3 integrated development
# environment (see: https://developer.apple.com/xcode/), introduced with OSX
# 10.5 (Leopard). To create a documentation set, doxygen will generate a
# Makefile in the HTML output directory. Running make will produce the docset in
# that directory and running make install will install the docset in
# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy
# genXcode/_index.html for more information.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.

GENERATE_DOCSET        = NO

# This tag determines the name of the docset feed. A documentation feed provides
# an umbrella under which multiple documentation sets from a single provider
# (such as a company or product suite) can be grouped.
# The default value is: Doxygen generated docs.
# This tag requires that the tag GENERATE_DOCSET is set to YES.

DOCSET_FEEDNAME        = "Doxygen generated docs"

# This tag specifies a string that should uniquely identify the documentation
# set bundle. This should be a reverse domain-name style string, e.g.
# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
# The default value is: org.doxygen.Project.
# This tag requires that the tag GENERATE_DOCSET is set to YES.

DOCSET_BUNDLE_ID       = org.doxygen.Project

# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
# the documentation publisher. This should be a reverse domain-name style
# string, e.g. com.mycompany.MyDocSet.documentation.
# The default value is: org.doxygen.Publisher.
# This tag requires that the tag GENERATE_DOCSET is set to YES.

DOCSET_PUBLISHER_ID    = org.doxygen.Publisher

# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
# The default value is: Publisher.
# This tag requires that the tag GENERATE_DOCSET is set to YES.

DOCSET_PUBLISHER_NAME  = Publisher

# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
# (see: https://www.microsoft.com/en-us/download/details.aspx?id=21138) on
# Windows.
#
# The HTML Help Workshop contains a compiler that can convert all HTML output
# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
# files are now used as the Windows 98 help format, and will replace the old
# Windows help format (.hlp) on all Windows platforms in the future. Compressed
# HTML files also contain an index, a table of contents, and you can search for
# words in the documentation. The HTML workshop also contains a viewer for
# compressed HTML files.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.

GENERATE_HTMLHELP      = NO

# The CHM_FILE tag can be used to specify the file name of the resulting .chm
# file. You can add a path in front of the file if the result should not be
# written to the html output directory.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.

CHM_FILE               =

# The HHC_LOCATION tag can be used to specify the location (absolute path
# including file name) of the HTML help compiler (hhc.exe). If non-empty,
# doxygen will try to run the HTML help compiler on the generated index.hhp.
# The file has to be specified with full path.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.

HHC_LOCATION           =

# The GENERATE_CHI flag controls if a separate .chi index file is generated
# (YES) or that it should be included in the master .chm file (NO).
# The default value is: NO.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.

GENERATE_CHI           = NO

# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
# and project file content.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.

CHM_INDEX_ENCODING     =

# The BINARY_TOC flag controls whether a binary table of contents is generated
# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
# enables the Previous and Next buttons.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.

BINARY_TOC             = NO

# The TOC_EXPAND flag can be set to YES to add extra items for group members to
# the table of contents of the HTML help documentation and to the tree view.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.

TOC_EXPAND             = NO

# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
# (.qch) of the generated HTML documentation.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.

GENERATE_QHP           = NO

# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
# the file name of the resulting .qch file. The path specified is relative to
# the HTML output folder.
# This tag requires that the tag GENERATE_QHP is set to YES.

QCH_FILE               =

# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
# Project output. For more information please see Qt Help Project / Namespace
# (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace).
# The default value is: org.doxygen.Project.
# This tag requires that the tag GENERATE_QHP is set to YES.

QHP_NAMESPACE          = org.doxygen.Project

# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
# Help Project output. For more information please see Qt Help Project / Virtual
# Folders (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-
# folders).
# The default value is: doc.
# This tag requires that the tag GENERATE_QHP is set to YES.

QHP_VIRTUAL_FOLDER     = doc

# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
# filter to add. For more information please see Qt Help Project / Custom
# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-
# filters).
# This tag requires that the tag GENERATE_QHP is set to YES.

QHP_CUST_FILTER_NAME   =

# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
# custom filter to add. For more information please see Qt Help Project / Custom
# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-
# filters).
# This tag requires that the tag GENERATE_QHP is set to YES.

QHP_CUST_FILTER_ATTRS  =

# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
# project's filter section matches. Qt Help Project / Filter Attributes (see:
# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes).
# This tag requires that the tag GENERATE_QHP is set to YES.

QHP_SECT_FILTER_ATTRS  =

# The QHG_LOCATION tag can be used to specify the location of Qt's
# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
# generated .qhp file.
# This tag requires that the tag GENERATE_QHP is set to YES.

QHG_LOCATION           =

# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
# generated, together with the HTML files, they form an Eclipse help plugin. To
# install this plugin and make it available under the help contents menu in
# Eclipse, the contents of the directory containing the HTML and XML files needs
# to be copied into the plugins directory of eclipse. The name of the directory
# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
# After copying Eclipse needs to be restarted before the help appears.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.

GENERATE_ECLIPSEHELP   = NO

# A unique identifier for the Eclipse help plugin. When installing the plugin
# the directory name containing the HTML and XML files should also have this
# name. Each documentation set should have its own identifier.
# The default value is: org.doxygen.Project.
# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.

ECLIPSE_DOC_ID         = org.doxygen.Project

# If you want full control over the layout of the generated HTML pages it might
# be necessary to disable the index and replace it with your own. The
# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
# of each HTML page. A value of NO enables the index and the value YES disables
# it. Since the tabs in the index contain the same information as the navigation
# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.

DISABLE_INDEX          = NO

# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
# structure should be generated to display hierarchical information. If the tag
# value is set to YES, a side panel will be generated containing a tree-like
# index structure (just like the one that is generated for HTML Help). For this
# to work a browser that supports JavaScript, DHTML, CSS and frames is required
# (i.e. any modern browser). Windows users are probably better off using the
# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
# further fine-tune the look of the index. As an example, the default style
# sheet generated by doxygen has an example that shows how to put an image at
# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
# the same information as the tab index, you could consider setting
# DISABLE_INDEX to YES when enabling this option.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.

GENERATE_TREEVIEW      = YES

# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
# doxygen will group on one line in the generated HTML documentation.
#
# Note that a value of 0 will completely suppress the enum values from appearing
# in the overview section.
# Minimum value: 0, maximum value: 20, default value: 4.
# This tag requires that the tag GENERATE_HTML is set to YES.

ENUM_VALUES_PER_LINE   = 4

# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
# to set the initial width (in pixels) of the frame in which the tree is shown.
# Minimum value: 0, maximum value: 1500, default value: 250.
# This tag requires that the tag GENERATE_HTML is set to YES.

TREEVIEW_WIDTH         = 250

# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
# external symbols imported via tag files in a separate window.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.

EXT_LINKS_IN_WINDOW    = NO

# Use this tag to change the font size of LaTeX formulas included as images in
# the HTML documentation. When you change the font size after a successful
# doxygen run you need to manually remove any form_*.png images from the HTML
# output directory to force them to be regenerated.
# Minimum value: 8, maximum value: 50, default value: 10.
# This tag requires that the tag GENERATE_HTML is set to YES.

FORMULA_FONTSIZE       = 10

# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
# https://www.mathjax.org) which uses client side Javascript for the rendering
# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
# installed or if you want to formulas look prettier in the HTML output. When
# enabled you may also need to install MathJax separately and configure the path
# to it using the MATHJAX_RELPATH option.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.

USE_MATHJAX            = NO

# When MathJax is enabled you can set the default output format to be used for
# the MathJax output. See the MathJax site (see:
# http://docs.mathjax.org/en/latest/output.html) for more details.
# Possible values are: HTML-CSS (which is slower, but has the best
# compatibility), NativeMML (i.e. MathML) and SVG.
# The default value is: HTML-CSS.
# This tag requires that the tag USE_MATHJAX is set to YES.

MATHJAX_FORMAT         = HTML-CSS

# When MathJax is enabled you need to specify the location relative to the HTML
# output directory using the MATHJAX_RELPATH option. The destination directory
# should contain the MathJax.js script. For instance, if the mathjax directory
# is located at the same level as the HTML output directory, then
# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
# Content Delivery Network so you can quickly see the result without installing
# MathJax. However, it is strongly recommended to install a local copy of
# MathJax from https://www.mathjax.org before deployment.
# The default value is: https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/.
# This tag requires that the tag USE_MATHJAX is set to YES.

MATHJAX_RELPATH        = http://www.mathjax.org/mathjax

# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
# extension names that should be enabled during MathJax rendering. For example
# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
# This tag requires that the tag USE_MATHJAX is set to YES.

MATHJAX_EXTENSIONS     =

# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
# of code that will be used on startup of the MathJax code. See the MathJax site
# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
# example see the documentation.
# This tag requires that the tag USE_MATHJAX is set to YES.

MATHJAX_CODEFILE       =

# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
# the HTML output. The underlying search engine uses javascript and DHTML and
# should work on any modern browser. Note that when using HTML help
# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERA
Download .txt
gitextract_m2nsv5xx/

├── .ci/
│   └── scripts/
│       ├── do_sysroot.sh
│       └── do_tests.sh
├── .clang-format
├── .deploy/
│   ├── WINDOWS-MINGWW64.txt
│   ├── WINDOWS-MSVC.txt
│   ├── gen_nightly_info.sh
│   └── gen_release_info.py
├── .github/
│   ├── actions/
│   │   └── style-check/
│   │       ├── action.yml
│   │       └── index.js
│   └── workflows/
│       ├── check.yml
│       └── release.yml
├── .gitignore
├── AUTHORS
├── CHANGELOG.md
├── CMakeLists.txt
├── COPYING
├── Doxyfile.in
├── README.md
├── cmake/
│   ├── Modules/
│   │   ├── FindGperftools.cmake
│   │   ├── FindLibRTLSDR.cmake
│   │   ├── FindLibUSB.cmake
│   │   ├── GetGitRevisionDescription.cmake
│   │   └── GetGitRevisionDescription.cmake.in
│   ├── Toolchain-aarch64-linux-gnu.cmake
│   ├── Toolchain-arm-linux-gnueabi.cmake
│   ├── Toolchain-arm-linux-gnueabihf.cmake
│   ├── Toolchain-gcc-mingw-w64-i686.cmake
│   ├── Toolchain-gcc-mingw-w64-x86-64.cmake
│   └── cmake_uninstall.cmake.in
├── conf/
│   ├── CAME-TOP432.conf
│   ├── CMakeLists.txt
│   ├── ContinentalRemote.conf
│   ├── Dewenwils_BHV.conf
│   ├── DrivewayAlarm_I8-W1901.conf
│   ├── DrivewayAlert.conf
│   ├── EV1527-4Button-Universal-Remote.conf
│   ├── EV1527-DDS-Sgooway.conf
│   ├── EV1527-PIR-Sgooway.conf
│   ├── FAN-53T.conf
│   ├── GhostControls.conf
│   ├── HeatmiserPRT-W.conf
│   ├── Hormann-blue.conf
│   ├── LeakDetector.conf
│   ├── MightyMule-FM231.conf
│   ├── MondeoRemote.conf
│   ├── PHOX.conf
│   ├── Reolink-doorbell.conf
│   ├── SMC5326-Remote.conf
│   ├── SWETUP-garage-opener.conf
│   ├── SalusRT300RF.conf
│   ├── Skylink_HA-434TL.conf
│   ├── Thomson-doorbell.conf
│   ├── adlm_fprf.conf
│   ├── atc-technology_lmt-430.conf
│   ├── car_fob.conf
│   ├── chungear_bcf-0019x2.conf
│   ├── dooya_curtain.conf
│   ├── elro_ab440r.conf
│   ├── energy_count_3000.conf
│   ├── fan-11t.conf
│   ├── friedlandevo.conf
│   ├── ge_smartremote_plus.conf
│   ├── heatilator.conf
│   ├── honeywell-fan.conf
│   ├── hornbach-msrc-sal.conf
│   ├── ivac_pro.conf
│   ├── led-light-remote.conf
│   ├── oma-blind-remote.conf
│   ├── pir-ef4.conf
│   ├── quinetic_switch.conf
│   ├── qx-30x.conf
│   ├── rako_wireless_lighting.conf
│   ├── restaurant_pager.conf
│   ├── rolleaseacmedia.conf
│   ├── rtl_433.example.conf
│   ├── silverline_doorbell.conf
│   ├── sonoff_rm433.conf
│   ├── steffen_switch.conf
│   ├── tesla_charge-port-opener.conf
│   ├── tyreguard400.conf
│   ├── valeo_car_key.conf
│   ├── verisure_alarm.conf
│   └── xmas-tree-remote-2APJZ-CW002.conf
├── docs/
│   ├── .gitignore
│   ├── .vuepress/
│   │   ├── config.js
│   │   └── styles/
│   │       └── index.scss
│   ├── ANALYZE.md
│   ├── BINARY_BUILDS.md
│   ├── BUILDING.md
│   ├── CONTRIBUTING.md
│   ├── DATA_FORMAT.md
│   ├── HARDWARE.md
│   ├── INTEGRATION.md
│   ├── IQ_FORMATS.md
│   ├── LINKS.md
│   ├── OPERATION.md
│   ├── PRIMER.md
│   ├── STARTING.md
│   ├── build-docs.sh
│   └── package.json
├── examples/
│   ├── README.md
│   ├── mqtt_filter.py
│   ├── mqtt_rtl_433_test_client.py
│   ├── open_rtl433.py
│   ├── rtl_433_collectd_pipe.py
│   ├── rtl_433_custom.php
│   ├── rtl_433_custom.py
│   ├── rtl_433_gps.py
│   ├── rtl_433_graphite_relay.py
│   ├── rtl_433_http_cmd.py
│   ├── rtl_433_http_cmd.sh
│   ├── rtl_433_http_events.py
│   ├── rtl_433_http_stream.php
│   ├── rtl_433_http_stream.py
│   ├── rtl_433_http_ws.py
│   ├── rtl_433_influxdb_relay.py
│   ├── rtl_433_json_to_rtlwmbus.py
│   ├── rtl_433_mqtt_hass.py
│   ├── rtl_433_mqtt_relay.py
│   ├── rtl_433_prometheus_relay.py
│   ├── rtl_433_rrd_relay.py
│   ├── rtl_433_statsd_pipe.py
│   └── rtl_433_statsd_relay.py
├── include/
│   ├── CMakeLists.txt
│   ├── abuf.h
│   ├── am_analyze.h
│   ├── baseband.h
│   ├── bit_util.h
│   ├── bitbuffer.h
│   ├── c_util.h
│   ├── compat_paths.h
│   ├── compat_pthread.h
│   ├── compat_time.h
│   ├── confparse.h
│   ├── data.h
│   ├── data_tag.h
│   ├── decoder.h
│   ├── decoder_util.h
│   ├── fatal.h
│   ├── fileformat.h
│   ├── http_server.h
│   ├── jsmn.h
│   ├── list.h
│   ├── logger.h
│   ├── mongoose.h
│   ├── optparse.h
│   ├── output_file.h
│   ├── output_influx.h
│   ├── output_log.h
│   ├── output_mqtt.h
│   ├── output_rtltcp.h
│   ├── output_trigger.h
│   ├── output_udp.h
│   ├── pulse_analyzer.h
│   ├── pulse_data.h
│   ├── pulse_detect.h
│   ├── pulse_detect_fsk.h
│   ├── pulse_slicer.h
│   ├── r_api.h
│   ├── r_device.h
│   ├── r_private.h
│   ├── r_util.h
│   ├── raw_output.h
│   ├── rfraw.h
│   ├── rtl_433.h
│   ├── rtl_433_devices.h
│   ├── samp_grab.h
│   ├── sdr.h
│   ├── term_ctl.h
│   └── write_sigrok.h
├── maintainer_update.py
├── man/
│   └── man1/
│       └── rtl_433.1
├── rtl433.pc.in
├── src/
│   ├── CMakeLists.txt
│   ├── abuf.c
│   ├── am_analyze.c
│   ├── baseband.c
│   ├── bit_util.c
│   ├── bitbuffer.c
│   ├── compat_paths.c
│   ├── compat_time.c
│   ├── confparse.c
│   ├── data.c
│   ├── data_tag.c
│   ├── decoder_util.c
│   ├── devices/
│   │   ├── abmt.c
│   │   ├── acurite.c
│   │   ├── acurite_01185m.c
│   │   ├── akhan_100F14.c
│   │   ├── alecto.c
│   │   ├── ambient_weather.c
│   │   ├── ambientweather_tx8300.c
│   │   ├── ambientweather_wh31e.c
│   │   ├── ant_antplus.c
│   │   ├── apator_metra_eitn30.c
│   │   ├── apator_metra_erm30.c
│   │   ├── arad_ms_meter.c
│   │   ├── archos_tbh.c
│   │   ├── arexx_ml.c
│   │   ├── atech_ws308.c
│   │   ├── auriol_4ld5661.c
│   │   ├── auriol_aft77b2.c
│   │   ├── auriol_afw2a1.c
│   │   ├── auriol_ahfl.c
│   │   ├── auriol_hg02832.c
│   │   ├── badger_orion_endpoint.c
│   │   ├── badger_water.c
│   │   ├── baldr_rain.c
│   │   ├── baldr_therm.c
│   │   ├── blueline.c
│   │   ├── blyss.c
│   │   ├── bm5.c
│   │   ├── brennenstuhl_rcs_2044.c
│   │   ├── bresser_3ch.c
│   │   ├── bresser_5in1.c
│   │   ├── bresser_6in1.c
│   │   ├── bresser_7in1.c
│   │   ├── bresser_leakage.c
│   │   ├── bresser_lightning.c
│   │   ├── bresser_st1005h.c
│   │   ├── bt_rain.c
│   │   ├── burnhardbbq.c
│   │   ├── calibeur.c
│   │   ├── cardin.c
│   │   ├── cavius.c
│   │   ├── ced7000.c
│   │   ├── celsia_czc1.c
│   │   ├── chamberlain_cwpirc.c
│   │   ├── chuango.c
│   │   ├── cmr113.c
│   │   ├── companion_wtr001.c
│   │   ├── cotech_36_7959.c
│   │   ├── current_cost.c
│   │   ├── danfoss.c
│   │   ├── deltadore_x3d.c
│   │   ├── digitech_xc0324.c
│   │   ├── directv.c
│   │   ├── dish_remote_6_3.c
│   │   ├── dsc.c
│   │   ├── ec3k.c
│   │   ├── ecodhome.c
│   │   ├── ecowitt.c
│   │   ├── efergy_e2_classic.c
│   │   ├── efergy_optical.c
│   │   ├── efth800.c
│   │   ├── elro_db286a.c
│   │   ├── elv.c
│   │   ├── emax.c
│   │   ├── emontx.c
│   │   ├── emos_e6016.c
│   │   ├── emos_e6016_rain.c
│   │   ├── enocean_erp1.c
│   │   ├── ert_idm.c
│   │   ├── ert_scm.c
│   │   ├── esa.c
│   │   ├── esic_emt7110.c
│   │   ├── esperanza_ews.c
│   │   ├── eurochron.c
│   │   ├── fineoffset.c
│   │   ├── fineoffset_wh1050.c
│   │   ├── fineoffset_wh1080.c
│   │   ├── fineoffset_wh31l.c
│   │   ├── fineoffset_wh43.c
│   │   ├── fineoffset_wh45.c
│   │   ├── fineoffset_wh46.c
│   │   ├── fineoffset_wh55.c
│   │   ├── fineoffset_wn34.c
│   │   ├── fineoffset_ws80.c
│   │   ├── fineoffset_ws85.c
│   │   ├── fineoffset_ws90.c
│   │   ├── flex.c
│   │   ├── flowis.c
│   │   ├── fordremote.c
│   │   ├── fs20.c
│   │   ├── ft004b.c
│   │   ├── funkbus.c
│   │   ├── gasmate_ba1008.c
│   │   ├── ge_coloreffects.c
│   │   ├── geevon.c
│   │   ├── geevon_tx19.c
│   │   ├── generic_motion.c
│   │   ├── generic_remote.c
│   │   ├── generic_temperature_sensor.c
│   │   ├── geo_minim.c
│   │   ├── govee.c
│   │   ├── gridstream.c
│   │   ├── gt_tmbbq05.c
│   │   ├── gt_wt_02.c
│   │   ├── gt_wt_03.c
│   │   ├── hcs200.c
│   │   ├── hideki.c
│   │   ├── holman_ws5029.c
│   │   ├── homelead_hg9901.c
│   │   ├── hondaremote.c
│   │   ├── honeywell.c
│   │   ├── honeywell_cm921.c
│   │   ├── honeywell_wdb.c
│   │   ├── ht680.c
│   │   ├── ibis_beacon.c
│   │   ├── ikea_sparsnas.c
│   │   ├── infactory.c
│   │   ├── inkbird_ith20r.c
│   │   ├── inovalley-kw9015b.c
│   │   ├── insteon.c
│   │   ├── interlogix.c
│   │   ├── intertechno.c
│   │   ├── jasco.c
│   │   ├── kedsum.c
│   │   ├── kerui.c
│   │   ├── klimalogg.c
│   │   ├── lacrosse.c
│   │   ├── lacrosse_breezepro.c
│   │   ├── lacrosse_r1.c
│   │   ├── lacrosse_th3.c
│   │   ├── lacrosse_tx141x.c
│   │   ├── lacrosse_tx31u.c
│   │   ├── lacrosse_tx34.c
│   │   ├── lacrosse_tx35.c
│   │   ├── lacrosse_wr1.c
│   │   ├── lacrosse_ws7000.c
│   │   ├── lacrossews.c
│   │   ├── lightwave_rf.c
│   │   ├── m_bus.c
│   │   ├── markisol.c
│   │   ├── marlec_solar.c
│   │   ├── maverick_et73.c
│   │   ├── maverick_et73x.c
│   │   ├── maverick_xr30.c
│   │   ├── maverick_xr50.c
│   │   ├── mebus.c
│   │   ├── megacode.c
│   │   ├── missil_ml0757.c
│   │   ├── mueller_hotrod.c
│   │   ├── neptune_r900.c
│   │   ├── new_template.c
│   │   ├── newkaku.c
│   │   ├── nexa.c
│   │   ├── nexus.c
│   │   ├── nice_flor_s.c
│   │   ├── norgo.c
│   │   ├── oil_smart.c
│   │   ├── oil_standard.c
│   │   ├── oil_watchman.c
│   │   ├── oil_watchman_advanced.c
│   │   ├── opus_xt300.c
│   │   ├── oregon_scientific.c
│   │   ├── oregon_scientific_sl109h.c
│   │   ├── oregon_scientific_v1.c
│   │   ├── oria_wa150km.c
│   │   ├── philips_aj3650.c
│   │   ├── philips_aj7010.c
│   │   ├── proflame2.c
│   │   ├── prologue.c
│   │   ├── proove.c
│   │   ├── quhwa.c
│   │   ├── quinetic.c
│   │   ├── radiohead_ask.c
│   │   ├── rainpoint.c
│   │   ├── rainpoint_hcs012arf.c
│   │   ├── regency_fan.c
│   │   ├── revolt_nc5462.c
│   │   ├── revolt_zx7717.c
│   │   ├── rftech.c
│   │   ├── risco_agility.c
│   │   ├── rojaflex.c
│   │   ├── rosstech_dcu706.c
│   │   ├── rubicson.c
│   │   ├── rubicson_48659.c
│   │   ├── rubicson_pool_48942.c
│   │   ├── s3318p.c
│   │   ├── sainlogic_sa8.c
│   │   ├── schou_72543_rain.c
│   │   ├── schraeder.c
│   │   ├── scmplus.c
│   │   ├── secplus_v1.c
│   │   ├── secplus_v2.c
│   │   ├── sharp_spc775.c
│   │   ├── silvercrest.c
│   │   ├── simplisafe.c
│   │   ├── simplisafe_gen3.c
│   │   ├── smoke_gs558.c
│   │   ├── solight_te44.c
│   │   ├── somfy_iohc.c
│   │   ├── somfy_rts.c
│   │   ├── springfield.c
│   │   ├── srsmith_pool_srs_2c_tx.c
│   │   ├── steelmate.c
│   │   ├── telldus_ft0385r.c
│   │   ├── tfa_14_1504_v2.c
│   │   ├── tfa_30_3196.c
│   │   ├── tfa_30_3221.c
│   │   ├── tfa_drop_30.3233.c
│   │   ├── tfa_marbella.c
│   │   ├── tfa_pool_thermometer.c
│   │   ├── tfa_twin_plus_30.3049.c
│   │   ├── thermopro_tp11.c
│   │   ├── thermopro_tp12.c
│   │   ├── thermopro_tp211b.c
│   │   ├── thermopro_tp28b.c
│   │   ├── thermopro_tp82xb.c
│   │   ├── thermopro_tp862b.c
│   │   ├── thermopro_tx2.c
│   │   ├── thermopro_tx2c.c
│   │   ├── thermopro_tx7b.c
│   │   ├── thermor.c
│   │   ├── tpms_abarth124.c
│   │   ├── tpms_airpuxem.c
│   │   ├── tpms_ave.c
│   │   ├── tpms_bmw.c
│   │   ├── tpms_bmw_g3.c
│   │   ├── tpms_citroen.c
│   │   ├── tpms_eezrv.c
│   │   ├── tpms_elantra2012.c
│   │   ├── tpms_ford.c
│   │   ├── tpms_gm.c
│   │   ├── tpms_hyundai_vdo.c
│   │   ├── tpms_jansite.c
│   │   ├── tpms_jansite_solar.c
│   │   ├── tpms_kia.c
│   │   ├── tpms_nissan.c
│   │   ├── tpms_pmv107j.c
│   │   ├── tpms_porsche.c
│   │   ├── tpms_renault.c
│   │   ├── tpms_renault_0435r.c
│   │   ├── tpms_toyota.c
│   │   ├── tpms_truck.c
│   │   ├── tpms_trw.c
│   │   ├── tpms_tyreguard400.c
│   │   ├── ts_ft002.c
│   │   ├── ttx201.c
│   │   ├── universalfanctrl.c
│   │   ├── vaillant_vrt340f.c
│   │   ├── vauno_en8822c.c
│   │   ├── vevor_7in1.c
│   │   ├── visonic_powercode.c
│   │   ├── wallarge_cltx001.c
│   │   ├── watts_thermostat.c
│   │   ├── waveman.c
│   │   ├── wec2103.c
│   │   ├── wg_pb12v1.c
│   │   ├── ws2032.c
│   │   ├── wssensor.c
│   │   ├── wt0124.c
│   │   ├── wt450.c
│   │   ├── x10_rf.c
│   │   ├── x10_sec.c
│   │   └── yale_hsa.c
│   ├── fileformat.c
│   ├── getopt/
│   │   ├── getopt.c
│   │   └── getopt.h
│   ├── http_server.c
│   ├── jsmn.c
│   ├── list.c
│   ├── logger.c
│   ├── mongoose.c
│   ├── mongoose_bool.patch
│   ├── mongoose_broadcast.patch
│   ├── mongoose_ipv6.patch
│   ├── mongoose_lenchk.patch
│   ├── mongoose_libressl.patch
│   ├── mongoose_msvcdbg.patch
│   ├── mongoose_pedantic.patch
│   ├── mongoose_sigpipe.patch
│   ├── mongoose_warn.patch
│   ├── optparse.c
│   ├── output_file.c
│   ├── output_influx.c
│   ├── output_log.c
│   ├── output_mqtt.c
│   ├── output_rtltcp.c
│   ├── output_trigger.c
│   ├── output_udp.c
│   ├── pulse_analyzer.c
│   ├── pulse_data.c
│   ├── pulse_detect.c
│   ├── pulse_detect_fsk.c
│   ├── pulse_slicer.c
│   ├── r_api.c
│   ├── r_util.c
│   ├── raw_output.c
│   ├── rfraw.c
│   ├── rtl_433.c
│   ├── samp_grab.c
│   ├── sdr.c
│   ├── term_ctl.c
│   └── write_sigrok.c
└── tests/
    ├── CMakeLists.txt
    ├── baseband-test.c
    ├── data-test.c
    ├── exitcode-for-output.sh
    ├── pulse-eval.c
    ├── style-check.c
    └── symbolizer.py
Download .txt
Showing preview only (232K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (2674 symbols across 366 files)

FILE: .github/actions/style-check/index.js
  constant MAX_LEN (line 16) | const MAX_LEN = 300 // this should likely be around 160
  function discard_vendor (line 34) | function discard_vendor(filename) {
  function glob_dir (line 38) | function glob_dir(dir) {
  function style_check (line 50) | function style_check(filename) {

FILE: examples/mqtt_filter.py
  function publish_dedup (line 59) | def publish_dedup(topic, payload, timeout):
  function filter_devices (line 83) | def filter_devices(topic, payload):
  function is_sub_dict (line 101) | def is_sub_dict(needle, haystack):
  function filter_events (line 109) | def filter_events(topic, payload):
  function on_connect (line 143) | def on_connect(client, userdata, flags, rc):
  function on_disconnect (line 157) | def on_disconnect(client, userdata, rc):
  function on_message (line 162) | def on_message(client, userdata, msg):
  function main (line 177) | def main():

FILE: examples/mqtt_rtl_433_test_client.py
  function print_sensor_state (line 41) | def print_sensor_state():
  function on_connect (line 56) | def on_connect(client, userdata, flags, rc):
  function on_disconnect (line 66) | def on_disconnect(client, userdata, rc):
  function on_message (line 71) | def on_message(client, userdata, msg):
  function main (line 102) | def main():

FILE: examples/open_rtl433.py
  function parseToPulseData (line 14) | def parseToPulseData(filename):
  class PulseServer (line 19) | class PulseServer(BaseHTTPRequestHandler):
    method do_GET (line 20) | def do_GET(self):

FILE: examples/rtl_433_collectd_pipe.py
  function send_stats (line 17) | def send_stats(when, stats, sender, to):
  function sanitize (line 26) | def sanitize(text):
  function rtl_433_probe (line 30) | def rtl_433_probe():

FILE: examples/rtl_433_custom.php
  function parse_syslog (line 66) | function parse_syslog($line)

FILE: examples/rtl_433_custom.py
  function parse_syslog (line 19) | def parse_syslog(line):
  function rtl_433_listen (line 29) | def rtl_433_listen():

FILE: examples/rtl_433_gps.py
  class GpsPoller (line 20) | class GpsPoller(threading.Thread):
    method __init__ (line 21) | def __init__(self):
    method run (line 26) | def run(self):
    method utc (line 31) | def utc(self):
    method fix (line 35) | def fix(self):
    method satellites (line 39) | def satellites(self):
  function parse_syslog (line 43) | def parse_syslog(line):
  function prife (line 53) | def prife(label, data, key):
  function report_event (line 60) | def report_event(data, gpsp):

FILE: examples/rtl_433_graphite_relay.py
  class GraphiteUdpClient (line 25) | class GraphiteUdpClient(object):
    method __init__ (line 26) | def __init__(self, host='localhost', port=2003, ipv6=False):
    method _send (line 34) | def _send(self, message):
    method push (line 41) | def push(self, path, value, timestamp=None):
  function sanitize (line 54) | def sanitize(text):
  function parse_syslog (line 58) | def parse_syslog(line):
  function rtl_433_probe (line 68) | def rtl_433_probe():
  function run (line 104) | def run():

FILE: examples/rtl_433_http_cmd.py
  function set_freq (line 19) | def set_freq(freq):
  function set_rate (line 23) | def set_rate(rate):
  function send_cmd (line 27) | def send_cmd(params):
  function rtl_433_control (line 42) | def rtl_433_control():

FILE: examples/rtl_433_http_events.py
  function stream_events (line 19) | def stream_events():
  function handle_event (line 32) | def handle_event(line):
  function rtl_433_listen (line 69) | def rtl_433_listen():

FILE: examples/rtl_433_http_stream.php
  function str__contains (line 46) | function str__contains($haystack,$needle)

FILE: examples/rtl_433_http_stream.py
  function stream_lines (line 19) | def stream_lines():
  function handle_event (line 32) | def handle_event(line):
  function rtl_433_listen (line 69) | def rtl_433_listen():

FILE: examples/rtl_433_http_ws.py
  function ws_events (line 19) | def ws_events():
  function handle_event (line 31) | def handle_event(line):
  function rtl_433_listen (line 68) | def rtl_433_listen():

FILE: examples/rtl_433_influxdb_relay.py
  function sanitize (line 44) | def sanitize(text):
  function parse_syslog (line 48) | def parse_syslog(line):
  function rtl_433_probe (line 58) | def rtl_433_probe():
  function run (line 106) | def run():

FILE: examples/rtl_433_json_to_rtlwmbus.py
  function sanitize (line 18) | def sanitize(text):
  function rtl_433_wmbus (line 21) | def rtl_433_wmbus():

FILE: examples/rtl_433_mqtt_hass.py
  function mqtt_connect (line 857) | def mqtt_connect(client, userdata, flags, rc):
  function mqtt_disconnect (line 868) | def mqtt_disconnect(client, userdata, rc):
  function mqtt_message (line 873) | def mqtt_message(client, userdata, msg):
  function sanitize (line 889) | def sanitize(text):
  function rtl_433_device_info (line 897) | def rtl_433_device_info(data, topic_prefix):
  function publish_config (line 925) | def publish_config(mqttc, topic, model, object_id, mapping, key=None):
  function bridge_event_to_hass (line 971) | def bridge_event_to_hass(mqttc, topic_prefix, data):
  function rtl_433_bridge (line 1019) | def rtl_433_bridge():
  function run (line 1047) | def run():

FILE: examples/rtl_433_mqtt_relay.py
  class rtlconfig (line 34) | class rtlconfig(object):
    method __init__ (line 59) | def __init__(self, f=None):
    method __getitem__ (line 78) | def __getitem__(self, k):
  class dedup (line 81) | class dedup(object):
    method __init__ (line 90) | def __init__(self):
    method send_store (line 99) | def send_store(self, report, n):
    method equiv (line 105) | def equiv(self, j1, j2):
    method is_interesting (line 130) | def is_interesting(self, report):
  function mqtt_connect (line 157) | def mqtt_connect(client, userdata, flags, rc):
  function mqtt_disconnect (line 162) | def mqtt_disconnect(client, userdata, rc):
  function sanitize (line 174) | def sanitize(text):
  function publish_sensor_to_mqtt (line 183) | def publish_sensor_to_mqtt(mqttc, data, line):
  function parse_syslog (line 223) | def parse_syslog(line):
  function rtl_433_probe (line 237) | def rtl_433_probe():
  function run (line 267) | def run():

FILE: examples/rtl_433_prometheus_relay.py
  class rtl_433 (line 36) | class rtl_433(object):
    method __init__ (line 56) | def __init__(self, stream):
    method loop (line 59) | def loop(self):
    method grab_id (line 101) | def grab_id(pkt):
    method metrics (line 112) | def metrics(self):
    method clean_log (line 132) | def clean_log(self):
  function syslog_reader (line 150) | def syslog_reader(udp_port, udp_ip="0.0.0.0"):
  class MetricsHandler (line 166) | class MetricsHandler(http.server.BaseHTTPRequestHandler):
    method do_GET (line 167) | def do_GET(self):
  class MetricsServer (line 174) | class MetricsServer(http.server.HTTPServer):
    method handle_error (line 175) | def handle_error(self, req, addr):

FILE: examples/rtl_433_rrd_relay.py
  function create_rrd (line 30) | def create_rrd(rrdfile):
  function update_rrd (line 46) | def update_rrd(rrdfile, temperature, humidity):
  function graph_rrd (line 51) | def graph_rrd(rrdfile, label, path=""):
  function sanitize (line 73) | def sanitize(text):
  function parse_syslog (line 77) | def parse_syslog(line):
  function rtl_433_probe (line 87) | def rtl_433_probe(sock):
  function run (line 134) | def run(run_as_daemon=False):

FILE: examples/rtl_433_statsd_pipe.py
  function sanitize (line 15) | def sanitize(text):
  function rtl_433_probe (line 19) | def rtl_433_probe():

FILE: examples/rtl_433_statsd_relay.py
  function sanitize (line 27) | def sanitize(text):
  function parse_syslog (line 31) | def parse_syslog(line):
  function rtl_433_probe (line 41) | def rtl_433_probe():

FILE: include/abuf.h
  type abuf_t (line 28) | typedef struct abuf {

FILE: include/am_analyze.h
  type am_analyze_t (line 20) | typedef struct am_analyze {

FILE: include/baseband.h
  type filter_state_t (line 91) | typedef struct filter_state {
  type demodfm_state_t (line 97) | typedef struct demodfm_state {

FILE: include/bitbuffer.h
  type bitrow_t (line 30) | typedef bitrow_t bitarray_t[BITBUF_ROWS];
  type bitbuffer_t (line 33) | typedef struct bitbuffer {
  function bitrow_get_bit (line 157) | static inline uint8_t bitrow_get_bit(uint8_t const *bitrow, unsigned bit...
  function bitrow_get_byte (line 163) | static inline uint8_t bitrow_get_byte(uint8_t const *bitrow, unsigned bi...

FILE: include/compat_pthread.h
  type HANDLE (line 16) | typedef HANDLE                          pthread_t;
  type HANDLE (line 23) | typedef HANDLE                          pthread_mutex_t;
  type CONDITION_VARIABLE (line 29) | typedef CONDITION_VARIABLE              pthread_cond_t;

FILE: include/compat_time.h
  type timeval (line 27) | struct timeval
  type timeval (line 27) | struct timeval
  type timeval (line 27) | struct timeval
  type timeval (line 32) | struct timeval

FILE: include/confparse.h
  type conf_keywords (line 15) | struct conf_keywords {
  type conf_keywords (line 41) | struct conf_keywords

FILE: include/data.h
  type data_type_t (line 45) | typedef enum {
  type data_array_t (line 56) | typedef struct data_array {
  type data_value_t (line 64) | typedef union data_value {
  type data_t (line 70) | typedef struct data {
  type data_output (line 179) | struct data_output
  type data_output_t (line 181) | typedef struct data_output {
  type data_output (line 200) | struct data_output
  type data_output (line 203) | struct data_output
  type data_output (line 205) | struct data_output

FILE: include/data_tag.h
  type gpsd_client (line 15) | struct gpsd_client
  type mg_mgr (line 16) | struct mg_mgr
  type data (line 17) | struct data
  type data_tag_t (line 19) | typedef struct data_tag {
  type mg_mgr (line 27) | struct mg_mgr
  type data (line 33) | struct data
  type data (line 33) | struct data

FILE: include/fileformat.h
  type file_type (line 22) | enum file_type {
  type file_info_t (line 75) | typedef struct {

FILE: include/http_server.h
  type mg_mgr (line 17) | struct mg_mgr
  type r_cfg (line 18) | struct r_cfg
  type data_output (line 20) | struct data_output
  type mg_mgr (line 20) | struct mg_mgr
  type r_cfg (line 20) | struct r_cfg

FILE: include/jsmn.h
  type jsmntype_t (line 17) | typedef enum {
  type jsmnerr (line 25) | enum jsmnerr {
  type jsmntok_t (line 40) | typedef struct {
  type jsmn_parser (line 54) | typedef struct {

FILE: include/list.h
  type list_t (line 18) | typedef struct list {

FILE: include/logger.h
  type log_level_t (line 23) | typedef enum log_level {

FILE: include/mongoose.h
  type socklen_t (line 273) | typedef int socklen_t;
  type __int64 (line 283) | typedef __int64 int64_t;
  type SOCKET (line 286) | typedef SOCKET sock_t;
  type in_addr_t (line 287) | typedef uint32_t in_addr_t;
  type cs_stat_t (line 300) | typedef struct _stati64 cs_stat_t;
  type sock_t (line 442) | typedef int sock_t;
  type cs_stat_t (line 445) | typedef struct stat cs_stat_t;
  type cs_stat_t (line 548) | typedef struct stat cs_stat_t;
  type cs_stat_t (line 603) | typedef struct stat cs_stat_t;
  type sock_t (line 686) | typedef int sock_t;
  type in_addr (line 697) | struct in_addr
  type sock_t (line 750) | typedef int sock_t;
  type cs_stat_t (line 753) | typedef struct stat cs_stat_t;
  type SlTimeval_t (line 769) | struct SlTimeval_t
  type timeval (line 771) | struct timeval
  type timeval (line 772) | struct timeval
  type mode_t (line 783) | typedef unsigned int mode_t;
  type _off_t (line 784) | typedef size_t _off_t;
  type stat (line 787) | struct stat {
  type stat (line 795) | struct stat
  type stat (line 796) | struct stat
  type sock_t (line 889) | typedef int sock_t;
  type cs_stat_t (line 892) | typedef struct stat cs_stat_t;
  type SlTimeval_t (line 908) | struct SlTimeval_t
  type timeval (line 910) | struct timeval
  type timeval (line 911) | struct timeval
  type mode_t (line 922) | typedef unsigned int mode_t;
  type _off_t (line 923) | typedef size_t _off_t;
  type stat (line 926) | struct stat {
  type stat (line 934) | struct stat
  type stat (line 935) | struct stat
  type sock_t (line 1005) | typedef int sock_t;
  type cs_stat_t (line 1008) | typedef struct stat cs_stat_t;
  type SlTimeval_t (line 1024) | struct SlTimeval_t
  type timeval (line 1026) | struct timeval
  type mode_t (line 1034) | typedef unsigned int mode_t;
  type _off_t (line 1035) | typedef size_t _off_t;
  type stat (line 1038) | struct stat {
  type stat (line 1046) | struct stat
  type cs_stat_t (line 1121) | typedef struct stat cs_stat_t;
  type cs_stat_t (line 1199) | typedef struct stat cs_stat_t;
  type suseconds_t (line 1217) | typedef long suseconds_t;
  type timeval (line 1218) | struct timeval {
  type sock_t (line 1231) | typedef int sock_t;
  type in_addr (line 1242) | struct in_addr
  type in_addr (line 1244) | struct in_addr
  type timeval (line 1294) | struct timeval
  type timeval (line 1295) | struct timeval
  type in_addr (line 1471) | struct in_addr
  type mg_mgr (line 1474) | struct mg_mgr
  type mg_connection (line 1475) | struct mg_connection
  type mg_mgr (line 1477) | struct mg_mgr
  type mg_mgr (line 1480) | struct mg_mgr
  type mg_mgr (line 1484) | struct mg_mgr
  type mg_connection (line 1486) | struct mg_connection
  type socklen_t (line 1624) | typedef int socklen_t;
  type __int64 (line 1635) | typedef __int64 int64_t;
  type SOCKET (line 1639) | typedef SOCKET sock_t;
  type in_addr_t (line 1640) | typedef uint32_t in_addr_t;
  type cs_stat_t (line 1707) | typedef struct _stati64 {
  type cs_stat_t (line 1781) | typedef struct stat cs_stat_t;
  type cs_stat_t (line 1850) | typedef struct stat cs_stat_t;
  type TCP_SOCKET (line 1902) | typedef TCP_SOCKET sock_t;
  type in_addr (line 1912) | struct in_addr
  type cs_stat_t (line 1964) | typedef struct stat cs_stat_t;
  type cs_stat_t (line 2022) | typedef struct stat cs_stat_t;
  type sock_t (line 2101) | typedef int sock_t;
  type mg_mgr (line 2104) | struct mg_mgr
  type mg_connection (line 2105) | struct mg_connection
  type mg_connection (line 2106) | struct mg_connection
  type cs_md5_ctx (line 2151) | typedef struct {
  type cs_sha1_ctx (line 2201) | typedef struct {
  type tm (line 2258) | struct tm
  type mg_str (line 2295) | struct mg_str {
  type mg_str (line 2304) | struct mg_str
  type mg_str (line 2309) | struct mg_str
  type mg_str (line 2323) | struct mg_str
  type mg_str (line 2329) | struct mg_str
  type mg_str (line 2332) | struct mg_str
  type mg_str (line 2332) | struct mg_str
  type mg_str (line 2338) | struct mg_str
  type mg_str (line 2338) | struct mg_str
  type mg_str (line 2343) | struct mg_str
  type mg_str (line 2348) | struct mg_str
  type mg_str (line 2348) | struct mg_str
  type mg_str (line 2353) | struct mg_str
  type mg_str (line 2353) | struct mg_str
  type mg_str (line 2358) | struct mg_str
  type mg_str (line 2363) | struct mg_str
  type mg_str (line 2363) | struct mg_str
  type mg_str (line 2366) | struct mg_str
  type mg_str (line 2366) | struct mg_str
  type mg_str (line 2369) | struct mg_str
  type mg_str (line 2369) | struct mg_str
  type mbuf (line 2426) | struct mbuf {
  type mbuf (line 2436) | struct mbuf
  type mbuf (line 2439) | struct mbuf
  type mbuf (line 2446) | struct mbuf
  type mbuf (line 2454) | struct mbuf
  type mbuf (line 2463) | struct mbuf
  type mbuf (line 2466) | struct mbuf
  type mbuf (line 2474) | struct mbuf
  type mbuf (line 2477) | struct mbuf
  type mbuf (line 2477) | struct mbuf
  type mbuf (line 2480) | struct mbuf
  type mbuf (line 2483) | struct mbuf
  type cs_base64_ctx (line 2527) | struct cs_base64_ctx {
  type cs_base64_ctx (line 2535) | struct cs_base64_ctx
  type cs_base64_ctx (line 2537) | struct cs_base64_ctx
  type cs_base64_ctx (line 2538) | struct cs_base64_ctx
  type mg_str (line 2717) | struct mg_str
  type mg_str (line 2718) | struct mg_str
  type mg_str (line 2725) | struct mg_str
  type mg_str (line 2725) | struct mg_str
  type mg_str (line 2725) | struct mg_str
  type mg_str (line 2726) | struct mg_str
  type mg_str (line 2753) | struct mg_str
  type mg_str (line 2753) | struct mg_str
  type qm_trace (line 2874) | struct qm_trace {
  type type (line 3027) | struct type
  type type (line 3173) | struct type
  type type (line 3300) | struct type
  type type (line 3317) | struct type
  type mg_mgr (line 3723) | struct mg_mgr
  type mg_connection (line 3724) | struct mg_connection
  type mg_iface_vtable (line 3727) | struct mg_iface_vtable
  type mg_iface (line 3729) | struct mg_iface {
  type mg_iface_vtable (line 3735) | struct mg_iface_vtable {
  type mg_iface_vtable (line 3773) | struct mg_iface_vtable
  type mg_iface (line 3777) | struct mg_iface
  type mg_iface_vtable (line 3777) | struct mg_iface_vtable
  type mg_mgr (line 3778) | struct mg_mgr
  type mg_iface (line 3784) | struct mg_iface
  type mg_mgr (line 3784) | struct mg_mgr
  type mg_iface_vtable (line 3785) | struct mg_iface_vtable
  type mg_iface (line 3786) | struct mg_iface
  type mg_connection (line 3793) | struct mg_connection
  type mg_connection (line 3793) | struct mg_connection
  type mg_connection (line 3794) | struct mg_connection
  type mg_connection (line 3798) | struct mg_connection
  type mg_connection (line 3803) | struct mg_connection
  type mg_connection (line 3804) | struct mg_connection
  type mg_connection (line 3809) | struct mg_connection
  type mg_connection (line 3815) | struct mg_connection
  type mg_mgr (line 3821) | struct mg_mgr
  type mg_ssl_if_ctx (line 3845) | struct mg_ssl_if_ctx
  type mg_connection (line 3846) | struct mg_connection
  type mg_ssl_if_result (line 3850) | enum mg_ssl_if_result {
  type mg_ssl_if_conn_params (line 3857) | struct mg_ssl_if_conn_params {
  type mg_ssl_if_result (line 3867) | enum mg_ssl_if_result
  type mg_connection (line 3868) | struct mg_connection
  type mg_ssl_if_conn_params (line 3868) | struct mg_ssl_if_conn_params
  type mg_ssl_if_result (line 3870) | enum mg_ssl_if_result
  type mg_connection (line 3870) | struct mg_connection
  type mg_connection (line 3871) | struct mg_connection
  type mg_connection (line 3872) | struct mg_connection
  type mg_connection (line 3873) | struct mg_connection
  type mg_ssl_if_result (line 3875) | enum mg_ssl_if_result
  type mg_connection (line 3875) | struct mg_connection
  type mg_connection (line 3876) | struct mg_connection
  type mg_connection (line 3877) | struct mg_connection
  type sockaddr (line 3940) | struct sockaddr
  type sockaddr_in (line 3941) | struct sockaddr_in
  type sockaddr_in6 (line 3943) | struct sockaddr_in6
  type sockaddr (line 3945) | struct sockaddr
  type mg_connection (line 3949) | struct mg_connection
  type mg_connection (line 3955) | struct mg_connection
  type mg_mgr (line 3970) | struct mg_mgr {
  type mg_connection (line 3988) | struct mg_connection {
  type mg_mgr (line 4056) | struct mg_mgr
  type mg_mgr_init_opts (line 4073) | struct mg_mgr_init_opts {
  type mg_mgr (line 4086) | struct mg_mgr
  type mg_mgr_init_opts (line 4087) | struct mg_mgr_init_opts
  type mg_mgr (line 4094) | struct mg_mgr
  type mg_mgr (line 4104) | struct mg_mgr
  type mg_mgr (line 4119) | struct mg_mgr
  type mg_connection (line 4136) | struct mg_connection
  type mg_mgr (line 4136) | struct mg_mgr
  type mg_connection (line 4136) | struct mg_connection
  type mg_add_sock_opts (line 4144) | struct mg_add_sock_opts {
  type mg_connection (line 4157) | struct mg_connection
  type mg_mgr (line 4157) | struct mg_mgr
  type mg_connection (line 4167) | struct mg_connection
  type mg_mgr (line 4167) | struct mg_mgr
  type mg_add_sock_opts (line 4170) | struct mg_add_sock_opts
  type mg_bind_opts (line 4178) | struct mg_bind_opts {
  type mg_connection (line 4216) | struct mg_connection
  type mg_mgr (line 4216) | struct mg_mgr
  type mg_connection (line 4237) | struct mg_connection
  type mg_mgr (line 4237) | struct mg_mgr
  type mg_bind_opts (line 4240) | struct mg_bind_opts
  type mg_connect_opts (line 4243) | struct mg_connect_opts {
  type mg_connection (line 4302) | struct mg_connection
  type mg_mgr (line 4302) | struct mg_mgr
  type mg_connection (line 4354) | struct mg_connection
  type mg_mgr (line 4354) | struct mg_mgr
  type mg_connect_opts (line 4357) | struct mg_connect_opts
  type mg_connection (line 4374) | struct mg_connection
  type mg_connection (line 4385) | struct mg_connection
  type mg_connection (line 4398) | struct mg_connection
  type mg_connection (line 4401) | struct mg_connection
  type mg_connection (line 4470) | struct mg_connection
  type mg_str (line 4526) | struct mg_str
  type mg_str (line 4526) | struct mg_str
  type mg_str (line 4527) | struct mg_str
  type mg_str (line 4527) | struct mg_str
  type mg_str (line 4528) | struct mg_str
  type mg_str (line 4528) | struct mg_str
  type mg_str (line 4529) | struct mg_str
  type mg_str (line 4540) | struct mg_str
  type mg_str (line 4540) | struct mg_str
  type mg_str (line 4541) | struct mg_str
  type mg_str (line 4542) | struct mg_str
  type mg_str (line 4542) | struct mg_str
  type mg_str (line 4543) | struct mg_str
  type mg_str (line 4544) | struct mg_str
  type mg_str (line 4546) | struct mg_str
  type mg_str (line 4546) | struct mg_str
  type mg_str (line 4594) | struct mg_str
  type mg_connection (line 4691) | struct mg_connection
  type mg_connection (line 4727) | struct mg_connection
  type mbuf (line 4744) | struct mbuf
  type mg_str (line 4751) | struct mg_str
  type mg_str (line 4751) | struct mg_str
  type mbuf (line 4752) | struct mbuf
  type mg_str (line 4763) | struct mg_str
  type mg_str (line 4763) | struct mg_str
  type mg_str (line 4764) | struct mg_str
  type mg_str (line 4767) | struct mg_str
  type mg_str (line 4767) | struct mg_str
  type http_message (line 4814) | struct http_message {
  type websocket_message (line 4844) | struct websocket_message {
  type mg_http_multipart_part (line 4852) | struct mg_http_multipart_part {
  type mg_ssi_call_ctx (line 4869) | struct mg_ssi_call_ctx {
  type mg_connection (line 4952) | struct mg_connection
  type mg_connection (line 4969) | struct mg_connection
  type mg_connection (line 4982) | struct mg_connection
  type mg_connection (line 4987) | struct mg_connection
  type mg_connection (line 4994) | struct mg_connection
  type mg_str (line 4995) | struct mg_str
  type mg_str (line 4996) | struct mg_str
  type mg_str (line 4997) | struct mg_str
  type mg_str (line 4998) | struct mg_str
  type mg_str (line 4999) | struct mg_str
  type mg_str (line 5000) | struct mg_str
  type mg_connection (line 5022) | struct mg_connection
  type mg_mgr (line 5022) | struct mg_mgr
  type mg_connection (line 5034) | struct mg_connection
  type mg_mgr (line 5035) | struct mg_mgr
  type mg_connect_opts (line 5036) | struct mg_connect_opts
  type mg_connection (line 5057) | struct mg_connection
  type mg_connection (line 5064) | struct mg_connection
  type mg_str (line 5065) | struct mg_str
  type mg_connection (line 5073) | struct mg_connection
  type http_message (line 5133) | struct http_message
  type mg_str (line 5133) | struct mg_str
  type mg_connection (line 5140) | struct mg_connection
  type http_message (line 5174) | struct http_message
  type mg_str (line 5182) | struct mg_str
  type http_message (line 5182) | struct http_message
  type mg_str (line 5206) | struct mg_str
  type mg_str (line 5216) | struct mg_str
  type http_message (line 5229) | struct http_message
  type mg_str (line 5237) | struct mg_str
  type mg_str (line 5290) | struct mg_str
  type mg_serve_http_opts (line 5298) | struct mg_serve_http_opts {
  type mg_connection (line 5474) | struct mg_connection
  type http_message (line 5474) | struct http_message
  type mg_serve_http_opts (line 5475) | struct mg_serve_http_opts
  type mg_connection (line 5496) | struct mg_connection
  type http_message (line 5496) | struct http_message
  type mg_str (line 5497) | struct mg_str
  type mg_str (line 5498) | struct mg_str
  type mg_str (line 5503) | struct mg_str
  type mg_connection (line 5503) | struct mg_connection
  type mg_str (line 5504) | struct mg_str
  type mg_connection (line 5538) | struct mg_connection
  type mg_connection (line 5571) | struct mg_connection
  type mg_http_endpoint_opts (line 5575) | struct mg_http_endpoint_opts {
  type mg_connection (line 5582) | struct mg_connection
  type mg_http_endpoint_opts (line 5585) | struct mg_http_endpoint_opts
  type http_message (line 5591) | struct http_message
  type mg_str (line 5600) | struct mg_str
  type mg_str (line 5600) | struct mg_str
  type mg_str (line 5601) | struct mg_str
  type mg_str (line 5601) | struct mg_str
  type mg_str (line 5602) | struct mg_str
  type mg_str (line 5602) | struct mg_str
  type mg_str (line 5603) | struct mg_str
  type mg_str (line 5603) | struct mg_str
  type mg_str (line 5604) | struct mg_str
  type mg_connection (line 5624) | struct mg_connection
  type mg_connection (line 5630) | struct mg_connection
  type mg_connection (line 5645) | struct mg_connection
  type mg_connection (line 5652) | struct mg_connection
  type mg_connection (line 5665) | struct mg_connection
  type mg_str (line 5666) | struct mg_str
  type mg_str (line 5667) | struct mg_str
  type mg_connection (line 5683) | struct mg_connection
  type mg_connection (line 5689) | struct mg_connection
  type mg_connection (line 5702) | struct mg_connection
  type http_message (line 5703) | struct http_message
  type mg_str (line 5703) | struct mg_str
  type mg_str (line 5704) | struct mg_str
  type mg_connection (line 5752) | struct mg_connection
  type mg_mgr (line 5753) | struct mg_mgr
  type mg_connection (line 5764) | struct mg_connection
  type mg_mgr (line 5765) | struct mg_mgr
  type mg_connect_opts (line 5766) | struct mg_connect_opts
  type mg_mqtt_message (line 5808) | struct mg_mqtt_message {
  type mg_mqtt_topic_expression (line 5830) | struct mg_mqtt_topic_expression {
  type mg_send_mqtt_handshake_opts (line 5835) | struct mg_send_mqtt_handshake_opts {
  type mg_mqtt_proto_data (line 5845) | struct mg_mqtt_proto_data {
  type mg_connection (line 5925) | struct mg_connection
  type mg_connection (line 5928) | struct mg_connection
  type mg_connection (line 5931) | struct mg_connection
  type mg_send_mqtt_handshake_opts (line 5932) | struct mg_send_mqtt_handshake_opts
  type mg_connection (line 5935) | struct mg_connection
  type mg_connection (line 5940) | struct mg_connection
  type mg_mqtt_topic_expression (line 5941) | struct mg_mqtt_topic_expression
  type mg_connection (line 5945) | struct mg_connection
  type mg_connection (line 5949) | struct mg_connection
  type mg_connection (line 5952) | struct mg_connection
  type mg_connection (line 5955) | struct mg_connection
  type mg_connection (line 5958) | struct mg_connection
  type mg_connection (line 5961) | struct mg_connection
  type mg_connection (line 5964) | struct mg_connection
  type mg_connection (line 5970) | struct mg_connection
  type mg_connection (line 5974) | struct mg_connection
  type mg_connection (line 5977) | struct mg_connection
  type mg_connection (line 5980) | struct mg_connection
  type mg_mqtt_message (line 5989) | struct mg_mqtt_message
  type mg_str (line 5990) | struct mg_str
  type mg_str (line 5997) | struct mg_str
  type mg_str (line 5997) | struct mg_str
  type mg_str (line 6003) | struct mg_str
  type mg_mqtt_broker (line 6050) | struct mg_mqtt_broker
  type mg_mqtt_session (line 6053) | struct mg_mqtt_session {
  type mg_mqtt_broker (line 6063) | struct mg_mqtt_broker {
  type mg_mqtt_broker (line 6069) | struct mg_mqtt_broker
  type mg_connection (line 6096) | struct mg_connection
  type mg_mqtt_session (line 6108) | struct mg_mqtt_session
  type mg_mqtt_broker (line 6108) | struct mg_mqtt_broker
  type mg_mqtt_session (line 6109) | struct mg_mqtt_session
  type mg_dns_resource_record_kind (line 6153) | enum mg_dns_resource_record_kind {
  type mg_dns_resource_record (line 6160) | struct mg_dns_resource_record {
  type mg_dns_message (line 6170) | struct mg_dns_message {
  type mg_dns_resource_record (line 6180) | struct mg_dns_resource_record
  type mg_dns_message (line 6181) | struct mg_dns_message
  type mg_dns_resource_record (line 6181) | struct mg_dns_resource_record
  type mg_dns_message (line 6194) | struct mg_dns_message
  type mg_dns_resource_record (line 6195) | struct mg_dns_resource_record
  type mg_connection (line 6201) | struct mg_connection
  type mbuf (line 6209) | struct mbuf
  type mg_dns_message (line 6210) | struct mg_dns_message
  type mbuf (line 6220) | struct mbuf
  type mg_dns_message (line 6220) | struct mg_dns_message
  type mbuf (line 6238) | struct mbuf
  type mg_dns_resource_record (line 6238) | struct mg_dns_resource_record
  type mbuf (line 6245) | struct mbuf
  type mg_dns_message (line 6248) | struct mg_dns_message
  type mg_dns_message (line 6263) | struct mg_dns_message
  type mg_str (line 6263) | struct mg_str
  type mg_connection (line 6278) | struct mg_connection
  type mg_dns_reply (line 6311) | struct mg_dns_reply {
  type mg_dns_reply (line 6345) | struct mg_dns_reply
  type mbuf (line 6345) | struct mbuf
  type mg_dns_message (line 6346) | struct mg_dns_message
  type mg_dns_reply (line 6356) | struct mg_dns_reply
  type mg_dns_resource_record (line 6357) | struct mg_dns_resource_record
  type mg_connection (line 6373) | struct mg_connection
  type mg_dns_reply (line 6373) | struct mg_dns_reply
  type mg_resolve_err (line 6402) | enum mg_resolve_err {
  type mg_dns_message (line 6409) | struct mg_dns_message
  type mg_resolve_err (line 6410) | enum mg_resolve_err
  type mg_resolve_async_opts (line 6413) | struct mg_resolve_async_opts {
  type mg_mgr (line 6423) | struct mg_mgr
  type mg_mgr (line 6427) | struct mg_mgr
  type mg_mgr (line 6450) | struct mg_mgr
  type mg_resolve_async_opts (line 6452) | struct mg_resolve_async_opts
  type mg_coap_option (line 6540) | struct mg_coap_option {
  type mg_coap_message (line 6547) | struct mg_coap_message {
  type mg_connection (line 6564) | struct mg_connection
  type mg_coap_option (line 6571) | struct mg_coap_option
  type mg_coap_message (line 6571) | struct mg_coap_message
  type mg_coap_message (line 6579) | struct mg_coap_message
  type mg_connection (line 6592) | struct mg_connection
  type mg_coap_message (line 6593) | struct mg_coap_message
  type mg_connection (line 6600) | struct mg_connection
  type mbuf (line 6617) | struct mbuf
  type mg_coap_message (line 6617) | struct mg_coap_message
  type mg_coap_message (line 6624) | struct mg_coap_message
  type mbuf (line 6624) | struct mbuf
  type mg_sntp_message (line 6660) | struct mg_sntp_message {
  type mg_connection (line 6668) | struct mg_connection
  type mg_mgr (line 6668) | struct mg_mgr
  type mg_connection (line 6674) | struct mg_connection
  type mg_connection (line 6683) | struct mg_connection
  type mg_mgr (line 6683) | struct mg_mgr
  type mg_socks_handshake_method (line 6709) | enum mg_socks_handshake_method {
  type mg_socks_command (line 6717) | enum mg_socks_command {
  type mg_socks_address_type (line 6724) | enum mg_socks_address_type {
  type mg_socks_response (line 6731) | enum mg_socks_response {
  type mg_connection (line 6748) | struct mg_connection
  type mg_iface (line 6751) | struct mg_iface
  type mg_mgr (line 6751) | struct mg_mgr

FILE: include/optparse.h
  type tls_opts_t (line 27) | typedef struct tls_opts {

FILE: include/output_file.h
  type data_output (line 25) | struct data_output
  type data_output (line 27) | struct data_output
  type data_output (line 29) | struct data_output

FILE: include/output_influx.h
  type mg_mgr (line 19) | struct mg_mgr
  type data_output (line 21) | struct data_output
  type mg_mgr (line 21) | struct mg_mgr

FILE: include/output_log.h
  type data_output (line 25) | struct data_output

FILE: include/output_mqtt.h
  type mg_mgr (line 17) | struct mg_mgr
  type data_output (line 19) | struct data_output
  type mg_mgr (line 19) | struct mg_mgr

FILE: include/output_rtltcp.h
  type r_cfg (line 19) | struct r_cfg
  type raw_output (line 30) | struct raw_output
  type r_cfg (line 30) | struct r_cfg

FILE: include/output_trigger.h
  type data_output (line 31) | struct data_output

FILE: include/output_udp.h
  type data_output (line 17) | struct data_output

FILE: include/pulse_analyzer.h
  type r_device (line 17) | struct r_device
  type r_device (line 20) | struct r_device

FILE: include/pulse_data.h
  type pulse_data_t (line 30) | typedef struct pulse_data {
  type timeval (line 71) | struct timeval

FILE: include/pulse_detect.h
  type package_types (line 22) | enum package_types {
  type pulse_detect_t (line 35) | typedef struct pulse_detect pulse_detect_t;

FILE: include/pulse_detect_fsk.h
  type pulse_detect_fsk_t (line 23) | typedef struct {

FILE: include/r_api.h
  type r_cfg (line 17) | struct r_cfg
  type r_device (line 18) | struct r_device
  type data (line 19) | struct data
  type pulse_data (line 20) | struct pulse_data
  type list (line 21) | struct list
  type mg_mgr (line 22) | struct mg_mgr
  type r_cfg (line 28) | struct r_cfg
  type r_cfg (line 30) | struct r_cfg
  type r_cfg (line 32) | struct r_cfg
  type r_cfg (line 36) | struct r_cfg
  type r_device (line 36) | struct r_device
  type r_device (line 38) | struct r_device
  type r_cfg (line 40) | struct r_cfg
  type r_device (line 40) | struct r_device
  type r_cfg (line 42) | struct r_cfg
  type r_cfg (line 46) | struct r_cfg
  type pulse_data (line 46) | struct pulse_data
  type r_cfg (line 48) | struct r_cfg
  type r_cfg (line 50) | struct r_cfg
  type r_cfg (line 52) | struct r_cfg
  type list (line 54) | struct list
  type pulse_data (line 54) | struct pulse_data
  type list (line 56) | struct list
  type pulse_data (line 56) | struct pulse_data
  type r_cfg (line 60) | struct r_cfg
  type r_cfg (line 62) | struct r_cfg
  type data (line 62) | struct data
  type r_device (line 64) | struct r_device
  type data (line 64) | struct data
  type r_device (line 66) | struct r_device
  type data (line 66) | struct data
  type data (line 68) | struct data
  type r_cfg (line 68) | struct r_cfg
  type r_cfg (line 70) | struct r_cfg
  type r_cfg (line 74) | struct r_cfg
  type r_cfg (line 76) | struct r_cfg
  type r_cfg (line 78) | struct r_cfg
  type r_cfg (line 80) | struct r_cfg
  type r_cfg (line 82) | struct r_cfg
  type r_cfg (line 84) | struct r_cfg
  type r_cfg (line 86) | struct r_cfg
  type r_cfg (line 88) | struct r_cfg
  type r_cfg (line 90) | struct r_cfg
  type r_cfg (line 92) | struct r_cfg
  type r_cfg (line 94) | struct r_cfg
  type r_cfg (line 96) | struct r_cfg
  type r_cfg (line 98) | struct r_cfg
  type r_cfg (line 100) | struct r_cfg
  type r_cfg (line 102) | struct r_cfg
  type r_cfg (line 104) | struct r_cfg
  type r_cfg (line 106) | struct r_cfg
  type r_cfg (line 108) | struct r_cfg
  type mg_mgr (line 112) | struct mg_mgr
  type r_cfg (line 112) | struct r_cfg
  type r_cfg (line 114) | struct r_cfg
  type r_cfg (line 116) | struct r_cfg
  type r_cfg (line 118) | struct r_cfg
  type r_cfg (line 120) | struct r_cfg

FILE: include/r_device.h
  type modulation_types (line 24) | enum modulation_types {
  type decode_return_codes (line 44) | enum decode_return_codes {
  type bitbuffer (line 54) | struct bitbuffer
  type data (line 55) | struct data
  type r_device (line 58) | typedef struct r_device {

FILE: include/r_private.h
  type dm_state (line 19) | struct dm_state {

FILE: include/r_util.h
  type timeval (line 42) | struct timeval
  type timeval (line 62) | struct timeval
  type timeval (line 70) | struct timeval

FILE: include/raw_output.h
  type raw_output (line 17) | struct raw_output
  type raw_output_t (line 19) | typedef struct raw_output {
  type raw_output (line 24) | struct raw_output
  type raw_output (line 26) | struct raw_output

FILE: include/rtl_433.h
  type sdr_dev (line 27) | struct sdr_dev
  type r_device (line 28) | struct r_device
  type mg_mgr (line 29) | struct mg_mgr
  type conversion_mode_t (line 31) | typedef enum {
  type time_mode_t (line 37) | typedef enum {
  type device_mode_t (line 46) | typedef enum {
  type device_state_t (line 53) | typedef enum {
  type r_cfg_t (line 60) | typedef struct r_cfg {

FILE: include/samp_grab.h
  type samp_grab_t (line 17) | typedef struct samp_grab {

FILE: include/sdr.h
  type sdr_dev_t (line 20) | typedef struct sdr_dev sdr_dev_t;
  type sdr_event_flags_t (line 22) | typedef enum sdr_event_flags {
  type sdr_event_t (line 31) | typedef struct sdr_event {

FILE: include/term_ctl.h
  type term_color_t (line 27) | typedef enum term_color {

FILE: maintainer_update.py
  function require_clean_work_tree (line 11) | def require_clean_work_tree():
  function grep_lines (line 19) | def grep_lines(pattern, filepath):
  function replace_text (line 26) | def replace_text(pattern, repl, filepath):
  function replace_block (line 35) | def replace_block(from_pattern, to_pattern, repl, filepath):
  function get_help_text (line 46) | def get_help_text(option):
  function markup_man_text (line 60) | def markup_man_text(help_text):
  function parse_devices (line 75) | def parse_devices(devices_text):

FILE: src/abuf.c
  function abuf_init (line 19) | void abuf_init(abuf_t *buf, char *dst, size_t len)
  function abuf_setnull (line 26) | void abuf_setnull(abuf_t *buf)
  function abuf_pop (line 38) | void abuf_pop(abuf_t *buf, char *end)
  function abuf_cat (line 44) | void abuf_cat(abuf_t *buf, char const *str)
  function abuf_printf (line 54) | int abuf_printf(abuf_t *buf, _Printf_format_string_ char const *restrict...

FILE: src/am_analyze.c
  function am_analyze_t (line 25) | am_analyze_t *am_analyze_create(void)
  function am_analyze_free (line 34) | void am_analyze_free(am_analyze_t *a)
  function am_analyze_skip (line 39) | void am_analyze_skip(am_analyze_t *a, unsigned n_samples)
  function am_analyze (line 45) | void am_analyze(am_analyze_t *a, int16_t *am_buf, unsigned n_samples, in...
  function am_analyze_classify (line 110) | void am_analyze_classify(am_analyze_t *aa)

FILE: src/baseband.c
  function calc_squares (line 25) | static void calc_squares(void)
  function envelope_detect (line 36) | float envelope_detect(uint8_t const *iq_buf, uint16_t *y_buf, uint32_t len)
  function envelope_detect_nolut (line 50) | float envelope_detect_nolut(uint8_t const *iq_buf, uint16_t *y_buf, uint...
  function magnitude_est_cu8 (line 65) | float magnitude_est_cu8(uint8_t const *iq_buf, uint16_t *y_buf, uint32_t...
  function magnitude_true_cu8 (line 82) | float magnitude_true_cu8(uint8_t const *iq_buf, uint16_t *y_buf, uint32_...
  function magnitude_est_cs16 (line 96) | float magnitude_est_cs16(int16_t const *iq_buf, uint16_t *y_buf, uint32_...
  function magnitude_true_cs16 (line 113) | float magnitude_true_cs16(int16_t const *iq_buf, uint16_t *y_buf, uint32...
  function baseband_low_pass_filter_reset (line 126) | void baseband_low_pass_filter_reset(filter_state_t *lowpass_filter)
  function baseband_low_pass_filter (line 145) | void baseband_low_pass_filter(filter_state_t *state, uint16_t const *x_b...
  function atan2_int16 (line 181) | static int16_t atan2_int16(int32_t y, int32_t x)
  function baseband_demod_FM_reset (line 204) | void baseband_demod_FM_reset(demodfm_state_t *demod_fm)
  function baseband_demod_FM (line 210) | void baseband_demod_FM(demodfm_state_t *state, uint8_t const *x_buf, int...
  function atan2_int32 (line 281) | static int32_t atan2_int32(int32_t y, int32_t x)
  function baseband_demod_FM_cs16 (line 303) | void baseband_demod_FM_cs16(demodfm_state_t *state, int16_t const *x_buf...
  function baseband_init (line 368) | void baseband_init(void)

FILE: src/bit_util.c
  function reverse8 (line 18) | uint8_t reverse8(uint8_t x)
  function reverse32 (line 26) | uint32_t reverse32(uint32_t x)
  function reflect_bytes (line 34) | void reflect_bytes(uint8_t message[], unsigned num_bytes)
  function reflect4 (line 41) | uint8_t reflect4(uint8_t x)
  function reflect_nibbles (line 48) | void reflect_nibbles(uint8_t message[], unsigned num_bytes)
  function extract_nibbles_4b1s (line 55) | unsigned extract_nibbles_4b1s(uint8_t const *message, unsigned offset_bi...
  function extract_bytes_uart (line 73) | unsigned extract_bytes_uart(uint8_t const *message, unsigned offset_bits...
  function extract_bytes_uart_parity (line 100) | unsigned extract_bytes_uart_parity(uint8_t const *message, unsigned offs...
  function symbol_match (line 132) | static unsigned symbol_match(uint8_t const *message, unsigned offset_bit...
  function extract_bits_symbols (line 154) | unsigned extract_bits_symbols(uint8_t const *message, unsigned offset_bi...
  function crc4 (line 190) | uint8_t crc4(uint8_t const message[], unsigned nBytes, uint8_t polynomia...
  function crc7 (line 209) | uint8_t crc7(uint8_t const message[], unsigned nBytes, uint8_t polynomia...
  function crc8 (line 228) | uint8_t crc8(uint8_t const message[], unsigned nBytes, uint8_t polynomia...
  function crc8le (line 246) | uint8_t crc8le(uint8_t const message[], unsigned nBytes, uint8_t polynom...
  function crc16lsb (line 265) | uint16_t crc16lsb(uint8_t const message[], unsigned nBytes, uint16_t pol...
  function crc16 (line 284) | uint16_t crc16(uint8_t const message[], unsigned nBytes, uint16_t polyno...
  function lfsr_digest8 (line 303) | uint8_t lfsr_digest8(uint8_t const message[], unsigned bytes, uint8_t ge...
  function lfsr_digest8_reverse (line 327) | uint8_t lfsr_digest8_reverse(uint8_t const *message, int bytes, uint8_t ...
  function lfsr_digest8_reflect (line 352) | uint8_t lfsr_digest8_reflect(uint8_t const message[], int bytes, uint8_t...
  function lfsr_digest16 (line 377) | uint16_t lfsr_digest16(uint8_t const message[], unsigned bytes, uint16_t...
  function ccitt_whitening (line 403) | void ccitt_whitening(uint8_t *buffer, unsigned buffer_size)
  function ibm_whitening (line 431) | void ibm_whitening(uint8_t *buffer, unsigned buffer_size)
  function parity8 (line 478) | int parity8(uint8_t byte)
  function parity_bytes (line 485) | int parity_bytes(uint8_t const message[], unsigned num_bytes)
  function xor_bytes (line 494) | uint8_t xor_bytes(uint8_t const message[], unsigned num_bytes)
  function add_bytes (line 503) | int add_bytes(uint8_t const message[], unsigned num_bytes)
  function add_nibbles (line 512) | int add_nibbles(uint8_t const message[], unsigned num_bytes)
  function main (line 550) | int main(void) {

FILE: src/bitbuffer.c
  function bitbuffer_clear (line 17) | void bitbuffer_clear(bitbuffer_t *bits)
  function bitbuffer_add_bit (line 22) | void bitbuffer_add_bit(bitbuffer_t *bits, int bit)
  function bitbuffer_set_width (line 75) | static void bitbuffer_set_width(bitbuffer_t *bits, uint16_t width)
  function bitbuffer_add_row (line 104) | void bitbuffer_add_row(bitbuffer_t *bits)
  function bitbuffer_add_sync (line 121) | void bitbuffer_add_sync(bitbuffer_t *bits)
  function bitbuffer_invert (line 131) | void bitbuffer_invert(bitbuffer_t *bits)
  function bitbuffer_nrzs_decode (line 147) | void bitbuffer_nrzs_decode(bitbuffer_t *bits)
  function bitbuffer_nrzm_decode (line 167) | void bitbuffer_nrzm_decode(bitbuffer_t *bits)
  function bitbuffer_extract_bytes (line 187) | void bitbuffer_extract_bytes(bitbuffer_t *bitbuffer, unsigned row,
  function bit_at (line 217) | static inline uint8_t bit_at(const uint8_t *bytes, unsigned bit)
  function bitbuffer_search (line 222) | unsigned bitbuffer_search(bitbuffer_t *bitbuffer, unsigned row, unsigned...
  function bitbuffer_manchester_decode (line 248) | unsigned bitbuffer_manchester_decode(bitbuffer_t *inbuf, unsigned row, u...
  function bitbuffer_differential_manchester_decode (line 273) | unsigned bitbuffer_differential_manchester_decode(bitbuffer_t *inbuf, un...
  function print_bitrow (line 323) | static void print_bitrow(uint8_t const *bitrow, unsigned bit_len, unsign...
  function print_bitbuffer (line 348) | static void print_bitbuffer(const bitbuffer_t *bits, int always_binary)
  function bitbuffer_print (line 370) | void bitbuffer_print(const bitbuffer_t *bits)
  function bitbuffer_debug (line 375) | void bitbuffer_debug(const bitbuffer_t *bits)
  function bitrow_print (line 380) | void bitrow_print(uint8_t const *bitrow, unsigned bit_len)
  function bitrow_debug (line 385) | void bitrow_debug(uint8_t const *bitrow, unsigned bit_len)
  function bitrow_snprint (line 390) | int bitrow_snprint(uint8_t const *bitrow, unsigned bit_len, char *str, u...
  function bitbuffer_parse (line 402) | void bitbuffer_parse(bitbuffer_t *bits, const char *code)
  function bitbuffer_compare_rows (line 466) | int bitbuffer_compare_rows(bitbuffer_t *bits, unsigned row_a, unsigned r...
  function bitbuffer_count_repeats (line 485) | unsigned bitbuffer_count_repeats(bitbuffer_t *bits, unsigned row, unsign...
  function bitbuffer_find_repeated_row (line 496) | int bitbuffer_find_repeated_row(bitbuffer_t *bits, unsigned min_repeats,...
  function bitbuffer_find_repeated_prefix (line 507) | int bitbuffer_find_repeated_prefix(bitbuffer_t *bits, unsigned min_repea...
  function main (line 531) | int main(void)

FILE: src/compat_time.c
  function gettimeofday (line 19) | int gettimeofday(struct timeval *tv, void *tz)
  function timeval_subtract (line 38) | int timeval_subtract(struct timeval *result, struct timeval const *x, st...

FILE: src/confparse.c
  function off_t (line 37) | static off_t fsize(const char *path)
  function hasconf (line 46) | int hasconf(char const *path)
  function getconf (line 88) | int getconf(char **conf, struct conf_keywords const keywords[], char **arg)

FILE: src/data.c
  type data_meta_type_t (line 33) | typedef struct {
  function import_values (line 94) | static bool import_values(void *dst, void const *src, int num_values, da...
  function R_API (line 120) | R_API data_array_t *data_array(int num_values, data_type_t type, void co...
  function data_t (line 159) | static data_t *vdata_make(data_t *first, const char *key, const char *pr...
  function R_API (line 281) | R_API data_t *data_make(const char *key, const char *pretty_key, ...)
  function data_t (line 290) | static data_t *data_append(data_t *first, const char *key, const char *p...
  function R_API (line 299) | R_API data_t *data_prepend(data_t *tail, data_t *head)
  function R_API (line 315) | R_API data_t *data_int(data_t *first, char const *key, char const *prett...
  function R_API (line 319) | R_API data_t *data_dbl(data_t *first, char const *key, char const *prett...
  function R_API (line 323) | R_API data_t *data_str(data_t *first, char const *key, char const *prett...
  function R_API (line 327) | R_API data_t *data_ary(data_t *first, char const *key, char const *prett...
  function R_API (line 331) | R_API data_t *data_dat(data_t *first, char const *key, char const *prett...
  function R_API (line 335) | R_API data_t *data_hex(data_t *first, char const *key, char const *prett...
  function R_API (line 350) | R_API void data_array_free(data_array_t *array)
  function R_API (line 362) | R_API data_t *data_retain(data_t *data)
  function R_API (line 371) | __attribute__((no_sanitize("undefined")))
  function R_API (line 395) | R_API void data_output_print(data_output_t *output, data_t *data)
  function R_API (line 407) | R_API void data_output_start(struct data_output *output, char const *con...
  function R_API (line 414) | R_API void data_output_free(data_output_t *output)
  function R_API (line 423) | R_API void print_value(data_output_t *output, data_type_t type, data_val...
  function R_API (line 449) | R_API void print_array_value(data_output_t *output, data_array_t *array,...
  type data_print_jsons_t (line 466) | typedef struct {
  function format_jsons_array (line 471) | static void R_API_CALLCONV format_jsons_array(data_output_t *output, dat...
  function format_jsons_object (line 484) | static void R_API_CALLCONV format_jsons_object(data_output_t *output, da...
  function format_jsons_string (line 503) | static void R_API_CALLCONV format_jsons_string(data_output_t *output, co...
  function format_jsons_double (line 563) | static void R_API_CALLCONV format_jsons_double(data_output_t *output, do...
  function format_jsons_int (line 582) | static void R_API_CALLCONV format_jsons_int(data_output_t *output, int d...
  function R_API (line 589) | R_API size_t data_print_jsons(data_t *data, char *dst, size_t len)

FILE: src/data_tag.c
  type gpsd_client_t (line 26) | typedef struct gpsd_client {
  function gpsd_client_line (line 43) | static void gpsd_client_line(gpsd_client_t *ctx, char *line)
  type mg_connection (line 50) | struct mg_connection
  type mg_mgr (line 50) | struct mg_mgr
  function gpsd_client_event (line 52) | static void gpsd_client_event(struct mg_connection *nc, int ev, void *ev...
  type mg_connection (line 107) | struct mg_connection
  type mg_mgr (line 107) | struct mg_mgr
  function gpsd_client_t (line 120) | static gpsd_client_t *gpsd_client_init(char const *host, char const *por...
  function gpsd_client_free (line 146) | static void gpsd_client_free(gpsd_client_t *ctx)
  function data_tag_t (line 155) | data_tag_t *data_tag_create(char *param, struct mg_mgr *mgr)
  function data_tag_free (line 233) | void data_tag_free(data_tag_t *tag)
  function data_t (line 254) | static data_t *append_filtered_json(data_t *data, char const *json, char...
  function data_t (line 290) | data_t *data_tag_apply(data_tag_t *tag, data_t *data, char const *filename)

FILE: src/decoder_util.c
  function r_device (line 19) | r_device *decoder_create(r_device const *dev_template, unsigned user_dat...
  function decoder_output_log (line 48) | void decoder_output_log(r_device *decoder, int level, data_t *data)
  function decoder_output_data (line 53) | void decoder_output_data(r_device *decoder, data_t *data)
  function decoder_verbose (line 118) | int decoder_verbose(r_device *decoder)
  function decoder_log (line 123) | void decoder_log(r_device *decoder, int level, char const *func, char co...
  function decoder_logf (line 140) | void decoder_logf(r_device *decoder, int level, char const *func, _Print...
  function decoder_log_bitbuffer (line 153) | void decoder_log_bitbuffer(r_device *decoder, int level, char const *fun...
  function decoder_logf_bitbuffer (line 194) | void decoder_logf_bitbuffer(r_device *decoder, int level, char const *fu...
  function decoder_log_bitrow (line 208) | void decoder_log_bitrow(r_device *decoder, int level, char const *func, ...
  function decoder_logf_bitrow (line 240) | void decoder_logf_bitrow(r_device *decoder, int level, char const *func,...

FILE: src/devices/abmt.c
  function bcd2int (line 33) | static unsigned bcd2int(uint8_t bcd)
  function abmt_callback (line 38) | static int abmt_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/acurite.c
  function acurite_rain_896_decode (line 146) | static int acurite_rain_896_decode(r_device *decoder, bitbuffer_t *bitbu...
  function acurite_th_decode (line 197) | static int acurite_th_decode(r_device *decoder, bitbuffer_t *bitbuffer)
  function acurite_6045_decode (line 374) | static int acurite_6045_decode(r_device *decoder, bitbuffer_t *bitbuffer...
  function acurite_899_decode (line 464) | static int acurite_899_decode(r_device *decoder, bitbuffer_t *bitbuffer,...
  function acurite_3n1_decode (line 513) | static int acurite_3n1_decode(r_device *decoder, bitbuffer_t *bitbuffer,...
  function acurite_5n1_decode (line 596) | static int acurite_5n1_decode(r_device *decoder, bitbuffer_t *bitbuffer,...
  function acurite_atlas_decode (line 753) | static int acurite_atlas_decode(r_device *decoder, bitbuffer_t *bitbuffe...
  function acurite_tower_decode (line 948) | static int acurite_tower_decode(r_device *decoder, bitbuffer_t *bitbuffe...
  function acurite_1190_decode (line 1021) | static int acurite_1190_decode(r_device *decoder, bitbuffer_t *bitbuffer...
  function acurite_515_decode (line 1069) | static int acurite_515_decode(r_device *decoder, bitbuffer_t *bitbuffer,...
  function acurite_txr_check (line 1159) | static int acurite_txr_check(r_device *decoder, uint8_t const bb[], unsi...
  function acurite_txr_decode (line 1232) | static int acurite_txr_decode(r_device *decoder, bitbuffer_t *bitbuffer)
  function acurite_986_decode (line 1499) | static int acurite_986_decode(r_device *decoder, bitbuffer_t *bitbuffer)
  function acurite_606_decode (line 1620) | static int acurite_606_decode(r_device *decoder, bitbuffer_t *bitbuffer)
  function acurite_590tx_decode (line 1687) | static int acurite_590tx_decode(r_device *decoder, bitbuffer_t *bitbuffer)
  function acurite_00275rm_decode (line 1754) | static int acurite_00275rm_decode(r_device *decoder, bitbuffer_t *bitbuf...

FILE: src/devices/acurite_01185m.c
  function acurite_01185m_decode (line 54) | static int acurite_01185m_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/akhan_100F14.c
  function akhan_rke_callback (line 23) | static int akhan_rke_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/alecto.c
  function alecto_checksum (line 79) | static int alecto_checksum(uint8_t *b)
  function bcd_decode8 (line 94) | static uint8_t bcd_decode8(uint8_t x)
  function alectov1_callback (line 99) | static int alectov1_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/ambient_weather.c
  function ambient_weather_decode (line 44) | static int ambient_weather_decode(r_device *decoder, bitbuffer_t *bitbuf...
  function ambient_weather_callback (line 118) | static int ambient_weather_callback(r_device *decoder, bitbuffer_t *bitb...

FILE: src/devices/ambientweather_tx8300.c
  function tx8300_chk (line 49) | static uint8_t tx8300_chk(uint8_t *b)
  function ambientweather_tx8300_callback (line 62) | static int ambientweather_tx8300_callback(r_device *decoder, bitbuffer_t...

FILE: src/devices/ambientweather_wh31e.c
  function ambientweather_whx_decode (line 180) | static int ambientweather_whx_decode(r_device *decoder, bitbuffer_t *bit...

FILE: src/devices/ant_antplus.c
  function ant_antplus_decode (line 80) | static int ant_antplus_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/apator_metra_eitn30.c
  function apator_metra_eitn30_decode (line 106) | static int apator_metra_eitn30_decode(r_device *decoder, bitbuffer_t *bi...

FILE: src/devices/apator_metra_erm30.c
  function apator_metra_erm30_decode (line 89) | static int apator_metra_erm30_decode(r_device *decoder, bitbuffer_t *bit...

FILE: src/devices/arad_ms_meter.c
  function arad_mm_dialog3g_decode (line 70) | static int arad_mm_dialog3g_decode(r_device *decoder, bitbuffer_t *bitbu...

FILE: src/devices/archos_tbh.c
  function archos_tbh_decode (line 60) | static int archos_tbh_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/arexx_ml.c
  function arexx_ml_decode (line 67) | static int arexx_ml_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/atech_ws308.c
  function pwm_decode (line 48) | static unsigned pwm_decode(uint8_t *bits, unsigned bit_len, uint8_t *out...
  function atech_ws308_decode (line 82) | static int atech_ws308_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/auriol_4ld5661.c
  function auriol_4ld5661_decode (line 32) | static int auriol_4ld5661_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/auriol_aft77b2.c
  function lsrc (line 57) | static uint8_t lsrc(uint8_t frame[], int len)
  function search_row (line 79) | static int search_row(bitbuffer_t *bitbuffer)
  function auriol_aft77_b2_decode (line 89) | static int auriol_aft77_b2_decode(r_device *decoder, bitbuffer_t *bitbuf...

FILE: src/devices/auriol_afw2a1.c
  function auriol_afw2a1_decode (line 54) | static int auriol_afw2a1_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/auriol_ahfl.c
  function auriol_ahfl_decode (line 33) | static int auriol_ahfl_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/auriol_hg02832.c
  function auriol_hg02832_decode (line 40) | static int auriol_hg02832_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/badger_orion_endpoint.c
  function orion_endpoint_decode (line 92) | static int orion_endpoint_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/badger_water.c
  function badger_decode_3of6 (line 45) | static uint8_t badger_decode_3of6(uint8_t byte)
  function badger_decode_3of6_buffer (line 71) | static int badger_decode_3of6_buffer(uint8_t const *bits, unsigned bit_o...
  function badger_orion_decode (line 84) | static int badger_orion_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/baldr_rain.c
  function baldr_rain_decode (line 47) | static int baldr_rain_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/baldr_therm.c
  function baldr_therm_decode (line 58) | static int baldr_therm_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/blueline.c
  type blueline_stateful_context (line 151) | struct blueline_stateful_context {
  function rev_crc8 (line 157) | static uint8_t rev_crc8(uint8_t const message[], unsigned nBytes, uint8_...
  function guess_blueline_id (line 189) | static uint16_t guess_blueline_id(r_device *decoder, const uint8_t *curr...
  function blueline_decode (line 239) | static int blueline_decode(r_device *decoder, bitbuffer_t *bitbuffer)
  function r_device (line 400) | static r_device *blueline_create(char *arg)

FILE: src/devices/blyss.c
  function blyss_callback (line 24) | static int blyss_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/bm5.c
  function bm5_decode (line 65) | static int bm5_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/brennenstuhl_rcs_2044.c
  function brennenstuhl_rcs_2044_process_row (line 24) | static int brennenstuhl_rcs_2044_process_row(r_device *decoder, bitbuffe...
  function brennenstuhl_rcs_2044_callback (line 107) | static int brennenstuhl_rcs_2044_callback(r_device *decoder, bitbuffer_t...

FILE: src/devices/bresser_3ch.c
  function bresser_3ch_decode (line 41) | static int bresser_3ch_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/bresser_5in1.c
  function bresser_5in1_decode (line 67) | static int bresser_5in1_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/bresser_6in1.c
  function bresser_6in1_decode (line 97) | static int bresser_6in1_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/bresser_7in1.c
  function bresser_7in1_decode (line 141) | static int bresser_7in1_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/bresser_leakage.c
  function bresser_leakage_decode (line 71) | static int bresser_leakage_decode(r_device *decoder, bitbuffer_t *bitbuf...

FILE: src/devices/bresser_lightning.c
  function bresser_lightning_decode (line 36) | static int bresser_lightning_decode(r_device *decoder, bitbuffer_t *bitb...

FILE: src/devices/bresser_st1005h.c
  function bresser_st1005h_decode (line 90) | static int bresser_st1005h_decode(r_device *decoder, bitbuffer_t *bitbuf...

FILE: src/devices/bt_rain.c
  function bt_rain_decode (line 33) | static int bt_rain_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/burnhardbbq.c
  function burnhardbbq_decode (line 34) | static int burnhardbbq_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/calibeur.c
  function calibeur_rf104_decode (line 51) | static int calibeur_rf104_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/cardin.c
  function cardin_decode (line 29) | static int cardin_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/cavius.c
  function cavius_decode (line 40) | static int cavius_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/ced7000.c
  function ced7000_decode (line 37) | static int ced7000_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/celsia_czc1.c
  function celsia_czc1_decode (line 50) | static int celsia_czc1_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/chamberlain_cwpirc.c
  function chamberlain_cwpirc_decode (line 38) | static int chamberlain_cwpirc_decode(r_device *decoder, bitbuffer_t *bit...

FILE: src/devices/chuango.c
  function chuango_callback (line 34) | static int chuango_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/cmr113.c
  function cmr113_decode (line 48) | static int cmr113_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/companion_wtr001.c
  function companion_wtr001_decode (line 49) | static int companion_wtr001_decode(r_device *decoder, bitbuffer_t *bitbu...

FILE: src/devices/cotech_36_7959.c
  function cotech_36_7959_decode (line 57) | static int cotech_36_7959_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/current_cost.c
  function current_cost_decode (line 20) | static int current_cost_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/danfoss.c
  function danfoss_decode_nibble (line 54) | static uint8_t danfoss_decode_nibble(uint8_t byte)
  function danfoss_cfr_callback (line 79) | static int danfoss_cfr_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/deltadore_x3d.c
  type deltadore_x3d_message_header (line 161) | struct deltadore_x3d_message_header {
  type deltadore_x3d_message_payload (line 177) | struct deltadore_x3d_message_payload {
  function deltadore_x3d_read_le_u24 (line 189) | static uint32_t deltadore_x3d_read_le_u24(uint8_t **buffer)
  function deltadore_x3d_read_le_u16 (line 197) | static uint16_t deltadore_x3d_read_le_u16(uint8_t **buffer)
  function deltadore_x3d_read_be_u16 (line 204) | static uint16_t deltadore_x3d_read_be_u16(uint8_t **buffer)
  function deltadore_x3d_parse_message_header (line 212) | static uint8_t deltadore_x3d_parse_message_header(uint8_t *buffer, struc...
  function deltadore_x3d_parse_message_payload (line 239) | static uint8_t deltadore_x3d_parse_message_payload(uint8_t *buffer, stru...
  function deltadore_x3d_decode (line 252) | static int deltadore_x3d_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/digitech_xc0324.c
  function decode_xc0324_message (line 76) | static int decode_xc0324_message(r_device *decoder, bitbuffer_t *bitbuffer,
  function digitech_xc0324_decode (line 137) | static int digitech_xc0324_decode(r_device *decoder, bitbuffer_t *bitbuf...

FILE: src/devices/directv.c
  function bitrow_set_bit (line 189) | static void bitrow_set_bit(uint8_t *bitrow, unsigned bit_idx, unsigned b...
  function bitrow_dpwm_decode (line 225) | static unsigned bitrow_dpwm_decode(uint8_t const *bitrow, unsigned bit_l...
  function directv_decode (line 275) | static int directv_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/dish_remote_6_3.c
  function dish_remote_6_3_callback (line 100) | static int dish_remote_6_3_callback(r_device *decoder, bitbuffer_t *bitb...

FILE: src/devices/dsc.c
  function dsc_callback (line 107) | static int dsc_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/ec3k.c
  type ec3k_decode_ctx (line 18) | struct ec3k_decode_ctx {
  function ec3k_resync_decoder (line 25) | static inline void ec3k_resync_decoder(struct ec3k_decode_ctx *ctx)
  function bit_at (line 36) | static inline uint8_t bit_at(const uint8_t *bytes, int32_t bit)
  function symbol_at (line 41) | static inline uint8_t symbol_at(const uint8_t *bytes, int32_t bit)
  function descrambled_symbol_at (line 49) | static inline uint8_t descrambled_symbol_at(const uint8_t *bytes, int32_...
  function unpack_nibbles (line 61) | static inline uint32_t unpack_nibbles(const uint8_t *buf, int32_t start_...
  function ec3k_decode (line 141) | static int ec3k_decode(r_device *decoder, bitbuffer_t *bitbuffer)
  function ec3k_extract_fields (line 204) | static int ec3k_extract_fields(r_device *const decoder, const uint8_t *p...

FILE: src/devices/ecodhome.c
  function ecodhome_decode (line 83) | static int ecodhome_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/ecowitt.c
  function ecowitt_decode (line 29) | static int ecowitt_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/efergy_e2_classic.c
  function efergy_e2_classic_callback (line 37) | static int efergy_e2_classic_callback(r_device *decoder, bitbuffer_t *bi...

FILE: src/devices/efergy_optical.c
  function efergy_optical_callback (line 37) | static int efergy_optical_callback(r_device *decoder, bitbuffer_t *bitbu...

FILE: src/devices/efth800.c
  function eurochron_efth800_decode (line 46) | static int eurochron_efth800_decode(r_device *decoder, bitbuffer_t *bitb...

FILE: src/devices/elro_db286a.c
  function elro_db286a_callback (line 27) | static int elro_db286a_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/elv.c
  function AD_POP (line 14) | static uint16_t AD_POP(uint8_t const *bb, uint8_t bits, uint8_t bit)
  function em1000_callback (line 32) | static int em1000_callback(r_device *decoder, bitbuffer_t *bitbuffer)
  function ws2000_callback (line 171) | static int ws2000_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/emax.c
  function emax_decode (line 126) | static int emax_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/emontx.c
  type emontx (line 18) | struct emontx {
  function emontx_callback (line 45) | static int emontx_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/emos_e6016.c
  function emos_e6016_decode (line 58) | static int emos_e6016_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/emos_e6016_rain.c
  function emos_e6016_rain_decode (line 52) | static int emos_e6016_rain_decode(r_device *decoder, bitbuffer_t *bitbuf...

FILE: src/devices/enocean_erp1.c
  function decode_8of12 (line 21) | static int decode_8of12(uint8_t const *b, int pos, int end, bitbuffer_t ...
  function enocean_erp1_decode (line 48) | static int enocean_erp1_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/ert_idm.c
  function ert_idm_decode (line 88) | static int ert_idm_decode(r_device *decoder, bitbuffer_t *bitbuffer)
  function ert_netidm_decode (line 328) | static int ert_netidm_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/ert_scm.c
  function ert_scm_decode (line 48) | static int ert_scm_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/esa.c
  function decrypt_esa (line 16) | static uint8_t decrypt_esa(uint8_t *b)
  function esa_cost_callback (line 43) | static int esa_cost_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/esic_emt7110.c
  function esic_emt7110_decode (line 43) | static int esic_emt7110_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/esperanza_ews.c
  function esperanza_ews_callback (line 64) | static int esperanza_ews_callback(r_device *decoder, bitbuffer_t *bitbuf...

FILE: src/devices/eurochron.c
  function eurochron_decode (line 37) | static int eurochron_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/fineoffset.c
  function r_device (line 18) | static r_device *fineoffset_WH2_create(char *arg)
  function fineoffset_WH2_callback (line 64) | static int fineoffset_WH2_callback(r_device *decoder, bitbuffer_t *bitbu...
  function fineoffset_WH24_callback (line 209) | static int fineoffset_WH24_callback(r_device *decoder, bitbuffer_t *bitb...
  function fineoffset_WH0290_callback (line 413) | static int fineoffset_WH0290_callback(r_device *decoder, bitbuffer_t *bi...
  function fineoffset_WH25_callback (line 493) | static int fineoffset_WH25_callback(r_device *decoder, bitbuffer_t *bitb...
  function fineoffset_WH51_callback (line 625) | static int fineoffset_WH51_callback(r_device *decoder, bitbuffer_t *bitb...
  function alecto_ws1200v1_callback (line 714) | static int alecto_ws1200v1_callback(r_device *decoder, bitbuffer_t *bitb...
  function alecto_ws1200v2_dcf_callback (line 785) | static int alecto_ws1200v2_dcf_callback(r_device *decoder, bitbuffer_t *...
  function alecto_ws1200v2_callback (line 866) | static int alecto_ws1200v2_callback(r_device *decoder, bitbuffer_t *bitb...
  function fineoffset_WH0530_callback (line 935) | static int fineoffset_WH0530_callback(r_device *decoder, bitbuffer_t *bi...

FILE: src/devices/fineoffset_wh1050.c
  function fineoffset_wh1050_decode (line 108) | static int fineoffset_wh1050_decode(r_device *decoder, bitbuffer_t *bitb...
  function fineoffset_wh1050_callback (line 201) | static int fineoffset_wh1050_callback(r_device *decoder, bitbuffer_t *bi...

FILE: src/devices/fineoffset_wh1080.c
  function fineoffset_wh1080_callback (line 123) | static int fineoffset_wh1080_callback(r_device *decoder, bitbuffer_t *bi...
  function fineoffset_wh1080_callback_ook (line 315) | static int fineoffset_wh1080_callback_ook(r_device *decoder, bitbuffer_t...
  function fineoffset_wh1080_callback_fsk (line 324) | static int fineoffset_wh1080_callback_fsk(r_device *decoder, bitbuffer_t...

FILE: src/devices/fineoffset_wh31l.c
  function fineoffset_wh31l_decode (line 88) | static int fineoffset_wh31l_decode(r_device *decoder, bitbuffer_t *bitbu...

FILE: src/devices/fineoffset_wh43.c
  function fineoffset_wh43_decode (line 85) | static int fineoffset_wh43_decode(r_device *decoder, bitbuffer_t *bitbuf...

FILE: src/devices/fineoffset_wh45.c
  function fineoffset_wh45_decode (line 64) | static int fineoffset_wh45_decode(r_device *decoder, bitbuffer_t *bitbuf...

FILE: src/devices/fineoffset_wh46.c
  function fineoffset_wh46_decode (line 60) | static int fineoffset_wh46_decode(r_device *decoder, bitbuffer_t *bitbuf...

FILE: src/devices/fineoffset_wh55.c
  function fineoffset_wh55_decode (line 46) | static int fineoffset_wh55_decode(r_device *decoder, bitbuffer_t *bitbuf...

FILE: src/devices/fineoffset_wn34.c
  function fineoffset_wn34_decode (line 40) | static int fineoffset_wn34_decode(r_device *decoder, bitbuffer_t *bitbuf...

FILE: src/devices/fineoffset_ws80.c
  function fineoffset_ws80_decode (line 46) | static int fineoffset_ws80_decode(r_device *decoder, bitbuffer_t *bitbuf...

FILE: src/devices/fineoffset_ws85.c
  function fineoffset_ws85_decode (line 62) | static int fineoffset_ws85_decode(r_device *decoder, bitbuffer_t *bitbuf...

FILE: src/devices/fineoffset_ws90.c
  function fineoffset_ws90_decode (line 67) | static int fineoffset_ws90_decode(r_device *decoder, bitbuffer_t *bitbuf...

FILE: src/devices/flex.c
  function bit (line 17) | static inline int bit(const uint8_t *bytes, unsigned b)
  function compact_number (line 23) | static unsigned long compact_number(uint8_t *data, unsigned bit_offset, ...
  function extract_number (line 41) | static unsigned long extract_number(uint8_t *data, unsigned bit_offset, ...
  type flex_map (line 61) | struct flex_map {
  type flex_get (line 68) | struct flex_get {
  type flex_params (line 79) | struct flex_params {
  function print_row_bytes (line 105) | static void print_row_bytes(char *row_bytes, uint8_t *bits, int num_bits)
  function render_getters (line 116) | static void render_getters(data_t *data, uint8_t *bits, struct flex_para...
  function flex_callback (line 142) | static int flex_callback(r_device *decoder, bitbuffer_t *bitbuffer)
  function usage (line 364) | static void usage(void)
  function help (line 371) | static void help(void)
  function parse_atoiv (line 433) | static float parse_atoiv(char const *str, int def, char const *error_hint)
  function parse_float (line 454) | static float parse_float(char const *str, char const *error_hint)
  function parse_modulation (line 483) | static unsigned parse_modulation(char const *str)
  function parse_bits (line 517) | static unsigned parse_bits(const char *code, uint8_t *bitrow)
  function parse_symbol (line 535) | static uint32_t parse_symbol(const char *code)
  type flex_get (line 552) | struct flex_get
  function parse_getter (line 594) | static void parse_getter(const char *arg, struct flex_get *getter)
  function r_device (line 636) | r_device *flex_create_device(char *spec)

FILE: src/devices/flowis.c
  function flowis_decode (line 49) | static int flowis_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/fordremote.c
  function fordremote_callback (line 26) | static int fordremote_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/fs20.c
  function fs20_find_preamble (line 34) | static int fs20_find_preamble(bitbuffer_t *bitbuffer, int bitpos)
  type parity_byte (line 64) | struct parity_byte {
  function get_byte (line 69) | static struct parity_byte get_byte(uint8_t *bits, unsigned pos)
  function fs20_decode (line 82) | static int fs20_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/ft004b.c
  function ft004b_callback (line 32) | static int ft004b_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/funkbus.c
  function get_bits_reflect (line 57) | static uint32_t get_bits_reflect(uint8_t const *bitrow, unsigned start, ...
  function calc_checksum (line 69) | static uint8_t calc_checksum(uint8_t const *bitrow, unsigned len)
  function funkbus_decode (line 101) | static int funkbus_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/gasmate_ba1008.c
  function gasmate_ba1008_decode (line 47) | static int gasmate_ba1008_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/ge_coloreffects.c
  function bit (line 22) | static inline int bit(const uint8_t *bytes, unsigned b)
  function ge_decode (line 32) | static unsigned ge_decode(bitbuffer_t *inbuf, unsigned row, unsigned sta...
  function ge_coloreffects_decode (line 61) | static int ge_coloreffects_decode(r_device *decoder, bitbuffer_t *bitbuf...
  function ge_coloreffects_callback (line 126) | static int ge_coloreffects_callback(r_device *decoder, bitbuffer_t *bitb...

FILE: src/devices/geevon.c
  function geevon_tx16_decode (line 54) | static int geevon_tx16_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/geevon_tx19.c
  function geevon_tx19_decode (line 59) | static int geevon_tx19_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/generic_motion.c
  function generic_motion_callback (line 33) | static int generic_motion_callback(r_device *decoder, bitbuffer_t *bitbu...

FILE: src/devices/generic_remote.c
  function generic_remote_callback (line 22) | static int generic_remote_callback(r_device *decoder, bitbuffer_t *bitbu...

FILE: src/devices/generic_temperature_sensor.c
  function generic_temperature_sensor_callback (line 25) | static int generic_temperature_sensor_callback(r_device *decoder, bitbuf...

FILE: src/devices/geo_minim.c
  function geo_minim_ct_sensor_decode (line 89) | static int geo_minim_ct_sensor_decode(r_device *decoder, bitbuffer_t *bi...
  function geo_minim_display_decode (line 162) | static int geo_minim_display_decode(r_device *decoder, bitbuffer_t *bitb...
  function minim_decode (line 264) | static int minim_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/govee.c
  function govee_decode (line 138) | static int govee_decode(r_device *decoder, bitbuffer_t *bitbuffer)
  function govee_h5054_decode (line 326) | static int govee_h5054_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/gridstream.c
  type crc_init (line 53) | struct crc_init {
  type crc_init (line 69) | struct crc_init
  function gridstream_checksum (line 88) | static int gridstream_checksum(int fulllength, uint16_t length, uint8_t ...
  function gridstream_decode (line 115) | static int gridstream_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/gt_tmbbq05.c
  function gt_tmbbq05_decode (line 73) | static int gt_tmbbq05_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/gt_wt_02.c
  function gt_wt_02_process_row (line 47) | static int gt_wt_02_process_row(r_device *decoder, bitbuffer_t *bitbuffe...
  function gt_wt_02_decode (line 109) | static int gt_wt_02_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/gt_wt_03.c
  function chk_rollbyte (line 71) | static uint8_t chk_rollbyte(uint8_t const message[], unsigned bytes, uin...
  function gt_wt_03_decode (line 89) | static int gt_wt_03_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/hcs200.c
  function hcs200_callback (line 36) | static int hcs200_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/hideki.c
  type sensortypes (line 48) | enum sensortypes { HIDEKI_UNKNOWN, HIDEKI_TEMP, HIDEKI_TS04, HIDEKI_WIND...
  function hideki_ts04_decode (line 50) | static int hideki_ts04_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/holman_ws5029.c
  function holman_ws5029pcm_decode (line 90) | static int holman_ws5029pcm_decode(r_device *decoder, bitbuffer_t *bitbu...
  function xor_shift_bytes (line 240) | static uint8_t xor_shift_bytes(uint8_t const message[], unsigned num_byt...
  function holman_ws5029pwm_decode (line 258) | static int holman_ws5029pwm_decode(r_device *decoder, bitbuffer_t *bitbu...

FILE: src/devices/homelead_hg9901.c
  function homelead_hg9901_decoder (line 84) | static int homelead_hg9901_decoder(r_device *decoder, bitbuffer_t *bitbu...

FILE: src/devices/hondaremote.c
  function hondaremote_callback (line 33) | static int hondaremote_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/honeywell.c
  function honeywell_decode (line 42) | static int honeywell_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/honeywell_cm921.c
  function decode_10to8 (line 22) | static int decode_10to8(uint8_t const *b, int pos, int end, uint8_t *out)
  type message_t (line 44) | typedef struct {
  function next (line 96) | static uint8_t next(const uint8_t *bb, unsigned *ipos, unsigned num_bytes)
  function parse_msg (line 106) | static int parse_msg(bitbuffer_t *bmsg, int row, message_t *msg)
  function honeywell_cm921_decode (line 160) | static int honeywell_cm921_decode(r_device *decoder, bitbuffer_t *bitbuf...

FILE: src/devices/honeywell_wdb.c
  function honeywell_wdb_callback (line 45) | static int honeywell_wdb_callback(r_device *decoder, bitbuffer_t *bitbuf...

FILE: src/devices/ht680.c
  function ht680_callback (line 21) | static int ht680_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/ibis_beacon.c
  function ibis_beacon_callback (line 23) | static int ibis_beacon_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/ikea_sparsnas.c
  function ikea_sparsnas_brute_force_encryption (line 92) | static uint32_t ikea_sparsnas_brute_force_encryption(uint8_t buffer[18])
  function ikea_sparsnas_decode (line 137) | static int ikea_sparsnas_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/infactory.c
  function infactory_crc_check (line 54) | static int infactory_crc_check(uint8_t *b)
  function infactory_decode (line 67) | static int infactory_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/inkbird_ith20r.c
  function inkbird_ith20r_callback (line 56) | static int inkbird_ith20r_callback(r_device *decoder, bitbuffer_t *bitbu...

FILE: src/devices/inovalley-kw9015b.c
  function kw9015b_callback (line 31) | static int kw9015b_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/insteon.c
  function gen_ext_crc (line 80) | static uint8_t gen_ext_crc(uint8_t *dat)
  function gen_crc (line 102) | static uint8_t gen_crc(uint8_t *dat)
  function parse_insteon_pkt (line 114) | static int parse_insteon_pkt(r_device *decoder, bitbuffer_t *bits, unsig...
  function insteon_callback (line 378) | static int insteon_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/interlogix.c
  function interlogix_decode (line 98) | static int interlogix_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/intertechno.c
  function intertechno_callback (line 22) | static int intertechno_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/jasco.c
  function jasco_decode (line 22) | static int jasco_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/kedsum.c
  function kedsum_callback (line 39) | static int kedsum_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/kerui.c
  function kerui_callback (line 32) | static int kerui_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/klimalogg.c
  function klimalogg_decode (line 46) | static int klimalogg_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/lacrosse.c
  function lacrossetx_decode (line 50) | static int lacrossetx_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/lacrosse_breezepro.c
  function lacrosse_breezepro_decode (line 84) | static int lacrosse_breezepro_decode(r_device *decoder, bitbuffer_t *bit...

FILE: src/devices/lacrosse_r1.c
  function lacrosse_r1_decode (line 108) | static int lacrosse_r1_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/lacrosse_th3.c
  function lacrosse_th_decode (line 66) | static int lacrosse_th_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/lacrosse_tx141x.c
  function lacrosse_tx141x_decode (line 102) | static int lacrosse_tx141x_decode(r_device *decoder, bitbuffer_t *bitbuf...

FILE: src/devices/lacrosse_tx31u.c
  function lacrosse_tx31u_decode (line 78) | static int lacrosse_tx31u_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/lacrosse_tx34.c
  function lacrosse_tx34_callback (line 51) | static int lacrosse_tx34_callback(r_device *decoder, bitbuffer_t *bitbuf...

FILE: src/devices/lacrosse_tx35.c
  function lacrosse_it (line 85) | static int lacrosse_it(r_device *decoder, bitbuffer_t *bitbuffer, int de...
  function lacrossetx29_callback (line 160) | static int lacrossetx29_callback(r_device *decoder, bitbuffer_t *bitbuffer)
  function lacrossetx35_callback (line 169) | static int lacrossetx35_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/lacrosse_wr1.c
  function lacrosse_wr1_decode (line 53) | static int lacrosse_wr1_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/lacrosse_ws7000.c
  function lacrosse_ws7000_decode (line 46) | static int lacrosse_ws7000_decode(r_device *decoder, bitbuffer_t *bitbuf...

FILE: src/devices/lacrossews.c
  function lacrossews_detect (line 40) | static int lacrossews_detect(r_device *decoder, uint8_t *pRow, uint8_t *...
  function lacrossews_callback (line 89) | static int lacrossews_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/lightwave_rf.c
  function lightwave_rf_nibble_from_byte (line 23) | static int lightwave_rf_nibble_from_byte(uint8_t in)
  function lightwave_rf_callback (line 50) | static int lightwave_rf_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/m_bus.c
  function bcd2int (line 26) | static unsigned bcd2int(uint8_t bcd)
  function m_bus_decode_3of6 (line 32) | static uint8_t m_bus_decode_3of6(uint8_t byte)
  function m_bus_decode_3of6_buffer (line 60) | static int m_bus_decode_3of6_buffer(uint8_t const *bits, unsigned bit_of...
  function m_bus_crc_valid (line 78) | static int m_bus_crc_valid(r_device *decoder, const uint8_t *bytes, unsi...
  function m_bus_manuf_decode (line 91) | static void m_bus_manuf_decode(uint16_t m_field, char *three_letter_code)
  type m_bus_block2_t (line 145) | typedef struct {
  type m_bus_block1_t (line 161) | typedef struct {
  type m_bus_data_t (line 174) | typedef struct {
  type UnitType (line 221) | enum UnitType {
  function data_t (line 283) | static data_t *append_str(data_t *data, enum UnitType unit_type, uint8_t...
  function data_t (line 307) | static data_t *append_val(data_t *data, enum UnitType unit_type, uint8_t...
  function m_bus_tm_decode (line 344) | static size_t m_bus_tm_decode(const uint8_t *data, size_t data_size, cha...
  function m_bus_decode_val (line 409) | static int m_bus_decode_val(const uint8_t *b, uint8_t dif_coding, int64_...
  function m_bus_decode_records (line 508) | static int m_bus_decode_records(data_t **inout_data, const uint8_t *b, u...
  function parse_payload (line 667) | static void parse_payload(data_t *data, const m_bus_block1_t *block1, co...
  function parse_block2 (line 741) | static int parse_block2(const m_bus_data_t *in, m_bus_block1_t *block1)
  function m_bus_decode_format_a (line 768) | static int m_bus_decode_format_a(r_device *decoder, const m_bus_data_t *...
  function m_bus_decode_format_b (line 819) | static int m_bus_decode_format_b(r_device *decoder, const m_bus_data_t *...
  function m_bus_output_data (line 860) | static int m_bus_output_data(r_device *decoder, bitbuffer_t *bitbuffer, ...
  function m_bus_mode_c_t_callback (line 933) | static int m_bus_mode_c_t_callback(r_device *decoder, bitbuffer_t *bitbu...
  function m_bus_mode_r_callback (line 1021) | static int m_bus_mode_r_callback(r_device *decoder, bitbuffer_t *bitbuffer)
  function m_bus_mode_f_callback (line 1059) | static int m_bus_mode_f_callback(r_device *decoder, bitbuffer_t *bitbuffer)
  function m_bus_mode_s_callback (line 1109) | static int m_bus_mode_s_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/markisol.c
  function markisol_decode (line 45) | static int markisol_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/marlec_solar.c
  function marlec_solar_decode (line 37) | static int marlec_solar_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/maverick_et73.c
  function maverick_et73_decode (line 46) | static int maverick_et73_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/maverick_et73x.c
  function maverick_et73x_callback (line 43) | static int maverick_et73x_callback(r_device *decoder, bitbuffer_t *bitbu...

FILE: src/devices/maverick_xr30.c
  function maverick_xr30_callback (line 38) | static int maverick_xr30_callback(r_device *decoder, bitbuffer_t *bitbuf...

FILE: src/devices/maverick_xr50.c
  function maverick_xr50_decode (line 50) | static int maverick_xr50_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/mebus.c
  function mebus433_decode (line 17) | static int mebus433_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/megacode.c
  function megacode_callback (line 42) | static int megacode_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/missil_ml0757.c
  function missil_ml0757_callback (line 57) | static int missil_ml0757_callback(r_device *decoder, bitbuffer_t *bitbuf...

FILE: src/devices/mueller_hotrod.c
  function mueller_hotrod_decode (line 51) | static int mueller_hotrod_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/neptune_r900.c
  function decode_5to8 (line 68) | static void decode_5to8(bitbuffer_t *bytes, uint8_t *base6_dec)
  function neptune_r900_decode (line 81) | static int neptune_r900_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/new_template.c
  function new_template_decode (line 60) | static int new_template_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/newkaku.c
  function newkaku_callback (line 22) | static int newkaku_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/nexa.c
  function nexa_callback (line 28) | static int nexa_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/nexus.c
  function nexus_decode (line 45) | static int nexus_decode(r_device *decoder, bitbuffer_t *bitbuffer)
  function nexus_sauna_decode (line 132) | static int nexus_sauna_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/nice_flor_s.c
  function nice_flor_s_decode (line 31) | static int nice_flor_s_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/norgo.c
  function next_mask (line 88) | static uint16_t next_mask(uint32_t mask)
  function calc_checksum (line 102) | static uint8_t calc_checksum(uint8_t *data, uint8_t datalen)
  function norgo_decode (line 116) | static int norgo_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/oil_smart.c
  function oil_smart_decode (line 58) | static int oil_smart_decode(r_device *decoder, bitbuffer_t *bitbuffer, u...
  function oil_smart_callback (line 110) | static int oil_smart_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/oil_standard.c
  function oil_standard_decode (line 43) | static int oil_standard_decode(r_device *decoder, bitbuffer_t *bitbuffer...
  function oil_standard_callback (line 102) | static int oil_standard_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/oil_watchman.c
  function oil_watchman_decode (line 21) | static int oil_watchman_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/oil_watchman_advanced.c
  function oil_watchman_advanced_decode (line 48) | static int oil_watchman_advanced_decode(r_device *decoder, bitbuffer_t *...

FILE: src/devices/opus_xt300.c
  function opus_xt300_decode (line 33) | static int opus_xt300_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/oregon_scientific.c
  function get_os_temperature (line 52) | static float get_os_temperature(uint8_t const *message)
  function get_os_rain_rate (line 65) | static float get_os_rain_rate(uint8_t const *message)
  function get_os_total_rain (line 72) | static float get_os_total_rain(uint8_t const *message)
  function get_os_humidity (line 82) | static unsigned int get_os_humidity(uint8_t const *message)
  function get_os_uv (line 89) | static unsigned int get_os_uv(uint8_t const *message)
  function cm180i_power (line 96) | static unsigned cm180i_power(uint8_t const *msg, unsigned int offset)
  function cm180i_total (line 106) | static uint64_t cm180i_total(uint8_t const *msg)
  function swap_nibbles (line 121) | static uint8_t swap_nibbles(uint8_t byte)
  function cm180_power (line 126) | static unsigned cm180_power(uint8_t const *msg)
  function cm180_total (line 136) | static uint64_t cm180_total(uint8_t const *msg)
  function validate_os_checksum (line 151) | static int validate_os_checksum(r_device *decoder, uint8_t const *msg, i...
  function validate_os_v2_message (line 180) | static int validate_os_v2_message(r_device *decoder, uint8_t const *msg,...
  function oregon_scientific_v2_1_decode (line 196) | static int oregon_scientific_v2_1_decode(r_device *decoder, bitbuffer_t ...
  function oregon_scientific_v3_decode (line 621) | static int oregon_scientific_v3_decode(r_device *decoder, bitbuffer_t *b...
  function oregon_scientific_decode (line 971) | static int oregon_scientific_decode(r_device *decoder, bitbuffer_t *bitb...

FILE: src/devices/oregon_scientific_sl109h.c
  function oregon_scientific_sl109h_callback (line 30) | static int oregon_scientific_sl109h_callback(r_device *decoder, bitbuffe...

FILE: src/devices/oregon_scientific_v1.c
  function oregon_scientific_v1_callback (line 27) | static int oregon_scientific_v1_callback(r_device *decoder, bitbuffer_t ...

FILE: src/devices/oria_wa150km.c
  function oria_wa150km_decode (line 45) | static int oria_wa150km_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/philips_aj3650.c
  function philips_aj3650_decode (line 51) | static int philips_aj3650_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/philips_aj7010.c
  function philips_aj7010_decode (line 41) | static int philips_aj7010_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/proflame2.c
  function proflame2_mc (line 46) | static int proflame2_mc(bitbuffer_t *bitbuffer, unsigned row, unsigned s...
  function proflame2_decode (line 90) | static int proflame2_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/prologue.c
  function prologue_callback (line 35) | static int prologue_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/proove.c
  function proove_callback (line 51) | static int proove_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/quhwa.c
  function quhwa_callback (line 21) | static int quhwa_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/quinetic.c
  function quinetic_switch_decode (line 48) | static int quinetic_switch_decode(r_device *decoder, bitbuffer_t *bitbuf...

FILE: src/devices/radiohead_ask.c
  function symbol_6to4 (line 39) | static uint8_t symbol_6to4(uint8_t symbol)
  function radiohead_ask_extract (line 57) | static int radiohead_ask_extract(r_device *decoder, bitbuffer_t *bitbuff...
  function radiohead_ask_callback (line 138) | static int radiohead_ask_callback(r_device *decoder, bitbuffer_t *bitbuf...
  function sensible_living_callback (line 186) | static int sensible_living_callback(r_device *decoder, bitbuffer_t *bitb...

FILE: src/devices/rainpoint.c
  function rainpoint_decode (line 47) | static int rainpoint_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/rainpoint_hcs012arf.c
  function rainpoint_hcs012arf_decode (line 55) | static int rainpoint_hcs012arf_decode(r_device *decoder, bitbuffer_t *bi...

FILE: src/devices/regency_fan.c
  function regency_fan_decode (line 69) | static int regency_fan_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/revolt_nc5462.c
  function revolt_nc5462_decode (line 54) | static int revolt_nc5462_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/revolt_zx7717.c
  function revolt_zx7717_decode (line 138) | static int revolt_zx7717_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/rftech.c
  function rftech_callback (line 42) | static int rftech_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/risco_agility.c
  function gray_decode (line 94) | static int gray_decode(int n) {
  function risco_agility_decode (line 100) | static int risco_agility_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/rojaflex.c
  function rojaflex_decode (line 79) | static int rojaflex_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/rosstech_dcu706.c
  function rosstech_dcu706_decode (line 37) | static int rosstech_dcu706_decode(r_device *decoder, bitbuffer_t *bitbuf...

FILE: src/devices/rubicson.c
  function rubicson_callback (line 40) | static int rubicson_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/rubicson_48659.c
  function rubicson_48659_decode (line 151) | static int rubicson_48659_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/rubicson_pool_48942.c
  function rubicson_pool_48942_decode (line 52) | static int rubicson_pool_48942_decode(r_device *decoder, bitbuffer_t *bi...

FILE: src/devices/s3318p.c
  function s3318p_callback (line 62) | static int s3318p_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/sainlogic_sa8.c
  function sainlogic_sa8_decode (line 64) | static int sainlogic_sa8_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/schou_72543_rain.c
  function schou_72543_rain_decode (line 53) | static int schou_72543_rain_decode(r_device *decoder, bitbuffer_t *bitbu...

FILE: src/devices/schraeder.c
  function schraeder_decode (line 35) | static int schraeder_decode(r_device *decoder, bitbuffer_t *bitbuffer)
  function schrader_EG53MA4_decode (line 100) | static int schrader_EG53MA4_decode(r_device *decoder, bitbuffer_t *bitbu...
  function schrader_SMD3MA4_decode (line 224) | static int schrader_SMD3MA4_decode(r_device *decoder, bitbuffer_t *bitbu...

FILE: src/devices/scmplus.c
  function scmplus_decode (line 28) | static int scmplus_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/secplus_v1.c
  function secplus_v1_decode_v1_half (line 54) | static int secplus_v1_decode_v1_half(r_device *decoder, uint8_t *bits, u...
  function find_next (line 111) | static int find_next(bitbuffer_t *bitbuffer, int cur_index)
  type timeval (line 138) | struct timeval
  function secplus_v1_callback (line 140) | static int secplus_v1_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/secplus_v2.c
  function secplus_v2_decode_v2_half (line 71) | static int secplus_v2_decode_v2_half(r_device *decoder, bitbuffer_t *bit...
  function secplus_v2_callback (line 244) | static int secplus_v2_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/sharp_spc775.c
  function sharp_spc775_decode (line 36) | static int sharp_spc775_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/silvercrest.c
  function silvercrest_callback (line 19) | static int silvercrest_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/simplisafe.c
  function ss_get_id (line 31) | static void ss_get_id(char *id, uint8_t *b)
  function ss_sensor_parser (line 54) | static int ss_sensor_parser(r_device *decoder, bitbuffer_t *bitbuffer, i...
  function ss_pinentry_parser (line 101) | static int ss_pinentry_parser(r_device *decoder, bitbuffer_t *bitbuffer,...
  function ss_keypad_commands (line 138) | static int ss_keypad_commands(r_device *decoder, bitbuffer_t *bitbuffer,...
  function ss_sensor_callback (line 174) | static int ss_sensor_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/simplisafe_gen3.c
  function simplisafe_gen3_decode (line 37) | static int simplisafe_gen3_decode(r_device *decoder, bitbuffer_t *bitbuf...

FILE: src/devices/smoke_gs558.c
  function smoke_gs558_callback (line 50) | static int smoke_gs558_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/solight_te44.c
  function solight_te44_decode (line 41) | static int solight_te44_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/somfy_iohc.c
  function somfy_iohc_decode (line 94) | static int somfy_iohc_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/somfy_rts.c
  function somfy_rts_decode (line 62) | static int somfy_rts_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/springfield.c
  function springfield_decode (line 34) | static int springfield_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/srsmith_pool_srs_2c_tx.c
  function srsmith_pool_srs_2c_tx_decode (line 49) | static int srsmith_pool_srs_2c_tx_decode(r_device *decoder, bitbuffer_t ...

FILE: src/devices/steelmate.c
  function steelmate_callback (line 56) | static int steelmate_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/telldus_ft0385r.c
  function telldus_ft0385r_decode (line 80) | static int telldus_ft0385r_decode(r_device *decoder, bitbuffer_t *bitbuf...

FILE: src/devices/tfa_14_1504_v2.c
  function tfa_14_1504_v2_decode (line 51) | static int tfa_14_1504_v2_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/tfa_30_3196.c
  function tfa_303196_callback (line 51) | static int tfa_303196_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/tfa_30_3221.c
  function tfa_303221_callback (line 37) | static int tfa_303221_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/tfa_drop_30.3233.c
  function tfa_drop_303233_decode (line 120) | static int tfa_drop_303233_decode(r_device *decoder, bitbuffer_t *bitbuf...

FILE: src/devices/tfa_marbella.c
  function tfa_marbella_callback (line 42) | static int tfa_marbella_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/tfa_pool_thermometer.c
  function tfa_pool_thermometer_decode (line 33) | static int tfa_pool_thermometer_decode(r_device *decoder, bitbuffer_t *b...

FILE: src/devices/tfa_twin_plus_30.3049.c
  function tfa_twin_plus_303049_callback (line 52) | static int tfa_twin_plus_303049_callback(r_device *decoder, bitbuffer_t ...

FILE: src/devices/thermopro_tp11.c
  function thermopro_tp11_sensor_callback (line 26) | static int thermopro_tp11_sensor_callback(r_device *decoder, bitbuffer_t...

FILE: src/devices/thermopro_tp12.c
  function thermopro_tp12_decode (line 49) | static int thermopro_tp12_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/thermopro_tp211b.c
  function tp211b_checksum (line 105) | static uint16_t tp211b_checksum(uint8_t const *b)
  function thermopro_tp211b_decode (line 126) | static int thermopro_tp211b_decode(r_device *decoder, bitbuffer_t *bitbu...

FILE: src/devices/thermopro_tp28b.c
  function bcd2float (line 71) | static float bcd2float(uint8_t lo, uint8_t hi)
  function thermopro_tp28b_decode (line 76) | static int thermopro_tp28b_decode(r_device *decoder, bitbuffer_t *bitbuf...

FILE: src/devices/thermopro_tp82xb.c
  function thermopro_tp828b_decode (line 57) | static int thermopro_tp828b_decode(r_device *decoder, bitbuffer_t *bitbu...
  function thermopro_tp829b_decode (line 169) | static int thermopro_tp829b_decode(r_device *decoder, bitbuffer_t *bitbu...

FILE: src/devices/thermopro_tp862b.c
  function thermopro_tp862b_decode (line 46) | static int thermopro_tp862b_decode(r_device *decoder, bitbuffer_t *bitbu...

FILE: src/devices/thermopro_tx2.c
  function thermopro_tx2_decode (line 41) | static int thermopro_tx2_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/thermopro_tx2c.c
  function thermopro_tx2c_decode (line 46) | static int thermopro_tx2c_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/thermopro_tx7b.c
  function thermopro_tx7b_decode (line 51) | static int thermopro_tx7b_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/thermor.c
  function thermor_decode (line 67) | static int thermor_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/tpms_abarth124.c
  function tpms_abarth124_decode (line 39) | static int tpms_abarth124_decode(r_device *decoder, bitbuffer_t *bitbuff...
  function tpms_abarth124_callback (line 86) | static int tpms_abarth124_callback(r_device *decoder, bitbuffer_t *bitbu...

FILE: src/devices/tpms_airpuxem.c
  function tpms_airpuxem_decode (line 37) | static int tpms_airpuxem_decode(r_device *decoder, bitbuffer_t *bitbuffe...
  function tpms_airpuxem_callback (line 108) | static int tpms_airpuxem_callback(r_device *decoder, bitbuffer_t *bitbuf...

FILE: src/devices/tpms_ave.c
  function tpms_ave_decode (line 33) | static int tpms_ave_decode(r_device *decoder, bitbuffer_t *bitbuffer, un...
  function tpms_ave_callback (line 115) | static int tpms_ave_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/tpms_bmw.c
  function tpms_bmw_decode (line 82) | static int tpms_bmw_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/tpms_bmw_g3.c
  function tpms_bmwg3_decode (line 52) | static int tpms_bmwg3_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/tpms_citroen.c
  function tpms_citroen_decode (line 32) | static int tpms_citroen_decode(r_device *decoder, bitbuffer_t *bitbuffer...
  function tpms_citroen_callback (line 96) | static int tpms_citroen_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/tpms_eezrv.c
  function tpms_eezrv_decode (line 73) | static int tpms_eezrv_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/tpms_elantra2012.c
  function tpms_elantra2012_decode (line 53) | static int tpms_elantra2012_decode(r_device *decoder, bitbuffer_t *bitbu...
  function tpms_elantra2012_callback (line 100) | static int tpms_elantra2012_callback(r_device *decoder, bitbuffer_t *bit...

FILE: src/devices/tpms_ford.c
  function tpms_ford_decode (line 56) | static int tpms_ford_decode(r_device *decoder, bitbuffer_t *bitbuffer, u...
  function tpms_ford_callback (line 163) | static int tpms_ford_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/tpms_gm.c
  function tpms_gm_decode (line 52) | static int tpms_gm_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/tpms_hyundai_vdo.c
  function tpms_hyundai_vdo_decode (line 43) | static int tpms_hyundai_vdo_decode(r_device *decoder, bitbuffer_t *bitbu...
  function tpms_hyundai_vdo_callback (line 107) | static int tpms_hyundai_vdo_callback(r_device *decoder, bitbuffer_t *bit...

FILE: src/devices/tpms_jansite.c
  function tpms_jansite_decode (line 32) | static int tpms_jansite_decode(r_device *decoder, bitbuffer_t *bitbuffer...
  function tpms_jansite_callback (line 80) | static int tpms_jansite_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/tpms_jansite_solar.c
  function tpms_jansite_solar_decode (line 44) | static int tpms_jansite_solar_decode(r_device *decoder, bitbuffer_t *bit...
  function tpms_jansite_solar_callback (line 101) | static int tpms_jansite_solar_callback(r_device *decoder, bitbuffer_t *b...

FILE: src/devices/tpms_kia.c
  function tpms_kia_decode (line 44) | static int tpms_kia_decode(r_device *decoder, bitbuffer_t *bitbuffer, un...
  function tpms_kia_callback (line 112) | static int tpms_kia_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/tpms_nissan.c
  function tpms_nissan_decode (line 22) | static int tpms_nissan_decode(r_device *decoder, bitbuffer_t *bitbuffer,...
  function tpms_nissan_callback (line 75) | static int tpms_nissan_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/tpms_pmv107j.c
  function tpms_pmv107j_decode (line 36) | static int tpms_pmv107j_decode(r_device *decoder, bitbuffer_t *bitbuffer...
  function tpms_pmv107j_callback (line 99) | static int tpms_pmv107j_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/tpms_porsche.c
  function tpms_porsche_decode (line 40) | static int tpms_porsche_decode(r_device *decoder, bitbuffer_t *bitbuffer...
  function tpms_porsche_callback (line 87) | static int tpms_porsche_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/tpms_renault.c
  function tpms_renault_decode (line 36) | static int tpms_renault_decode(r_device *decoder, bitbuffer_t *bitbuffer...
  function tpms_renault_callback (line 82) | static int tpms_renault_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/tpms_renault_0435r.c
  function tpms_renault_0435r_decode (line 73) | static int tpms_renault_0435r_decode(r_device *decoder, bitbuffer_t *bit...
  function tpms_renault_0435r_callback (line 136) | static int tpms_renault_0435r_callback(r_device *decoder, bitbuffer_t *b...

FILE: src/devices/tpms_toyota.c
  function tpms_toyota_decode (line 31) | static int tpms_toyota_decode(r_device *decoder, bitbuffer_t *bitbuffer,...
  function tpms_toyota_callback (line 83) | static int tpms_toyota_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/tpms_truck.c
  function tpms_truck_decode (line 52) | static int tpms_truck_decode(r_device *decoder, bitbuffer_t *bitbuffer, ...
  function tpms_truck_callback (line 100) | static int tpms_truck_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/tpms_trw.c
  function tpms_trw_decode (line 50) | static int tpms_trw_decode(r_device *decoder, bitbuffer_t *bitbuffer, in...
  function tpms_trw_callback_ook (line 138) | static int tpms_trw_callback_ook(r_device *decoder, bitbuffer_t *bitbuffer)
  function tpms_trw_callback_fsk (line 147) | static int tpms_trw_callback_fsk(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/tpms_tyreguard400.c
  function tpms_tyreguard400_decode (line 72) | static int tpms_tyreguard400_decode(r_device *decoder, bitbuffer_t *bitb...
  function tpms_tyreguard400_callback (line 130) | static int tpms_tyreguard400_callback(r_device *decoder, bitbuffer_t *bi...

FILE: src/devices/ts_ft002.c
  function ts_ft002_decoder (line 39) | static int ts_ft002_decoder(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/ttx201.c
  function ttx201_decode (line 105) | static int ttx201_decode(r_device *decoder, bitbuffer_t *bitbuffer, unsi...
  function ttx201_callback (line 208) | static int ttx201_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/universalfanctrl.c
  function universalfan_decode (line 40) | static int universalfan_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/vaillant_vrt340f.c
  function validate_checksum (line 36) | static int validate_checksum(r_device *decoder, uint8_t *b, int from, in...
  function vaillant_vrt340_callback (line 50) | static int vaillant_vrt340_callback(r_device *decoder, bitbuffer_t *bitb...

FILE: src/devices/vauno_en8822c.c
  function vauno_en8822c_decode (line 49) | static int vauno_en8822c_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/vevor_7in1.c
  function vevor_7in1_decode (line 58) | static int vevor_7in1_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/visonic_powercode.c
  function visonic_powercode_decode (line 49) | static int visonic_powercode_decode(r_device *decoder, bitbuffer_t *bitb...

FILE: src/devices/wallarge_cltx001.c
  function wallarge_cltx001_decode (line 110) | static int wallarge_cltx001_decode(r_device *decoder, bitbuffer_t *bitbu...

FILE: src/devices/watts_thermostat.c
  type WATTSTHERMO_FLAGS (line 83) | enum WATTSTHERMO_FLAGS {
  function watts_thermostat_decode (line 91) | static int watts_thermostat_decode(r_device *decoder, bitbuffer_t *bitbu...

FILE: src/devices/waveman.c
  function waveman_callback (line 28) | static int waveman_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/wec2103.c
  function wec2103_decode (line 44) | static int wec2103_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/wg_pb12v1.c
  function wg_pb12v1_decode (line 51) | static int wg_pb12v1_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/ws2032.c
  function fineoffset_ws2032_decode (line 35) | static int fineoffset_ws2032_decode(r_device *decoder, bitbuffer_t *bitb...

FILE: src/devices/wssensor.c
  function wssensor_decode (line 34) | static int wssensor_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/wt0124.c
  function wt1024_callback (line 32) | static int wt1024_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/wt450.c
  function wt450_callback (line 58) | static int wt450_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/x10_rf.c
  function x10_rf_callback (line 45) | static int x10_rf_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/x10_sec.c
  function x10_sec_callback (line 60) | static int x10_sec_callback(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/devices/yale_hsa.c
  function yale_hsa_decode (line 63) | static int yale_hsa_decode(r_device *decoder, bitbuffer_t *bitbuffer)

FILE: src/fileformat.c
  function file_info_clear (line 39) | void file_info_clear(file_info_t *info)
  function file_info_check_read (line 46) | void file_info_check_read(file_info_t *info)
  function file_info_check_write (line 59) | void file_info_check_write(file_info_t *info)
  function file_type_set_format (line 97) | static void file_type_set_format(uint32_t *type, uint32_t val)
  function file_type_set_content (line 102) | static void file_type_set_content(uint32_t *type, uint32_t val)
  function file_type_guess_auto_format (line 107) | static uint32_t file_type_guess_auto_format(uint32_t type)
  function file_type (line 128) | static void file_type(char const *filename, file_info_t *info)
  function file_info_parse_filename (line 252) | int file_info_parse_filename(file_info_t *info, char const *filename)
  function assert_file_type (line 281) | static void assert_file_type(int check, char const *spec)
  function assert_str_equal (line 292) | static void assert_str_equal(char const *a, char const *b)
  function main (line 301) | int main(void)

FILE: src/getopt/getopt.c
  function exchange (line 302) | static void
  function _getopt_internal (line 509) | int
  function getopt (line 975) | int
  function main (line 994) | int

FILE: src/getopt/getopt.h
  type option (line 94) | struct option
  type option (line 152) | struct option
  type option (line 155) | struct option
  type option (line 160) | struct option

FILE: src/http_server.c
  type ring_list_t (line 135) | typedef struct {
  function ring_list_t (line 142) | static ring_list_t *ring_list_new(unsigned size)
  function ring_list_free (line 164) | static void ring_list_free(ring_list_t *ring)
  function data_t (line 229) | static data_t *meta_data(r_cfg_t *cfg)
  function data_t (line 252) | static data_t *protocols_data(r_cfg_t *cfg)
  type rpc_t (line 328) | typedef struct rpc rpc_t;
  type rpc (line 332) | struct rpc {
  function jsoneq (line 343) | static int jsoneq(const char *json, jsmntok_t *tok, const char *s)
  function json_parse (line 377) | static int json_parse(rpc_t *rpc, struct mg_str const *json)
  function jsonrpc_parse (line 435) | static int jsonrpc_parse(rpc_t *rpc, struct mg_str const *json)
  function rpc_exec (line 518) | static void rpc_exec(rpc_t *rpc, r_cfg_t *cfg)
  type http_server_context (line 678) | struct http_server_context {
  type nc_context (line 686) | struct nc_context {
  function handle_options (line 690) | static void handle_options(struct mg_connection *nc, struct http_message...
  function handle_get (line 706) | static void handle_get(struct mg_connection *nc, struct http_message *hm...
  function handle_redirect (line 717) | static void handle_redirect(struct mg_connection *nc, struct http_messag...
  function handle_openmetrics (line 738) | static void handle_openmetrics(struct mg_connection *nc, struct http_mes...
  function rpc_response_ws (line 809) | static void rpc_response_ws(rpc_t *rpc, int ret_code, char const *messag...
  function rpc_response_jsonrpc (line 841) | static void rpc_response_jsonrpc(rpc_t *rpc, int ret_code, char const *m...
  function rpc_response_jsoncmd (line 878) | static void rpc_response_jsoncmd(rpc_t *rpc, int ret_code, char const *m...
  function handle_json_events (line 915) | static void handle_json_events(struct mg_connection *nc, struct http_mes...
  function handle_json_stream (line 934) | static void handle_json_stream(struct mg_connection *nc, struct http_mes...
  function handle_cmd_rpc (line 960) | static void handle_cmd_rpc(struct mg_connection *nc, struct http_message...
  function handle_json_rpc (line 995) | static void handle_json_rpc(struct mg_connection *nc, struct http_messag...
  function handle_ws_rpc (line 1023) | static void handle_ws_rpc(struct mg_connection *nc, struct websocket_mes...
  type mg_connection (line 1049) | struct mg_connection
  function send_keep_alive (line 1051) | static void send_keep_alive(struct mg_connection *nc)
  function ev_handler (line 1069) | static void ev_handler(struct mg_connection *nc, int ev, void *ev_data)
  function is_websocket (line 1139) | static int is_websocket(const struct mg_connection *nc)
  function http_broadcast_send (line 1145) | static void http_broadcast_send(struct http_server_context *ctx, char co...
  type http_server_context (line 1179) | struct http_server_context
  type mg_mgr (line 1179) | struct mg_mgr
  type data_output (line 1179) | struct data_output
  type mg_bind_opts (line 1181) | struct mg_bind_opts
  type http_server_context (line 1185) | struct http_server_context
  type http_server_context (line 1185) | struct http_server_context
  function http_server_stop (line 1228) | static int http_server_stop(struct http_server_context *ctx)
  type data_output_http_t (line 1269) | typedef struct {
  function print_http_data (line 1274) | static void R_API_CALLCONV print_http_data(data_output_t *output, data_t...
  function data_output_http_free (line 1306) | static void R_API_CALLCONV data_output_http_free(data_output_t *output)
  type data_output (line 1318) | struct data_output
  type mg_mgr (line 1318) | struct mg_mgr
  type data_output (line 1335) | struct data_output

FILE: src/jsmn.c
  function jsmntok_t (line 6) | static jsmntok_t *jsmn_alloc_token(jsmn_parser *parser,
  function jsmn_fill_token (line 24) | static void jsmn_fill_token(jsmntok_t *token, jsmntype_t type,
  function jsmn_parse_primitive (line 35) | static int jsmn_parse_primitive(jsmn_parser *parser, const char *js,
  function jsmn_parse_string (line 84) | static int jsmn_parse_string(jsmn_parser *parser, const char *js,
  function jsmn_parse (line 151) | int jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
  function jsmn_init (line 309) | void jsmn_init(jsmn_parser *parser) {

FILE: src/list.c
  function list_ensure_size (line 17) | void list_ensure_size(list_t *list, size_t min_size)
  function list_push (line 32) | void list_push(list_t *list, void *p)
  function list_push_all (line 42) | void list_push_all(list_t *list, void **p)
  function list_remove (line 48) | void list_remove(list_t *list, size_t idx, list_elem_free_fn elem_free)
  function list_clear (line 64) | __attribute__((no_sanitize("undefined")))
  function list_free_elems (line 79) | void list_free_elems(list_t *list, list_elem_free_fn elem_free)

FILE: src/logger.c
  function default_handler (line 20) | static void default_handler(log_level_t level, char const *src, char con...
  function r_logger_set_log_handler (line 26) | void r_logger_set_log_handler(r_logger_handler const handler, void *user...
  function print_log (line 32) | void print_log(log_level_t level, char const *src, char const *msg)
  function print_logf (line 42) | void print_logf(log_level_t level, char const *src, char const *fmt, ...)

FILE: src/mongoose.c
  type mg_connection (line 50) | struct mg_connection
  type mg_connection (line 56) | struct mg_connection
  type mg_connection (line 59) | struct mg_connection
  type mg_connection (line 59) | struct mg_connection
  type mg_mgr (line 60) | struct mg_mgr
  type mg_connection (line 60) | struct mg_connection
  type mg_connection (line 61) | struct mg_connection
  type mg_mgr (line 63) | struct mg_mgr
  type mg_add_sock_opts (line 64) | struct mg_add_sock_opts
  type ctl_msg (line 70) | struct ctl_msg {
  type mg_mqtt_message (line 76) | struct mg_mqtt_message
  type mbuf (line 81) | struct mbuf
  type mg_mqtt_message (line 81) | struct mg_mqtt_message
  type mg_serve_http_opts (line 93) | struct mg_serve_http_opts
  type mg_connection (line 96) | struct mg_connection
  type mg_connection (line 109) | struct mg_connection
  type http_message (line 110) | struct http_message
  type http_message (line 114) | struct http_message
  type mg_serve_http_opts (line 115) | struct mg_serve_http_opts
  type mg_str (line 117) | struct mg_str
  type http_message (line 119) | struct http_message
  type mg_connection (line 122) | struct mg_connection
  type mg_str (line 123) | struct mg_str
  type http_message (line 124) | struct http_message
  type mg_serve_http_opts (line 125) | struct mg_serve_http_opts
  type mg_http_proto_data_cgi (line 126) | struct mg_http_proto_data_cgi
  type mg_http_proto_data_cgi (line 127) | struct mg_http_proto_data_cgi
  type mg_connection (line 130) | struct mg_connection
  type http_message (line 131) | struct http_message
  type mg_serve_http_opts (line 133) | struct mg_serve_http_opts
  type mg_str (line 136) | struct mg_str
  type mg_connection (line 137) | struct mg_connection
  type http_message (line 138) | struct http_message
  type mg_serve_http_opts (line 139) | struct mg_serve_http_opts
  type mg_connection (line 140) | struct mg_connection
  type mg_connection (line 141) | struct mg_connection
  type http_message (line 142) | struct http_message
  type mg_connection (line 143) | struct mg_connection
  type mg_serve_http_opts (line 144) | struct mg_serve_http_opts
  type http_message (line 145) | struct http_message
  type mg_connection (line 146) | struct mg_connection
  type mg_serve_http_opts (line 147) | struct mg_serve_http_opts
  type mg_connection (line 149) | struct mg_connection
  type http_message (line 150) | struct http_message
  type mg_connection (line 153) | struct mg_connection
  type mg_connection (line 155) | struct mg_connection
  type mg_str (line 156) | struct mg_str
  type http_message (line 157) | struct http_message
  type mg_connection (line 163) | struct mg_connection
  type mg_sntp_message (line 167) | struct mg_sntp_message
  function cs_base64_emit_code (line 258) | static void cs_base64_emit_code(struct cs_base64_ctx *ctx, int v) {
  function cs_base64_emit_chunk (line 271) | static void cs_base64_emit_chunk(struct cs_base64_ctx *ctx) {
  function cs_base64_init (line 288) | void cs_base64_init(struct cs_base64_ctx *ctx, cs_base64_putc_t b64_putc,
  function cs_base64_update (line 295) | void cs_base64_update(struct cs_base64_ctx *ctx, const char *str, size_t...
  function cs_base64_finish (line 307) | void cs_base64_finish(struct cs_base64_ctx *ctx) {
  function cs_base64_encode (line 353) | void cs_base64_encode(const unsigned char *src, int src_len, char *dst) {
  function cs_fprint_base64 (line 369) | void cs_fprint_base64(FILE *f, const unsigned char *src, int src_len) {
  function from_b64 (line 378) | static unsigned char from_b64(unsigned char ch) {
  function cs_base64_decode (line 417) | int cs_base64_decode(const unsigned char *s, int len, char *dst, int *de...
  type cs_log_level (line 487) | enum cs_log_level {
  type cs_log_level (line 503) | enum cs_log_level
  type cs_log_level (line 525) | enum cs_log_level
  type cs_log_level (line 527) | enum cs_log_level
  type cs_log_level (line 619) | enum cs_log_level
  type cs_log_level (line 637) | enum cs_log_level
  function cs_log_set_file_level (line 639) | void cs_log_set_file_level(const char *file_level) {
  type cs_log_level (line 649) | enum cs_log_level
  function cs_log_print_prefix (line 650) | int cs_log_print_prefix(enum cs_log_level level, const char *file, int l...
  function cs_log_printf (line 706) | void cs_log_printf(const char *fmt, ...) {
  function cs_log_set_file (line 717) | void cs_log_set_file(FILE *file) {
  function cs_log_set_file_level (line 723) | void cs_log_set_file_level(const char *file_level) {
  type cs_log_level (line 729) | enum cs_log_level
  function cs_log_set_level (line 730) | void cs_log_set_level(enum cs_log_level level) {
  type DIR (line 768) | typedef struct { int dummy; } DIR;
  type dirent (line 770) | struct dirent {
  type dirent (line 782) | struct dirent
  type win32_dir (line 821) | struct win32_dir {
  function DIR (line 828) | DIR *opendir(const char *name) {
  function closedir (line 853) | int closedir(DIR *d) {
  type dirent (line 869) | struct dirent
  type win32_dir (line 870) | struct win32_dir
  type win32_dir (line 870) | struct win32_dir
  type dirent (line 871) | struct dirent
  type cs_dirent_dummy (line 900) | typedef int cs_dirent_dummy;
  function cs_time (line 938) | double cs_time(void) {
  function cs_timegm (line 965) | double cs_timegm(const struct tm *tm) {
  function byteReverse (line 1074) | static void byteReverse(unsigned char *buf, unsigned longs) {
  function cs_md5_init (line 1101) | void cs_md5_init(cs_md5_ctx *ctx) {
  function cs_md5_transform (line 1111) | static void cs_md5_transform(uint32_t buf[4], uint32_t const in[16]) {
  function cs_md5_update (line 1193) | void cs_md5_update(cs_md5_ctx *ctx, const unsigned char *buf, size_t len) {
  function cs_md5_final (line 1228) | void cs_md5_final(unsigned char *digest, cs_md5_ctx *ctx) {
  function blk0 (line 1284) | static uint32_t blk0(union char64long16 *block, int i) {
  function cs_sha1_transform (line 1321) | void cs_sha1_transform(uint32_t state[5], const unsigned char buffer[64]) {
  function cs_sha1_init (line 1427) | void cs_sha1_init(cs_sha1_ctx *context) {
  function cs_sha1_update (line 1436) | void cs_sha1_update(cs_sha1_ctx *context, const unsigned char *data,
  function cs_sha1_final (line 1456) | void cs_sha1_final(unsigned char digest[20], cs_sha1_ctx *context) {
  function cs_hmac_sha1 (line 1480) | void cs_hmac_sha1(const unsigned char *key, size_t keylen,
  type mbuf (line 1550) | struct mbuf
  function mbuf_init (line 1551) | void mbuf_init(struct mbuf *mbuf, size_t initial_size) {
  type mbuf (line 1557) | struct mbuf
  function mbuf_free (line 1558) | void mbuf_free(struct mbuf *mbuf) {
  type mbuf (line 1565) | struct mbuf
  function mbuf_resize (line 1566) | void mbuf_resize(struct mbuf *a, size_t new_size) {
  type mbuf (line 1580) | struct mbuf
  function mbuf_trim (line 1581) | void mbuf_trim(struct mbuf *mbuf) {
  type mbuf (line 1585) | struct mbuf
  function mbuf_insert (line 1586) | size_t mbuf_insert(struct mbuf *a, size_t off, const void *buf, size_t l...
  type mbuf (line 1629) | struct mbuf
  function mbuf_append (line 1630) | size_t mbuf_append(struct mbuf *a, const void *buf, size_t len) {
  type mbuf (line 1634) | struct mbuf
  function mbuf_append_and_free (line 1635) | size_t mbuf_append_and_free(struct mbuf *a, void *data, size_t len) {
  type mbuf (line 1650) | struct mbuf
  function mbuf_remove (line 1651) | void mbuf_remove(struct mbuf *mb, size_t n) {
  type mbuf (line 1658) | struct mbuf
  function mbuf_clear (line 1659) | void mbuf_clear(struct mbuf *mb) {
  type mbuf (line 1663) | struct mbuf
  type mbuf (line 1663) | struct mbuf
  function mbuf_move (line 1664) | void mbuf_move(struct mbuf *from, struct mbuf *to) {
  type mg_str (line 1700) | struct mg_str
  function mg_mk_str (line 1701) | struct mg_str mg_mk_str(const char *s) {
  type mg_str (line 1707) | struct mg_str
  function mg_mk_str_n (line 1708) | struct mg_str mg_mk_str_n(const char *s, size_t len) {
  type mg_str (line 1713) | struct mg_str
  function mg_vcmp (line 1714) | int mg_vcmp(const struct mg_str *str1, const char *str2) {
  type mg_str (line 1723) | struct mg_str
  function mg_vcasecmp (line 1724) | int mg_vcasecmp(const struct mg_str *str1, const char *str2) {
  function mg_strdup_common (line 1733) | static struct mg_str mg_strdup_common(const struct mg_str s,
  type mg_str (line 1748) | struct mg_str
  type mg_str (line 1748) | struct mg_str
  function mg_strdup (line 1749) | struct mg_str mg_strdup(const struct mg_str s) {
  type mg_str (line 1753) | struct mg_str
  type mg_str (line 1753) | struct mg_str
  function mg_strdup_nul (line 1754) | struct mg_str mg_strdup_nul(const struct mg_str s) {
  type mg_str (line 1758) | struct mg_str
  type mg_str (line 1759) | struct mg_str
  type mg_str (line 1767) | struct mg_str
  type mg_str (line 1767) | struct mg_str
  function mg_strcmp (line 1768) | int mg_strcmp(const struct mg_str str1, const struct mg_str str2) {
  type mg_str (line 1780) | struct mg_str
  type mg_str (line 1780) | struct mg_str
  function mg_strncmp (line 1781) | int mg_strncmp(const struct mg_str str1, const struct mg_str str2, size_...
  type mg_str (line 1794) | struct mg_str
  function mg_strfree (line 1795) | void mg_strfree(struct mg_str *s) {
  type mg_str (line 1802) | struct mg_str
  type mg_str (line 1803) | struct mg_str
  type mg_str (line 1804) | struct mg_str
  type mg_str (line 1805) | struct mg_str
  type mg_str (line 1816) | struct mg_str
  type mg_str (line 1816) | struct mg_str
  function mg_strstrip (line 1817) | struct mg_str mg_strstrip(struct mg_str s) {
  type mg_str (line 1828) | struct mg_str
  type mg_str (line 1828) | struct mg_str
  function mg_str_starts_with (line 1829) | int mg_str_starts_with(struct mg_str s, struct mg_str prefix) {
  function c_strnlen (line 1867) | size_t c_strnlen(const char *s, size_t maxlen) {
  function c_vsnprintf (line 1884) | int c_vsnprintf(char *buf, size_t buf_size, const char *fmt, va_list ap) {
  function c_itoa (line 1888) | static int c_itoa(char *buf, size_t buf_size, int64_t num, int base, int...
  function c_vsnprintf (line 1930) | int c_vsnprintf(char *buf, size_t buf_size, const char *fmt, va_list ap) {
  function c_snprintf (line 2068) | int c_snprintf(char *buf, size_t buf_size, const char *fmt, ...) {
  function to_wchar (line 2078) | int to_wchar(const char *path, wchar_t *wbuf, size_t wbuf_len) {
  function cs_to_hex (line 2139) | void cs_to_hex(char *to, const unsigned char *p, size_t len) {
  function fourbit (line 2149) | static int fourbit(int ch) {
  function cs_from_hex (line 2161) | void cs_from_hex(char *to, const char *p, size_t len) {
  function cs_to64 (line 2172) | int64_t cs_to64(const char *s) {
  function str_util_lowercase (line 2189) | static int str_util_lowercase(const char *s) {
  function mg_ncasecmp (line 2194) | int mg_ncasecmp(const char *s1, const char *s2, size_t len) {
  function mg_casecmp (line 2205) | int mg_casecmp(const char *s1, const char *s2) {
  function mg_asprintf (line 2210) | int mg_asprintf(char **buf, size_t size, const char *fmt, ...) {
  function mg_avprintf (line 2220) | int mg_avprintf(char **buf, size_t size, const char *fmt, va_list ap) {
  type mg_str (line 2268) | struct mg_str
  type mg_str (line 2269) | struct mg_str
  type mg_str (line 2270) | struct mg_str
  type mg_str (line 2271) | struct mg_str
  type mg_str (line 2272) | struct mg_str
  type mg_str (line 2276) | struct mg_str
  type mg_str (line 2276) | struct mg_str
  type mg_str (line 2276) | struct mg_str
  type mg_str (line 2277) | struct mg_str
  function mg_next_comma_list_entry_n (line 2278) | struct mg_str mg_next_comma_list_entry_n(struct mg_str list, struct mg_s...
  type mg_str (line 2314) | struct mg_str
  type mg_str (line 2314) | struct mg_str
  function mg_match_prefix_n (line 2315) | size_t mg_match_prefix_n(const struct mg_str pattern, const struct mg_st...
  function mg_match_prefix (line 2361) | size_t mg_match_prefix(const char *pattern, int pattern_len, const char ...
  function MG_INTERNAL (line 2422) | MG_INTERNAL void mg_add_conn(struct mg_mgr *mgr, struct mg_connection *c) {
  function MG_INTERNAL (line 2434) | MG_INTERNAL void mg_remove_conn(struct mg_connection *conn) {
  function MG_INTERNAL (line 2442) | MG_INTERNAL void mg_call(struct mg_connection *nc,
  function MG_INTERNAL (line 2484) | MG_INTERNAL void mg_timer(struct mg_connection *c, double now) {
  function MG_INTERNAL (line 2492) | MG_INTERNAL size_t recv_avail_size(struct mg_connection *conn, size_t ma...
  type mg_connection (line 2499) | struct mg_connection
  function mg_if_poll (line 2501) | int mg_if_poll(struct mg_connection *nc, double now) {
  function mg_destroy_conn (line 2535) | void mg_destroy_conn(struct mg_connection *conn, int destroy_if) {
  function mg_close_conn (line 2553) | void mg_close_conn(struct mg_connection *conn) {
  function mg_mgr_init (line 2577) | void mg_mgr_init(struct mg_mgr *m, void *user_data) {
  function mg_mgr_init_opt (line 2583) | void mg_mgr_init_opt(struct mg_mgr *m, void *user_data,
  function mg_mgr_free (line 2635) | void mg_mgr_free(struct mg_mgr *m) {
  function mg_mgr_poll (line 2667) | int mg_mgr_poll(struct mg_mgr *m, int timeout_ms) {
  function mg_vprintf (line 2677) | int mg_vprintf(struct mg_connection *nc, const char *fmt, va_list ap) {
  function mg_printf (line 2691) | int mg_printf(struct mg_connection *conn, const char *fmt, ...) {
  function mg_resolve2 (line 2702) | static int mg_resolve2(const char *host, struct in_addr *ina) {
  function mg_resolve (line 2732) | int mg_resolve(const char *host, char *buf, size_t n) {
  function mg_connection (line 2738) | mg_connection *mg_create_connection_base(
  function mg_connection (line 2765) | mg_connection *mg_create_connection(
  function MG_INTERNAL (line 2794) | MG_INTERNAL int mg_parse_address(const char *str, union socket_address *sa,
  function MG_INTERNAL (line 2872) | MG_INTERNAL void mg_ssl_handshake(struct mg_connection *nc) {
  type mg_connection (line 2901) | struct mg_connection
  type mg_connection (line 2901) | struct mg_connection
  type mg_add_sock_opts (line 2902) | struct mg_add_sock_opts
  type mg_connection (line 2903) | struct mg_connection
  function mg_if_accept_tcp_cb (line 2918) | void mg_if_accept_tcp_cb(struct mg_connection *nc, union socket_address ...
  function mg_send (line 2939) | void mg_send(struct mg_connection *nc, const void *buf, int len) {
  type mg_connection (line 2944) | struct mg_connection
  type mg_connection (line 2945) | struct mg_connection
  function mg_do_recv (line 2947) | static int mg_do_recv(struct mg_connection *nc) {
  function mg_if_can_recv_cb (line 2975) | void mg_if_can_recv_cb(struct mg_connection *nc) {
  function mg_recv_tcp (line 2979) | static int mg_recv_tcp(struct mg_connection *nc, char *buf, size_t len) {
  function mg_recv_udp (line 3022) | static int mg_recv_udp(struct mg_connection *nc, char *buf, size_t len) {
  function mg_if_can_send_cb (line 3098) | void mg_if_can_send_cb(struct mg_connection *nc) {
  function mg_connection (line 3162) | mg_connection *mg_do_connect(struct mg_connection *nc,
  function mg_if_connect_cb (line 3178) | void mg_if_connect_cb(struct mg_connection *nc, int err) {
  function resolve_cb (line 3203) | static void resolve_cb(struct mg_dns_message *msg, void *data,
  type mg_connection (line 3243) | struct mg_connection
  type mg_mgr (line 3243) | struct mg_mgr
  type mg_connect_opts (line 3246) | struct mg_connect_opts
  function mg_ev_handler_empty (line 3251) | void mg_ev_handler_empty(struct mg_connection *c, int ev,
  type mg_connection (line 3261) | struct mg_connection
  type mg_mgr (line 3261) | struct mg_mgr
  type mg_connect_opts (line 3264) | struct mg_connect_opts
  type mg_connection (line 3265) | struct mg_connection
  type mg_add_sock_opts (line 3267) | struct mg_add_sock_opts
  type mg_ssl_if_conn_params (line 3303) | struct mg_ssl_if_conn_params
  type mg_connection (line 3340) | struct mg_connection
  type mg_resolve_async_opts (line 3341) | struct mg_resolve_async_opts
  type mg_connection (line 3365) | struct mg_connection
  type mg_mgr (line 3365) | struct mg_mgr
  type mg_bind_opts (line 3368) | struct mg_bind_opts
  type mg_connection (line 3373) | struct mg_connection
  type mg_mgr (line 3373) | struct mg_mgr
  type mg_bind_opts (line 3376) | struct mg_bind_opts
  type mg_connection (line 3378) | struct mg_connection
  type mg_add_sock_opts (line 3380) | struct mg_add_sock_opts
  type mg_ssl_if_conn_params (line 3412) | struct mg_ssl_if_conn_params
  type mg_connection (line 3448) | struct mg_connection
  type mg_mgr (line 3448) | struct mg_mgr
  type mg_connection (line 3448) | struct mg_connection
  function mg_broadcast (line 3453) | void mg_broadcast(struct mg_mgr *mgr, mg_event_handler_t cb, void *data,
  function isbyte (line 3487) | static int isbyte(int n) {
  function parse_net (line 3491) | static int parse_net(const char *spec, uint32_t *net, uint32_t *mask) {
  function mg_check_ip_acl (line 3507) | int mg_check_ip_acl(const char *acl, uint32_t remote_ip) {
  function mg_forward (line 3532) | void mg_forward(struct mg_connection *from, struct mg_connection *to) {
  function mg_set_timer (line 3537) | double mg_set_timer(struct mg_connection *c, double timestamp) {
  function mg_sock_set (line 3553) | void mg_sock_set(struct mg_connection *nc, sock_t sock) {
  function mg_if_get_conn_addr (line 3559) | void mg_if_get_conn_addr(struct mg_connection *nc, int remote,
  type mg_connection (line 3564) | struct mg_connection
  type mg_mgr (line 3564) | struct mg_mgr
  type mg_add_sock_opts (line 3567) | struct mg_add_sock_opts
  type mg_connection (line 3572) | struct mg_connection
  type mg_connection (line 3580) | struct mg_connection
  type mg_mgr (line 3580) | struct mg_mgr
  type mg_add_sock_opts (line 3583) | struct mg_add_sock_opts
  function mg_time (line 3588) | double mg_time(void) {
  type mg_iface_vtable (line 3612) | struct mg_iface_vtable
  type mg_iface_vtable (line 3637) | struct mg_iface_vtable
  type mg_iface_vtable (line 3651) | struct mg_iface_vtable
  type mg_iface_vtable (line 3653) | struct mg_iface_vtable
  type mg_iface (line 3659) | struct mg_iface
  type mg_iface_vtable (line 3659) | struct mg_iface_vtable
  type mg_mgr (line 3660) | struct mg_mgr
  type mg_iface (line 3661) | struct mg_iface
  type mg_iface (line 3661) | struct mg_iface
  type mg_iface (line 3668) | struct mg_iface
  type mg_mgr (line 3668) | struct mg_mgr
  type mg_iface_vtable (line 3669) | struct mg_iface_vtable
  type mg_iface (line 3670) | struct mg_iface
  function mg_mgr_min_timer (line 3689) | double mg_mgr_min_timer(const struct mg_mgr *mgr) {
  function mg_null_if_connect_tcp (line 3721) | static void mg_null_if_connect_tcp(struct mg_connection *c,
  function mg_null_if_connect_udp (line 3727) | static void mg_null_if_connect_udp(struct mg_connection *c) {
  function mg_null_if_listen_tcp (line 3731) | static int mg_null_if_listen_tcp(struct mg_connection *c,
  function mg_null_if_listen_udp (line 3738) | static int mg_null_if_listen_udp(struct mg_connection *c,
  function mg_null_if_tcp_send (line 3745) | static int mg_null_if_tcp_send(struct mg_connection *c, const void *buf,
  function mg_null_if_udp_send (line 3753) | static int mg_null_if_udp_send(struct mg_connection *c, const void *buf,
  function mg_null_if_tcp_recv (line 3761) | int mg_null_if_tcp_recv(struct mg_connection *c, void *buf, size_t len) {
  function mg_null_if_udp_recv (line 3768) | int mg_null_if_udp_recv(struct mg_connection *c, void *buf, size_t len,
  function mg_null_if_create_conn (line 3778) | static int mg_null_if_create_conn(struct mg_connection *c) {
  function mg_null_if_destroy_conn (line 3783) | static void mg_null_if_destroy_conn(struct mg_connection *c) {
  function mg_null_if_sock_set (line 3787) | static void mg_null_if_sock_set(struct mg_connection *c, sock_t sock) {
  function mg_null_if_init (line 3792) | static void mg_null_if_init(struct mg_iface *iface) {
  function mg_null_if_free (line 3796) | static void mg_null_if_free(struct mg_iface *iface) {
  function mg_null_if_add_conn (line 3800) | static void mg_null_if_add_conn(struct mg_connection *c) {
  function mg_null_if_remove_conn (line 3805) | static void mg_null_if_remove_conn(struct mg_connection *c) {
  function time_t (line 3809) | static time_t mg_null_if_poll(struct mg_iface *iface, int timeout_ms) {
  function mg_null_if_get_conn_addr (line 3822) | static void mg_null_if_get_conn_addr(struct mg_connection *c, int remote,
  type mg_iface_vtable (line 3839) | struct mg_iface_vtable
  type mg_iface_vtable (line 3842) | struct mg_iface_vtable
  function mg_set_non_blocking_mode (line 3861) | void mg_set_non_blocking_mode(sock_t sock) {
  function mg_is_error (line 3871) | static int mg_is_error(void) {
  function mg_socket_if_connect_tcp (line 3883) | void mg_socket_if_connect_tcp(struct mg_connection *nc,
  function mg_socket_if_connect_udp (line 3910) | void mg_socket_if_connect_udp(struct mg_connection *nc) {
  function mg_socket_if_listen_tcp (line 3935) | int mg_socket_if_listen_tcp(struct mg_connection *nc,
  function mg_socket_if_listen_udp (line 3946) | static int mg_socket_if_listen_udp(struct mg_connection *nc,
  function mg_socket_if_tcp_send (line 3954) | static int mg_socket_if_tcp_send(struct mg_connection *nc, const void *buf,
  function mg_socket_if_udp_send (line 3961) | static int mg_socket_if_udp_send(struct mg_connection *nc, const void *buf,
  function mg_socket_if_tcp_recv (line 3968) | static int mg_socket_if_tcp_recv(struct mg_connection *nc, void *buf,
  function mg_socket_if_udp_recv (line 3980) | static int mg_socket_if_udp_recv(struct mg_connection *nc, void *buf,
  function mg_socket_if_create_conn (line 3990) | int mg_socket_if_create_conn(struct mg_connection *nc) {
  function mg_socket_if_destroy_conn (line 3995) | void mg_socket_if_destroy_conn(struct mg_connection *nc) {
  function mg_accept_conn (line 4006) | static int mg_accept_conn(struct mg_connection *lc) {
  function else (line 4077) | else if (sock != INVALID_SOCKET) {
  function mg_mgr_handle_conn (line 4089) | void mg_mgr_handle_conn(struct mg_connection *nc, int fd_flags, double n...
  function mg_mgr_handle_ctl_sock (line 4152) | static void mg_mgr_handle_ctl_sock(struct mg_mgr *mgr) {
  function mg_socket_if_sock_set (line 4175) | void mg_socket_if_sock_set(struct mg_connection *nc, sock_t sock) {
  function mg_socket_if_init (line 4182) | void mg_socket_if_init(struct mg_iface *iface) {
  function mg_socket_if_free (line 4190) | void mg_socket_if_free(struct mg_iface *iface) {
  function mg_socket_if_add_conn (line 4194) | void mg_socket_if_add_conn(struct mg_connection *nc) {
  function mg_socket_if_remove_conn (line 4198) | void mg_socket_if_remove_conn(struct mg_connection *nc) {
  function mg_add_to_set (line 4202) | void mg_add_to_set(sock_t sock, fd_set *set, sock_t *max_fd) {
  function time_t (line 4215) | time_t mg_socket_if_poll(struct mg_iface *iface, int timeout_ms) {
  function MG_INTERNAL (line 4341) | MG_INTERNAL void mg_socketpair_close(sock_t *sock) {
  function MG_INTERNAL (line 4349) | MG_INTERNAL sock_t
  function mg_socketpair (line 4361) | int mg_socketpair(sock_t sp[2], int sock_type) {
  function mg_sock_get_addr (line 4413) | static void mg_sock_get_addr(sock_t sock, int remote,
  function mg_sock_to_str (line 4424) | void mg_sock_to_str(sock_t sock, char *buf, size_t len, int flags) {
  function mg_socket_if_get_conn_addr (line 4430) | void mg_socket_if_get_conn_addr(struct mg_connection *nc, int remote,
  type mg_iface_vtable (line 4462) | struct mg_iface_vtable
  type mg_iface_vtable (line 4464) | struct mg_iface_vtable
  type socksdata (line 4478) | struct socksdata {
  function socks_if_disband (line 4484) | static void socks_if_disband(struct socksdata *d) {
  function socks_if_relay (line 4498) | static void socks_if_relay(struct mg_connection *s) {
  function socks_if_handler (line 4508) | static void socks_if_handler(struct mg_connection *c, int ev, void *ev_d...
  function mg_socks_if_connect_tcp (line 4565) | static void mg_socks_if_connect_tcp(struct mg_connection *c,
  function mg_socks_if_connect_udp (line 4575) | static void mg_socks_if_connect_udp(struct mg_connection *c) {
  function mg_socks_if_listen_tcp (line 4579) | static int mg_socks_if_listen_tcp(struct mg_connection *c,
  function mg_socks_if_listen_udp (line 4586) | static int mg_socks_if_listen_udp(struct mg_connection *c,
  function mg_socks_if_tcp_send (line 4593) | static int mg_socks_if_tcp_send(struct mg_connection *c, const void *buf,
  function mg_socks_if_udp_send (line 4603) | static int mg_socks_if_udp_send(struct mg_connection *c, const void *buf,
  function mg_socks_if_tcp_recv (line 4611) | int mg_socks_if_tcp_recv(struct mg_connection *c, void *buf, size_t len) {
  function mg_socks_if_udp_recv (line 4623) | int mg_socks_if_udp_recv(struct mg_connection *c, void *buf, size_t len,
  function mg_socks_if_create_conn (line 4633) | static int mg_socks_if_create_conn(struct mg_connection *c) {
  function mg_socks_if_destroy_conn (line 4638) | static void mg_socks_if_destroy_conn(struct mg_connection *c) {
  function mg_socks_if_sock_set (line 4645) | static void mg_socks_if_sock_set(struct mg_connection *c, sock_t sock) {
  function mg_socks_if_init (line 4650) | static void mg_socks_if_init(struct mg_iface *iface) {
  function mg_socks_if_free (line 4654) | static void mg_socks_if_free(struct mg_iface *iface) {
  function mg_socks_if_add_conn (line 4665) | static void mg_socks_if_add_conn(struct mg_connection *c) {
  function mg_socks_if_remove_conn (line 4669) | static void mg_socks_if_remove_conn(struct mg_connection *c) {
  function time_t (line 4673) | static time_t mg_socks_if_poll(struct mg_iface *iface, int timeout_ms) {
  function mg_socks_if_get_conn_addr (line 4680) | static void mg_socks_if_get_conn_addr(struct mg_connection *c, int remote,
  type mg_iface_vtable (line 4688) | struct mg_iface_vtable
  type mg_iface (line 4700) | struct mg_iface
  type mg_mgr (line 4700) | struct mg_mgr
  type mg_iface (line 4701) | struct mg_iface
  type socksdata (line 4702) | struct socksdata
  type socksdata (line 4703) | struct socksdata
  type mg_ssl_if_ctx (line 4727) | struct mg_ssl_if_ctx {
  function mg_ssl_if_init (line 4734) | void mg_ssl_if_init() {
  function mg_ssl_if_conn_accept (line 4738) | enum mg_ssl_if_result mg_ssl_if_conn_accept(struct mg_connection *nc,
  type mg_ssl_if_result (line 4752) | enum mg_ssl_if_result
  type mg_ssl_if_result (line 4754) | enum mg_ssl_if_result
  type mg_ssl_if_result (line 4755) | enum mg_ssl_if_result
  type mg_ssl_if_result (line 4756) | enum mg_ssl_if_result
  type mg_ssl_if_ctx (line 4756) | struct mg_ssl_if_ctx
  function mg_ssl_if_conn_init (line 4760) | enum mg_ssl_if_result mg_ssl_if_conn_init(
  function mg_ssl_if_ssl_err (line 4841) | static enum mg_ssl_if_result mg_ssl_if_ssl_err(struct mg_connection *nc,
  function mg_ssl_if_handshake (line 4852) | enum mg_ssl_if_result mg_ssl_if_handshake(struct mg_connection *nc) {
  function mg_ssl_if_read (line 4865) | int mg_ssl_if_read(struct mg_connection *nc, void *buf, size_t buf_size) {
  function mg_ssl_if_write (line 4874) | int mg_ssl_if_write(struct mg_connection *nc, const void *data, size_t l...
  function mg_ssl_if_conn_close_notify (line 4882) | void mg_ssl_if_conn_close_notify(struct mg_connection *nc) {
  function mg_ssl_if_conn_free (line 4888) | void mg_ssl_if_conn_free(struct mg_connection *nc) {
  function mg_use_ca_cert (line 4959) | static enum mg_ssl_if_result mg_use_ca_cert(SSL_CTX *ctx, const char *ce...
  function mg_use_cert (line 4968) | static enum mg_ssl_if_result mg_use_cert(SSL_CTX *ctx, const char *cert,
  function mg_set_cipher_list (line 5017) | static enum mg_ssl_if_result mg_set_cipher_list(SSL_CTX *ctx, const char...
  function mg_ssl_if_ossl_psk_cb (line 5024) | static unsigned int mg_ssl_if_ossl_psk_cb(SSL *ssl, const char *hint,
  function mg_ssl_if_ossl_set_psk (line 5047) | static enum mg_ssl_if_result mg_ssl_if_ossl_set_psk(struct mg_ssl_if_ctx...
  function mg_ssl_if_ossl_set_psk (line 5083) | static enum mg_ssl_if_result mg_ssl_if_ossl_set_psk(struct mg_ssl_if_ctx...
  type mg_connection (line 5093) | struct mg_connection
  type mg_ssl_if_conn_params (line 5096) | struct mg_ssl_if_conn_params
  function mg_ssl_mbed_log (line 5126) | static void mg_ssl_mbed_log(void *ctx, int level, const char *file, int ...
  type mg_ssl_if_ctx (line 5151) | struct mg_ssl_if_ctx {
  function mg_ssl_if_init (line 5164) | void mg_ssl_if_init() {
  function mg_ssl_if_conn_accept (line 5168) | enum mg_ssl_if_result mg_ssl_if_conn_accept(struct mg_connection *nc,
  type mg_ssl_if_result (line 5182) | enum mg_ssl_if_result
  type mg_ssl_if_ctx (line 5182) | struct mg_ssl_if_ctx
  type mg_ssl_if_result (line 5185) | enum mg_ssl_if_result
  type mg_ssl_if_ctx (line 5185) | struct mg_ssl_if_ctx
  type mg_ssl_if_result (line 5187) | enum mg_ssl_if_result
  type mg_ssl_if_ctx (line 5187) | struct mg_ssl_if_ctx
  type mg_ssl_if_result (line 5190) | enum mg_ssl_if_result
  type mg_ssl_if_ctx (line 5190) | struct mg_ssl_if_ctx
  function mg_ssl_if_conn_init (line 5195) | enum mg_ssl_if_result mg_ssl_if_conn_init(
  function mg_ssl_if_mbed_send (line 5286) | static int mg_ssl_if_mbed_send(void *ctx, const unsigned char *buf,
  function mg_ssl_if_mbed_recv (line 5295) | static int mg_ssl_if_mbed_recv(void *ctx, unsigned char *buf, size_t len) {
  function mg_ssl_if_mbed_err (line 5303) | static enum mg_ssl_if_result mg_ssl_if_mbed_err(struct mg_connection *nc,
  function mg_ssl_if_mbed_free_certs_and_keys (line 5323) | static void mg_ssl_if_mbed_free_certs_and_keys(struct mg_ssl_if_ctx *ctx) {
  function mg_ssl_if_handshake (line 5346) | enum mg_ssl_if_result mg_ssl_if_handshake(struct mg_connection *nc) {
  function mg_ssl_if_read (line 5378) | int mg_ssl_if_read(struct mg_connection *nc, void *buf, size_t len) {
  function mg_ssl_if_write (line 5387) | int mg_ssl_if_write(struct mg_connection *nc, const void *buf, size_t le...
  function mg_ssl_if_conn_close_notify (line 5410) | void mg_ssl_if_conn_close_notify(struct mg_connection *nc) {
  function mg_ssl_if_conn_free (line 5416) | void mg_ssl_if_conn_free(struct mg_connection *nc) {
  function mg_use_ca_cert (line 5434) | static enum mg_ssl_if_result mg_use_ca_cert(struct mg_ssl_if_ctx *ctx,
  function mg_use_cert (line 5455) | static enum mg_ssl_if_result mg_use_cert(struct mg_ssl_if_ctx *ctx,
  function mg_set_cipher_list (line 5527) | static enum mg_ssl_if_result mg_set_cipher_list(struct mg_ssl_if_ctx *ctx,
  function mg_ssl_if_mbed_set_psk (line 5558) | static enum mg_ssl_if_result mg_ssl_if_mbed_set_psk(struct mg_ssl_if_ctx...
  type mg_connection (line 5596) | struct mg_connection
  type mg_ssl_if_conn_params (line 5599) | struct mg_ssl_if_conn_params
  function mg_ssl_if_mbed_random (line 5611) | int mg_ssl_if_mbed_random(void *ctx, unsigned char *buf, size_t len) {
  function parse_uri_component (line 5636) | static void parse_uri_component(const char **p, const char *end,
  function mg_parse_uri (line 5650) | int mg_parse_uri(const struct mg_str uri, struct mg_str *scheme,
  function mg_normalize_uri_path (line 5780) | int mg_normalize_uri_path(const struct mg_str *in, struct mg_str *out) {
  function mg_assemble_uri (line 5814) | int mg_assemble_uri(const struct mg_str *scheme, const struct mg_str *us...
  type altbuf (line 5903) | struct altbuf {
  function MG_INTERNAL (line 5913) | MG_INTERNAL void altbuf_init(struct altbuf *ab, char *buf, size_t buf_si...
  function MG_INTERNAL (line 5923) | MG_INTERNAL void altbuf_append(struct altbuf *ab, char c) {
  function MG_INTERNAL (line 5947) | MG_INTERNAL void altbuf_reset(struct altbuf *ab) {
  function MG_INTERNAL (line 5956) | MG_INTERNAL int altbuf_reallocated(struct altbuf *ab) {
  function MG_INTERNAL (line 5964) | MG_INTERNAL char *altbuf_get_buf(struct altbuf *ab, int trim) {
  type mg_http_proto_data_type (line 5979) | enum mg_http_proto_data_type { DATA_NONE, DATA_FILE, DATA_PUT }
  type mg_http_proto_data_file (line 5981) | struct mg_http_proto_data_file {
  type mg_http_proto_data_cgi (line 5990) | struct mg_http_proto_data_cgi {
  type mg_http_proto_data_chuncked (line 5995) | struct mg_http_proto_data_chuncked {
  type mg_http_endpoint (line 5999) | struct mg_http_endpoint {
  type mg_http_multipart_stream_state (line 6011) | enum mg_http_multipart_stream_state {
  type mg_http_multipart_stream (line 6020) | struct mg_http_multipart_stream {
  type mg_reverse_proxy_data (line 6031) | struct mg_reverse_proxy_data {
  type mg_ws_proto_data (line 6035) | struct mg_ws_proto_data {
  type mg_http_proto_data (line 6045) | struct mg_http_proto_data {
  type mg_connection (line 6067) | struct mg_connection
  type mg_mgr (line 6068) | struct mg_mgr
  type mg_connect_opts (line 6069) | struct mg_connect_opts
  type mg_str (line 6071) | struct mg_str
  type mg_str (line 6071) | struct mg_str
  type mg_str (line 6071) | struct mg_str
  function mg_http_proto_data (line 6073) | mg_http_proto_data *mg_http_create_proto_data(
  type mg_http_proto_data (line 6086) | struct mg_http_proto_data
  type mg_connection (line 6087) | struct mg_connection
  type mg_http_proto_data (line 6088) | struct mg_http_proto_data
  function mg_http_free_proto_data_mp_stream (line 6092) | static void mg_http_free_proto_data_mp_stream(
  function mg_http_free_proto_data_file (line 6102) | static void mg_http_free_proto_data_file(struct mg_http_proto_data_file ...
  function mg_http_free_proto_data_endpoints (line 6112) | static void mg_http_free_proto_data_endpoints(struct mg_http_endpoint **...
  function mg_http_free_reverse_proxy_data (line 6127) | static void mg_http_free_reverse_proxy_data(struct mg_reverse_proxy_data...
  function mg_http_proto_data_destructor (line 6143) | static void mg_http_proto_data_destructor(void *proto_data) {
  function mg_get_mime_type (line 6218) | static struct mg_str mg_get_mime_type(const char *path, const char *dflt,
  function mg_http_get_request_len (line 6256) | static int mg_http_get_request_len(const char *s, int buf_len) {
  type http_message (line 6275) | struct http_message
  type mg_str (line 6278) | struct mg_str
  function mg_parse_http (line 6313) | int mg_parse_http(const char *s, int n, struct http_message *hm, int is_...
  type mg_str (line 6377) | struct mg_str
  type http_message (line 6377) | struct http_message
  type mg_str (line 6381) | struct mg_str
  function mg_http_transfer_file_data (line 6390) | static void mg_http_transfer_file_data(struct mg_connection *nc) {
  function mg_http_parse_chunk (line 6452) | static size_t mg_http_parse_chunk(char *buf, size_t len, char **chunk_data,
  function MG_INTERNAL (line 6489) | MG_INTERNAL size_t mg_handle_chunked(struct mg_connection *nc,
  type mg_http_endpoint (line 6546) | struct mg_http_endpoint
  type mg_connection (line 6546) | struct mg_connection
  type mg_str (line 6547) | struct mg_str
  type mg_http_proto_data (line 6548) | struct mg_http_proto_data
  type mg_http_endpoint (line 6549) | struct mg_http_endpoint
  type mg_http_endpoint (line 6551) | struct mg_http_endpoint
  type mg_connection (line 6576) | struct mg_connection
  type mg_connection (line 6578) | struct mg_connection
  type http_message (line 6579) | struct http_message
  type mg_connection (line 6583) | struct mg_connection
  type http_message (line 6584) | struct http_message
  function deliver_chunk (line 6586) | static void deliver_chunk(struct mg_connection *c, struct http_message *hm,
  type mg_connection (line 6602) | struct mg_connection
  type http_message (line 6604) | struct http_message
  function mg_http_handler (line 6606) | void mg_http_handler(struct mg_connection *nc, int ev,
  type mg_connection (line 6612) | struct mg_connection
  type http_message (line 6614) | struct http_message
  function mg_http_handler (line 6616) | void mg_http_handler(struct mg_connection *nc, int ev,
  function mg_get_line_len (line 6823) | static size_t mg_get_line_len(const char *buf, size_t buf_len) {
  function mg_http_multipart_begin (line 6830) | static void mg_http_multipart_begin(struct mg_connection *nc,
  function mg_http_multipart_call_handler (line 6894) | static size_t mg_http_multipart_call_handler(struct mg_connection *c, in...
  function mg_http_multipart_finalize (line 6913) | static int mg_http_multipart_finalize(struct mg_connection *c) {
  function mg_http_multipart_wait_for_boundary (line 6928) | static int mg_http_multipart_wait_for_boundary(struct mg_connection *c) {
  type mg_str (line 6962) | struct mg_str
  type altbuf (line 6964) | struct altbuf
  function mg_http_multipart_process_boundary (line 6966) | static int mg_http_multipart_process_boundary(struct mg_connection *c) {
  function mg_http_multipart_continue_wait_for_chunk (line 7037) | static int mg_http_multipart_continue_wait_for_chunk(struct mg_connectio...
  function mg_http_multipart_continue (line 7072) | static void mg_http_multipart_continue(struct mg_connection *c) {
  type file_upload_state (line 7111) | struct file_upload_state {
  function mg_set_protocol_http_websocket (line 7119) | void mg_set_protocol_http_websocket(struct mg_connection *nc) {
  function mg_send_response_line_s (line 7254) | void mg_send_response_line_s(struct mg_connection *nc, int status_code,
  function mg_send_response_line (line 7266) | void mg_send_response_line(struct mg_connection *nc, int status_code,
  function mg_http_send_redirect (line 7271) | void mg_http_send_redirect(struct mg_connection *nc, int status_code,
  function mg_send_head (line 7293) | void mg_send_head(struct mg_connection *c, int status_code,
  function mg_http_send_error (line 7304) | void mg_http_send_error(struct mg_connection *nc, int code,
  function mg_http_construct_etag (line 7315) | static void mg_http_construct_etag(char *buf, size_t buf_len,
  function mg_gmt_time_string (line 7322) | static void mg_gmt_time_string(char *buf, size_t buf_len, time_t *t) {
  function mg_http_parse_range_header (line 7331) | static int mg_http_parse_range_header(const struct mg_str *header, int64...
  function mg_http_serve_file (line 7347) | void mg_http_serve_file(struct mg_connection *nc, struct http_message *hm,
  function mg_http_serve_file2 (line 7444) | static void mg_http_serve_file2(struct mg_connection *nc, const char *path,
  function mg_url_decode (line 7459) | int mg_url_decode(const char *src, int src_len, char *dst, int dst_len,
  function mg_get_http_var (line 7487) | int mg_get_http_var(const struct mg_str *buf, const char *name, char *dst,
  function mg_send_http_chunk (line 7533) | void mg_send_http_chunk(struct mg_connection *nc, const char *buf, size_...
  function mg_printf_http_chunk (line 7543) | void mg_printf_http_chunk(struct mg_connection *nc, const char *fmt, ...) {
  function mg_printf_html_escape (line 7563) | void mg_printf_html_escape(struct mg_connection *nc, const char *fmt, .....
  function mg_http_parse_header_internal (line 7590) | static void mg_http_parse_header_internal(struct mg_str *hdr,
  function mg_http_parse_header2 (line 7625) | int mg_http_parse_header2(struct mg_str *hdr, const char *var_name, char...
  function mg_http_parse_header (line 7642) | int mg_http_parse_header(struct mg_str *hdr, const char *var_name, char ...
  function mg_get_http_basic_auth (line 7657) | int mg_get_http_basic_auth(struct http_message *hm, char *user, size_t u...
  function mg_parse_http_basic_auth (line 7664) | int mg_parse_http_basic_auth(struct mg_str *hdr, char *user, size_t user...
  function mg_is_file_hidden (line 7687) | static int mg_is_file_hidden(const char *path,
  function mg_hash_md5_v (line 7707) | void mg_hash_md5_v(size_t num_msgs, const uint8_t *msgs[],
  function cs_md5 (line 7722) | void cs_md5(char buf[33], ...) {
  function mg_mkmd5resp (line 7741) | static void mg_mkmd5resp(const char *method, size_t method_len, const ch...
  function mg_http_create_digest_auth_header (line 7755) | int mg_http_create_digest_auth_header(char *buf, size_t buf_len,
  function mg_check_nonce (line 7783) | static int mg_check_nonce(const char *nonce) {
  function mg_http_check_digest_auth (line 7789) | int mg_http_check_digest_auth(struct http_message *hm, const char *auth_...
  function mg_check_digest_auth (line 7839) | int mg_check_digest_auth(struct mg_str method, struct mg_str uri,
  function mg_http_is_authorized (line 7870) | int mg_http_is_authorized(struct http_message *hm, struct mg_str path,
  function mg_http_is_authorized (line 7906) | int mg_http_is_authorized(struct http_message *hm, const struct mg_str p...
  function mg_escape (line 7919) | static void mg_escape(const char *src, char *dst, size_t dst_len) {
  function mg_print_dir_entry (line 7932) | static void mg_print_dir_entry(struct mg_connection *nc, const char *fil...
  function mg_scan_directory (line 7969) | static void mg_scan_directory(struct mg_connection *nc, const char *dir,
  function mg_send_directory_listing (line 7996) | static void mg_send_directory_listing(struct mg_connection *nc, const ch...
  function MG_INTERNAL (line 8061) | MG_INTERNAL void mg_find_index_file(const char *path, const char *list,
  function mg_http_send_port_based_redirect (line 8093) | static int mg_http_send_port_based_redirect(
  function mg_reverse_proxy_handler (line 8116) | static void mg_reverse_proxy_handler(struct mg_connection *nc, int ev,
  function mg_http_reverse_proxy (line 8149) | void mg_http_reverse_proxy(struct mg_connection *nc,
  function mg_http_handle_forwarding (line 8216) | static int mg_http_handle_forwarding(struct mg_connection *nc,
  function MG_INTERNAL (line 8236) | MG_INTERNAL int mg_uri_to_local_path(struct http_message *hm,
  function mg_get_month_index (line 8394) | static int mg_get_month_index(const char *s) {
  function mg_num_leap_years (line 8405) | static int mg_num_leap_years(int year) {
  function MG_INTERNAL (line 8410) | MG_INTERNAL time_t mg_parse_date_string(const char *datetime) {
  function MG_INTERNAL (line 8435) | MG_INTERNAL int mg_is_not_modified(struct http_message *hm, cs_stat_t *s...
  function mg_http_send_digest_auth_request (line 8448) | void mg_http_send_digest_auth_request(struct mg_connection *c,
  function mg_http_send_options (line 8458) | static void mg_http_send_options(struct mg_connection *nc,
  function mg_is_creation_request (line 8470) | static int mg_is_creation_request(const struct http_message *hm) {
  function MG_INTERNAL (line 8474) | MG_INTERNAL void mg_send_http_file(struct mg_connection *nc, char *path,
  function mg_serve_http (line 8588) | void mg_serve_http(struct mg_connection *nc, struct http_message *hm,
  function mg_file_upload_handler (line 8654) | void mg_file_upload_handler(struct mg_connection *nc, int ev, void *ev_d...
  type mg_connection (line 8784) | struct mg_connection
  type mg_mgr (line 8785) | struct mg_mgr
  type mg_connect_opts (line 8786) | struct mg_connect_opts
  type mg_str (line 8788) | struct mg_str
  type mg_str (line 8788) | struct mg_str
  type mg_str (line 8788) | struct mg_str
  type mg_connection (line 8789) | struct mg_connection
  type mg_str (line 8792) | struct mg_str
  type mg_connection (line 8848) | struct mg_connection
  type mg_mgr (line 8849) | struct mg_mgr
  type mg_connect_opts (line 8850) | struct mg_connect_opts
  type mg_str (line 8852) | struct mg_str
  type mg_str (line 8853) | struct mg_str
  type mbuf (line 8854) | struct mbuf
  type mg_connection (line 8855) | struct mg_connection
  type mg_connection (line 8883) | struct mg_connection
  type mg_mgr (line 8884) | struct mg_mgr
  type mg_connect_opts (line 8886) | struct mg_connect_opts
  function mg_parse_multipart (line 8892) | size_t mg_parse_multipart(const char *buf, size_t buf_len, char *var_name,
  function mg_register_http_endpoint_opt (line 8948) | void mg_register_http_endpoint_opt(struct mg_connection *nc,
  function mg_http_call_endpoint_handler (line 8974) | static void mg_http_call_endpoint_handler(struct mg_connection *nc, int ev,
  function mg_register_http_endpoint (line 9004) | void mg_register_http_endpoint(struct mg_connection *nc, const char *uri...
  type mg_cgi_env_block (line 9050) | struct mg_cgi_env_block {
  type mg_threadparam (line 9059) | struct mg_threadparam {
  function mg_wait_until_ready (line 9064) | static int mg_wait_until_ready(sock_t sock, int for_read) {
  type mg_threadparam (line 9072) | struct mg_threadparam
  type mg_threadparam (line 9072) | struct mg_threadparam
  type mg_threadparam (line 9091) | struct mg_threadparam
  type mg_threadparam (line 9091) | struct mg_threadparam
  function mg_spawn_stdio_thread (line 9111) | static void mg_spawn_stdio_thread(sock_t sock, HANDLE hPipe,
  function mg_abs_path (line 9121) | static void mg_abs_path(const char *utf8_path, char *abs_path, size_t le...
  function mg_start_process (line 9128) | static int mg_start_process(const char *interp, const char *cmd,
  function mg_start_process (line 9203) | static int mg_start_process(const char *interp, const char *cmd,
  type mg_cgi_env_block (line 9251) | struct mg_cgi_env_block
  function mg_addenv2 (line 9277) | static void mg_addenv2(struct mg_cgi_env_block *blk, const char *name) {
  function mg_prepare_cgi_environment (line 9282) | static void mg_prepare_cgi_environment(struct mg_connection *nc,
  function mg_cgi_ev_handler (line 9397) | static void mg_cgi_ev_handler(struct mg_connection *cgi_nc, int ev,
  function MG_INTERNAL (line 9460) | MG_INTERNAL void mg_handle_cgi(struct mg_connection *nc, const char *prog,
  function MG_INTERNAL (line 9522) | MG_INTERNAL void mg_http_free_proto_data_cgi(struct mg_http_proto_data_c...
  type mg_connection (line 9542) | struct mg_connection
  type http_message (line 9542) | struct http_message
  type mg_serve_http_opts (line 9544) | struct mg_serve_http_opts
  function mg_send_file_data (line 9546) | static void mg_send_file_data(struct mg_connection *nc, FILE *fp) {
  function mg_do_ssi_include (line 9554) | static void mg_do_ssi_include(struct mg_connection *nc, struct http_mess...
  function do_ssi_exec (line 9602) | static void do_ssi_exec(struct mg_connection *nc, char *tag) {
  function mg_send_ssi_file (line 9621) | static void mg_send_ssi_file(struct mg_connection *nc, struct http_messa...
  function MG_INTERNAL (line 9702) | MG_INTERNAL void mg_handle_ssi_request(struct mg_connection *nc,
  function MG_INTERNAL (line 9738) | MG_INTERNAL int mg_is_dav_request(const struct mg_str *s) {
  function mg_mkdir (line 9762) | static int mg_mkdir(const char *path, uint32_t mode) {
  function mg_print_props (line 9771) | static void mg_print_props(struct mg_connection *nc, const char *name,
  function MG_INTERNAL (line 9795) | MG_INTERNAL void mg_handle_propfind(struct mg_connection *nc, const char...
  function MG_INTERNAL (line 9836) | MG_INTERNAL void mg_handle_lock(struct mg_connection *nc, const char *pa...
  function MG_INTERNAL (line 9858) | MG_INTERNAL void mg_handle_mkcol(struct mg_connection *nc, const char *p...
  function mg_remove_directory (line 9877) | static int mg_remove_directory(const struct mg_serve_http_opts *opts,
  function MG_INTERNAL (line 9904) | MG_INTERNAL void mg_handle_move(struct mg_connection *c,
  function MG_INTERNAL (line 9928) | MG_INTERNAL void mg_handle_delete(struct mg_connection *nc,
  function mg_create_itermediate_directories (line 9945) | static int mg_create_itermediate_directories(const char *path) {
  function MG_INTERNAL (line 9964) | MG_INTERNAL void mg_handle_put(struct mg_connection *nc, const char *path,
  function mg_is_ws_fragment (line 10019) | static int mg_is_ws_fragment(unsigned char flags) {
  function mg_is_ws_first_fragment (line 10024) | static int mg_is_ws_first_fragment(unsigned char flags) {
  function mg_is_ws_control_frame (line 10029) | static int mg_is_ws_control_frame(unsigned char flags) {
  function mg_handle_incoming_websocket_frame (line 10035) | static void mg_handle_incoming_websocket_frame(struct mg_connection *nc,
  type mg_ws_proto_data (line 10044) | struct mg_ws_proto_data
  type mg_connection (line 10044) | struct mg_connection
  type mg_http_proto_data (line 10045) | struct mg_http_proto_data
  function mg_ws_close (line 10053) | static void mg_ws_close(struct mg_connection *nc, const void *data,
  function mg_deliver_websocket_data (line 10062) | static int mg_deliver_websocket_data(struct mg_connection *nc) {
  type ws_mask_ctx (line 10215) | struct ws_mask_ctx {
  function mg_ws_random_mask (line 10220) | static uint32_t mg_ws_random_mask(void) {
  function mg_send_ws_header (line 10248) | static void mg_send_ws_header(struct mg_connection *nc, int op, size_t len,
  function mg_ws_mask_frame (line 10286) | static void mg_ws_mask_frame(struct mbuf *mbuf, struct ws_mask_ctx *ctx) {
  function mg_send_websocket_frame (line 10294) | void mg_send_websocket_frame(struct mg_connection *nc, int op, const voi...
  function mg_send_websocket_framev (line 10308) | void mg_send_websocket_framev(struct mg_connection *nc, int op,
  function mg_printf_websocket_frame (line 10330) | void mg_printf_websocket_frame(struct mg_connection *nc, int op,
  function MG_INTERNAL (line 10347) | MG_INTERNAL void mg_ws_handler(struct mg_connection *nc, int ev,
  function mg_hash_sha1_v (line 10375) | void mg_hash_sha1_v(size_t num_msgs, const uint8_t *msgs[],
  function MG_INTERNAL (line 10390) | MG_INTERNAL void mg_ws_handshake(struct mg_connection *nc,
  function mg_send_websocket_handshake2 (line 10416) | void mg_send_websocket_handshake2(struct mg_connection *nc, const char *...
  function mg_send_websocket_handshake3 (line 10423) | void mg_send_websocket_handshake3(struct mg_connection *nc, const char *...
  function mg_send_websocket_handshake3v (line 10432) | void mg_send_websocket_handshake3v(struct mg_connection *nc,
  function mg_send_websocket_handshake (line 10488) | void mg_send_websocket_handshake(struct mg_connection *nc, const char *p...
  type mg_connection (line 10496) | struct mg_connection
  type mg_mgr (line 10497) | struct mg_mgr
  type mg_connect_opts (line 10498) | struct mg_connect_opts
  type mg_str (line 10500) | struct mg_str
  type mg_str (line 10501) | struct mg_str
  type mg_connection (line 10502) | struct mg_connection
  type mg_connection (line 10513) | struct mg_connection
  type mg_mgr (line 10514) | struct mg_mgr
  type mg_connect_opts (line 10516) | struct mg_connect_opts
  type mg_str (line 10540) | struct mg_str
  function mg_stat (line 10549) | int mg_stat(const char *path, cs_stat_t *st) {
  function FILE (line 10560) | FILE *mg_fopen(const char *path, const char *mode) {
  function mg_open (line 10571) | int mg_open(const char *path, int flag, int mode) { /* LCOV_EXCL_LINE */
  function mg_fread (line 10581) | size_t mg_fread(void *ptr, size_t size, size_t count, FILE *f) {
  function mg_fwrite (line 10585) | size_t mg_fwrite(const void *ptr, size_t size, size_t count, FILE *f) {
  function mg_base64_encode (line 10590) | void mg_base64_encode(const unsigned char *src, int src_len, char *dst) {
  function mg_base64_decode (line 10594) | int mg_base64_decode(const unsigned char *s, int len, char *dst) {
  function mg_set_close_on_exec (line 10624) | void mg_set_close_on_exec(sock_t sock) {
  function mg_sock_addr_to_str (line 10634) | int mg_sock_addr_to_str(const union socket_address *sa, char *buf, size_...
  function mg_conn_addr_to_str (line 10694) | int mg_conn_addr_to_str(struct mg_connection *nc, char *buf, size_t len,
  function mg_hexdump_n (line 10703) | static int mg_hexdump_n(const void *buf, int len, char *dst, int dst_len,
  function mg_hexdump (line 10729) | int mg_hexdump(const void *buf, int len, char *dst, int dst_len) {
  function mg_hexdumpf (line 10733) | void mg_hexdumpf(FILE *fp, const void *buf, int len) {
  function mg_hexdump_connection (line 10745) | void mg_hexdump_connection(struct mg_connection *nc, const char *path,
  function mg_is_big_endian (line 10794) | int mg_is_big_endian(void) {
  function mg_get_errno (line 10800) | int mg_get_errno(void) {
  function mg_mbuf_append_base64_putc (line 10809) | void mg_mbuf_append_base64_putc(char ch, void *user_data) {
  function mg_mbuf_append_base64 (line 10814) | void mg_mbuf_append_base64(struct mbuf *mbuf, const void *data, size_t l...
  function mg_basic_auth_header (line 10821) | void mg_basic_auth_header(const struct mg_str user, const struct mg_str ...
  function mg_url_encode_opt (line 10840) | struct mg_str mg_url_encode_opt(const struct mg_str src,
  function mg_url_encode (line 10866) | struct mg_str mg_url_encode(const struct mg_str src) {
  function getu16 (line 10884) | static uint16_t getu16(const char *p) {
  type mg_str (line 10889) | struct mg_str
  function MG_INTERNAL (line 10895) | MG_INTERNAL int parse_mqtt(struct mbuf *io, struct mg_mqtt_message *mm) {
  function mqtt_handler (line 11008) | static void mqtt_handler(struct mg_connection *nc, int ev,
  function mg_mqtt_proto_data_destructor (line 11066) | static void mg_mqtt_proto_data_destructor(void *proto_data) {
  function mg_mqtt_next_topic_component (line 11070) | static struct mg_str mg_mqtt_next_topic_component(struct mg_str *topic) {
  function mg_mqtt_match_topic_expression (line 11084) | int mg_mqtt_match_topic_expression(struct mg_str exp, struct mg_str topi...
  function mg_mqtt_vmatch_topic_expression (line 11110) | int mg_mqtt_vmatch_topic_expression(const char *exp, struct mg_str topic) {
  function mg_set_protocol_mqtt (line 11114) | void mg_set_protocol_mqtt(struct mg_connection *nc) {
  function mg_send_mqtt_header (line 11120) | static void mg_send_mqtt_header(struct mg_connection *nc, uint8_t cmd,
  function mg_send_mqtt_handshake (line 11140) | void mg_send_mqtt_handshake(struct mg_connection *nc, const char *client...
  function mg_send_mqtt_handshake_opt (line 11145) | void mg_send_mqtt_handshake_opt(struct mg_connection *nc, const char *cl...
  function mg_mqtt_publish (line 11222) | void mg_mqtt_publish(struct mg_connection *nc, const char *topic,
  function mg_mqtt_subscribe (line 11247) | void mg_mqtt_subscribe(struct mg_connection *nc,
  function mg_mqtt_next_subscribe_topic (line 11273) | int mg_mqtt_next_subscribe_topic(struct mg_mqtt_message *msg,
  function mg_mqtt_unsubscribe (line 11288) | void mg_mqtt_unsubscribe(struct mg_connection *nc, char **topics,
  function mg_mqtt_connack (line 11312) | void mg_mqtt_connack(struct mg_connection *nc, uint8_t return_code) {
  function mg_send_mqtt_short_command (line 11324) | static void mg_send_mqtt_short_command(struct mg_connection *nc, uint8_t...
  function mg_mqtt_puback (line 11335) | void mg_mqtt_puback(struct mg_connection *nc, uint16_t message_id) {
  function mg_mqtt_pubrec (line 11339) | void mg_mqtt_pubrec(struct mg_connection *nc, uint16_t message_id) {
  function mg_mqtt_pubrel (line 11343) | void mg_mqtt_pubrel(struct mg_connection *nc, uint16_t message_id) {
  function mg_mqtt_pubcomp (line 11347) | void mg_mqtt_pubcomp(struct mg_connection *nc, uint16_t message_id) {
  function mg_mqtt_suback (line 11351) | void mg_mqtt_suback(struct mg_connection *nc, uint8_t *qoss, size_t qoss...
  function mg_mqtt_unsuback (line 11366) | void mg_mqtt_unsuback(struct mg_connection *nc, uint16_t message_id) {
  function mg_mqtt_ping (line 11370) | void mg_mqtt_ping(struct mg_connection *nc) {
  function mg_mqtt_pong (line 11374) | void mg_mqtt_pong(struct mg_connection *nc) {
  function mg_mqtt_disconnect (line 11378) | void mg_mqtt_disconnect(struct mg_connection *nc) {
  function mg_mqtt_session_init (line 11396) | static void mg_mqtt_session_init(struct mg_mqtt_broker *brk,
  function mg_mqtt_add_session (line 11405) | static void mg_mqtt_add_session(struct mg_mqtt_session *s) {
  function mg_mqtt_remove_session (line 11409) | static void mg_mqtt_remove_session(struct mg_mqtt_session *s) {
  function mg_mqtt_destroy_session (line 11413) | static void mg_mqtt_destroy_session(struct mg_mqtt_session *s) {
  function mg_mqtt_close_session (line 11422) | static void mg_mqtt_close_session(struct mg_mqtt_session *s) {
  function mg_mqtt_broker_init (line 11427) | void mg_mqtt_broker_init(struct mg_mqtt_broker *brk, void *user_data) {
  function mg_mqtt_broker_handle_connect (line 11432) | static void mg_mqtt_broker_handle_connect(struct mg_mqtt_broker *brk,
  function mg_mqtt_broker_handle_subscribe (line 11452) | static void mg_mqtt_broker_handle_subscribe(struct mg_connection *nc,
  function mg_mqtt_broker_handle_publish (line 11502) | static void mg_mqtt_broker_handle_publish(struct mg_mqtt_broker *brk,
  function mg_mqtt_broker (line 11527) | void mg_mqtt_broker(struct mg_connection *nc, int ev, void *data) {
  type mg_mqtt_session (line 11574) | struct mg_mqtt_session
  type mg_mqtt_broker (line 11574) | struct mg_mqtt_broker
  type mg_mqtt_session (line 11575) | struct mg_mqtt_session
  type mg_dns_header (line 11595) | struct mg_dns_header {
  type mg_dns_resource_record (line 11604) | struct mg_dns_resource_record
  type mg_dns_message (line 11605) | struct mg_dns_message
  type mg_dns_resource_record (line 11606) | struct mg_dns_resource_record
  type mg_dns_resource_record (line 11607) | struct mg_dns_resource_record
  function mg_dns_parse_record_data (line 11618) | int mg_dns_parse_record_data(struct mg_dns_message *msg,
  function mg_dns_insert_header (line 11647) | int mg_dns_insert_header(struct mbuf *io, size_t pos,
  function mg_dns_copy_questions (line 11660) | int mg_dns_copy_questions(struct mbuf *io, struct mg_dns_message *msg) {
  function mg_dns_encode_name (line 11670) | int mg_dns_encode_name(struct mbuf *io, const char *name, size_t len) {
  function mg_dns_encode_record (line 11699) | int mg_dns_encode_record(struct mbuf *io, struct mg_dns_resource_record ...
  function mg_send_dns_query (line 11744) | void mg_send_dns_query(struct mg_connection *nc, const char *name,
  type mg_dns_resource_record (line 11784) | struct mg_dns_resource_record
  function mg_parse_dns (line 11831) | int mg_parse_dns(const char *buf, int len, struct mg_dns_message *msg) {
  function mg_dns_uncompress_name (line 11867) | size_t mg_dns_uncompress_name(struct mg_dns_message *msg, struct mg_str ...
  function dns_handler (line 11923) | static void dns_handler(struct mg_connection *nc, int ev,
  function mg_set_protocol_dns (line 11955) | void mg_set_protocol_dns(struct mg_connection *nc) {
  function mg_dns_create_reply (line 11973) | struct mg_dns_reply mg_dns_create_reply(struct mbuf *io,
  function mg_dns_send_reply (line 11988) | void mg_dns_send_reply(struct mg_connection *nc, struct mg_dns_reply *r) {
  function mg_dns_reply_record (line 12002) | int mg_dns_reply_record(struct mg_dns_reply *reply,
  type mg_resolve_async_request (line 12051) | struct mg_resolve_async_request {
  function mg_get_ip_address_of_nameserver (line 12070) | static int mg_get_ip_address_of_nameserver(char *name, size_t name_len) {
  function mg_resolve_from_hosts_file (line 12143) | int mg_resolve_from_hosts_file(const char *name, union socket_address *u...
  function mg_resolve_async_eh (line 12182) | static void mg_resolve_async_eh(struct mg_connection *nc, int ev,
  function mg_resolve_async (line 12258) | int mg_resolve_async(struct mg_mgr *mgr, const char *name, int query,
  function mg_resolve_async_opt (line 12265) | int mg_resolve_async_opt(struct mg_mgr *mgr, const char *name, int query,
  function mg_set_nameserver (line 12320) | void mg_set_nameserver(struct mg_mgr *mgr, const char *nameserver) {
  function mg_coap_free_options (line 12354) | void mg_coap_free_options(struct mg_coap_message *cm) {
  type mg_coap_option (line 12362) | struct mg_coap_option
  type mg_coap_message (line 12362) | struct mg_coap_message
  type mg_coap_option (line 12365) | struct mg_coap_option
  type mg_coap_option (line 12366) | struct mg_coap_option
  type mg_coap_option (line 12385) | struct mg_coap_option
  type mg_coap_option (line 12386) | struct mg_coap_option
  type mbuf (line 12415) | struct mbuf
  type mg_coap_message (line 12416) | struct mg_coap_message
  type mbuf (line 12479) | struct mbuf
  type mg_coap_message (line 12480) | struct mg_coap_message
  function coap_get_ext_opt (line 12500) | static int coap_get_ext_opt(char *ptr, struct mbuf *io, uint16_t *opt_in...
  type mbuf (line 12546) | struct mbuf
  type mg_coap_message (line 12547) | struct mg_coap_message
  function mg_coap_parse (line 12630) | uint32_t mg_coap_parse(struct mbuf *io, struct mg_coap_message *cm) {
  function coap_get_ext_opt_size (line 12662) | static size_t coap_get_ext_opt_size(uint32_t value) {
  function coap_split_opt (line 12679) | static int coap_split_opt(uint32_t value, uint8_t *base, uint16_t *ext) {
  function coap_calculate_packet_size (line 12731) | static uint32_t coap_calculate_packet_size(struct mg_coap_message *cm,
  function mg_coap_compose (line 12780) | uint32_t mg_coap_compose(struct mg_coap_message *cm, struct mbuf *io) {
  function mg_coap_send_message (line 12851) | uint32_t mg_coap_send_message(struct mg_connection *nc,
  function mg_coap_send_ack (line 12868) | uint32_t mg_coap_send_ack(struct mg_connection *nc, uint16_t msg_id) {
  function coap_handler (line 12877) | static void coap_handler(struct mg_connection *nc, int ev,
  function mg_set_protocol_coap (line 12917) | int mg_set_protocol_coap(struct mg_connection *nc) {
  function mg_get_sec (line 12953) | static uint64_t mg_get_sec(uint64_t val) {
  function mg_get_usec (line 12957) | static uint64_t mg_get_usec(uint64_t val) {
  function mg_ntp_to_tv (line 12964) | static void mg_ntp_to_tv(uint64_t val, struct timeval *tv) {
  function mg_get_ntp_ts (line 12972) | static void mg_get_ntp_ts(const char *ntp, uint64_t *val) {
  function mg_sntp_send_request (line 12982) | void mg_sntp_send_request(struct mg_connection *c) {
  function mg_calculate_delay (line 13021) | static uint64_t mg_calculate_delay(uint64_t t1, uint64_t t2, uint64_t t3) {
  function MG_INTERNAL (line 13032) | MG_INTERNAL int mg_sntp_parse_reply(const char *buf, int len,
  function mg_sntp_handler (line 13078) | static void mg_sntp_handler(struct mg_connection *c, int ev,
  function mg_set_protocol_sntp (line 13100) | int mg_set_protocol_sntp(struct mg_connection *c) {
  type mg_connection (line 13110) | struct mg_connection
  type mg_mgr (line 13110) | struct mg_mgr
  type mg_connection (line 13114) | struct mg_connection
  type sntp_data (line 13151) | struct sntp_data {
  function mg_sntp_util_ev_handler (line 13156) | static void mg_sntp_util_ev_handler(struct mg_connection *c, int ev,
  type mg_connection (line 13195) | struct mg_connection
  type mg_mgr (line 13195) | struct mg_mgr
  type mg_connection (line 13198) | struct mg_connection
  type sntp_data (line 13199) | struct sntp_data
  type sntp_data (line 13199) | struct sntp_data
  function mg_socks5_handshake (line 13242) | static void mg_socks5_handshake(struct mg_connection *c) {
  function disband (line 13260) | static void disband(struct mg_connection *c) {
  function relay_data (line 13270) | static void relay_data(struct mg_connection *c) {
  function serv_ev_handler (line 13280) | static void serv_ev_handler(struct mg_connection *c, int ev, void *ev_da...
  function mg_socks5_connect (line 13291) | static void mg_socks5_connect(struct mg_connection *c, const char *addr) {
  function mg_socks5_handle_request (line 13306) | static void mg_socks5_handle_request(struct mg_connection *c) {
  function socks_handler (line 13364) | static void socks_handler(struct mg_connection *c, int ev, void *ev_data) {
  function mg_set_protocol_socks (line 13378) | void mg_set_protocol_socks(struct mg_connection *c) {
  function asprintf (line 13426) | int asprintf(char **strp, const char *fmt, ...) {
  function time_t (line 13452) | time_t HOSTtime() {
  function fprint_str (line 13461) | void fprint_str(FILE *fp, const char *str) {
  function _exit (line 13468) | void _exit(int status) {
  function _not_implemented (line 13476) | void _not_implemented(const char *what) {
  function _kill (line 13482) | int _kill(int pid, int sig) {
  function _getpid (line 13489) | int _getpid() {
  function _isatty (line 13494) | int _isatty(int fd) {
  function gettimeofday (line 13525) | int gettimeofday(struct timeval *tp, void *tzp) {
  function gettimeofday (line 13555) | int gettimeofday(struct timeval *tp, void *tzp) {
  type stat (line 13600) | struct stat
  type stat (line 13601) | struct stat
  function slfs_open (line 13649) | int slfs_open(const unsigned char *fname, uint32_t flags, uint32_t *toke...
  function slfs_open (line 13655) | int slfs_open(const unsigned char *fname, uint32_t flags, uint32_t *toke...
  type sl_file_open_info (line 13672) | struct sl_file_open_info {
  type sl_fd_info (line 13679) | struct sl_fd_info {
  type sl_fd_info (line 13685) | struct sl_fd_info
  type sl_file_open_info (line 13686) | struct sl_file_open_info
  type sl_file_open_info (line 13688) | struct sl_file_open_info
  function sl_fs_to_errno (line 13691) | static int sl_fs_to_errno(_i32 r) {
  function fs_slfs_open (line 13713) | int fs_slfs_open(const char *pathname, int flags, mode_t mode) {
  function fs_slfs_close (line 13782) | int fs_slfs_close(int fd) {
  function fs_slfs_read (line 13791) | ssize_t fs_slfs_read(int fd, void *buf, size_t count) {
  function fs_slfs_write (line 13807) | ssize_t fs_slfs_write(int fd, const void *buf, size_t count) {
  function fs_slfs_stat (line 13820) | int fs_slfs_stat(const char *pathname, struct stat *s) {
  function fs_slfs_fstat (line 13837) | int fs_slfs_fstat(int fd, struct stat *s) {
  function off_t (line 13847) | off_t fs_slfs_lseek(int fd, off_t offset, int whence) {
  function fs_slfs_unlink (line 13862) | int fs_slfs_unlink(const char *pathname) {
  function fs_slfs_rename (line 13871) | int fs_slfs_rename(const char *from, const char *to) {
  type sl_file_open_info (line 13875) | struct sl_file_open_info
  function fs_slfs_set_file_size (line 13899) | void fs_slfs_set_file_size(const char *name, size_t size) {
  function fs_slfs_set_file_flags (line 13904) | void fs_slfs_set_file_flags(const char *name, uint32_t flags, uint32_t *...
  function fs_slfs_unset_file_flags (line 13910) | void fs_slfs_unset_file_flags(const char *name) {
  function set_errno (line 13941) | int set_errno(int e) {
  type fd_type (line 14004) | enum fd_type {
  function fd_type (line 14014) | static int fd_type(int fd) {
  function _open (line 14032) | int _open(const char *pathname, int flags, mode_t mode) {
  function _stat (line 14053) | int _stat(const char *pathname, struct stat *st) {
  function _close (line 14082) | int _close(int fd) {
  function off_t (line 14110) | off_t _lseek(int fd, off_t offset, int whence) {
  function _fstat (line 14135) | int _fstat(int fd, struct stat *s) {
  function _read (line 14168) | ssize_t _read(int fd, void *buf, size_t count) {
  function _write (line 14202) | ssize_t _write(int fd, const void *buf, size_t count) {
  function rename (line 14248) | int rename(const char *frompath, const char *topath) {
  function _unlink (line 14268) | int _unlink(const char *pathname) {
  function DIR (line 14287) | DIR *opendir(const char *dir_name) {
  type dirent (line 14301) | struct dirent
  type dirent (line 14302) | struct dirent
  function closedir (line 14307) | int closedir(DIR *dir) {
  function rmdir (line 14313) | int rmdir(const char *path) {
  function mkdir (line 14317) | int mkdir(const char *path, mode_t mode) {
  function sl_fs_init (line 14325) | int sl_fs_init(void) {
  type in_addr (line 14373) | struct in_addr
  type in_addr (line 14373) | struct in_addr
  type in_addr (line 14384) | struct in_addr
  function inet_pton (line 14389) | int inet_pton(int af, const char *src, void *dst) {
  type mg_q_msg_type (line 14416) | enum mg_q_msg_type {
  type mg_q_msg (line 14419) | struct mg_q_msg {
  function mg_start_task (line 14427) | bool mg_start_task(int priority, int stack_size, mg_init_cb mg_init) {
  function mg_task (line 14438) | static void mg_task(void *arg) {
  function mg_run_in_task (line 14455) | void mg_run_in_task(void (*cb)(struct mg_mgr *mgr, void *arg), void *cb_...
  type mg_iface_vtable (line 14495) | struct mg_iface_vtable
  type mg_connection (line 14532) | struct mg_connection
  function mg_set_non_blocking_mode (line 14536) | static void mg_set_non_blocking_mode(sock_t sock) {
  function mg_is_error (line 14546) | static int mg_is_error(int n) {
  function mg_sl_if_connect_tcp (line 14550) | static void mg_sl_if_connect_tcp(struct mg_connection *nc,
  function mg_sl_if_connect_udp (line 14572) | static void mg_sl_if_connect_udp(struct mg_connection *nc) {
  function mg_sl_if_listen_tcp (line 14582) | static int mg_sl_if_listen_tcp(struct mg_connection *nc,
  function mg_sl_if_listen_udp (line 14592) | static int mg_sl_if_listen_udp(struct mg_connection *nc,
  function mg_sl_if_tcp_send (line 14600) | static int mg_sl_if_tcp_send(struct mg_connection *nc, const void *buf,
  function mg_sl_if_udp_send (line 14607) | static int mg_sl_if_udp_send(struct mg_connection *nc, const void *buf,
  function mg_sl_if_tcp_recv (line 14614) | static int mg_sl_if_tcp_recv(struct mg_connection *nc, void *buf, size_t...
  function mg_sl_if_udp_recv (line 14625) | static int mg_sl_if_udp_recv(struct mg_connection *nc, void *buf, size_t...
  function mg_sl_if_create_conn (line 14635) | static int mg_sl_if_create_conn(struct mg_connection *nc) {
  function mg_sl_if_destroy_conn (line 14640) | void mg_sl_if_destroy_conn(struct mg_connection *nc) {
  function mg_accept_conn (line 14649) | static int mg_accept_conn(struct mg_connection *lc) {
  function sock_t (line 14671) | static sock_t mg_open_listening_socket(struct mg_connection *nc,
  function mg_mgr_handle_conn (line 14699) | void mg_mgr_handle_conn(struct mg_connection *nc, int fd_flags, double n...
  function mg_sl_if_sock_set (line 14756) | void mg_sl_if_sock_set(struct mg_connection *nc, sock_t sock) {
  function mg_sl_if_init (line 14762) | void mg_sl_if_init(struct mg_iface *iface) {
  function mg_sl_if_free (line 14767) | void mg_sl_if_free(struct mg_iface *iface) {
  function mg_sl_if_add_conn (line 14771) | void mg_sl_if_add_conn(struct mg_connection *nc) {
  function mg_sl_if_remove_conn (line 14775) | void mg_sl_if_remove_conn(struct mg_connection *nc) {
  function time_t (line 14779) | time_t mg_sl_if_poll(struct mg_iface *iface, int timeout_ms) {
  function mg_sl_if_get_conn_addr (line 14875) | void mg_sl_if_get_conn_addr(struct mg_connection *nc, int remote,
  function sl_restart_cb (line 14883) | void sl_restart_cb(struct mg_mgr *mgr) {
  type mg_iface_vtable (line 14931) | struct mg_iface_vtable
  type mg_iface_vtable (line 14933) | struct mg_iface_vtable
  type mg_ssl_if_ctx (line 14968) | struct mg_ssl_if_ctx {
  function mg_ssl_if_init (line 14975) | void mg_ssl_if_init() {
  function mg_ssl_if_conn_init (line 14978) | enum mg_ssl_if_result mg_ssl_if_conn_init(
  function mg_ssl_if_conn_accept (line 15008) | enum mg_ssl_if_result mg_ssl_if_conn_accept(struct mg_connection *nc,
  function mg_ssl_if_handshake (line 15016) | enum mg_ssl_if_result mg_ssl_if_handshake(struct mg_connection *nc) {
  function mg_ssl_if_read (line 15021) | int mg_ssl_if_read(struct mg_connection *nc, void *buf, size_t len) {
  function mg_ssl_if_write (line 15028) | int mg_ssl_if_write(struct mg_connection *nc, const void *buf, size_t le...
  function mg_ssl_if_conn_close_notify (line 15033) | void mg_ssl_if_conn_close_notify(struct mg_connection *nc) {
  function mg_ssl_if_conn_free (line 15038) | void mg_ssl_if_conn_free(struct mg_connection *nc) {
  function pem_to_der (line 15050) | bool pem_to_der(const char *pem_file, const char *der_file) {
  function sl_set_ssl_opts (line 15128) | int sl_set_ssl_opts(int sock, struct mg_connection *nc) {
  type mg_iface_vtable (line 15222) | struct mg_iface_vtable
  type mg_lwip_conn_state (line 15224) | struct mg_lwip_conn_state {
  type mg_sig_type (line 15243) | enum mg_sig_type {
  type mg_sig_type (line 15251) | enum mg_sig_type
  type mg_connection (line 15251) | struct mg_connection
  type mg_mgr (line 15254) | struct mg_mgr
  function mg_lwip_netif_run_on_tcpip (line 15333) | void mg_lwip_netif_run_on_tcpip(void (*fn)(void *), void *arg) {
  type mg_lwip_netif_tcpip_call_ctx (line 15339) | struct mg_lwip_netif_tcpip_call_ctx {
  function xxx_tcpip (line 15343) | static void xxx_tcpip(void *arg) {
  function mg_lwip_netif_run_on_tcpip (line 15349) | void mg_lwip_netif_run_on_tcpip(void (*fn)(void *), void *arg) {
  type mg_iface (line 15360) | struct mg_iface
  type mg_iface (line 15361) | struct mg_iface
  type mg_connection (line 15362) | struct mg_connection
  type mg_connection (line 15363) | struct mg_connection
  type mg_iface (line 15364) | struct mg_iface
  type mg_connection (line 15375) | struct mg_connection
  type pbuf (line 15375) | struct pbuf
  function mg_lwip_set_keepalive_params (line 15378) | void mg_lwip_set_keepalive_params(struct mg_connection *nc, int idle,
  function err_t (line 15398) | static err_t mg_lwip_tcp_conn_cb(void *arg, struct tcp_pcb *tpcb, err_t ...
  function mg_lwip_tcp_error_cb (line 15415) | static void mg_lwip_tcp_error_cb(void *arg, err_t err) {
  function err_t (line 15429) | static err_t mg_lwip_tcp_recv_cb(void *arg, struct tcp_pcb *tpcb,
  function err_t (line 15483) | static err_t mg_lwip_tcp_sent_cb(void *arg, struct tcp_pcb *tpcb,
  type mg_lwip_if_connect_tcp_ctx (line 15499) | struct mg_lwip_if_connect_tcp_ctx {
  function mg_lwip_if_connect_tcp_tcpip (line 15504) | static void mg_lwip_if_connect_tcp_tcpip(void *arg) {
  function mg_lwip_if_connect_tcp (line 15533) | void mg_lwip_if_connect_tcp(struct mg_connection *nc,
  type udp_pcb (line 15544) | struct udp_pcb
  type pbuf (line 15544) | struct pbuf
  function mg_lwip_udp_recv_cb (line 15547) | static void mg_lwip_udp_recv_cb(void *arg, struct udp_pcb *pcb, struct p...
  function mg_lwip_recv_common (line 15576) | static void mg_lwip_recv_common(struct mg_connection *nc, struct pbuf *p) {
  function mg_lwip_if_udp_recv (line 15589) | static int mg_lwip_if_udp_recv(struct mg_connection *nc, void *buf, size...
  function mg_lwip_if_connect_udp_tcpip (line 15613) | static void mg_lwip_if_connect_udp_tcpip(void *arg) {
  function mg_lwip_if_connect_udp (line 15628) | void mg_lwip_if_connect_udp(struct mg_connection *nc) {
  function tcp_close_tcpip (line 15632) | static void tcp_close_tcpip(void *arg) {
  function mg_lwip_handle_accept (line 15636) | void mg_lwip_handle_accept(struct mg_connection *nc) {
  function err_t (line 15646) | static err_t mg_lwip_accept_cb(void *arg, struct tcp_pcb *newtpcb, err_t...
  type mg_lwip_if_listen_ctx (line 15685) | struct mg_lwip_if_listen_ctx {
  function mg_lwip_if_listen_tcp_tcpip (line 15691) | static void mg_lwip_if_listen_tcp_tcpip(void *arg) {
  function mg_lwip_if_listen_tcp (line 15713) | int mg_lwip_if_listen_tcp(struct mg_connection *nc, union socket_address...
  function mg_lwip_if_listen_udp_tcpip (line 15719) | static void mg_lwip_if_listen_udp_tcpip(void *arg) {
  function mg_lwip_if_listen_udp (line 15739) | int mg_lwip_if_listen_udp(struct mg_connection *nc, union socket_address...
  type mg_lwip_tcp_write_ctx (line 15745) | struct mg_lwip_tcp_write_ctx {
  function tcp_output_tcpip (line 15752) | static void tcp_output_tcpip(void *arg) {
  function mg_lwip_tcp_write_tcpip (line 15756) | static void mg_lwip_tcp_write_tcpip(void *arg) {
  function mg_lwip_if_tcp_send (line 15802) | int mg_lwip_if_tcp_send(struct mg_connection *nc, const void *buf, size_...
  type udp_sendto_ctx (line 15813) | struct udp_sendto_ctx {
  function udp_sendto_tcpip (line 15821) | static void udp_sendto_tcpip(void *arg) {
  function mg_lwip_if_udp_send (line 15826) | static int mg_lwip_if_udp_send(struct mg_connection *nc, const void *data,
  function mg_lwip_if_can_send (line 15847) | static int mg_lwip_if_can_send(struct mg_connection *nc,
  type tcp_recved_ctx (line 15866) | struct tcp_recved_ctx {
  function tcp_recved_tcpip (line 15871) | void tcp_recved_tcpip(void *arg) {
  function mg_lwip_if_tcp_recv (line 15876) | static int mg_lwip_if_tcp_recv(struct mg_connection *nc, void *buf,
  function mg_lwip_if_create_conn (line 15907) | int mg_lwip_if_create_conn(struct mg_connection *nc) {
  function udp_remove_tcpip (line 15916) | static void udp_remove_tcpip(void *arg) {
  function mg_lwip_if_destroy_conn (line 15920) | void mg_lwip_if_destroy_conn(struct mg_connection *nc) {
  function mg_lwip_if_get_conn_addr (line 15951) | void mg_lwip_if_get_conn_addr(struct mg_connection *nc, int remote,
  function mg_lwip_if_sock_set (line 15975) | void mg_lwip_if_sock_set(struct mg_connection *nc, sock_t sock) {
  type mg_iface_vtable (line 16002) | struct mg_iface_vtable
  type mg_iface_vtable (line 16004) | struct mg_iface_vtable
  type mg_ev_mgr_lwip_signal (line 16034) | struct mg_ev_mgr_lwip_signal {
  type mg_ev_mgr_lwip_data (line 16039) | struct mg_ev_mgr_lwip_data {
  function mg_lwip_post_signal (line 16045) | void mg_lwip_post_signal(enum mg_sig_type sig, struct mg_connection *nc) {
  function mg_ev_mgr_lwip_process_signals (line 16061) | void mg_ev_mgr_lwip_process_signals(struct mg_mgr *mgr) {
  function mg_lwip_if_init (line 16100) | void mg_lwip_if_init(struct mg_iface *iface) {
  function mg_lwip_if_free (line 16110) | void mg_lwip_if_free(struct mg_iface *iface) {
  function mg_lwip_if_add_conn (line 16115) | void mg_lwip_if_add_conn(struct mg_connection *nc) {
  function mg_lwip_if_remove_conn (line 16119) | void mg_lwip_if_remove_conn(struct mg_connection *nc) {
  function time_t (line 16130) | time_t mg_lwip_if_poll(struct mg_iface *iface, int timeout_ms) {
  function open (line 16216) | int open(const char *filename, int oflag, int pmode) {
  function _wstati64 (line 16226) | int _wstati64(const wchar_t *path, cs_stat_t *st) {
  function mg_gmt_time_string (line 16255) | static void mg_gmt_time_string(char *buf, size_t buf_len, time_t *t) {
  type mg_iface_vtable (line 16306) | struct mg_iface_vtable
  function mg_pic32_if_create_conn (line 16335) | int mg_pic32_if_create_conn(struct mg_connection *nc) {
  function mg_pic32_if_recved (line 16340) | void mg_pic32_if_recved(struct mg_connection *nc, size_t len) {
  function mg_pic32_if_add_conn (line 16345) | void mg_pic32_if_add_conn(struct mg_connection *nc) {
  function mg_pic32_if_init (line 16349) | void mg_pic32_if_init(struct mg_iface *iface) {
  function mg_pic32_if_free (line 16354) | void mg_pic32_if_free(struct mg_iface *iface) {
  function mg_pic32_if_remove_conn (line 16358) | void mg_pic32_if_remove_conn(struct mg_connection *nc) {
  function mg_pic32_if_destroy_conn (line 16362) | void mg_pic32_if_destroy_conn(struct mg_connection *nc) {
  function mg_pic32_if_listen_udp (line 16376) | int mg_pic32_if_listen_udp(struct mg_connection *nc, union socket_addres...
  function mg_pic32_if_udp_send (line 16388) | void mg_pic32_if_udp_send(struct mg_connection *nc, const void *buf,
  function mg_pic32_if_tcp_send (line 16393) | void mg_pic32_if_tcp_send(struct mg_connection *nc, const void *buf,
  function mg_pic32_if_listen_tcp (line 16398) | int mg_pic32_if_listen_tcp(struct mg_connection *nc, union socket_addres...
  function mg_accept_conn (line 16411) | static int mg_accept_conn(struct mg_connection *lc) {
  type in_addr (line 16443) | struct in_addr
  function mg_handle_send (line 16451) | static void mg_handle_send(struct mg_connection *nc) {
  function mg_handle_recv (line 16489) | static void mg_handle_recv(struct mg_connection *nc) {
  function time_t (line 16527) | time_t mg_pic32_if_poll(struct mg_iface *iface, int timeout_ms) {
  function mg_pic32_if_sock_set (line 16569) | void mg_pic32_if_sock_set(struct mg_connection *nc, sock_t sock) {
  function mg_pic32_if_get_conn_addr (line 16573) | void mg_pic32_if_get_conn_addr(struct mg_connection *nc, int remote,
  function mg_pic32_if_connect_tcp (line 16578) | void mg_pic32_if_connect_tcp(struct mg_connection *nc,
  function mg_pic32_if_connect_udp (line 16587) | void mg_pic32_if_connect_udp(struct mg_connection *nc) {
  type mg_iface_vtable (line 16614) | struct mg_iface_vtable
  type mg_iface_vtable (line 16616) | struct mg_iface_vtable
  function sleep (line 16642) | unsigned int sleep(unsigned int seconds) {

FILE: src/optparse.c
  function tls_param (line 18) | int tls_param(tls_opts_t *tls_opts, char const *key, char const *val)
  function atobv (line 41) | int atobv(char const *arg, int def)
  function atoiv (line 50) | int atoiv(char const *arg, int def)
  function arg_float (line 75) | double arg_float(char const *str, char const *error_hint)
  function atouint32_metric (line 136) | uint32_t atouint32_metric(char const *str, char const *error_hint)
  function atoi_time (line 198) | int atoi_time(char const *str, char const *error_hint)
  function kwargs_match (line 331) | int kwargs_match(char const *s, char const *key, char const **val)
  function main (line 424) | int main(void)

FILE: src/output_file.c
  type data_output_json_t (line 27) | typedef struct {
  function print_json_array (line 32) | static void R_API_CALLCONV print_json_array(data_output_t *output, data_...
  function print_json_data (line 45) | static void R_API_CALLCONV print_json_data(data_output_t *output, data_t...
  function print_json_string (line 64) | static void R_API_CALLCONV print_json_string(data_output_t *output, cons...
  function print_json_double (line 98) | static void R_API_CALLCONV print_json_double(data_output_t *output, doub...
  function print_json_int (line 106) | static void R_API_CALLCONV print_json_int(data_output_t *output, int dat...
  function data_output_json_print (line 114) | static void R_API_CA
Condensed preview — 493 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,128K chars).
[
  {
    "path": ".ci/scripts/do_sysroot.sh",
    "chars": 6820,
    "preview": "#!/bin/bash\n\nset -e\n\nlibusb_ver=1.0.29\nrtlsdr_ver=2.0.2\npothos_ver=2021.07.25-vc16\n\n[ \"$(uname)\" = \"Darwin\" ] && export "
  },
  {
    "path": ".ci/scripts/do_tests.sh",
    "chars": 598,
    "preview": "#!/bin/bash\n\n# This script is for internal CI use only\n\nset -e\nset -x\n\n# prefer GNU commands\nrealpath=$(command -v greal"
  },
  {
    "path": ".clang-format",
    "chars": 368,
    "preview": "UseTab: Never\nIndentWidth: 4\nContinuationIndentWidth: 8\nBreakBeforeBraces: Stroustrup\nAlignAfterOpenBracket: DontAlign\nA"
  },
  {
    "path": ".deploy/WINDOWS-MINGWW64.txt",
    "chars": 1578,
    "preview": "# rtl_433 Windows MinGW-W64 build\n\nThe \"static\" builds are self-contained but do not include SoapySDR support.\nThe regul"
  },
  {
    "path": ".deploy/WINDOWS-MSVC.txt",
    "chars": 1775,
    "preview": "# rtl_433 Windows MSVC build\n\nFor the SoapySDR builds you need PothosSDR installed https://downloads.myriadrf.org/builds"
  },
  {
    "path": ".deploy/gen_nightly_info.sh",
    "chars": 146,
    "preview": "#!/bin/bash\n\ngit log $(git describe --tags --abbrev=0 HEAD^)..HEAD --oneline |egrep -v 'minor:|build:|docs:' |sed -e 's/"
  },
  {
    "path": ".deploy/gen_release_info.py",
    "chars": 397,
    "preview": "#!/usr/bin/env python\n\nwith open('CHANGELOG.md') as r, open('RELEASEINFO.md', 'w') as w:\n    # skip over possible 'Unrel"
  },
  {
    "path": ".github/actions/style-check/action.yml",
    "chars": 115,
    "preview": "name: 'Style Check'\ndescription: 'Check for common code style warnings'\nruns:\n  using: 'node20'\n  main: 'index.js'\n"
  },
  {
    "path": ".github/actions/style-check/index.js",
    "chars": 5083,
    "preview": "#!/usr/bin/env node\n/** @file\n    Source code style checks.\n\n    Copyright (C) 2020 by Christian Zuckschwerdt <zany@triq"
  },
  {
    "path": ".github/workflows/check.yml",
    "chars": 3773,
    "preview": "name: Build Analyze Check\non: [push, pull_request]\njobs:\n  macos_check_job:\n    strategy:\n      fail-fast: false\n      m"
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 22506,
    "preview": "name: Release\non:\n  workflow_dispatch:\n  push:\n    tags:\n    - '*'\n\nenv:\n  # from https://downloads.myriadrf.org/builds/"
  },
  {
    "path": ".gitignore",
    "chars": 285,
    "preview": "# CMake out-of-tree builds\nbuild*/\n\n# IDE files\n.cproject\n.settings\n.project\n.cache\n.vs\n.idea\ncmake-build-debug/\n\n# Edit"
  },
  {
    "path": "AUTHORS",
    "chars": 936,
    "preview": "Benjamin Larsson <banan@ludd.ltu.se>\nChristian W. Zuckschwerdt <zany@triq.net>\n\nSven Killig <sven@killig.de>\nrct <rct+gi"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 53170,
    "preview": "# Changelog\n\n## Release 25.12 (2025-12-12)\n\n### Breaking Changes\n\n- Changed all uv fields to uvi, BREAKING change to UV "
  },
  {
    "path": "CMakeLists.txt",
    "chars": 14635,
    "preview": "########################################################################\n# Project setup\n###############################"
  },
  {
    "path": "COPYING",
    "chars": 17987,
    "preview": "\t\t    GNU GENERAL PUBLIC LICENSE\n\t\t       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc."
  },
  {
    "path": "Doxyfile.in",
    "chars": 104233,
    "preview": "# Doxyfile 1.8.16\n\n# This file describes the settings to be used by the documentation system\n# doxygen (www.doxygen.org)"
  },
  {
    "path": "README.md",
    "chars": 31812,
    "preview": "# rtl_433\n\nrtl_433 (despite the name) is a generic data receiver, mainly for the 433.92 MHz, 868 MHz (SRD), 315 MHz, 345"
  },
  {
    "path": "cmake/Modules/FindGperftools.cmake",
    "chars": 1452,
    "preview": "# Tries to find Gperftools.\n#\n# Usage of this module as follows:\n#\n#     find_package(Gperftools)\n#\n# Variables used by "
  },
  {
    "path": "cmake/Modules/FindLibRTLSDR.cmake",
    "chars": 1512,
    "preview": "# - Try to find LibRTLSDR\n# Once done this will define\n#\n#  LibRTLSDR_FOUND - System has librtlsdr\n#  LibRTLSDR_INCLUDE_"
  },
  {
    "path": "cmake/Modules/FindLibUSB.cmake",
    "chars": 1892,
    "preview": "# - Try to find LibUSB-1.0\n# Once done this will define\n#\n#  LibUSB_FOUND - System has libusb\n#  LibUSB_INCLUDE_DIRS - T"
  },
  {
    "path": "cmake/Modules/GetGitRevisionDescription.cmake",
    "chars": 5634,
    "preview": "# https://github.com/rpavlik/cmake-modules\n#\n# - Returns a version string from Git\n#\n# These functions force a re-config"
  },
  {
    "path": "cmake/Modules/GetGitRevisionDescription.cmake.in",
    "chars": 1216,
    "preview": "#\n# Internal file for GetGitRevisionDescription.cmake\n#\n# Requires CMake 2.6 or newer (uses the 'function' command)\n#\n# "
  },
  {
    "path": "cmake/Toolchain-aarch64-linux-gnu.cmake",
    "chars": 173,
    "preview": "set(CMAKE_SYSTEM_NAME Linux)\nset(CMAKE_SYSTEM_PROCESSOR aarch64)\nset(CMAKE_C_COMPILER /usr/bin/aarch64-linux-gnu-gcc)\nse"
  },
  {
    "path": "cmake/Toolchain-arm-linux-gnueabi.cmake",
    "chars": 169,
    "preview": "set(CMAKE_SYSTEM_NAME Linux)\nset(CMAKE_SYSTEM_PROCESSOR arm)\nset(CMAKE_C_COMPILER /usr/bin/arm-linux-gnueabi-gcc)\nset(CM"
  },
  {
    "path": "cmake/Toolchain-arm-linux-gnueabihf.cmake",
    "chars": 173,
    "preview": "set(CMAKE_SYSTEM_NAME Linux)\nset(CMAKE_SYSTEM_PROCESSOR arm)\nset(CMAKE_C_COMPILER /usr/bin/arm-linux-gnueabihf-gcc)\nset("
  },
  {
    "path": "cmake/Toolchain-gcc-mingw-w64-i686.cmake",
    "chars": 1313,
    "preview": "# CMAKE_SYSROOT and CMAKE_STAGING_PREFIX need 3.0\ncmake_minimum_required(VERSION 3.10)\n\n# Linux, Windows, or Darwin\nSET("
  },
  {
    "path": "cmake/Toolchain-gcc-mingw-w64-x86-64.cmake",
    "chars": 1315,
    "preview": "# CMAKE_SYSROOT and CMAKE_STAGING_PREFIX need 3.0\ncmake_minimum_required(VERSION 3.10)\n\n# Linux, Windows, or Darwin\nSET("
  },
  {
    "path": "cmake/cmake_uninstall.cmake.in",
    "chars": 1370,
    "preview": "# http://www.vtk.org/Wiki/CMake_FAQ#Can_I_do_.22make_uninstall.22_with_CMake.3F\n\nIF(NOT EXISTS \"@CMAKE_CURRENT_BINARY_DI"
  },
  {
    "path": "conf/CAME-TOP432.conf",
    "chars": 1224,
    "preview": "# CAME-TOP432.conf\n# Copyright (C) 2020 JFORESTIER\n# Decode CAME remote control TOP-432EV, TOP-432NA, TOP-432EE.\n# This "
  },
  {
    "path": "conf/CMakeLists.txt",
    "chars": 680,
    "preview": "########################################################################\n# Install example configuration files\n#########"
  },
  {
    "path": "conf/ContinentalRemote.conf",
    "chars": 1840,
    "preview": "# Decoder for Continental / Nissan S180144020 key remote\n# FCC ID: KR5S180144014\n#\n# Tested with 2x US 2013 Nissan Altim"
  },
  {
    "path": "conf/Dewenwils_BHV.conf",
    "chars": 1438,
    "preview": "# Dewenwils BH-V 5-channel AC socket remote.\n#\n# These use the standard xx2260C-R4 encoder chips, with the oscillator\n# "
  },
  {
    "path": "conf/DrivewayAlarm_I8-W1901.conf",
    "chars": 2484,
    "preview": "#\n#  Driveway alarm sensor  SKU I8-W1901\n#  This sensor Detects motion and comes with a receiver that plays 32 different"
  },
  {
    "path": "conf/DrivewayAlert.conf",
    "chars": 737,
    "preview": "# Decoder for the Harbor Freight / Bunker Hill Wireless / Ironton\n# Wireless Security Alert System / Wireless Driveway A"
  },
  {
    "path": "conf/EV1527-4Button-Universal-Remote.conf",
    "chars": 1197,
    "preview": "# EV1527 4-Button Universal remote\n#\n# This decoder reads button pressed from a EV1527 based remote control.\n# The four "
  },
  {
    "path": "conf/EV1527-DDS-Sgooway.conf",
    "chars": 694,
    "preview": "# EV1527 based Wireless Door Sensor\n#\n# This decoder reads detections of the Sgooway EV1527 based Door sensor\n#\n# Link t"
  },
  {
    "path": "conf/EV1527-PIR-Sgooway.conf",
    "chars": 681,
    "preview": "# EV1527 based passive infrared sensor\n#\n# This decoder reads detections of the Sgooway EV1527 based PIR\n#\n# The shown e"
  },
  {
    "path": "conf/FAN-53T.conf",
    "chars": 1369,
    "preview": "# Decoder for FAN-53T ceiling fan/light remote control\n# Very similar to FAN-11T.\n#\n# https://fccid.io/2AAZPFAN-53T/User"
  },
  {
    "path": "conf/GhostControls.conf",
    "chars": 715,
    "preview": "# Decoder for the GhostControls family of automated gate controls that\n# operate on 433.920MHz.\n#\n# Tested with:\n#   AXS"
  },
  {
    "path": "conf/HeatmiserPRT-W.conf",
    "chars": 3193,
    "preview": "# Decoder for Heatmiser PRT-W thermostat with mqtt output\n\n# These are thermostats principally designed to control under"
  },
  {
    "path": "conf/Hormann-blue.conf",
    "chars": 778,
    "preview": "# Hormann-blue.conf\n# Hörmann (Hoermann/Hormann) remote for 868 MHz (Blue Button).\n#\n# This remote control is used for g"
  },
  {
    "path": "conf/LeakDetector.conf",
    "chars": 568,
    "preview": "# Decoder for the WaterLeak Detector:\n# https://www.banggood.com/DY-SQ100B-Water-Leakage-Detector-Rustproof-Sensor-Alarm"
  },
  {
    "path": "conf/MightyMule-FM231.conf",
    "chars": 742,
    "preview": "# Decoder for the Mighty Mule FM231 Driveway alarm from GTO Inc\n# FCC Test report, including RF waveforms is here:\n#   h"
  },
  {
    "path": "conf/MondeoRemote.conf",
    "chars": 1671,
    "preview": "# Decoder for Ford Mondeo key remote\n#\n# Tested with:\n#   UK 2013 Ford Mondeo key remote\n#\n# Operates on 433.920MHz.\n#\n#"
  },
  {
    "path": "conf/PHOX.conf",
    "chars": 762,
    "preview": "# PHOX: Remote control gate opener.\n#\n# Characteristic\n#  * Rolling code transmission\n#  * 433.92 MHz and 868.30 MHz ver"
  },
  {
    "path": "conf/Reolink-doorbell.conf",
    "chars": 449,
    "preview": "# Reolink doorbell\n#\n# This decoder reads button presses from a EV1527 based Reolink doorbell.\n#\n# Analyzed by @sdalu in"
  },
  {
    "path": "conf/SMC5326-Remote.conf",
    "chars": 1052,
    "preview": "# SMC5326 remote control\n\n# This decoder reads two or four button pressed on the remote control. The\n# rubber buttons ar"
  },
  {
    "path": "conf/SWETUP-garage-opener.conf",
    "chars": 1029,
    "preview": "# SWETUP garage door opener\n# by FoxWhiskey 2023\n#\n# A four-button remote control device most likely based on EV1527 chi"
  },
  {
    "path": "conf/SalusRT300RF.conf",
    "chars": 1116,
    "preview": "# Decoder for Salus RT300RF thermostat\n# listen on 868.286Mhz\n# rtl_433 -Y classic -R 0 -X \"name=SalusRT300RF, m=FSK_PCM"
  },
  {
    "path": "conf/Skylink_HA-434TL.conf",
    "chars": 402,
    "preview": "# Skylink HA-434TL motion sensor\n#\n# This decoder reads detections of the Skylink HA-434TL PIR motion sensor\n#\n# s.a. ht"
  },
  {
    "path": "conf/Thomson-doorbell.conf",
    "chars": 898,
    "preview": "# Thomson doorbell\n#\n# old model with 23 bits: https://www.hornbach.de/p/p/4618196/\n# new model with 25 bits: https://ww"
  },
  {
    "path": "conf/adlm_fprf.conf",
    "chars": 813,
    "preview": "# Equation/Siemens ADLM FPRF on 433.863MHz\n# 3 zones heater programmer\n#\n# A 50ms wakeup pulse followed by a 5ms gap,\n# "
  },
  {
    "path": "conf/atc-technology_lmt-430.conf",
    "chars": 434,
    "preview": "# ATC Technology LMT-430\n#\n# This config represents the decoding settings of a handheld dimming remote for my room lamp\n"
  },
  {
    "path": "conf/car_fob.conf",
    "chars": 323,
    "preview": "# Unknown carfob with rolling code\n# Copyright (C) 2020 Benjamin Larsson\n#\n\n\ndecoder {\n    name=Car fob,\n    modulation="
  },
  {
    "path": "conf/chungear_bcf-0019x2.conf",
    "chars": 927,
    "preview": "# Chungear Industrial Co Ltd Fan/Light Remote Controller BCF-0019x2\n#\n# https://fccid.io/KUJCE9001/User-Manual/User-Manu"
  },
  {
    "path": "conf/dooya_curtain.conf",
    "chars": 494,
    "preview": "# Dooya Curtain Remote (DC1602)\n# e.g. https://www.aliexpress.com/i/32954197821.html\n# see https://github.com/merbanan/r"
  },
  {
    "path": "conf/elro_ab440r.conf",
    "chars": 923,
    "preview": "# ELRO AB440R remote control.\n\n# Remote switch to turn on or off power sockets.\n# The remote control has 8 buttons to co"
  },
  {
    "path": "conf/energy_count_3000.conf",
    "chars": 493,
    "preview": "# EC3k Energy Count Control\n#\n# \"Voltcraft Energy Count 3000\" (868.3 MHz) sensor sold by Conrad\n# aka \"Velleman NETBSEM4"
  },
  {
    "path": "conf/fan-11t.conf",
    "chars": 2333,
    "preview": "\n#\n# FAN-11T Remote Control of Harbor Breeze Fan\n#\n# KUJCE9103 FAN-11T FAN-53T 2AAZPFAN-53T\n#\n# written: Peter Shipley\n#"
  },
  {
    "path": "conf/friedlandevo.conf",
    "chars": 943,
    "preview": "# Friedland EVO door bell\n#\n# This decodes the transmissions from the Friedland EVO wireless door bell buttons. The\n# Fr"
  },
  {
    "path": "conf/ge_smartremote_plus.conf",
    "chars": 640,
    "preview": "# GE Smartremote Plus\n# FCC ID: QOB-PT458\n#\n# House Code D\n#   Channel 0\n#      On:  ea af a8 80  : 11101010 10101111 10"
  },
  {
    "path": "conf/heatilator.conf",
    "chars": 2664,
    "preview": "# Decoder for Heatilator gas log remotes.\n#\n# Heatilator gas logs use OOK_PULSE_PPM encoding. The format is very similar"
  },
  {
    "path": "conf/honeywell-fan.conf",
    "chars": 3276,
    "preview": "# Decoder for Honeywell fan remotes.\n#\n# This fan is made by Intertek (model 4003229) but is sold by Honeywell\n# as a mo"
  },
  {
    "path": "conf/hornbach-msrc-sal.conf",
    "chars": 4249,
    "preview": "# Decoder for Hornbach awning remotes.\n#\n# The remote is labeled MSRC-SAL and has article number 6196477 printed on the\n"
  },
  {
    "path": "conf/ivac_pro.conf",
    "chars": 772,
    "preview": "# iVac Pro remote control that has different channels, tools and an on/off button\n# https://github.com/merbanan/rtl_433/"
  },
  {
    "path": "conf/led-light-remote.conf",
    "chars": 541,
    "preview": "# Generic Remote Controller for LED Strip Lights\n# Remote decoder from issue #1112 by chaos511\n\n# first 16 bit seem to b"
  },
  {
    "path": "conf/oma-blind-remote.conf",
    "chars": 2310,
    "preview": "# Decoder for oma battery powered roller blind motor controller\n# Tested with blind motor with electronic limit switch. "
  },
  {
    "path": "conf/pir-ef4.conf",
    "chars": 1000,
    "preview": "# config for PIR-EF4SBT00003.\n# Nicolas JOURDEN - 25/04/2019\n#\n# The sensor is known with the FCC-ID: EF4SBT00003\n#\n# So"
  },
  {
    "path": "conf/quinetic_switch.conf",
    "chars": 623,
    "preview": "#\n# Quinetic Switches and Sensors\n#\n# Basic Usage:\n# rtl_433 /etc/rtl_433/quinetic_switch.conf\n#\n# Recommended approach:"
  },
  {
    "path": "conf/qx-30x.conf",
    "chars": 722,
    "preview": "# QX-30X\n#\n# This decoder reads button presses from QX-302, QX-304 and QX-305 self powered\n# switches. These switches ap"
  },
  {
    "path": "conf/rako_wireless_lighting.conf",
    "chars": 627,
    "preview": "# A decoder for Rako Wireless Lighting controls\n\n# Manufacturers site: https://rakocontrols.com/products/interfaces-acce"
  },
  {
    "path": "conf/restaurant_pager.conf",
    "chars": 965,
    "preview": "# Restaurant pager system (EV1527-variant, 25-bit OOK PWM)\n#\n# Tested with JianTao JT-913 restaurant guest paging system"
  },
  {
    "path": "conf/rolleaseacmedia.conf",
    "chars": 2466,
    "preview": "# Decoder for rolleaseacmedia mains powered roller blind motor controller\n\n# The device tested is MTRF-REM-15CLED\n# 433."
  },
  {
    "path": "conf/rtl_433.example.conf",
    "chars": 30679,
    "preview": "# config for rtl_433\n\n# A valid config line is a keyword followed by an argument to the end of line.\n# Whitespace around"
  },
  {
    "path": "conf/silverline_doorbell.conf",
    "chars": 1347,
    "preview": "# Silverline doorbell\n\n# A typical x1527 OTP encoder device\n# sends 12 tristate \"bits\" encoded as 2 bits each and a sync"
  },
  {
    "path": "conf/sonoff_rm433.conf",
    "chars": 434,
    "preview": "# Sonoff RM433 remote controller\n# https://www.itead.cc/sonoff-rm433-remote-controller-base.html\n\n# map the 8 buttons to"
  },
  {
    "path": "conf/steffen_switch.conf",
    "chars": 492,
    "preview": "# Steffen Switch Transmitter, HS1527 based remote button\n\n# should abort if (bb[0][0]!=0x00 || (bb[1][0]&0x07)!=0x07 || "
  },
  {
    "path": "conf/tesla_charge-port-opener.conf",
    "chars": 696,
    "preview": "# Tesla charge port opener\n#\n#  * When the button on the charge handle is pressed the signal is repeated at 0.15s interv"
  },
  {
    "path": "conf/tyreguard400.conf",
    "chars": 2377,
    "preview": "# TYREGUARD400 from DAVIES CRAIG\n#\n# https://daviescraig.com.au/product/tyreguard-400-tpms-4-sensors-kit-1015\n#\n# - Type"
  },
  {
    "path": "conf/valeo_car_key.conf",
    "chars": 331,
    "preview": "# Valeo Car Key\n# Identifies event, but does not attempt to decrypt rolling code...\n# Copyright (C) 2015 Tommy Vestermar"
  },
  {
    "path": "conf/verisure_alarm.conf",
    "chars": 872,
    "preview": "# Verisure Alarm, contact switch made by Honeywell\n# Copyright (C) 2020 Benjamin Larsson\n#\n# The payload is most likely "
  },
  {
    "path": "conf/xmas-tree-remote-2APJZ-CW002.conf",
    "chars": 719,
    "preview": "# Decoder for Christmas Tree Lights Remote\n# FCC ID: 2APJZ-CW002\n#\n# Reference:\n# https://fccid.io/2APJZ-CW002\n# https:/"
  },
  {
    "path": "docs/.gitignore",
    "chars": 147,
    "preview": "# ignore VuePress build files\n.vuepress/dist\n.temp\n.cache\nnode_modules\nyarn.lock\n# ignore copied files\nREADME.md\nCHANGEL"
  },
  {
    "path": "docs/.vuepress/config.js",
    "chars": 908,
    "preview": "const { defaultTheme } = require('vuepress')\nconst { searchPlugin } = require('@vuepress/plugin-search')\n\nmodule.exports"
  },
  {
    "path": "docs/.vuepress/styles/index.scss",
    "chars": 171,
    "preview": "// Missing background color on bare code sections\n.theme-default-content pre, .theme-default-content pre[class*=\"languag"
  },
  {
    "path": "docs/ANALYZE.md",
    "chars": 4239,
    "preview": "# Capture and analyze devices\n\n## TL;DR\n\nCapture sample data with `-S unknown`. Note down the expected measurement value"
  },
  {
    "path": "docs/BINARY_BUILDS.md",
    "chars": 4170,
    "preview": "# Binary Builds\n\nFirst check to see if your distribution already has a recent enough version packaged for you.\nE.g. chec"
  },
  {
    "path": "docs/BUILDING.md",
    "chars": 8418,
    "preview": "# Building rtl_433\n\nrtl_433 currently supports these input types:\n* [RTL-SDR](http://sdr.osmocom.org/trac/wiki/rtl-sdr) "
  },
  {
    "path": "docs/CONTRIBUTING.md",
    "chars": 6313,
    "preview": "# Contributing guidelines\n\nThe rtl_433 project is built on the work of many contributors analyzing,\ndocumenting, and cod"
  },
  {
    "path": "docs/DATA_FORMAT.md",
    "chars": 4912,
    "preview": "# JSON Data fields\n\nSee also the discussion and rationale in https://github.com/merbanan/rtl_433/pull/827\n\n## Message Da"
  },
  {
    "path": "docs/HARDWARE.md",
    "chars": 1189,
    "preview": "# Hardware tested with rtl_433\n\nrtl_433 is known to work with or tested with the following SDR hardware:\n\n## RTL-SDR\n\nAc"
  },
  {
    "path": "docs/INTEGRATION.md",
    "chars": 6047,
    "preview": "# Integration\n\nIntegration of rtl_433 output into various home automation gateways.\n\n:::tip\nIf you are a user of one the"
  },
  {
    "path": "docs/IQ_FORMATS.md",
    "chars": 4413,
    "preview": "# Introduction to I/Q formats\n\nSDR data is exchanged and saved in different formats.\nThere are formats for raw I/Q sampl"
  },
  {
    "path": "docs/LINKS.md",
    "chars": 2358,
    "preview": "# Links to tools and related projects\n\n## SDR Inputs/Drivers\n\n- [RTL-SDR](https://github.com/osmocom/rtl-sdr/)\n- [SoapyS"
  },
  {
    "path": "docs/OPERATION.md",
    "chars": 22971,
    "preview": "# Basic rtl_433 operation\n\nThe principle buildings blocks of rtl_433 are: Inputs, Loaders, Processing, Analysis, Decoder"
  },
  {
    "path": "docs/PRIMER.md",
    "chars": 3950,
    "preview": "# Primer on SDR concepts\n\nA brief introduction to some concepts, most questions really only need a keyword to look it up"
  },
  {
    "path": "docs/STARTING.md",
    "chars": 13400,
    "preview": "# Getting Started\n\nA short summary how to operate `rtl_433`.\n\n## Options\n\nAdd options to the `rtl_433` command line invo"
  },
  {
    "path": "docs/build-docs.sh",
    "chars": 241,
    "preview": "#!/bin/sh\n\n# abort on errors\nset -e\n\n# navigate to the docs directory\ncd \"${0%/*}\"\n\n# copy other docs\nsed 's/docs\\///' ."
  },
  {
    "path": "docs/package.json",
    "chars": 267,
    "preview": "{\n  \"name\": \"rtl_433-docs\",\n  \"version\": \"1.0.0\",\n  \"private\": true,\n  \"scripts\": {\n    \"docs:dev\": \"vuepress dev\",\n    "
  },
  {
    "path": "examples/README.md",
    "chars": 5814,
    "preview": "# rtl_433 scripts (example and useful)\n\nThis directory contains a number of scripts to process the output of\nrtl_433 in "
  },
  {
    "path": "examples/mqtt_filter.py",
    "chars": 6506,
    "preview": "#!/usr/bin/env python3\n\"\"\" MQTT republishing filter to rename and deduplicate rtl_433 data\n\nExample program for receivin"
  },
  {
    "path": "examples/mqtt_rtl_433_test_client.py",
    "chars": 3932,
    "preview": "#!/usr/bin/env python3\n\"\"\" MQTT test client for receiving rtl_433 JSON data\n\nExample program for receiving and parsing s"
  },
  {
    "path": "examples/open_rtl433.py",
    "chars": 3044,
    "preview": "#!/usr/bin/env python3\n\n\"\"\"Helper command for rtl_433 to visualize a sample file in a web browser.\"\"\"\n\nfrom http.server "
  },
  {
    "path": "examples/rtl_433_collectd_pipe.py",
    "chars": 1706,
    "preview": "#!/usr/bin/env python3\n\n\"\"\"Collectd monitoring probe (i.e. no plugin) for rtl_433.\"\"\"\n\n# Needs Python collectd Network p"
  },
  {
    "path": "examples/rtl_433_custom.php",
    "chars": 2455,
    "preview": "#!/usr/bin/php\n<?php\n/*\nShort example of an UDP server written in PHP for rtl_433.\n\nYou need to have `php_cli` installed"
  },
  {
    "path": "examples/rtl_433_custom.py",
    "chars": 2297,
    "preview": "#!/usr/bin/env python3\n\n\"\"\"Custom data handling example for rtl_433.\"\"\"\n\n# Start rtl_433 (rtl_433 -F syslog::1433), then"
  },
  {
    "path": "examples/rtl_433_gps.py",
    "chars": 3468,
    "preview": "#!/usr/bin/env python3\n\n\"\"\"Read events from rtl_433 and gpsd and print out.\"\"\"\n\n# Needs gpsd (and the Python support fro"
  },
  {
    "path": "examples/rtl_433_graphite_relay.py",
    "chars": 3089,
    "preview": "#!/usr/bin/env python3\n\n\"\"\"Graphite(Carbon) monitoring relay for rtl_433.\"\"\"\n\n# Start rtl_433 (rtl_433 -F syslog::1433),"
  },
  {
    "path": "examples/rtl_433_http_cmd.py",
    "chars": 1767,
    "preview": "#!/usr/bin/env python3\n\n\"\"\"Custom hop controller example for rtl_433's HTTP cmd API.\"\"\"\n\n# Start rtl_433 (`rtl_433 -F ht"
  },
  {
    "path": "examples/rtl_433_http_cmd.sh",
    "chars": 429,
    "preview": "#!/bin/sh\n\n# Custom hop controller example for rtl_433's HTTP cmd API.\n\n# Start rtl_433 (`rtl_433 -F http`), then this s"
  },
  {
    "path": "examples/rtl_433_http_events.py",
    "chars": 2764,
    "preview": "#!/usr/bin/env python3\n\n\"\"\"Custom data handling example for rtl_433's HTTP (chunked) streaming API of JSON events.\"\"\"\n\n#"
  },
  {
    "path": "examples/rtl_433_http_stream.php",
    "chars": 1938,
    "preview": "#!/usr/bin/php\n<?php\n/*\nShort example of an TCP client written in PHP for rtl_433.\n\nYou need to have `php_cli` installed"
  },
  {
    "path": "examples/rtl_433_http_stream.py",
    "chars": 2739,
    "preview": "#!/usr/bin/env python3\n\n\"\"\"Custom data handling example for rtl_433's HTTP (line) streaming API of JSON events.\"\"\"\n\n# St"
  },
  {
    "path": "examples/rtl_433_http_ws.py",
    "chars": 2689,
    "preview": "#!/usr/bin/env python3\n\n\"\"\"Custom data handling example for rtl_433's HTTP WebSocket API of JSON events.\"\"\"\n\n# Start rtl"
  },
  {
    "path": "examples/rtl_433_influxdb_relay.py",
    "chars": 2750,
    "preview": "#!/usr/bin/env python3\n\n\"\"\"InfluxDB monitoring relay for rtl_433.\"\"\"\n\n# Start rtl_433 (rtl_433 -F syslog::1433), then th"
  },
  {
    "path": "examples/rtl_433_json_to_rtlwmbus.py",
    "chars": 1620,
    "preview": "#!/usr/bin/env python3\n\"\"\"\n$ rtl_433 -R 104 -F json | rtl_433_json_to_rtlwmbus.py\n\nA script to convert rtl_433 wmbus jso"
  },
  {
    "path": "examples/rtl_433_mqtt_hass.py",
    "chars": 35493,
    "preview": "#!/usr/bin/env python3\n# coding=utf-8\n\nfrom __future__ import print_function\nfrom __future__ import with_statement\n\nAP_D"
  },
  {
    "path": "examples/rtl_433_mqtt_relay.py",
    "chars": 9712,
    "preview": "#!/usr/bin/env python3\n\n\"\"\"MQTT monitoring relay for rtl_433 communication.\"\"\"\n\n# This program listens on a UDP socket f"
  },
  {
    "path": "examples/rtl_433_prometheus_relay.py",
    "chars": 5641,
    "preview": "#!/usr/bin/env python3\n\n\"\"\"\nPrometheus/OpenMetrics relay for rtl_433.\n\nCan either take in JSON from stdin:\n\nrtl_433 ... "
  },
  {
    "path": "examples/rtl_433_rrd_relay.py",
    "chars": 4983,
    "preview": "#!/usr/bin/env python3\n\n\"\"\"RRDtool monitoring relay for rtl_433.\"\"\"\n\n# Start rtl_433 (rtl_433 -C si -F syslog:127.0.0.1:"
  },
  {
    "path": "examples/rtl_433_statsd_pipe.py",
    "chars": 1312,
    "preview": "#!/usr/bin/env python3\n\n\"\"\"Statsd monitoring for rtl_433 using pipes.\"\"\"\n\n# Needs Python statsd Network plugin, s.a. htt"
  },
  {
    "path": "examples/rtl_433_statsd_relay.py",
    "chars": 1863,
    "preview": "#!/usr/bin/env python3\n\n\"\"\"Statsd monitoring relay for rtl_433.\"\"\"\n\n# Needs Python statsd Network plugin, s.a. https://g"
  },
  {
    "path": "include/CMakeLists.txt",
    "chars": 252,
    "preview": "########################################################################\n# Install public header files\n#################"
  },
  {
    "path": "include/abuf.h",
    "chars": 1253,
    "preview": "/** @file\n    array buffer (string builder).\n\n    Copyright (C) 2018 Christian Zuckschwerdt\n\n    This program is free so"
  },
  {
    "path": "include/am_analyze.h",
    "chars": 1389,
    "preview": "/** @file\n    AM signal analyzer.\n\n    Copyright (C) 2018 Christian Zuckschwerdt\n\n    This program is free software; you"
  },
  {
    "path": "include/baseband.h",
    "chars": 6843,
    "preview": "/** @file\n    Various functions for baseband sample processing.\n\n    Copyright (C) 2012 by Benjamin Larsson <benjamin@so"
  },
  {
    "path": "include/bit_util.h",
    "chars": 9599,
    "preview": "/** @file\n    Various utility functions for use by device drivers.\n\n    Copyright (C) 2015 Tommy Vestermark\n\n    This pr"
  },
  {
    "path": "include/bitbuffer.h",
    "chars": 7212,
    "preview": "/** @file\n    A two-dimensional bit buffer consisting of bytes.\n\n    Copyright (C) 2015 Tommy Vestermark\n\n    This progr"
  },
  {
    "path": "include/c_util.h",
    "chars": 652,
    "preview": "/** @file\n    General C language utility macro.\n\n    Copyright (C) 2018 Christian W. Zuckschwerdt <zany@triq.net>\n\n    T"
  },
  {
    "path": "include/compat_paths.h",
    "chars": 468,
    "preview": "/** @file\n    compat_paths addresses compatibility with default OS path names.\n\n    topic: default search paths for conf"
  },
  {
    "path": "include/compat_pthread.h",
    "chars": 1798,
    "preview": "#ifndef INCLUDE_COMPAT_PTHREAD_H_\n#define INCLUDE_COMPAT_PTHREAD_H_\n\n#ifndef THREADS\n\n// explicit request for \"no thread"
  },
  {
    "path": "include/compat_time.h",
    "chars": 869,
    "preview": "/** @file\n    compat_time addresses compatibility time functions.\n\n    topic: high-resolution timestamps\n    issue: <sys"
  },
  {
    "path": "include/confparse.h",
    "chars": 1235,
    "preview": "/** @file\n    Light-weight (i.e. dumb) config-file parser.\n\n    Copyright (C) 2018 Christian W. Zuckschwerdt <zany@triq."
  },
  {
    "path": "include/data.h",
    "chars": 8987,
    "preview": "/** @file\n    A general structure for extracting hierarchical data from the devices;\n    typically key-value pairs, but "
  },
  {
    "path": "include/data_tag.h",
    "chars": 914,
    "preview": "/** @file\n    Custom data tags for data struct.\n\n    Copyright (C) 2021 Christian Zuckschwerdt\n\n    This program is free"
  },
  {
    "path": "include/decoder.h",
    "chars": 307,
    "preview": "/** @file\n    Meta include for all decoders.\n*/\n\n#ifndef INCLUDE_DECODER_H_\n#define INCLUDE_DECODER_H_\n\n#include <string"
  },
  {
    "path": "include/decoder_util.h",
    "chars": 3221,
    "preview": "/** @file\n    High-level utility functions for decoders.\n\n    Copyright (C) 2018 Christian Zuckschwerdt\n\n    This progra"
  },
  {
    "path": "include/fatal.h",
    "chars": 1483,
    "preview": "/** @file\n    Fatal abort and warning macros for allocs.\n\n    Copyright (C) 2019 Christian W. Zuckschwerdt <zany@triq.ne"
  },
  {
    "path": "include/fileformat.h",
    "chars": 4577,
    "preview": "/** @file\n    Various utility functions handling file formats.\n\n    Copyright (C) 2018 Christian Zuckschwerdt\n\n    This "
  },
  {
    "path": "include/http_server.h",
    "chars": 622,
    "preview": "/**\n * RESTful HTTP control and WS interface\n *\n * Copyright (C) 2018 Christian Zuckschwerdt\n *\n * This program is free "
  },
  {
    "path": "include/jsmn.h",
    "chars": 1630,
    "preview": "#ifndef __JSMN_H_\n#define __JSMN_H_\n\n#include <stddef.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * JSON type ident"
  },
  {
    "path": "include/list.h",
    "chars": 1556,
    "preview": "/** @file\n    Generic list.\n\n    Copyright (C) 2018 Christian Zuckschwerdt\n\n    This program is free software; you can r"
  },
  {
    "path": "include/logger.h",
    "chars": 2688,
    "preview": "/** @file\n    Basic logging, API.\n\n    Copyright (C) 2021 Christian Zuckschwerdt\n\n    This program is free software; you"
  },
  {
    "path": "include/mongoose.h",
    "chars": 204653,
    "preview": "#ifndef INCLUDE_MONGOOSE_H_\n#define INCLUDE_MONGOOSE_H_\n\n#ifdef MG_MODULE_LINES\n#line 1 \"mongoose/src/mg_common.h\"\n#endi"
  },
  {
    "path": "include/optparse.h",
    "chars": 6338,
    "preview": "/** @file\n    Option parsing functions to complement getopt.\n\n    Copyright (C) 2017 Christian Zuckschwerdt\n\n    This pr"
  },
  {
    "path": "include/output_file.h",
    "chars": 1014,
    "preview": "/** @file\n    File outputs for rtl_433 events.\n\n    Copyright (C) 2021 Christian Zuckschwerdt\n\n    This program is free "
  },
  {
    "path": "include/output_influx.h",
    "chars": 642,
    "preview": "/** @file\n    InfluxDB output for rtl_433 events\n\n    Copyright (C) 2019 Daniel Krueger\n    based on output_mqtt.c\n    C"
  },
  {
    "path": "include/output_log.h",
    "chars": 895,
    "preview": "/** @file\n    Log outputs for rtl_433 events.\n\n    Copyright (C) 2022 Christian Zuckschwerdt\n\n    This program is free s"
  },
  {
    "path": "include/output_mqtt.h",
    "chars": 588,
    "preview": "/** @file\n    MQTT output for rtl_433 events\n\n    Copyright (C) 2019 Christian Zuckschwerdt\n\n    This program is free so"
  },
  {
    "path": "include/output_rtltcp.h",
    "chars": 1019,
    "preview": "/** @file\n    rtl_tcp output for rtl_433 raw data.\n\n    Copyright (C) 2022 Christian Zuckschwerdt\n\n    This program is f"
  },
  {
    "path": "include/output_trigger.h",
    "chars": 1077,
    "preview": "/** @file\n    Trigger output for rtl_433 events.\n\n    Copyright (C) 2021 Christian Zuckschwerdt\n\n    This program is fre"
  },
  {
    "path": "include/output_udp.h",
    "chars": 574,
    "preview": "/** @file\n    UDP syslog output for rtl_433 events.\n\n    Copyright (C) 2021 Christian Zuckschwerdt\n\n    This program is "
  },
  {
    "path": "include/pulse_analyzer.h",
    "chars": 610,
    "preview": "/** @file\n    Pulse analyzer functions.\n\n    Copyright (C) 2015 Tommy Vestermark\n\n    This program is free software; you"
  },
  {
    "path": "include/pulse_data.h",
    "chars": 3715,
    "preview": "/** @file\n    Pulse data structure and functions.\n\n    Copyright (C) 2015 Tommy Vestermark\n    Copyright (C) 2022 Christ"
  },
  {
    "path": "include/pulse_detect.h",
    "chars": 2895,
    "preview": "/** @file\n    Pulse detection functions.\n\n    Copyright (C) 2015 Tommy Vestermark\n    Copyright (C) 2020 Christian W. Zu"
  },
  {
    "path": "include/pulse_detect_fsk.h",
    "chars": 3083,
    "preview": "/** @file\n    Pulse detect functions, FSK pulse detector.\n\n    Copyright (C) 2015 Tommy Vestermark\n    Copyright (C) 201"
  },
  {
    "path": "include/pulse_slicer.h",
    "chars": 6993,
    "preview": "/** @file\n    Pulse slicer functions.\n\n    Binary slicers (PWM/PPM/Manchester/...) using a pulse data structure as input"
  },
  {
    "path": "include/r_api.h",
    "chars": 3277,
    "preview": "/** @file\n    Generic RF data receiver and decoder for ISM band devices using RTL-SDR and SoapySDR.\n\n    Copyright (C) 2"
  },
  {
    "path": "include/r_device.h",
    "chars": 4504,
    "preview": "/** @file\n    Definition of r_device struct.\n*/\n\n#ifndef INCLUDE_R_DEVICE_H_\n#define INCLUDE_R_DEVICE_H_\n\n/**\n    Suppor"
  },
  {
    "path": "include/r_private.h",
    "chars": 1756,
    "preview": "/** @file\n    Definition of r_private state structure.\n*/\n\n#ifndef INCLUDE_R_PRIVATE_H_\n#define INCLUDE_R_PRIVATE_H_\n\n#i"
  },
  {
    "path": "include/r_util.h",
    "chars": 5365,
    "preview": "/** @file\n    Various utility functions for use by applications.\n\n    Copyright (C) 2015 Tommy Vestermark\n\n    This prog"
  },
  {
    "path": "include/raw_output.h",
    "chars": 809,
    "preview": "/** @file\n    Raw I/Q data output handler.\n\n    Copyright (C) 2022 Christian Zuckschwerdt\n\n    This program is free soft"
  },
  {
    "path": "include/rfraw.h",
    "chars": 669,
    "preview": "/** @file\n    RfRaw format functions.\n\n    Copyright (C) 2020 Christian W. Zuckschwerdt <zany@triq.net>\n\n    This progra"
  },
  {
    "path": "include/rtl_433.h",
    "chars": 4303,
    "preview": "/** @file\n    Definition of r_cfg application structure.\n*/\n\n#ifndef INCLUDE_RTL_433_H_\n#define INCLUDE_RTL_433_H_\n\n#inc"
  },
  {
    "path": "include/rtl_433_devices.h",
    "chars": 7772,
    "preview": "/** @file\n    Declaration of all available decoders.\n*/\n\n#ifndef INCLUDE_RTL_433_DEVICES_H_\n#define INCLUDE_RTL_433_DEVI"
  },
  {
    "path": "include/samp_grab.h",
    "chars": 1033,
    "preview": "/** @file\n    IQ sample grabber (ring buffer and dumper).\n\n    Copyright (C) 2018 Christian Zuckschwerdt\n\n    This progr"
  },
  {
    "path": "include/sdr.h",
    "chars": 6069,
    "preview": "/** @file\n    SDR input from RTLSDR or SoapySDR.\n\n    Copyright (C) 2018 Christian Zuckschwerdt\n\n    This program is fre"
  },
  {
    "path": "include/term_ctl.h",
    "chars": 3884,
    "preview": "/** @file\n    Terminal control utility functions.\n\n    Copyright (C) 2018 Christian Zuckschwerdt\n\n    This program is fr"
  },
  {
    "path": "include/write_sigrok.h",
    "chars": 1103,
    "preview": "/** @file\n    Sigrok Pulseview format writer.\n\n    Copyright (C) 2020 by Christian Zuckschwerdt <zany@triq.net>\n\n    Thi"
  },
  {
    "path": "maintainer_update.py",
    "chars": 5648,
    "preview": "#!/usr/bin/env python3\n\n\"\"\"rtl_433 maintainer updates to build files and docs.\"\"\"\n\nimport sys\nimport os\nimport subproces"
  },
  {
    "path": "man/man1/rtl_433.1",
    "chars": 15336,
    "preview": ".TH \"RTL_433\" \"1\" \"2019-08-21\" \"rtl_433\" \"rtl_433 Commands\"\n.ie \\n(.g .ds Aq \\(aq\n.el       .ds Aq '\n.ss \\n[.ss] 0\n.nh\n."
  },
  {
    "path": "rtl433.pc.in",
    "chars": 191,
    "preview": "prefix=@prefix@\nexec_prefix=@exec_prefix@\nlibdir=@libdir@\nincludedir=@includedir@\n\nName: RTL-433 Utility\nDescription: C "
  },
  {
    "path": "src/CMakeLists.txt",
    "chars": 9240,
    "preview": "########################################################################\n# Build libraries and executables\n#############"
  },
  {
    "path": "src/abuf.c",
    "chars": 1399,
    "preview": "/** @file\n    array buffer (string builder).\n\n    Copyright (C) 2018 Christian Zuckschwerdt\n\n    This program is free so"
  },
  {
    "path": "src/am_analyze.c",
    "chars": 12200,
    "preview": "/** @file\n    AM signal analyzer.\n\n    Copyright (C) 2018 Christian Zuckschwerdt\n\n    This program is free software; you"
  },
  {
    "path": "src/baseband.c",
    "chars": 14223,
    "preview": "/** @file\n    Various functions for baseband sample processing.\n\n    Copyright (C) 2012 by Benjamin Larsson <benjamin@so"
  },
  {
    "path": "src/bit_util.c",
    "chars": 18552,
    "preview": "/** @file\n    Various utility functions for use by device drivers.\n\n    Copyright (C) 2015 Tommy Vestermark\n\n    This pr"
  },
  {
    "path": "src/bitbuffer.c",
    "chars": 18495,
    "preview": "/** @file\n    A two-dimensional bit buffer consisting of bytes.\n\n    Copyright (C) 2015 Tommy Vestermark\n\n    This progr"
  },
  {
    "path": "src/compat_paths.c",
    "chars": 2454,
    "preview": "// compat_paths addresses following compatibility issue:\n// topic: default search paths for config file\n// issue: Linux "
  },
  {
    "path": "src/compat_time.c",
    "chars": 1748,
    "preview": "// compat_time addresses following compatibility issue:\n// topic: high-resolution timestamps\n// issue: <sys/time.h> is n"
  },
  {
    "path": "src/confparse.c",
    "chars": 3791,
    "preview": "/** @file\n    Light-weight (i.e. dumb) config-file parser.\n\n    - a valid config line is a keyword followed by an argume"
  },
  {
    "path": "src/data.c",
    "chars": 18205,
    "preview": "/** @file\n    A general structure for extracting hierarchical data from the devices;\n    typically key-value pairs, but "
  },
  {
    "path": "src/data_tag.c",
    "chars": 9925,
    "preview": "/** @file\n    Custom data tags for data struct.\n\n    Copyright (C) 2021 Christian Zuckschwerdt\n\n    This program is free"
  },
  {
    "path": "src/decoder_util.c",
    "chars": 8831,
    "preview": "/** @file\n    High-level utility functions for decoders.\n\n    Copyright (C) 2018 Christian Zuckschwerdt\n\n    This progra"
  },
  {
    "path": "src/devices/abmt.c",
    "chars": 2644,
    "preview": "/** @file\n    Amazon Basics Meat Thermometer\n\n    Copyright (C) 2021 Benjamin Larsson\n\n    This program is free software"
  },
  {
    "path": "src/devices/acurite.c",
    "chars": 75925,
    "preview": "/** @file\n    Acurite weather stations and temperature / humidity sensors.\n\n    Copyright (c) 2015, Jens Jenson, Helge W"
  },
  {
    "path": "src/devices/acurite_01185m.c",
    "chars": 5085,
    "preview": "/** @file\n    Decoder for Acurite Grill/Meat Thermometer 01185M.\n\n    Copyright (C) 2021 Christian W. Zuckschwerdt <zany"
  },
  {
    "path": "src/devices/akhan_100F14.c",
    "chars": 2309,
    "preview": "/** @file\n    Akhan remote keyless entry system.\n\n    This program is free software; you can redistribute it and/or modi"
  },
  {
    "path": "src/devices/alecto.c",
    "chars": 9019,
    "preview": "/** @file\n    AlectoV1 Weather Sensor protocol.\n\n    This program is free software; you can redistribute it and/or modif"
  },
  {
    "path": "src/devices/ambient_weather.c",
    "chars": 6001,
    "preview": "/** @file\n    Ambient Weather F007TH Thermo-Hygrometer.\n\n    contributed by David Ediger\n    discovered by Ron C. Lewis\n"
  },
  {
    "path": "src/devices/ambientweather_tx8300.c",
    "chars": 4576,
    "preview": "/** @file\n    Ambient Weather TX-8300 (also sold as TFA 30.3211.02).\n\n    Copyright (C) 2018 ionum-projekte and Roger\n\n "
  },
  {
    "path": "src/devices/ambientweather_wh31e.c",
    "chars": 16400,
    "preview": "/** @file\n    Ambient Weather WH31E, EcoWitt WH40 protocol.\n\n    Copyright (C) 2018 Christian W. Zuckschwerdt <zany@triq"
  },
  {
    "path": "src/devices/ant_antplus.c",
    "chars": 7645,
    "preview": "/** @file\n    ANT and ANT+ decoder.\n\n    Copyright (C) 2022 Roberto Cazzaro <https://github.com/robcazzaro>\n\n    This pr"
  },
  {
    "path": "src/devices/apator_metra_eitn30.c",
    "chars": 7909,
    "preview": "/** @file\n    Apator Metra E-ITN 30 Heat cost allocator.\n\n    Copyright (C) 2025 Alex Carp (\\@carpalex)\n    Copyright (c"
  },
  {
    "path": "src/devices/apator_metra_erm30.c",
    "chars": 7185,
    "preview": "/** @file\n    Apator Metra E-RM 30 Water Meters.\n\n    Copyright (C) 2025 Alex Carp (\\@carpalex)\n    Copyright (c) 2026 B"
  },
  {
    "path": "src/devices/arad_ms_meter.c",
    "chars": 4728,
    "preview": "/** @file\n    Arad/Master Meter Dialog3G water utility meter.\n\n    Copyright (C) 2022 avicarmeli\n\n    This program is fr"
  },
  {
    "path": "src/devices/archos_tbh.c",
    "chars": 7864,
    "preview": "/** @file\n    Decoder for TBH Archos devices.\n\n    Copyright (c) 2019 duc996 <duc_996@gmx.net>\n\n    This program is free"
  },
  {
    "path": "src/devices/arexx_ml.c",
    "chars": 6163,
    "preview": "/** @file\n    Arexx Multilogger.\n\n    Copyright (C) 2023 Christian W. Zuckschwerdt <zany@triq.net>\n    Protocol analysis"
  },
  {
    "path": "src/devices/atech_ws308.c",
    "chars": 4130,
    "preview": "/** @file\n    Decoder for Atech-WS308 temperature sensor.\n\n    Copyright (C) 2020 Marc Prieur https://github.com/marco40"
  }
]

// ... and 293 more files (download for full content)

About this extraction

This page contains the full source code of the merbanan/rtl_433 GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 493 files (3.8 MB), approximately 1.0M tokens, and a symbol index with 2674 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!