'use strict';
class EscDshotDirectionComponent
{
constructor(contentDiv, onLoadedCallback, motorConfig)
{
this._buttonTimeoutMs = 400;
const motorDriverQueueIntervalMs = 100;
const motorDriverStopMotorsPauseMs = 400;
this._motorDriver = new EscDshotDirectionMotorDriver(motorConfig,
motorDriverQueueIntervalMs, motorDriverStopMotorsPauseMs);
this._escProtocolIsDshot = motorConfig.escProtocolIsDshot;
this._numberOfMotors = motorConfig.numberOfMotors;
this._contentDiv = contentDiv;
this._onLoadedCallback = onLoadedCallback;
this._currentSpinningMotor = -1;
this._selectedMotor = -1;
this._motorIsSpinning = false;
this._allMotorsAreSpinning = false;
this._spinDirectionToggleIsActive = true;
this._activationButtonTimeoutId = null;
this._contentDiv.load("./components/EscDshotDirection/Body.html", () =>
{
this._initializeDialog();
});
}
static get PUSHED_BUTTON_CLASS() { return "pushed"; }
static get HIGHLIGHTED_BUTTON_CLASS() { return "highlighted"; }
static get RED_TEXT_CLASS() { return "red-text"; }
static get _BUTTON_PUSH_DOWN_EVENT_TYPE()
{
if (GUI.isCordova()) {
return "touchstart";
} else {
return "mousedown";
}
}
static get _BUTTON_RELEASE_EVENT_TYPE()
{
if (GUI.isCordova()) {
return "touchend";
} else {
return "mouseup mouseout";
}
}
_readDom()
{
this._domAgreeSafetyCheckBox = $("#escDshotDirectionDialog-safetyCheckbox");
this._domStartButton = $("#escDshotDirectionDialog-Start");
this._domStartWizardButton = $("#escDshotDirectionDialog-StartWizard");
this._domMainContentBlock = $("#escDshotDirectionDialog-MainContent");
this._domWarningContentBlock = $("#escDshotDirectionDialog-Warning");
this._domMixerImg = $("#escDshotDirectionDialog-MixerPreviewImg");
this._domMotorButtonsBlock = $("#escDshotDirectionDialog-SelectMotorButtonsWrapper");
this._domSpinDirectionWrapper = $("#escDshotDirectionDialog-CommandsWrapper");
this._domActionHint = $("#escDshotDirectionDialog-ActionHint");
this._domSpinNormalButton = $("#escDshotDirectionDialog-RotationNormal");
this._domSpinReverseButton = $("#escDshotDirectionDialog-RotationReverse");
this._domSecondHint = $("#escDshotDirectionDialog-SecondHint");
this._domSecondActionDiv = $("#escDshotDirectionDialog-SecondActionBlock");
this._domConfigErrors = $("#escDshotDirectionDialog-ConfigErrors");
this._domWrongProtocolMessage = $("#escDshotDirectionDialog-WrongProtocol");
this._domWrongMixerMessage = $("#escDshotDirectionDialog-WrongMixer");
this._domWrongFirmwareMessage = $("#escDshotDirectionDialog-WrongFirmware");
this._domWizardBlock = $("#escDshotDirectionDialog-WizardDialog");
this._domNormalDialogBlock = $("#escDshotDirectionDialog-NormalDialog");
this._domSpinningWizard = $("#escDshotDirectionDialog-SpinningWizard");
this._domSpinWizardButton = $("#escDshotDirectionDialog-SpinWizard");
this._domStopWizardButton = $("#escDshotDirectionDialog-StopWizard");
this._domWizardMotorButtonsBlock = $("#escDshotDirectionDialog-WizardMotorButtons");
this._domStartWizardBlock = $("#escDshotDirectionDialog-StartWizardBlock");
this._domStartNormalBlock = $("#escDshotDirectionDialog-StartNormalBlock");
this._topHintText = i18n.getMessage("escDshotDirectionDialog-SelectMotor");
this._releaseToStopText = i18n.getMessage("escDshotDirectionDialog-ReleaseToStop");
this._releaseButtonToStopText = i18n.getMessage("escDshotDirectionDialog-ReleaseButtonToStop");
this._normalText = i18n.getMessage("escDshotDirectionDialog-CommandNormal");
this._reverseText = i18n.getMessage("escDshotDirectionDialog-CommandReverse");
this._secondHintText = i18n.getMessage("escDshotDirectionDialog-SetDirectionHint");
}
_initializeDialog()
{
this._readDom();
this._createMotorButtons();
this._createWizardMotorButtons();
this._domSecondActionDiv.toggle(false);
i18n.localizePage();
this._resetGui();
this._domAgreeSafetyCheckBox.on("change", () => {
const enabled = this._domAgreeSafetyCheckBox.is(':checked');
this._domStartNormalBlock.toggle(enabled);
this._domStartWizardBlock.toggle(enabled);
});
this._domStartButton.on("click", () => {
this._onStartButtonClicked();
});
this._domStartWizardButton.on("click", () => {
this._onStartWizardButtonClicked();
});
this._domSpinWizardButton.on("click", () => {
this._onSpinWizardButtonClicked();
});
this._domStopWizardButton.on("click", () => {
this._onStopWizardButtonClicked();
});
const imgSrc = getMixerImageSrc(FC.MIXER_CONFIG.mixer, FC.MIXER_CONFIG.reverseMotorDir, FC.CONFIG.apiVersion);
this._domMixerImg.attr('src', imgSrc);
this._onLoadedCallback();
}
_activateNormalReverseButtons(timeoutMs)
{
this._activationButtonTimeoutId = setTimeout(() => {
this._subscribeDirectionSpinButton(this._domSpinNormalButton,
DshotCommand.dshotCommands_e.DSHOT_CMD_SPIN_DIRECTION_1, this._normalText);
this._subscribeDirectionSpinButton(this._domSpinReverseButton,
DshotCommand.dshotCommands_e.DSHOT_CMD_SPIN_DIRECTION_2, this._reverseText);
}, timeoutMs);
}
_deactivateNormalReverseButtons()
{
if (null !== this._activationButtonTimeoutId) {
clearTimeout(this._activationButtonTimeoutId);
}
this._domSpinNormalButton.off();
this._domSpinReverseButton.off();
}
_subscribeDirectionSpinButton(button, direction, buttonText)
{
button.on(EscDshotDirectionComponent._BUTTON_PUSH_DOWN_EVENT_TYPE, () => {
this._sendCurrentEscSpinDirection(direction);
this._motorIsSpinning = true;
button.text(this._releaseToStopText);
button.addClass(EscDshotDirectionComponent.HIGHLIGHTED_BUTTON_CLASS);
this._motorDriver.spinMotor(this._selectedMotor);
this._domSecondHint.html(this._releaseButtonToStopText);
this._domSecondHint.addClass(EscDshotDirectionComponent.RED_TEXT_CLASS);
});
button.on(EscDshotDirectionComponent._BUTTON_RELEASE_EVENT_TYPE, () => {
if (this._motorIsSpinning) {
button.text(buttonText);
this._motorIsSpinning = false;
button.removeClass(EscDshotDirectionComponent.HIGHLIGHTED_BUTTON_CLASS);
this._motorDriver.stopAllMotors();
this._domSecondHint.text(this._secondHintText);
this._domSecondHint.removeClass(EscDshotDirectionComponent.RED_TEXT_CLASS);
this._deactivateNormalReverseButtons();
this._activateNormalReverseButtons(this._buttonTimeoutMs);
}
});
}
_sendCurrentEscSpinDirection(direction)
{
this._motorDriver.setEscSpinDirection(this._selectedMotor, direction);
}
_createMotorButtons()
{
this._motorButtons = {};
for (let i = 0; i < this._numberOfMotors; i++) {
this._addMotorButton(i + 1, i);
}
this._addMotorButton("All", DshotCommand.ALL_MOTORS);
}
_addMotorButton(buttonText, motorIndex)
{
const button = $(``).text(buttonText);
this._domMotorButtonsBlock.append(button);
this._motorButtons[motorIndex] = button;
button.on(EscDshotDirectionComponent._BUTTON_PUSH_DOWN_EVENT_TYPE, () => {
this._domSecondActionDiv.toggle(true);
this._motorIsSpinning = true;
this._domActionHint.html(this._releaseButtonToStopText);
this._domActionHint.addClass(EscDshotDirectionComponent.RED_TEXT_CLASS);
this._changeSelectedMotor(motorIndex);
button.addClass(EscDshotDirectionComponent.HIGHLIGHTED_BUTTON_CLASS);
this._motorDriver.spinMotor(this._selectedMotor);
});
button.on(EscDshotDirectionComponent._BUTTON_RELEASE_EVENT_TYPE, () => {
if (this._motorIsSpinning) {
this._domActionHint.html(this._topHintText);
this._domActionHint.removeClass(EscDshotDirectionComponent.RED_TEXT_CLASS);
this._motorIsSpinning = false;
button.removeClass(EscDshotDirectionComponent.HIGHLIGHTED_BUTTON_CLASS);
this._motorDriver.stopAllMotors();
this._deactivateNormalReverseButtons();
this._activateNormalReverseButtons(this._buttonTimeoutMs);
}
});
}
_createWizardMotorButtons()
{
this._wizardMotorButtons = {};
for (let i = 0; i < this._numberOfMotors; i++) {
this._addWizardMotorButton(i + 1, i);
}
}
_activateWizardMotorButtons(timeoutMs)
{
this._activationButtonTimeoutId = setTimeout(() => {
for (let i = 0; i < this._numberOfMotors; i++) {
this._activateWizardMotorButton(i);
}
}, timeoutMs);
}
_deactivateWizardMotorButtons()
{
if (null !== this._activationButtonTimeoutId)
{
clearTimeout(this._activationButtonTimeoutId);
}
for (let i = 0; i < this._numberOfMotors; i++) {
const button = this._wizardMotorButtons[i];
button.off();
}
}
_addWizardMotorButton(buttonText, motorIndex)
{
const button = $(``).text(buttonText);
this._domWizardMotorButtonsBlock.append(button);
this._wizardMotorButtons[motorIndex] = button;
}
_activateWizardMotorButton(motorIndex)
{
const button = this._wizardMotorButtons[motorIndex];
button.on("click", () => {
this._wizardMotorButtonClick(button, motorIndex);
});
}
_wizardMotorButtonClick(button, motorIndex)
{
this._deactivateWizardMotorButtons();
const currentlyDown = button.hasClass(EscDshotDirectionComponent.PUSHED_BUTTON_CLASS);
if (currentlyDown) {
button.removeClass(EscDshotDirectionComponent.PUSHED_BUTTON_CLASS);
this._motorDriver.setEscSpinDirection(motorIndex, DshotCommand.dshotCommands_e.DSHOT_CMD_SPIN_DIRECTION_1);
} else {
this._motorDriver.setEscSpinDirection(motorIndex, DshotCommand.dshotCommands_e.DSHOT_CMD_SPIN_DIRECTION_2);
button.addClass(EscDshotDirectionComponent.PUSHED_BUTTON_CLASS);
}
this._activateWizardMotorButtons(this._buttonTimeoutMs);
}
_changeSelectedMotor(newIndex)
{
if (this._selectedMotor >= 0) {
this._motorButtons[this._selectedMotor].addClass(EscDshotDirectionComponent.PUSHED_BUTTON_CLASS);
}
this._selectedMotor = newIndex;
if (this._selectedMotor > -1) {
this._motorButtons[this._selectedMotor].removeClass(EscDshotDirectionComponent.PUSHED_BUTTON_CLASS);
}
}
close()
{
this._motorDriver.stopAllMotorsNow();
this._motorDriver.deactivate();
this._resetGui();
}
_resetGui()
{
this._toggleMainContent(false);
this._domStartNormalBlock.hide();
this._domStartWizardBlock.hide();
this._domAgreeSafetyCheckBox.prop('checked', false);
this._domAgreeSafetyCheckBox.trigger('change');
this._domSecondActionDiv.toggle(false);
this._changeSelectedMotor(-1);
this._checkForConfigurationErrors();
}
_checkForConfigurationErrors()
{
let anyError = false;
this._domWrongProtocolMessage.hide();
this._domWrongMixerMessage.hide();
this._domWrongFirmwareMessage.hide();
if (!this._escProtocolIsDshot) {
anyError = true;
this._domWrongProtocolMessage.show();
}
if (this._numberOfMotors <= 0) {
anyError = true;
this._domWrongMixerMessage.show();
}
if (!semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_44)) {
// if BF4.2 or older - show the error message
anyError = true;
this._domWrongFirmwareMessage.show();
}
if (anyError) {
this._domMainContentBlock.hide();
this._domWarningContentBlock.hide();
this._domStartNormalBlock.hide();
this._domStartWizardBlock.hide();
this._domConfigErrors.show();
} else {
this._domConfigErrors.hide();
}
}
_onStartButtonClicked()
{
this._toggleMainContent(true);
this._domWizardBlock.toggle(false);
this._domNormalDialogBlock.toggle(true);
this._motorDriver.activate();
}
_onStartWizardButtonClicked()
{
this._domSpinningWizard.toggle(false);
this._domSpinWizardButton.toggle(true);
this._toggleMainContent(true);
this._domWizardBlock.toggle(true);
this._domNormalDialogBlock.toggle(false);
this._motorDriver.activate();
}
_onSpinWizardButtonClicked()
{
for (let i = 0; i < this._numberOfMotors; i++) {
this._wizardMotorButtons[i].removeClass(EscDshotDirectionComponent.PUSHED_BUTTON_CLASS);
}
this._motorDriver.setEscSpinDirection(DshotCommand.ALL_MOTORS, DshotCommand.dshotCommands_e.DSHOT_CMD_SPIN_DIRECTION_1);
this._domSpinWizardButton.toggle(false);
this._domSpinningWizard.toggle(true);
this._motorDriver.spinAllMotors();
this._activateWizardMotorButtons(0);
}
_onStopWizardButtonClicked()
{
this._domSpinWizardButton.toggle(true);
this._domSpinningWizard.toggle(false);
this._motorDriver.stopAllMotorsNow();
this._deactivateWizardMotorButtons();
}
_toggleMainContent(value)
{
this._domWarningContentBlock.toggle(!value);
this._domMainContentBlock.toggle(value);
this._domConfigErrors.toggle(false);
}
}