a93e49f
From 8aceef59a63536ff7cfe2e8ae5c7660970aa2589 Mon Sep 17 00:00:00 2001
Björn Esser ceb157d
From: ClockSelect <mrrraow@gmail.com>
Björn Esser ceb157d
Date: Sun, 21 Aug 2016 05:44:39 +0200
a93e49f
Subject: [PATCH 01/11] New commands for myevic
Björn Esser ceb157d
Björn Esser ceb157d
---
a93e49f
 README.rst        |  30 ++++++++++++++
a93e49f
 evic/cli.py       | 119 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
a93e49f
 evic/dataflash.py |   7 ++++
a93e49f
 evic/device.py    |  30 +++++++++++++-
a93e49f
 4 files changed, 184 insertions(+), 2 deletions(-)
Björn Esser ceb157d
Björn Esser ceb157d
diff --git a/README.rst b/README.rst
a93e49f
index 3e426d1..eb71212 100644
Björn Esser ceb157d
--- a/README.rst
Björn Esser ceb157d
+++ b/README.rst
a93e49f
@@ -125,3 +125,33 @@ Use  ``--no-verify`` to disable verification for APROM or data flash. To disable
Björn Esser ceb157d
 ::
Björn Esser ceb157d
 
Björn Esser ceb157d
     $ evic-usb upload --no-verify aprom --no-verify dataflash firmware.bin
Björn Esser ceb157d
+
Björn Esser ceb157d
+Reset the device:
Björn Esser ceb157d
+
Björn Esser ceb157d
+::
Björn Esser ceb157d
+
Björn Esser ceb157d
+    $ evic-usb reset
Björn Esser ceb157d
+
Björn Esser ceb157d
+Dump any part of the flash memory:
Björn Esser ceb157d
+
Björn Esser ceb157d
+::
Björn Esser ceb157d
+
Björn Esser ceb157d
+    $ evic-usb fmc-read -o out.bin -s startaddr -l length
Björn Esser ceb157d
+
Björn Esser ceb157d
+Example to read the parameters flash memory:
Björn Esser ceb157d
+
Björn Esser ceb157d
+::
Björn Esser ceb157d
+
Björn Esser ceb157d
+    $ evic-usb fmc-read -o out.bin -s 122880 -l 4096
Björn Esser ceb157d
+
Björn Esser ceb157d
+Setup date and time of the device to the current time:
Björn Esser ceb157d
+
Björn Esser ceb157d
+::
Björn Esser ceb157d
+
Björn Esser ceb157d
+    $ evic-usb time
Björn Esser ceb157d
+
Björn Esser ceb157d
+Take a screenshot of the device display:
Björn Esser ceb157d
+
Björn Esser ceb157d
+::
Björn Esser ceb157d
+
Björn Esser ceb157d
+    $ evic-usb screenshot -o outfile.[png|jpg|...]
Björn Esser ceb157d
diff --git a/evic/cli.py b/evic/cli.py
a93e49f
index 9d81038..95d02c0 100644
Björn Esser ceb157d
--- a/evic/cli.py
Björn Esser ceb157d
+++ b/evic/cli.py
a93e49f
@@ -24,6 +24,8 @@
Björn Esser ceb157d
 import struct
Björn Esser ceb157d
 from time import sleep
Björn Esser ceb157d
 from contextlib import contextmanager
Björn Esser ceb157d
+from datetime import datetime
Björn Esser ceb157d
+from PIL import Image
Björn Esser ceb157d
 
Björn Esser ceb157d
 import click
Björn Esser ceb157d
 
a93e49f
@@ -31,6 +33,7 @@
Björn Esser ceb157d
 
a93e49f
 from .device import DeviceInfo
Björn Esser ceb157d
 
a93e49f
+
Björn Esser ceb157d
 @contextmanager
Björn Esser ceb157d
 def handle_exceptions(*exceptions):
a93e49f
     """Context for handling exceptions."""
a93e49f
@@ -108,6 +111,24 @@ def read_dataflash(dev, verify):
Björn Esser ceb157d
     return dataflash
Björn Esser ceb157d
 
Björn Esser ceb157d
 
Björn Esser ceb157d
+def fmc_read(dev, start, len):
Björn Esser ceb157d
+    """Reads the device data flash.
Björn Esser ceb157d
+
Björn Esser ceb157d
+    Args:
Björn Esser ceb157d
+        dev: evic.HIDTransfer object.
Björn Esser ceb157d
+
Björn Esser ceb157d
+    Returns:
Björn Esser ceb157d
+        evic.DataFlash object containing the device data flash.
Björn Esser ceb157d
+    """
Björn Esser ceb157d
+
Björn Esser ceb157d
+    # Read the data flash
Björn Esser ceb157d
+    with handle_exceptions(IOError):
Björn Esser ceb157d
+        click.echo("Reading data flash...", nl=False)
Björn Esser ceb157d
+        fmemory = dev.fmc_read(start, len)
Björn Esser ceb157d
+
Björn Esser ceb157d
+    return fmemory
Björn Esser ceb157d
+
Björn Esser ceb157d
+
a93e49f
 def print_device_info(device_info, dataflash):
