From 4c64f53dc9eacaaf34c024d374789523f8ac1edc Mon Sep 17 00:00:00 2001 From: Markus Baden Date: Thu, 12 Jan 2012 19:47:10 +0800 Subject: [PATCH 1/2] Added string_write function, added corresponding commands from the extended command set and a helper function that sends a byte as two 7bit bytes --- firmata/firmata.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/firmata/firmata.py b/firmata/firmata.py index 756c714..55fae75 100755 --- a/firmata/firmata.py +++ b/firmata/firmata.py @@ -33,6 +33,10 @@ START_SYSEX = 0xF0 # start a MIDI SysEx message END_SYSEX = 0xF7 # end a MIDI SysEx message +# extended command set using sysex (0-127/0x00-0x7F) +# 0x00-0x0F reserved for user-defined commands +STRING_DATA = 0x71 # a string message with 14-bits per char + # pin modes INPUT = 0 OUTPUT = 1 @@ -99,6 +103,14 @@ def analog_write(self, pin, value): self.serial.write(chr(ANALOG_MESSAGE | (pin & 0x0F))) self.serial.write(chr(value & 0x7F)) self.serial.write(chr(value >> 7)) + + def string_write(self, string): + """Sending a string to device""" + self.serial.write(chr(START_SYSEX)) + self.serial.write(chr(STRING_DATA)) + for character in string: + self._send_value_as_two_7_bit(character) + self.serial.write(chr(END_SYSEX)) def set_version(self, major, minor): """Setting a minor and major version""" @@ -165,3 +177,9 @@ def __report(self): for port in range(2): self.serial.write(chr(REPORT_DIGITAL | port)) self.serial.write(chr(1)) + + def _send_value_as_two_7_bit(self, value): + if isinstance(value, str): + value = ord(value) + self.serial.write(chr(value & 0b01111111)) # LSB + self.serial.write(chr(value >> 7 & 0b01111111)) # MSB From 635a56f266abd5bfe350cb072ff88e34af1b80b0 Mon Sep 17 00:00:00 2001 From: Markus Baden Date: Thu, 12 Jan 2012 20:29:28 +0800 Subject: [PATCH 2/2] Added send_sysex, send_string now uses this function. Also refactored start_sysex and stop_sysex in analogy to Firmata.cpp --- firmata/firmata.py | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/firmata/firmata.py b/firmata/firmata.py index 55fae75..603868d 100755 --- a/firmata/firmata.py +++ b/firmata/firmata.py @@ -104,13 +104,17 @@ def analog_write(self, pin, value): self.serial.write(chr(value & 0x7F)) self.serial.write(chr(value >> 7)) - def string_write(self, string): + def send_sysex(self, command, data): + """Sending data to device via sysex""" + self._start_sysex() + self.serial.write(chr(command)) + for byte in data: + self._send_value_as_two_7_bit(byte) + self._end_sysex() + + def send_string(self, string): """Sending a string to device""" - self.serial.write(chr(START_SYSEX)) - self.serial.write(chr(STRING_DATA)) - for character in string: - self._send_value_as_two_7_bit(character) - self.serial.write(chr(END_SYSEX)) + self.send_sysex(STRING_DATA, string) def set_version(self, major, minor): """Setting a minor and major version""" @@ -183,3 +187,9 @@ def _send_value_as_two_7_bit(self, value): value = ord(value) self.serial.write(chr(value & 0b01111111)) # LSB self.serial.write(chr(value >> 7 & 0b01111111)) # MSB + + def _start_sysex(self): + self.serial.write(chr(START_SYSEX)) + + def _end_sysex(self): + self.serial.write(chr(END_SYSEX))