diff --git a/.github/workflows/changelog.py b/.github/workflows/changelog.py new file mode 100644 index 00000000..53780668 --- /dev/null +++ b/.github/workflows/changelog.py @@ -0,0 +1,28 @@ +import os +import re +import sys + +raw_git = os.popen('git log next --since="24 hours" --pretty=format:"- %h - {USERNAME}*+%al-%an*: %s"').read() + + +def compute_username(line): + stripped = re.search(r'(?<=\*)(.*?)(?=\*)', line).group(0) + + pattern = re.compile("[$@+&?].*[$@+&?]") + if pattern.match(stripped): + stripped = re.sub("[$@+&?].*[$@+&?]", "", stripped) + stripped = re.match(r'.+?(?=-)', stripped).group(0) + else: + stripped = re.sub(r'^.*?-', "", stripped) + return "@" + stripped + + +def compile_line(line): + username = compute_username(line) + line = re.sub(r'[*].*[*]', "", line) + line = line.replace("{USERNAME}", username) + return line + + +for row in raw_git.splitlines(): + print(compile_line(row)) diff --git a/.github/workflows/create_nightly_release.yml b/.github/workflows/create_nightly_release.yml new file mode 100644 index 00000000..a4f953ac --- /dev/null +++ b/.github/workflows/create_nightly_release.yml @@ -0,0 +1,99 @@ +name: Nightly Release + +on: + schedule: + - cron: "0 0 * * *" + + workflow_dispatch: + +jobs: + check_date: + runs-on: ubuntu-latest + name: Check latest commit + outputs: + should_run: ${{ steps.should_run.outputs.should_run }} + steps: + - uses: actions/checkout@v2 + - name: print latest_commit + run: echo ${{ github.sha }} + + - name: check latest commit is less than a day + id: should_run + continue-on-error: true + run: test -z $(git rev-list --after="24 hours" ${{ github.sha }}) && echo "::set-output name=should_run::false" + build: + needs: check_date + if: ${{ needs.check_date.outputs.should_run != 'false' }} + runs-on: ubuntu-latest + steps: + - name: Get current date + id: date + run: echo "::set-output name=date::$(date +'%Y-%m-%d')" + - name: Get version date + id: version_date + run: echo "::set-output name=date::n_$(date +'%y%m%d')" + - name: Checkout + uses: actions/checkout@master + with: + fetch-depth: 0 + ref: next + submodules: true + - name: Git Sumbodule Update + run: | + git submodule update --init --recursive + - name: Build the Docker image + run: docker build -t portapack-dev -f dockerfile-nogit . --tag my-image-name:$(date +%s) + - name: Make build folder + run: mkdir ${{ github.workspace }}/build + - name: Run the Docker image + run: docker run -e VERSION_STRING=${{ steps.version_date.outputs.date }} -i -v ${{ github.workspace }}:/havoc portapack-dev + - name: Create Firmware ZIP + run: | + zip -j firmware.zip build/firmware/portapack-h1_h2-mayhem.bin && cd flashing && zip -r ../firmware.zip * + - name: Create SD Card ZIP + run: | + zip -r sdcard.zip sdcard + - name: Create changelog + run: | + CHANGELOG=$(python3 .github/workflows/changelog.py) + CHANGELOG="${CHANGELOG//'%'/'%25'}" + CHANGELOG="${CHANGELOG//$'\n'/'%0A'}" + CHANGELOG="${CHANGELOG//$'\r'/'%0D'}" + echo "::set-output name=content::$CHANGELOG" + id: changelog + - name: Create Release + id: create_release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: nightly-tag-${{ steps.date.outputs.date }} + release_name: Nightly Release - ${{ steps.date.outputs.date }} + body: | + **Nightly release - ${{ steps.date.outputs.date }}** + This build is the latest and greatest, although may not be the most stable as this is a nightly release. + ## Release notes + ### Revision (${{ steps.version_date.outputs.date }}): + ${{ steps.changelog.outputs.content }} + draft: false + prerelease: true + - name: Upload Firmware Asset + id: upload-firmware-asset + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: ./firmware.zip + asset_name: mayhem_nightly_${{ steps.version_date.outputs.date }}_FIRMWARE.zip + asset_content_type: application/zip + - name: Upload SD Card Assets + id: upload-sd-card-asset + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: ./sdcard.zip + asset_name: mayhem_nightly_${{ steps.version_date.outputs.date }}_COPY_TO_SDCARD.zip + asset_content_type: application/zip diff --git a/.gitignore b/.gitignore index 97662e15..06d8c0ab 100644 --- a/.gitignore +++ b/.gitignore @@ -39,7 +39,6 @@ *.lib # Executables -*.exe *.out *.app /firmware/baseband/*.bin diff --git a/CMakeLists.txt b/CMakeLists.txt index cf8b5706..9153ded8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,8 +25,8 @@ set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_LIST_DIR}/firmware/toolchain-arm-cortex project(portapack-h1) -#set(VERSION "") -if (NOT DEFINED VERSION) +set(VERSION "$ENV{VERSION_STRING}") +if ("$ENV{VERSION_STRING}" STREQUAL "") execute_process( COMMAND git log -n 1 --format=%h WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} @@ -38,7 +38,7 @@ if (NOT DEFINED VERSION) if (GIT_VERSION_FOUND) set(VERSION "unknown") else (GIT_VERSION_FOUND) - set(VERSION "local-${GIT_VERSION}") + set(VERSION "${GIT_VERSION}") endif (GIT_VERSION_FOUND) endif() diff --git a/README.md b/README.md index aafed603..d69ee663 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,9 @@ To support the people behind the hardware, please buy a genuine [HackRF](https:/ ## Where is the latest firmware? -The current stable release is on the [![GitHub release (latest by date)](https://img.shields.io/github/v/release/eried/portapack-mayhem?label=Releases&style=social)](https://github.com/eried/portapack-mayhem/releases/latest) page. Follow the instructions you can find in the release description. +The **latest (nightly) release** can be found [here](https://github.com/eried/portapack-mayhem/releases/). + +The current **stable release** is on the [![GitHub release (latest by date)](https://img.shields.io/github/v/release/eried/portapack-mayhem?label=Releases&style=social)](https://github.com/eried/portapack-mayhem/releases/latest) page. Follow the instructions you can find in the release description. ## Is this the newest firmware for my PortaPack? Most probably: **YES**. *If you find new features somewhere else, please [suggest](https://github.com/eried/portapack-mayhem/issues/new/choose) them*. diff --git a/firmware/application/apps/tpms_app.hpp b/firmware/application/apps/tpms_app.hpp index 648c5b49..7ccef644 100644 --- a/firmware/application/apps/tpms_app.hpp +++ b/firmware/application/apps/tpms_app.hpp @@ -136,7 +136,7 @@ private: 3, { { "315", 315000000 }, - { "434", 433920000 }, + { "433", 433920000 }, } }; diff --git a/firmware/application/main.cpp b/firmware/application/main.cpp index 59ef942c..185a905d 100755 --- a/firmware/application/main.cpp +++ b/firmware/application/main.cpp @@ -169,7 +169,7 @@ int main(void) { sdcStart(&SDCD1, nullptr); - controls_init(); + // controls_init(); // Commented out as now happens in portapack.cpp lcd_frame_sync_configure(); rtc_interrupt_enable(); diff --git a/firmware/application/portapack.cpp b/firmware/application/portapack.cpp index c4f03855..7ecfb721 100644 --- a/firmware/application/portapack.cpp +++ b/firmware/application/portapack.cpp @@ -29,6 +29,7 @@ #include "hackrf_gpio.hpp" using namespace hackrf::one; + #include "clock_manager.hpp" #include "event_m0.hpp" @@ -45,6 +46,7 @@ using asahi_kasei::ak4951::AK4951; #include "cpld_update.hpp" #include "optional.hpp" +#include "irq_controls.hpp" namespace portapack { @@ -179,18 +181,19 @@ static PortaPackModel portapack_model() { static Optional model; if( !model.is_valid() ) { - /*For the time being, it is impossible to distinguish the hardware of R1 and R2 from the software level*/ - /*At this point, I2c is not ready.*/ - //if( audio_codec_wm8731.detected() ) { - // model = PortaPackModel::R1_20150901; - //} else { - model = PortaPackModel::R2_20170522; - //} + if( audio_codec_wm8731.detected() ) { + model = PortaPackModel::R1_20150901; // H1R1 + } else { + model = PortaPackModel::R2_20170522; // H1R2, H2+ + } } return model.value(); } +//audio_codec_wm8731 = H1R1 & H2+ +//audio_codec_ak4951 = H1R2 + static audio::Codec* portapack_audio_codec() { /* I2C ready OK, Automatic recognition of audio chip */ return (audio_codec_wm8731.detected()) @@ -200,16 +203,37 @@ static audio::Codec* portapack_audio_codec() { } static const portapack::cpld::Config& portapack_cpld_config() { + const auto switches_state = get_switches_state(); + if (switches_state[(size_t)ui::KeyEvent::Up]){ + persistent_memory::set_config_cpld(1); + return portapack::cpld::rev_20170522::config; + } + if (switches_state[(size_t)ui::KeyEvent::Down]){ + persistent_memory::set_config_cpld(2); + return portapack::cpld::rev_20150901::config; + } + if (switches_state[(size_t)ui::KeyEvent::Left]){ + persistent_memory::set_config_cpld(3); + } + if (switches_state[(size_t)ui::KeyEvent::Select]){ + persistent_memory::set_config_cpld(0); + } + + + if (portapack::persistent_memory::config_cpld() == 1) { + return portapack::cpld::rev_20170522::config; + } else if (portapack::persistent_memory::config_cpld() == 2) { + return portapack::cpld::rev_20150901::config; + } return (portapack_model() == PortaPackModel::R2_20170522) - ? portapack::cpld::rev_20170522::config - : portapack::cpld::rev_20150901::config - ; + ? portapack::cpld::rev_20170522::config + : portapack::cpld::rev_20150901::config; } Backlight* backlight() { return (portapack_model() == PortaPackModel::R2_20170522) - ? static_cast(&backlight_cat4004) - : static_cast(&backlight_on_off); + ? static_cast(&backlight_cat4004) // R2_20170522 + : static_cast(&backlight_on_off); // R1_20150901 } #define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0])) @@ -318,14 +342,15 @@ bool init() { i2c0.start(i2c_config_boot_clock); - if( !portapack::cpld::update_if_necessary(portapack_cpld_config()) ) { - shutdown_base(); - return false; - } + // Keeping this here for now incase we need to revert + // if( !portapack::cpld::update_if_necessary(portapack_cpld_config()) ) { + // shutdown_base(); + // return false; + // } - if( !hackrf::cpld::load_sram() ) { - chSysHalt(); - } + // if( !hackrf::cpld::load_sram() ) { + // chSysHalt(); + // } configure_pins_portapack(); @@ -377,20 +402,33 @@ bool init() { i2c0.start(i2c_config_fast_clock); - clock_manager.set_reference_ppb(persistent_memory::correction_ppb()); + touch::adc::init(); + controls_init(); - audio::init(portapack_audio_codec()); - + clock_manager.set_reference_ppb(persistent_memory::correction_ppb()); clock_manager.enable_first_if_clock(); clock_manager.enable_second_if_clock(); clock_manager.enable_codec_clocks(); - radio::init(); - - touch::adc::init(); + radio::init(); + LPC_CREG->DMAMUX = portapack::gpdma_mux; gpdma::controller.enable(); + audio::init(portapack_audio_codec()); + + if( !portapack::cpld::update_if_necessary(portapack_cpld_config()) ) { + // If using a "2021/12 QFP100", press and hold the left button while booting. Should only need to do once. + if (portapack::persistent_memory::config_cpld() != 3){ + shutdown_base(); + return false; + } + } + + if( !hackrf::cpld::load_sram() ) { + chSysHalt(); + } + return true; } diff --git a/firmware/application/ui_navigation.hpp b/firmware/application/ui_navigation.hpp index 9cc5fa87..68723744 100644 --- a/firmware/application/ui_navigation.hpp +++ b/firmware/application/ui_navigation.hpp @@ -190,7 +190,7 @@ namespace ui void on_speaker(); void on_stealth(); void on_bias_tee(); - //void on_textentry(); + // void on_textentry(); void on_camera(); void on_title(); void refresh(); @@ -212,7 +212,7 @@ namespace ui void refresh(); private: - static constexpr auto version_string = "v1.4.4"; + // static constexpr auto version_string = "v1.4.4"; // This is commented out as we are now setting the version via ENV (VERSION_STRING=v1.0.0) NavigationView &nav_; Rectangle backdrop{ @@ -221,7 +221,7 @@ namespace ui Text version{ {2, 0, 11 * 8, 16}, - version_string}; + VERSION_STRING}; LiveDateTime ltime{ {86, 0, 19 * 8, 16}}; diff --git a/firmware/common/ak4951.cpp b/firmware/common/ak4951.cpp index d94bbb0b..1f88a3d6 100644 --- a/firmware/common/ak4951.cpp +++ b/firmware/common/ak4951.cpp @@ -115,6 +115,10 @@ void AK4951::init() { // update(Register::DigitalFilterMode); } +bool AK4951::detected() { + return reset(); +} + bool AK4951::reset() { io.audio_reset_state(true); diff --git a/firmware/common/ak4951.hpp b/firmware/common/ak4951.hpp index ea394966..3b1f9e1a 100644 --- a/firmware/common/ak4951.hpp +++ b/firmware/common/ak4951.hpp @@ -823,6 +823,8 @@ public: std::string name() const override { return "AK4951"; } + + bool detected(); void init() override; bool reset() override; diff --git a/firmware/common/portapack_persistent_memory.cpp b/firmware/common/portapack_persistent_memory.cpp index 2bee6470..0fdada7d 100644 --- a/firmware/common/portapack_persistent_memory.cpp +++ b/firmware/common/portapack_persistent_memory.cpp @@ -82,6 +82,9 @@ struct data_t { int32_t afsk_space_freq; int32_t modem_baudrate; int32_t modem_repeat; + + // Hardware + uint32_t hardware_config; // Play dead unlock uint32_t playdead_magic; @@ -254,6 +257,10 @@ bool config_splash() { return data->ui_config & (1 << 31); } +uint8_t config_cpld() { + return data->hardware_config; +} + uint32_t config_backlight_timer() { const uint32_t timer_seconds[8] = { 0, 5, 15, 30, 60, 180, 300, 600 }; return timer_seconds[data->ui_config & 7]; //first three bits, 8 possible values @@ -287,6 +294,10 @@ void set_config_splash(bool v) { data->ui_config = (data->ui_config & ~(1 << 31)) | (v << 31); } +void set_config_cpld(uint8_t i) { + data->hardware_config = i; +} + void set_config_backlight_timer(uint32_t i) { data->ui_config = (data->ui_config & ~7) | (i & 7); } diff --git a/firmware/common/portapack_persistent_memory.hpp b/firmware/common/portapack_persistent_memory.hpp index 11643bab..d04b1239 100644 --- a/firmware/common/portapack_persistent_memory.hpp +++ b/firmware/common/portapack_persistent_memory.hpp @@ -74,6 +74,9 @@ void set_playdead_sequence(const uint32_t new_value); bool stealth_mode(); void set_stealth_mode(const bool v); +uint8_t config_cpld(); +void set_config_cpld(uint8_t i); + bool config_splash(); bool hide_clock(); bool clock_with_date(); diff --git a/firmware/tools/make_icao24_db/icao24.db b/firmware/tools/make_icao24_db/icao24.db deleted file mode 100644 index 04523c90..00000000 Binary files a/firmware/tools/make_icao24_db/icao24.db and /dev/null differ diff --git a/firmware/tools/make_mids_db/mids.db b/firmware/tools/make_mids_db/mids.db deleted file mode 100644 index 82f6373d..00000000 Binary files a/firmware/tools/make_mids_db/mids.db and /dev/null differ diff --git a/flashing/Check for firmware updates.url b/flashing/Check for firmware updates.url new file mode 100644 index 00000000..bb321246 --- /dev/null +++ b/flashing/Check for firmware updates.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://github.com/eried/portapack-mayhem/releases diff --git a/flashing/How to update the firmware.url b/flashing/How to update the firmware.url new file mode 100644 index 00000000..99cd950b --- /dev/null +++ b/flashing/How to update the firmware.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://github.com/eried/portapack-mayhem/wiki/Update-firmware diff --git a/flashing/README.txt b/flashing/README.txt new file mode 100644 index 00000000..f22ea845 --- /dev/null +++ b/flashing/README.txt @@ -0,0 +1 @@ +Plug HackRF+Portapack, set it in HackRF mode, launch flash_portapack_mayhem.bat \ No newline at end of file diff --git a/flashing/dfu-util-static.exe b/flashing/dfu-util-static.exe new file mode 100644 index 00000000..fe7f8753 Binary files /dev/null and b/flashing/dfu-util-static.exe differ diff --git a/flashing/dfu_hackrf_one.bat b/flashing/dfu_hackrf_one.bat new file mode 100644 index 00000000..a6bf293b --- /dev/null +++ b/flashing/dfu_hackrf_one.bat @@ -0,0 +1,19 @@ +@echo off + +echo *** Run HackRF firmware in RAM via LPC DFU *** +echo. +echo This is used to "unbrick" your HackRF, if you are no longer able to use +echo HackRF tools to flash or operate your HackRF. +echo. +echo Connect your HackRF One to a USB port on your computer. +echo. +echo Hold down both the DFU and RESET buttons on the HackRF. +echo Then release the RESET button (closest to the edge). +echo Then release the DFU button. +echo. +pause + +echo. +dfu-util-static.exe --device 1fc9:000c --download hackrf_one_usb.dfu --reset +echo. +pause diff --git a/flashing/driver/dpinst.exe b/flashing/driver/dpinst.exe new file mode 100644 index 00000000..3efffc16 Binary files /dev/null and b/flashing/driver/dpinst.exe differ diff --git a/flashing/driver/dpinst.xml b/flashing/driver/dpinst.xml new file mode 100644 index 00000000..2e7747a7 --- /dev/null +++ b/flashing/driver/dpinst.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/flashing/driver/hackrf_one.inf b/flashing/driver/hackrf_one.inf new file mode 100644 index 00000000..cb45479f Binary files /dev/null and b/flashing/driver/hackrf_one.inf differ diff --git a/flashing/driver/hackrf_one_amd64.cat b/flashing/driver/hackrf_one_amd64.cat new file mode 100644 index 00000000..e736e11c Binary files /dev/null and b/flashing/driver/hackrf_one_amd64.cat differ diff --git a/flashing/driver/lpc_dfu.inf b/flashing/driver/lpc_dfu.inf new file mode 100644 index 00000000..d95f77c7 Binary files /dev/null and b/flashing/driver/lpc_dfu.inf differ diff --git a/flashing/driver/lpc_dfu_amd64.cat b/flashing/driver/lpc_dfu_amd64.cat new file mode 100644 index 00000000..31234fe0 Binary files /dev/null and b/flashing/driver/lpc_dfu_amd64.cat differ diff --git a/flashing/flash_hackrf_one.bat b/flashing/flash_hackrf_one.bat new file mode 100644 index 00000000..b18bafff --- /dev/null +++ b/flashing/flash_hackrf_one.bat @@ -0,0 +1,15 @@ +@echo off + +echo *** Re-flash the HackRF with HackRF firmware *** +echo. +echo Connect your HackRF One to a USB port on your computer. +echo. +echo If using a PortaPack, put the PortaPack in HackRF mode by selecting +echo the "HackRF" option from the main menu. +echo. +pause + +echo. +hackrf_update.exe hackrf_one_usb.bin +echo. +pause diff --git a/flashing/flash_portapack_mayhem.bat b/flashing/flash_portapack_mayhem.bat new file mode 100644 index 00000000..e7a68199 --- /dev/null +++ b/flashing/flash_portapack_mayhem.bat @@ -0,0 +1,15 @@ +@echo off + +echo *** Re-flash the HackRF with PortaPack firmware *** +echo. +echo Connect your HackRF One to a USB port on your computer. +echo. +echo If using a PortaPack, put the PortaPack in HackRF mode by selecting +echo the "HackRF" option from the main menu. +echo. +pause + +echo. +hackrf_update.exe portapack-h1_h2-mayhem.bin +echo. +pause diff --git a/flashing/hackrf_one_usb.bin b/flashing/hackrf_one_usb.bin new file mode 100644 index 00000000..6e7935ec Binary files /dev/null and b/flashing/hackrf_one_usb.bin differ diff --git a/flashing/hackrf_one_usb.dfu b/flashing/hackrf_one_usb.dfu new file mode 100644 index 00000000..be690312 Binary files /dev/null and b/flashing/hackrf_one_usb.dfu differ diff --git a/flashing/hackrf_update.exe b/flashing/hackrf_update.exe new file mode 100644 index 00000000..529e45f8 Binary files /dev/null and b/flashing/hackrf_update.exe differ diff --git a/sdcard/SAMPLES/README.md b/sdcard/SAMPLES/README.md new file mode 100644 index 00000000..f7af0bf0 --- /dev/null +++ b/sdcard/SAMPLES/README.md @@ -0,0 +1,11 @@ +# Files for Replay app + +Sample files below can be used with Replay app. + +See [Wiki](https://github.com/eried/portapack-mayhem/wiki/C16-format) for more info over C16 file format. + +| file | description | frequency | +| ------ | ------ | ------: | +| [HamptonBayFanOnOff.C16](HamptonBayFanOnOff.C16) | Switches Hampton Bay fan on/off. |304.175 Mhz | +| [TeslaChargePort_EU_AU.C16](TeslaChargePort_EU_AU.C16) | Opens a Tesla charge door. This version is for non-US Tesla cars operating at 433MHz. | 433.95 Mhz | +| [TeslaChargePort_US.C16](TeslaChargePort_US.C16) | Opens a Tesla charge door. This version is for US Tesla cars operating at 315MHz. |315 Mhz | diff --git a/sdcard/SAMPLES/TeslaChargePort_EU_AU.C16 b/sdcard/SAMPLES/TeslaChargePort_EU_AU.C16 new file mode 100644 index 00000000..dcd282ed Binary files /dev/null and b/sdcard/SAMPLES/TeslaChargePort_EU_AU.C16 differ diff --git a/sdcard/SAMPLES/TeslaChargePort_EU_AUS.TXT b/sdcard/SAMPLES/TeslaChargePort_EU_AU.TXT similarity index 56% rename from sdcard/SAMPLES/TeslaChargePort_EU_AUS.TXT rename to sdcard/SAMPLES/TeslaChargePort_EU_AU.TXT index c8012cc4..11696f67 100644 --- a/sdcard/SAMPLES/TeslaChargePort_EU_AUS.TXT +++ b/sdcard/SAMPLES/TeslaChargePort_EU_AU.TXT @@ -1,2 +1,2 @@ -sample_rate=600000 +sample_rate=500000 center_frequency=433950000 diff --git a/sdcard/SAMPLES/TeslaChargePort_EU_AUS.C16 b/sdcard/SAMPLES/TeslaChargePort_EU_AUS.C16 deleted file mode 100644 index ec1b23a2..00000000 Binary files a/sdcard/SAMPLES/TeslaChargePort_EU_AUS.C16 and /dev/null differ diff --git a/sdcard/SAMPLES/TeslaChargePort_US.C16 b/sdcard/SAMPLES/TeslaChargePort_US.C16 new file mode 100644 index 00000000..dcd282ed Binary files /dev/null and b/sdcard/SAMPLES/TeslaChargePort_US.C16 differ diff --git a/sdcard/SAMPLES/TeslaChargePort_US.TXT b/sdcard/SAMPLES/TeslaChargePort_US.TXT new file mode 100644 index 00000000..f21943d1 --- /dev/null +++ b/sdcard/SAMPLES/TeslaChargePort_US.TXT @@ -0,0 +1,2 @@ +sample_rate=500000 +center_frequency=315000000