Björn Esser ceb157d
     """Prints the device information found from data flash.
Björn Esser ceb157d
 
a93e49f
@@ -237,6 +258,57 @@ def upload(inputfile, encrypted, dataflashfile, noverify):
Björn Esser ceb157d
         dev.write_aprom(aprom)
Björn Esser ceb157d
 
Björn Esser ceb157d
 
Björn Esser ceb157d
+@usb.command('reset')
Björn Esser ceb157d
+def reset():
Björn Esser ceb157d
+    """Resets the device."""
Björn Esser ceb157d
+
Björn Esser ceb157d
+    dev = evic.HIDTransfer()
Björn Esser ceb157d
+
Björn Esser ceb157d
+    # Connect the device
Björn Esser ceb157d
+    connect(dev)
Björn Esser ceb157d
+
Björn Esser ceb157d
+    # Restart
Björn Esser ceb157d
+    click.echo("Restarting the device...", nl=False)
Björn Esser ceb157d
+    dev.reset()
Björn Esser ceb157d
+    sleep(2)
Björn Esser ceb157d
+    click.secho("OK", fg='green', nl=False, bold=True)
Björn Esser ceb157d
+
Björn Esser ceb157d
+
Björn Esser ceb157d
+@usb.command('time')
Björn Esser ceb157d
+def time():
Björn Esser ceb157d
+    """Sets the device date/time to now."""
Björn Esser ceb157d
+
Björn Esser ceb157d
+    dev = evic.HIDTransfer()
a93e49f
+
Björn Esser ceb157d
+    # Connect the device
Björn Esser ceb157d
+    connect(dev)
a93e49f
+
Björn Esser ceb157d
+    # Read the data flash
Björn Esser ceb157d
+    dataflash = read_dataflash(dev, 1)
a93e49f
+
a93e49f
+    # Get the device info
a93e49f
+    device_info = dev.devices.get(dataflash.product_id,
a93e49f
+                                  DeviceInfo("Unknown device", None, None))
a93e49f
+
Björn Esser ceb157d
+    # Print the device information
a93e49f
+    print_device_info(device_info, dataflash)
a93e49f
+
Björn Esser ceb157d
+    dt = datetime.now()
Björn Esser ceb157d
+    dataflash.df_year = dt.year
Björn Esser ceb157d
+    dataflash.df_month = dt.month
Björn Esser ceb157d
+    dataflash.df_day = dt.day
Björn Esser ceb157d
+    dataflash.df_hour = dt.hour
Björn Esser ceb157d
+    dataflash.df_minute = dt.minute
Björn Esser ceb157d
+    dataflash.df_second = dt.second
Björn Esser ceb157d
+
Björn Esser ceb157d
+    # Write data flash to the device
Björn Esser ceb157d
+    with handle_exceptions(IOError):
Björn Esser ceb157d
+        click.echo("Writing data flash...", nl=False)
Björn Esser ceb157d
+        sleep(0.1)
Björn Esser ceb157d
+        dev.write_dataflash(dataflash)
Björn Esser ceb157d
+        click.secho("OK", fg='green', bold=True)
Björn Esser ceb157d
+
Björn Esser ceb157d
+
Björn Esser ceb157d
 @usb.command('upload-logo')
Björn Esser ceb157d
 @click.argument('inputfile', type=click.File('rb'))
Björn Esser ceb157d
 @click.option('--invert', '-i', is_flag=True,
a93e49f
@@ -329,6 +401,7 @@ def dumpdataflash(output, noverify):
a93e49f
     device_info = dev.devices.get(dataflash.product_id,
a93e49f
                                   DeviceInfo("Unknown device", None, None))
Björn Esser ceb157d
 
a93e49f
+
Björn Esser ceb157d
     # Print the device information
a93e49f
     print_device_info(device_info, dataflash)
Björn Esser ceb157d
 
a93e49f
@@ -338,6 +411,52 @@ def dumpdataflash(output, noverify):
Björn Esser ceb157d
         output.write(dataflash.array)
Björn Esser ceb157d
 
Björn Esser ceb157d
 
Björn Esser ceb157d
+@usb.command('fmcread')
Björn Esser ceb157d
+@click.option('--output', '-o', type=click.File('wb'), required=True)
Björn Esser ceb157d
+@click.option('--start', '-s', type=click.INT, required=True)
Björn Esser ceb157d
+@click.option('--length', '-l', type=click.INT, required=True)
Björn Esser ceb157d
+def fmcread(output, start, length):
Björn Esser ceb157d
+    """Write device flash memory to a file."""
Björn Esser ceb157d
+
Björn Esser ceb157d
+    dev = evic.HIDTransfer()
Björn Esser ceb157d
+
Björn Esser ceb157d
+    # Connect the device
Björn Esser ceb157d
+    connect(dev)
Björn Esser ceb157d
+
Björn Esser ceb157d
+    # Print the USB info of the device
Björn Esser ceb157d
+    print_usb_info(dev)
Björn Esser ceb157d
+
Björn Esser ceb157d
+    # Read the data flash
Björn Esser ceb157d
+    fmemory = fmc_read(dev, start, length)
Björn Esser ceb157d
+
Björn Esser ceb157d
+    # Write the data flash to the file
Björn Esser ceb157d
+    with handle_exceptions(IOError):
Björn Esser ceb157d
+        click.echo("Writing flash memory to the file...", nl=False)
Björn Esser ceb157d
+        output.write(fmemory)
Björn Esser ceb157d
+
Björn Esser ceb157d
+
Björn Esser ceb157d
+@usb.command('screenshot')
Björn Esser ceb157d
+@click.option('--output', '-o', type=click.File('wb'), required=True)
Björn Esser ceb157d
+def screenshot(output):
Björn Esser ceb157d
+    """Take a screenshot."""
Björn Esser ceb157d
+
Björn Esser ceb157d
+    dev = evic.HIDTransfer()
Björn Esser ceb157d
+
Björn Esser ceb157d
+    # Connect the device
Björn Esser ceb157d
+    connect(dev)
Björn Esser ceb157d
+
Björn Esser ceb157d
+    # Read the screen data
Björn Esser ceb157d
+    data = dev.read_screen()
Björn Esser ceb157d
+
Björn Esser ceb157d
+    # create the image from screen data
Björn Esser ceb157d
+    im = Image.fromstring("1",(64,128),bytes(data))
a93e49f
+
Björn Esser ceb157d
+    # Write the image to the file
Björn Esser ceb157d
+    with handle_exceptions(IOError):
Björn Esser ceb157d
+        click.echo("Writing image to the file...", nl=False)
Björn Esser ceb157d
+        im.save(output,"PNG")
Björn Esser ceb157d
+
Björn Esser ceb157d
+
Björn Esser ceb157d
 @usb.command('reset-dataflash')
Björn Esser ceb157d
 def resetdataflash():
Björn Esser ceb157d
     """Reset device data flash."""
Björn Esser ceb157d
diff --git a/evic/dataflash.py b/evic/dataflash.py
Björn Esser ceb157d
index 31abb2a..0c61651 100644
Björn Esser ceb157d
--- a/evic/dataflash.py
Björn Esser ceb157d
+++ b/evic/dataflash.py
Björn Esser ceb157d
@@ -46,6 +46,13 @@ class DataFlash(binstruct.StructTemplate):
Björn Esser ceb157d
     fw_version = binstruct.Int32Field(256)
Björn Esser ceb157d
     ldrom_version = binstruct.Int32Field(260)
Björn Esser ceb157d
 
Björn Esser ceb157d
+    df_year = binstruct.Int16Field(320)
Björn Esser ceb157d
+    df_month = binstruct.Int8Field(322)
Björn Esser ceb157d
+    df_day = binstruct.Int8Field(323)
Björn Esser ceb157d
+    df_hour = binstruct.Int8Field(324)
Björn Esser ceb157d
+    df_minute = binstruct.Int8Field(325)
Björn Esser ceb157d
+    df_second = binstruct.Int8Field(326)
Björn Esser ceb157d
+
Björn Esser ceb157d
     def verify(self, checksum):
Björn Esser ceb157d
         """Verifies the data flash against given checksum.
Björn Esser ceb157d
 
Björn Esser ceb157d
diff --git a/evic/device.py b/evic/device.py
a93e49f
index 383c234..6ba39a4 100644
Björn Esser ceb157d
--- a/evic/device.py
Björn Esser ceb157d
+++ b/evic/device.py
a93e49f
@@ -53,7 +53,6 @@ class HIDTransfer(object):
a93e49f
                'E052': DeviceInfo("eVic-VTC Mini", ['W007'], (64, 40)),
a93e49f
                'E056': DeviceInfo("CUBOID MINI", None, (64, 40)),
