diff --git a/gui/core/nanogui.py b/gui/core/nanogui.py index c97af70..2a1ba81 100644 --- a/gui/core/nanogui.py +++ b/gui/core/nanogui.py @@ -9,7 +9,7 @@ # border: False no border None use bgcolor, int: treat as color import cmath -from ngui.core.writer import Writer +from gui.core.writer import Writer import framebuf import gc diff --git a/gui/demos/aclock.py b/gui/demos/aclock.py index fa89a03..f3ff647 100644 --- a/gui/demos/aclock.py +++ b/gui/demos/aclock.py @@ -2,8 +2,6 @@ # Adafruit 1.5" 128*128 OLED display: https://www.adafruit.com/product/1431 # Adafruit 1.27" 128*96 display https://www.adafruit.com/product/1673 -# The MIT License (MIT) - # Released under the MIT License (MIT). See LICENSE. # Copyright (c) 2018-2020 Peter Hinch @@ -17,40 +15,19 @@ # X6 CLK # X8 DATA -height = 96 # 1.27 inch 96*128 (rows*cols) display -# height = 128 # 1.5 inch 128*128 display - -# Demo of initialisation procedure designed to minimise risk of memory fail -# when instantiating the frame buffer. The aim is to do this as early as -# possible before importing other modules. - -import machine -import gc -from drivers.ssd1351 import SSD1351 as SSD - # Initialise hardware -pdc = machine.Pin('X1', machine.Pin.OUT_PP, value=0) -pcs = machine.Pin('X2', machine.Pin.OUT_PP, value=1) -prst = machine.Pin('X3', machine.Pin.OUT_PP, value=1) -spi = machine.SPI(1) -gc.collect() # Precaution before instantiating framebuf -ssd = SSD(spi, pcs, pdc, prst, height) # Create a display instance -from nanogui import Dial, Pointer, refresh, Label +from ssd1351_setup import ssd, height # Create a display instance +from gui.core.nanogui import Dial, Pointer, refresh, Label refresh(ssd) # Initialise and clear display. # Now import other modules import cmath import utime -from ngui.core.writer import CWriter +from gui.core.writer import CWriter # Font for CWriter -import arial10 - -GREEN = SSD.rgb(0, 255, 0) -RED = SSD.rgb(255, 0, 0) -BLUE = SSD.rgb(0, 0, 255) -YELLOW = SSD.rgb(255, 255, 0) -BLACK = 0 +import gui.fonts.arial10 as arial10 +from gui.core.colors import * def aclock(): uv = lambda phi : cmath.rect(1, phi) # Return a unit vector of phase phi diff --git a/gui/demos/alevel.py b/gui/demos/alevel.py index dc622f1..358334a 100644 --- a/gui/demos/alevel.py +++ b/gui/demos/alevel.py @@ -2,27 +2,8 @@ # Adafruit 1.5" 128*128 OLED display: https://www.adafruit.com/product/1431 # Adafruit 1.27" 128*96 display https://www.adafruit.com/product/1673 -# The MIT License (MIT) - -# Copyright (c) 2018 Peter Hinch - -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. +# Released under the MIT License (MIT). See LICENSE. +# Copyright (c) 2018-2020 Peter Hinch # WIRING # Pyb SSD @@ -34,40 +15,25 @@ # X6 CLK # X8 DATA -height = 96 # 1.27 inch 96*128 (rows*cols) display -# height = 128 # 1.5 inch 128*128 display - # Demo of initialisation procedure designed to minimise risk of memory fail # when instantiating the frame buffer. The aim is to do this as early as # possible before importing other modules. -import machine import gc -from ssd1351 import SSD1351 as SSD # Initialise hardware -pdc = machine.Pin('X1', machine.Pin.OUT_PP, value=0) -pcs = machine.Pin('X2', machine.Pin.OUT_PP, value=1) -prst = machine.Pin('X3', machine.Pin.OUT_PP, value=1) -spi = machine.SPI(1) -gc.collect() # Precaution befor instantiating framebuf -ssd = SSD(spi, pcs, pdc, prst, height) # Create a display instance -from nanogui import Dial, Pointer, refresh +from ssd1351_setup import ssd # Create a display instance + +from gui.core.nanogui import Dial, Pointer, refresh refresh(ssd) # Initialise and clear display. # Now import other modules import utime import pyb -from writer import CWriter -import arial10 # Font - -GREEN = SSD.rgb(0, 255, 0) -RED = SSD.rgb(255, 0, 0) -BLUE = SSD.rgb(0, 0, 255) -YELLOW = SSD.rgb(255, 255, 0) -BLACK = 0 - +from gui.core.writer import CWriter +import gui.fonts.arial10 as arial10 +from gui.core.colors import * def main(): print('alevel test is running.') diff --git a/gui/demos/asnano.py b/gui/demos/asnano.py index 286a382..eafde26 100644 --- a/gui/demos/asnano.py +++ b/gui/demos/asnano.py @@ -6,49 +6,21 @@ # Copyright (c) 2020 Peter Hinch # Released under the MIT License (MIT) - see LICENSE file -# WIRING (Adafruit pin nos and names) -# Pyb SSD -# 3v3 Vin (10) -# Gnd Gnd (11) -# X1 DC (3 DC) -# X2 CS (5 OC OLEDCS) -# X3 Rst (4 R RESET) -# X6 CLK (2 CL SCK) -# X8 DATA (1 SI MOSI) - -height = 96 # 1.27 inch 96*128 (rows*cols) display -# height = 128 # 1.5 inch 128*128 display - -import machine -import gc -from ssd1351 import SSD1351 as SSD - # Initialise hardware and framebuf before importing modules -#pdc = machine.Pin('X1', machine.Pin.OUT_PP, value=0) -#pcs = machine.Pin('X2', machine.Pin.OUT_PP, value=1) -#prst = machine.Pin('X3', machine.Pin.OUT_PP, value=1) -#spi = machine.SPI(1) -pdc = machine.Pin('Y1', machine.Pin.OUT_PP, value=0) -pcs = machine.Pin('Y2', machine.Pin.OUT_PP, value=1) -prst = machine.Pin('Y3', machine.Pin.OUT_PP, value=1) -spi = machine.SPI(2) -gc.collect() # Precaution befor instantiating framebuf -ssd = SSD(spi, pcs, pdc, prst, height) # Create a display instance +from ssd1351_setup import ssd # Create a display instance import uasyncio as asyncio import pyb import uos -from writer import CWriter -from nanogui import LED, Meter, refresh +from gui.core.writer import CWriter +from gui.core.nanogui import LED, Meter, refresh refresh(ssd) # Fonts -import arial10, freesans20 +import gui.fonts.arial10 as arial10 +import gui.fonts.freesans20 as freesans20 -GREEN = SSD.rgb(0, 255, 0) -RED = SSD.rgb(255, 0, 0) -YELLOW = SSD.rgb(255, 255, 0) -BLACK = 0 +from gui.core.colors import * CWriter.set_textpos(ssd, 0, 0) # In case previous tests have altered it wri = CWriter(ssd, arial10, GREEN, BLACK, verbose=False) diff --git a/gui/demos/asnano_sync.py b/gui/demos/asnano_sync.py index cbba37e..6f129b7 100644 --- a/gui/demos/asnano_sync.py +++ b/gui/demos/asnano_sync.py @@ -6,49 +6,21 @@ # Copyright (c) 2020 Peter Hinch # Released under the MIT License (MIT) - see LICENSE file -# WIRING (Adafruit pin nos and names) -# Pyb SSD -# 3v3 Vin (10) -# Gnd Gnd (11) -# X1 DC (3 DC) -# X2 CS (5 OC OLEDCS) -# X3 Rst (4 R RESET) -# X6 CLK (2 CL SCK) -# X8 DATA (1 SI MOSI) - -height = 96 # 1.27 inch 96*128 (rows*cols) display -# height = 128 # 1.5 inch 128*128 display - -import machine -import gc -from ssd1351 import SSD1351 as SSD - # Initialise hardware and framebuf before importing modules -#pdc = machine.Pin('X1', machine.Pin.OUT_PP, value=0) -#pcs = machine.Pin('X2', machine.Pin.OUT_PP, value=1) -#prst = machine.Pin('X3', machine.Pin.OUT_PP, value=1) -#spi = machine.SPI(1) -pdc = machine.Pin('Y1', machine.Pin.OUT_PP, value=0) -pcs = machine.Pin('Y2', machine.Pin.OUT_PP, value=1) -prst = machine.Pin('Y3', machine.Pin.OUT_PP, value=1) -spi = machine.SPI(2) -gc.collect() # Precaution befor instantiating framebuf -ssd = SSD(spi, pcs, pdc, prst, height) # Create a display instance +from ssd1351_setup import ssd # Create a display instance import uasyncio as asyncio import pyb import uos -from writer import CWriter -from nanogui import LED, Meter, refresh +from gui.core.writer import CWriter +from gui.core.nanogui import LED, Meter, refresh refresh(ssd) # Fonts -import arial10, freesans20 +import gui.fonts.arial10 as arial10 +import gui.fonts.freesans20 as freesans20 -GREEN = SSD.rgb(0, 255, 0) -RED = SSD.rgb(255, 0, 0) -YELLOW = SSD.rgb(255, 255, 0) -BLACK = 0 +from gui.core.colors import * color = lambda v : RED if v > 0.7 else YELLOW if v > 0.5 else GREEN txt = lambda v : 'ovr' if v > 0.7 else 'high' if v > 0.5 else 'ok' diff --git a/gui/demos/color15.py b/gui/demos/color15.py index 330100f..751c8b8 100644 --- a/gui/demos/color15.py +++ b/gui/demos/color15.py @@ -3,57 +3,23 @@ # Adafruit 1.27" 128*96 display https://www.adafruit.com/product/1673 # For wiring details see drivers/ADAFRUIT.md in this repo. -# The MIT License (MIT) +# Released under the MIT License (MIT). See LICENSE. +# Copyright (c) 2018-2020 Peter Hinch -# Copyright (c) 2018 Peter Hinch - -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -height = 96 # 1.27 inch 96*128 (rows*cols) display -# height = 128 # 1.5 inch 128*128 display - -import machine -import gc -from ssd1351 import SSD1351 as SSD - -# Initialise hardware and framebuf before importing modules -pdc = machine.Pin('X1', machine.Pin.OUT_PP, value=0) -pcs = machine.Pin('X2', machine.Pin.OUT_PP, value=1) -prst = machine.Pin('X3', machine.Pin.OUT_PP, value=1) -spi = machine.SPI(1) -gc.collect() # Precaution befor instantiating framebuf -ssd = SSD(spi, pcs, pdc, prst, height) # Create a display instance +from ssd1351_setup import ssd # Create a display instance import cmath import utime import uos -from writer import Writer, CWriter -from nanogui import Label, Meter, LED, Dial, Pointer, refresh +from gui.core.writer import Writer, CWriter +from gui.core.nanogui import Label, Meter, LED, Dial, Pointer, refresh # Fonts -import arial10, freesans20 +import gui.fonts.arial10 as arial10 +import gui.fonts.freesans20 as freesans20 + +from gui.core.colors import * -GREEN = SSD.rgb(0, 255, 0) -RED = SSD.rgb(255, 0, 0) -BLUE = SSD.rgb(0, 0, 255) -YELLOW = SSD.rgb(255, 255, 0) -BLACK = 0 CWriter.set_textpos(ssd, 0, 0) # In case previous tests have altered it wri = CWriter(ssd, arial10, GREEN, BLACK, verbose=False) wri.set_clip(True, True, False) diff --git a/gui/demos/color96.py b/gui/demos/color96.py index 3264ecf..cfebe4a 100644 --- a/gui/demos/color96.py +++ b/gui/demos/color96.py @@ -2,51 +2,20 @@ # https://www.adafruit.com/product/684 # For wiring details see drivers/ADAFRUIT.md in this repo. -# The MIT License (MIT) +# Released under the MIT License (MIT). See LICENSE. +# Copyright (c) 2018-2020 Peter Hinch -# Copyright (c) 2018 Peter Hinch +from ssd1351_setup import ssd # Create a display instance -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -import machine -import gc -from ssd1331 import SSD1331 as SSD -pdc = machine.Pin('X1', machine.Pin.OUT_PP, value=0) -pcs = machine.Pin('X2', machine.Pin.OUT_PP, value=1) -prst = machine.Pin('X3', machine.Pin.OUT_PP, value=1) -spi = machine.SPI(1) -gc.collect() -ssd = SSD(spi, pcs, pdc, prst) # Create a display instance - -from nanogui import Label, Meter, LED, refresh +from gui.core.nanogui import Label, Meter, LED, refresh refresh(ssd) # Fonts -import arial10 -from writer import Writer, CWriter +import gui.fonts.arial10 as arial10 + +from gui.core.writer import Writer, CWriter import utime import uos - -GREEN = SSD.rgb(0, 255, 0) -RED = SSD.rgb(255, 0, 0) -BLUE = SSD.rgb(0, 0, 255) -YELLOW = SSD.rgb(255, 255, 0) -BLACK = 0 +from gui.core.colors import * CWriter.set_textpos(ssd, 0, 0) # In case previous tests have altered it wri = CWriter(ssd, arial10, GREEN, BLACK, verbose=False) diff --git a/gui/demos/fpt.py b/gui/demos/fpt.py index eebc674..2a80cd5 100644 --- a/gui/demos/fpt.py +++ b/gui/demos/fpt.py @@ -3,27 +3,8 @@ # Adafruit 1.5" 128*128 OLED display: https://www.adafruit.com/product/1431 # Adafruit 1.27" 128*96 display https://www.adafruit.com/product/1673 -# The MIT License (MIT) - -# Copyright (c) 2018 Peter Hinch - -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. +# Released under the MIT License (MIT). See LICENSE. +# Copyright (c) 2018-2020 Peter Hinch # WIRING (Adafruit pin nos and names) # Pyb SSD @@ -38,37 +19,22 @@ height = 96 # 1.27 inch 96*128 (rows*cols) display # height = 128 # 1.5 inch 128*128 display -import machine -import gc -from ssd1351 import SSD1351 as SSD - -# Initialise hardware and framebuf before importing modules -pdc = machine.Pin('X1', machine.Pin.OUT_PP, value=0) -pcs = machine.Pin('X2', machine.Pin.OUT_PP, value=1) -prst = machine.Pin('X3', machine.Pin.OUT_PP, value=1) -spi = machine.SPI(1) -gc.collect() # Precaution befor instantiating framebuf -ssd = SSD(spi, pcs, pdc, prst, height) # Create a display instance +from ssd1351_setup import ssd # Create a display instance import cmath import math import utime import uos -from writer import Writer, CWriter -from fplot import PolarGraph, PolarCurve, CartesianGraph, Curve, TSequence -from nanogui import Label, refresh +from gui.core.writer import Writer, CWriter +from gui.core.fplot import PolarGraph, PolarCurve, CartesianGraph, Curve, TSequence +from gui.core.nanogui import Label, refresh refresh(ssd) # Fonts -import arial10, freesans20 +import gui.fonts.arial10 as arial10 +import gui.fonts.freesans20 as freesans20 -GREEN = SSD.rgb(0, 255, 0) -RED = SSD.rgb(255, 0, 0) -BLUE = SSD.rgb(0, 0, 255) -YELLOW = SSD.rgb(255, 255, 0) -WHITE = SSD.rgb(255, 255, 255) -BLACK = 0 -LIGHTGREEN = SSD.rgb(0, 100, 0) +from gui.core.colors import * CWriter.set_textpos(ssd, 0, 0) # In case previous tests have altered it wri = CWriter(ssd, arial10, GREEN, BLACK, verbose=False) diff --git a/gui/demos/mono_test.py b/gui/demos/mono_test.py index 6f89578..a72a1f4 100644 --- a/gui/demos/mono_test.py +++ b/gui/demos/mono_test.py @@ -1,27 +1,7 @@ # mono_test.py Demo program for nano_gui on an SSD1306 OLED display. -# The MIT License (MIT) -# -# Copyright (c) 2018 Peter Hinch -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - +# Released under the MIT License (MIT). See LICENSE. +# Copyright (c) 2018-2020 Peter Hinch # https://learn.adafruit.com/monochrome-oled-breakouts/wiring-128x32-spi-oled-display # https://www.proto-pic.co.uk/monochrome-128x32-oled-graphic-display.html @@ -31,14 +11,13 @@ import utime import uos from ssd1306_setup import WIDTH, HEIGHT, setup -from writer import Writer, CWriter -from nanogui import Label, Meter, refresh +from gui.core.writer import Writer, CWriter +from gui.core.nanogui import Label, Meter, refresh # Fonts -import courier20 as fixed -import font6 as small -import arial10 - +import gui.fonts.arial10 as arial10 +import gui.courier20 as fixed +import gui.fonts.font6 as small def fields(use_spi=False, soft=True): ssd = setup(use_spi, soft) # Create a display instance diff --git a/ssd1306_setup.py b/ssd1306_setup.py new file mode 100644 index 0000000..f5a2d08 --- /dev/null +++ b/ssd1306_setup.py @@ -0,0 +1,48 @@ +# ssd1306_setup.py Demo pogram for rendering arbitrary fonts to an SSD1306 OLED display. +# Device initialisation + +# Released under the MIT License (MIT). See LICENSE. +# Copyright (c) 2018-2020 Peter Hinch + + +# https://learn.adafruit.com/monochrome-oled-breakouts/wiring-128x32-spi-oled-display +# https://www.proto-pic.co.uk/monochrome-128x32-oled-graphic-display.html + +import machine +from drivers.ssd1306.ssd1306 import SSD1306_SPI, SSD1306_I2C + +WIDTH = const(128) +HEIGHT = const(64) + +def setup(use_spi=False, soft=True): + if use_spi: + # Pyb SSD + # 3v3 Vin + # Gnd Gnd + # X1 DC + # X2 CS + # X3 Rst + # X6 CLK + # X8 DATA + pdc = machine.Pin('Y1', machine.Pin.OUT_PP) + pcs = machine.Pin('Y2', machine.Pin.OUT_PP) + prst = machine.Pin('Y3', machine.Pin.OUT_PP) + if soft: + spi = machine.SPI(sck=machine.Pin('Y6'), mosi=machine.Pin('Y8'), miso=machine.Pin('Y7')) + else: + spi = machine.SPI(2) + ssd = SSD1306_SPI(WIDTH, HEIGHT, spi, pdc, prst, pcs) + else: # I2C + # Pyb SSD + # 3v3 Vin + # Gnd Gnd + # Y9 CLK + # Y10 DATA + if soft: + pscl = machine.Pin('Y9', machine.Pin.OPEN_DRAIN) + psda = machine.Pin('Y10', machine.Pin.OPEN_DRAIN) + i2c = machine.I2C(scl=pscl, sda=psda) + else: + i2c = machine.I2C(2) + ssd = SSD1306_I2C(WIDTH, HEIGHT, i2c) + return ssd