import { app, BrowserWindow, ipcMain, IpcMainEvent } from 'electron';
import path from 'path';
import * as sqlite3 from 'sqlite3';
const createWindow = () => {
const win = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
allowRunningInsecureContent: false,
contextIsolation: true,
enableRemoteModule: false,
nodeIntegration: false,
nodeIntegrationInWorker: false,
preload: path.join(app.getAppPath(), 'preload.js'),
},
});
win.loadFile(path.join(app.getAppPath(), 'index.html'));
win.on('closed', () => {
win = null;
});
};
// DB操作を追記
ipcMain.handle('connectTest', async () =>{
console.log('-- connection starts --');
const db = new sqlite3.Database('database.sqlite3');
db.serialize(function() {
db.run("CREATE TABLE lorem (info TEXT)");
let stmt = db.prepare("INSERT INTO lorem VALUES (?)");
for (let i = 0; i < 10; i++) {
stmt.run("Ipsum " + i);
}
stmt.finalize();
db.each("SELECT rowid AS id, info FROM lorem", function(err, row) {
console.log(row.id + ": " + row.info);
});
});
db.close();
console.log('-- It worked --');
});
これを IPC 通信を用いて renderer プロセスから呼び出してやれば良いわけです。
ここに来てついに React の出番となります。
preload にて定義した API のelectronIpcInvoke を呼び出します。
import React from 'react';
import ReactDOM from 'react-dom';
import './config/api.interface';
function btnClick(e):void {
window.api.electronIpcInvoke('connectTest','');
}
const container = document.getElementById('contents');
ReactDOM.render(
, container);
これで Connect ボタンをクリックすると IPC 通信で main プロセスの connectTest を呼び出して、データベースに接続・操作を行います。
この状態でビルド、実行してボタンをクリックした際に以下のように表示されれば成功です。
$ npm start
> electron ./dist/main.js
-- connection starts --
-- It worked --
1: Ipsum 0
2: Ipsum 1
3: Ipsum 2
4: Ipsum 3
5: Ipsum 4
6: Ipsum 5
7: Ipsum 6
8: Ipsum 7
9: Ipsum 8
10: Ipsum 9
TS1219: Experimental support for decorators is a feature that is subject to change in a future release. Set the 'experimentalDecorators' option in your 'tsconfig' or 'jsconfig' to remove this warning.
お好きなエディタで設定ファイルを開いて該当箇所のコメントアウトを削除してください。
$ vim tsconfig.json
/* Experimental Options */
"experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
これによって得られた情報を無線で送信すれば盗難車の追跡にも利用できますし、受信データを記録媒体に書き残し、ケイデンスセンサ等の補助的なデータを付与して FIT ファイル形式にエンコーディングしてやれば、サイクルコンピュータ(サイコン)替わりにライド情報を記録する装置を自作することも難しくはありません。
MicroSDカードを FAT Format でフォーマットすると AE-MICRO-SD-DIP を用いてマイコンから読み書きできるようになりますので、Arduino IDE の Files > Examples > SD > ReadWrite からサンプルスケッチを読み込み、ファイル書き込み部分に GPS モジュールの出力を入れると簡単に実装できます。
今回、使用したのは以下のスケッチです。
#include
#include
#include
#include
SoftwareSerial mySerial(9, 10); // RX, TX
TinyGPSPlus gps;
void setup() {
Serial.begin(57600);
mySerial.begin(9600); // Open serial communications and wait for port to open:
while (!mySerial) {
Serial.print("waiting for serial port to connect");
}
Serial.print("Initializing SD card...");
if (!SD.begin(4)) {
Serial.println("initialization failed!");
while (1);
}
Serial.println("initialization done.");
}
void loop() {
if (mySerial.available()) {
gps.encode(mySerial.read());
if (gps.location.isUpdated())
{
// open the file. note that only one file can be open at a time,
// so you have to close this one before opening another.
File myFile = SD.open("test.txt", FILE_WRITE);
// if the file opened okay, write to it:
if (myFile) {
// timestamp
myFile.print(gps.date.year());
myFile.print(',');
myFile.print(gps.date.month());
myFile.print(',');
myFile.print(gps.date.day());
myFile.print(',');
myFile.print(gps.time.value());
myFile.print(',');
// location
myFile.print(gps.location.lat(), 6);
myFile.print(',');
myFile.print(gps.location.lng(), 6);
myFile.print(',');
myFile.print(gps.altitude.meters(), 6);
myFile.print(',');
// ground speed
myFile.print(gps.speed.mps());//in meters per second (double)
myFile.print(',');
myFile.print(gps.speed.mph());//in miles per hour (double)
myFile.print(',');
myFile.print(gps.speed.kmph());// in kilometers per hour (double)
myFile.print(',');
// satellite
myFile.print(gps.satellites.value()); // Number of satellites in use (u32)
myFile.println();
myFile.close(); // close the file:
} else {
// if the file didn't open, print an error:
Serial.println("error opening test.txt");
}
}
}
}