Study & Project ✏️/electron 🐣

[라즈베리파이 크로스컴파일] electron을 이용한 앱 개발일지

JM 2022. 1. 18. 18:39
반응형

ㄷㄷㄷㅈ

긴 스토리의 서막일지,

더 큰 건물을 위한 초석 일지 잘 모르겠다.

DNC개발을 하기 위해서 SerialPort 개발과

raspberryPi4에 크로스 컴파일까지 생각하고

기초적인 부분을 준비하기 위해서 꽤나 긴 시간이 걸렸다.

 

기본적인 ipc통신과 화면 navigation, renderer에서 main.js와의 통신 방식까지

아주 기초적인 방식의 부분만 구현해보겠다.

 

라즈베리파이에서 돌릴 수 있게 만드는 게 최종 목표인 만큼

처음부터 크로스컴파일을 증명하면서 진행하겠다.

그럼, 누군가에겐 도움이 되는 길이길 바라며

시작!!! 파이팅!!

ps. 필자는 윈도우 환경에서 라즈베리로 크로스 컴파일을 진행한다.

 

1. 기초 시리얼

2. 파일 열기 및 저장

3. navigation을 통한 화면 전환 순으로 진행하겠다.


1. 기초 시리얼

정적인 시리얼 포트와 기본적인 송수신을 해보겠다.

윈도우에서 미리 본 화면

앞의 1,2,3을 수행하기 위해 미리 화면을 구성했다.

해당 html은 아래와 같다.

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>JM_DNC</title>
    <link rel="stylesheet" href="style.css">
</head>

<body>
    <div id="path">File Path</div>
    <textarea id="text" cols="50" rows="10"></textarea>
    <section id="Btn">
        <button id="sendBtn">전송!!</button>
        <button id="fileOpen">파일 열기</button>
    </section>
    
</body>

<script src="./renderer.js"></script>

</html>

그렇다면 serialport를 연결해주고 read, write를 해보자.

해당 기능은 renderer.js에서 구현하겠다.

// renderer.js
const serialport = require('serialport');

const text = document.getElementById('text');
const sendBtn = document.getElementById('sendBtn');

// 포트 지정
const port = new serialport('/dev/ttyUSB0', {
    baudRate: 19200,
    dataBits: 8,
    stopBits: 1,
    parity: 'none',
});

// read, write
port.on('open', function() {    // 포트 open 상태일때,
    //read
    port.on('data', function(data) {
        text.append(data);
    })
    //write
    sendBtn.addEventListener('click', () => {
        port.write(text.value);
    });
});

이제 해당 기능을 가지고 앞의 챕터에서 했던 크로스 컴파일을 통해

라즈베리파이에서 최소 기능을 실행해보자.

크로스 컴파일은 잘 실행됐으니 이제 시리얼 포트로 read, write를 해보자.

Serial read
Serial write

정상적으로 시리얼 read, write가 진행됐다!!!


2. 파일 열기 및 저장

여기서부터는 조금 복잡하다.

보안상의 이유로 ipc 통신을 통해 main.js와 renderer.js이 통신하고

index.html과 상호작용이 필요한 부분은 renderer.js에서,

백엔드와 상호작용이 필요한 부분은 main.js에서 처리해 줄 것이다.

// main.js 하단에 추가
// fileOpen
ipcMain.handle('fileOpen', async (event) => {
    const { filePaths } = await dialog.showOpenDialog({
        properties: ["openFile"],
    });
    const path = filePaths[0];
    const contents = fs.readFileSync(path, 'utf-8');
    mainWindow.webContents.send('fileOpenCode', {path, contents});
});
// renderer.js 하단에 추가
// fileOpen
fileOpen.addEventListener('click', () => {
    ipcRenderer.invoke('fileOpen');
})
ipcRenderer.on('fileOpenCode', (event, {path, contents}) => {
    pathtext.innerText = path;
    text.value = contents;
});

해당 코드로 수정 후 크로스 컴파일을 완료하면

라즈베리파이에서 파일 열기 버튼을 눌렸을 때 이렇게 된다!!!

라즈베리파이에서 showOpenDialog

파일을 열게 되면,

이런 식으로 잘 바뀌게 되고, 시리얼 전송도 잘 된다.


3. navigation을 통한 화면 전환

이제 좌측에 자연스러운 navigation bar를 만들기 위해서

hamburger menu를 통해 navigation을 만들고

클릭 시 화면 전환이 이루어지는 것 까지 해보겠다.

 

우선 윈도우에서 필요한 페이지 생성을 하고!

코드 체크 부분을 클릭하면 2번째 페이지로 넘어가게 된다.

 

이제 크로스 컴파일을 통해 라즈베리에서 작동을 확인해보자

잘 된다!!!


이제 UI 개선 작업과 추가 기능 개발을 하면 DNC_v1은 개발이 완료될 것 같다.

생각보다 까다로운 작업 일 것 같지만 그래도 파이팅!!!