a93e49f
                'E060': DeviceInfo("Cuboid", None, (64, 40)),
a93e49f
-               'E079': DeviceInfo("eVic VTC Dual", None, (64, 40)),
a93e49f
                'E083': DeviceInfo("eGrip II", None, (64, 40)),
a93e49f
                'E092': DeviceInfo("eVic AIO", None, (64, 40)),
a93e49f
                'E115': DeviceInfo("eVic VTwo mini", None, (64, 40)),
a93e49f
@@ -70,7 +69,6 @@ class HIDTransfer(object):
a93e49f
                'W014': DeviceInfo("Reuleaux RX200", None, None),
a93e49f
                'W016': DeviceInfo("CENTURION", None, None),
a93e49f
                'W018': DeviceInfo("Reuleaux RX2/3", None, (64, 48)),
a93e49f
-               'W026': DeviceInfo("Reuleaux RX75", None, (64, 48)),
a93e49f
                'W033': DeviceInfo("Reuleaux RX200S", None, None)
a93e49f
               }
Björn Esser ceb157d
 
a93e49f
@@ -163,6 +161,34 @@ def read_dataflash(self):
Björn Esser ceb157d
 
Björn Esser ceb157d
         return (dataflash, checksum)
Björn Esser ceb157d
 
Björn Esser ceb157d
+    def fmc_read(self, start, length):
Björn Esser ceb157d
+        """Reads the device flash memory.
Björn Esser ceb157d
+
Björn Esser ceb157d
+        Returns:
Björn Esser ceb157d
+            An array containing the data flash memory content.
Björn Esser ceb157d
+        """
Björn Esser ceb157d
+
Björn Esser ceb157d
+        # Send the command for reading the data flash
Björn Esser ceb157d
+        self.send_command(0xC0, start, length)
Björn Esser ceb157d
+
Björn Esser ceb157d
+        # Read the dataflash
Björn Esser ceb157d
+        buf = self.read(length)
Björn Esser ceb157d
+        return (buf)
Björn Esser ceb157d
+
Björn Esser ceb157d
+    def read_screen(self):
Björn Esser ceb157d
+        """Reads the screen memory.
Björn Esser ceb157d
+
Björn Esser ceb157d
+        Returns:
Björn Esser ceb157d
+            An array containing the screen.
Björn Esser ceb157d
+        """
Björn Esser ceb157d
+
Björn Esser ceb157d
+        # Send the command for reading the screen buffer
Björn Esser ceb157d
+        self.send_command(0xC1, 0, 0x400)
Björn Esser ceb157d
+
Björn Esser ceb157d
+        # Read the data
Björn Esser ceb157d
+        buf = self.read(0x400)
Björn Esser ceb157d
+        return (buf)
Björn Esser ceb157d
+
Björn Esser ceb157d
     def write(self, data):
Björn Esser ceb157d
         """Writes data to the device.
Björn Esser ceb157d
 
Björn Esser ceb157d
a93e49f
From 8a929790b971bad8bd2d40568db9b2609aa09f63 Mon Sep 17 00:00:00 2001
Björn Esser ceb157d
From: ClockSelect <mrrraow@gmail.com>
Björn Esser ceb157d
Date: Sun, 4 Sep 2016 10:53:51 +0200
a93e49f
Subject: [PATCH 02/11] Logo dimensions for Presa 75 running myevic firmware
Björn Esser ceb157d
Björn Esser ceb157d
---
Björn Esser ceb157d
 evic/device.py | 2 +-
Björn Esser ceb157d
 1 file changed, 1 insertion(+), 1 deletion(-)
Björn Esser ceb157d
Björn Esser ceb157d
diff --git a/evic/device.py b/evic/device.py
Björn Esser ceb157d
index 6ba39a4..33be1b5 100644
Björn Esser ceb157d
--- a/evic/device.py
Björn Esser ceb157d
+++ b/evic/device.py
Björn Esser ceb157d
@@ -62,7 +62,7 @@ class HIDTransfer(object):
Björn Esser ceb157d
                'M041': DeviceInfo("iStick Pico", None, (96, 16)),
Björn Esser ceb157d
                'M045': DeviceInfo("iStick Pico Mega", None, (96, 16)),
Björn Esser ceb157d
                'M046': DeviceInfo("iPower", None, (96, 16)),
Björn Esser ceb157d
-               'W007': DeviceInfo("Presa TC75W", ['E052'], None),
Björn Esser ceb157d
+               'W007': DeviceInfo("Presa TC75W", ['E052'], (64,40)),
Björn Esser ceb157d
                'W010': DeviceInfo("Classic", None, None),
Björn Esser ceb157d
                'W011': DeviceInfo("Lite", None, None),
Björn Esser ceb157d
                'W013': DeviceInfo("Stout", None, None),
Björn Esser ceb157d
a93e49f
From 6b6368e0af4ce2a52448c3733c5caf8190716b83 Mon Sep 17 00:00:00 2001
Björn Esser ceb157d
From: ClockSelect <mrrraow@gmail.com>
Björn Esser ceb157d
Date: Wed, 7 Sep 2016 13:05:44 +0200
a93e49f
Subject: [PATCH 03/11] Fix time accuracy
Björn Esser ceb157d
Björn Esser ceb157d
---
Björn Esser ceb157d
 evic/cli.py | 15 +++++++--------
Björn Esser ceb157d
 1 file changed, 7 insertions(+), 8 deletions(-)
Björn Esser ceb157d
Björn Esser ceb157d
diff --git a/evic/cli.py b/evic/cli.py
Björn Esser ceb157d
index 95d02c0..9d774bd 100644
Björn Esser ceb157d
--- a/evic/cli.py
Björn Esser ceb157d
+++ b/evic/cli.py
Björn Esser ceb157d
@@ -293,18 +293,17 @@ def time():
Björn Esser ceb157d
     # Print the device information
Björn Esser ceb157d
     print_device_info(device_info, dataflash)
Björn Esser ceb157d
 
Björn Esser ceb157d
-    dt = datetime.now()
Björn Esser ceb157d
-    dataflash.df_year = dt.year
Björn Esser ceb157d
-    dataflash.df_month = dt.month
Björn Esser ceb157d
-    dataflash.df_day = dt.day
Björn Esser ceb157d
-    dataflash.df_hour = dt.hour
Björn Esser ceb157d
-    dataflash.df_minute = dt.minute
Björn Esser ceb157d
-    dataflash.df_second = dt.second
Björn Esser ceb157d
-
Björn Esser ceb157d
     # Write data flash to the device
Björn Esser ceb157d
     with handle_exceptions(IOError):
Björn Esser ceb157d
         click.echo("Writing data flash...", nl=False)
Björn Esser ceb157d
         sleep(0.1)
Björn Esser ceb157d
+        dt = datetime.now()
Björn Esser ceb157d
+        dataflash.df_year = dt.year
Björn Esser ceb157d
+        dataflash.df_month = dt.month
Björn Esser ceb157d
+        dataflash.df_day = dt.day
Björn Esser ceb157d
+        dataflash.df_hour = dt.hour
Björn Esser ceb157d
+        dataflash.df_minute = dt.minute
Björn Esser ceb157d
+        dataflash.df_second = dt.second
Björn Esser ceb157d
         dev.write_dataflash(dataflash)
Björn Esser ceb157d
         click.secho("OK", fg='green', bold=True)
Björn Esser ceb157d
 
Björn Esser ceb157d
a93e49f
From c56807c6586b6bf8e556314e6bdfcb81bd4b54c8 Mon Sep 17 00:00:00 2001
Björn Esser ceb157d
From: ClockSelect <mrrraow@gmail.com>
Björn Esser ceb157d
Date: Sat, 8 Oct 2016 05:03:12 +0200
a93e49f
Subject: [PATCH 04/11] Generic HID input command and LDROM update feature
Björn Esser ceb157d
Björn Esser ceb157d
---
Björn Esser ceb157d
 evic/cli.py    | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Björn Esser ceb157d
 evic/device.py | 34 ++++++++++++++++++++++++++
Björn Esser ceb157d
 2 files changed, 110 insertions(+)
Björn Esser ceb157d
Björn Esser ceb157d
diff --git a/evic/cli.py b/evic/cli.py
Björn Esser ceb157d
index 9d774bd..607e97d 100644
Björn Esser ceb157d
--- a/evic/cli.py
Björn Esser ceb157d
+++ b/evic/cli.py
Björn Esser ceb157d
@@ -129,6 +129,24 @@ def fmc_read(dev, start, len):
Björn Esser ceb157d
     return fmemory
Björn Esser ceb157d
 
Björn Esser ceb157d
 
Björn Esser ceb157d
+def hid_command(dev, cmd, start, len):
Björn Esser ceb157d
+    """Sends a HID command.
Björn Esser ceb157d
+
Björn Esser ceb157d
+    Args:
Björn Esser ceb157d
+        dev: evic.HIDTransfer object.
Björn Esser ceb157d
+
Björn Esser ceb157d
+    Returns:
Björn Esser ceb157d
+        evic.DataFlash object containing the device data flash.
Björn Esser ceb157d
+    """
Björn Esser ceb157d
+
Björn Esser ceb157d
+    # Send the command
Björn Esser ceb157d
+    with handle_exceptions(IOError):
Björn Esser ceb157d
+        click.echo("Sending command...", nl=False)
Björn Esser ceb157d
+        fmemory = dev.hid_command(cmd, start, len)
Björn Esser ceb157d
+
Björn Esser ceb157d
+    return fmemory
Björn Esser ceb157d
+
Björn Esser ceb157d
+
Björn Esser ceb157d
 def print_device_info(device_info, dataflash):
Björn Esser ceb157d
     """Prints the device information found from data flash.
Björn Esser ceb157d
 
Björn Esser ceb157d
@@ -258,6 +276,39 @@ def upload(inputfile, encrypted, dataflashfile, noverify):
Björn Esser ceb157d
         dev.write_aprom(aprom)
Björn Esser ceb157d
 
Björn Esser ceb157d
 
Björn Esser ceb157d
+@usb.command('upload-ldrom')
Björn Esser ceb157d
+@click.argument('inputfile', type=click.File('rb'))
Björn Esser ceb157d
+def upload_ldrom(inputfile):
Björn Esser ceb157d
+    """Upload an LDROM image to the device."""
Björn Esser ceb157d
+
Björn Esser ceb157d
+    dev = evic.HIDTransfer()
Björn Esser ceb157d
+
Björn Esser ceb157d
+    # Connect the device
Björn Esser ceb157d
+    connect(dev)
Björn Esser ceb157d
+
Björn Esser ceb157d
+    # Print the USB info of the device
Björn Esser ceb157d
+    print_usb_info(dev)
Björn Esser ceb157d
+
Björn Esser ceb157d
+    # Read the data flash
Björn Esser ceb157d
+    dataflash = read_dataflash(dev, False)
Björn Esser ceb157d
+
Björn Esser ceb157d
+    # Get the device info
Björn Esser ceb157d
+    device_info = dev.devices.get(dataflash.product_id,
Björn Esser ceb157d
+                                  DeviceInfo("Unknown device", None, None))
Björn Esser ceb157d
+
Björn Esser ceb157d
+    # Print the device information
Björn Esser ceb157d
+    print_device_info(device_info, dataflash)
Björn Esser ceb157d
+
Björn Esser ceb157d
+    # Read the LDROM image
Björn Esser ceb157d
+    ldrom = evic.APROM(inputfile.read())
Björn Esser ceb157d
+
Björn Esser ceb157d
+    # Write data flash to the device
Björn Esser ceb157d
+    with handle_exceptions(IOError):
Björn Esser ceb157d
+        # Write LDROM to the device
Björn Esser ceb157d
+        click.echo("Writing LDROM...", nl=False)
Björn Esser ceb157d
+        dev.write_ldrom(ldrom)
Björn Esser ceb157d
+
Björn Esser ceb157d
+
Björn Esser ceb157d
 @usb.command('reset')
Björn Esser ceb157d
 def reset():
Björn Esser ceb157d
     """Resets the device."""
Björn Esser ceb157d
@@ -434,6 +485,31 @@ def fmcread(output, start, length):
Björn Esser ceb157d
         output.write(fmemory)
Björn Esser ceb157d
 
Björn Esser ceb157d
 
Björn Esser ceb157d
+@usb.command('hidcmd')
Björn Esser ceb157d
+@click.option('--output', '-o', type=click.File('wb'), required=True)
Björn Esser ceb157d
+@click.option('--command', '-c', type=click.INT, required=True)
Björn Esser ceb157d
+@click.option('--start', '-s', type=click.INT, required=True)
Björn Esser ceb157d
+@click.option('--length', '-l', type=click.INT, required=True)
Björn Esser ceb157d
+def hidcmd(command, output, start, length):
Björn Esser ceb157d
+    """Send a HID command to the device."""
Björn Esser ceb157d
+
Björn Esser ceb157d
+    dev = evic.HIDTransfer()
Björn Esser ceb157d
+
Björn Esser ceb157d
+    # Connect the device
Björn Esser ceb157d
+    connect(dev)
Björn Esser ceb157d
+
Björn Esser ceb157d
+    # Print the USB info of the device
Björn Esser ceb157d
+    print_usb_info(dev)
Björn Esser ceb157d
+
Björn Esser ceb157d
+    # Send the command
Björn Esser ceb157d
+    response = hid_command(dev, command, start, length)
Björn Esser ceb157d
+
Björn Esser ceb157d
+    # Write the data flash to the file
Björn Esser ceb157d
+    with handle_exceptions(IOError):
Björn Esser ceb157d
+        click.echo("Writing command response to the file...", nl=False)
Björn Esser ceb157d
+        output.write(response)
Björn Esser ceb157d
+
Björn Esser ceb157d
+
Björn Esser ceb157d
 @usb.command('screenshot')
