/** Copyright Stewart Allen -- All Rights Reserved */ import { $, h } from '../moto/webui.js'; import { api } from './api.js'; import { conf } from './conf.js'; import { space } from '../moto/space.js'; import { devices as devlist } from '../pack/devices.js'; export const device = { clone: cloneDevice, code: currentDeviceCode, get: currentDeviceName, set: selectDevice, isBelt }; export const devices = { show: showDevices, select: selectDevice, refresh: updateDeviceList, update_laser_state: updateLaserState }; function isBelt() { return api.conf.get().device.bedBelt; } function currentDeviceName() { return api.conf.get().filter[api.mode.get()]; } function currentDeviceCode() { return api.conf.get().devices[currentDeviceName()]; } function getModeDevices() { return Object.keys(devlist[ api.mode.get_lower() ]).sort(); } export function showDevices() { api.settings.sync.get().then(_showDevices); } function _showDevices() { updateDeviceList(); api.modal.show('setup'); } function updateDeviceList() { renderDevices(getModeDevices()); } function updateDeviceName(newname) { let selected = api.device.get(), devs = api.conf.get().devices; if (newname !== selected) { devs[newname] = devs[selected]; delete devs[selected]; selectDevice(newname); updateDeviceList(); } } function putLocalDevice(devicename, obj) { api.conf.get().devices[devicename] = obj; api.conf.save(); } function removeLocalDevice(devicename) { delete api.conf.get().devices[devicename]; api.conf.save(); api.settings.sync.put(); } function isLocalDevice(devicename) { return api.conf.get().devices[devicename] ? true : false; } function getSelectedDevice() { return api.device.get(); } function selectDevice(devicename) { if (isLocalDevice(devicename)) { setDeviceCode(api.conf.get().devices[devicename], devicename); } else { let code = devices[api.mode.get_lower()][devicename]; if (code) { setDeviceCode(code, devicename); } } } // only for local filters function cloneDevice() { let name = `${getSelectedDevice().replace(/\./g,' ')}`; let code = api.clone(api.conf.get().device); code.mode = api.mode.get(); if (name.toLowerCase().indexOf('my ') >= 0) { name = `${name} copy`; } else { name = `My ${name}`; } putLocalDevice(name, code); setDeviceCode(code, name); api.settings.sync.put(); } function updateLaserState() { const dev = api.conf.get().device; $('laser-on').style.display = dev.useLaser ? 'flex' : 'none'; $('laser-off').style.display = dev.useLaser ? 'flex' : 'none'; } function setDeviceCode(code, devicename) { api.event.emit('device.select', devicename); try { if (typeof(code) === 'string') code = js2o(code) || {}; let mode = api.mode.get(), lmode = mode.toLowerCase(), current = api.conf.get(), local = isLocalDevice(devicename), dev = current.device = conf.device_from_code(code,mode), dproc = current.devproc[devicename], // last process name for this device newdev = dproc === undefined, // first time device is selected predev = current.filter[mode], // previous device selection chgdev = predev !== devicename; // device is changing // fill missing device fields conf.fill_cull_once(dev, conf.defaults[lmode].d); // first time device use, add any print profiles and set to default if present if (code.profiles) { for (let profile of code.profiles) { let profname = profile.processName; // if no saved profile by that name for this mode... if (!current.sproc[mode][profname]) { console.log('adding profile', profname, 'to', mode); current.sproc[mode][profname] = profile; } // if it's a new device, seed the new profile name as last profile if (newdev && !current.devproc[devicename]) { console.log('setting default profile for new device', devicename, 'to', profname); current.devproc[devicename] = dproc = profname; } } } dev.new = false; dev.deviceName = devicename; let { platform, ui, uc } = api; ui.deviceBelt.checked = dev.bedBelt; ui.deviceRound.checked = dev.bedRound; ui.deviceOrigin.checked = dev.ctOriginCenter || dev.originCenter || dev.bedRound; ui.fwRetract.checked = dev.fwRetract; // add extruder selection buttons if (dev.extruders) { let ext = api.lists.extruders = []; dev.internal = 0; for (let i=0; i { if (newname) { updateDeviceName(newname); api.conf.save(); api.settings.sync.put(); showDevices(); } else { showDevices(); } }); }; ui.deviceExport.onclick = function(event) { const record = { version: kiri.version, device: selected, process: api.process.code(), profiles: event.altKey ? api.settings.prof() : undefined, code: devs[selected], time: Date.now() }; let exp = api.util.b64enc(record); api.device.export(exp, selected, { event, record }); }; let dedup = {}; let list_cdev = []; let list_mdev = []; devices.forEach(function(device, index) { // prevent device from appearing twice // such as local name = standard device name if (dedup[device]) { return; } dedup[device] = device; let loc = isLocalDevice(device); if (dfilter && dfilter(device) === false) { return; } if (loc) { list_mdev.push(h.option(device)); } else { list_cdev.push(h.option(device)); } }); let dev_list = $('dev-list'); h.bind(dev_list, [ h.option({ _: '-- My Devices --', disabled: true }), ...list_mdev, h.option({ _: '-- Stock Devices --', disabled: true }), ...list_cdev ]); let dev_opts = [...dev_list.options].map(o => o.innerText); dev_list.selectedIndex = dev_opts.indexOf(selected); dev_list.onchange = ev => { const seldev = dev_list.options[dev_list.selectedIndex]; selectDevice(seldev.innerText); api.platform.layout(); } selectDevice(selected); }