'use strict';
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
let timing;
class Timing {
    constructor() {
        this.data = {};
        this.fromArduino = {
            'c': 'cam',
            '3': 'cam2',
            '4': 'cams',
            'b': 'black',
            'p': 'proj',
            'w': 'proj2',
            'x': 'projs'
        };
        this.fromCmd = {
            'CF': 'cam',
            'CB': 'cam',
            'BF': 'black',
            'BB': 'black',
            'C2F': 'cam2',
            'C2B': 'cam2',
            'CCF': 'cams',
            'CCB': 'cams',
            'CFCB': 'cams',
            'CBCF': 'cams',
            'PF': 'proj',
            'PB': 'proj',
            'P2F': 'proj2',
            'P2B': 'proj2',
            'PPF': 'projs',
            'PPB': 'projs',
            'PFPB': 'projs',
            'PBPF': 'projs'
        };
    }
    init() {
        this.listen();
    }
    listen() {
        ipcRenderer.on('timing', this.timing.bind(this));
    }
    timing(event, arg) {
        if (typeof arg.c !== 'undefined') {
            this.update(arg.c, parseInt(arg.ms), true);
        }
    }
    reset(profile) {
        const keys = Object.keys(profile);
        const cmds = Object.keys(cfg.cmd);
        let cam;
        let proj;
        let pad;
        for (let key of keys) {
            if (key === 'label') {
                continue;
            }
            else if (key === 'cam') {
                cam = 0;
                cam += profile[key].time;
                cam += profile[key].delay;
                cam += profile[key].momentary;
                pad = 0;
                if (typeof profile['black'] !== 'undefined' && typeof profile['black'].before !== 'undefined' && typeof profile['black'].after !== 'undefined') {
                    pad = (profile['black'].before + profile['black'].after);
                }
                this.data['cam'] = cam;
                this.data['cam2'] = cam;
                this.data['cams'] = cam;
                this.data['black'] = cam + pad;
                this.updateUI('#cam_time', cam);
            }
            else if (key === 'proj') {
                proj = 0;
                proj += profile[key].time;
                proj += profile[key].delay;
                proj += profile[key].momentary;
                this.data['proj'] = proj;
                this.data['proj2'] = proj;
                this.data['projs'] = proj;
                this.updateUI('#proj_time', proj);
            }
        }
        log.info('Timing reset');
    }
    restore(timing) {
        for (let key in timing) {
            this.data[key] = timing[key];
            //log.info(`Timing [${key}] restored to ${timing[key]}`);
        }
    }
    //update with rolling average
    update(c, ms, force = false) {
        let cmd = this.fromArduino[c];
        let id;
        //log.info(c)
        //log.info(cmd)
        if (typeof cmd !== 'undefined' && typeof this.data[cmd] !== 'undefined') {
            if (force) {
                log.info(`Forcing update of timing, ${ms}`);
                this.data[cmd] = ms;
            }
            else {
                this.data[cmd] = Math.round((this.data[cmd] + ms) / 2);
            }
            id = `#${cmd}_time`;
            this.updateUI(id, this.data[cmd]);
        }
        else if (typeof cmd !== 'undefined' && force) {
            //first update
            setTimeout(function () {
                log.info(`Forcing update of timing, ${ms}`);
                this.data[cmd] = ms;
                id = `#${cmd}_time`;
                this.updateUI(id, this.data[cmd]);
            }.bind(this), 5000);
        }
    }
    updateUI(id, ms) {
        if ($(id).length) {
            $(id).val(ms);
        }
    }
    //get current value
    get(c) {
        const cmd = this.fromCmd[c];
        if (typeof cmd !== 'undefined' && typeof this.data[cmd] !== 'undefined') {
            return this.data[cmd];
        }
        return 0;
    }
    store() {
        return __awaiter(this, void 0, void 0, function* () {
            try {
                yield ipcRenderer.invoke('profile', { timing: this.data });
            }
            catch (err) {
                log.error(err);
            }
        });
    }
}
timing = new Timing();
module.exports = timing;
//# sourceMappingURL=timing.js.map