Björn Esser ceb157d
 @click.option('--output', '-o', type=click.File('wb'), required=True)
Björn Esser ceb157d
 def screenshot(output):
Björn Esser ceb157d
diff --git a/evic/device.py b/evic/device.py
Björn Esser ceb157d
index 33be1b5..7f27e8f 100644
Björn Esser ceb157d
--- a/evic/device.py
Björn Esser ceb157d
+++ b/evic/device.py
Björn Esser ceb157d
@@ -175,6 +175,20 @@ def fmc_read(self, start, length):
Björn Esser ceb157d
         buf = self.read(length)
Björn Esser ceb157d
         return (buf)
Björn Esser ceb157d
 
Björn Esser ceb157d
+    def hid_command(self, cmd, start, length):
Björn Esser ceb157d
+        """Send a HID command to the device.
Björn Esser ceb157d
+
Björn Esser ceb157d
+        Returns:
Björn Esser ceb157d
+            An array containing command response.
Björn Esser ceb157d
+        """
Björn Esser ceb157d
+
Björn Esser ceb157d
+        # Send the command for reading the data flash
Björn Esser ceb157d
+        self.send_command(cmd, start, length)
Björn Esser ceb157d
+
Björn Esser ceb157d
+        # Read the response
Björn Esser ceb157d
+        buf = self.read(length)
Björn Esser ceb157d
+        return (buf)
Björn Esser ceb157d
+
Björn Esser ceb157d
     def read_screen(self):
Björn Esser ceb157d
         """Reads the screen memory.
Björn Esser ceb157d
 
Björn Esser ceb157d
@@ -294,6 +308,17 @@ def write_flash(self, data, start):
Björn Esser ceb157d
 
Björn Esser ceb157d
         self.write(data)
Björn Esser ceb157d
 
Björn Esser ceb157d
+    def write_ldflash(self, data):
Björn Esser ceb157d
+        """Writes data to the flash memory.
Björn Esser ceb157d
+        """
Björn Esser ceb157d
+
Björn Esser ceb157d
+        end = len(data)
Björn Esser ceb157d
+
Björn Esser ceb157d
+        # Send the command for writing the data
Björn Esser ceb157d
+        self.send_command(0x3C, 0x100000, end)
Björn Esser ceb157d
+
Björn Esser ceb157d
+        self.write(data)
Björn Esser ceb157d
+
Björn Esser ceb157d
     def write_aprom(self, aprom):
Björn Esser ceb157d
         """Writes the APROM to the device.
Björn Esser ceb157d
 
Björn Esser ceb157d
@@ -303,6 +328,15 @@ def write_aprom(self, aprom):
Björn Esser ceb157d
 
Björn Esser ceb157d
         self.write_flash(aprom.data, 0)
Björn Esser ceb157d
 
Björn Esser ceb157d
+    def write_ldrom(self, ldrom):
Björn Esser ceb157d
+        """Writes the LDROM to the device.
Björn Esser ceb157d
+
Björn Esser ceb157d
+        Args:
Björn Esser ceb157d
+            aprom: A BinFile object containing an unencrypted LDROM image.
Björn Esser ceb157d
+        """
Björn Esser ceb157d
+
Björn Esser ceb157d
+        self.write_ldflash(ldrom.data)
Björn Esser ceb157d
+
Björn Esser ceb157d
     def write_logo(self, logo):
