Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Authenticity joke #102

Closed
wants to merge 10 commits into from
Closed

Authenticity joke #102

wants to merge 10 commits into from

Conversation

wryun
Copy link
Contributor

@wryun wryun commented Oct 18, 2022

Holding the alarm button down on the simple clock face displays CASIO, then animates to SENSOR, then animates to HACKED, then all normal display is flipped (read the digits upside down, but in original direction - i.e. RTL).

Can reverse flip by holding down again up until CASIO (but not all the way to HACKED).

Holding the alarm button down on the simple clock face displays
CASIO, then animates to SENSOR.
@wryun
Copy link
Contributor Author

wryun commented Oct 18, 2022

Sort of legit, but I didn't bother documenting my library function :)

Casio -> Sensor -> Hacked

If you get to 'Hacked', everything is rotated and has to be read
RTL upside down.
@wryun wryun force-pushed the authenticity-joke branch from bdff30b to dba9719 Compare October 18, 2022 23:10
@wryun
Copy link
Contributor Author

wryun commented Dec 15, 2022

My current plan for this is:

  • do some more cleanups to the watch display stuff
  • add a proper state machine
  • either use a define to enable it, or simply have an entirely different face
  • make the sequence of displayed words set via a const array (prob default to [SENSOR, HACKED]) to avoid the copyright issues with using Casio

@joeycastillo
Copy link
Owner

I'm so sorry I've dawdled on reviewing this PR, but I have a few concerns.

First I'm sad to say that I really don't think I can merge anything that puts the word Casio on the screen. I get that this is a joke, but Casio has lawyers and lawyers aren't paid for their sense of humor. This would be using a trademarked term in a way that authentic devices use to signal authenticity, and while I get that you're using it to joke about inauthenticity, I fear that the cease-and-desist letter would come to me. 😬

If we resolve that and decide on a different word (even just “HACKED”), I would definitely prefer to do this via a different watch face, just because I'm hesitant to bake an easter egg into the default watch face that ships with everyone's board. If someone wants to opt in to the easter egg that's great, but if we put it in by default, it's an additional support burden to either document the behavior so it's known, or explain the behavior to folks who encounter it unexpectedly. Especially if it causes the characters to become inverted. When I was testing that freaked me out, and I fear folks would see that as their watch being broken if they're not in on the joke.

Finally: I'm really hesitant about putting the watch_display_string_morph function in watch_private_display.c. It's just that that's the lowest level of the support libraries, below Movement itself, and I'd like the stuff that lives way down there to be as simple as possible. Having said that I do like your idea of splitting watch_convert_char_to_segdata out of watch_display_character; I would be open to making that a public API, so that you could move the display_string_morph function into your watch face's code, fetch the segment data from watch_convert_char_to_segdata, and perform the animation higher up in the stack.

Hope this helps and again I'm sorry for my trepidation; the morph effect looks hella cool, but the more core to the user and developer experience a thing is, the more I want to favor clarity and simplicity over the cool factor.

@wryun
Copy link
Contributor Author

wryun commented Dec 15, 2022

👍 all these are reasonable concerns. I'll look into cleaning this up in the way you've suggested.

@wryun wryun force-pushed the authenticity-joke branch from 240471f to 9f0eb47 Compare January 8, 2023 04:10
@wryun
Copy link
Contributor Author

wryun commented Jan 8, 2023

So, I've pushed it a bit more in the direction you suggested, but haven't yet moved it to a completely separate face, as I thought I'd run the '#ifdef' version past you. Please don't feel like you have to review this with urgency, or at all! I will not be offended.

Issues:

  • I didn't want to make a copy of simple_clock_face with the easter egg because I'd prefer not to have to keep it up to date with clock face changes. I've instead tried to make the '#ifdef' as clean a cut as I could.
  • In some ways, this might be nice as an entirely separate face (easter_egg_face?) which could be entered from the simple_clock_face if it existed, but this would entail a bunch of unnecessary refactoring.
  • I've moved morph out at your suggestion, but I'm not sure I like it. To avoid knowing too much about the details of segdata, I've made not only convert_segdata but also display_segment public. Regardless, this feels like very low level stuff. I could just make a copy of display_segment, but then I feel like I'm just demonstrating that we really shouldn't have access to segdata (at least keeping display_segment out I don't have to know the full details...). One alternative would be to expose display_segdata instead, at the cost of additional unnecessary segment writes (i.e. I'd have to set all segments each time, rather than just the necessary one).
  • I've left display_invert in, because, well, there's no way to do that other than at a low level. The gist of your comment seemed to be that I should just remove the display inversion, but since you didn't explicitly say so ;)

// If there's more than one string in the easter egg array, after completion
// the display will 'flip' all the characters. To undo this, start the easter
// egg again (but don't let it complete).
#define EASTER_EGG {" SENSOR ", " HACKED"}
Copy link
Contributor Author

@wryun wryun Jan 8, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • disable before merge

@@ -84,6 +84,12 @@ void watch_clear_display(void);
*/
void watch_display_string(char *string, uint8_t position);

void watch_display_segment(uint8_t position, uint8_t bit_pos, bool on);
Copy link
Contributor Author

@wryun wryun Jan 8, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • document before merge (left for now since PR is in draft and it's unclear if we want this stuff in a "public" API)

@wryun
Copy link
Contributor Author

wryun commented Sep 16, 2023

I still run this on my watch, but every now and again it seems to hang with hacked on the screen and I need to press button to get out. Almost a feature, right? I think this is to do with some weird interaction between accidentally holding the button down (it's the one close to the wrist...) and sleep mode.

Also, the seconds no longer invert on the clock since I last updated from main. Some optimisation that I haven't actually looked into, but probably an easy fix.

@joeycastillo
Copy link
Owner

Heyo! So I'm trying to tame the pull request situation and I'm afraid I'm going to have to close this one. Playing with the authenticity mark feels too spicy for my taste. Still it looks great, it's rad that you did it, and thanks for contributing! I'm afraid I just can't put it in main.

@wryun
Copy link
Contributor Author

wryun commented Nov 18, 2023

Aw :( But it doesn't say Casio any more, just sensor!

Is it worth raising the refactor of the display code as a separate PR, as this will make it easier to carry my commit in my own repo?

@WesleyAC
Copy link
Collaborator

@wryun one thought i had when i was working on #321 is that it should be possible to make a "proxy" face that calls out to another face except in a particular case — giving that a shot might make it easier to maintain, and would also mean people could use it on any face, not just the default clock face.

Still would be up to @joeycastillo, i can understand not wanting to merge something related to the authenticity function, but perhaps something more generic than that would be acceptable, and that approach could be useful for some other things as well, even if it doesn't get merged as something that looks like this (i'm imagining a face that lets people rebind buttons on any other face, for instance, or more complex navigation UIs built as a single face to make them easier to iterate on)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants