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

Roland DJ-505: Use new ControlIndicator COs for blinking lights #4159

Merged
merged 2 commits into from
Aug 2, 2021

Conversation

Holzhaus
Copy link
Member

@Holzhaus Holzhaus commented Jul 29, 2021

Based on #4157. Didn't test on real hardware yet, will do once the other PR is merged. Tested, works.

This should make all blinking LEDs that use the same interval light up at the same time, not shifted depending on when the timer was created.

@coveralls
Copy link

coveralls commented Jul 29, 2021

Pull Request Test Coverage Report for Build 1087482160

  • 0 of 0 changed or added relevant lines in 0 files are covered.
  • No unchanged relevant lines lost coverage.
  • Overall coverage increased (+0.02%) to 26.027%

Totals Coverage Status
Change from base Build 1087078133: 0.02%
Covered Lines: 20015
Relevant Lines: 76902

💛 - Coveralls

@Swiftb0y
Copy link
Member

@Holzhaus could you rebase now that the prerequisite has been merged?

@Holzhaus Holzhaus marked this pull request as ready for review August 1, 2021 14:12
@Holzhaus
Copy link
Member Author

Holzhaus commented Aug 1, 2021

@Holzhaus could you rebase now that the prerequisite has been merged?

Done.

@Holzhaus
Copy link
Member Author

Holzhaus commented Aug 1, 2021

Now they are actually in sync. Here's an explicit leader track that is stopped and not on the cue point. Before, they were not blinking at the same time, despite their interval being the same.
cue_and_leader

Copy link
Member

@Swiftb0y Swiftb0y left a comment

Choose a reason for hiding this comment

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

Thanks, small nitpick, LGTM otherwise.

Comment on lines +1645 to +1653
this.connections[2] = engine.makeConnection("[Master]", "indicator_250millis", function(value, _group, _control) {
var colorValue = this.colorMapper.getValueForNearestColor(
engine.getValue(this.group, this.colorKey));
if (value) {
this.send(colorValue);
} else {
this.send(colorValue + DJ505.PadColor.DIM_MODIFIER);
}
}.bind(this));
Copy link
Member

Choose a reason for hiding this comment

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

Now that we have ES7 support, we should phase out the function expression + .bind(this) pattern and use arrow functions instead IMO.

Copy link
Member Author

Choose a reason for hiding this comment

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

Arrow functions are harder to read IMHO, but that aside, when I apply this patch:

+++ b/res/controllers/Roland_DJ-505-scripts.js
@@ -1642,7 +1642,7 @@ DJ505.SavedLoopMode = function(deck, offset) {
         output: function(value, _group, _control) {
             this.stopBlinking();
             if (value === 2) {
-                this.connections[2] = engine.makeConnection("[Master]", "indicator_250millis", function(value, _group, _control) {
+                this.connections[2] = engine.makeConnection("[Master]", "indicator_250millis", (value, _group, _control) => {
                     var colorValue = this.colorMapper.getValueForNearestColor(
                         engine.getValue(this.group, this.colorKey));
                     if (value) {
@@ -1650,7 +1650,7 @@ DJ505.SavedLoopMode = function(deck, offset) {
                     } else {
                         this.send(colorValue + DJ505.PadColor.DIM_MODIFIER);
                     }
-                }.bind(this));
+                });
             } else if (value === 1) {
                 var colorValue = this.colorMapper.getValueForNearestColor(
                     engine.getValue(this.group, this.colorKey));

I get:

Uncaught exception at line 1649 in file file:///home/jan/Projects/mixxx/res/controllers/Roland_DJ-505-scripts.js.

Exception:
  TypeError: Property 'send' of object [object Object] is not a function

Backtrace:
@file:///home/jan/Projects/mixxx/res/controllers/Roland_DJ-505-scripts.js:1649

Copy link
Member

Choose a reason for hiding this comment

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

Thats strange. I'll try to reproduce.

Copy link
Member

@Swiftb0y Swiftb0y Aug 2, 2021

Choose a reason for hiding this comment

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

Arrow functions are harder to read IMHO

I disagree, they're just like closures from most other functions (C++ lambdas, Rust Fn, etc). And they get rid of the .bind(this) that most people without indepth JS knowledge don't understand.

Copy link
Member Author

Choose a reason for hiding this comment

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

Arrow functions are harder to read IMHO

I disagree, they're just like closures from most other functions (C++ lambdas, Rust Fn, etc). And they get rid of the .bind(this) that most people without indepth JS knowledge don't understand.

I'd argue that people without indepth JS knowledge wouldn't even recognize that foo => bar is a function. I think function(foo) { return bar; } is much clearer to a beginner. Just my 2 cents.

Copy link
Member

Choose a reason for hiding this comment

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

it depends, I think function expressions are being thought quite early now especially with the rising popularity of functional programming and APIs that use callbacks.

Copy link
Member

Choose a reason for hiding this comment

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

I tried to reproduce the issue but I was unable to:

let Foo = function () {
    components.Button.call(this);
}
Foo.prototype = new components.Button({
    init: function() {
        engine.makeConnection("[Channel1]", "play", (value, group, control) => {
            print(typeof this.send);
        });
    }
});

var MyController = new Foo();

Obviously the example is a bit atypical but the point is the same.

Copy link
Member

@Swiftb0y Swiftb0y Aug 2, 2021

Choose a reason for hiding this comment

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

I don't really care if its an arrow function or a plain old function expression in this case. This is just a controller mapping after all. Though I'd like to establish the use of arrow functions for any new code in the future with the ES6 rewrite of components JS.

Copy link
Member Author

Choose a reason for hiding this comment

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

Ok, let's just merge this then, and I'll try to make a PR to use arrow functions later.

@Swiftb0y Swiftb0y mentioned this pull request Aug 2, 2021
Copy link
Member

@Swiftb0y Swiftb0y left a comment

Choose a reason for hiding this comment

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

LGTM.
Also, it would be great if you could take care of documenting the ControlIndicator COs in the manual.

@Swiftb0y Swiftb0y merged commit 8d89f2e into mixxxdj:main Aug 2, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants