Skip to content

Comments

Chime vibration patterns and 15 minute option#2227

Open
zischknall wants to merge 3 commits intoInfiniTimeOrg:mainfrom
zischknall:chime-vibration-patterns
Open

Chime vibration patterns and 15 minute option#2227
zischknall wants to merge 3 commits intoInfiniTimeOrg:mainfrom
zischknall:chime-vibration-patterns

Conversation

@zischknall
Copy link

@zischknall zischknall commented Jan 15, 2025

To combat my own time blindness I needed the option to have it vibrate every 15 minutes and additionally somehow indicate the time of the hour via the vibrations.

So I added an option for 15 minutes which was very straight-forward in the first commit and I think it has the highest chance of being merge-able. For the vibrations I changed the duration of motor activation as 35ms was very little and added a pattern of vibrations and pauses. So full hour is 4, first quarter hour is 1, half hour is 2 and 3 quarter hours is 3 vibrations.

It is still pretty archaically implemented. I think we should make it a bit more generic and make the vibration pattern (or if you don't want a pattern) configurable. But for me it's enough at the moment.

So if there is interest in something like this being added I will improve the implementation.

@github-actions
Copy link

github-actions bot commented Jan 15, 2025

Build checks have not completed. Possible reasons for this are:

  1. The checks need to be approved by a maintainer
  2. The branch has conflicts
  3. The firmware build has failed

@zischknall zischknall force-pushed the chime-vibration-patterns branch from 319311a to ac5a3cf Compare January 15, 2025 21:33
@zischknall zischknall force-pushed the chime-vibration-patterns branch from ac5a3cf to 5621869 Compare January 15, 2025 22:02
@marigoldfish
Copy link

Oh, I really like this. I have time blindness problems myself, and the half hour chimes have been valuable. I have previously wished for 15min intervals and a distinction between the half hour and hour chimes.

I will give this a run for a while and see how it works out for me!

@mark9064 mark9064 added the enhancement Enhancement to an existing app/feature label Jan 16, 2025
@mark9064
Copy link
Member

mark9064 commented Feb 9, 2025

This PR is definitely an improvement, thanks! Sorry for the slow review- the main reason is that this PR highlights a wider problem with the way access to the vibration motor is handled. One such problem with this implementation is that doing vTaskDelay inside DisplayApp blocks the event loop stopping rendering and message processing

Reworking the motor controller is going to be challenging as there quite a few things that should probably be implemented:

  • Non-blocking motor access (probably by usage of the timer task)
  • Vibration patterns
  • Motor intensity control through PWM (this allows running the vibration motor at half speed for example)

TLDR I think the functionality change here is very welcome here in InfiniTime, but unfortunately there's some tough maintenance work that needs to be done first

@marigoldfish
Copy link

marigoldfish commented Feb 9, 2025

Chiming in (heh) to say that I've found the functionality of this PR very helpful over the last couple of weeks. I've definitely been zoning out less and the only occasions I've "lost track of time" for an extended period, my watch has been in sleep mode or not on my wrist.

I did notice one minor bug, which may be part of the larger reconfiguring @mark9064 brought up: when the chime goes off, the time does not update until it is finished. So, in the most extreme scenario, if I have not woken my watch since the previous chime (for example 3:45), then it will still display that time on the watch until the vibrations of the current chime is ended (at 4:00, the watch shows 3:45 while the four chimes go off, then updates to 4:00 when chiming is complete).

But! This is a very small thing and is not in any way a deal breaker for me. This feature is very helpful for me and I hope that y'all also think it's worth doing the work to implement fully.

@zischknall
Copy link
Author

Thanks for your comments love to see people discussing this and also finding it useful. Fully agree with the motor controller needing to be reworked for this to work better. Did also not yet find the time to add a setting toggling between vibration behaviors.

@zischknall
Copy link
Author

For the first couple of weeks this worked great. But now it seems like sometimes it does not trigger. At first I thought I might just have gotten used to it but I can confirm that they have gotten unreliable after a while. Really strange...

@Perdellian
Copy link

* Vibration patterns

* Motor intensity control through PWM (this allows running the vibration motor at half speed for example)

Westminster chimes buzzes like an old grandfather clock?

sofar added a commit to sofar/InfiniTime that referenced this pull request Feb 22, 2026
Automatically switches notification status to Sleep at a configurable
start hour and back at a configurable end hour. Includes a new settings
screen with enable toggle and start/end hour controls. Disabled by
default (21:00-09:00). Also adds moon glyph to the default UI font so
it displays in the settings menu.

This feature draws on extensive community discussion across several
related PRs. The following feedback was reviewed and incorporated:

Adopted:

- "Quiet hours" naming (kieranc, PR InfiniTimeOrg#1461): renamed from "sleep setting"
  / "auto sleep" to avoid confusion with the existing sleep mode.

- Preserve notification state across transitions (Itai-Nelken, PR InfiniTimeOrg#1461):
  quiet hours now saves the user's notification status (On/Off/Sleep)
  before entering and restores it when exiting, instead of unconditionally
  forcing On. Uses transient (non-persisted) state following the existing
  bleRadioEnabled/dfuAndFsEnabledTillReboot pattern.

- Previous state was Sleep edge case (FintasticMan, PR InfiniTimeOrg#1461): if the
  previous state was already Sleep when quiet hours began, it is restored
  faithfully. FintasticMan suggested restoring to Off instead, but
  preserving the actual state is more predictable and consistent.

- Alarm overrides quiet hours (FintasticMan, PR InfiniTimeOrg#1461): when an alarm
  fires, quiet hours are exited so the alarm can wake the user. This
  ensures alarms are never silenced by scheduled quiet hours.

- Disable wrist-lower-to-sleep during sleep mode (kieranc, PR InfiniTimeOrg#2415,
  approved by NeroBurner): wrist-raise wake was already suppressed
  during sleep mode but wrist-lower-to-sleep was not, which is
  inconsistent. Moved the lower-wrist check inside the existing
  != Sleep guard per mark9064's code review suggestion to avoid a
  duplicate condition check.

- Respect explicit user choices (chmeeedalf, PR InfiniTimeOrg#2002): if a user
  manually changes notification status via QuickSettings during quiet
  hours, that works normally; the original pre-quiet-hours state is
  still restored when quiet hours end.

- Chimes suppressed during quiet hours: the existing chime handlers
  already gate on notificationStatus != Sleep, so setting Sleep during
  quiet hours suppresses chimes automatically with no additional code.

Not adopted:

- Separate auto-start/auto-stop toggles (Boteium, PR InfiniTimeOrg#1461): would let
  a user manually enter sleep early but still auto-wake. Adds UI
  complexity for a niche use case; a single toggle is simpler and aligns
  with the InfiniTime vision of "prefer solid defaults over
  customisability" (mark9064, PR InfiniTimeOrg#2230).

- Sleep Bluetooth checkbox (escoand, PR InfiniTimeOrg#1461): BLE control during sleep
  is a separate security concern that deserves its own feature, not a
  quiet hours sub-option (mark9064, PR InfiniTimeOrg#2230).

- Configurable sleep mode behaviors -- AOD, chimes, notifications, step
  tracking (JustScott, PR InfiniTimeOrg#2230): maintainer mark9064 noted that sleep
  mode means the user is sleeping, so allowing notifications/chimes/AOD
  contradicts its purpose. The author agreed this belongs in forks, not
  mainline.

- Red/dim screen during sleep (minacode/lman0, PR InfiniTimeOrg#1261): a larger UX
  change outside the scope of notification scheduling.

- Vibration priority system (minacode, PR InfiniTimeOrg#1328): a proper priority
  queue (phone > timer > alarm > notification) would be ideal for
  centralized DND management, but requires a motor controller rework
  that is a much larger effort.

- 30-minute or 15-minute granularity for quiet hours times (LinuxinaBit,
  PR InfiniTimeOrg#1461; zischknall, PR InfiniTimeOrg#2227): hour granularity is sufficient for
  scheduling sleep/wake times and keeps the UI simple.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
sofar added a commit to sofar/InfiniTime that referenced this pull request Feb 22, 2026
Automatically switches notification status to Sleep at a configurable
start hour and back at a configurable end hour. Includes a new settings
screen with enable toggle and start/end hour controls. Disabled by
default (21:00-09:00). Also adds moon glyph to the default UI font so
it displays in the settings menu.

This feature draws on extensive community discussion across several
related PRs. The following feedback was reviewed and incorporated:

Adopted:

- "Quiet hours" naming (kieranc, PR InfiniTimeOrg#1461): renamed from "sleep setting"
  / "auto sleep" to avoid confusion with the existing sleep mode.

- Preserve notification state across transitions (Itai-Nelken, PR InfiniTimeOrg#1461):
  quiet hours now saves the user's notification status (On/Off/Sleep)
  before entering and restores it when exiting, instead of unconditionally
  forcing On. Uses transient (non-persisted) state following the existing
  bleRadioEnabled/dfuAndFsEnabledTillReboot pattern.

- Previous state was Sleep edge case (FintasticMan, PR InfiniTimeOrg#1461): if the
  previous state was already Sleep when quiet hours began, it is restored
  faithfully. FintasticMan suggested restoring to Off instead, but
  preserving the actual state is more predictable and consistent.

- Alarm overrides quiet hours (FintasticMan, PR InfiniTimeOrg#1461): when an alarm
  fires, quiet hours are exited so the alarm can wake the user. This
  ensures alarms are never silenced by scheduled quiet hours.

- Disable wrist-lower-to-sleep during sleep mode (kieranc, PR InfiniTimeOrg#2415,
  approved by NeroBurner): wrist-raise wake was already suppressed
  during sleep mode but wrist-lower-to-sleep was not, which is
  inconsistent. Moved the lower-wrist check inside the existing
  != Sleep guard per mark9064's code review suggestion to avoid a
  duplicate condition check.

- Respect explicit user choices (chmeeedalf, PR InfiniTimeOrg#2002): if a user
  manually changes notification status via QuickSettings during quiet
  hours, that works normally; the original pre-quiet-hours state is
  still restored when quiet hours end.

- Chimes suppressed during quiet hours: the existing chime handlers
  already gate on notificationStatus != Sleep, so setting Sleep during
  quiet hours suppresses chimes automatically with no additional code.

Not adopted:

- Separate auto-start/auto-stop toggles (Boteium, PR InfiniTimeOrg#1461): would let
  a user manually enter sleep early but still auto-wake. Adds UI
  complexity for a niche use case; a single toggle is simpler and aligns
  with the InfiniTime vision of "prefer solid defaults over
  customisability" (mark9064, PR InfiniTimeOrg#2230).

- Sleep Bluetooth checkbox (escoand, PR InfiniTimeOrg#1461): BLE control during sleep
  is a separate security concern that deserves its own feature, not a
  quiet hours sub-option (mark9064, PR InfiniTimeOrg#2230).

- Configurable sleep mode behaviors -- AOD, chimes, notifications, step
  tracking (JustScott, PR InfiniTimeOrg#2230): maintainer mark9064 noted that sleep
  mode means the user is sleeping, so allowing notifications/chimes/AOD
  contradicts its purpose. The author agreed this belongs in forks, not
  mainline.

- Red/dim screen during sleep (minacode/lman0, PR InfiniTimeOrg#1261): a larger UX
  change outside the scope of notification scheduling.

- Vibration priority system (minacode, PR InfiniTimeOrg#1328): a proper priority
  queue (phone > timer > alarm > notification) would be ideal for
  centralized DND management, but requires a motor controller rework
  that is a much larger effort.

- 30-minute or 15-minute granularity for quiet hours times (LinuxinaBit,
  PR InfiniTimeOrg#1461; zischknall, PR InfiniTimeOrg#2227): hour granularity is sufficient for
  scheduling sleep/wake times and keeps the UI simple.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement Enhancement to an existing app/feature

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants