-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.js
151 lines (129 loc) · 4.38 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
149
150
151
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;
let packageManager;
let deviceManager;
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');
packageManager = new upyPackage.PackageManager();
deviceManager = new upyPackage.DeviceManager();
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 (event, searchTerm) => {
try {
let packages = await packageManager.findPackages(searchTerm);
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 (event) => {
try {
// Pass ARDUINO_VID to filter for Arduino boards
return await deviceManager.getConnectedDevices();
} catch (error) {
console.error('Failed to fetch boards:', error);
return [];
}
});
ipcMain.handle('install-package', async (event, aPackage, serialPort, compileFiles, overwriteExisting) => {
// Update the package manager settings based on the user input
packageManager.compileFiles = compileFiles;
packageManager.overwriteExisting = overwriteExisting;
try {
const selectedBoard = await deviceManager.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;
}
};