diff --git a/index.html b/index.html index c0a74bd..e9c203d 100644 --- a/index.html +++ b/index.html @@ -317,9 +317,10 @@ - + + @@ -474,7 +475,11 @@ - + + + + + 気温 湿度 @@ -489,7 +494,67 @@ - + + + + + + + 73 + + + + + + + + + + 0x69 + + + + + サブキャンバス + + + 8 + + + + + 8 + + + + + 160 + + + + + 160 + + + + + #ff4500 + #0000ff + + + + + 28 + + + + + 15 + + + @@ -582,6 +647,9 @@ keydown + + #ff0000 + @@ -813,7 +881,6 @@ - @@ -904,6 +971,7 @@ + diff --git a/index.js b/index.js index 5d6930b..d5706d5 100644 --- a/index.js +++ b/index.js @@ -11,10 +11,11 @@ const testfunc = () => { Blockly.HSV_SATURATION = 0.55; Blockly.HSV_VALUE = 0.75; var gpio_color = '0'; +var sonsor_color = '20'; var multimedia_color = '240'; var network_color = '340'; -var special_color = '20'; -var snippets_color = '90'; +var special_color = '40'; +var snippets_color = '180'; // テーマ var theme = Blockly.Theme.defineTheme('ocoge', { 'base': Blockly.Themes.Classic, @@ -29,6 +30,9 @@ var theme = Blockly.Theme.defineTheme('ocoge', { 'gpio_blocks': { "colourPrimary": gpio_color }, + 'sensor_blocks': { + "colourPrimary": sonsor_color + }, 'multimedia_blocks': { "colourPrimary": multimedia_color }, @@ -46,6 +50,9 @@ var theme = Blockly.Theme.defineTheme('ocoge', { "gpio_category": { "colour": gpio_color }, + "sensor_category": { + "colour": sonsor_color + }, "multimedia_category": { "colour": multimedia_color }, @@ -80,6 +87,13 @@ Blockly.Msg["UGJ_FOREACH_TITLE"] = "リスト %1 の各 %2 について %3 %4"; Blockly.Msg["UGJ_FOREACH_ITEM"] = "項目"; Blockly.Msg["UGJ_FOREACH_TOOLTIP"] = "リストの各項目について、その項目を変数「項目」としてステートメントを実行します。"; +Blockly.Msg["UGJ_CREATE_SUBCANVAS_TITLE"] = "%1 %2 を、幅 %3 px、高さ %4 pxで作成 %5 、幅 %6 px、高さ %7 pxで表示"; +Blockly.Msg["UGJ_CREATE_SUBCANVAS_VAR"] = "サブキャンバス"; +Blockly.Msg["UGJ_CREATE_SUBCANVAS_TOOLTIP"] = "ディスプレイエリアに、右下寄せでキャンバスを作成します。"; + +Blockly.Msg["UGJ_DRAW_GRIDEYEDATA_TITLE"] = "赤外線アレイセンサ画像表示 %1 入力 %2 温度範囲上限 %3 %4 温度範囲下限 %5 %6 描画対象キャンバス %7"; +Blockly.Msg["UGJ_DRAW_GRIDEYEDATA_TOOLTIP"] = "AMG8833の温度データを、画像としてキャンバスに描画します。「着色」をチェックすると、温度範囲で設定されている色をつけて表示します。"; + Blockly.Msg["GPIO_OPEN_TITLE"] = "GPIO を使えるようにする"; Blockly.Msg["GPIO_OPEN_TOOLTIP"] = "GPIOを初期化して接続します。"; Blockly.Msg["GPIO_CLOSE_TITLE"] = "GPIO の後片付けをする"; @@ -132,6 +146,18 @@ Blockly.Msg["UGJ_BME280_TOOLTIP"] = "環境センサーBME280で、気温(摂 Blockly.Msg["UGJ_BME280_READ_TEMP"] = "気温"; Blockly.Msg["UGJ_BME280_READ_HUM"] = "湿度"; Blockly.Msg["UGJ_BME280_READ_PRES"] = "気圧"; +Blockly.Msg["UGJ_GESTURE_INIT_TITLE"] = "ジェスチャーセンサー(アドレス: %1 )を初期化"; +Blockly.Msg["UGJ_GESTURE_INIT_TOOLTIP"] = "PAJ7620 ジェスチャーセンサーを使用する準備をします。"; +Blockly.Msg["UGJ_GESTURE_READ_TITLE"] = "ジェスチャーの値"; +Blockly.Msg["UGJ_GESTURE_READ_TOOLTIP"] = "センサーから現在のジェスチャーの値(0〜9)を読み込みます"; +Blockly.Msg["UGJ_GESTURE_STOP_TITLE"] = "ジェスチャーセンサーから切断"; +Blockly.Msg["UGJ_GESTURE_STOP_TOOLTIP"] = "センサーとの接続を停止します。"; +Blockly.Msg["UGJ_GRIDEYE_INIT_TITLE"] = "赤外線アレイセンサ(アドレス: %1 )を初期化"; +Blockly.Msg["UGJ_GRIDEYE_INIT_TOOLTIP"] = "赤外線アレイセンサ AMG8833 の使用準備をします。"; +Blockly.Msg["UGJ_GRIDEYE_READ_TITLE"] = "赤外線アレイセンサの値"; +Blockly.Msg["UGJ_GRIDEYE_READ_TOOLTIP"] = "AMG8833から読み取った温度データを、8x8の配列で取得します。"; +Blockly.Msg["UGJ_GRIDEYE_STOP_TITLE"] = "赤外線アレイセンサから切断"; +Blockly.Msg["UGJ_GRIDEYE_STOP_TOOLTIP"] = "センサーとの接続を停止します。"; Blockly.Msg["UGJ_CODECHAR_TITLE"] = "コード %1 の文字"; Blockly.Msg["UGJ_CODECHAR_TOOLTIP"] = "文字コードを文字に変換します。"; diff --git a/index_elutil.js b/index_elutil.js index 0c76c0f..b97d270 100644 --- a/index_elutil.js +++ b/index_elutil.js @@ -2,7 +2,7 @@ /** ブラウザ動作時にもちょびっと対応 */ 'use strict' -// ファイル定数 +// 定数 const ugj_const = { doc_root: '/home/pi/Documents/ocoge_docs/', app_name: 'ocoge', @@ -14,7 +14,8 @@ const ugj_const = { error_ja_all: 'エラーが発生しました。\n『おこげ倶楽部』までお問い合わせください。', pig: 'pigpio', lg: 'lgpio', // lgpioがテストフェーズを終えてハードウェアPWMを実装したら切り替えを実装予定 - i2c_defbus: '6' // 文字列リテラルで指定 + i2c_defbus: '6', // 文字列リテラルで指定 + dev_hash: '4e9205f9b7e571bec1aa52ab7871f420684fcf96149672a4d550a95863d6b072' } /** クラス elUtil ****************************************************************** */ @@ -197,6 +198,8 @@ class elUtil { // GPIO 関連:リロードでGPIOをロックしたままハンドルを失うのを防ぐ cleanupGPIO() { require('@ocogeclub/' + this.gpio_backend).close_all_handle(); + require('@ocogeclub/paj7620').stop(); + require('@ocogeclub/amg8833').stop(); } // 設定(保存ファイルパスと未保存フラグ)をローカルストレージに保存 diff --git a/installer/install.sh b/installer/install.sh index 7a24d82..9c2624a 100644 --- a/installer/install.sh +++ b/installer/install.sh @@ -1,7 +1,8 @@ #!/bin/bash -x # Usage: bash install.sh -NODEVER=14.17.0 +NODEVER=16.5.0 +#14.17.0 # install some packages sudo apt update diff --git a/lib/gesture.py b/lib/gesture.py deleted file mode 100644 index 0cfe8f7..0000000 --- a/lib/gesture.py +++ /dev/null @@ -1,533 +0,0 @@ -#!/usr/bin/env python -# -# GrovePi Library for using the Grove - Gesture Sensor v1.0(http://www.seeedstudio.com/depot/Grove-Gesture-p-2463.html) -# -# The GrovePi connects the Raspberry Pi and Grove sensors. You can learn more about GrovePi here: http://www.dexterindustries.com/GrovePi -# -# Have a question about this library? Ask on the forums here: http://forum.dexterindustries.com/c/grovepi -# -# History -# ------------------------------------------------ -# Author Date Comments -# Karan 31 Dec 15 Initial Authoring -# -# Code derived from the basic Arduino library for the Gesture Sensor by Seeed: https://github.com/Seeed-Studio/Gesture_PAJ7620 - -# Released under the MIT license (http://choosealicense.com/licenses/mit/). -# For more information see https://github.com/DexterInd/GrovePi/blob/master/LICENSE - -import time,sys -import RPi.GPIO as GPIO -import smbus - -# use the bus that matches your raspi version -rev = GPIO.RPI_REVISION -if rev == 2 or rev == 3: - bus = smbus.SMBus(1) -else: - bus = smbus.SMBus(0) - -class gesture: - #Registers and variables for the gesture sensor - GES_REACTION_TIME =.500 # You can adjust the reaction time according to the actual circumstance. - GES_ENTRY_TIME =.800 # When you want to recognize the Forward/Backward gestures, your gestures' reaction time must less than GES_ENTRY_TIME(0.8s). - GES_QUIT_TIME =1.000 - - BANK0 = 0 - BANK1 = 1 - - PAJ7620_ADDR_BASE =0x00 - - #REGISTER BANK SELECT - PAJ7620_REGITER_BANK_SEL =(PAJ7620_ADDR_BASE + 0xEF) #W - - #DEVICE ID - PAJ7620_ID =0x73 - - #REGISTER BANK 0 - PAJ7620_ADDR_SUSPEND_CMD =(PAJ7620_ADDR_BASE + 0x3) #W - PAJ7620_ADDR_GES_PS_DET_MASK_0 =(PAJ7620_ADDR_BASE + 0x41) #RW - PAJ7620_ADDR_GES_PS_DET_MASK_1 =(PAJ7620_ADDR_BASE + 0x42) #RW - PAJ7620_ADDR_GES_PS_DET_FLAG_0 =(PAJ7620_ADDR_BASE + 0x43) #R - PAJ7620_ADDR_GES_PS_DET_FLAG_1 =(PAJ7620_ADDR_BASE + 0x44) #R - PAJ7620_ADDR_STATE_INDICATOR =(PAJ7620_ADDR_BASE + 0x45) #R - PAJ7620_ADDR_PS_HIGH_THRESHOLD =(PAJ7620_ADDR_BASE + 0x69) #RW - PAJ7620_ADDR_PS_LOW_THRESHOLD =(PAJ7620_ADDR_BASE + 0x6A) #RW - PAJ7620_ADDR_PS_APPROACH_STATE =(PAJ7620_ADDR_BASE + 0x6B) #R - PAJ7620_ADDR_PS_RAW_DATA =(PAJ7620_ADDR_BASE + 0x6C) #R - - #REGISTER BANK 1 - PAJ7620_ADDR_PS_GAIN =(PAJ7620_ADDR_BASE + 0x44) #RW - PAJ7620_ADDR_IDLE_S1_STEP_0 =(PAJ7620_ADDR_BASE + 0x67) #RW - PAJ7620_ADDR_IDLE_S1_STEP_1 =(PAJ7620_ADDR_BASE + 0x68) #RW - PAJ7620_ADDR_IDLE_S2_STEP_0 =(PAJ7620_ADDR_BASE + 0x69) #RW - PAJ7620_ADDR_IDLE_S2_STEP_1 =(PAJ7620_ADDR_BASE + 0x6A) #RW - PAJ7620_ADDR_OP_TO_S1_STEP_0 =(PAJ7620_ADDR_BASE + 0x6B) #RW - PAJ7620_ADDR_OP_TO_S1_STEP_1 =(PAJ7620_ADDR_BASE + 0x6C) #RW - PAJ7620_ADDR_OP_TO_S2_STEP_0 =(PAJ7620_ADDR_BASE + 0x6D) #RW - PAJ7620_ADDR_OP_TO_S2_STEP_1 =(PAJ7620_ADDR_BASE + 0x6E) #RW - PAJ7620_ADDR_OPERATION_ENABLE =(PAJ7620_ADDR_BASE + 0x72) #RW - - #PAJ7620_REGITER_BANK_SEL - PAJ7620_BANK0=0 - PAJ7620_BANK1=1 - - #PAJ7620_ADDR_SUSPEND_CMD - PAJ7620_I2C_WAKEUP =1 - PAJ7620_I2C_SUSPEND =0 - - #PAJ7620_ADDR_OPERATION_ENABLE - PAJ7620_ENABLE=1 - PAJ7620_DISABLE=0 - - #ADC, delete - REG_ADDR_RESULT = 0x00 - REG_ADDR_ALERT = 0x01 - REG_ADDR_CONFIG = 0x02 - REG_ADDR_LIMITL = 0x03 - REG_ADDR_LIMITH = 0x04 - REG_ADDR_HYST = 0x05 - REG_ADDR_CONVL = 0x06 - REG_ADDR_CONVH = 0x07 - - GES_RIGHT_FLAG =1<<0 - GES_LEFT_FLAG =1<<1 - GES_UP_FLAG =1<<2 - GES_DOWN_FLAG =1<<3 - GES_FORWARD_FLAG =1<<4 - GES_BACKWARD_FLAG =1<<5 - GES_CLOCKWISE_FLAG =1<<6 - GES_COUNT_CLOCKWISE_FLAG =1<<7 - GES_WAVE_FLAG =1<<0 - - #Gesture output - FORWARD = 1 - BACKWARD = 2 - RIGHT = 3 - LEFT = 4 - UP = 5 - DOWN = 6 - CLOCKWISE = 7 - ANTI_CLOCKWISE = 8 - WAVE = 9 - - #Initial register state - initRegisterArray=( [0xEF,0x00], - [0x32,0x29], - [0x33,0x01], - [0x34,0x00], - [0x35,0x01], - [0x36,0x00], - [0x37,0x07], - [0x38,0x17], - [0x39,0x06], - [0x3A,0x12], - [0x3F,0x00], - [0x40,0x02], - [0x41,0xFF], - [0x42,0x01], - [0x46,0x2D], - [0x47,0x0F], - [0x48,0x3C], - [0x49,0x00], - [0x4A,0x1E], - [0x4B,0x00], - [0x4C,0x20], - [0x4D,0x00], - [0x4E,0x1A], - [0x4F,0x14], - [0x50,0x00], - [0x51,0x10], - [0x52,0x00], - [0x5C,0x02], - [0x5D,0x00], - [0x5E,0x10], - [0x5F,0x3F], - [0x60,0x27], - [0x61,0x28], - [0x62,0x00], - [0x63,0x03], - [0x64,0xF7], - [0x65,0x03], - [0x66,0xD9], - [0x67,0x03], - [0x68,0x01], - [0x69,0xC8], - [0x6A,0x40], - [0x6D,0x04], - [0x6E,0x00], - [0x6F,0x00], - [0x70,0x80], - [0x71,0x00], - [0x72,0x00], - [0x73,0x00], - [0x74,0xF0], - [0x75,0x00], - [0x80,0x42], - [0x81,0x44], - [0x82,0x04], - [0x83,0x20], - [0x84,0x20], - [0x85,0x00], - [0x86,0x10], - [0x87,0x00], - [0x88,0x05], - [0x89,0x18], - [0x8A,0x10], - [0x8B,0x01], - [0x8C,0x37], - [0x8D,0x00], - [0x8E,0xF0], - [0x8F,0x81], - [0x90,0x06], - [0x91,0x06], - [0x92,0x1E], - [0x93,0x0D], - [0x94,0x0A], - [0x95,0x0A], - [0x96,0x0C], - [0x97,0x05], - [0x98,0x0A], - [0x99,0x41], - [0x9A,0x14], - [0x9B,0x0A], - [0x9C,0x3F], - [0x9D,0x33], - [0x9E,0xAE], - [0x9F,0xF9], - [0xA0,0x48], - [0xA1,0x13], - [0xA2,0x10], - [0xA3,0x08], - [0xA4,0x30], - [0xA5,0x19], - [0xA6,0x10], - [0xA7,0x08], - [0xA8,0x24], - [0xA9,0x04], - [0xAA,0x1E], - [0xAB,0x1E], - [0xCC,0x19], - [0xCD,0x0B], - [0xCE,0x13], - [0xCF,0x64], - [0xD0,0x21], - [0xD1,0x0F], - [0xD2,0x88], - [0xE0,0x01], - [0xE1,0x04], - [0xE2,0x41], - [0xE3,0xD6], - [0xE4,0x00], - [0xE5,0x0C], - [0xE6,0x0A], - [0xE7,0x00], - [0xE8,0x00], - [0xE9,0x00], - [0xEE,0x07], - [0xEF,0x01], - [0x00,0x1E], - [0x01,0x1E], - [0x02,0x0F], - [0x03,0x10], - [0x04,0x02], - [0x05,0x00], - [0x06,0xB0], - [0x07,0x04], - [0x08,0x0D], - [0x09,0x0E], - [0x0A,0x9C], - [0x0B,0x04], - [0x0C,0x05], - [0x0D,0x0F], - [0x0E,0x02], - [0x0F,0x12], - [0x10,0x02], - [0x11,0x02], - [0x12,0x00], - [0x13,0x01], - [0x14,0x05], - [0x15,0x07], - [0x16,0x05], - [0x17,0x07], - [0x18,0x01], - [0x19,0x04], - [0x1A,0x05], - [0x1B,0x0C], - [0x1C,0x2A], - [0x1D,0x01], - [0x1E,0x00], - [0x21,0x00], - [0x22,0x00], - [0x23,0x00], - [0x25,0x01], - [0x26,0x00], - [0x27,0x39], - [0x28,0x7F], - [0x29,0x08], - [0x30,0x03], - [0x31,0x00], - [0x32,0x1A], - [0x33,0x1A], - [0x34,0x07], - [0x35,0x07], - [0x36,0x01], - [0x37,0xFF], - [0x38,0x36], - [0x39,0x07], - [0x3A,0x00], - [0x3E,0xFF], - [0x3F,0x00], - [0x40,0x77], - [0x41,0x40], - [0x42,0x00], - [0x43,0x30], - [0x44,0xA0], - [0x45,0x5C], - [0x46,0x00], - [0x47,0x00], - [0x48,0x58], - [0x4A,0x1E], - [0x4B,0x1E], - [0x4C,0x00], - [0x4D,0x00], - [0x4E,0xA0], - [0x4F,0x80], - [0x50,0x00], - [0x51,0x00], - [0x52,0x00], - [0x53,0x00], - [0x54,0x00], - [0x57,0x80], - [0x59,0x10], - [0x5A,0x08], - [0x5B,0x94], - [0x5C,0xE8], - [0x5D,0x08], - [0x5E,0x3D], - [0x5F,0x99], - [0x60,0x45], - [0x61,0x40], - [0x63,0x2D], - [0x64,0x02], - [0x65,0x96], - [0x66,0x00], - [0x67,0x97], - [0x68,0x01], - [0x69,0xCD], - [0x6A,0x01], - [0x6B,0xB0], - [0x6C,0x04], - [0x6D,0x2C], - [0x6E,0x01], - [0x6F,0x32], - [0x71,0x00], - [0x72,0x01], - [0x73,0x35], - [0x74,0x00], - [0x75,0x33], - [0x76,0x31], - [0x77,0x01], - [0x7C,0x84], - [0x7D,0x03], - [0x7E,0x01]) - - #Enable debug message - debug=0 - - #Initialize the sensors - def init(self): - time.sleep(.001) - self.paj7620SelectBank(self.BANK0) - self.paj7620SelectBank(self.BANK0) - - data0 = self.paj7620ReadReg(0, 1)[0] - data1 = self.paj7620ReadReg(1, 1)[0] - if self.debug: - print("data0:",data0,"data1:",data1, flush=True, end="") - if data0 != 0x20 :#or data1 <> 0x76: - print("Error with sensor", flush=True, end="") - #return 0xff - if data0 == 0x20: - print("wake-up finish.", flush=True, end="") - - for i in range(len(self.initRegisterArray)): - self.paj7620WriteReg(self.initRegisterArray[i][0],self.initRegisterArray[i][1]) - - self.paj7620SelectBank(self.BANK0) - - print("Paj7620 initialize register finished.", flush=True, end="") - - #Write a byte to a register on the Gesture sensor - def paj7620WriteReg(self,addr,cmd): - bus.write_word_data(self.PAJ7620_ID, addr, cmd) - - #Select a register bank on the Gesture Sensor - def paj7620SelectBank(self,bank): - if bank==self.BANK0: - self.paj7620WriteReg(self.PAJ7620_REGITER_BANK_SEL, self.PAJ7620_BANK0) - - #Read a block of bytes of length "qty" starting at address "addr" from the Gesture sensor - def paj7620ReadReg(self,addr,qty): - return bus.read_i2c_block_data(self.PAJ7620_ID, addr,qty) - - #Print the values from the gesture sensor - def print_gesture(self): - data=self.paj7620ReadReg(0x43,1)[0] - if data==self.GES_RIGHT_FLAG: - time.sleep(self.GES_ENTRY_TIME) - data=self.paj7620ReadReg(0x43, 1)[0] - if data == self.GES_FORWARD_FLAG: - print("1", flush=True, end="") - time.sleep(self.GES_QUIT_TIME) - elif data == self.GES_BACKWARD_FLAG: - print("2", flush=True, end="") - time.sleep(self.GES_QUIT_TIME) - else: - print("3", flush=True, end="") - - elif data==self.GES_LEFT_FLAG: - time.sleep(self.GES_ENTRY_TIME) - data=self.paj7620ReadReg(0x43, 1)[0] - if data == self.GES_FORWARD_FLAG: - print("1", flush=True, end="") - time.sleep(self.GES_QUIT_TIME) - elif data == self.GES_BACKWARD_FLAG: - print("2", flush=True, end="") - time.sleep(self.GES_QUIT_TIME) - else: - print("4", flush=True, end="") - - elif data==self.GES_UP_FLAG: - time.sleep(self.GES_ENTRY_TIME) - data=self.paj7620ReadReg(0x43, 1)[0] - if data == self.GES_FORWARD_FLAG: - print("1", flush=True, end="") - time.sleep(self.GES_QUIT_TIME) - elif data == self.GES_BACKWARD_FLAG: - print("2", flush=True, end="") - time.sleep(self.GES_QUIT_TIME) - else: - print("5", flush=True, end="") - - elif data==self.GES_DOWN_FLAG: - time.sleep(self.GES_ENTRY_TIME) - data=self.paj7620ReadReg(0x43, 1)[0] - if data == self.GES_FORWARD_FLAG: - print("1", flush=True, end="") - time.sleep(self.GES_QUIT_TIME) - elif data == self.GES_BACKWARD_FLAG: - print("2", flush=True, end="") - time.sleep(self.GES_QUIT_TIME) - else: - print("6", flush=True, end="") - - elif data==self.GES_FORWARD_FLAG: - print("1", flush=True, end="") - time.sleep(self.GES_QUIT_TIME) - - elif data==self.GES_BACKWARD_FLAG: - print("2", flush=True, end="") - time.sleep(self.GES_QUIT_TIME) - - elif data==self.GES_CLOCKWISE_FLAG: - print("7", flush=True, end="") - - elif data==self.GES_COUNT_CLOCKWISE_FLAG: - print("8", flush=True, end="") - - else: - data1=self.paj7620ReadReg(0x44, 1)[0] - if (data1 == self.GES_WAVE_FLAG): - print("9", flush=True, end="") - - #Return a vlaue from the gestire sensor which can be used in a program - # 0:nothing - # 1:Forward - # 2:Backward - # 3:Right - # 4:Left - # 5:Up - # 6:Down - # 7:Clockwise - # 8:anti-clockwise - # 9:wave - def return_gesture(self): - - data=self.paj7620ReadReg(0x43,1)[0] - if data==self.GES_RIGHT_FLAG: - time.sleep(self.GES_ENTRY_TIME) - data=self.paj7620ReadReg(0x43, 1)[0] - if data == self.GES_FORWARD_FLAG: - return 1 - time.sleep(self.GES_QUIT_TIME) - elif data == self.GES_BACKWARD_FLAG: - return 2 - time.sleep(self.GES_QUIT_TIME) - else: - return 3 - - elif data==self.GES_LEFT_FLAG: - time.sleep(self.GES_ENTRY_TIME) - data=self.paj7620ReadReg(0x43, 1)[0] - if data == self.GES_FORWARD_FLAG: - return 1 - time.sleep(self.GES_QUIT_TIME) - elif data == self.GES_BACKWARD_FLAG: - return 2 - time.sleep(self.GES_QUIT_TIME) - else: - return 4 - - elif data==self.GES_UP_FLAG: - time.sleep(self.GES_ENTRY_TIME) - data=self.paj7620ReadReg(0x43, 1)[0] - if data == self.GES_FORWARD_FLAG: - return 1 - time.sleep(self.GES_QUIT_TIME) - elif data == self.GES_BACKWARD_FLAG: - return 2 - time.sleep(self.GES_QUIT_TIME) - else: - return 5 - - elif data==self.GES_DOWN_FLAG: - time.sleep(self.GES_ENTRY_TIME) - data=self.paj7620ReadReg(0x43, 1)[0] - if data == self.GES_FORWARD_FLAG: - return 1 - time.sleep(self.GES_QUIT_TIME) - elif data == self.GES_BACKWARD_FLAG: - return 2 - time.sleep(self.GES_QUIT_TIME) - else: - return 6 - - elif data==self.GES_FORWARD_FLAG: - return 1 - time.sleep(self.GES_QUIT_TIME) - - elif data==self.GES_BACKWARD_FLAG: - return 2 - time.sleep(self.GES_QUIT_TIME) - - elif data==self.GES_CLOCKWISE_FLAG: - return 7 - - elif data==self.GES_COUNT_CLOCKWISE_FLAG: - return 8 - - else: - data1=self.paj7620ReadReg(0x44, 1)[0] - if (data1 == self.GES_WAVE_FLAG): - return 9 - return 0 - -if __name__ == "__main__": - g=gesture() - g.init() - while True: - g.print_gesture() - time.sleep(.1) - # print g.return_gesture() - # time.sleep(.1) diff --git a/local_modules/@ocogeclub/amg8833/AMG8833.js b/local_modules/@ocogeclub/amg8833/AMG8833.js new file mode 100644 index 0000000..4b05997 --- /dev/null +++ b/local_modules/@ocogeclub/amg8833/AMG8833.js @@ -0,0 +1,41 @@ +'use strict'; + +const pig = require('@ocogeclub/pigpio'); + +let pi = -1; +let i2c_hand = -1; +exports.init = (i2c_bus, i2c_addr) => { + if (pi < 0) pi = pig._pigpio_start('', ''); + if (i2c_hand < 0) pig._i2c_close(pi, i2c_hand); + i2c_hand = pig._i2c_open(pi, i2c_bus, i2c_addr); + pig._i2c_write_byte_data(pi, i2c_hand, 0x00, 0x00); //Normal mode + pig._i2c_write_byte_data(pi, i2c_hand, 0x02, 0x00); //10FPS +} + +exports.read_temp_array = () => { + let linedata = []; + for (let i = 0; i < 8; i++) { + let data = pig._i2c_read_i2c_block_data(pi, i2c_hand, 0x80 + 0x10 * i, 16); + let oneline = []; + for (let j = 0; j < 8; j++) { + oneline.push(((data[2 * j + 1] & 0x07) * 256 + data[2 * j]) * 0.25); + } + linedata.push(oneline); + } + return linedata; +} + +exports.stop = () => { + if (i2c_hand >= 0) { + pig._i2c_close(pi, i2c_hand); + i2c_hand = -1; + } + if (pi >= 0) { + pig._pigpio_stop(pi); + pi = -1; + } +} + +/* +* This code was ported from https://www.denshi.club/pc/raspi/5raspberry-pi-zeroiot381i2c-amg8833.html +*/ \ No newline at end of file diff --git a/local_modules/@ocogeclub/amg8833/package.json b/local_modules/@ocogeclub/amg8833/package.json new file mode 100644 index 0000000..750f0af --- /dev/null +++ b/local_modules/@ocogeclub/amg8833/package.json @@ -0,0 +1,10 @@ +{ + "name": "@ocogeclub/amg8833", + "version": "0.0.1", + "main": "AMG8833.js", + "private": true, + "license": "MIT", + "dependencies": { + "@ocogeclub/pigpio": "file:../pigpio" + } +} \ No newline at end of file diff --git a/local_modules/@ocogeclub/paj7620/PAJ7620.js b/local_modules/@ocogeclub/paj7620/PAJ7620.js new file mode 100644 index 0000000..9ed92af --- /dev/null +++ b/local_modules/@ocogeclub/paj7620/PAJ7620.js @@ -0,0 +1,472 @@ +"use strict"; + +const pig = require('@ocogeclub/pigpio'); + +const sleep = sec => + new Promise(r => setTimeout(r, sec * 1000)); + +const GES_REACTION_TIME = .100; // default:0.5 // You can adjust the reaction time according to the actual circumstance. +const GES_ENTRY_TIME = .050; // default:0.8 // When you want to recognize the Forward/Backward gestures, your gestures' reaction time must less than GES_ENTRY_TIME(0.8s). +const GES_QUIT_TIME = 1.000; + +const BANK0 = 0; +const BANK1 = 1; + +const PAJ7620_ADDR_BASE = 0x00; + +//REGISTER BANK SELECT +const PAJ7620_REGITER_BANK_SEL = (PAJ7620_ADDR_BASE + 0xEF); //W + +//DEVICE ID +// const PAJ7620_ID = 0x73; + +//REGISTER BANK 0 +const PAJ7620_ADDR_SUSPEND_CMD = (PAJ7620_ADDR_BASE + 0x3); //W +const PAJ7620_ADDR_GES_PS_DET_MASK_0 = (PAJ7620_ADDR_BASE + 0x41); //RW +const PAJ7620_ADDR_GES_PS_DET_MASK_1 = (PAJ7620_ADDR_BASE + 0x42); //RW +const PAJ7620_ADDR_GES_PS_DET_FLAG_0 = (PAJ7620_ADDR_BASE + 0x43); //R +const PAJ7620_ADDR_GES_PS_DET_FLAG_1 = (PAJ7620_ADDR_BASE + 0x44); //R +const PAJ7620_ADDR_STATE_INDICATOR = (PAJ7620_ADDR_BASE + 0x45); //R +const PAJ7620_ADDR_PS_HIGH_THRESHOLD = (PAJ7620_ADDR_BASE + 0x69); //RW +const PAJ7620_ADDR_PS_LOW_THRESHOLD = (PAJ7620_ADDR_BASE + 0x6A); //RW +const PAJ7620_ADDR_PS_APPROACH_STATE = (PAJ7620_ADDR_BASE + 0x6B); //R +const PAJ7620_ADDR_PS_RAW_DATA = (PAJ7620_ADDR_BASE + 0x6C); //R + +//REGISTER BANK 1 +const PAJ7620_ADDR_PS_GAIN = (PAJ7620_ADDR_BASE + 0x44); //RW +const PAJ7620_ADDR_IDLE_S1_STEP_0 = (PAJ7620_ADDR_BASE + 0x67); //RW +const PAJ7620_ADDR_IDLE_S1_STEP_1 = (PAJ7620_ADDR_BASE + 0x68); //RW +const PAJ7620_ADDR_IDLE_S2_STEP_0 = (PAJ7620_ADDR_BASE + 0x69); //RW +const PAJ7620_ADDR_IDLE_S2_STEP_1 = (PAJ7620_ADDR_BASE + 0x6A); //RW +const PAJ7620_ADDR_OP_TO_S1_STEP_0 = (PAJ7620_ADDR_BASE + 0x6B); //RW +const PAJ7620_ADDR_OP_TO_S1_STEP_1 = (PAJ7620_ADDR_BASE + 0x6C); //RW +const PAJ7620_ADDR_OP_TO_S2_STEP_0 = (PAJ7620_ADDR_BASE + 0x6D); //RW +const PAJ7620_ADDR_OP_TO_S2_STEP_1 = (PAJ7620_ADDR_BASE + 0x6E); //RW +const PAJ7620_ADDR_OPERATION_ENABLE = (PAJ7620_ADDR_BASE + 0x72); //RW + +//PAJ7620_REGITER_BANK_SEL +const PAJ7620_BANK0 = 0; +const PAJ7620_BANK1 = 1; + +//PAJ7620_ADDR_SUSPEND_CMD +const PAJ7620_I2C_WAKEUP = 1; +const PAJ7620_I2C_SUSPEND = 0; + +//PAJ7620_ADDR_OPERATION_ENABLE +const PAJ7620_ENABLE = 1; +const PAJ7620_DISABLE = 0; + +//ADC, delete +const REG_ADDR_RESULT = 0x00; +const REG_ADDR_ALERT = 0x01; +const REG_ADDR_CONFIG = 0x02; +const REG_ADDR_LIMITL = 0x03; +const REG_ADDR_LIMITH = 0x04; +const REG_ADDR_HYST = 0x05; +const REG_ADDR_CONVL = 0x06; +const REG_ADDR_CONVH = 0x07; + +const GES_RIGHT_FLAG = 1 << 0; +const GES_LEFT_FLAG = 1 << 1; +const GES_UP_FLAG = 1 << 2; +const GES_DOWN_FLAG = 1 << 3; +const GES_FORWARD_FLAG = 1 << 4; +const GES_BACKWARD_FLAG = 1 << 5; +const GES_CLOCKWISE_FLAG = 1 << 6; +const GES_COUNT_CLOCKWISE_FLAG = 1 << 7; +const GES_WAVE_FLAG = 1 << 0; + +//Gesture output +exports.FORWARD = 1; +exports.BACKWARD = 2; +exports.RIGHT = 3; +exports.LEFT = 4; +exports.UP = 5; +exports.DOWN = 6; +exports.CLOCKWISE = 7; +exports.ANTI_CLOCKWISE = 8; +exports.WAVE = 9; + +//Initial register state +const initRegisterArray = [ + [0xEF, 0x00], + [0x32, 0x29], + [0x33, 0x01], + [0x34, 0x00], + [0x35, 0x01], + [0x36, 0x00], + [0x37, 0x07], + [0x38, 0x17], + [0x39, 0x06], + [0x3A, 0x12], + [0x3F, 0x00], + [0x40, 0x02], + [0x41, 0xFF], + [0x42, 0x01], + [0x46, 0x2D], + [0x47, 0x0F], + [0x48, 0x3C], + [0x49, 0x00], + [0x4A, 0x1E], + [0x4B, 0x00], + [0x4C, 0x20], + [0x4D, 0x00], + [0x4E, 0x1A], + [0x4F, 0x14], + [0x50, 0x00], + [0x51, 0x10], + [0x52, 0x00], + [0x5C, 0x02], + [0x5D, 0x00], + [0x5E, 0x10], + [0x5F, 0x3F], + [0x60, 0x27], + [0x61, 0x28], + [0x62, 0x00], + [0x63, 0x03], + [0x64, 0xF7], + [0x65, 0x03], + [0x66, 0xD9], + [0x67, 0x03], + [0x68, 0x01], + [0x69, 0xC8], + [0x6A, 0x40], + [0x6D, 0x04], + [0x6E, 0x00], + [0x6F, 0x00], + [0x70, 0x80], + [0x71, 0x00], + [0x72, 0x00], + [0x73, 0x00], + [0x74, 0xF0], + [0x75, 0x00], + [0x80, 0x42], + [0x81, 0x44], + [0x82, 0x04], + [0x83, 0x20], + [0x84, 0x20], + [0x85, 0x00], + [0x86, 0x10], + [0x87, 0x00], + [0x88, 0x05], + [0x89, 0x18], + [0x8A, 0x10], + [0x8B, 0x01], + [0x8C, 0x37], + [0x8D, 0x00], + [0x8E, 0xF0], + [0x8F, 0x81], + [0x90, 0x06], + [0x91, 0x06], + [0x92, 0x1E], + [0x93, 0x0D], + [0x94, 0x0A], + [0x95, 0x0A], + [0x96, 0x0C], + [0x97, 0x05], + [0x98, 0x0A], + [0x99, 0x41], + [0x9A, 0x14], + [0x9B, 0x0A], + [0x9C, 0x3F], + [0x9D, 0x33], + [0x9E, 0xAE], + [0x9F, 0xF9], + [0xA0, 0x48], + [0xA1, 0x13], + [0xA2, 0x10], + [0xA3, 0x08], + [0xA4, 0x30], + [0xA5, 0x19], + [0xA6, 0x10], + [0xA7, 0x08], + [0xA8, 0x24], + [0xA9, 0x04], + [0xAA, 0x1E], + [0xAB, 0x1E], + [0xCC, 0x19], + [0xCD, 0x0B], + [0xCE, 0x13], + [0xCF, 0x64], + [0xD0, 0x21], + [0xD1, 0x0F], + [0xD2, 0x88], + [0xE0, 0x01], + [0xE1, 0x04], + [0xE2, 0x41], + [0xE3, 0xD6], + [0xE4, 0x00], + [0xE5, 0x0C], + [0xE6, 0x0A], + [0xE7, 0x00], + [0xE8, 0x00], + [0xE9, 0x00], + [0xEE, 0x07], + [0xEF, 0x01], + [0x00, 0x1E], + [0x01, 0x1E], + [0x02, 0x0F], + [0x03, 0x10], + [0x04, 0x02], + [0x05, 0x00], + [0x06, 0xB0], + [0x07, 0x04], + [0x08, 0x0D], + [0x09, 0x0E], + [0x0A, 0x9C], + [0x0B, 0x04], + [0x0C, 0x05], + [0x0D, 0x0F], + [0x0E, 0x02], + [0x0F, 0x12], + [0x10, 0x02], + [0x11, 0x02], + [0x12, 0x00], + [0x13, 0x01], + [0x14, 0x05], + [0x15, 0x07], + [0x16, 0x05], + [0x17, 0x07], + [0x18, 0x01], + [0x19, 0x04], + [0x1A, 0x05], + [0x1B, 0x0C], + [0x1C, 0x2A], + [0x1D, 0x01], + [0x1E, 0x00], + [0x21, 0x00], + [0x22, 0x00], + [0x23, 0x00], + [0x25, 0x01], + [0x26, 0x00], + [0x27, 0x39], + [0x28, 0x7F], + [0x29, 0x08], + [0x30, 0x03], + [0x31, 0x00], + [0x32, 0x1A], + [0x33, 0x1A], + [0x34, 0x07], + [0x35, 0x07], + [0x36, 0x01], + [0x37, 0xFF], + [0x38, 0x36], + [0x39, 0x07], + [0x3A, 0x00], + [0x3E, 0xFF], + [0x3F, 0x00], + [0x40, 0x77], + [0x41, 0x40], + [0x42, 0x00], + [0x43, 0x30], + [0x44, 0xA0], + [0x45, 0x5C], + [0x46, 0x00], + [0x47, 0x00], + [0x48, 0x58], + [0x4A, 0x1E], + [0x4B, 0x1E], + [0x4C, 0x00], + [0x4D, 0x00], + [0x4E, 0xA0], + [0x4F, 0x80], + [0x50, 0x00], + [0x51, 0x00], + [0x52, 0x00], + [0x53, 0x00], + [0x54, 0x00], + [0x57, 0x80], + [0x59, 0x10], + [0x5A, 0x08], + [0x5B, 0x94], + [0x5C, 0xE8], + [0x5D, 0x08], + [0x5E, 0x3D], + [0x5F, 0x99], + [0x60, 0x45], + [0x61, 0x40], + [0x63, 0x2D], + [0x64, 0x02], + [0x65, 0x96], + [0x66, 0x00], + [0x67, 0x97], + [0x68, 0x01], + [0x69, 0xCD], + [0x6A, 0x01], + [0x6B, 0xB0], + [0x6C, 0x04], + [0x6D, 0x2C], + [0x6E, 0x01], + [0x6F, 0x32], + [0x71, 0x00], + [0x72, 0x01], + [0x73, 0x35], + [0x74, 0x00], + [0x75, 0x33], + [0x76, 0x31], + [0x77, 0x01], + [0x7C, 0x84], + [0x7D, 0x03], + [0x7E, 0x01] +]; + +//Enable debug message +const debug = 0; + +let pi = -1; +let i2c_hand = -1; +//Initialize the sensors +exports.init = async (i2c_bus, i2c_addr) => { + if (pi < 0) pi = pig._pigpio_start('', ''); + if (i2c_hand < 0) pig._i2c_close(pi, i2c_hand); + i2c_hand = pig._i2c_open(pi, i2c_bus, i2c_addr); + + await sleep(.001); + paj7620SelectBank(BANK0); + paj7620SelectBank(BANK0); + + let data0 = paj7620ReadReg(0, 1)[0]; + let data1 = paj7620ReadReg(1, 1)[0]; + if (debug) + console.log("data0" + data0 + "data1" + data1); + if (data0 != 0x20) //or data1 <> 0x76 + console.log("Error with sensor"); + //return 0xff + if (data0 == 0x20) + console.log("wake-up finish."); + + for (let i = 0; i < initRegisterArray.length; i += 1) + paj7620WriteReg(initRegisterArray[i][0], initRegisterArray[i][1]); + + paj7620SelectBank(BANK0); + + console.log("Paj7620 initialize register finished."); + +} + +// Write a byte to a register on the Gesture sensor +const paj7620WriteReg = (addr, cmd) => + pig._i2c_write_word_data(pi, i2c_hand, addr, cmd); + +//Select a register bank on the Gesture Sensor +const paj7620SelectBank = bank => { + if (bank == BANK0) + paj7620WriteReg(PAJ7620_REGITER_BANK_SEL, PAJ7620_BANK0); +} + +//Read a block of bytes of length "qty" starting at address "addr" from the Gesture sensor +const paj7620ReadReg = (addr, qty) => { + return pig._i2c_read_i2c_block_data(pi, i2c_hand, addr, qty); +} + +//Return a vlaue from the gestire sensor which can be used in a program +// 0:nothing +// 1:Forward +// 2:Backward +// 3:Right +// 4:Left +// 5:Up +// 6:Down +// 7:Clockwise +// 8:anti-clockwise +// 9:wave +exports.return_gesture = async () => { + + let data = paj7620ReadReg(0x43, 1)[0]; + if (data == GES_RIGHT_FLAG) { + await sleep(GES_ENTRY_TIME); + data = paj7620ReadReg(0x43, 1)[0]; + if (data == GES_FORWARD_FLAG) { + return 1; + // await sleep(GES_QUIT_TIME); + } + else if (data == GES_BACKWARD_FLAG) { + return 2; + // await sleep(GES_QUIT_TIME); + } + else + return 3; + } + + else if (data == GES_LEFT_FLAG) { + await sleep(GES_ENTRY_TIME); + data = paj7620ReadReg(0x43, 1)[0]; + if (data == GES_FORWARD_FLAG) { + return 1; + // await sleep(GES_QUIT_TIME); + } + else if (data == GES_BACKWARD_FLAG) { + return 2; + // await sleep(GES_QUIT_TIME); + } + else + return 4; + } + + else if (data == GES_UP_FLAG) { + await sleep(GES_ENTRY_TIME); + data = paj7620ReadReg(0x43, 1)[0]; + if (data == GES_FORWARD_FLAG) { + return 1; + // await sleep(GES_QUIT_TIME); + } + else if (data == GES_BACKWARD_FLAG) { + return 2; + // await sleep(GES_QUIT_TIME); + } + else + return 5; + } + + else if (data == GES_DOWN_FLAG) { + await sleep(GES_ENTRY_TIME); + data = paj7620ReadReg(0x43, 1)[0]; + if (data == GES_FORWARD_FLAG) { + return 1; + // await sleep(GES_QUIT_TIME); + } + else if (data == GES_BACKWARD_FLAG) { + return 2; + // await sleep(GES_QUIT_TIME); + } + else + return 6; + } + else if (data == GES_FORWARD_FLAG) { + return 1; + // await sleep(GES_QUIT_TIME); + } + + else if (data == GES_BACKWARD_FLAG) { + return 2; + // await sleep(GES_QUIT_TIME); + } + + else if (data == GES_CLOCKWISE_FLAG) + return 7; + + else if (data == GES_COUNT_CLOCKWISE_FLAG) + return 8; + + else { + let data1 = paj7620ReadReg(0x44, 1)[0]; + if (data1 == GES_WAVE_FLAG) + return 9; + } + return 0; +} + +exports.stop = () => { + if (i2c_hand >= 0) { + pig._i2c_close(pi, i2c_hand); + i2c_hand = -1; + } + if (pi >= 0) { + pig._pigpio_stop(pi); + pi = -1; + } +} + +/* + * This code was ported from "Grove - Gesture Sensor v1.0 Python library and examples": https://github.com/DexterInd/GrovePi/tree/master/Software/Python/grove_gesture_sensor + */ \ No newline at end of file diff --git a/local_modules/@ocogeclub/paj7620/package.json b/local_modules/@ocogeclub/paj7620/package.json new file mode 100644 index 0000000..1021c5f --- /dev/null +++ b/local_modules/@ocogeclub/paj7620/package.json @@ -0,0 +1,10 @@ +{ + "name": "@ocogeclub/paj7620", + "version": "0.0.1", + "main": "PAJ7620.js", + "private": true, + "license": "MIT", + "dependencies": { + "@ocogeclub/pigpio": "file:../pigpio" + } +} \ No newline at end of file diff --git a/local_modules/@ocogeclub/pigpio/index.js b/local_modules/@ocogeclub/pigpio/index.js index 0cae564..b21642c 100644 --- a/local_modules/@ocogeclub/pigpio/index.js +++ b/local_modules/@ocogeclub/pigpio/index.js @@ -81,6 +81,9 @@ module.exports.i2c_read_byte_data = reg => { module.exports.i2c_write_i2c_block_data = (reg, data) => { if (i2c_hand >= 0) return module.exports._i2c_write_i2c_block_data(pi, i2c_hand, reg, Buffer.from(data)); } +module.exports.i2c_read_word_data = reg => { + if (i2c_hand >= 0) return module.exports._i2c_read_word_data(pi, i2c_hand, reg); +} module.exports.i2c_read_device = count => { if (i2c_hand >= 0) return module.exports._i2c_read_device(pi, i2c_hand, count).toString('utf8'); } diff --git a/local_modules/@ocogeclub/pigpio/pigpio.cpp b/local_modules/@ocogeclub/pigpio/pigpio.cpp index 4ac9ea7..bf8375d 100644 --- a/local_modules/@ocogeclub/pigpio/pigpio.cpp +++ b/local_modules/@ocogeclub/pigpio/pigpio.cpp @@ -563,6 +563,30 @@ Value _i2cReadWordData(const CallbackInfo &info) i2c_read_word_data(pi, handle, i2c_reg)); } +// I2Cハンドルに関連付けられているデバイスの指定されたレジスタに単一の16ビットワードを書き込む +Value _i2cWriteWordData(const CallbackInfo &info) +{ + Env env = info.Env(); + if (info.Length() < 4) + { + TypeError::New(env, "Wrong number of arguments") + .ThrowAsJavaScriptException(); + return env.Null(); + } + if (!info[0].IsNumber() || !info[1].IsNumber() || !info[2].IsNumber() || !info[3].IsNumber()) + { + TypeError::New(env, "Wrong arguments").ThrowAsJavaScriptException(); + return env.Null(); + } + int pi = info[0].As().Int32Value(); + unsigned int handle = info[1].As().Uint32Value(); + unsigned int i2c_reg = info[2].As().Uint32Value(); + unsigned int wVal = info[3].As().Uint32Value(); + + return Number::New(env, + i2c_write_word_data(pi, handle, i2c_reg, wVal)); +} + // i2c デバイスからデータを受け取る Value _i2cReadDevice(const CallbackInfo &info) { @@ -642,6 +666,7 @@ Init(Env env, Object exports) exports.Set(String::New(env, "_i2c_write_i2c_block_data"), Function::New(env, _i2cWriteI2cBlockData)); exports.Set(String::New(env, "_i2c_read_i2c_block_data"), Function::New(env, _i2cReadI2cBlockData)); exports.Set(String::New(env, "_i2c_read_word_data"), Function::New(env, _i2cReadWordData)); + exports.Set(String::New(env, "_i2c_write_word_data"), Function::New(env, _i2cWriteWordData)); exports.Set(String::New(env, "_i2c_write_device"), Function::New(env, _i2cWriteDevice)); exports.Set(String::New(env, "_i2c_read_device"), Function::New(env, _i2cReadDevice)); return exports; diff --git a/main.js b/main.js index c7427f0..497f461 100644 --- a/main.js +++ b/main.js @@ -1,5 +1,6 @@ const { app, BrowserWindow, Menu, session, ipcMain, dialog } = require('electron') const path = require('path') +const fs = require('fs') /** Force disable security warning */ process.env['ELECTRON_DISABLE_SECURITY_WARNINGS'] = 'true' diff --git a/package.json b/package.json index 6c226b2..eadc149 100644 --- a/package.json +++ b/package.json @@ -19,11 +19,13 @@ }, "homepage": "https://github.com/ocogeclub/ocoge#readme", "devDependencies": { - "electron": "15.0.0", + "electron": "15.1.2", "electron-rebuild": "3.2.3" }, "dependencies": { + "@ocogeclub/amg8833": "file:local_modules/@ocogeclub/amg8833", "@ocogeclub/bme280": "file:local_modules/@ocogeclub/bme280", + "@ocogeclub/paj7620": "file:local_modules/@ocogeclub/paj7620", "@ocogeclub/pigpio": "file:local_modules/@ocogeclub/pigpio", "@tensorflow/tfjs-node": "^3.9.0", "@vladmandic/face-api": "^1.5.3", diff --git a/preload.js b/preload.js deleted file mode 100644 index 43077cc..0000000 --- a/preload.js +++ /dev/null @@ -1,22 +0,0 @@ -const electron = require("electron") -const path = require('path') -// const tf = require('@tensorflow/tfjs-node') -electron.contextBridge.exposeInMainWorld( - "ocogeapi", - { - // Electron固有:index.htmlから直接