Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
28646f1
Rebase coyote on master
voltmouse69 May 21, 2025
9a1b96e
Rework position intensity and envelope for Coyote
voltmouse69 May 25, 2025
7d94186
Merge branch 'diglet48:master' into master
voltmouse69 Jul 15, 2025
5814e29
Experiment with new Coyote algorithm
voltmouse69 Jul 15, 2025
039400f
Update Coyote algorithm (experimental)
voltmouse69 Aug 12, 2025
bba232c
Merge branch 'diglet48:master' into master
voltmouse69 Aug 12, 2025
29f849e
Merge pull request #23 from zmedlnow/master
diglet48 Aug 29, 2025
209f155
Update t-code defaults
diglet48 Aug 29, 2025
b039a4b
Add pattern system enhancement
abacaba-100 Sep 2, 2025
74b1cb5
descriptions to blank strings, not needed on this fork
abacaba-100 Sep 2, 2025
0b18f91
more string and keyword removal, non LLM fork
abacaba-100 Sep 2, 2025
e379e9f
Merge pull request #1 from abacaba-100/threephase-patterns-enhancement
abacaba-100 Sep 2, 2025
db2f19c
Process pull request #24 review issues
diglet48 Sep 2, 2025
d8a2c97
Merge pull request #24 from abacaba-100/master
diglet48 Sep 17, 2025
f216fcc
Set volume to 0 on FOC, NeoDK when media is not playing
diglet48 Sep 17, 2025
895400d
Implement wifi configuration for V4
diglet48 Sep 28, 2025
f14207a
Add firmware flash dialog for FOC-Stim v4
diglet48 Sep 30, 2025
d9fc386
Stash EMA experiment
voltmouse69 Oct 17, 2025
484c31f
Merge Coyote device support and pattern system enhancements
voltmouse69 Oct 17, 2025
964ecb8
Merge master into ema branch
voltmouse69 Oct 17, 2025
3d987ec
Coyote: anchor pulse rate to funscript pulse_frequency; apply optiona…
voltmouse69 Oct 17, 2025
2f01ef8
Coyote: keep debug prints; add pulse-generation trace and update chan…
voltmouse69 Oct 17, 2025
1608738
Coyote: add per-channel pulse queues and packet assembler. Fill ahead…
voltmouse69 Oct 17, 2025
6dd9d1c
Coyote: refactor channel-specific logic into ChannelController to eli…
voltmouse69 Oct 17, 2025
d4ec350
Coyote: fix init order — set _max_change_per_pulse before creating Ch…
voltmouse69 Oct 17, 2025
4cbcd62
Coyote: reduce duration jaggedness with fractional ms accumulator; cl…
voltmouse69 Oct 17, 2025
6a2d789
Coyote: use all funscript axes coherently. Add zero-mean micro-textur…
voltmouse69 Oct 17, 2025
685afc8
Coyote: fix queue horizon (compute end_time from live coverage); prev…
voltmouse69 Oct 17, 2025
d5c46b8
Coyote: asymmetric texture around funscript base using pulse_width. U…
voltmouse69 Oct 17, 2025
095d9f2
Coyote: map funscript pulse_frequency proportionally into each channe…
voltmouse69 Oct 17, 2025
bd93acb
Debug: add width_norm and texture mode (sym/up/down/none) to logs. UI…
voltmouse69 Oct 17, 2025
3ba16d9
Coyote UI: improve period preview. Use 2s time window with up to 400 …
voltmouse69 Oct 17, 2025
ffdf8b9
Coyote UI: make period preview useful. Draw per-channel polylines of …
voltmouse69 Oct 17, 2025
778eae9
Coyote UI: add per-channel stats to preview (current Hz, 2s avg/min/m…
voltmouse69 Oct 17, 2025
9d16d44
Coyote UI: remove the envelope/period preview entirely. Drop layout s…
voltmouse69 Oct 17, 2025
27d195f
Coyote: fix null pulses error
voltmouse69 Oct 18, 2025
f617759
Merge upstream/master - keep Coyote device settings and bleak dependency
voltmouse69 Oct 18, 2025
82f2b88
Coyote UI: improve frequency labels clarity
voltmouse69 Oct 18, 2025
d4ff362
Coyote UI: refactor settings widget
voltmouse69 Oct 18, 2025
c8945f6
Coyote: improve configurable debug logging
voltmouse69 Oct 18, 2025
c27c2a3
Coyote: update default settings
voltmouse69 Oct 18, 2025
06e3950
Coyote: improve algorithm logging
voltmouse69 Oct 18, 2025
2a7a04b
Coyote: fix shutdown race condition with algorithm.next_update_time
voltmouse69 Oct 18, 2025
acb680a
Coyote: enable new threephase motion patterns (wow!)
voltmouse69 Oct 18, 2025
986580d
Coyote: remove dead ASR envelope code
voltmouse69 Oct 18, 2025
cd0d248
Coyote: update docs
voltmouse69 Oct 18, 2025
dd555a4
Coyote: refactor code + fix wizard
voltmouse69 Oct 18, 2025
c808e77
Coyote: change log levels
voltmouse69 Oct 18, 2025
c021161
Coyote: update default freq range for A
voltmouse69 Nov 5, 2025
b14ae7c
Coyote: fix connection loop for latest Bleak
voltmouse69 Nov 5, 2025
5de4c29
Coyote: add intensity debug log
voltmouse69 Nov 5, 2025
61c598a
Coyote: make graph window configurable
voltmouse69 Nov 5, 2025
79d1069
Coyote: refactor preferences (without pyside6-uic compile)
voltmouse69 Nov 5, 2025
fc302ad
Coyote: refactor and improve config (also recompiles preferences_dial…
voltmouse69 Nov 9, 2025
fa8e9f3
Coyote: reduce default max_intensity_change_per_pulse to 1%
voltmouse69 Nov 9, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ Refer to the [wiki](https://github.com/diglet48/restim/wiki) for help.
* Stereostim (three-phase only) and other audio-based devices (Mk312, 2B, ...)
* FOC-Stim
* NeoDK (coming soon)
* Coyote 3.0 (coming soon, experimental)

## Main features

Expand Down
54 changes: 54 additions & 0 deletions designer/device_wizard/coyote_waveform_select.ui
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>WizardPageCoyote</class>
<widget class="QWizardPage" name="WizardPageCoyote">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>611</width>
<height>497</height>
</rect>
</property>
<property name="windowTitle">
<string>WizardPage</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QRadioButton" name="three_phase_radio">
<property name="text">
<string>Three-phase</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;
&lt;p&gt;A = left&lt;br/&gt;B = right&lt;br/&gt;C = neutral&lt;/p&gt;
&lt;p&gt;Connect A- and B- to a shared common electrode (e.g. a conductive rubber loop).&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>
23 changes: 15 additions & 8 deletions designer/device_wizard/type_select.ui
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,21 @@
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QRadioButton" name="neostim_radio">
<property name="text">
<string>NeoStim</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QRadioButton" name="coyote_radio">
<property name="text">
<string>Coyote 3</string>
</property>
</widget>
</item>
<item row="4" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
Expand All @@ -47,15 +61,8 @@
</property>
</spacer>
</item>
<item row="2" column="0">
<widget class="QRadioButton" name="neostim_radio">
<property name="text">
<string>NeoStim</string>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>
</ui>
11 changes: 11 additions & 0 deletions designer/mainwindow.ui
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,11 @@
<string>Carrier settings</string>
</attribute>
</widget>
<widget class="CoyoteSettingsWidget" name="tab_coyote">
<attribute name="title">
<string>Coyote</string>
</attribute>
</widget>
<widget class="PulseSettingsWidget" name="tab_pulse_settings">
<attribute name="title">
<string>Pulse settings</string>
Expand Down Expand Up @@ -486,6 +491,12 @@
<header>qt_ui/three_phase_settings_widget.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>CoyoteSettingsWidget</class>
<extends>QWidget</extends>
<header>qt_ui/coyote_settings_widget.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>PulseSettingsWidget</class>
<extends>QWidget</extends>
Expand Down
202 changes: 202 additions & 0 deletions designer/preferencesdialog.ui
Original file line number Diff line number Diff line change
Expand Up @@ -612,6 +612,208 @@
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_coyote">
<attribute name="title">
<string>Coyote</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_coyote">
<item>
<widget class="QGroupBox" name="groupBox_coyote_params">
<property name="title">
<string>Device</string>
</property>
<layout class="QFormLayout" name="formLayout_coyote_params">
<item row="0" column="0">
<widget class="QLabel" name="label_coyote_channel_a_limit">
<property name="text">
<string>Channel A Limit</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="coyote_channel_a_limit">
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>200</number>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_coyote_channel_b_limit">
<property name="text">
<string>Channel B Limit</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="coyote_channel_b_limit">
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>200</number>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_coyote_channel_a_freq_balance">
<property name="text">
<string>Channel A Freq Balance</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QSpinBox" name="coyote_channel_a_freq_balance">
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>255</number>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_coyote_channel_b_freq_balance">
<property name="text">
<string>Channel B Freq Balance</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QSpinBox" name="coyote_channel_b_freq_balance">
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>255</number>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_coyote_channel_a_intensity_balance">
<property name="text">
<string>Channel A Intensity Balance</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QSpinBox" name="coyote_channel_a_intensity_balance">
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>255</number>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_coyote_channel_b_intensity_balance">
<property name="text">
<string>Channel B Intensity Balance</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QSpinBox" name="coyote_channel_b_intensity_balance">
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>255</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_coyote_algorithm">
<property name="title">
<string>Algorithm</string>
</property>
<layout class="QFormLayout" name="formLayout_coyote_algorithm">
<item row="0" column="0">
<widget class="QLabel" name="label_coyote_max_intensity_change_per_pulse">
<property name="text">
<string>Max Intensity Change per Pulse (%)</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QDoubleSpinBox" name="coyote_max_intensity_change_per_pulse">
<property name="decimals">
<number>1</number>
</property>
<property name="minimum">
<double>0.0</double>
</property>
<property name="maximum">
<double>100.0</double>
</property>
<property name="singleStep">
<double>0.1</double>
</property>
<property name="value">
<double>3.0</double>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_coyote_display">
<property name="title">
<string>Display</string>
</property>
<layout class="QFormLayout" name="formLayout_coyote_display">
<item row="0" column="0">
<widget class="QLabel" name="label_coyote_graph_window">
<property name="text">
<string>Graph Window (s)</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QDoubleSpinBox" name="coyote_graph_window">
<property name="decimals">
<number>1</number>
</property>
<property name="minimum">
<double>0.1</double>
</property>
<property name="maximum">
<double>10.0</double>
</property>
<property name="singleStep">
<double>0.1</double>
</property>
<property name="value">
<double>3.0</double>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_coyote_debug_logging">
<property name="text">
<string>Debug Logging</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QCheckBox" name="coyote_debug_logging">
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_media_settings">
<attribute name="title">
<string>Media sync</string>
Expand Down
Loading