concordance-commit Mailing List for Concordance
Brought to you by:
jaymzh,
kevin_timmerman
You can subscribe to this list here.
2007 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(22) |
Aug
(18) |
Sep
(1) |
Oct
|
Nov
(4) |
Dec
(5) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2008 |
Jan
(17) |
Feb
(90) |
Mar
(87) |
Apr
(89) |
May
|
Jun
(2) |
Jul
|
Aug
(2) |
Sep
|
Oct
(15) |
Nov
|
Dec
(6) |
2009 |
Jan
|
Feb
(16) |
Mar
(13) |
Apr
(2) |
May
(4) |
Jun
|
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2010 |
Jan
(3) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(20) |
Aug
(53) |
Sep
(15) |
Oct
|
Nov
|
Dec
|
2011 |
Jan
|
Feb
|
Mar
(3) |
Apr
|
May
|
Jun
|
Jul
|
Aug
(2) |
Sep
|
Oct
|
Nov
|
Dec
|
2012 |
Jan
|
Feb
|
Mar
(11) |
Apr
|
May
|
Jun
(7) |
Jul
(1) |
Aug
|
Sep
(1) |
Oct
(1) |
Nov
|
Dec
|
2013 |
Jan
(4) |
Feb
|
Mar
(4) |
Apr
(19) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Phil D. <ja...@us...> - 2013-04-16 06:52:06
|
Update of /cvsroot/concordance/concordance In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv21992 Modified Files: Changelog Log Message: Release time! Index: Changelog =================================================================== RCS file: /cvsroot/concordance/concordance/Changelog,v retrieving revision 1.39 retrieving revision 1.40 diff -u -d -r1.39 -r1.40 --- Changelog 11 Apr 2013 04:30:11 -0000 1.39 +++ Changelog 16 Apr 2013 06:52:03 -0000 1.40 @@ -1,15 +1,18 @@ 1.0 -Released: +Released: 04/15/13 ph...@ip...: -- libconcord: revamp API for zwave support -- libconcord: support for 890/895 remotes +- libconcord: revamp API for zwave support. +- libconcord: support for 890/895 remotes. Fixes bug 3031064. sw...@te...: -- libconcord: support for 900/1000/1100 remotes -- libconcord: support for 200/300 remotes -- libconcord: support for Harmony One remotes -- libconcord: various improvements to new zwave API for clients -- libconcord: fixed firmware updates for 688 -- libconcord: Fixed error on reset for 785 +- libconcord: support for 900/1000/1100 remotes. Fixes bug 3011846. +- libconcord: support for 200/300 remotes. Fixes bug 3436081,3005694. +- libconcord: support for Harmony One remotes. Fixes bug 3518595. +- libconcord: various improvements to new zwave API for clients. +- libconcord: fixed firmware updates for 688. Fixes bug 3536438. +- libconcord: Fixed error on reset for 785. +- consnoop: Fix compliation issue. Fixes bug 3518597. +anonymous: +- libconcord: Fix python bidngins on OSX. Fixes bug 3387484. 0.24 Released: 03/18/12 |
From: Phil D. <ja...@us...> - 2013-04-12 00:37:07
|
Update of /cvsroot/concordance/concordance/libconcord In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv5047 Modified Files: remote_info.h Log Message: Final merge conflict. Hopefully. Signed-off-by: Phil Dibowitz <ph...@ip...> Index: remote_info.h =================================================================== RCS file: /cvsroot/concordance/concordance/libconcord/remote_info.h,v retrieving revision 1.18 retrieving revision 1.19 diff -u -d -r1.18 -r1.19 --- remote_info.h 11 Apr 2013 04:30:11 -0000 1.18 +++ remote_info.h 12 Apr 2013 00:37:05 -0000 1.19 @@ -128,7 +128,6 @@ { MFG_UNK, "Unknown", NULL }, { MFG_UNK, "Unknown", NULL }, { MFG_UNK, "Unknown", NULL }, - { MFG_HAR, "Harmony 700", "Molson" }, { MFG_UNK, "Unknown", NULL }, { MFG_UNK, "Unknown", NULL }, // 90 |
From: Phil D. <ja...@us...> - 2013-04-11 04:32:23
|
Update of /cvsroot/concordance/concordance/libconcord In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv4726 Modified Files: INSTALL.linux Log Message: Note dnsmasq requirement for usbnet remotes. Signed-off-by: Phil Dibowitz <ph...@ip...> Index: INSTALL.linux =================================================================== RCS file: /cvsroot/concordance/concordance/libconcord/INSTALL.linux,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- INSTALL.linux 10 Apr 2013 04:24:53 -0000 1.16 +++ INSTALL.linux 11 Apr 2013 04:32:21 -0000 1.17 @@ -10,6 +10,9 @@ You *MUST* install libusb and libzzip. These libraries are in most distributions, so apt-get/yum/up2date/urpmi/etc. it. +Also, if you are using 900/1000/1100 remotes, then dnsmasq is a requirement, +as well as installing the udev support files for libconcord (see below). + If you're compiling libconcord from source, you'll also need the development packages - usually libusb-dev or libusb-devel (and libzzip-dev/libzzip-devel), depending on your distribution. |
From: Phil D. <ja...@us...> - 2013-04-11 04:30:13
|
Update of /cvsroot/concordance/concordance/libconcord In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv4630/libconcord Modified Files: Makefile.am gen_udev_support remote_info.h Log Message: merge bits, better changelog Signed-off-by: Phil Dibowitz <ph...@ip...> Index: Makefile.am =================================================================== RCS file: /cvsroot/concordance/concordance/libconcord/Makefile.am,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- Makefile.am 10 Apr 2013 04:32:16 -0000 1.16 +++ Makefile.am 11 Apr 2013 04:30:11 -0000 1.17 @@ -35,11 +35,6 @@ install_old_udev: old_udev install_udev_common install_generic_udev: generic_udev install_udev_common -old-udev: - ./gen_udev_support -o - -install_old-udev: old-udev install_udev_generic - policykit: ./gen_udev_support -p Index: remote_info.h =================================================================== RCS file: /cvsroot/concordance/concordance/libconcord/remote_info.h,v retrieving revision 1.17 retrieving revision 1.18 diff -u -d -r1.17 -r1.18 --- remote_info.h 10 Apr 2013 04:24:53 -0000 1.17 +++ remote_info.h 11 Apr 2013 04:30:11 -0000 1.18 @@ -31,7 +31,8 @@ static const char *MFG_MON="Monster"; static const TModel ModelList[]={ - { MFG_UNK, "0", NULL }, // 0 +// 0 + { MFG_UNK, "0", NULL }, { MFG_UNK, "1", NULL }, { MFG_HAR, "Harmony 745", NULL }, { MFG_HAR, "Harmony 768", NULL }, @@ -41,7 +42,8 @@ { MFG_HAR, "Harmony 748", NULL }, { MFG_UNK, "8", NULL }, { MFG_HAR, "Harmony 659", NULL }, - { MFG_HAR, "Harmony 688", NULL }, // 10 +// 10 + { MFG_HAR, "Harmony 688", NULL }, { MFG_HAR, "Harmony 655", NULL }, { MFG_HAR, "Harmony 676", NULL }, { MFG_HAR, "Harmony 628", NULL }, @@ -51,7 +53,8 @@ { MFG_HAR, "Harmony 885", "Espresso" }, { MFG_HAR, "Harmony 520", "Mocha Decaf" }, { MFG_HAR, "Harmony 890", "Cappuccino" }, - { MFG_HAR, "Harmony 891", "Whisky" }, // 20 +// 20 + { MFG_HAR, "Harmony 891", "Whisky" }, { MFG_HAR, "Harmony 892", "Sugar" }, { MFG_HAR, "Harmony 525", "Mocha Decaf" }, { MFG_HAR, "Harmony 895", "Cappuccino" }, @@ -61,7 +64,8 @@ { MFG_MON, "AVL-300", "Whisky" }, { MFG_MON, "AVL-300", "Sugar" }, { MFG_MON, "AVL-300", "Godzilla" }, - { MFG_MON, "AVL-300", "Whisky" }, // 30 +// 30 + { MFG_MON, "AVL-300", "Whisky" }, { MFG_MON, "AVL-300", "Sugar" }, { MFG_MON, "AVL-200", "Godzilla" }, { MFG_MON, "AVL-200", "Godzilla" }, @@ -71,7 +75,8 @@ { MFG_MON, "AV-100", NULL }, { MFG_MON, "AV-100", NULL }, { MFG_HAR, "Harmony 880 Pro", "Espresso" }, - { MFG_HAR, "Harmony 890 Pro", "Cappuccino" }, // 40 +// 40 + { MFG_HAR, "Harmony 890 Pro", "Cappuccino" }, { MFG_HAR, "Harmony 550", "Mocha Grande" }, { MFG_HK, "TC-30", NULL }, { MFG_HK, "TC-30", NULL }, @@ -81,7 +86,8 @@ { MFG_COOL, "Harmony 882", "Espresso" }, { MFG_HAR, "Harmony 555", "Mocha Grande" }, { MFG_HAR, "Harmony 1000", "Cognac" }, - { MFG_HAR, "Harmony 670", NULL }, // 50 +// 50 + { MFG_HAR, "Harmony 670", NULL }, { MFG_COOL, "Harmony 552", "Mocha Grande" }, { MFG_HAR, "Harmony 1000i", "Cognac" }, { MFG_UNK, "Unknown", NULL }, @@ -91,18 +97,19 @@ { MFG_UNK, "Unknown", NULL }, { MFG_UNK, "Unknown", NULL }, { MFG_UNK, "Unknown", NULL }, - { MFG_UNK, "Unknown", NULL }, // 60 +// 60 + { MFG_UNK, "Unknown", NULL }, { MFG_HAR, "Harmony 900", NULL }, { MFG_UNK, "Unknown", NULL }, { MFG_HAR, "Harmony 1100", NULL }, { MFG_UNK, "Unknown", NULL }, { MFG_UNK, "Unknown", NULL }, { MFG_HAR, "Harmony 700", "Molson" }, - { MFG_UNK, "Unknown", NULL }, + { MFG_HAR, "Harmony 515", NULL }, { MFG_UNK, "Unknown", NULL }, { MFG_HAR, "Harmony 700i", NULL }, - { MFG_UNK, "Unknown", NULL }, // 70 + { MFG_UNK, "Unknown", NULL }, { MFG_HAR, "Harmony 600", NULL }, { MFG_HAR, "Harmony 650", NULL }, { MFG_HAR, "Harmony 600i", NULL }, @@ -112,8 +119,8 @@ { MFG_UNK, "Unknown", NULL }, { MFG_HAR, "Harmony 300", NULL }, { MFG_HAR, "Harmony 300i", NULL }, - { MFG_HAR, "Harmony 200", NULL }, // 80 + { MFG_HAR, "Harmony 200", NULL }, { MFG_HAR, "Harmony 200i", NULL }, { MFG_HAR, "Harmony Link", NULL }, { MFG_HAR, "Harmony Link (EMEA)", NULL }, @@ -122,11 +129,10 @@ { MFG_UNK, "Unknown", NULL }, { MFG_UNK, "Unknown", NULL }, { MFG_HAR, "Harmony 700", "Molson" }, - { MFG_HAR, "Harmony 515", NULL }, { MFG_UNK, "Unknown", NULL }, { MFG_UNK, "Unknown", NULL }, - { MFG_UNK, "Unknown", NULL } // 90 + { MFG_UNK, "Unknown", NULL } }; static const unsigned int max_model=sizeof(ModelList)/sizeof(TModel)-1; Index: gen_udev_support =================================================================== RCS file: /cvsroot/concordance/concordance/libconcord/gen_udev_support,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- gen_udev_support 10 Apr 2013 04:24:53 -0000 1.3 +++ gen_udev_support 11 Apr 2013 04:30:11 -0000 1.4 @@ -286,9 +286,6 @@ u) MODE='udev' ;; - o) - MODE='old_udev' - ;; *) usage exit 1 |
From: Phil D. <ja...@us...> - 2013-04-11 04:18:45
|
Update of /cvsroot/concordance/concordance/concordance In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv4082/concordance Modified Files: concordance.c Log Message: more merge conflict fixes Index: concordance.c =================================================================== RCS file: /cvsroot/concordance/concordance/concordance/concordance.c,v retrieving revision 1.46 retrieving revision 1.47 diff -u -d -r1.46 -r1.47 --- concordance.c 10 Apr 2013 04:35:38 -0000 1.46 +++ concordance.c 11 Apr 2013 04:18:43 -0000 1.47 @@ -1,11 +1,7 @@ /* * vi: formatoptions+=tc textwidth=80 tabstop=8 shiftwidth=8 noexpandtab: * -<<<<<<< concordance.c - * $Id$ -======= * $Id$ ->>>>>>> 1.41.2.24 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by |
From: Phil D. <ja...@us...> - 2013-04-10 04:35:40
|
Update of /cvsroot/concordance/concordance/concordance In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv22751/concordance Modified Files: Makefile.am concordance.c configure.ac Log Message: Prep for version 1.0 Including a first draft at a Changelog Signed-off-by: Phil Dibowitz <ph...@ip...> Index: concordance.c =================================================================== RCS file: /cvsroot/concordance/concordance/concordance/concordance.c,v retrieving revision 1.45 retrieving revision 1.46 diff -u -d -r1.45 -r1.46 --- concordance.c 10 Apr 2013 04:20:57 -0000 1.45 +++ concordance.c 10 Apr 2013 04:35:38 -0000 1.46 @@ -116,7 +116,7 @@ #define DEFAULT_FW_FILENAME_BIN "firmware.bin" #define DEFAULT_SAFE_FILENAME "safe.bin" -const char * const VERSION = "0.23+CVS"; +const char * const VERSION = "1.0"; struct options_t { int binary; Index: configure.ac =================================================================== RCS file: /cvsroot/concordance/concordance/concordance/configure.ac,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- configure.ac 10 Apr 2013 04:20:57 -0000 1.8 +++ configure.ac 10 Apr 2013 04:35:38 -0000 1.9 @@ -1,4 +1,4 @@ -AC_INIT([concordance], [0.23], [bug...@gn...]) +AC_INIT([concordance], [1.0], [bug...@gn...]) AM_INIT_AUTOMAKE([-Wall -Werror foreign]) AC_CONFIG_MACRO_DIR([m4]) AC_PROG_LIBTOOL Index: Makefile.am =================================================================== RCS file: /cvsroot/concordance/concordance/concordance/Makefile.am,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- Makefile.am 1 Aug 2010 15:28:53 -0000 1.8 +++ Makefile.am 10 Apr 2013 04:35:38 -0000 1.9 @@ -1,6 +1,6 @@ bin_PROGRAMS = concordance concordance_SOURCES = concordance.c -concordance_LDFLAGS = -lconcord +concordance_LDFLAGS = -l:libconcord.so.3 ACLOCAL_AMFLAGS= -I m4 # -Wall just makes good sense # -ansi and -pednatic errors are needed to ensure we're compatible with |
From: Phil D. <ja...@us...> - 2013-04-10 04:32:18
|
Update of /cvsroot/concordance/concordance/libconcord In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv22518 Modified Files: Makefile.am configure.ac Log Message: Prep for version 1.0 Signed-off-by: Phil Dibowitz <ph...@ip...> Index: configure.ac =================================================================== RCS file: /cvsroot/concordance/concordance/libconcord/configure.ac,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- configure.ac 10 Apr 2013 04:20:57 -0000 1.10 +++ configure.ac 10 Apr 2013 04:32:16 -0000 1.11 @@ -1,4 +1,4 @@ -AC_INIT([libconcord], [0.23], [bug...@gn...]) +AC_INIT([libconcord], [1.0], [bug...@gn...]) AM_INIT_AUTOMAKE([-Wall -Werror foreign]) AC_CONFIG_MACRO_DIR([m4]) AC_PROG_LIBTOOL Index: Makefile.am =================================================================== RCS file: /cvsroot/concordance/concordance/libconcord/Makefile.am,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- Makefile.am 10 Apr 2013 04:27:07 -0000 1.15 +++ Makefile.am 10 Apr 2013 04:32:16 -0000 1.16 @@ -6,7 +6,7 @@ remote_info.h web.h protocol.h remote.h usblan.h xml_headers.h \ operationfile.cpp remote_mh.cpp include_HEADERS = libconcord.h -libconcord_la_LDFLAGS = -version-info 2:0:0 -lusb -lzzip +libconcord_la_LDFLAGS = -version-info 3:0:0 -lusb -lzzip UDEVROOT ?= / UDEVLIBDIR ?= $(UDEVROOT)/lib |
From: Phil D. <ja...@us...> - 2013-04-10 04:27:09
|
Update of /cvsroot/concordance/concordance/libconcord In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv22276/libconcord Modified Files: Makefile.am Log Message: mergehell: one more merge conflict from zwave merge Index: Makefile.am =================================================================== RCS file: /cvsroot/concordance/concordance/libconcord/Makefile.am,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- Makefile.am 10 Apr 2013 04:20:57 -0000 1.14 +++ Makefile.am 10 Apr 2013 04:27:07 -0000 1.15 @@ -23,11 +23,6 @@ install_udev_common: $(MKDIR_P) $(DESTDIR)$(UDEVLIBDIR)/udev/rules.d $(install_sh_DATA) libconcord.rules \ -<<<<<<< Makefile.am - $(DESTDIR)$(sysconfdir)/udev/rules.d/60-libconcord.rules - -install_udev: udev install_udev_generic -======= $(DESTDIR)$(UDEVLIBDIR)/udev/rules.d/60-libconcord.rules $(install_sh_DATA) libconcord-usbnet.rules \ $(DESTDIR)$(UDEVLIBDIR)/udev/rules.d/80-libconcord-usbnet.rules @@ -39,7 +34,6 @@ install_udev: udev install_udev_common install_old_udev: old_udev install_udev_common install_generic_udev: generic_udev install_udev_common ->>>>>>> 1.11.2.9 old-udev: ./gen_udev_support -o |
From: Phil D. <ja...@us...> - 2013-04-10 04:24:56
|
Update of /cvsroot/concordance/concordance/libconcord/libusb In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv22152/libconcord/libusb Modified Files: libusbhid.cpp Log Message: mergehell: commit attempt 3 for zwave branch merge to head Index: libusbhid.cpp =================================================================== RCS file: /cvsroot/concordance/concordance/libconcord/libusb/libusbhid.cpp,v retrieving revision 1.20 retrieving revision 1.21 diff -u -d -r1.20 -r1.21 --- libusbhid.cpp 29 Jan 2013 07:19:43 -0000 1.20 +++ libusbhid.cpp 10 Apr 2013 04:24:53 -0000 1.21 @@ -142,8 +142,13 @@ * * This is ONLY available when on Linux. We don't check for an error * because it will error if no kernel driver is attached to it. + * + * Don't attempt to do this if this is a usbnet remote as it will + * unload the zaurus driver, which is not desired. */ - usb_detach_kernel_driver_np(h_hid, 0); + if (!(h_dev && (h_dev->descriptor.idProduct == 0xC11F))) { + usb_detach_kernel_driver_np(h_hid, 0); + } #endif int err; |
From: Phil D. <ja...@us...> - 2013-04-10 04:24:55
|
Update of /cvsroot/concordance/concordance/consnoop In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv22152/consnoop Modified Files: consnoop.cpp Log Message: mergehell: commit attempt 3 for zwave branch merge to head Index: consnoop.cpp =================================================================== RCS file: /cvsroot/concordance/concordance/consnoop/consnoop.cpp,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- consnoop.cpp 4 Jun 2012 01:13:17 -0000 1.19 +++ consnoop.cpp 10 Apr 2013 04:24:53 -0000 1.20 @@ -350,11 +350,11 @@ case COMMAND_WRITE_UPDATE_HEADER: if (!type) { printf("Write Update Header:"); - print_z_params(param_ptr, length); - printf("\n"); - break; + } else { + printf("Write Update Header Response:"); } - printf("Write Update Header Response\n"); + print_z_params(param_ptr, length); + printf("\n"); break; case COMMAND_WRITE_UPDATE_DATA: if (!type) { @@ -387,11 +387,11 @@ case COMMAND_FINISH_UPDATE: if (!type) { printf("Write Finish Update:"); - print_z_params(param_ptr, length); - printf("\n"); - break; + } else { + printf("Write Finish Update Response:"); } - printf("Finish Update Response\n"); + print_z_params(param_ptr, length); + printf("\n"); break; case COMMAND_Z_RESET: if (!type) { |
From: Phil D. <ja...@us...> - 2013-04-10 04:20:59
|
Update of /cvsroot/concordance/concordance/libconcord/bindings/python In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv21976/libconcord/bindings/python Modified Files: libconcord.py setup.py Log Message: commit, attempt2, zwave merge to head Index: setup.py =================================================================== RCS file: /cvsroot/concordance/concordance/libconcord/bindings/python/setup.py,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- setup.py 19 Mar 2012 05:47:02 -0000 1.5 +++ setup.py 10 Apr 2013 04:20:57 -0000 1.6 @@ -24,7 +24,7 @@ setup( name='libconcord', - version='0.24', + version='0.23', py_modules=['libconcord'], ) Index: libconcord.py =================================================================== RCS file: /cvsroot/concordance/concordance/libconcord/bindings/python/libconcord.py,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- libconcord.py 4 Jun 2012 01:38:21 -0000 1.13 +++ libconcord.py 10 Apr 2013 04:20:57 -0000 1.14 @@ -1,7 +1,11 @@ # # vi: formatoptions+=tc textwidth=80 tabstop=8 shiftwidth=4 expandtab: # +<<<<<<< libconcord.py +# $Id$ +======= # $Id$ +>>>>>>> 1.9.2.5 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -45,8 +49,10 @@ # Public libconcord API: Custom types -# typedef void (*lc_callback)(uint32_t, uint32_t, uint32_t, void*); -callback_type = CFUNCTYPE(None, c_uint, c_uint, c_uint, py_object) +# typedef void (*lc_callback)(uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, +# void*, const uint32_t*); +callback_type = CFUNCTYPE(None, c_uint, c_uint, c_uint, c_uint, c_uint, \ + py_object, POINTER(c_uint)) # Public libconcord API: Error codes @@ -68,6 +74,31 @@ LC_ERROR_INVALID_CONFIG = 16 LC_ERROR_IR_OVERFLOW = 17 +LC_FILE_TYPE_CONNECTIVITY = 1 +LC_FILE_TYPE_CONFIGURATION = 2 +LC_FILE_TYPE_FIRMWARE = 3 +LC_FILE_TYPE_LEARN_IR = 4 + +LC_CB_COUNTER_TYPE_STEPS = 5 +LC_CB_COUNTER_TYPE_BYTES = 6 + +LC_CB_STAGE_NUM_STAGES = 0xFF +LC_CB_STAGE_GET_IDENTITY = 7 +LC_CB_STAGE_INITIALIZE_UPDATE = 8 +LC_CB_STAGE_INVALIDATE_FLASH = 9 +LC_CB_STAGE_ERASE_FLASH = 10 +LC_CB_STAGE_WRITE_CONFIG = 11 +LC_CB_STAGE_VERIFY_CONFIG = 12 +LC_CB_STAGE_FINALIZE_UPDATE = 13 +LC_CB_STAGE_READ_CONFIG = 14 +LC_CB_STAGE_WRITE_FIRMWARE = 15 +LC_CB_STAGE_READ_FIRMWARE = 16 +LC_CB_STAGE_READ_SAFEMODE = 17 +LC_CB_STAGE_RESET = 18 +LC_CB_STAGE_SET_TIME = 19 +LC_CB_STAGE_HTTP = 20 +LC_CB_STAGE_LEARN = 21 + # Public libconcord API: Exception types class LibConcordException(Exception): @@ -320,6 +351,12 @@ c_int ) +# int get_hw_ver_mic(); +get_hw_ver_mic = _create_func( + 'get_hw_ver_mic', + c_int +) + # int get_flash_size(); get_flash_size = _create_func( 'get_flash_size', @@ -365,7 +402,7 @@ # const char *get_hid_prod_str(); get_hid_prod_str = _create_func( 'get_hid_prod_str', - c_int + c_char_p ) # int get_hid_irl(); @@ -427,6 +464,31 @@ c_int ) +# int is_config_dump_supported(); +is_config_dump_supported = _create_func( + 'is_config_dump_supported', + c_int +) + +# int is_config_update_supported(); +is_config_update_supported = _create_func( + 'is_config_update_supported', + c_int +) + +# int is_fw_dump_supported(); +is_fw_dump_supported = _create_func( + 'is_fw_dump_supported', + c_int +) + +# int is_fw_update_supported(int direct); +is_fw_update_supported = _create_func( + 'is_fw_update_supported', + c_int, + _in('direct', c_int) +) + # int get_time_second(); get_time_second = _create_func( 'get_time_second', @@ -488,6 +550,13 @@ lc_strerror.restype = c_char_p lc_strerror.argtypes = (c_int,) +# const char *lc_cb_stage_str(int stage); +lc_cb_stage_str = _create_func( + 'lc_cb_stage_str', + c_char_p, + _in('stage', c_int) +) + # void delete_blob(uint8_t *ptr); delete_blob = _create_func( 'delete_blob', @@ -495,20 +564,20 @@ _in('ptr', POINTER(c_ubyte)) ); -LC_FILE_TYPE_CONNECTIVITY = 0 -LC_FILE_TYPE_CONFIGURATION = 1 -LC_FILE_TYPE_FIRMWARE = 2 -LC_FILE_TYPE_LEARN_IR = 3 - -# int identify_file(uint8_t *in, uint32_t size, int *type); -identify_file = _create_func( - 'identify_file', +# int read_and_parse_file(char *filename, int *type); +read_and_parse_file = _create_func( + 'read_and_parse_file', _ret_lc_concord(), - _in('in', POINTER(c_ubyte)), - _in('size', c_uint), + _in('filename', c_char_p), _out('type', c_int) ) +# void delete_opfile_obj(); +delete_opfile_obj = _create_func( + 'delete_opfile_obj', + _ret_void() +) + # int init_concord(); init_concord = _create_func( 'init_concord', @@ -529,10 +598,12 @@ _in('cb_arg', py_object) ) -# int reset_remote(); +# int reset_remote(lc_callback cb, void *cb_arg); reset_remote = _create_func( 'reset_remote', - _ret_lc_concord() + _ret_lc_concord(), + _in('cb', callback_type), + _in('cb_arg', py_object) ) # int get_time(); @@ -541,52 +612,65 @@ _ret_lc_concord() ) -# int set_time(); +# int set_time(lc_callback cb, void *cb_arg); set_time = _create_func( 'set_time', - _ret_lc_concord() + _ret_lc_concord(), + _in('cb', callback_type), + _in('cb_arg', py_object) ) -# int post_connect_test_success(uint8_t *data, uint32_t size); +# int post_connect_test_success(lc_callback cb, void *cb_arg); post_connect_test_success = _create_func( 'post_connect_test_success', _ret_lc_concord(), - _in('data', POINTER(c_ubyte)), - _in('size', c_uint) + _in('cb', callback_type), + _in('cb_arg', py_object) ) -# int post_preconfig(uint8_t *data, uint32_t size); +# int post_preconfig(lc_callback cb, void *cb_arg); post_preconfig = _create_func( 'post_preconfig', _ret_lc_concord(), - _in('data', POINTER(c_ubyte)), - _in('size', c_uint) + _in('cb', callback_type), + _in('cb_arg', py_object) ) -# int post_postconfig(uint8_t *data, uint32_t size); +# int post_postconfig(lc_callback cb, void *cb_arg); post_postconfig = _create_func( 'post_postconfig', _ret_lc_concord(), - _in('data', POINTER(c_ubyte)), - _in('size', c_uint) + _in('cb', callback_type), + _in('cb_arg', py_object) ) -# int post_postfirmware(uint8_t *data, uint32_t size); +# int post_postfirmware(lc_callback cb, void *cb_arg); post_postfirmware = _create_func( 'post_postfirmware', _ret_lc_concord(), - _in('data', POINTER(c_ubyte)), - _in('size', c_uint) + _in('cb', callback_type), + _in('cb_arg', py_object) ) -# int invalidate_flash(); +# int invalidate_flash(lc_callback cb, void *cb_arg); invalidate_flash = _create_func( 'invalidate_flash', _ret_lc_concord(), + _in('cb', callback_type), + _in('cb_arg', py_object) +) + +# int update_configuration(lc_callback cb, void *cb_arg, int noreset); +update_configuration = _create_func( + 'update_configuration', + _ret_lc_concord(), + _in('cb', callback_type), + _in('cb_arg', py_object), + _in('noreset', c_int) ) # int read_config_from_remote(uint8_t **out, uint32_t *size, -# lc_callback cb, void *cb_arg); +# lc_callback cb, void *cb_arg); read_config_from_remote = _create_func( 'read_config_from_remote', _ret_lc_concord(), @@ -596,26 +680,14 @@ _in('cb_arg', py_object) ) -# int write_config_to_remote(uint8_t *in, uint32_t size, -# lc_callback cb, void *cb_arg); +# int write_config_to_remote(lc_callback cb, void *cb_arg); write_config_to_remote = _create_func( 'write_config_to_remote', _ret_lc_concord(), - _in('in', POINTER(c_ubyte)), - _in('size', c_uint), _in('cb', callback_type), _in('cb_arg', py_object) ) -# int read_file(char *file_name, uint8_t **out, uint32_t *size); -read_file = _create_func( - 'read_file', - _ret_lc_concord(), - _in('file_name', c_char_p), - _out('out', POINTER(c_ubyte)), - _out('size', c_uint) -) - # int write_config_to_file(uint8_t *in, uint32_t size, char *file_name, # int binary); write_config_to_file = _create_func( @@ -627,49 +699,38 @@ _in('binary', c_int) ) -# int verify_remote_config(uint8_t *in, uint32_t size, lc_callback cb, -# void *cb_arg); +# int verify_remote_config(lc_callback cb, void *cb_arg); verify_remote_config = _create_func( 'verify_remote_config', _ret_lc_concord(), - _in('in', POINTER(c_ubyte)), - _in('size', c_uint), _in('cb', callback_type), _in('cb_arg', py_object) ) -# int prep_config(); +# int prep_config(lc_callback cb, void *cb_arg); prep_config = _create_func( 'prep_config', - _ret_lc_concord() + _ret_lc_concord(), + _in('cb', callback_type), + _in('cb_arg', py_object) ) -# int finish_config(); +# int finish_config(lc_callback cb, void *cb_arg); finish_config = _create_func( 'finish_config', - _ret_lc_concord() + _ret_lc_concord(), + _in('cb', callback_type), + _in('cb_arg', py_object) ) -# int erase_config(uint32_t size, lc_callback cb, void *cb_arg); +# int erase_config(lc_callback cb, void *cb_arg); erase_config = _create_func( 'erase_config', _ret_lc_concord(), - _in('size', c_uint), _in('cb', callback_type), _in('cb_arg', py_object) ) -# int find_config_binary(uint8_t *config, uint32_t config_size, -# uint8_t **binary_ptr, uint32_t *binary_size); -find_config_binary = _create_func( - 'find_config_binary', - _ret_lc_concord(), - _in('config', POINTER(c_ubyte)), - _in('config_size', c_uint), - _out('binary_ptr', POINTER(c_ubyte)), - _out('binary_size', c_uint) -) - # int erase_safemode(lc_callback cb, void *cb_arg); erase_safemode = _create_func( 'erase_safemode', @@ -698,10 +759,13 @@ _in('file_name', c_char_p) ) -# int is_fw_update_supported(int direct); -is_fw_update_supported = _create_func( - 'is_fw_update_supported', - c_int, +# int update_firmware(lc_callback cb, void *cb_arg, int noreset, int direct); +update_firmware = _create_func( + 'update_firmware', + _ret_lc_concord(), + _in('cb', callback_type), + _in('cb_arg', py_object), + _in('noreset', c_int), _in('direct', c_int) ) @@ -711,16 +775,20 @@ c_int ) -# int prep_firmware(); +# int prep_firmware(lc_callback cb, void *cb_arg); prep_firmware = _create_func( 'prep_firmware', - _ret_lc_concord() + _ret_lc_concord(), + _in('cb', callback_type), + _in('cb_arg', py_object), ) -# int finish_firmware(); +# int finish_firmware(lc_callback cb, void *cb_arg); finish_firmware = _create_func( 'finish_firmware', - _ret_lc_concord() + _ret_lc_concord(), + _in('cb', callback_type), + _in('cb_arg', py_object), ) # int erase_firmware(int direct, lc_callback cb, void *cb_arg); @@ -743,13 +811,10 @@ _in('cb_arg', py_object) ) -# int write_firmware_to_remote(uint8_t *in, uint32_t size, int direct, -# lc_callback cb, void *cb_arg); +# int write_firmware_to_remote(int direct, lc_callback cb, void *cb_arg); write_firmware_to_remote = _create_func( 'write_firmware_to_remote', _ret_lc_concord(), - _in('in', POINTER(c_ubyte)), - _in('size', c_uint), _in('direct', c_int), _in('cb', callback_type), _in('cb_arg', py_object) @@ -766,24 +831,10 @@ _in('binary', c_int) ) -# int extract_firmware_binary(uint8_t *xml, uint32_t xml_size, uint8_t **out, -# uint32_t *size); -extract_firmware_binary = _create_func( - 'extract_firmware_binary', - _ret_lc_concord(), - _in('xml', POINTER(c_ubyte)), - _in('xml_size', c_uint), - _out('out', POINTER(c_ubyte)), - _out('size', c_uint) -) - -# int get_key_names(uint8_t *xml, uint32_t xml_size, -# char ***key_names, uint32_t *key_names_length); +# int get_key_names(char ***key_names, uint32_t *key_names_length); get_key_names = _create_func( 'get_key_names', _ret_lc_concord(), - _in('xml', POINTER(c_ubyte)), - _in('xml_size', c_uint), _out('key_names', POINTER(c_char_p)), _out('key_names_length', c_uint) ) @@ -835,14 +886,14 @@ _in('encoded_signal', c_char_p), ) -# int post_new_code(uint8_t *xml, uint32_t xml_size, -# char *key_name, char *encoded_signal); +# int post_new_code(char *key_name, char *encoded_signal, lc_callback cb, +# void *cb_arg); post_new_code = _create_func( 'post_new_code', _ret_lc_concord(), - _in('xml', POINTER(c_ubyte)), - _in('xml_size', c_uint), _in('key_name', c_char_p), - _in('encoded_signal', c_char_p) + _in('encoded_signal', c_char_p), + _in('cb', callback_type), + _in('cb_arg', py_object) ) |
From: Phil D. <ja...@us...> - 2013-04-10 04:17:08
|
Update of /cvsroot/concordance/concordance/specs In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv21802/specs Modified Files: protocol_z.txt Added Files: protocol_mh.txt Log Message: Merging zwave to HEAD --- NEW FILE: protocol_mh.txt --- "MyHarmony" Protocol: There seem to be two types of messages, command messages and data messages. Command messages/responses: 1st byte is always 0xFF 2nd byte is the command (see below). 3rd byte is the sequence number, which ranges from 0x00 to 0x3F then rolls over => in messages from the remote, the uppermost bit will be set, eg: => if the sequence number in the message sent to the remote is 0x03, the => response will have the sequence number 0x83. 4th byte is the number of parameters. 5th byte and on are the parameters. Each parameter begins with a byte which indicates the number of bytes in the parameter. => if the parameter length byte is 0x80, then the parameter is a "string" of hex ASCII characters and is terminated by a 0x00. Command message 0x01 - Read/Write a file. Parameters: 3 Parameter 1: String; filename to read or write. Known files: Identity file is /sys/sysinfo Config file is /cfg/usercfg IR learn is /ir/ir_cap Parameter 2: String; 'W' for write, 'R' for read. Parameter 3: 4 bytes; length of data to write (only use for writes) Response (to a read command): Parameters: 2 Parameter 1: 1 byte; unknown. Parameter 1: 4 bytes; length of data that will be read. Command message 0x03 - Data mode acknowledgement response. Parameters: 2 Parameter 1: 1 byte; unknown; value seems to always be 0x05. Parameter 2: 1 byte; number of packets left to send, plus one. If there are more than 50 packets to send, 0x33 (51) is sent. The end of file message (0x7E) is included in the count. Command message 0x04 - Data mode read start message (sent before get identity and IR data modes start) Parameters: 2 Parameter 1: 1 byte; unknown; value seems to always be 0x06. Parameter 2: 1 byte; number of packets to send before expecting an acknowledgement, minus one (ie, 0x33 [51] -> send 50 pkts). Command message 0x05 - unknown (sent after writing a config file) Parameters: 2 Parameter 1: 1 byte; unknown; value seems to always be 0x05. Parameter 2: 1 byte; unknown; value seems to always be 0x00. Command message 0x06 - Write file checksum (after a write). Parameters: 7 Parameter 1: 1 byte; unknown; value seems to always be 0x05. Parameter 2: 1 byte; unknown; value seems to always be 0x01. Parameter 3: String; Checksum Type (from XML), e.g., "XOR". Parameter 4: 2 bytes; Checksum Seed (from XML), e.g., "4321". Parameter 5: 4 bytes; unknown; value seems to always be 0x00000000. (Might be Checksum "Offset" from XML) Parameter 6: 4 bytes; Checksum Length (from XML), e.g., "4db1". Parameter 7: 2 bytes; Checksum ExpectedValue (from XML), "5740". Command message 0x07 - Reset sequence number to 0? (sent after reading identity, after writing a config file, and after learning IR) Parameters: 1 Parameter 1: 1 byte; unknown; value seems to be 0x06 before write and 0x05 after Special commands - some commands do not have sequence numbers in the 2nd byte: Reset command: 0xFF 0xFF 0x02 0x01 0x01 Data messages: Once the remote or the software switches to data mode, the packets are as follows: 1st byte: sequence number (uppermost bit set to 1 if from the remote) 2nd byte: data length, eg: 0x3e for a full packet of 62 bytes (uppermost bit will be set to 1 if from the remote) 3rd-64th bytes: data IR learning: Once the remote is in IR learning mode, the packets received from the remote are in the same format as the IR learning mode of pure HID remotes (see protocol.txt) Index: protocol_z.txt =================================================================== RCS file: /cvsroot/concordance/concordance/specs/protocol_z.txt,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- protocol_z.txt 1 Aug 2010 15:12:24 -0000 1.6 +++ protocol_z.txt 10 Apr 2013 04:17:06 -0000 1.7 @@ -354,7 +354,42 @@ message type: 0x01 parameters: 0 +COMMAND_READ_REGION 0x47 (71) +message type: 0x80 (128) +parameters: 1 + parameter 1: 1 byte (region ID) + sample values: 04 + +message type: 0x01 (1) +parameters: 1 + parameter 1: 4 bytes (region size in bytes) + sample values: + 00 00 3e 88 +COMMAND_READ_REGION_DATA 0x48 (72) +message type: 0x80 +parameters: 1 + parameter 1: 1 byte (region ID) + sample values: 04 + +message type: 0x01 +parameters: 3 + parameter 1: 1 byte (region ID) + sample values: 04 + parameter 2: 0x400 (1024) bytes (0xc2, 194/2 , 1100 0010) (data) + parameter 3: 4 bytes (length) + sample values: 00 00 04 00 +notes: + This is repeated for every 1K-byte chunk. + +COMMAND_READ_REGION_DONE 0x49 (73) +message type: 0x80 +parameters: 1 + parameter 1: 1 byte (region ID) + sample values: 04 + +message type: 0x01 +parameters: 0 # for vim vim:textwidth=80: |
From: Phil D. <ja...@us...> - 2013-04-09 10:03:42
|
Update of /cvsroot/concordance/concordance/libconcord In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv25445 Modified Files: Tag: zwave_work_branch INSTALL.linux Makefile.am gen_udev_support Log Message: Revamp udev support * The udev rules non-usbnet devices now use a simple glob of device IDs instead of one rule per device ID. * There is now a new "generic_udev" rule that will give the dialout user permission and not rely on udev-acl * gen_dev_support has been refactored to support udev, generic_udev, and old_dev better * The documentation for installing the various udev incarnations was cleaned up. Signed-off-by: Phil Dibowitz <ph...@ip...> Index: INSTALL.linux =================================================================== RCS file: /cvsroot/concordance/concordance/libconcord/INSTALL.linux,v retrieving revision 1.14.2.3 retrieving revision 1.14.2.4 diff -u -d -r1.14.2.3 -r1.14.2.4 --- INSTALL.linux 7 Apr 2013 01:33:59 -0000 1.14.2.3 +++ INSTALL.linux 9 Apr 2013 10:03:40 -0000 1.14.2.4 @@ -33,7 +33,9 @@ If you don't want to have to be root to use concordance (or any other libconcord frontend), you'll need to set up udev-acl, hal/consolekit, -hal/policykit or old udev support. +hal/policykit or old udev support. Here are your options: + +* UDEV-ACL SUPPORT (recommended) Most modern distributions should use the udev-acl support. udev versions since 167, released on 2011-03-30, have the necessary support for this method to @@ -47,57 +49,63 @@ make udev sudo make install_udev -By default this installs rules in /lib/udev. You can override this by setting -the UDEVLIBDIR environment variable (as root): +* GENERIC-UDEV SUPPORT - UDEVLIBDIR=/etc/udev make install_udev +If you have a modern system, but your login manager doesn't support +consolekit, (notably, 'xdm'), you'll need to use generic udev support. With +this option, anyone in the group 'dialout' will have access to the remote +control. To use this, do: -If you have an older distribution without a recent enough version of udev, you -can choose between old-style generic udev support, hal/consolekit support, and -hal/policykit support. + make generic_udev + sudo make install_generic_udev + +* HAL/POLICYKIT SUPPORT + +This is for people on older distributions that use HAL+PolicyKit. It will +generate the appropriate HAL/PolicyKit files and install them in the right +place for the console user to have access to the remote when it's plugged in. +It will work only if your distribution has udev, HAL and PolicyKit of around +the correct vintage - approximately, the versions that were current in early +2009 - correctly built to work with each other. To use hal/policykit support, you can do: make policykit sudo make install_policykit -This will generate a different udev file and all the appropriate HAL/policykit -files and install them in the right place for the console user to have access -to the remote when it's plugged in. It will work only if your distribution has -udev, HAL and PolicyKit of around the correct vintage - approximately, the -versions that were current in early 2009 - correctly built to work with each -other. - -To use hal/consolekit, you can do: - - make consolekit - sudo make install_consolekit +* HAL/CONSOLEKIT SUPPORT This will do much the same as the hal/policykit support does, only with consolekit instead. As with the hal/policykit support, it depends on having udev, HAL and ConsoleKit of an early 2009 vintage, correctly built to work together. -The safest option for old systems is the old generic udev support: +* OLD_UDEV SUPPORT - make old-udev - sudo make install_old-udev +The safest option for old systems is the old generic udev support. Like +"UDEV-GENERIC", this will allow anyone in the "dialout" group to read and +write to harmony remote controls connected to the machine. However, it uses +the syntax necessary for very old versions of udev. -This will allow anyone in the "dialout" group to read and write to harmony -remote controls connected to the machine. It should work with any udev system, -including modern ones, but is a less sophisticated solution than the udev-acl -support and requires you to add your user to the "dialout" group. + make old_udev + sudo make install_old_udev If you are not sure which method to use, and your distribution came out since -March 2011, try the new udev option first, as it provides the cleanest +March 2011, try the udev-acl option first, as it provides the cleanest configuration and most transparent operation. If it does not work, you can try the hal/consolekit or hal/policykit options, but old-udev is the most likely to work. -NOTE: By default the install prefix is /usr/local which means that the -udev/policykit/consolekit make targets will install in /usr/local/etc which -won't actually do anything. This means for these to work you must run -./configure with +NOTE: +By default udev files will install in /lib/udev. You can override this by setting +the UDEVLIBDIR environment variable (as root): + + UDEVLIBDIR=/etc/udev make install_udev + +The policykit/consolekit files will install in datarootdir which is a subset +of prefix, meaning, by default /usr/local/share. This will not work, so if you +are using the hal/policykit/console kit targets, you must run ./configure +with: *either*: --prefix=/usr *or*: Index: Makefile.am =================================================================== RCS file: /cvsroot/concordance/concordance/libconcord/Makefile.am,v retrieving revision 1.11.2.8 retrieving revision 1.11.2.9 diff -u -d -r1.11.2.8 -r1.11.2.9 --- Makefile.am 7 Apr 2013 01:34:00 -0000 1.11.2.8 +++ Makefile.am 9 Apr 2013 10:03:40 -0000 1.11.2.9 @@ -14,7 +14,13 @@ udev: ./gen_udev_support -u -install_udev_generic: +old_udev: + ./gen_udev_support -o + +generic_udev: + ./gen_udev_support -g + +install_udev_common: $(MKDIR_P) $(DESTDIR)$(UDEVLIBDIR)/udev/rules.d $(install_sh_DATA) libconcord.rules \ $(DESTDIR)$(UDEVLIBDIR)/udev/rules.d/60-libconcord.rules @@ -25,17 +31,14 @@ $(install_sh_SCRIPT) start_concordance_dhcpd_wrapper.sh \ $(DESTDIR)$(UDEVLIBDIR)/udev/ -install_udev: udev install_udev_generic - -old-udev: - ./gen_udev_support -o - -install_old-udev: old-udev install_udev_generic +install_udev: udev install_udev_common +install_old_udev: old_udev install_udev_common +install_generic_udev: generic_udev install_udev_common policykit: ./gen_udev_support -p -install_policykit: policykit install_udev_generic +install_policykit: policykit install_udev_common $(MKDIR_P) $(DESTDIR)$(datarootdir)/hal/fdi/policy/10osvendor/ $(MKDIR_P) $(DESTDIR)$(datarootdir)/PolicyKit/policy/ $(install_sh_DATA) libconcord.fdi \ @@ -46,7 +49,7 @@ consolekit: ./gen_udev_support -c -install_consolekit: consolekit install_udev_generic +install_consolekit: consolekit install_udev_common $(MKDIR_P) $(DESTDIR)$(datarootdir)/hal/fdi/policy/10osvendor/ $(install_sh_DATA) libconcord.perms \ $(DESTDIR)$(datarootdir)/hal/fdi/policy/10osvendor/99-libconcord.perms Index: gen_udev_support =================================================================== RCS file: /cvsroot/concordance/concordance/libconcord/gen_udev_support,v retrieving revision 1.1.2.3 retrieving revision 1.1.2.4 diff -u -d -r1.1.2.3 -r1.1.2.4 --- gen_udev_support 29 Mar 2012 03:15:05 -0000 1.1.2.3 +++ gen_udev_support 9 Apr 2013 10:03:40 -0000 1.1.2.4 @@ -14,10 +14,29 @@ # Copyright 2009 Phil Dibowitz # -UDEV_POLICY_TEMPLATE='ATTR{idVendor}=="%s", ATTR{idProduct}=="%s", SYMLINK+="harmony-%%k"' -UDEV_NEW_NO_POLICY_TEMPLATE='ATTR{idVendor}=="%s", ATTR{idProduct}=="%s", ENV{ID_REMOTE_CONTROL}="1"' -UDEV_OLD_NO_POLICY_TEMPLATE='SYSFS{idVendor}=="%s", SYSFS{idProduct}=="%s", MODE="0660", GROUP="dialout"' +# CONDITIONS +# varios "conditions" to make udev rules +# A partial template, used largely when generating one-line per device +UDEV_CONDITION_PARTIAL_TEMPLATE='ATTR{idVendor}=="%s", ATTR{idProduct}=="%s"' +# The above, but also with a USB specifier, for the one-line-for-all version +UDEV_CONDITION_TEMPLATE="SUBSYSTEM==\"usb\", $UDEV_CONDITION_PARTIAL_TEMPLATE" +# The older syntax for ancient udev. This one is also "partial" since you +# have to specify each device ID separately on this version of udev. +UDEV_CONDITION_OLD_TEMPLATE='SYSFS{idVendor}=="%s", SYSFS{idProduct}=="%s"' + +# ACTIONS +# The "action" part of udev rules. + +# When using udev-acl, this instructs it to give access to the current +# console user. +UDEV_ACTION='ENV{ID_REMOTE_CONTROL}="1"' +# This says give r/w to the dialout group +UDEV_ACTION_GENERIC='MODE="0660", GROUP="dialout"' +# This says make a symlink in /dev called "harmony-<id>" +UDEV_ACTION_POLICYKIT='SYMLINK+="harmony-%%k"' + +# Stuff for HAL. Deprecated. HAL_PRE_TEMPLATE=' <match key="usb_device.vendor_id" int="0x%s">' HAL_RULE_TEMPLATE=' <match key="usb_device.product_id" int="0x%s"> <append key="info.capabilities" type="strlist">access_control</append> @@ -27,11 +46,12 @@ </match>' HAL_POST=' </match>' -NATIONAL_VID=0400 -NATIONAL_PID=c359 -LOGITECH_VID=046d -LOGITECH_MIN_PID=c110 -LOGITECH_MAX_PID=c14f +NATIONAL_VID='0400' +NATIONAL_PID='c359' +LOGITECH_VID='046d' +LOGITECH_MIN_PID='c110' +LOGITECH_MAX_PID='c14f' +LOGITECH_PID_GLOB='c1[1-4][0-9a-f]' UDEV_FILE='libconcord.rules' UDEV_USBNET_FILE='libconcord-usbnet.rules' @@ -62,7 +82,7 @@ # # UDEV FUNCTIONS # -emit_udev_header() { +emit_old_udev_header() { file="$1" cat >$file <<END # Neat trick so that non-harmony devices don't read through a million rules @@ -74,7 +94,7 @@ END } -emit_udev_footer() { +emit_old_udev_footer() { file="$1" cat >>$file <<END GOTO="harmony_rules_end" @@ -82,6 +102,21 @@ END } +emit_udev_rules() { + file="$1" + mode="$2" + + template="$UDEV_CONDITION_TEMPLATE" + if [ "$mode" == 'generic_udev' ] ; then + template="$template, $UDEV_ACTION_GENERIC" + else + template="$template, $UDEV_ACTION" + fi + + printf "$template\n" $NATIONAL_VID $NATIONAL_PID >>$file + printf "$template\n" $LOGITECH_VID $LOGITECH_PID_GLOB >>$file +} + # Rule for the usbnet family of remotes to start a DHCP daemon upon detection. emit_udev_usbnet_rules() { file="$1" @@ -91,26 +126,43 @@ END } -emit_udev_rules() { +emit_old_udev_rules() { file="$1" - type="$2" - if [ "$type" == 'policykit' -o "$type" == 'consolekit' ]; then - template="$UDEV_POLICY_TEMPLATE" - elif [ "$type" == 'old_udev' ]; then - template="$UDEV_OLD_NO_POLICY_TEMPLATE" - else - template="$UDEV_NEW_NO_POLICY_TEMPLATE" - fi + mode="$2" + + case "$mode" in + policykit|consolekit) + template="$UDEV_CONDITION_PARTIAL_TEMPLATE, $UDEV_ACTION_POLICYKIT" + ;; + old_udev) + template="$UDEV_CONDITION_OLD_TEMPLATE, $UDEV_ACTION_GENERIC" + ;; + esac emit_for_all $file "$template" 'yes' } create_udev_files() { mode=$1 + echo -n "Creating udev file: $UDEV_FILE ... " - emit_udev_header $UDEV_FILE - emit_udev_rules $UDEV_FILE $mode - emit_udev_footer $UDEV_FILE + # delete wahtever used to be there + rm -f $UDEV_FILE + + case "$mode" in + policykit|consolekit|old_udev) + emit_old_udev_header $UDEV_FILE + emit_old_udev_rules $UDEV_FILE $mode + emit_old_udev_footer $UDEV_FILE + ;; + udev|generic_udev) + emit_udev_rules $UDEV_FILE $mode + ;; + *) + echo "BAD MODE: $mode" + exit 1 + ;; + esac echo 'done' # USBNET rule needs to be in a separate file because it depends on # 75-net-description.rules. @@ -217,23 +269,27 @@ # MAIN # -while getopts upco opt; do +while getopts cgopu opt; do case $opt in - u) - MODE='udev_only' - ;; - p) - MODE='policykit' - ;; c) MODE='consolekit' ;; + g) + MODE='generic_udev' + ;; o) MODE='old_udev' ;; + p) + MODE='policykit' + ;; + u) + MODE='udev' + ;; *) usage exit 1 + ;; esac done |
From: Phil D. <ja...@us...> - 2013-04-07 01:43:53
|
Update of /cvsroot/concordance/concordance/libconcord In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv17142 Modified Files: Tag: zwave_work_branch libconcord.cpp Log Message: From: Scott Talbert <sw...@te...> For the HID remotes, send a reset USB message before sending any other messages. Seems to be required for the Harmony One, otherwise the first communication attempt fails. The official software seems to do this for most remotes. Signed-off-by: Scott Talbert <sw...@te...> Signed-off-by: Phil Dibowitz <ph...@ip...> Index: libconcord.cpp =================================================================== RCS file: /cvsroot/concordance/concordance/libconcord/libconcord.cpp,v retrieving revision 1.42.2.27 retrieving revision 1.42.2.28 diff -u -d -r1.42.2.27 -r1.42.2.28 --- libconcord.cpp 3 Apr 2013 06:13:55 -0000 1.42.2.27 +++ libconcord.cpp 7 Apr 2013 01:43:50 -0000 1.42.2.28 @@ -744,6 +744,14 @@ rmt = new CRemoteMH; } else { rmt = new CRemote; + /* + * Send a "reset USB" command before sending any other + * commands. Seems to be required for the Harmony One; + * otherwise, the first communication attempt fails. + * The official software seems to do this for most + * remotes. + */ + rmt->Reset(COMMAND_RESET_USB); } } |
From: Phil D. <ja...@us...> - 2013-04-07 01:42:17
|
Update of /cvsroot/concordance/concordance/libconcord In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv17077 Modified Files: Tag: zwave_work_branch remote_z.cpp Log Message: From: Scott Talbert <sw...@te...> Fix zwave config dump output - make a "done" callback when we're done reading the config. Signed-off-by: Scott Talbert <sw...@te...> Signed-off-by: Phil Dibowitz <ph...@ip...> Index: remote_z.cpp =================================================================== RCS file: /cvsroot/concordance/concordance/libconcord/remote_z.cpp,v retrieving revision 1.25.2.19 retrieving revision 1.25.2.20 diff -u -d -r1.25.2.19 -r1.25.2.20 --- remote_z.cpp 3 Apr 2013 06:13:56 -0000 1.25.2.19 +++ remote_z.cpp 7 Apr 2013 01:42:15 -0000 1.25.2.20 @@ -1074,6 +1074,11 @@ /* Return TCP state to initial conditions */ SYN_ACKED = false; + if (cb) { + cb(cb_stage, cb_count++, data_read, data_read, + LC_CB_COUNTER_TYPE_BYTES, cb_arg, NULL); + } + return 0; } |
From: Phil D. <ja...@us...> - 2013-04-07 01:34:03
|
Update of /cvsroot/concordance/concordance/libconcord In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv16806 Modified Files: Tag: zwave_work_branch INSTALL.linux Makefile.am Log Message: Update udev_install rules to install into /lib/udev by default and allow this to be configurable. Signed-off-by: Phil Dibowitz <ph...@ip...> Index: INSTALL.linux =================================================================== RCS file: /cvsroot/concordance/concordance/libconcord/INSTALL.linux,v retrieving revision 1.14.2.2 retrieving revision 1.14.2.3 diff -u -d -r1.14.2.2 -r1.14.2.3 --- INSTALL.linux 15 Mar 2012 07:07:15 -0000 1.14.2.2 +++ INSTALL.linux 7 Apr 2013 01:33:59 -0000 1.14.2.3 @@ -47,6 +47,11 @@ make udev sudo make install_udev +By default this installs rules in /lib/udev. You can override this by setting +the UDEVLIBDIR environment variable (as root): + + UDEVLIBDIR=/etc/udev make install_udev + If you have an older distribution without a recent enough version of udev, you can choose between old-style generic udev support, hal/consolekit support, and hal/policykit support. Index: Makefile.am =================================================================== RCS file: /cvsroot/concordance/concordance/libconcord/Makefile.am,v retrieving revision 1.11.2.7 retrieving revision 1.11.2.8 diff -u -d -r1.11.2.7 -r1.11.2.8 --- Makefile.am 3 Apr 2013 06:13:55 -0000 1.11.2.7 +++ Makefile.am 7 Apr 2013 01:34:00 -0000 1.11.2.8 @@ -7,21 +7,23 @@ operationfile.cpp remote_mh.cpp include_HEADERS = libconcord.h libconcord_la_LDFLAGS = -version-info 2:0:0 -lusb -lzzip +UDEVROOT ?= / +UDEVLIBDIR ?= $(UDEVROOT)/lib # udev and friends support udev: ./gen_udev_support -u install_udev_generic: - $(MKDIR_P) $(DESTDIR)$(libdir)/udev/rules.d + $(MKDIR_P) $(DESTDIR)$(UDEVLIBDIR)/udev/rules.d $(install_sh_DATA) libconcord.rules \ - $(DESTDIR)$(libdir)/udev/rules.d/60-libconcord.rules + $(DESTDIR)$(UDEVLIBDIR)/udev/rules.d/60-libconcord.rules $(install_sh_DATA) libconcord-usbnet.rules \ - $(DESTDIR)$(libdir)/udev/rules.d/80-libconcord-usbnet.rules + $(DESTDIR)$(UDEVLIBDIR)/udev/rules.d/80-libconcord-usbnet.rules $(install_sh_SCRIPT) start_concordance_dhcpd.sh \ - $(DESTDIR)$(libdir)/udev/ + $(DESTDIR)$(UDEVLIBDIR)/udev/ $(install_sh_SCRIPT) start_concordance_dhcpd_wrapper.sh \ - $(DESTDIR)$(libdir)/udev/ + $(DESTDIR)$(UDEVLIBDIR)/udev/ install_udev: udev install_udev_generic |
From: Phil D. <ja...@us...> - 2013-04-03 23:58:39
|
Update of /cvsroot/concordance/concordance/specs In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv30202 Added Files: Tag: zwave_work_branch protocol_mh.txt Log Message: Protocol file from the recent MH patch from Scott... didn't get 'cvs add'ed. Signed-off-by: Phil Dibowitz <ph...@ip...> --- NEW FILE: protocol_mh.txt --- "MyHarmony" Protocol: There seem to be two types of messages, command messages and data messages. Command messages/responses: 1st byte is always 0xFF 2nd byte is the command (see below). 3rd byte is the sequence number, which ranges from 0x00 to 0x3F then rolls over => in messages from the remote, the uppermost bit will be set, eg: => if the sequence number in the message sent to the remote is 0x03, the => response will have the sequence number 0x83. 4th byte is the number of parameters. 5th byte and on are the parameters. Each parameter begins with a byte which indicates the number of bytes in the parameter. => if the parameter length byte is 0x80, then the parameter is a "string" of hex ASCII characters and is terminated by a 0x00. Command message 0x01 - Read/Write a file. Parameters: 3 Parameter 1: String; filename to read or write. Known files: Identity file is /sys/sysinfo Config file is /cfg/usercfg IR learn is /ir/ir_cap Parameter 2: String; 'W' for write, 'R' for read. Parameter 3: 4 bytes; length of data to write (only use for writes) Response (to a read command): Parameters: 2 Parameter 1: 1 byte; unknown. Parameter 1: 4 bytes; length of data that will be read. Command message 0x03 - Data mode acknowledgement response. Parameters: 2 Parameter 1: 1 byte; unknown; value seems to always be 0x05. Parameter 2: 1 byte; number of packets left to send, plus one. If there are more than 50 packets to send, 0x33 (51) is sent. The end of file message (0x7E) is included in the count. Command message 0x04 - Data mode read start message (sent before get identity and IR data modes start) Parameters: 2 Parameter 1: 1 byte; unknown; value seems to always be 0x06. Parameter 2: 1 byte; number of packets to send before expecting an acknowledgement, minus one (ie, 0x33 [51] -> send 50 pkts). Command message 0x05 - unknown (sent after writing a config file) Parameters: 2 Parameter 1: 1 byte; unknown; value seems to always be 0x05. Parameter 2: 1 byte; unknown; value seems to always be 0x00. Command message 0x06 - Write file checksum (after a write). Parameters: 7 Parameter 1: 1 byte; unknown; value seems to always be 0x05. Parameter 2: 1 byte; unknown; value seems to always be 0x01. Parameter 3: String; Checksum Type (from XML), e.g., "XOR". Parameter 4: 2 bytes; Checksum Seed (from XML), e.g., "4321". Parameter 5: 4 bytes; unknown; value seems to always be 0x00000000. (Might be Checksum "Offset" from XML) Parameter 6: 4 bytes; Checksum Length (from XML), e.g., "4db1". Parameter 7: 2 bytes; Checksum ExpectedValue (from XML), "5740". Command message 0x07 - Reset sequence number to 0? (sent after reading identity, after writing a config file, and after learning IR) Parameters: 1 Parameter 1: 1 byte; unknown; value seems to be 0x06 before write and 0x05 after Special commands - some commands do not have sequence numbers in the 2nd byte: Reset command: 0xFF 0xFF 0x02 0x01 0x01 Data messages: Once the remote or the software switches to data mode, the packets are as follows: 1st byte: sequence number (uppermost bit set to 1 if from the remote) 2nd byte: data length, eg: 0x3e for a full packet of 62 bytes (uppermost bit will be set to 1 if from the remote) 3rd-64th bytes: data IR learning: Once the remote is in IR learning mode, the packets received from the remote are in the same format as the IR learning mode of pure HID remotes (see protocol.txt) |
From: Phil D. <ja...@us...> - 2013-04-03 15:44:32
|
Update of /cvsroot/concordance/concordance/libconcord In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv636 Added Files: Tag: zwave_work_branch remote_mh.cpp Log Message: Missing remote_mh.cpp from previous commit to add 300/mh support. This was from Scott's patch, but didn't get 'cvs add'ed. Signed-off-by: Phil Dibowitz <ph...@ip...> --- NEW FILE: remote_mh.cpp --- /* * vi: formatoptions+=tc textwidth=80 tabstop=8 shiftwidth=8 noexpandtab: * * $Id: remote_mh.cpp,v 1.1.2.1 2013/04/03 15:44:30 jaymzh Exp $ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * (C) Copyright Kevin Timmerman 2007 * (C) Copyright Phil Dibowitz 2007 * (C) Copyright Scott Talbert 2012 */ #include "remote.h" #include <string.h> #include <iostream> #include <stdlib.h> #include "libconcord.h" #include "lc_internal.h" #include "hid.h" #include "protocol.h" #include "remote_info.h" #include "web.h" /* Timeout to wait for a response, in ms. */ #define MH_TIMEOUT 5000 #define MH_MAX_PACKET_SIZE 64 /* In data mode, two bytes are used for the header. */ #define MH_MAX_DATA_SIZE 62 void debug_print_packet(uint8_t* p) { debug("%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x " \ "%02x %02x %02x %02x", p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]); } int CRemoteMH::Reset(uint8_t kind) { int err; uint8_t rsp[MH_MAX_PACKET_SIZE]; /* write reset msg */ const uint8_t msg_reset[MH_MAX_PACKET_SIZE] = { 0xFF, 0xFF, 0x02, 0x01, 0x01 }; if ((err = HID_WriteReport(msg_reset))) { debug("Failed to write to remote"); return 1; } if ((err = HID_ReadReport(rsp, MH_TIMEOUT))) { debug("Failed to read from remote"); return 1; } debug("msg_reset"); debug_print_packet(rsp); return 0; } string find_value(string str, string key) { string value = ""; int pos = str.find(key); if (pos != string::npos) { int value_start = str.find(" ", pos) + 1; int value_end = str.find(0x0A, pos); int len = value_end - value_start; if ((value_start != string::npos) && (value_end != string::npos)) value = str.substr(value_start, len); } return value; } struct mh_config_attributes { uint8_t type[3]; uint8_t seed[2]; uint8_t length[4]; uint8_t expectedvalue[2]; }; // Parse the XML file for the checksum-related attributes that are needed to // complete an update configuration operation. int get_mh_config_attributes(uint8_t *xml, uint32_t xml_size, mh_config_attributes *attr) { int err; string checksum; uint8_t *ptr; err = GetTag("CHECKSUM", xml, xml_size, ptr, &checksum, true); if (err) return err; string type; err = GetAttribute("TYPE", checksum, &type); if (err) return err; const char *type_cstr = type.c_str(); if (strlen(type_cstr) == 3) { attr->type[0] = type_cstr[0]; attr->type[1] = type_cstr[1]; attr->type[2] = type_cstr[2]; } string seed; err = GetAttribute("SEED", checksum, &seed); if (err) return err; uint16_t seed_int = strtol(seed.c_str(), NULL, 16); attr->seed[0] = (seed_int & 0xFF00) >> 8; attr->seed[1] = (seed_int & 0x00FF); string length; err = GetAttribute("LENGTH", checksum, &length); if (err) return err; uint32_t length_int = strtol(length.c_str(), NULL, 16); attr->length[0] = (length_int & 0xFF000000) >> 24; attr->length[1] = (length_int & 0x00FF0000) >> 16; attr->length[2] = (length_int & 0x0000FF00) >> 8; attr->length[3] = (length_int & 0x000000FF); string expectedvalue; err = GetAttribute("EXPECTEDVALUE", checksum, &expectedvalue); if (err) return err; uint16_t expectedvalue_int = strtol(expectedvalue.c_str(), NULL, 16); attr->expectedvalue[0] = (expectedvalue_int & 0xFF00) >> 8; attr->expectedvalue[1] = (expectedvalue_int & 0x00FF); return 0; } // Returns the current sequence number and increments it appropriately. uint8_t get_seq(uint8_t &seq) { uint8_t tmp = seq; seq++; if (seq > 0x3F) { // seq rolls over after 0x3F seq = 0x00; } return tmp; } /* * Send the GET_VERSION command to the remote, and read the response. * * Then populate our struct with all the relevant info. */ int CRemoteMH::GetIdentity(TRemoteInfo &ri, THIDINFO &hid, lc_callback cb, void *cb_arg, uint32_t cb_stage) { int err = 0; uint32_t cb_count = 0; const uint8_t msg_one[MH_MAX_PACKET_SIZE] = { 0xFF, 0x00, 0x00, 0x01, 0x01 }; const uint8_t msg_two[MH_MAX_PACKET_SIZE] = { 0xFF, 0xFF, 0x01, 0x01, 0x01, 0x66 }; const uint8_t msg_three[MH_MAX_PACKET_SIZE] = { 0xFF, 0x00, 0x02 }; const uint8_t msg_four[MH_MAX_PACKET_SIZE] = { 0xFF, 0x01, 0x03, 0x02, 0x80, '/', 's', 'y', 's', '/', 's', 'y', 's', 'i', 'n', 'f', 'o', 0x00, 0x80, 'R', 0x00 }; const uint8_t msg_five[MH_MAX_PACKET_SIZE] = { 0xFF, 0x04, 0x04, 0x02, 0x01, 0x06, 0x01, 0x06 }; const uint8_t msg_six[MH_MAX_PACKET_SIZE] = { 0xFF, 0x07, 0x05, 0x01, 0x01, 0x06 }; uint8_t rsp[MH_MAX_PACKET_SIZE]; /* * Send msg_one five times. Yes, this is weird, but this is what the * official software does and seems to be required to establish comms. */ for (int i = 0; i < 5; i++) { if ((err = HID_WriteReport(msg_one))) { debug("Failed to write to remote"); return LC_ERROR_WRITE; } } if ((err = HID_WriteReport(msg_two))) { debug("Failed to write to remote"); return LC_ERROR_WRITE; } if ((err = HID_ReadReport(rsp))) { debug("Failed to read from remote"); return LC_ERROR_READ; } debug("msg_two"); debug_print_packet(rsp); if ((err = HID_WriteReport(msg_three))) { debug("Failed to write to remote"); return LC_ERROR_WRITE; } if ((err = HID_ReadReport(rsp))) { debug("Failed to read from remote"); return LC_ERROR_READ; } debug("msg_three"); debug_print_packet(rsp); if ((err = HID_WriteReport(msg_four))) { debug("Failed to write to remote"); return LC_ERROR_WRITE; } if ((err = HID_ReadReport(rsp))) { debug("Failed to read from remote"); return LC_ERROR_READ; } debug("msg_four"); debug_print_packet(rsp); if ((err = HID_WriteReport(msg_five))) { debug("Failed to write to remote"); return LC_ERROR_WRITE; } if ((err = HID_ReadReport(rsp))) { debug("Failed to read from remote"); return LC_ERROR_READ; } debug("msg_five"); debug_print_packet(rsp); string identity = ""; while(!(err = HID_ReadReport(rsp))) { // Ignore 1st two bits on 2nd byte for length. int len = rsp[1] & 0x3F; // Skip 1st two bytes, read up to packet length. "len" // represents the payload length (not including the two size // bytes), so we read a full "len" bytes from 2 to len+2. for (int i = 2; i < len + 2; i++) { identity += rsp[i]; } } debug("%s", identity.c_str()); ri.fw_ver_major = strtol(find_value(identity, "fw_ver").c_str(), NULL, 10); ri.fw_ver_minor = strtol(find_value(identity, "fw_ver").c_str()+2, NULL, 10); ri.hw_ver_major = strtol(find_value(identity, "hw_ver").c_str(), NULL, 16); ri.hw_ver_minor = 0; ri.hw_ver_micro = 0; /* usbnet remotes have a non-zero micro version */ ri.flash_id = 0x12; // TODO: FIXME ri.flash_mfg = 0xFF; // TODO: FIXME ri.architecture = strtol(find_value(identity, "arch").c_str(), NULL, 16); ri.fw_type = strtol(find_value(identity, "fw_type").c_str(), NULL, 16); ri.skin = strtol(find_value(identity, "skin").c_str(), NULL, 16); ri.protocol = 9; // TODO: FIXME setup_ri_pointers(ri); if (cb) { cb(cb_stage, cb_count++, 1, 2, LC_CB_COUNTER_TYPE_STEPS, cb_arg, NULL); } ri.config_bytes_used = 0; ri.max_config_size = 1; ri.valid_config = 1; if (cb) { cb(cb_stage, cb_count++, 2, 2, LC_CB_COUNTER_TYPE_STEPS, cb_arg, NULL); } string guid_str = find_value(identity, "guid"); if (guid_str.length() >= 98) { uint8_t guid[48]; char guid_char[3]; guid_char[2] = '\0'; char *guid_cstr = (char*)guid_str.c_str() + 2; for (int i = 0; i < 48; i++) { guid_char[0] = guid_cstr[0]; guid_char[1] = guid_cstr[1]; guid[i] = strtol(guid_char, NULL, 16); guid_cstr = guid_cstr + 2; } make_serial(guid, ri); } /* reset the sequence number to 0 */ if ((err = HID_WriteReport(msg_six))) { debug("Failed to write to remote"); return LC_ERROR_WRITE; } if ((err = HID_ReadReport(rsp))) { debug("Failed to read from remote"); return LC_ERROR_READ; } debug("msg_six"); debug_print_packet(rsp); return 0; } int CRemoteMH::ReadFlash(uint32_t addr, const uint32_t len, uint8_t *rd, unsigned int protocol, bool verify, lc_callback cb, void *cb_arg, uint32_t cb_stage) { return LC_ERROR_UNSUPP; } int CRemoteMH::InvalidateFlash(lc_callback cb, void *cb_arg, uint32_t lc_stage) { return LC_ERROR_UNSUPP; } int CRemoteMH::EraseFlash(uint32_t addr, uint32_t len, const TRemoteInfo &ri, lc_callback cb, void *arg, uint32_t cb_stage) { return LC_ERROR_UNSUPP; } int CRemoteMH::PrepFirmware(const TRemoteInfo &ri, lc_callback cb, void *cb_arg, uint32_t cb_stage) { return LC_ERROR_UNSUPP; } int CRemoteMH::FinishFirmware(const TRemoteInfo &ri, lc_callback cb, void *cb_arg, uint32_t cb_stage) { return LC_ERROR_UNSUPP; } int CRemoteMH::PrepConfig(const TRemoteInfo &ri, lc_callback cb, void *cb_arg, uint32_t cb_stage) { return LC_ERROR_UNSUPP; } int CRemoteMH::FinishConfig(const TRemoteInfo &ri, lc_callback cb, void *cb_arg, uint32_t cb_stage) { return LC_ERROR_UNSUPP; } int CRemoteMH::WriteRam(uint32_t addr, const uint32_t len, uint8_t *wr) { return LC_ERROR_UNSUPP; } int CRemoteMH::ReadRam(uint32_t addr, const uint32_t len, uint8_t *rd) { return LC_ERROR_UNSUPP; } int CRemoteMH::WriteFlash(uint32_t addr, const uint32_t len, const uint8_t *wr, unsigned int protocol, lc_callback cb, void *arg, uint32_t cb_stage) { return LC_ERROR_UNSUPP; } int CRemoteMH::ReadMiscByte(uint8_t addr, uint32_t len, uint8_t kind, uint8_t *rd) { return LC_ERROR_UNSUPP; } int CRemoteMH::ReadMiscWord(uint16_t addr, uint32_t len, uint8_t kind, uint16_t *rd) { return LC_ERROR_UNSUPP; } int CRemoteMH::WriteMiscByte(uint8_t addr, uint32_t len, uint8_t kind, uint8_t *wr) { return LC_ERROR_UNSUPP; } int CRemoteMH::WriteMiscWord(uint16_t addr, uint32_t len, uint8_t kind, uint16_t *wr) { return LC_ERROR_UNSUPP; } int CRemoteMH::GetTime(const TRemoteInfo &ri, THarmonyTime &ht) { return LC_ERROR_UNSUPP; } int CRemoteMH::SetTime(const TRemoteInfo &ri, const THarmonyTime &ht, lc_callback cb, void *cb_arg, uint32_t cb_stage) { /* * MH remotes do not support SetTime() operations, but we return * success because some higher level operations (for example, update * configuration) call SetTime() and thus the whole operation would be * declared a failure, which we do not want. */ return 0; } int CRemoteMH::LearnIR(uint32_t *freq, uint32_t **ir_signal, uint32_t *ir_signal_length, lc_callback cb, void *cb_arg, uint32_t cb_stage) { int err = 0; uint32_t cb_count = 0; const uint8_t msg_one[MH_MAX_PACKET_SIZE] = { 0xFF, 0x01, 0x00, 0x02, 0x80, '/', 'i', 'r', '/', 'i', 'r', '_', 'c', 'a', 'p', 0x00, 0x80, 'R', 0x00 }; const uint8_t msg_two[MH_MAX_PACKET_SIZE] = { 0xFF, 0x04, 0x01, 0x02, 0x01, 0x0C, 0x01, 0x00 }; uint8_t rsp[MH_MAX_PACKET_SIZE]; if (cb) { cb(cb_stage, 0, 0, 1, LC_CB_COUNTER_TYPE_STEPS, cb_arg, NULL); } if ((err = HID_WriteReport(msg_one))) { debug("Failed to write to remote"); return LC_ERROR_WRITE; } if ((err = HID_ReadReport(rsp))) { debug("Failed to read from remote"); return LC_ERROR_READ; } debug("msg_one"); debug_print_packet(rsp); if ((err = HID_WriteReport(msg_two))) { debug("Failed to write to remote"); return LC_ERROR_WRITE; } if ((err = HID_ReadReport(rsp))) { debug("Failed to read from remote"); return LC_ERROR_READ; } debug("msg_two"); debug_print_packet(rsp); err = LearnIRInnerLoop(freq, ir_signal, ir_signal_length, 0x90); /* send stop message */ const uint8_t msg_stop[MH_MAX_PACKET_SIZE] = { 0xFF, 0x06, 0x02, 0x02, 0x01, 0x0C, 0x01, 0x06 }; if (HID_WriteReport(msg_stop) != 0) { debug("Failed to write to remote"); err = LC_ERROR_WRITE; } if (HID_ReadReport(rsp) != 0) { debug("Failed to read from remote"); err = LC_ERROR_READ; } debug("msg_stop"); debug_print_packet(rsp); /* send reset sequence message */ const uint8_t msg_reset_seq[MH_MAX_PACKET_SIZE] = { 0xFF, 0x07, 0x03, 0x01, 0x01, 0x0C }; if (HID_WriteReport(msg_reset_seq) != 0) { debug("Failed to write to remote"); err = LC_ERROR_WRITE; } if (HID_ReadReport(rsp) != 0) { debug("Failed to read from remote"); err = LC_ERROR_READ; } debug("msg_reset_seq"); debug_print_packet(rsp); if (cb && !err) { cb(cb_stage, 1, 1, 1, LC_CB_COUNTER_TYPE_STEPS, cb_arg, NULL); } return err; } int CRemoteMH::UpdateConfig(const uint32_t len, const uint8_t *wr, lc_callback cb, void *cb_arg, uint32_t cb_stage, uint32_t xml_size, uint8_t *xml) { int err = 0; uint32_t cb_count = 0; const uint8_t msg_one[MH_MAX_PACKET_SIZE] = { 0xFF, 0xFF, 0x00, 0x01, 0x01, 0x66 }; const uint8_t msg_two[MH_MAX_PACKET_SIZE] = { 0xFF, 0x01, 0x01, 0x03, 0x80, '/', 'c', 'f', 'g', '/', 'u', 's', 'e', 'r', 'c', 'f', 'g', 0x00, 0x80, 'W', 0x00, 0x04, (len & 0xFF000000) >> 24, (len & 0x00FF0000) >> 16, (len & 0x0000FF00) >> 8, len & 0x000000FF }; const uint8_t msg_three[MH_MAX_PACKET_SIZE] = { 0xFF, 0x03, 0x03, 0x02, 0x01, 0x05, 0x01, 0x33 }; uint8_t rsp[MH_MAX_PACKET_SIZE]; cb(LC_CB_STAGE_INITIALIZE_UPDATE, cb_count++, 0, 3, LC_CB_COUNTER_TYPE_STEPS, cb_arg, NULL); if ((err = HID_WriteReport(msg_one))) { debug("Failed to write to remote"); return LC_ERROR_WRITE; } if ((err = HID_ReadReport(rsp, MH_TIMEOUT))) { debug("Failed to read from remote"); return LC_ERROR_READ; } debug("msg_one"); debug_print_packet(rsp); cb(LC_CB_STAGE_INITIALIZE_UPDATE, cb_count++, 1, 3, LC_CB_COUNTER_TYPE_STEPS, cb_arg, NULL); if ((err = HID_WriteReport(msg_two))) { debug("Failed to write to remote"); return LC_ERROR_WRITE; } if ((err = HID_ReadReport(rsp, MH_TIMEOUT))) { debug("Failed to read from remote"); return LC_ERROR_READ; } debug("msg_two"); debug_print_packet(rsp); cb(LC_CB_STAGE_INITIALIZE_UPDATE, cb_count++, 2, 3, LC_CB_COUNTER_TYPE_STEPS, cb_arg, NULL); if ((err = HID_WriteReport(msg_three))) { debug("Failed to write to remote"); return LC_ERROR_WRITE; } // No response is expected to this packet. debug("msg_three"); cb(LC_CB_STAGE_INITIALIZE_UPDATE, cb_count++, 3, 3, LC_CB_COUNTER_TYPE_STEPS, cb_arg, NULL); cb_count = 0; // Start writing data: // First byte is the sequence number, which starts at 0x04 and rolls // over to 0x00 after 0x3F. // Second byte is the data length, up to 0x3E (62 bytes). uint8_t *wr_ptr = const_cast<uint8_t*>(wr); uint8_t seq = 0x04; uint32_t tlen = len; uint8_t pkt_len; uint8_t tmp_pkt[MH_MAX_PACKET_SIZE]; int pkt_count = 0; int pkts_to_send = len / MH_MAX_DATA_SIZE; if ((len % MH_MAX_DATA_SIZE) != 0) pkts_to_send++; pkts_to_send++; // include file completion packet, 0x7E, in count. uint8_t ack_rsp[MH_MAX_PACKET_SIZE] = { 0xFF, 0x03, 0x00, 0x02, 0x01, 0x05, 0x01, 0x33 }; while (tlen) { pkt_len = MH_MAX_DATA_SIZE; if (tlen < pkt_len) { pkt_len = tlen; } tlen -= pkt_len; tmp_pkt[0] = get_seq(seq); tmp_pkt[1] = pkt_len; memcpy(&tmp_pkt[2], wr_ptr, pkt_len); debug("DATA %d, sending %d bytes, %d bytes left", cb_count, pkt_len, tlen); if (err = HID_WriteReport(tmp_pkt)) { return err; } wr_ptr += pkt_len; pkt_count++; pkts_to_send--; /* Every 50 data packets, the remote seems to send us an "ack" of some sort. Read it and send a response back. */ if (pkt_count == 50) { if ((err = HID_ReadReport(rsp, MH_TIMEOUT))) { debug("Failed to read from remote"); return LC_ERROR_READ; } debug_print_packet(rsp); /* 3rd byte is the sequence number */ ack_rsp[2] = get_seq(seq); /* 2nd parameter is the number of packets remaining, plus one */ if (pkts_to_send < 50) ack_rsp[7] = pkts_to_send + 1; if ((err = HID_WriteReport(ack_rsp))) { debug("Failed to write to remote"); return LC_ERROR_WRITE; } pkt_count = 0; } if (cb) { cb(LC_CB_STAGE_WRITE_CONFIG, cb_count++, (int)(wr_ptr - wr), len, LC_CB_COUNTER_TYPE_BYTES, cb_arg, NULL); } } cb_count = 0; cb(LC_CB_STAGE_FINALIZE_UPDATE, cb_count++, 0, 4, LC_CB_COUNTER_TYPE_STEPS, cb_arg, NULL); /* write end of data stream message */ const uint8_t end_msg[MH_MAX_PACKET_SIZE] = { 0x7E }; if ((err = HID_WriteReport(end_msg))) { debug("Failed to write to remote"); return LC_ERROR_WRITE; } if ((err = HID_ReadReport(rsp, MH_TIMEOUT))) { debug("Failed to read from remote"); return LC_ERROR_WRITE; } debug("end_msg"); debug_print_packet(rsp); cb(LC_CB_STAGE_FINALIZE_UPDATE, cb_count++, 1, 4, LC_CB_COUNTER_TYPE_STEPS, cb_arg, NULL); /* write finish config message */ mh_config_attributes mca; if (err = get_mh_config_attributes(xml, xml_size, &mca)) { debug("Failed to parse config attributes"); return LC_ERROR; } const uint8_t finish_msg[MH_MAX_PACKET_SIZE] = { 0xFF, 0x06, get_seq(seq), 0x07, 0x01, 0x05, 0x01, 0x01, 0x80, mca.type[0], mca.type[1], mca.type[2], 0x00, 0x02, mca.seed[0], mca.seed[1], 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, mca.length[0], mca.length[1], mca.length[2], mca.length[3], 0x02, mca.expectedvalue[0], mca.expectedvalue[1] }; if ((err = HID_WriteReport(finish_msg))) { debug("Failed to write to remote"); return LC_ERROR_WRITE; } if ((err = HID_ReadReport(rsp, MH_TIMEOUT))) { debug("Failed to read from remote"); return LC_ERROR_READ; } debug("finish_msg"); debug_print_packet(rsp); cb(LC_CB_STAGE_FINALIZE_UPDATE, cb_count++, 2, 4, LC_CB_COUNTER_TYPE_STEPS, cb_arg, NULL); /* write msg 5 */ const uint8_t msg_5[MH_MAX_PACKET_SIZE] = { 0xFF, 0x05, get_seq(seq), 0x02, 0x01, 0x05, 0x01, 0x00 }; if ((err = HID_WriteReport(msg_5))) { debug("Failed to write to remote"); return LC_ERROR_WRITE; } if ((err = HID_ReadReport(rsp, MH_TIMEOUT))) { debug("Failed to read from remote"); return LC_ERROR_READ; } debug("msg_5"); debug_print_packet(rsp); cb(LC_CB_STAGE_FINALIZE_UPDATE, cb_count++, 3, 4, LC_CB_COUNTER_TYPE_STEPS, cb_arg, NULL); /* write msg 7 */ const uint8_t msg_7[MH_MAX_PACKET_SIZE] = { 0xFF, 0x07, get_seq(seq), 0x01, 0x01, 0x05 }; if ((err = HID_WriteReport(msg_7))) { debug("Failed to write to remote"); return LC_ERROR_WRITE; } if ((err = HID_ReadReport(rsp, MH_TIMEOUT))) { debug("Failed to read from remote"); return LC_ERROR_READ; } debug("msg_7"); debug_print_packet(rsp); cb(LC_CB_STAGE_FINALIZE_UPDATE, cb_count++, 4, 4, LC_CB_COUNTER_TYPE_STEPS, cb_arg, NULL); return 0; } |
From: Phil D. <ja...@us...> - 2013-04-03 06:13:58
|
Update of /cvsroot/concordance/concordance/libconcord In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv1137/libconcord Modified Files: Tag: zwave_work_branch Makefile.am lc_internal.h libconcord.cpp operationfile.cpp remote.cpp remote.h remote_info.h remote_z.cpp web.cpp web.h Log Message: From: Scott Talbert <sw...@te...> Initial support for Harmony 300 in libconcord. Added a new remote type, MH (MyHarmony, after the alternate web site used). Modified UpdateConfig method to allow the XML file to be passed in - MH remotes need some information from the XML in order to perform a configuration update. Added some XML parsing methods to extract this information. GetIdentity, UpdateConfiguration, LearnIR, and Reset operations are supported. Signed-off-by: Scott Talbert <sw...@te...> Signed-off-by: Phil Dibowitz <ph...@ip...> Index: operationfile.cpp =================================================================== RCS file: /cvsroot/concordance/concordance/libconcord/Attic/operationfile.cpp,v retrieving revision 1.1.2.4 retrieving revision 1.1.2.5 diff -u -d -r1.1.2.4 -r1.1.2.5 --- operationfile.cpp 12 Jan 2013 23:54:55 -0000 1.1.2.4 +++ operationfile.cpp 3 Apr 2013 06:13:55 -0000 1.1.2.5 @@ -97,7 +97,8 @@ ZZIP_DIRENT dirent; while (zzip_dir_read(dir, &dirent)) { ZZIP_FILE *fh = zzip_file_open(dir, dirent.d_name, 0); - if (strcmp(dirent.d_name, "Data.xml") == 0) { + if ((strcmp(dirent.d_name, "Data.xml") == 0) || + (strcmp(dirent.d_name, "Description.xml") == 0)) { debug("Internal file is %s", dirent.d_name); debug("Size is %d", dirent.st_size); xml_size = dirent.st_size; Index: lc_internal.h =================================================================== RCS file: /cvsroot/concordance/concordance/libconcord/lc_internal.h,v retrieving revision 1.2.2.2 retrieving revision 1.2.2.3 diff -u -d -r1.2.2.2 -r1.2.2.3 --- lc_internal.h 22 Mar 2012 08:50:20 -0000 1.2.2.2 +++ lc_internal.h 3 Apr 2013 06:13:55 -0000 1.2.2.3 @@ -60,5 +60,6 @@ /* NOTE: 1 for yes, 0 for no, unlike some other functions. */ int is_z_remote(); int is_usbnet_remote(); +int is_mh_remote(); #endif // ifndef LC_INTERNAL_H Index: libconcord.cpp =================================================================== RCS file: /cvsroot/concordance/concordance/libconcord/libconcord.cpp,v retrieving revision 1.42.2.26 retrieving revision 1.42.2.27 diff -u -d -r1.42.2.26 -r1.42.2.27 --- libconcord.cpp 29 Mar 2013 20:44:01 -0000 1.42.2.26 +++ libconcord.cpp 3 Apr 2013 06:13:55 -0000 1.42.2.27 @@ -220,6 +220,22 @@ return rmt->IsUSBNet() ? 1 : 0; } +int is_mh_remote() +{ + return rmt->IsMHRemote() ? 1 : 0; +} + +int is_mh_pid(unsigned int pid) +{ + switch (pid) { + case 0xC124: /* Harmony 300 */ + case 0xC125: /* Harmony 200 */ + return 1; + default: + return 0; + } +} + int get_time_second() { return rtime.second; @@ -634,7 +650,7 @@ uint32_t *base_stages; int num_base_stages; - if (is_z_remote()) { + if (is_z_remote() || is_mh_remote()) { base_stages = (uint32_t*)update_configuration_zwave_mh_stages; num_base_stages = update_configuration_zwave_mh_num_stages; } else { @@ -724,6 +740,8 @@ hid_info.pid <= ZWAVE_HID_PID_MAX) { // 890, Monstor, etc. rmt = new CRemoteZ_HID; + } else if (is_mh_pid(hid_info.pid)) { + rmt = new CRemoteMH; } else { rmt = new CRemote; } @@ -1006,9 +1024,10 @@ cb_arg = (void *)true; } - if (is_z_remote()) { + if (is_z_remote() || is_mh_remote()) { if ((err = rmt->UpdateConfig(of->GetDataSize(), of->GetData(), - cb, cb_arg, cb_stage))) + cb, cb_arg, cb_stage, of->GetXmlSize(), + of->GetXml()))) return LC_ERROR_WRITE; } else { if ((err = rmt->WriteFlash(ri.arch->config_base, @@ -1149,6 +1168,17 @@ return 0; } +int _update_configuration_mh(lc_callback cb, void *cb_arg) +{ + int err; + + if ((err = _write_config_to_remote(cb, cb_arg, 0))) { + return err; + } + + return 0; +} + int _update_configuration_hid(lc_callback cb, void *cb_arg) { int err; int cb_count = 0; @@ -1197,6 +1227,8 @@ if (is_z_remote()) { err = _update_configuration_zwave(cb, cb_arg); + } else if (is_mh_remote()) { + err = _update_configuration_mh(cb, cb_arg); } else { err = _update_configuration_hid(cb, cb_arg); } Index: remote.h =================================================================== RCS file: /cvsroot/concordance/concordance/libconcord/remote.h,v retrieving revision 1.20.2.12 retrieving revision 1.20.2.13 diff -u -d -r1.20.2.12 -r1.20.2.13 --- remote.h 29 Mar 2013 19:47:17 -0000 1.20.2.12 +++ remote.h 3 Apr 2013 06:13:55 -0000 1.20.2.13 @@ -151,6 +151,8 @@ void setup_ri_pointers(TRemoteInfo &ri); void make_serial(uint8_t *ser, TRemoteInfo &ri); +int LearnIRInnerLoop(uint32_t *freq, uint32_t **ir_signal, + uint32_t *ir_signal_length, uint8_t seq); class CRemoteBase // Base class for all remotes { @@ -185,7 +187,8 @@ void *cb_arg=NULL, uint32_t cb_stage=0)=0; virtual int UpdateConfig(const uint32_t len, const uint8_t *wr, lc_callback cb, void *cb_arg, - uint32_t cb_stage)=0; + uint32_t cb_stage, uint32_t xml_size=0, + uint8_t *xml=NULL)=0; virtual int GetTime(const TRemoteInfo &ri, THarmonyTime &ht)=0; virtual int SetTime(const TRemoteInfo &ri, const THarmonyTime &ht, lc_callback cb=NULL, void *cb_arg=NULL, @@ -195,6 +198,7 @@ void *cb_arg=NULL, uint32_t cb_stage=0)=0; virtual int IsZRemote()=0; virtual int IsUSBNet()=0; + virtual int IsMHRemote()=0; }; class CRemote : public CRemoteBase // All non-Z-Wave remotes @@ -238,7 +242,8 @@ void *cb_arg=NULL, uint32_t cb_stage=0); virtual int UpdateConfig(const uint32_t len, const uint8_t *wr, lc_callback cb, void *cb_arg, - uint32_t cb_stage=0) {}; + uint32_t cb_stage=0, uint32_t xml_size=0, + uint8_t *xml=NULL) {}; int GetTime(const TRemoteInfo &ri, THarmonyTime &ht); int SetTime(const TRemoteInfo &ri, const THarmonyTime &ht, @@ -249,6 +254,7 @@ void *cb_arg=NULL, uint32_t cb_stage=0); int IsZRemote() {return false;} int IsUSBNet() {return false;} + int IsMHRemote() {return false;} }; // Base class for all Z-Wave remotes @@ -304,6 +310,7 @@ uint32_t *ir_signal_length, lc_callback cb=NULL, void *cb_arg=NULL, uint32_t cb_stage=0); int IsZRemote() {return true;} + int IsMHRemote() {return false;} }; // 890, 890Pro, AVL-300, RF Extender @@ -333,7 +340,8 @@ CRemoteZ_HID() {}; virtual ~CRemoteZ_HID() {}; int UpdateConfig(const uint32_t len, const uint8_t *wr, - lc_callback cb, void *cb_arg, uint32_t cb_stage); + lc_callback cb, void *cb_arg, uint32_t cb_stage, + uint32_t xml_size=0, uint8_t *xml=NULL); int IsUSBNet() {return false;} virtual int ReadRegion(uint8_t region, uint32_t &len, uint8_t *rd, lc_callback cb, void *cb_arg, uint32_t cb_stage); @@ -359,11 +367,70 @@ CRemoteZ_USBNET() {}; virtual ~CRemoteZ_USBNET() {}; int UpdateConfig(const uint32_t len, const uint8_t *wr, - lc_callback cb, void *cb_arg, uint32_t cb_stage); + lc_callback cb, void *cb_arg, uint32_t cb_stage, + uint32_t xml_size=0, uint8_t *xml=NULL); int GetTime(const TRemoteInfo &ri, THarmonyTime &ht); int SetTime(const TRemoteInfo &ri, const THarmonyTime &ht, lc_callback cb=NULL, void *cb_arg=NULL, uint32_t cb_stage=0); int IsUSBNet() {return true;} }; +class CRemoteMH : public CRemoteBase // "My Harmony" remotes +{ +private: + int ReadMiscByte(uint8_t addr, uint32_t len, uint8_t kind, + uint8_t *rd); + int ReadMiscWord(uint16_t addr, uint32_t len, uint8_t kind, + uint16_t *rd); + int WriteMiscByte(uint8_t addr, uint32_t len, uint8_t kind, + uint8_t *wr); + int WriteMiscWord(uint16_t addr, uint32_t len, uint8_t kind, + uint16_t *wr); + +public: + CRemoteMH() {}; + virtual ~CRemoteMH() {}; + int Reset(uint8_t kind); + int GetIdentity(struct TRemoteInfo &ri, struct THIDINFO &hid, + lc_callback cb=NULL, void *cb_arg=NULL, uint32_t cb_stage=0); + + int ReadFlash(uint32_t addr, const uint32_t len, uint8_t *rd, + unsigned int protocol, bool verify=false, + lc_callback cb=NULL, void *cb_arg=NULL, uint32_t cb_stage=0); + int InvalidateFlash(lc_callback cb=NULL, void *cb_arg=NULL, + uint32_t cb_stage=0); + int EraseFlash(uint32_t addr, uint32_t len, const TRemoteInfo &ri, + lc_callback cb=NULL, void *cb_arg=NULL, uint32_t cb_stage=0); + int WriteFlash(uint32_t addr, const uint32_t len, const uint8_t *wr, + unsigned int protocol, lc_callback cb=NULL, void *cb_arg=NULL, + uint32_t cb_stage=0); + int WriteRam(uint32_t addr, const uint32_t len, uint8_t *wr); + int ReadRam(uint32_t addr, const uint32_t len, uint8_t *rd); + int PrepFirmware(const TRemoteInfo &ri, lc_callback cb=NULL, + void *cb_arg=NULL, uint32_t cb_stage=0); + int FinishFirmware(const TRemoteInfo &ri, lc_callback cb=NULL, + void *cb_arg=NULL, uint32_t cb_stage=0); + int PrepConfig(const TRemoteInfo &ri, lc_callback cb=NULL, + void *cb_arg=NULL, uint32_t cb_stage=0); + int FinishConfig(const TRemoteInfo &ri, lc_callback cb=NULL, + void *cb_arg=NULL, uint32_t cb_stage=0); + virtual int UpdateConfig(const uint32_t len, + const uint8_t *wr, lc_callback cb, void *cb_arg, + uint32_t cb_stage=0) {}; + virtual int UpdateConfig(const uint32_t len, const uint8_t *wr, + lc_callback cb, void *cb_arg, uint32_t cb_stage=0, + uint32_t xml_size=0, uint8_t *xml=NULL); + + int GetTime(const TRemoteInfo &ri, THarmonyTime &ht); + int SetTime(const TRemoteInfo &ri, const THarmonyTime &ht, + lc_callback cb=NULL, void *cb_arg=NULL, uint32_t cb_stage=0); + + int LearnIR(uint32_t *freq, uint32_t **ir_signal, + uint32_t *ir_signal_length, lc_callback cb=NULL, + void *cb_arg=NULL, uint32_t cb_stage=0); + int IsZRemote() {return false;} + int IsUSBNet() {return false;} + int IsMHRemote() {return true;} +}; + #endif //REMOTE_H Index: Makefile.am =================================================================== RCS file: /cvsroot/concordance/concordance/libconcord/Makefile.am,v retrieving revision 1.11.2.6 retrieving revision 1.11.2.7 diff -u -d -r1.11.2.6 -r1.11.2.7 --- Makefile.am 29 Mar 2012 03:15:05 -0000 1.11.2.6 +++ Makefile.am 3 Apr 2013 06:13:55 -0000 1.11.2.7 @@ -4,7 +4,7 @@ libconcord_la_SOURCES = remote.cpp remote_z.cpp libconcord.cpp binaryfile.cpp \ web.cpp libusb/libusbhid.cpp usblan.cpp binaryfile.h hid.h protocol_z.h \ remote_info.h web.h protocol.h remote.h usblan.h xml_headers.h \ - operationfile.cpp + operationfile.cpp remote_mh.cpp include_HEADERS = libconcord.h libconcord_la_LDFLAGS = -version-info 2:0:0 -lusb -lzzip Index: web.cpp =================================================================== RCS file: /cvsroot/concordance/concordance/libconcord/web.cpp,v retrieving revision 1.27.2.4 retrieving revision 1.27.2.5 diff -u -d -r1.27.2.4 -r1.27.2.5 --- web.cpp 22 Mar 2012 08:50:20 -0000 1.27.2.4 +++ web.cpp 3 Apr 2013 06:13:56 -0000 1.27.2.5 @@ -154,9 +154,21 @@ return 0; } +// If find_attributes is set to true, finds an XML tag with attributes and will +// return the attributes. For example, if you have: <ELEMENT A="B" C="D"/> and +// you search for a tag called "ELEMENT" the function will return A="B" C="D". int GetTag(const char *find, uint8_t* data, uint32_t data_size, - uint8_t *&found, string *s=NULL) + uint8_t *&found, string *s=NULL, bool find_attributes=false) { + char tag_name_end = '>'; + char tag_start = '<'; + char tag_end = '>'; + if (find_attributes) { + tag_name_end = ' '; + tag_start = '/'; + tag_end = '/'; + } + const size_t find_len = strlen(find); uint8_t * search = data; @@ -181,7 +193,7 @@ // Point past <, at tag name search++; // Check to see if this is the tag we want - if (search[find_len] == '>' + if (search[find_len] == tag_name_end && !strnicmp(find, reinterpret_cast<const char*>(search), find_len)) { // Point past >, at tag content search += find_len + 1; @@ -198,7 +210,7 @@ * Here we keep adding chars until the next tag * which, in theory, should be the end-tag. */ - while (*search && *search != '<') { + while (*search && *search != tag_start) { *s += *search; search++; if (search >= data + data_size) { @@ -211,7 +223,7 @@ // Loop searching for end of tag character while (1) { - if (*search == '>') { + if (*search == tag_end) { break; } if (search >= data + data_size) { @@ -222,6 +234,31 @@ } } +// Given a set of XML attributes, e.g., ATTR1="VALUE1" ATTR2="VALUE2", this +// function will find a given attribute and return its value. +int GetAttribute(const char *find, string data, string *result) +{ + if ((find == NULL) || (result == NULL)) + return -1; + + size_t start_pos; + size_t end_pos; + string to_find = find; + to_find.append("=\""); + + start_pos = data.find(to_find); + if (start_pos == string::npos) + return -1; + start_pos += to_find.length(); + + end_pos = data.find("\"", start_pos); + if (end_pos == string::npos) + return -1; + + *result = data.substr(start_pos, end_pos - start_pos); + return 0; +} + int encode_ir_signal(uint32_t carrier_clock, uint32_t *ir_signal, uint32_t ir_signal_length, string *learn_seq) Index: web.h =================================================================== RCS file: /cvsroot/concordance/concordance/libconcord/web.h,v retrieving revision 1.11.2.2 retrieving revision 1.11.2.3 diff -u -d -r1.11.2.2 -r1.11.2.3 --- web.h 13 Sep 2010 00:02:25 -0000 1.11.2.2 +++ web.h 3 Apr 2013 06:13:56 -0000 1.11.2.3 @@ -26,7 +26,9 @@ #include "remote.h" int GetTag(const char *find, uint8_t* data, uint32_t data_size, - uint8_t *&found, string *s = NULL); + uint8_t *&found, string *s = NULL, bool find_attributes = false); + +int GetAttribute(const char *find, string data, string *result); int encode_ir_signal(uint32_t carrier_clock, uint32_t *ir_signal, uint32_t ir_signal_length, Index: remote_info.h =================================================================== RCS file: /cvsroot/concordance/concordance/libconcord/remote_info.h,v retrieving revision 1.12.2.6 retrieving revision 1.12.2.7 diff -u -d -r1.12.2.6 -r1.12.2.7 --- remote_info.h 29 Mar 2013 20:46:09 -0000 1.12.2.6 +++ remote_info.h 3 Apr 2013 06:13:55 -0000 1.12.2.7 @@ -97,7 +97,34 @@ { MFG_HAR, "Harmony 1100", NULL }, { MFG_UNK, "Unknown", NULL }, { MFG_UNK, "Unknown", NULL }, - { MFG_HAR, "Harmony 700", "Molson" } + { MFG_HAR, "Harmony 700", "Molson" }, + { MFG_UNK, "Unknown", NULL }, + { MFG_UNK, "Unknown", NULL }, + { MFG_HAR, "Harmony 700i", NULL }, + { MFG_UNK, "Unknown", NULL }, +// 70 + { MFG_HAR, "Harmony 600", NULL }, + { MFG_HAR, "Harmony 650", NULL }, + { MFG_HAR, "Harmony 600i", NULL }, + { MFG_HAR, "Harmony 650i", NULL }, + { MFG_UNK, "Unknown", NULL }, + { MFG_UNK, "Unknown", NULL }, + { MFG_UNK, "Unknown", NULL }, + { MFG_HAR, "Harmony 300", NULL }, + { MFG_HAR, "Harmony 300i", NULL }, + { MFG_HAR, "Harmony 200", NULL }, +// 80 + { MFG_HAR, "Harmony 200i", NULL }, + { MFG_HAR, "Harmony Link", NULL }, + { MFG_HAR, "Harmony Link (EMEA)", NULL }, + { MFG_UNK, "Unknown", NULL }, + { MFG_UNK, "Unknown", NULL }, + { MFG_UNK, "Unknown", NULL }, + { MFG_UNK, "Unknown", NULL }, + { MFG_UNK, "Unknown", NULL }, + { MFG_UNK, "Unknown", NULL }, + { MFG_UNK, "Unknown", NULL } +// 90 }; static const unsigned int max_model=sizeof(ModelList)/sizeof(TModel)-1; @@ -449,6 +476,24 @@ 0, // ram_size 0, // eeprom_size "", // usb + }, + /* arch 16: 300 */ + { + 0, // serial_location + 0, // serial_address + 0, // flash_base + 0, // firmware_base + 0, // config_base + 0, // firmware_update_base + 0, // firmware_4847_offset + 0x4D505347, // cookie + 0, // cookie_size + 0, // end_vector + "", // micro + 0, // flash_size + 0, // ram_size + 0, // eeprom_size + "", // usb } }; Index: remote_z.cpp =================================================================== RCS file: /cvsroot/concordance/concordance/libconcord/remote_z.cpp,v retrieving revision 1.25.2.18 retrieving revision 1.25.2.19 diff -u -d -r1.25.2.18 -r1.25.2.19 --- remote_z.cpp 29 Mar 2013 19:47:17 -0000 1.25.2.18 +++ remote_z.cpp 3 Apr 2013 06:13:56 -0000 1.25.2.19 @@ -381,7 +381,8 @@ } int CRemoteZ_USBNET::UpdateConfig(const uint32_t len, const uint8_t *wr, - lc_callback cb, void *cb_arg, uint32_t cb_stage) + lc_callback cb, void *cb_arg, uint32_t cb_stage, uint32_t xml_size, + uint8_t *xml) { int err = 0; int cb_count = 0; @@ -1248,7 +1249,8 @@ } int CRemoteZ_HID::UpdateConfig(const uint32_t len, const uint8_t *wr, - lc_callback cb, void *cb_arg, uint32_t cb_stage) + lc_callback cb, void *cb_arg, uint32_t cb_stage, uint32_t xml_size, + uint8_t *xml) { int err = 0; int cb_count = 0; Index: remote.cpp =================================================================== RCS file: /cvsroot/concordance/concordance/libconcord/remote.cpp,v retrieving revision 1.40.2.11 retrieving revision 1.40.2.12 diff -u -d -r1.40.2.11 -r1.40.2.12 --- remote.cpp 29 Jan 2013 07:22:39 -0000 1.40.2.11 +++ remote.cpp 3 Apr 2013 06:13:55 -0000 1.40.2.12 @@ -55,7 +55,7 @@ { char x[48]; // usbnet remotes seem to use a more normal byte ordering for serial #'s - if (is_usbnet_remote()) { + if (is_usbnet_remote() || is_mh_remote()) { sprintf(x, "{%02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X}", in[0], in[1], in[2], in[3], in[4], in[5], in[6], in[7], @@ -960,26 +960,14 @@ return 0; } - -int CRemote::LearnIR(uint32_t *freq, uint32_t **ir_signal, - uint32_t *ir_signal_length, lc_callback cb, void *cb_arg, - uint32_t cb_stage) +// This section of IR learning code is common between pure HID and MH remotes. +// 'seq' is the starting sequence number, which differs between HID and MH. +int LearnIRInnerLoop(uint32_t *freq, uint32_t **ir_signal, + uint32_t *ir_signal_length, uint8_t seq) { int err = 0; uint8_t rsp[68]; - static const uint8_t start_ir_learn[64] = { COMMAND_START_IRCAP }; - static const uint8_t stop_ir_learn[64] = { COMMAND_STOP_IRCAP }; - - if (cb) { - cb(cb_stage, 0, 0, 1, LC_CB_COUNTER_TYPE_STEPS, cb_arg, NULL); - } - - if (HID_WriteReport(start_ir_learn) != 0) { - return LC_ERROR_WRITE; - } - - uint8_t seq = 0; // Count of how man IR words we've received. uint32_t ir_word = 0; // Time button is on and off @@ -1045,6 +1033,29 @@ } } + return err; +} + +int CRemote::LearnIR(uint32_t *freq, uint32_t **ir_signal, + uint32_t *ir_signal_length, lc_callback cb, void *cb_arg, + uint32_t cb_stage) +{ + int err = 0; + uint8_t rsp[68]; + + static const uint8_t start_ir_learn[64] = { COMMAND_START_IRCAP }; + static const uint8_t stop_ir_learn[64] = { COMMAND_STOP_IRCAP }; + + if (cb) { + cb(cb_stage, 0, 0, 1, LC_CB_COUNTER_TYPE_STEPS, cb_arg, NULL); + } + + if (HID_WriteReport(start_ir_learn) != 0) { + return LC_ERROR_WRITE; + } + + err = LearnIRInnerLoop(freq, ir_signal, ir_signal_length, 0); + if (HID_WriteReport(stop_ir_learn) != 0) { err = LC_ERROR_WRITE; } |
From: Phil D. <ja...@us...> - 2013-03-29 20:46:41
|
Update of /cvsroot/concordance/concordance/libconcord In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv12777/libconcord Modified Files: remote_info.h Log Message: From: Scott Talbert <sw...@te...> Correct serial number address for Harmony 525. Signed-off-by: Scott Talbert <sw...@te...> Signed-off-by: Phil Dibowitz <ph...@ip...> Index: remote_info.h =================================================================== RCS file: /cvsroot/concordance/concordance/libconcord/remote_info.h,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- remote_info.h 4 Jun 2012 03:31:26 -0000 1.15 +++ remote_info.h 29 Mar 2013 20:46:39 -0000 1.16 @@ -331,7 +331,7 @@ /* arch 9: 360, 52x, 55x */ { SERIAL_LOCATION_FLASH, // serial_location - 0x000110, // serial_address + 0x200010, // serial_address 0x800000, // flash_base 0x810000, // firmware_base 0x820000, // config_base |
From: Phil D. <ja...@us...> - 2013-03-29 20:46:11
|
Update of /cvsroot/concordance/concordance/libconcord In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv12752/libconcord Modified Files: Tag: zwave_work_branch remote_info.h Log Message: From: Scott Talbert <sw...@te...> Correct serial number address for Harmony 525. Signed-off-by: Scott Talbert <sw...@te...> Signed-off-by: Phil Dibowitz <ph...@ip...> Index: remote_info.h =================================================================== RCS file: /cvsroot/concordance/concordance/libconcord/remote_info.h,v retrieving revision 1.12.2.5 retrieving revision 1.12.2.6 diff -u -d -r1.12.2.5 -r1.12.2.6 --- remote_info.h 29 Mar 2013 19:47:17 -0000 1.12.2.5 +++ remote_info.h 29 Mar 2013 20:46:09 -0000 1.12.2.6 @@ -327,7 +327,7 @@ /* arch 9: 360, 52x, 55x */ { SERIAL_LOCATION_FLASH, // serial_location - 0x000110, // serial_address + 0x200010, // serial_address 0x800000, // flash_base 0x810000, // firmware_base 0x820000, // config_base |
From: Phil D. <ja...@us...> - 2013-03-29 20:44:03
|
Update of /cvsroot/concordance/concordance/concordance In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv12621/concordance Modified Files: Tag: zwave_work_branch concordance.c Log Message: From: Scott Talbert <sw...@te...> Move set_time() functionality inside of update_configuration and call the internal version so that _report_stages() does not get called. Rewrite get_stages functionality to be more dynamically generated rather than lots of hard coded arrays. Comments in libconcord.cpp modified by Phil Dibowitz <ph...@ip...> Signed-off-by: Scott Talbert <sw...@te...> Signed-off-by: Phil Dibowitz <ph...@ip...> Index: concordance.c =================================================================== RCS file: /cvsroot/concordance/concordance/concordance/concordance.c,v retrieving revision 1.41.2.23 retrieving revision 1.41.2.24 diff -u -d -r1.41.2.23 -r1.41.2.24 --- concordance.c 12 Jan 2013 23:50:32 -0000 1.41.2.23 +++ concordance.c 29 Mar 2013 20:44:01 -0000 1.41.2.24 @@ -807,11 +807,6 @@ return err; } - /* Set the time, after a reboot */ - if ((err = set_time(cb, NULL))) { - return err; - } - /* Tell the website we're done */ if (!(*options).binary && !(*options).noweb) { if ((err = post_postconfig(cb, cb_arg))) { |
From: Phil D. <ja...@us...> - 2013-03-29 19:47:20
|
Update of /cvsroot/concordance/concordance/libconcord In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv9495/libconcord Modified Files: Tag: zwave_work_branch libconcord.cpp remote.h remote_info.h remote_z.cpp Log Message: From: Scott Talbert <sw...@te...> Implemented config dumping for zwave-hid remotes. Implemented the ReadRegion function for zwave-hid, based on the usbnet version and the zwave-hid UpdateConfig function. Signed-off-by: Scott Talbert <sw...@te...> Signed-off-by: Phil Dibowitz <ph...@ip...> Index: remote_z.cpp =================================================================== RCS file: /cvsroot/concordance/concordance/libconcord/remote_z.cpp,v retrieving revision 1.25.2.17 retrieving revision 1.25.2.18 diff -u -d -r1.25.2.17 -r1.25.2.18 --- remote_z.cpp 12 Jan 2013 23:50:33 -0000 1.25.2.17 +++ remote_z.cpp 29 Mar 2013 19:47:17 -0000 1.25.2.18 @@ -207,13 +207,20 @@ if (pkt[0] < 3) { return LC_ERROR; } - len = pkt[0] - 4; + /* + * pkt[0] is the index of the last byte, which means it is equal to the + * length of packet minus one byte. 'len' is expected to be set to the + * payload size. To get the payload size we subtract both the TCP and + * UDP headers from pkt[0] and then add one. + */ + len = pkt[0] - HID_TCP_HDR_SIZE - HID_UDP_HDR_SIZE + 1; last_seq = pkt[2]; last_ack = pkt[3]; - last_payload_bytes = len + 1; // tcp payload size + last_payload_bytes = len + HID_UDP_HDR_SIZE; // tcp payload size //if(!len) return 0; //memcpy(data, pkt + 6, len); - memcpy(data, pkt + 1, len+3); + // include headers, minus the size + memcpy(data, pkt + 1, len + HID_TCP_HDR_SIZE + HID_UDP_HDR_SIZE - 1); return 0; } @@ -577,14 +584,6 @@ return 0; } -int CRemoteZ_USBNET::ReadFlash(uint32_t addr, const uint32_t len, uint8_t *rd, - unsigned int protocol, bool verify, lc_callback cb, - void *cb_arg, uint32_t cb_stage) -{ - uint32_t tmp; - return ReadRegion(addr, tmp, rd, cb, cb_arg, cb_stage); -} - int CRemoteZ_USBNET::ReadRegion(uint8_t region, uint32_t &rgn_len, uint8_t *rd, lc_callback cb, void *cb_arg, uint32_t cb_stage) { @@ -910,6 +909,170 @@ unsigned int protocol, bool verify, lc_callback cb, void *cb_arg, uint32_t cb_stage) { + uint32_t tmp; + return ReadRegion(addr, tmp, rd, cb, cb_arg, cb_stage); +} + +/* + * When reading a config from the remote, we need to look for a sequence of + * four bytes to determine when to stop reading the config. The tricky part is + * that the sequence could be split across two packets. Thus, we need to + * search the last three bytes of the previous packet plus the current packet. + * This function searches for the "end of file" sequence in a set of two + * packets. If the sequence is found, returns the number of bytes in the + * second packet up to and including the sequence. Returns 0 if the sequence + * is not found. Parameters point to the data section of the packets. Note for + * the first packet, only the last 3 bytes are expected to be passed in. + */ +int FindEndSeq(uint8_t *pkt_1, uint8_t *pkt_2) +{ + uint8_t end_seq[4] = { 0x44, 0x4B, 0x44, 0x4B }; // end of file sequence + uint8_t tmp[57]; // 3 bytes from the 1st packet, 54 bytes from the 2nd + memcpy(&tmp, pkt_1, 3); + memcpy(&tmp[3], pkt_2, 54); + for (int i=0; i<54; i++) { + if (memcmp(&end_seq, &tmp[i], 4) == 0) { + return i + 1; + } + } + return 0; +} + +int CRemoteZ_HID::ReadRegion(uint8_t region, uint32_t &rgn_len, uint8_t *rd, + lc_callback cb, void *cb_arg, uint32_t cb_stage) +{ + int err = 0; + int cb_count = 0; + uint8_t rsp[60]; + unsigned int rlen; + uint8_t status; + CRemoteZ_Base::TParamList pl; + + /* Start a TCP transfer */ + if ((err = Write(TYPE_REQUEST, COMMAND_INITIATE_UPDATE_TCP_CHANNEL))) { + debug("Failed to write to remote"); + return LC_ERROR_WRITE; + } + + /* Make sure the remote is ready to start the TCP transfer */ + if ((err = Read(status, rlen, rsp))) { + debug("Failed to read from remote"); + return LC_ERROR_READ; + } + + if (rsp[1] != TYPE_RESPONSE || rsp[2] != + COMMAND_INITIATE_UPDATE_TCP_CHANNEL) { + return LC_ERROR; + } + + /* Look for a SYN packet */ + debug("Looking for syn"); + if ((err = TCP_Read(status, rlen, rsp))) { + debug("Failed to read syn from remote"); + return LC_ERROR_READ; + } + + if (rsp[0] != TYPE_TCP_SYN) { + debug("Not a SYN packet!"); + return LC_ERROR; + } + + /* ACK it with a command to read a region */ + debug("READ_REGION"); + // 1 parameters, 1 byte, region to read. + uint8_t cmd[60] = { region }; + if ((err = TCP_Write(TYPE_REQUEST, COMMAND_READ_REGION, 1, cmd))) { + debug("Failed to write to remote"); + return LC_ERROR_WRITE; + } + if ((err = TCP_Read(status, rlen, rsp))) { + debug("Failed to read to remote"); + return LC_ERROR_READ; + } + if (rsp[0] != TYPE_TCP_ACK || rsp[3] != TYPE_RESPONSE || + rsp[4] != COMMAND_READ_REGION) { + debug("Incorrect response type from remote"); + return LC_ERROR_INVALID_DATA_FROM_REMOTE; + } + + rgn_len = 0; + + debug("READ_REGION_DATA"); + int data_read = 0; + uint8_t *rd_ptr = rd; + cmd[0] = region; + int eof_found = 0; + uint8_t prev_pkt_tail[3] = { 0x00, 0x00, 0x00 }; + + while (1) { + if ((err = TCP_Write(TYPE_REQUEST, COMMAND_READ_REGION_DATA, 1, + cmd))) { + debug("Failed to write to remote"); + return LC_ERROR_WRITE; + } + if ((err = TCP_Read(status, rlen, rsp))) { + debug("Failed to read to remote"); + return LC_ERROR_READ; + } + if (rsp[0] != TYPE_TCP_ACK || rsp[3] != TYPE_RESPONSE || + ((rsp[4] != COMMAND_READ_REGION_DATA) && + (rsp[4] != COMMAND_READ_REGION_DONE))) { + debug("Incorrect response type from remote"); + return LC_ERROR_INVALID_DATA_FROM_REMOTE; + } + if (rsp[4] == COMMAND_READ_REGION_DONE) { + break; + } + data_read += rlen; + + if (!eof_found) { + eof_found = FindEndSeq(prev_pkt_tail, &rsp[5]); + if (eof_found) { + rlen = eof_found; + } + rgn_len += rlen; + memcpy(&prev_pkt_tail, &rsp[56], 3); + + if (rd) { + memcpy(rd_ptr, &rsp[5], rlen); + rd_ptr += rlen; + } + } + + debug("DATA %d, read %d bytes, %d bytes total", cb_count, + rlen, data_read); + + if (cb) { + cb(cb_stage, cb_count++, data_read, data_read+1, + LC_CB_COUNTER_TYPE_BYTES, cb_arg, NULL); + } + } + + debug("FIN-ACK"); + if ((err = TCP_Ack(false, true))) { + debug("Failed to send fin-ack"); + return LC_ERROR_WRITE; + } + + if ((err = TCP_Read(status, rlen, rsp))) { + debug("Failed to read from remote"); + return LC_ERROR_READ; + } + + /* Make sure we got an ack */ + if (rsp[0] != (TYPE_TCP_ACK | TYPE_TCP_FIN)) { + debug("Failed to read finish-update ack"); + return LC_ERROR; + } + + if ((err = TCP_Ack(true, false))) { + debug("Failed to ack the ack of our fin-ack"); + return LC_ERROR_WRITE; + } + + /* Return TCP state to initial conditions */ + SYN_ACKED = false; + return 0; } @@ -1320,6 +1483,9 @@ * it never comes... so we don't bother trying to read it. */ + /* Return TCP state to initial conditions */ + SYN_ACKED = false; + return 0; } Index: remote.h =================================================================== RCS file: /cvsroot/concordance/concordance/libconcord/remote.h,v retrieving revision 1.20.2.11 retrieving revision 1.20.2.12 diff -u -d -r1.20.2.11 -r1.20.2.12 --- remote.h 4 Jun 2012 07:09:49 -0000 1.20.2.11 +++ remote.h 29 Mar 2013 19:47:17 -0000 1.20.2.12 @@ -31,6 +31,8 @@ #define FIRMWARE_MAX_SIZE 64*1024 /* Largest packet size for HID-UDP is 4 bytes (header) + 64 bytes (data) */ #define HID_UDP_MAX_PACKET_SIZE 68 +#define HID_UDP_HDR_SIZE 2 +#define HID_TCP_HDR_SIZE 4 /* Largest packet size for usbnet is the COMMAND_WRITE_UPDATE_DATA which is 1 (num params) + 3 (3 parameter size bytes) + 1 (param 1) + 1024 (param 2) + 4 (param 3) = 1033. */ @@ -326,8 +328,6 @@ virtual int ParseParams(uint32_t len, uint8_t *data, TParamList &pl); virtual uint16_t GetWord(uint8_t *x) { return x[1]<<8 | x[0]; }; - virtual int ReadRegion(uint8_t region, uint32_t &len, uint8_t *rd, - lc_callback cb, void *cb_arg, uint32_t cb_stage) {return 0;}; public: CRemoteZ_HID() {}; @@ -335,6 +335,8 @@ int UpdateConfig(const uint32_t len, const uint8_t *wr, lc_callback cb, void *cb_arg, uint32_t cb_stage); int IsUSBNet() {return false;} + virtual int ReadRegion(uint8_t region, uint32_t &len, uint8_t *rd, + lc_callback cb, void *cb_arg, uint32_t cb_stage); }; // 1000, 1000i @@ -358,9 +360,6 @@ virtual ~CRemoteZ_USBNET() {}; int UpdateConfig(const uint32_t len, const uint8_t *wr, lc_callback cb, void *cb_arg, uint32_t cb_stage); - int ReadFlash(uint32_t addr, const uint32_t len, uint8_t *rd, - unsigned int protocol, bool verify=false, - lc_callback cb=NULL, void *cb_arg=NULL, uint32_t cb_stage=0); int GetTime(const TRemoteInfo &ri, THarmonyTime &ht); int SetTime(const TRemoteInfo &ri, const THarmonyTime &ht, lc_callback cb=NULL, void *cb_arg=NULL, uint32_t cb_stage=0); Index: libconcord.cpp =================================================================== RCS file: /cvsroot/concordance/concordance/libconcord/libconcord.cpp,v retrieving revision 1.42.2.24 retrieving revision 1.42.2.25 diff -u -d -r1.42.2.24 -r1.42.2.25 --- libconcord.cpp 12 Jan 2013 23:54:55 -0000 1.42.2.24 +++ libconcord.cpp 29 Mar 2013 19:47:17 -0000 1.42.2.25 @@ -564,7 +564,7 @@ */ int is_config_dump_supported() { - return (is_z_remote() && !is_usbnet_remote()) ? LC_ERROR_UNSUPP: 0; + return 0; } int is_config_update_supported() @@ -945,6 +945,16 @@ cb_arg = (void *)true; } + // For zwave-hid remotes, need to read the config once to get the size + // For usbnet we do this in GetIdentity, but for hid it takes too long + if (is_z_remote() && !is_usbnet_remote()) { + if (err = ((CRemoteZ_HID*)rmt)->ReadRegion(REGION_USER_CONFIG, + ri.config_bytes_used, NULL, cb, + cb_arg, LC_CB_STAGE_READ_CONFIG)) { + return err; + } + } + *size = ri.config_bytes_used; *out = new uint8_t[*size]; Index: remote_info.h =================================================================== RCS file: /cvsroot/concordance/concordance/libconcord/remote_info.h,v retrieving revision 1.12.2.4 retrieving revision 1.12.2.5 diff -u -d -r1.12.2.4 -r1.12.2.5 --- remote_info.h 4 Jun 2012 07:09:49 -0000 1.12.2.4 +++ remote_info.h 29 Mar 2013 19:47:17 -0000 1.12.2.5 @@ -348,7 +348,7 @@ 0x000110, // serial_address 0x000000, // flash_base 0x010000, // firmware_base - 0x020000, // config_base + REGION_USER_CONFIG, // config_base 0, // firmware_update_base 0, // firmware_4847_offset 0x1, /* hack */ // cookie |
From: Phil D. <ja...@us...> - 2013-01-29 07:22:41
|
Update of /cvsroot/concordance/concordance/libconcord In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv5575/libconcord Modified Files: Tag: zwave_work_branch remote.cpp Log Message: From: Scott Talbert <sw...@te...> Certain remotes (e.g., the 785) do not get a successful return from a reset command even though the reset succeeds. This patch causes this specific error to be ignored and the reset function returns successfully. This fixes Debian bug #584896. [Added by Phil, copied from email from Scott, on the usb_strerror/strerror part of the patch:] Well, it turns out that usb_strerror() appears to have a bug of some sort where it is not providing the correct error message. It is a providing a message "could not detach kernel driver from interface 0: No data available" which doesn't make any sense. Using strerror() seems to provide the correct error message which makes sense "no such device" as the device has already gone away. Signed-off-by: Scott Talbert <sw...@te...> Signed-off-by: Phil Dibowitz <ph...@ip...> Index: remote.cpp =================================================================== RCS file: /cvsroot/concordance/concordance/libconcord/remote.cpp,v retrieving revision 1.40.2.10 retrieving revision 1.40.2.11 diff -u -d -r1.40.2.10 -r1.40.2.11 --- remote.cpp 12 Jan 2013 23:50:33 -0000 1.40.2.10 +++ remote.cpp 29 Jan 2013 07:22:39 -0000 1.40.2.11 @@ -24,6 +24,8 @@ #include "remote.h" #include <string.h> +#include <errno.h> + #include <iostream> #include "libconcord.h" @@ -78,8 +80,18 @@ int CRemote::Reset(uint8_t kind) { uint8_t reset_cmd[64] = { COMMAND_RESET, kind }; + int err; - return HID_WriteReport(reset_cmd); + err = HID_WriteReport(reset_cmd); + /* + * Certain remotes (e.g., the 785) do not get a successful return from + * HID_WriteReport even though the reset succeeds. Ignore this. + */ + if (err == -ENODEV) { + debug("Ignoring error from reset command"); + err = 0; + } + return err; } /* |
From: Phil D. <ja...@us...> - 2013-01-29 07:19:45
|
Update of /cvsroot/concordance/concordance/libconcord/libusb In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv5110/libconcord/libusb Modified Files: libusbhid.cpp Log Message: From: Scott Talbert <sw...@te...> Certain remotes (e.g., the 785) do not get a successful return from a reset command even though the reset succeeds. This patch causes this specific error to be ignored and the reset function returns successfully. This fixes Debian bug #584896. [Added by Phil, copied from email from Scott, on the usb_strerror/strerror part of the patch:] Well, it turns out that usb_strerror() appears to have a bug of some sort where it is not providing the correct error message. It is a providing a message "could not detach kernel driver from interface 0: No data available" which doesn't make any sense. Using strerror() seems to provide the correct error message which makes sense "no such device" as the device has already gone away. Signed-off-by: Scott Talbert <sw...@te...> Signed-off-by: Phil Dibowitz <ph...@ip...> Index: libusbhid.cpp =================================================================== RCS file: /cvsroot/concordance/concordance/libconcord/libusb/libusbhid.cpp,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- libusbhid.cpp 17 Jul 2010 22:17:37 -0000 1.19 +++ libusbhid.cpp 29 Jan 2013 07:19:43 -0000 1.20 @@ -33,6 +33,7 @@ #include <usb.h> #endif #include <errno.h> +#include <string.h> /* * Harmonies either fall under logitech's VendorID (0x046d), and logitech's @@ -214,7 +215,7 @@ if (err < 0) { debug("Failed to write to device: %d (%s)", err, - usb_strerror()); + strerror(-err)); return err; } |