-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.js
148 lines (126 loc) · 4.31 KB
/
main.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
if (require('electron-squirrel-startup')) return;
const { app, BrowserWindow, ipcMain, shell } = require('electron');
const path = require('path');
// Handle events from windows squirrel installer
if (process.platform === "win32" && handleSquirrelEvent()) {
// squirrel event handled and app will exit in 1000ms, so don't do anything else
return;
}
const { updateElectronApp } = require('update-electron-app')
updateElectronApp()
let mainWindow;
let upyPackage;
const ARDUINO_VID = 0x2341;
function createWindow() {
mainWindow = new BrowserWindow({
width: 800,
height: 800,
minWidth: 600,
minHeight: 600,
webPreferences: {
preload: path.join(__dirname, 'preload.js'), // Preload script for contextBridge
nodeIntegration: false,
contextIsolation: true
}
});
mainWindow.loadFile('index.html');
mainWindow.webContents.setWindowOpenHandler(({ url }) => {
shell.openExternal(url);
});
}
app.on('ready', async() => {
// Load the PackageManager class from the upy-package module
upyPackage = await import('upy-package');
createWindow();
});
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
app.quit();
}
});
app.on('activate', () => {
if (BrowserWindow.getAllWindows().length === 0) {
createWindow();
}
});
ipcMain.handle('get-packages', async () => {
const packageManager = new upyPackage.PackageManager();
try {
const packages = await packageManager.getPackageList();
return { success: true, data: packages };
} catch (error) {
console.error('Failed to fetch packages:', error);
return { success: false, error: error.message };
}
});
ipcMain.handle('get-boards', async () => {
const boardManager = new upyPackage.DeviceManager();
try {
// Pass ARDUINO_VID to filter for Arduino boards
return await boardManager.getConnectedDevices();
} catch (error) {
console.error('Failed to fetch boards:', error);
return [];
}
});
ipcMain.handle('install-package', async (event, aPackage, serialPort, compileFiles, overwriteExisting) => {
const packageManager = new upyPackage.PackageManager(compileFiles, overwriteExisting);
const boardManager = new upyPackage.DeviceManager();
try {
const selectedBoard = await boardManager.getConnectedBoardByPort(serialPort);
if(!selectedBoard) {
throw new Error(`No board found on port ${serialPort}`);
}
if(!aPackage.name && aPackage.url) {
await packageManager.installPackageFromURL(aPackage.url, selectedBoard);
} else {
await packageManager.installPackage(aPackage, selectedBoard);
}
return { success: true };
} catch (error) {
let packageDesignator = aPackage.name || aPackage.url;
console.error(`Failed to install package ${packageDesignator}:`, error);
return { success: false, error: error.message };
}
});
// Handle auto updater events
function handleSquirrelEvent() {
if (process.argv.length === 1) {
return false;
}
const ChildProcess = require('child_process');
const appFolder = path.resolve(process.execPath, '..');
const rootAtomFolder = path.resolve(appFolder, '..');
const updateDotExe = path.resolve(path.join(rootAtomFolder, 'Update.exe'));
const exeName = path.basename(process.execPath);
const spawn = function (command, args) {
let spawnedProcess, error;
try {
spawnedProcess = ChildProcess.spawn(command, args, { detached: true });
} catch (error) { }
return spawnedProcess;
};
const spawnUpdate = function (args) {
return spawn(updateDotExe, args);
};
const squirrelEvent = process.argv[1];
switch (squirrelEvent) {
case '--squirrel-install':
case '--squirrel-updated':
// Install desktop and start menu shortcuts
spawnUpdate(['--createShortcut', exeName]);
setTimeout(app.quit, 1000);
return true;
case '--squirrel-uninstall':
// Remove desktop and start menu shortcuts
spawnUpdate(['--removeShortcut', exeName]);
setTimeout(app.quit, 1000);
return true;
case '--squirrel-obsolete':
// This is called on the outgoing version of your app before
// we update to the new version - it's the opposite of
// --squirrel-updated
app.quit();
return true;
}
};