widget_rtlsdr 0.4.0
widget_rtlsdr: ^0.4.0 copied to clipboard
Immersive, gqrx-inspired widget library for RTL-SDR on Flutter: waterfall, spectrum scope, S-meter and digit-tuner display widgets, plus adaptive panels and a distributable settings navigation (master [...]
0.4.0 #
- Added
PowerReadout: a compact numeric dBFS label (-42.3 dBFS) meant to sit right besideFrequencyReadout—RtlSdrImmersiveScreennow shows one next to the digit tuner, bound toradio.rfLevelDbfs, so the tuned frequency and how strong it's coming in read together at a glance (the same pairing gqrx shows above its spectrum view). Also exported standalone for host apps building their own layout. - Confirmed (no code change needed):
SpectrumTuner's gesture model already matches gqrx/CubicSDR exactly — tap or single-finger drag anywhere retunes, dragging a passband edge resizes the demod filter, and only a two-finger pinch changes the visible span. A single finger never zooms; seetest/spectrum_tuner_test.dart. - Confirmed (no code change needed): automatic gain control
(
GainPanel/RadioController.gainAuto/setGainAuto) and saved-station presets (PresetsPanel/PresetsController) already ship in this package and are wired into the example app's settings sections.
0.3.0 #
- Added
RtlSdrFrequencyRange: the R820T/R820T2 tuner's supported tuning range (24 MHz – 1766 MHz), the chip virtually every modern RTL-SDR dongle ships with. Neitherdriver_rtlsdrnorcore_rtlsdrenforce a hardware frequency range themselves, soFrequencyReadout,SpectrumTunerandSpectrumScopenow clamp to these bounds by default — dragging/ scrolling/stepping the digit tuner or tapping/dragging the scope can no longer ask the tuner to lock to a frequency it doesn't support. Every widget accepts its ownminHz/maxHz(orminFrequencyHz/maxFrequencyHz) to override this for a different tuner chip.RtlSdrImmersiveScreengained matchingminFrequencyHz/maxFrequencyHzconstructor parameters, threaded through to both. - Example app: added an "About" settings section identifying the app as
the official
widget_rtlsdrdemo, crediting the developer and the reason it was built.
0.2.0 #
FrequencyReadout: each digit now has a small up/down arrow button above/below it (in addition to the existing drag/scroll gesture) to step that digit's place value by ±1 — easier to hit precisely on a touchscreen than a drag gesture.- Bumped the
core_rtlsdrdependency to^0.2.0for its new Downloads/MediaStore recording and share API. RecordingPanelnow records into the real, shared Downloads folder by default (viaRecordingController.startRecordingToDownloads/startIqRecordingToDownloads, falling back automatically to the previous app-specific-storage default on Android below API 29) — passingbuildFilePath/buildIqFilePathstill records to exactly that path instead, unchanged. Each completed recording also gets a share button (Android's native share sheet).
0.1.0 #
- Bumped the
core_rtlsdrdependency from^0.0.2to^0.1.0— the tight caret constraint on a0.0.xversion could never resolve past0.0.xat all (the same class of bugcore_rtlsdr's own changelog documents happening to it withdriver_rtlsdr), so this package was silently stuck behind everycore_rtlsdrrelease since its own0.0.1. - Added raw I/Q recording controls to
RecordingPanel, alongside the existing PCM ones (independent — both can run at once), usingcore_rtlsdr0.1.0'sRecordingController.startIqRecording/stopIqRecording/isIqRecording+defaultIqRecordingPath. Both PCM and I/Q rows now also show live bytes-written (RadioController.recordingBytesWritten/iqRecordingBytesWritten). - Added
SpectrumTuner: a gqrx/CubicSDR-style combined scope + waterfall driven by one shared gesture surface — tap/drag anywhere to retune, drag either edge of the shaded passband band to resize the demod filter width live, pinch to zoom the visible span. Replaces the separately-tunedSpectrumScope/WaterfallViewpair insideRtlSdrImmersiveScreen(both widgets are still exported and usable standalone for apps that want independent scope/waterfall tuning instead). RtlSdrImmersiveScreen.tuneStepHz(previously accepted but never applied) is now actually used:SpectrumTuner's tune gesture rounds to the nearest step before callingRadioController.setFrequencyHz.- Extracted
frequencyAtFraction/fractionForFrequency(internal) so the frequency↔pixel math is shared betweenSpectrumScopeandSpectrumTunerinstead of duplicated.
0.0.1 #
- Initial release: an immersive, gqrx/CubicSDR-inspired widget library for
Android, built entirely on top of
core_rtlsdr'sChangeNotifiercontrollers (never ondriver_rtlsdr/dart:ffidirectly) — for use on a real device with an RTL-SDR dongle plugged in via USB-OTG. - Display widgets:
FrequencyReadout(odometer-style digit tuner — drag or scroll a digit to change just that place),SpectrumScope(FFT line/ fill plot with a bottom frequency axis and a shaded demod-passband overlay, tap/drag to retune),WaterfallView(scrolling spectrogram rendered as a singledrawVerticesmesh, same passband/cursor overlay as the scope),SignalMeter(dBFS bar with a squelch tick),ModeSelector(iteratesDemodMode.values, so it stays correct as driver_rtlsdr adds modes). defaultPassbandHzFor(DemodMode): default filter-bandwidth-per-mode (WFM/NFM/AM/USB/LSB) backing the passband overlay.- Control panels, one per
core_rtlsdrcontroller:GainPanel,SquelchPanel,StereoRdsPanel,RecordingPanel,ScanPanel,PresetsPanel,StatsPanel,UsbStatusBanner— each a self-containedRtlSdrPanelsection, usable standalone. - Theming via
RtlSdrTheme/RtlSdrThemeData(.dark/.light), including a configurable waterfall colormap (defaultWaterfallColormap). RtlSdrImmersiveScreen: the full instrument view (meter + tuner + scope- waterfall), with an adaptive settings button/side panel.
- Distributed settings navigation:
RtlSdrSettingsSection(a navigation-agnostic id/title/icon/builder unit) +RtlSdrSettingsScreen(drill-down subscreens on phones, master-detail split on wide screens)RtlSdrSettingSectionScreen/RtlSdrSettingsSection.pageRoutefor a host app that wants to place a section in its own navigation instead.
example/: a real Android app — the sameUsbState/UsbChannelpermission flow andNativeRtlSdrDriverwiring ascore_rtlsdr's own example, just rendered through this package's widgets instead of plain Material ones. Requires a device and a dongle to see streaming; the package's owntest/suite covers every widget host-side againstFakeRtlSdrDriver/UsbStateinstead (no hardware needed for that).- CI (
flutter analyze/flutter testfor the package and example app, a debug APK build) and a tag-triggered release workflow that also publishes to pub.flutter-io.cn.