Björn Esser ceb157d
         """Writes the logo to the the device.
Björn Esser ceb157d
 
a93e49f
a93e49f
From d30ce886d0ce4fae6eb6cfe7695d64838fe0d70f Mon Sep 17 00:00:00 2001
a93e49f
From: ClockSelect <mrrraow@gmail.com>
a93e49f
Date: Mon, 24 Jul 2017 22:40:25 +0200
a93e49f
Subject: [PATCH 05/11] Add devices VTC Dual & Primo Mini
a93e49f
a93e49f
---
a93e49f
 evic/device.py | 2 ++
a93e49f
 1 file changed, 2 insertions(+)
a93e49f
a93e49f
diff --git a/evic/device.py b/evic/device.py
a93e49f
index 7f27e8f..a5764b7 100644
a93e49f
--- a/evic/device.py
a93e49f
+++ b/evic/device.py
a93e49f
@@ -56,7 +56,9 @@ class HIDTransfer(object):
a93e49f
                'E083': DeviceInfo("eGrip II", None, (64, 40)),
a93e49f
                'E092': DeviceInfo("eVic AIO", None, (64, 40)),
a93e49f
                'E115': DeviceInfo("eVic VTwo mini", None, (64, 40)),
a93e49f
+               'E079': DeviceInfo("eVic VTC Dual", None, (64, 40)),
a93e49f
                'E150': DeviceInfo("eVic Basic", None, (64, 40)),
a93e49f
+               'E196': DeviceInfo("eVic Primo Mini", None, (64, 40)),
a93e49f
                'M011': DeviceInfo("iStick TC100W", None, None),
a93e49f
                'M037': DeviceInfo("ASTER", None, (96, 16)),
a93e49f
                'M041': DeviceInfo("iStick Pico", None, (96, 16)),
a93e49f
a93e49f
From 928f39032e6d2a16a35186d1632b77d63b62ba5c Mon Sep 17 00:00:00 2001
a93e49f
From: Timofey Titovets <nefelim4ag@gmail.com>
a93e49f
Date: Sun, 22 Jan 2017 16:02:35 +0300
a93e49f
Subject: [PATCH 06/11] Notes about autosync time on device
a93e49f
a93e49f
Signed-off-by: Timofey Titovets <nefelim4ag@gmail.com>
a93e49f
---
a93e49f
 README.rst                        | 5 +++++
a93e49f
 scripts/evic-usb-rtc-sync.service | 6 ++++++
a93e49f
 udev/99-nuvoton-hid.rules         | 3 +++
a93e49f
 3 files changed, 14 insertions(+)
a93e49f
 create mode 100644 scripts/evic-usb-rtc-sync.service
a93e49f
a93e49f
diff --git a/README.rst b/README.rst
a93e49f
index eb71212..2948b43 100644
a93e49f
--- a/README.rst
a93e49f
+++ b/README.rst
a93e49f
@@ -79,6 +79,11 @@ Allowing non-root access to the device
a93e49f
 
a93e49f
 The file ``udev/99-nuvoton-hid.rules`` contains an example set of rules for setting the device permissions to ``0666``.  Copy the file to the directory ``/etc/udev/rules.d/`` to use it.
a93e49f
 
a93e49f
+Autosync time when device connected
a93e49f
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
a93e49f
+
a93e49f
+The file ``scripts/evic-usb-rtc-sync.service`` + ``udev/99-nuvoton-hid.rules`` is a example of how to auto sync time
a93e49f
+
a93e49f
 Usage
a93e49f
 -------
a93e49f
 See  ``--help`` for more information on a given command.
a93e49f
diff --git a/scripts/evic-usb-rtc-sync.service b/scripts/evic-usb-rtc-sync.service
a93e49f
new file mode 100644
a93e49f
index 0000000..e756dd2
a93e49f
--- /dev/null
a93e49f
+++ b/scripts/evic-usb-rtc-sync.service
a93e49f
@@ -0,0 +1,6 @@
a93e49f
+[Unit]
a93e49f
+Description=Evic RTC sync
a93e49f
+
a93e49f
+[Service]
a93e49f
+ExecStart=/bin/bash -c 'lsusb -d 0416:5020 && evic-usb time'
a93e49f
+RemainAfterExit=yes
a93e49f
diff --git a/udev/99-nuvoton-hid.rules b/udev/99-nuvoton-hid.rules
a93e49f
index 0ee1b6f..6c6a9bb 100644
a93e49f
--- a/udev/99-nuvoton-hid.rules
a93e49f
+++ b/udev/99-nuvoton-hid.rules
a93e49f
@@ -3,3 +3,6 @@ SUBSYSTEM=="usb", ATTRS{idVendor}=="0416", ATTRS{idProduct}=="5020", MODE="0666"
a93e49f
 
a93e49f
 # HIDAPI/hidraw
a93e49f
 KERNEL=="hidraw*", ATTRS{busnum}=="1", ATTRS{idVendor}=="0416", ATTRS{idProduct}=="5020", MODE="0666"
a93e49f
+
a93e49f
+# HIDAPI/libusb RTC Sync
a93e49f
+ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="0416", ATTRS{idProduct}=="5020", RUN+="/usr/bin/systemctl restart evic-usb-rtc-sync"
a93e49f
a93e49f
From 5d30503fad0d7b4deac8c5b20020461420c1eacc Mon Sep 17 00:00:00 2001
a93e49f
From: Thomas Spigel <thomas.spigel@gmail.com>
a93e49f
Date: Sat, 7 Jan 2017 10:19:31 +0100
a93e49f
Subject: [PATCH 07/11] Added support for Wismec Presa 100W, with logo upload
a93e49f
 support 64x40
a93e49f
a93e49f
---
a93e49f
 evic/device.py | 1 +
a93e49f
 1 file changed, 1 insertion(+)
a93e49f
a93e49f
diff --git a/evic/device.py b/evic/device.py
a93e49f
index a5764b7..ca8eeae 100644
a93e49f
--- a/evic/device.py
a93e49f
+++ b/evic/device.py
a93e49f
@@ -65,6 +65,7 @@ class HIDTransfer(object):
a93e49f
                'M045': DeviceInfo("iStick Pico Mega", None, (96, 16)),
a93e49f
                'M046': DeviceInfo("iPower", None, (96, 16)),
a93e49f
                'W007': DeviceInfo("Presa TC75W", ['E052'], (64,40)),
a93e49f
+               'W017': DeviceInfo("Presa TC100W", None, (64, 40)),
a93e49f
                'W010': DeviceInfo("Classic", None, None),
a93e49f
                'W011': DeviceInfo("Lite", None, None),
a93e49f
                'W013': DeviceInfo("Stout", None, None),
a93e49f
a93e49f
From 51b9eb6aa81af43af0bb2356a5c4109899046afd Mon Sep 17 00:00:00 2001
a93e49f
From: Arne Zellentin <arne.zellentin@kernelconcepts.de>
a93e49f
Date: Tue, 11 Apr 2017 17:21:17 +0200
a93e49f
Subject: [PATCH 08/11] added support for Wismec Predator 228
a93e49f
a93e49f
---
a93e49f
 evic/device.py | 4 +++-
a93e49f
 1 file changed, 3 insertions(+), 1 deletion(-)
a93e49f
a93e49f
diff --git a/evic/device.py b/evic/device.py
a93e49f
index ca8eeae..0d60901 100644
a93e49f
--- a/evic/device.py
a93e49f
+++ b/evic/device.py
a93e49f
@@ -72,7 +72,9 @@ class HIDTransfer(object):
a93e49f
                'W014': DeviceInfo("Reuleaux RX200", None, None),
a93e49f
                'W016': DeviceInfo("CENTURION", None, None),
a93e49f
                'W018': DeviceInfo("Reuleaux RX2/3", None, (64, 48)),
a93e49f
-               'W033': DeviceInfo("Reuleaux RX200S", None, None)
a93e49f
+               'W026': DeviceInfo("Reuleaux RX75", None, (64, 48)),
a93e49f
+               'W033': DeviceInfo("Reuleaux RX200S", None, None),
a93e49f
+               'W078': DeviceInfo("Predator 228", None, (64, 48))
a93e49f
               }
a93e49f
 
a93e49f
     # 0x43444948
a93e49f
a93e49f
From 0e445578bcaa30c2e12e533fe95e3093d0771af1 Mon Sep 17 00:00:00 2001
a93e49f
From: yanbec <github@yannickbecker.de>
a93e49f
Date: Fri, 12 May 2017 13:43:02 +0200
a93e49f
Subject: [PATCH 09/11] Added logo support for RX200s
a93e49f
a93e49f
According to Wismec logo support for RX200s is supported since FW V4.02. Tested with FW 4.13.
a93e49f
---
a93e49f
 evic/device.py | 2 +-
a93e49f
 1 file changed, 1 insertion(+), 1 deletion(-)
a93e49f
a93e49f
diff --git a/evic/device.py b/evic/device.py
a93e49f
index 0d60901..db65447 100644
a93e49f
--- a/evic/device.py
a93e49f
+++ b/evic/device.py
a93e49f
@@ -73,7 +73,7 @@ class HIDTransfer(object):
a93e49f
                'W016': DeviceInfo("CENTURION", None, None),
a93e49f
                'W018': DeviceInfo("Reuleaux RX2/3", None, (64, 48)),
a93e49f
                'W026': DeviceInfo("Reuleaux RX75", None, (64, 48)),
a93e49f
-               'W033': DeviceInfo("Reuleaux RX200S", None, None),
a93e49f
+               'W033': DeviceInfo("Reuleaux RX200S", None, (64, 48))
a93e49f
                'W078': DeviceInfo("Predator 228", None, (64, 48))
a93e49f
               }
a93e49f
 
a93e49f
a93e49f
From 9ff63462f4c5a4739c74d902f4b5166d13ea199d Mon Sep 17 00:00:00 2001
a93e49f
From: Jan Sperling <sperling@b1-systems.de>
a93e49f
Date: Wed, 20 Dec 2017 12:04:34 +0100
a93e49f
Subject: [PATCH 10/11] add new devices and update list of tested devices
a93e49f
a93e49f
---
a93e49f
 README.rst     | 53 ++++++++++++++++++++++++++++++------------------
a93e49f
 evic/device.py | 63 ++++++++++++++++++++++++++++++++++------------------------
a93e49f
 2 files changed, 71 insertions(+), 45 deletions(-)
a93e49f
a93e49f
diff --git a/README.rst b/README.rst
a93e49f
index 2948b43..685d647 100644
a93e49f
--- a/README.rst
a93e49f
+++ b/README.rst
a93e49f
@@ -10,28 +10,43 @@ Evic is a USB programmer for devices based on the Joyetech Evic VTC Mini.
a93e49f
 Supported devices
a93e49f
 ---------------------
a93e49f
 
a93e49f
-* eVic VTwo*
a93e49f
-* Evic VTC Mini
a93e49f
-* Cuboid Mini
a93e49f
-* Cuboid
a93e49f
-* eVic VTC Dual*
a93e49f
-* eGrip II*
a93e49f
-* eVic AIO*
a93e49f
-* eVic VTwo mini*
a93e49f
-* eVic Basic*
a93e49f
-* iStick TC100W*
a93e49f
-* ASTER*
a93e49f
-* iStick Pico
a93e49f
-* iStick Pico Mega*
a93e49f
-* iPower*
a93e49f
-* Presa TC75W*
a93e49f
+* Joyetech eVic VTwo*
a93e49f
+* Joyetech eVic VTwo mini
a93e49f
+* Joyetech evic VTC Mini
a93e49f
+* Joyetech eVic VTC Dual*
a93e49f
+* Joyetech eVic AIO*
a93e49f
+* Joyetech eVic Basic*
a93e49f
+* Joyetech eVic Primo*
a93e49f
+* Joyetech eVic Primo Mini*
a93e49f
+* Joyetech eVic Primo 2.0*
a93e49f
+* Joyetech Cuboid
a93e49f
+* Joyetech Cuboid Mini
a93e49f
+* Joyetech Cuboid 200*
a93e49f
+* Joyetech eGrip II*
a93e49f
+* Eleaf iStick QC 200W*
a93e49f
+* Eleaf iStick TC100W*
a93e49f
+* Eleaf iStick TC200W*
a93e49f
+* Eleaf iStick Pico
a93e49f
+* Eleaf iStick Pico RDTA*
a93e49f
+* Eleaf iStick Pico Mega*
a93e49f
+* Eleaf iStick Pico Dual*
a93e49f
+* Eleaf iStick Power*
a93e49f
+* Eleaf ASTER*
a93e49f
+* Wismec Presa TC75W
a93e49f
+* Wismec Presa TC100W*
a93e49f
+* Wismec Reuleaux RX2/3
a93e49f
+* Wismec Reuleaux RX200*
a93e49f
+* Wismec Reuleaux RX200S*
a93e49f
+* Wismec Reuleaux RX75
a93e49f
+* Wismec Reuleaux RX300*
a93e49f
+* Wismec Reuleaux RXmini*
a93e49f
+* Wismec Predator 228
a93e49f
 * Vaporflask Classic*
a93e49f
 * Vaporflask Lite*
a93e49f
 * Vaporflask Stout*
a93e49f
-* Reuleaux RX200*
a93e49f
-* CENTURION*
a93e49f
-* Reuleaux RX2/3*
a93e49f
-* Reuleaux RX200S*
a93e49f
+* Beyondvape Centurion*
a93e49f
+* Vaponaute La Petit Box*
a93e49f
+* Vapor Shark SwitchBox RX*
a93e49f
 
a93e49f
 \*Untested
a93e49f
 
a93e49f
diff --git a/evic/device.py b/evic/device.py
a93e49f
index db65447..86c37df 100644
a93e49f
--- a/evic/device.py
a93e49f
+++ b/evic/device.py
a93e49f
@@ -49,32 +49,43 @@ class HIDTransfer(object):
a93e49f
 
a93e49f
     vid = 0x0416
a93e49f
     pid = 0x5020
a93e49f
-    devices = {'E043': DeviceInfo("eVic VTwo", None, (64, 40)),
a93e49f
-               'E052': DeviceInfo("eVic-VTC Mini", ['W007'], (64, 40)),
a93e49f
-               'E056': DeviceInfo("CUBOID MINI", None, (64, 40)),
a93e49f
-               'E060': DeviceInfo("Cuboid", None, (64, 40)),
a93e49f
-               'E083': DeviceInfo("eGrip II", None, (64, 40)),
a93e49f
-               'E092': DeviceInfo("eVic AIO", None, (64, 40)),
a93e49f
-               'E115': DeviceInfo("eVic VTwo mini", None, (64, 40)),
a93e49f
-               'E079': DeviceInfo("eVic VTC Dual", None, (64, 40)),
a93e49f
-               'E150': DeviceInfo("eVic Basic", None, (64, 40)),
a93e49f
-               'E196': DeviceInfo("eVic Primo Mini", None, (64, 40)),
a93e49f
-               'M011': DeviceInfo("iStick TC100W", None, None),
a93e49f
-               'M037': DeviceInfo("ASTER", None, (96, 16)),
a93e49f
-               'M041': DeviceInfo("iStick Pico", None, (96, 16)),
a93e49f
-               'M045': DeviceInfo("iStick Pico Mega", None, (96, 16)),
a93e49f
-               'M046': DeviceInfo("iPower", None, (96, 16)),
a93e49f
-               'W007': DeviceInfo("Presa TC75W", ['E052'], (64,40)),
a93e49f
-               'W017': DeviceInfo("Presa TC100W", None, (64, 40)),
a93e49f
-               'W010': DeviceInfo("Classic", None, None),
a93e49f
-               'W011': DeviceInfo("Lite", None, None),
a93e49f
-               'W013': DeviceInfo("Stout", None, None),
a93e49f
-               'W014': DeviceInfo("Reuleaux RX200", None, None),
a93e49f
-               'W016': DeviceInfo("CENTURION", None, None),
a93e49f
-               'W018': DeviceInfo("Reuleaux RX2/3", None, (64, 48)),
a93e49f
-               'W026': DeviceInfo("Reuleaux RX75", None, (64, 48)),
a93e49f
-               'W033': DeviceInfo("Reuleaux RX200S", None, (64, 48))
a93e49f
-               'W078': DeviceInfo("Predator 228", None, (64, 48))
a93e49f
+    devices = {'E043': DeviceInfo("Joyetech eVic VTwo", None, (64, 40)),
a93e49f
+               'E052': DeviceInfo("Joyetech eVic VTC Mini", ['W007'], (64, 40)),
a93e49f
+               'E056': DeviceInfo("Joyetech Cuboid Mini", None, (64, 40)),
a93e49f
+               'E060': DeviceInfo("Joyetech Cuboid", None, (64, 40)),
a93e49f
+               'E079': DeviceInfo("Joyetech eVic VTC Dual", None, (64, 40)),
a93e49f
+               'E083': DeviceInfo("Joyetech eGrip II", None, (64, 40)),
a93e49f
+               'E092': DeviceInfo("Joyetech eVic AIO", None, (64, 40)),
a93e49f
+               'E115': DeviceInfo("Joyetech eVic VTwo mini", None, (64, 40)),
a93e49f
+               'E150': DeviceInfo("Joyetech eVic Basic", None, (64, 40)),
a93e49f
+               'E166': DeviceInfo("Joyetech Cuboid 200", None, (64, 40)),
a93e49f
+               'E182': DeviceInfo("Joyetech eVic Primo", None, (64, 40)),
a93e49f
+               'E196': DeviceInfo("Joyetech eVic Primo Mini", None, (64, 40)),
a93e49f
+               'E203': DeviceInfo("Joyetech eVic Primo 2.0", None, (64, 40)),
a93e49f
+               'M011': DeviceInfo("Eleaf iStick TC100W", None, (96, 16)),
a93e49f
+               'M037': DeviceInfo("Eleaf ASTER", None, (96, 16)),
a93e49f
+               'M038': DeviceInfo("Eleaf iStick Pico RDTA", None, (96, 16)),
a93e49f
+               'M041': DeviceInfo("Eleaf iStick Pico", None, (96, 16)),
a93e49f
+               'M045': DeviceInfo("Eleafi Stick Pico Mega", None, (96, 16)),
a93e49f
+               'M046': DeviceInfo("Eleaf iStick Power", None, (96, 16)),
a93e49f
+               'M065': DeviceInfo("Eleaf iStick Pico Dual", None, (96, 16)),
a93e49f
+               'M972': DeviceInfo("Eleaf iStick TC200W", None, (96, 16)),
a93e49f
+               'M973': DeviceInfo("Eleaf iStick QC 200W", None, (96, 16)),
a93e49f
+               'W007': DeviceInfo("Wismec Presa TC75W", ['E052'], (64, 40)),
a93e49f
+               'W010': DeviceInfo("Vaporflask Classic", None, (96, 16)),
a93e49f
+               'W011': DeviceInfo("Vaporflask Lite", None, (96, 16)),
a93e49f
+               'W013': DeviceInfo("Vaporflask Stout", None, (96, 16)),
a93e49f
+               'W014': DeviceInfo("Wismec Reuleaux RX200", None, (96, 16)),
a93e49f
+               'W016': DeviceInfo("Beyondvape Centurion", None, None),
a93e49f
+               'W017': DeviceInfo("Wismec Presa TC100W", None, (64, 40)),
a93e49f
+               'W018': DeviceInfo("Wismec Reuleaux RX2/3", None, (64, 48)),
a93e49f
+               'W026': DeviceInfo("Wismec Reuleaux RX75", None, (64, 48)),
a93e49f
+               'W033': DeviceInfo("Wismec Reuleaux RX200S", None, (64, 48)),
a93e49f
+               'W043': DeviceInfo("Vaponaute La Petit Box", None, (64, 48)),
a93e49f
+               'W057': DeviceInfo("Vapor Shark SwitchBox RX", None, (96, 16)),
a93e49f
+               'W069': DeviceInfo("Wismec Reuleaux RX300", None, (64, 48)),
a93e49f
+               'W073': DeviceInfo("Wismec Reuleaux RXmini", None, (64, 48)),
a93e49f
+               'W078': DeviceInfo("Wismec Predator 228", None, (64, 48)),
a93e49f
               }
a93e49f
 
a93e49f
     # 0x43444948
a93e49f
a93e49f
From 8aff6c405d7801f903275811dd690ee9bf6826a7 Mon Sep 17 00:00:00 2001
a93e49f
From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82@fedoraproject.org>
a93e49f
Date: Sat, 6 Jan 2018 15:23:36 +0100
a93e49f
Subject: [PATCH 11/11] Add some documentation about new commands
a93e49f
a93e49f
---
a93e49f
 README.rst     | 6 +++---
a93e49f
 evic/cli.py    | 5 ++++-
a93e49f
 evic/device.py | 2 ++
a93e49f
 3 files changed, 9 insertions(+), 4 deletions(-)
a93e49f
a93e49f
diff --git a/README.rst b/README.rst
a93e49f
index 685d647..9b3d620 100644
a93e49f
--- a/README.rst
a93e49f
+++ b/README.rst
a93e49f
@@ -152,7 +152,7 @@ Reset the device:
a93e49f
 
a93e49f
     $ evic-usb reset
a93e49f
 
a93e49f
-Dump any part of the flash memory:
a93e49f
+Dump any part of the flash memory (May not work with all firmwares):
a93e49f
 
a93e49f
 ::
a93e49f
 
a93e49f
@@ -164,13 +164,13 @@ Example to read the parameters flash memory:
a93e49f
 
a93e49f
     $ evic-usb fmc-read -o out.bin -s 122880 -l 4096
a93e49f
 
a93e49f
-Setup date and time of the device to the current time:
a93e49f
+Setup date and time of the device to the current time (For firmwares supporting clock display):
a93e49f
 
a93e49f
 ::
a93e49f
 
a93e49f
     $ evic-usb time
a93e49f
 
a93e49f
-Take a screenshot of the device display:
a93e49f
+Take a screenshot of the device display (May not work with all firmwares):
a93e49f
 
a93e49f
 ::
a93e49f
 
a93e49f
diff --git a/evic/cli.py b/evic/cli.py
a93e49f
index 607e97d..3733e87 100644
a93e49f
--- a/evic/cli.py
a93e49f
+++ b/evic/cli.py
a93e49f
@@ -327,7 +327,10 @@ def reset():
a93e49f
 
a93e49f
 @usb.command('time')
a93e49f
 def time():
a93e49f
-    """Sets the device date/time to now."""
a93e49f
+    """Sets the device date/time to now.
a93e49f
+    Works only with devices and/or firmwares
a93e49f
+    supporting a clock-screen on the display.
a93e49f
+    """
a93e49f
 
a93e49f
     dev = evic.HIDTransfer()
a93e49f
 
a93e49f
diff --git a/evic/device.py b/evic/device.py
a93e49f
index 86c37df..0a76ec8 100644
a93e49f
--- a/evic/device.py
a93e49f
+++ b/evic/device.py
a93e49f
@@ -179,6 +179,7 @@ def read_dataflash(self):
a93e49f
 
a93e49f
     def fmc_read(self, start, length):
a93e49f
         """Reads the device flash memory.
a93e49f
+        May not work with all devices or firmwares.
a93e49f
 
a93e49f
         Returns:
a93e49f
             An array containing the data flash memory content.
a93e49f
@@ -207,6 +208,7 @@ def hid_command(self, cmd, start, length):
a93e49f
 
a93e49f
     def read_screen(self):
a93e49f
         """Reads the screen memory.
a93e49f
+        May not work with all devices or firmwares.
a93e49f
 
a93e49f
         Returns:
a93e49f
             An array containing the screen.