|
From: <ma...@us...> - 2011-10-16 01:35:32
|
Revision: 451
http://openautomation.svn.sourceforge.net/openautomation/?rev=451&view=rev
Author: makki1
Date: 2011-10-16 01:35:25 +0000 (Sun, 16 Oct 2011)
Log Message:
-----------
russconnectd: change udp-socket and fragmented msg-parsing to work with socat (WiP)
Modified Paths:
--------------
tools/russconnectd/trunk/ChangeLog
tools/russconnectd/trunk/README
tools/russconnectd/trunk/configure.ac
tools/russconnectd/trunk/debian/control
tools/russconnectd/trunk/src/main.c
Modified: tools/russconnectd/trunk/ChangeLog
===================================================================
--- tools/russconnectd/trunk/ChangeLog 2011-10-15 21:34:46 UTC (rev 450)
+++ tools/russconnectd/trunk/ChangeLog 2011-10-16 01:35:25 UTC (rev 451)
@@ -1,2 +1,6 @@
+*** 0.2 - 2011-10-15
+- global UDP-socket sending with listen port as source to make socat happy
+- parse partial/fragmented messages from Russound
-
+*** 0.1
+- initial release, see README
\ No newline at end of file
Modified: tools/russconnectd/trunk/README
===================================================================
--- tools/russconnectd/trunk/README 2011-10-15 21:34:46 UTC (rev 450)
+++ tools/russconnectd/trunk/README 2011-10-16 01:35:25 UTC (rev 451)
@@ -27,10 +27,14 @@
*** TODO:
- see various TODO/FIXME in source
- reconnection/error-handling if network-problems occur (mainly eibd?)
-- prettify code
-- fix dependency on uclibc++ on OpenWRT
+- prettify code / split main.c
+- fix dependency on uclibc++ (?) in OpenWRT Makefile
+- change russ UDP-socket to be shared for send/receive with listening (-l) sourceport for outgoing
+ (makes usage with socat udp-recvfrom easier)
+- supply examples for socat
+- directly connect serialport
*** Outlook
-- *maybe* make much more modular and other interfaces (simple UDP/TCP server)
+- *maybe* make much more modular and other interfaces (simple UDP/TCP server like C0 Z1 VolUp?)
- don't depend on libeibclient then
-- *maybe* add outgoing interfaces for mpd,vdr,.. to stick multiroom togehter
+- *maybe* add outgoing interfaces for KNX-> mpd,vdr,.. to stick multiroom togehter
Modified: tools/russconnectd/trunk/configure.ac
===================================================================
--- tools/russconnectd/trunk/configure.ac 2011-10-15 21:34:46 UTC (rev 450)
+++ tools/russconnectd/trunk/configure.ac 2011-10-16 01:35:25 UTC (rev 451)
@@ -1,7 +1,7 @@
dnl Process this file with autoconf to produce a configure script.
dnl Created by Anjuta application wizard.
-AC_INIT(russconnectd, 0.1)
+AC_INIT(russconnectd, 0.2, de...@wi..., , http://openautomation.sourceforge.net)
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION)
Modified: tools/russconnectd/trunk/debian/control
===================================================================
--- tools/russconnectd/trunk/debian/control 2011-10-15 21:34:46 UTC (rev 450)
+++ tools/russconnectd/trunk/debian/control 2011-10-16 01:35:25 UTC (rev 451)
@@ -2,7 +2,7 @@
Section: unknown
Priority: extra
Maintainer: Michael Markstaller <de...@wi...>
-Build-Depends: debhelper (>= 7.0), autotools-dev
+Build-Depends: debhelper (>= 5.0), autotools-dev
Standards-Version: 3.9.1
Homepage: <insert the upstream URL, if relevant>
#Vcs-Git: git://git.debian.org/collab-maint/russconnectd.git
Modified: tools/russconnectd/trunk/src/main.c
===================================================================
--- tools/russconnectd/trunk/src/main.c 2011-10-15 21:34:46 UTC (rev 450)
+++ tools/russconnectd/trunk/src/main.c 2011-10-16 01:35:25 UTC (rev 451)
@@ -16,7 +16,6 @@
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
@@ -39,7 +38,7 @@
#define DEBUG 1
#define DAEMON_NAME "russconnectd"
-#define USAGESTRING "\n\t-d\tRun as daemon/No debug output\n\t-p <pidfile>\tPID-filename\n\t-i <ip:port>\tIP-Address:Port to send UDP-packets to russound\n\t-l <UDP-port>\tUDP port to listen on\n\t-a <KNX address>\tKNX start-address (see README)\n\t-z <number>\tNumber of Zones to support\n\t-u <eib url>\tURL to conatct eibd like localo:/tmp/eib or ip:192.168.0.101\n"
+#define USAGESTRING "\n\t-d\tRun as daemon/No debug output\n\t-p <pidfile>\tPID-filename\n\t-i <ip:port>\tIP-Address:Port to send UDP-packets to russound\n\t-l <UDP-port>\tUDP port to listen on\n\t-a <KNX address>\tKNX start-address (see README)\n\t-z <number>\tNumber of Zones to support\n\t-u <eib url>\tURL to conatct eibd like localo:/tmp/eib or ip:192.168.0.101\n"
#define NUM_THREADS 2
#define MAX_ZONES 31
#define RETRY_TIME 5
@@ -81,8 +80,14 @@
int pidFilehandle;
char *pidfilename = "/var/run/russconnectd.pid";
+//FIXME: also handle serial-port directly?
+struct sockaddr_in si_me, si_other;
+int udpSocket;
+socklen_t slen=sizeof(si_other);
+
void daemonShutdown() {
//FIXME: clean exit pthread_exit(NULL); pthread_cancel(..);
+ close(udpSocket);
syslog(LOG_INFO, "%s daemon exiting", DAEMON_NAME);
fprintf(stderr, "%s daemon exiting", DAEMON_NAME);
close(pidFilehandle);
@@ -110,6 +115,18 @@
}
char *russChecksum(char* buf, int len) {
+ //FIXME: handle invert character
+ /* The Invert Character is used in special cases as part of the Message Body. If the data in an
+ RNETTM message body includes any byte values that have the MSB set to 1 (they have a Hex
+ value greater than 0x7F) the byte will be rejected as only the lower 7 bits are used to hold data.
+ In order to allow values greater than 0x7F to be accepted, the byte must first be bitwise inverted
+ (e.g., 10010101 = 01101010), and the special Invert Character (0xF1) is inserted just prior to
+ the inverted byte. When an RNETTM packet is received, the system must detect the 0xF1 invert
+ character. The 0xF1 character is then discarded and the following byte is inverted back to its
+ original value (e.g., 01101010 = 10010101).
+ F1 = Special Invert Character
+ 6A = Inverted Character (actual value 0x95)
+ */
int i,j=0;
for (i=0;i<len;i++)
j+=buf[i];
@@ -120,52 +137,28 @@
void *sendrussPolling(unsigned char zone) {
syslog(LOG_DEBUG, "polling zone %d",zone);
- struct sockaddr_in si_other;
- int s, slen=sizeof(si_other);
- if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1)
- syslog(LOG_WARNING,"socket failed!");
- memset((char *) &si_other, 0, sizeof(si_other));
- si_other.sin_family = AF_INET;
- si_other.sin_port = htons(russport);
- if (inet_aton(russipaddr, &si_other.sin_addr)==0) {
- syslog(LOG_WARNING, "inet_aton() for %s failed", russipaddr);
- daemonShutdown();
- }
-
char buf_onvol[25] = { 0xF0, 0, 0, 0x7F, 0, 0, RUSS_KEYPAD_ID, 0x01, 0x05, 0x02, 0, 0, 0, 0x04, 0, 0, 0, 0xF7 };
buf_onvol[1] = zone/ZONES_PER_CONTROLLER;
buf_onvol[11] = zone%ZONES_PER_CONTROLLER;
buf_onvol[16] = (int) russChecksum (buf_onvol,18-2);
- if (sendto(s, buf_onvol, 18, 0, (struct sockaddr *) &si_other, slen)==-1)
+ if (sendto(udpSocket, buf_onvol, 18, 0, (struct sockaddr *) &si_other, slen)==-1)
syslog(LOG_WARNING,"sendto failed!");
- usleep(20*1000); //throttle a little (20ms)
+ usleep(20*1000); //FIXME: throttle a little (20ms)
char buf_getzone[25] = { 0xF0, 0, 0, 0x7F, 0, 0, RUSS_KEYPAD_ID, 0x01, 0x04, 0x02, 0, 0, 0x07, 0, 0, 0, 0xF7 };
buf_getzone[1] = zone/ZONES_PER_CONTROLLER;
buf_getzone[11] = zone%ZONES_PER_CONTROLLER;
- buf_getzone[15] = (int) russChecksum (buf_onvol,17-2);
- if (sendto(s, buf_getzone, 17, 0, (struct sockaddr *) &si_other, slen)==-1)
+ buf_getzone[15] = (int) russChecksum (buf_getzone,17-2);
+ if (sendto(udpSocket, buf_getzone, 17, 0, (struct sockaddr *) &si_other, slen)==-1)
syslog(LOG_WARNING,"sendto failed!");
- usleep(50*1000); //throttle a little (20ms)
- close(s);
+ usleep(50*1000); //FIXME: throttle a little (50ms)
return 0;
}
void *sendrussFunc(int controller, int zone, int func, int val) {
- struct sockaddr_in si_other;
- int s, slen=sizeof(si_other);
syslog(LOG_DEBUG,"write ctrl %d zone %d func %d val 0x%02X",controller,zone,func,val);
- if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1)
- syslog(LOG_WARNING,"sendrussfunc: socket failed!");
- memset((char *) &si_other, 0, sizeof(si_other));
- si_other.sin_family = AF_INET;
- si_other.sin_port = htons(russport);
- if (inet_aton(russipaddr, &si_other.sin_addr)==0) {
- syslog(LOG_WARNING, "sendrussfunc: inet_aton() for %s failed", russipaddr);
- daemonShutdown();
- }
-
+
//TODO: send on-telegram to actuator
char buf_msg1[25] = { 0, 0, 0, 0x7F, 0, 0, RUSS_KEYPAD_ID, 0x05, 0x02, 0x02, 0, 0, 0xF1, 0x23, 0, 0, 0, 0, 0, 0x01, 0, 0xF7 };
buf_msg1[1] = controller;
@@ -258,15 +251,14 @@
buf_msg2[22] = (int) russChecksum (buf_msg2,24-2);
if (buf_msg1[0])
- if (sendto(s, buf_msg1, 22, 0, (struct sockaddr *) &si_other, slen)==-1)
+ if (sendto(udpSocket, buf_msg1, 22, 0, (struct sockaddr *) &si_other, slen)==-1)
syslog(LOG_WARNING,"sendrussfunc sendto failed!");
if (buf_msg2[0])
- if (sendto(s, buf_msg2, 24, 0, (struct sockaddr *) &si_other, slen)==-1)
+ if (sendto(udpSocket, buf_msg2, 24, 0, (struct sockaddr *) &si_other, slen)==-1)
syslog(LOG_WARNING,"sendrussfunc sendto failed!");
- usleep(20*1000); //throttle a little (20ms)
+ usleep(20*1000); //FIXME: throttle a little (20ms)
if (buf_msg1[0] || buf_msg2[0])
sendrussPolling (zone+(controller*ZONES_PER_CONTROLLER)); //fire update of states
- close(s);
return 0;
}
@@ -275,7 +267,7 @@
EIBConnection *con;
unsigned char buf[255] = { 0, 0x80 };
buf[1] = type; //0x40 response, 0x80 write
- syslog(LOG_DEBUG,"send knx dgram t %d d %d dest %d val %d",type,dpt,dest,val);
+ syslog(LOG_DEBUG,"Send KNX dgram Type %d DPT %d dest %d val %d",type,dpt,dest,val);
con = EIBSocketURL (eibd_url);
if (!con)
syslog(LOG_WARNING,"sendknxdgram: Open failed");
@@ -537,77 +529,109 @@
void *russhandler()
{
- //FIXME: also handle serial-port directly?
- struct sockaddr_in si_me, si_other;
- int s, i;
- socklen_t slen=sizeof(si_other);
+ int i;
unsigned char buf[BUFLEN];
+ unsigned char prevbuf[BUFLEN];
+ int prevlen = 0;
syslog(LOG_DEBUG, "Russound reader thread started");
while (1) {
- if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1) {
- syslog(LOG_WARNING, "russ: Socket failed");
+ int len = recvfrom(udpSocket, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen);
+ if (len==-1) {
+ syslog(LOG_WARNING, "russ: recvfrom failed");
sleep(RETRY_TIME);
+ break;
+ }
+ /* Stick together fragmented telegrams, start is F0, end is F7
+ */
+ //FIXME: we assume either complete telegrams or fragmented but no overlapping messages in sep. udp dgrams!
+
+ //DEBUG
+ //for (i=0; i<len; i++)
+ // printf("PRE-parse: %d:0x%02X ",i,buf[i]);
+ printf( "PRE-Parse: %d -> ",len);
+ for (i=0; i<len; i++)
+ printf( "0x%02X ",buf[i]);
+ printf( "\n");
+ //END DEBUG code
+ if ((len + prevlen) > BUFLEN) {
+ syslog(LOG_INFO, "Message too large: %d + %d !!",len,prevlen);
+ prevlen=0;
continue;
}
- memset(&si_me, 0, sizeof(si_me));
- si_me.sin_family = AF_INET;
- si_me.sin_port = htons(listenport);
- si_me.sin_addr.s_addr = htonl(INADDR_ANY);
- if (bind(s, (struct sockaddr *) &si_me, sizeof(si_me))==-1) {
- syslog(LOG_WARNING, "russ: Bind failed");
- sleep(RETRY_TIME);
+
+ if (buf[0] == 0xF0 && buf[len-1] == 0xF7) { // complete message
+ syslog(LOG_DEBUG, "----> COMPLETE <---- message received, size %d \n", len);
+ } else if (buf[0] == 0xF0) { // start of new message
+ printf("..START..\n");
+ prevlen = len;
+ memcpy(prevbuf,buf,len);
continue;
+ } else if (prevlen > 0 && prevbuf[0] == 0xF0 && buf[len-1] == 0xF7) { // message complete
+ printf("..complete..%d %d\n",prevlen,len);
+ memcpy(prevbuf+prevlen,buf,len);
+ len += prevlen;
+ prevlen = 0;
+ memcpy(buf,prevbuf,len);
+ } else if (prevlen > 0 && prevbuf[0] == 0xF0) { //continuation message
+ printf("..continue..%d %d\n",prevlen,len);
+ memcpy(prevbuf+prevlen,buf,len);
+ prevlen += len;
+ continue;
+ } else { //DUNNO!!
+ syslog(LOG_DEBUG,"---> DUNNO <--- !!! resetting message buffers!");
+ prevlen = 0;
+ prevbuf[0] = 0x0;
+ continue;
}
- while (1) {
- int len = recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen);
- //TODO: Checksum calculation / check of russound-message
- if (len==-1) {
- syslog(LOG_WARNING, "russ: recvfrom failed");
- sleep(RETRY_TIME);
- break;
- } else if ((len==34) && (buf[0]==0xF0) && (buf[9]==0x04)) { //zone-status
-// syslog(LOG_DEBUG,"russ Controller:%d Zone:%d Status:%d src:%d vol:%d bass:%d treb:%d loud:%d bal:%d sys:%d shrsrc:%d party:%d,DnD:%d\n",
-// buf[4],buf[12],buf[20],buf[21],buf[22],buf[23],buf[24],buf[25],buf[26],buf[27],buf[28],buf[29],buf[30]);
- buf[12] = (buf[4]*ZONES_PER_CONTROLLER)+buf[12]; //controller + zonenumber
- if (buf[20] != zones[buf[12]].zonepower)
- updateZone(buf[12],buf[20],1);
- if (buf[21] != zones[buf[12]].srcid)
- updateZone(buf[12],buf[21],2);
- if (buf[22] != zones[buf[12]].volume)
- updateZone(buf[12],buf[22],3);
- if (buf[23] != zones[buf[12]].bass)
- updateZone(buf[12],buf[23],4);
- if (buf[24] != zones[buf[12]].treble)
- updateZone(buf[12],buf[24],5);
- if (buf[25] != zones[buf[12]].loudness)
- updateZone(buf[12],buf[25],6);
- if (buf[26] != zones[buf[12]].balance)
- updateZone(buf[12],buf[26],7);
- if (buf[29] != zones[buf[12]].partymode)
- updateZone(buf[12],buf[29],8);
- if (buf[30] != zones[buf[12]].dnd)
- updateZone(buf[12],buf[30],9);
- zones[buf[12]].inited = 1;
- } else if ((len==24) && (buf[0]==0xF0) && (buf[9]==0x05) && (buf[13]==0x00)) { //zone turn-on volume
- //FIXME: this *might* be wrong andf trigger also on other msgs, as it's written otherwise in the docs, the checked bytes are just a guess!
-// syslog(LOG_DEBUG,"russ Controller:%d Zone:%d TurnOnVolume:%d",
-// buf[4],buf[12],buf[21]);
- buf[12] = (buf[4]*ZONES_PER_CONTROLLER)+buf[12]; //controller + zonenumber
- if (buf[21] != zones[buf[12]].onvolume)
- updateZone(buf[12],buf[21],10);
- } else {
- //FIXME: just for debugging
- for (i=0; i<len; i++)
- printf("%d:0x%02X ",i,buf[i]);
- printf(" unknown len: %d\n",len);
- for (i=0; i<len; i++)
- printf("0x%02X ",buf[i]);
- printf("\n");
- }
+ //DEBUG
+ printf( "POST-Parse: %d -> ",len);
+ for (i=0; i<len; i++)
+ printf( "0x%02X ",prevbuf[i]);
+ printf( "\n");
+ //END DEBUG code
+
+ //TODO: Checksum calculation / check of russound-message
+ if ((len==34) && (buf[0]==0xF0) && (buf[9]==0x04)) { //zone-status
+ syslog(LOG_DEBUG,"russ Controller:%d Zone:%d Status:%d src:%d vol:%d bass:%d treb:%d loud:%d bal:%d sys:%d shrsrc:%d party:%d,DnD:%d\n",
+ buf[4],buf[12],buf[20],buf[21],buf[22],buf[23],buf[24],buf[25],buf[26],buf[27],buf[28],buf[29],buf[30]);
+ buf[12] = (buf[4]*ZONES_PER_CONTROLLER)+buf[12]; //controller + zonenumber
+ if (buf[20] != zones[buf[12]].zonepower)
+ updateZone(buf[12],buf[20],1);
+ if (buf[21] != zones[buf[12]].srcid)
+ updateZone(buf[12],buf[21],2);
+ if (buf[22] != zones[buf[12]].volume)
+ updateZone(buf[12],buf[22],3);
+ if (buf[23] != zones[buf[12]].bass)
+ updateZone(buf[12],buf[23],4);
+ if (buf[24] != zones[buf[12]].treble)
+ updateZone(buf[12],buf[24],5);
+ if (buf[25] != zones[buf[12]].loudness)
+ updateZone(buf[12],buf[25],6);
+ if (buf[26] != zones[buf[12]].balance)
+ updateZone(buf[12],buf[26],7);
+ if (buf[29] != zones[buf[12]].partymode)
+ updateZone(buf[12],buf[29],8);
+ if (buf[30] != zones[buf[12]].dnd)
+ updateZone(buf[12],buf[30],9);
+ zones[buf[12]].inited = 1;
+ } else if ((len==24) && (buf[0]==0xF0) && (buf[9]==0x05) && (buf[13]==0x00)) { //zone turn-on volume
+ //FIXME: this *might* be wrong andf trigger also on other msgs, as it's written otherwise in the docs, the checked bytes are just a guess!
+ syslog(LOG_DEBUG,"russ Controller:%d Zone:%d TurnOnVolume:%d",
+ buf[4],buf[12],buf[21]);
+ buf[12] = (buf[4]*ZONES_PER_CONTROLLER)+buf[12]; //controller + zonenumber
+ if (buf[21] != zones[buf[12]].onvolume)
+ updateZone(buf[12],buf[21],10);
+ } else {
+ //FIXME: just for debugging
+ for (i=0; i<len; i++)
+ printf("%d:0x%02X ",i,buf[i]);
+ printf(" unknown len: %d\n",len);
+ for (i=0; i<len; i++)
+ printf("0x%02X ",buf[i]);
+ printf("\n");
}
- syslog(LOG_WARNING,"russ: closed socket"); //break in read-loop
- close(s);
}
+ syslog(LOG_WARNING,"russ: closed socket"); //break in read-loop
pthread_exit(NULL);
}
@@ -624,6 +648,34 @@
return 0;
}
+int openUDPsocket() {
+ if ((udpSocket=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1) {
+ syslog(LOG_WARNING, "openUDPsock: Socket failed");
+ //TODO: handle error;
+ return 1;
+ }
+ memset(&si_me, 0, sizeof(si_me));
+ si_me.sin_family = AF_INET;
+ si_me.sin_port = htons(listenport);
+ si_me.sin_addr.s_addr = htonl(INADDR_ANY);
+
+ memset((char *) &si_other, 0, sizeof(si_other));
+ si_other.sin_family = AF_INET;
+ si_other.sin_port = htons(russport);
+ if (inet_aton(russipaddr, &si_other.sin_addr)==0) {
+ syslog(LOG_WARNING, "inet_aton() for %s failed", russipaddr);
+ daemonShutdown();
+ }
+
+ if (bind(udpSocket, (struct sockaddr *) &si_me, sizeof(si_me))==-1) {
+ syslog(LOG_WARNING, "russ: Bind failed");
+ //sleep(RETRY_TIME);
+ //TODO: handle error;
+ return 2;
+ }
+ return 0;
+}
+
int main(int argc, char **argv) {
int daemonize = 0;
int c;
@@ -721,6 +773,10 @@
sprintf(pidstr,"%d\n",getpid());
c = write(pidFilehandle, pidstr, strlen(pidstr));
+ if (openUDPsocket() != 0) {
+ syslog(LOG_INFO, "Failed to create UDP socket, exiting");
+ exit(EXIT_FAILURE);
+ }
int knxthread,russthread;
pthread_t threads[NUM_THREADS];
// PTHREAD_CREATE_DETACHED?
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2011-10-17 23:52:21
|
Revision: 454
http://openautomation.svn.sourceforge.net/openautomation/?rev=454&view=rev
Author: makki1
Date: 2011-10-17 23:52:15 +0000 (Mon, 17 Oct 2011)
Log Message:
-----------
russconnectd: interims commit, WiP
Modified Paths:
--------------
tools/russconnectd/trunk/ChangeLog
tools/russconnectd/trunk/README
tools/russconnectd/trunk/debian/docs
tools/russconnectd/trunk/russ_galist.ods
tools/russconnectd/trunk/src/main.c
Added Paths:
-----------
tools/russconnectd/trunk/cfgmaker.pl
Modified: tools/russconnectd/trunk/ChangeLog
===================================================================
--- tools/russconnectd/trunk/ChangeLog 2011-10-17 21:07:20 UTC (rev 453)
+++ tools/russconnectd/trunk/ChangeLog 2011-10-17 23:52:15 UTC (rev 454)
@@ -1,6 +1,8 @@
*** 0.2 - 2011-10-15
- global UDP-socket sending with listen port as source to make socat happy
-- parse partial/fragmented messages from Russound
+- parse partial/fragmented messages from Russound (WiP still pending fragments with multiple msg)
+- change DPT for Bass,Treble,Balance from 5.010 (uchar) to DPT 6.001 (signed char -10 .. +10)
+- small additions and fixes
*** 0.1
-- initial release, see README
\ No newline at end of file
+- initial release, see README
Modified: tools/russconnectd/trunk/README
===================================================================
--- tools/russconnectd/trunk/README 2011-10-17 21:07:20 UTC (rev 453)
+++ tools/russconnectd/trunk/README 2011-10-17 23:52:15 UTC (rev 454)
@@ -36,5 +36,6 @@
*** Outlook
- *maybe* make much more modular and other interfaces (simple UDP/TCP server like C0 Z1 VolUp?)
+-> implement RIO protocal partially
- don't depend on libeibclient then
- *maybe* add outgoing interfaces for KNX-> mpd,vdr,.. to stick multiroom togehter
Added: tools/russconnectd/trunk/cfgmaker.pl
===================================================================
--- tools/russconnectd/trunk/cfgmaker.pl (rev 0)
+++ tools/russconnectd/trunk/cfgmaker.pl 2011-10-17 23:52:15 UTC (rev 454)
@@ -0,0 +1,228 @@
+#!/usr/bin/perl
+use strict;
+
+my $ZONES_PER_CONTROLLER = 6; #static
+my @gfuncnames = qw(SetAllZonesPower WRITEONLYACT NA3 NA4 NA5 AllZonesPowerState);
+my @funcnames = qw(SetPower SetSource SetVol SetBass SetTreble SetLoudness SetBalance SetParty SetDnD SetOnVol SourceSetCMD SourceKeypadCMD SetVolRelative);
+my @statenames = qw(PowerState SourceSelected VolumeState BassState TrebleState LoudnessState BalanceState PartyState DnDState OnVolState);
+my $NamePrefix = "Multiroom";
+my @SourceNames = qw(UKW-Tuner vdr/mpd Denon-WZ WG1 WG2 Hobby);
+### End config - Don't change below ###
+#######################################
+
+use File::Copy;
+use Config::Tiny;
+#print "install libconfig-tiny-perl!";
+use Getopt::Std;
+use Data::Dumper;
+use XML::Simple;
+getopts("a:z:n:f:", \my %opts);
+my $conf = Config::Tiny->new;
+
+my @funcdpts = qw (1.001 5.010 5.001 6.001 6.001 1.001 6.001 1.001 1.001 5.001 5.010 5.010 1.008);
+my @funcdpts_sub = qw (DPT_Switch DPT_Value_1_Ucount DPT_Scaling DPT_Percent_V8 DPT_Percent_V8 DPT_Switch DPT_Percent_V8 DPT_Switch DPT_Switch DPT_Scaling DPT_Value_1_Ucount DPT_Value_1_Ucount DPT_UpDown);
+my @statedpts = qw(1.001 5.010 5.001 6.001 6.001 1.001 6.001 1.001 1.001 5.001);
+my @statedpts_sub = qw (DPT_Switch DPT_Value_1_Ucount DPT_Scaling DPT_Percent_V8 DPT_Percent_V8 DPT_Switch DPT_Percent_V8 DPT_Switch DPT_Switch DPT_Scaling);
+
+my %EISmap = (
+ 1.001 => "EIS 1 'Switching' (1 Bit)",
+ 1.008 => "EIS 1 'Switching' (1 Bit)",
+ 5.001 => "Uncertain (1 Byte)",
+ 5.010 => "Uncertain (1 Byte)",
+ 6.001 => "Uncertain (1 Byte)" );
+
+if (!$opts{a} or !$opts{z} or !$opts{n} or $opts{h}) {
+ print("\n$0 Tool to create GA-config\nUsage: $0 -a <startaddress> -z <zones> -n <name1,name2,...>\n"
+ . "Example: $0 -a 10/1/0 -z 6 -n Küche,Bad,Zone3,Zone4,Zone5,Zone6 >> /etc/wiregate/eibga.conf\n"
+ . "Optional to write new config in-place: -f <path-to-eibga.conf> - Example: -f /etc/wiregate/eibga.conf\n");
+ exit();
+}
+
+if (-e $opts{f}) {
+ $conf = Config::Tiny->read($opts{f});
+ print STDERR "read config $opts{f}\n";
+}
+
+my @zonenames = split(",",$opts{n});
+my $startga = str2addr($opts{a},1);
+
+# ESF output for poor guys
+open ESF, ">", "export.esf" or die $!;
+open XML, ">:encoding(UTF-8)", "linknx.xml" or die $!;
+
+# some visu_config snipplet for CometVisu - :encoding(UTF-8)??
+open VISU1, ">", "visu_snipplet_rooms.xml" or die $!;
+open VISU2, ">", "visu_snipplet_room_pages.xml" or die $!;
+open VISU3, ">", "visu_snipplet_room_pages_all.xml" or die $!;
+
+print VISU1 " <page name=\"$NamePrefix\">\n";
+
+# Globals
+$conf->{addr2str($startga+1,1)}->{'name'} = $NamePrefix . " " . $gfuncnames[0];
+$conf->{addr2str($startga+1,1)}->{'DPTSubId'} = 1.001;
+$conf->{addr2str($startga+1,1)}->{'DPTId'} = 1;
+#$conf->{addr2str($startga+1,1)}->{'DPT_SubTypeName'} = 'DPT_Switch';
+print ESF "Multiroom-export\n";
+print ESF "$NamePrefix.Controller." . addr2str($startga+1,1) . "\t$NamePrefix $gfuncnames[0]\t" . $EISmap{'1.001'} . "\tLow\n";
+
+print XML "#<?xml version=\"1.0\" ?>\n<config>\n\t<objects>\n";
+print XML "\t\t<object id=\"$NamePrefix"."_$gfuncnames[0]\" gad=\"" . addr2str($startga+1,1) . "\" type=\"1.001\">$NamePrefix $gfuncnames[0]</object>\n";
+
+for (my $zone=0;$zone<$opts{z};$zone++) {
+ #sendKNXdgram (0x80,1,(knxstartaddress+30)+(zone*40)+(controller*256),val);
+ my $ctrl = int($zone/$ZONES_PER_CONTROLLER);
+ my $czone = int($zone%$ZONES_PER_CONTROLLER);
+ my $basega = $startga+10 + ($czone*40) + ($ctrl*256);
+ my $basegastr = addr2str($basega,1);
+ print STDERR "Zone " . ($zone+1) . " is $zonenames[$zone] base: $basegastr\n";
+ # funcs
+ for (my $i=0;$i<$#funcnames+1;$i++) {
+ $conf->{addr2str($basega+$i,1)}->{'name'} = "$NamePrefix C" . ($ctrl+1) . "-Z" . ($czone+1) . " $zonenames[$zone] $funcnames[$i]";
+ $conf->{addr2str($basega+$i,1)}->{'DPTSubId'} = $funcdpts[$i];
+ $conf->{addr2str($basega+$i,1)}->{'DPTId'} = split(".",$funcdpts[$i],1);
+ #$conf->{addr2str($basega+$i,1)}->{'DPT_SubTypeName'} = $funcdpts_sub[$i];
+ print ESF "$NamePrefix.Controller$ctrl." . addr2str($basega+$i,1) . "\t" . "$NamePrefix $zonenames[$zone] C" . ($ctrl+1) . "-Z" . ($czone+1) . " $funcnames[$i]" . "\t" . $EISmap{$funcdpts[$i]} . "\tLow\n";
+ print XML "\t\t<object id=\"$zonenames[$zone]_C" . ($ctrl+1) . "_Z" . ($czone+1) . "_" . "$funcnames[$i]\" gad=\"" . addr2str($basega+$i,1) . "\" type=\"$funcdpts[$i]\">" . "$NamePrefix $zonenames[$zone] (C" . ($ctrl+1) . "/Z" . ($czone+1) . ") $funcnames[$i]" . "</object>\n";
+ }
+ #states
+ for (my $i=0;$i<$#statenames+1;$i++) {
+ $conf->{addr2str($basega+$i+20,1)}->{'name'} = "$NamePrefix C" . ($ctrl+1) . "-Z" . ($czone+1) . " $zonenames[$zone] $statenames[$i]";
+ $conf->{addr2str($basega+$i+20,1)}->{'DPTSubId'} = $statedpts[$i];
+ $conf->{addr2str($basega+$i+20,1)}->{'DPTId'} = split(".",$statedpts[$i],1);
+ #$conf->{addr2str($basega+$i+20,1)}->{'DPT_SubTypeName'} = $statedpts_sub[$i];
+ print ESF "$NamePrefix.Controller$ctrl." . addr2str($basega+$i+20,1) . "\t" . "$NamePrefix $zonenames[$zone] C" . ($ctrl+1) . "-Z" . ($czone+1) . " $statenames[$i]" . "\t" . $EISmap{$statedpts[$i]} . "\tLow\n";
+ print XML "\t\t<object id=\"$zonenames[$zone]_C" . ($ctrl+1) . "_Z" . ($czone+1) . "_" . "$statenames[$i]\" gad=\"" . addr2str($basega+$i+20,1) . "\" type=\"$statedpts[$i]\">" . "$NamePrefix $zonenames[$zone] (C" . ($ctrl+1) . "/Z" . ($czone+1) . ") $statenames[$i]" . "</object>\n";
+ }
+ print VISU1 ' <switch mapping="OnOff" styling="RedGreen">'
+ ."\n <label>$zonenames[$zone]</label>\n"
+ .' <address transform="DPT:1.001" readonly="false" type="">' . addr2str($basega,1) . "</address>\n"
+ .' <address transform="DPT:1.001" readonly="true" type="">' . addr2str($basega+20,1) . "</address>\n"
+ ." </switch>\n";
+ print VISU1 ' <slide min="0" max="100">'
+ ."\n <label>$zonenames[$zone] Vol</label>\n"
+ .' <address transform="DPT:5.001" readonly="false" type="">' . addr2str($basega+2,1) . "</address>\n"
+ .' <address transform="DPT:5.001" readonly="true" type="">' . addr2str($basega+22,1) . "</address>\n"
+ ." </slide>\n";
+ print VISU2 " <page name=\"$NamePrefix $zonenames[$zone]\">\n";
+ print VISU2 ' <switch mapping="OnOff" styling="RedGreen">'
+ ."\n <label>Power</label>\n"
+ .' <address transform="DPT:1.001" readonly="false" type="">' . addr2str($basega,1) . "</address>\n"
+ .' <address transform="DPT:1.001" readonly="true" type="">' . addr2str($basega+20,1) . "</address>\n"
+ ." </switch>\n";
+ print VISU2 ' <slide min="0" max="100">'
+ ."\n <label>Vol</label>\n"
+ .' <address transform="DPT:5.001" readonly="false" type="">' . addr2str($basega+2,1) . "</address>\n"
+ .' <address transform="DPT:5.001" readonly="true" type="">' . addr2str($basega+22,1) . "</address>\n"
+ ." </slide>\n";
+ print VISU2 ' <info format="">'
+ ."\n <label>Source</label>\n"
+ .' <address transform="DPT:5.010" readonly="false" type="">' . addr2str($basega+1,1) . "</address>\n"
+ .' <address transform="DPT:5.010" readonly="true" type="">' . addr2str($basega+21,1) . "</address>\n"
+ ." </info>\n";
+ print VISU2 " <multitrigger button1label=\"$SourceNames[0]\" button1value=\"0\" button2label=\"$SourceNames[1]\" button2value=\"1\" button3label=\"$SourceNames[2]\" button3value=\"2\" button4label=\"$SourceNames[3]\" button4value=\"3\">"
+ ."\n <label>Source</label>\n"
+ .' <address transform="DPT:5.010" readonly="false" type="">' . addr2str($basega+1,1) . "</address>\n"
+ .' <address transform="DPT:5.010" readonly="true" type="">' . addr2str($basega+21,1) . "</address>\n"
+ ." </multitrigger>\n";
+ print VISU2 " <multitrigger button1label=\"$SourceNames[4]\" button1value=\"4\" button2label=\"$SourceNames[5]\" button2value=\"5\">"
+ ."\n <label>Source</label>\n"
+ .' <address transform="DPT:5.010" readonly="false" type="">' . addr2str($basega+1,1) . "</address>\n"
+ .' <address transform="DPT:5.010" readonly="true" type="">' . addr2str($basega+21,1) . "</address>\n"
+ ." </multitrigger>\n";
+ print VISU2 ' <switch mapping="OnOff" styling="RedGreen">'
+ ."\n <label>Loudness</label>\n"
+ .' <address transform="DPT:1.001" readonly="false" type="">' . addr2str($basega+5,1) . "</address>\n"
+ .' <address transform="DPT:1.001" readonly="true" type="">' . addr2str($basega+25,1) . "</address>\n"
+ ." </switch>\n";
+ print VISU2 ' <infotrigger button1label="+" button1value="1" button2label="-" button2value="0" align="center" infoposition="1" format="%.0f %%">'
+ ."\n <label>Volume</label>\n"
+ .' <address transform="DPT:1.008" readonly="false" type="">' . addr2str($basega+12,1) . "</address>\n"
+ .' <address transform="DPT:5.001" readonly="true" type="">' . addr2str($basega+2,1) . "</address>\n"
+ .' <address transform="DPT:5.001" readonly="true" type="">' . addr2str($basega+22,1) . "</address>\n"
+ ." </infotrigger>\n";
+ print VISU2 ' <info format="%.0f %%">'
+ ."\n <label>TurnOn Vol</label>\n"
+ .' <address transform="DPT:5.001" readonly="false" type="">' . addr2str($basega+9,1) . "</address>\n"
+ .' <address transform="DPT:5.001" readonly="true" type="">' . addr2str($basega+29,1) . "</address>\n"
+ ." </info>\n";
+ print VISU2 ' <slide min="0" max="100">'
+ ."\n <label>TurnOn Vol</label>\n"
+ .' <address transform="DPT:5.001" readonly="false" type="">' . addr2str($basega+9,1) . "</address>\n"
+ .' <address transform="DPT:5.001" readonly="true" type="">' . addr2str($basega+29,1) . "</address>\n"
+ ." </slide>\n";
+ print VISU2 ' <slide min="-10" max="10">'
+ ."\n <label>Bass</label>\n"
+ .' <address transform="DPT:6.001" readonly="false" type="">' . addr2str($basega+3,1) . "</address>\n"
+ .' <address transform="DPT:6.001" readonly="true" type="">' . addr2str($basega+23,1) . "</address>\n"
+ ." </slide>\n";
+ print VISU2 ' <slide min="-10" max="10">'
+ ."\n <label>Treble</label>\n"
+ .' <address transform="DPT:6.001" readonly="false" type="">' . addr2str($basega+4,1) . "</address>\n"
+ .' <address transform="DPT:6.001" readonly="true" type="">' . addr2str($basega+24,1) . "</address>\n"
+ ." </slide>\n";
+ print VISU2 ' <slide min="-10" max="10">'
+ ."\n <label>Balance</label>\n"
+ .' <address transform="DPT:6.001" readonly="false" type="">' . addr2str($basega+6,1) . "</address>\n"
+ .' <address transform="DPT:6.001" readonly="true" type="">' . addr2str($basega+26,1) . "</address>\n"
+ ." </slide>\n";
+ print VISU2 ' <switch mapping="OnOff" styling="RedGreen">'
+ ."\n <label>Party</label>\n"
+ .' <address transform="DPT:1.001" readonly="false" type="">' . addr2str($basega+7,1) . "</address>\n"
+ .' <address transform="DPT:1.001" readonly="true" type="">' . addr2str($basega+27,1) . "</address>\n"
+ ." </switch>\n";
+ print VISU2 ' <switch mapping="OnOff" styling="RedGreen">'
+ ."\n <label>DnD</label>\n"
+ .' <address transform="DPT:1.001" readonly="false" type="">' . addr2str($basega+8,1) . "</address>\n"
+ .' <address transform="DPT:1.001" readonly="true" type="">' . addr2str($basega+28,1) . "</address>\n"
+ ." </switch>\n";
+ print VISU2 " </page>\n";
+}
+
+close ESF;
+print XML "\t</objects>\n</config>\n";
+close XML;
+
+print VISU1 " </page>\n";
+close VISU1;
+close VISU2;
+close VISU3;
+
+#print "CONF:" . Dumper($conf);
+if (-e $opts{f}) { # wite config in place
+ copy($opts{f},$opts{f} . '.bak' );
+ $conf->write( $opts{f} . '.new' );
+ move( $opts{f} . '.new',$opts{f} );
+} else { # dump to STDOUT
+ $conf->write( '-' );
+}
+
+######
+# END
+######
+### copied global funcs
+# addr2str: Convert an integer to an EIB address string, in the form "1/2/3" or "1.2.3"
+sub addr2str {
+ my $a = $_[0];
+ my $b = $_[1] || 0; # 1 if local (group) address, else physical address
+ my $str ;
+ if ($b == 1) { # logical address used
+ $str = sprintf "%d/%d/%d", ($a >> 11) & 0xf, ($a >> 8) & 0x7, $a & 0xff;
+ }
+ else { # physical address used
+ $str = sprintf "%d.%d.%d", $a >> 12, ($a >> 8) & 0xf, $a & 0xff;
+ }
+ return $str;
+}
+
+# str2addr: Convert an EIB address string in the form "1/2/3" or "1.2.3" to an integer
+sub str2addr {
+ my $str = $_[0];
+ if ($str =~ /(\d+)\/(\d+)\/(\d+)/) { # logical address
+ return ($1 << 11) | ($2 << 8) | $3;
+ } elsif ($str =~ /(\d+)\.(\d+)\.(\d+)/) { # physical address
+ return ($1 << 12) | ($2 << 8) | $3;
+ } else {
+ #bad
+ return;
+ }
+}
Property changes on: tools/russconnectd/trunk/cfgmaker.pl
___________________________________________________________________
Added: svn:executable
+ *
Modified: tools/russconnectd/trunk/debian/docs
===================================================================
--- tools/russconnectd/trunk/debian/docs 2011-10-17 21:07:20 UTC (rev 453)
+++ tools/russconnectd/trunk/debian/docs 2011-10-17 23:52:15 UTC (rev 454)
@@ -1,4 +1,5 @@
NEWS
README
russ_galist.ods
+cfgmaker.pl
Modified: tools/russconnectd/trunk/russ_galist.ods
===================================================================
(Binary files differ)
Modified: tools/russconnectd/trunk/src/main.c
===================================================================
--- tools/russconnectd/trunk/src/main.c 2011-10-17 21:07:20 UTC (rev 453)
+++ tools/russconnectd/trunk/src/main.c 2011-10-17 23:52:15 UTC (rev 454)
@@ -38,17 +38,18 @@
#define DEBUG 1
#define DAEMON_NAME "russconnectd"
-#define USAGESTRING "\n\t-d\tRun as daemon/No debug output\n\t-p <pidfile>\tPID-filename\n\t-i <ip:port>\tIP-Address:Port to send UDP-packets to russound\n\t-l <UDP-port>\tUDP port to listen on\n\t-a <KNX address>\tKNX start-address (see README)\n\t-z <number>\tNumber of Zones to support\n\t-u <eib url>\tURL to conatct eibd like localo:/tmp/eib or ip:192.168.0.101\n"
+#define USAGESTRING "\n\t-d\tRun as daemon/No debug output\n\t-p <pidfile>\tPID-filename\n\t-i <ip:port>\tIP-Address:Port to send UDP-packets to russound\n\t-l <UDP-port>\tUDP port to listen on\n\t-a <KNX address>\tKNX start-address (see README)\n\t-z <number>\tNumber of Zones to support\n\t-u <eib url>\tURL to conatct eibd like localo:/tmp/eib or ip:192.168.0.101\n\t-s\t(Optional) send all values to KNX on startup of daemon\n"
#define NUM_THREADS 2
#define MAX_ZONES 31
#define RETRY_TIME 5
#define BUFLEN 1024
-#define POLLING_INTERVAL 60
+#define POLLING_INTERVAL 10
#define ZONES_PER_CONTROLLER 6
#define RUSS_KEYPAD_ID 0x70
pthread_mutex_t zonelock = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t initlock = PTHREAD_MUTEX_INITIALIZER;
+pthread_mutex_t standbylock = PTHREAD_MUTEX_INITIALIZER;
//FIXME:make struct zone dynamic
typedef struct Zone_t {
@@ -79,6 +80,7 @@
int numzones = ZONES_PER_CONTROLLER;
int pidFilehandle;
char *pidfilename = "/var/run/russconnectd.pid";
+int sendOnStart = 0;
//FIXME: also handle serial-port directly?
struct sockaddr_in si_me, si_other;
@@ -137,6 +139,7 @@
void *sendrussPolling(unsigned char zone) {
syslog(LOG_DEBUG, "polling zone %d",zone);
+ pthread_mutex_trylock(&standbylock);
char buf_onvol[25] = { 0xF0, 0, 0, 0x7F, 0, 0, RUSS_KEYPAD_ID, 0x01, 0x05, 0x02, 0, 0, 0, 0x04, 0, 0, 0, 0xF7 };
buf_onvol[1] = zone/ZONES_PER_CONTROLLER;
buf_onvol[11] = zone%ZONES_PER_CONTROLLER;
@@ -158,8 +161,12 @@
void *sendrussFunc(int controller, int zone, int func, int val) {
syslog(LOG_DEBUG,"write ctrl %d zone %d func %d val 0x%02X",controller,zone,func,val);
-
+
//TODO: send on-telegram to actuator
+
+ //block here until something is received from russound (it's turned off)
+ pthread_mutex_lock(&standbylock);
+ pthread_mutex_unlock(&standbylock);
char buf_msg1[25] = { 0, 0, 0, 0x7F, 0, 0, RUSS_KEYPAD_ID, 0x05, 0x02, 0x02, 0, 0, 0xF1, 0x23, 0, 0, 0, 0, 0, 0x01, 0, 0xF7 };
buf_msg1[1] = controller;
buf_msg1[17] = zone;
@@ -207,7 +214,10 @@
case 6: //bal
buf_msg2[0] = 0xF0;
buf_msg2[13] = 0x03;
- buf_msg2[21] = val;
+ if (val>127)
+ buf_msg2[21] = val-256+10;
+ else
+ buf_msg2[21] = val+10;
break;
case 7: //party
buf_msg2[0] = 0xF0;
@@ -298,6 +308,12 @@
buf[2] = val;
len=3;
break;
+ case 6:
+ case 6001:
+ //FIXME: This is basically wrong but as we get a uchar we expect the sender to know..
+ buf[2] = val;
+ len=3;
+ break;
/*
case 9:
fval=atof(data);
@@ -351,11 +367,17 @@
break;
case 3:
case 23:
- sendKNXdgram (0x40,51,dest,zones[zone].bass);
+ if (zones[zone].bass<10)
+ sendKNXdgram (0x40,51,dest,zones[zone].bass-10+256);
+ else
+ sendKNXdgram (0x40,51,dest,zones[zone].bass-10);
break;
case 4:
case 24:
- sendKNXdgram (0x40,51,dest,zones[zone].treble);
+ if (zones[zone].treble<10)
+ sendKNXdgram (0x40,51,dest,zones[zone].treble-10+256);
+ else
+ sendKNXdgram (0x40,51,dest,zones[zone].treble-10);
break;
case 5:
case 25:
@@ -363,7 +385,10 @@
break;
case 6:
case 26:
- sendKNXdgram (0x40,51,dest,zones[zone].balance);
+ if (zones[zone].balance<10)
+ sendKNXdgram (0x40,51,dest,zones[zone].balance-10+256);
+ else
+ sendKNXdgram (0x40,51,dest,zones[zone].balance-10);
break;
case 27:
sendKNXdgram (0x40,1,dest,zones[zone].partymode);
@@ -467,7 +492,7 @@
syslog(LOG_DEBUG, "update Zone %d val %d func %d",num,val,func);
int controller = num/ZONES_PER_CONTROLLER;
int zone = num%ZONES_PER_CONTROLLER;
- //TODO IMPORTANT!: lock mutex befor updating
+ //lock mutex befor updating
pthread_mutex_lock (&zonelock);
switch (func) {
case 1:
@@ -487,13 +512,21 @@
break;
case 4:
zones[num].bass =val;
- if (zones[num].inited)
- sendKNXdgram (0x80,51,(knxstartaddress+33)+(zone*40)+(controller*256),val);
+ if (zones[num].inited) {
+ if (val<10)
+ sendKNXdgram (0x80,51,(knxstartaddress+33)+(zone*40)+(controller*256),val-10+256);
+ else
+ sendKNXdgram (0x80,51,(knxstartaddress+33)+(zone*40)+(controller*256),val-10);
+ }
break;
case 5:
zones[num].treble =val;
- if (zones[num].inited)
- sendKNXdgram (0x80,51,(knxstartaddress+34)+(zone*40)+(controller*256),val);
+ if (zones[num].inited) {
+ if (val<10)
+ sendKNXdgram (0x80,51,(knxstartaddress+34)+(zone*40)+(controller*256),val-10+256);
+ else
+ sendKNXdgram (0x80,51,(knxstartaddress+34)+(zone*40)+(controller*256),val-10);
+ }
break;
case 6:
zones[num].loudness =val;
@@ -502,8 +535,12 @@
break;
case 7:
zones[num].balance =val;
- if (zones[num].inited)
- sendKNXdgram (0x80,51,(knxstartaddress+36)+(zone*40)+(controller*256),val);
+ if (zones[num].inited) {
+ if (val<10)
+ sendKNXdgram (0x80,51,(knxstartaddress+36)+(zone*40)+(controller*256),val-10+256);
+ else
+ sendKNXdgram (0x80,51,(knxstartaddress+36)+(zone*40)+(controller*256),val-10);
+ }
break;
case 8:
zones[num].partymode =val;
@@ -527,113 +564,134 @@
return 0;
}
+void *parseRussMsg(unsigned char* buf, int len) {
+ int i;
+ if ((len==34) && (buf[0]==0xF0) && (buf[9]==0x04)) { //zone-status
+ syslog(LOG_DEBUG,"russ Controller:%d Zone:%d Status:%d src:%d vol:%d bass:%d treb:%d loud:%d bal:%d sys:%d shrsrc:%d party:%d,DnD:%d\n",
+ buf[4],buf[12],buf[20],buf[21],buf[22],buf[23],buf[24],buf[25],buf[26],buf[27],buf[28],buf[29],buf[30]);
+ buf[12] = (buf[4]*ZONES_PER_CONTROLLER)+buf[12]; //controller + zonenumber
+ if (sendOnStart)
+ zones[buf[12]].inited = 1;
+
+ if (buf[20] != zones[buf[12]].zonepower)
+ updateZone(buf[12],buf[20],1);
+ if (buf[21] != zones[buf[12]].srcid)
+ updateZone(buf[12],buf[21],2);
+ if (buf[22] != zones[buf[12]].volume)
+ updateZone(buf[12],buf[22],3);
+ if (buf[23] != zones[buf[12]].bass)
+ updateZone(buf[12],buf[23],4);
+ if (buf[24] != zones[buf[12]].treble)
+ updateZone(buf[12],buf[24],5);
+ if (buf[25] != zones[buf[12]].loudness)
+ updateZone(buf[12],buf[25],6);
+ if (buf[26] != zones[buf[12]].balance)
+ updateZone(buf[12],buf[26],7);
+ if (buf[29] != zones[buf[12]].partymode)
+ updateZone(buf[12],buf[29],8);
+ if (buf[30] != zones[buf[12]].dnd)
+ updateZone(buf[12],buf[30],9);
+ zones[buf[12]].inited = 1;
+ } else if ((len==24) && (buf[0]==0xF0) && (buf[9]==0x05) && (buf[13]==0x00)) { //zone turn-on volume
+ //FIXME: this *might* be wrong andf trigger also on other msgs, as it's written otherwise in the docs, the checked bytes are just a guess!
+ syslog(LOG_DEBUG,"russ Controller:%d Zone:%d TurnOnVolume:%d",
+ buf[4],buf[12],buf[21]);
+ buf[12] = (buf[4]*ZONES_PER_CONTROLLER)+buf[12]; //controller + zonenumber
+ if (buf[21] != zones[buf[12]].onvolume)
+ updateZone(buf[12],buf[21],10);
+ } else {
+ //FIXME: just for debugging
+ //for (i=0; i<len; i++)
+ // printf("%d:0x%02X ",i,buf[i]);
+ printf(" unknown len: %d ",len);
+ for (i=0; i<len; i++)
+ printf("0x%02X ",buf[i]);
+ printf("\n");
+ }
+ return 0;
+}
+
void *russhandler()
{
- int i;
+ int cflag,worked;
unsigned char buf[BUFLEN];
unsigned char prevbuf[BUFLEN];
int prevlen = 0;
syslog(LOG_DEBUG, "Russound reader thread started");
while (1) {
+ //unlock standby-mutex as we received something
+ pthread_mutex_unlock(&standbylock);
int len = recvfrom(udpSocket, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen);
if (len==-1) {
syslog(LOG_WARNING, "russ: recvfrom failed");
sleep(RETRY_TIME);
break;
}
+
/* Stick together fragmented telegrams, start is F0, end is F7
- */
//FIXME: we assume either complete telegrams or fragmented but no overlapping messages in sep. udp dgrams!
-
- //DEBUG
+ int i,pos;
+
//for (i=0; i<len; i++)
// printf("PRE-parse: %d:0x%02X ",i,buf[i]);
printf( "PRE-Parse: %d -> ",len);
for (i=0; i<len; i++)
printf( "0x%02X ",buf[i]);
printf( "\n");
- //END DEBUG code
+ */
if ((len + prevlen) > BUFLEN) {
syslog(LOG_INFO, "Message too large: %d + %d !!",len,prevlen);
prevlen=0;
continue;
}
- if (buf[0] == 0xF0 && buf[len-1] == 0xF7) { // complete message
- syslog(LOG_DEBUG, "----> COMPLETE <---- message received, size %d \n", len);
- } else if (buf[0] == 0xF0) { // start of new message
- printf("..START..\n");
- prevlen = len;
- memcpy(prevbuf,buf,len);
+ worked = 0;
+ //while (worked < len) {
+ if (buf[0] == 0xF0 && buf[len-1] == 0xF7) { // complete message
+ syslog(LOG_DEBUG, "----> COMPLETE <---- message received, size %d \n", len);
+ } else if (buf[0] == 0xF0) { // start of new message
+ //printf("..START..\n");
+ prevlen = len;
+ worked += len;
+ memcpy(prevbuf,buf,len);
+ cflag = 1;
+ continue;
+ } else if (prevlen > 0 && prevbuf[0] == 0xF0 && buf[len-1] == 0xF7) { // message complete
+ //printf("..complete..%d %d\n",prevlen,len);
+ memcpy(prevbuf+prevlen,buf,len);
+ len += prevlen;
+ prevlen = 0;
+ memcpy(buf,prevbuf,len);
+ } else if (prevlen > 0 && prevbuf[0] == 0xF0) { //continuation message
+ //printf("..continue..%d %d\n",prevlen,len);
+ memcpy(prevbuf+prevlen,buf,len);
+ prevlen += len;
+ worked += len;
+ cflag = 1;
+ continue;
+ } else { //DUNNO!!
+ syslog(LOG_DEBUG,"---> DUNNO <--- !!! resetting message buffers!");
+ prevlen = 0;
+ prevbuf[0] = 0x0;
+ cflag = 1;
+ continue;
+ }
+ /*
+ printf( "POST-Parse: %d -> ",len);
+ for (i=0; i<len; i++)
+ printf( "0x%02X ",prevbuf[i]);
+ printf( "\n");
+ */
+
+ //TODO: Checksum calculation / check of russound-message
+ parseRussMsg(buf,len);
+ //} //end while worked
+ if (cflag)
continue;
- } else if (prevlen > 0 && prevbuf[0] == 0xF0 && buf[len-1] == 0xF7) { // message complete
- printf("..complete..%d %d\n",prevlen,len);
- memcpy(prevbuf+prevlen,buf,len);
- len += prevlen;
- prevlen = 0;
- memcpy(buf,prevbuf,len);
- } else if (prevlen > 0 && prevbuf[0] == 0xF0) { //continuation message
- printf("..continue..%d %d\n",prevlen,len);
- memcpy(prevbuf+prevlen,buf,len);
- prevlen += len;
- continue;
- } else { //DUNNO!!
- syslog(LOG_DEBUG,"---> DUNNO <--- !!! resetting message buffers!");
- prevlen = 0;
- prevbuf[0] = 0x0;
- continue;
- }
- //DEBUG
- printf( "POST-Parse: %d -> ",len);
- for (i=0; i<len; i++)
- printf( "0x%02X ",prevbuf[i]);
- printf( "\n");
- //END DEBUG code
-
- //TODO: Checksum calculation / check of russound-message
- if ((len==34) && (buf[0]==0xF0) && (buf[9]==0x04)) { //zone-status
- syslog(LOG_DEBUG,"russ Controller:%d Zone:%d Status:%d src:%d vol:%d bass:%d treb:%d loud:%d bal:%d sys:%d shrsrc:%d party:%d,DnD:%d\n",
- buf[4],buf[12],buf[20],buf[21],buf[22],buf[23],buf[24],buf[25],buf[26],buf[27],buf[28],buf[29],buf[30]);
- buf[12] = (buf[4]*ZONES_PER_CONTROLLER)+buf[12]; //controller + zonenumber
- if (buf[20] != zones[buf[12]].zonepower)
- updateZone(buf[12],buf[20],1);
- if (buf[21] != zones[buf[12]].srcid)
- updateZone(buf[12],buf[21],2);
- if (buf[22] != zones[buf[12]].volume)
- updateZone(buf[12],buf[22],3);
- if (buf[23] != zones[buf[12]].bass)
- updateZone(buf[12],buf[23],4);
- if (buf[24] != zones[buf[12]].treble)
- updateZone(buf[12],buf[24],5);
- if (buf[25] != zones[buf[12]].loudness)
- updateZone(buf[12],buf[25],6);
- if (buf[26] != zones[buf[12]].balance)
- updateZone(buf[12],buf[26],7);
- if (buf[29] != zones[buf[12]].partymode)
- updateZone(buf[12],buf[29],8);
- if (buf[30] != zones[buf[12]].dnd)
- updateZone(buf[12],buf[30],9);
- zones[buf[12]].inited = 1;
- } else if ((len==24) && (buf[0]==0xF0) && (buf[9]==0x05) && (buf[13]==0x00)) { //zone turn-on volume
- //FIXME: this *might* be wrong andf trigger also on other msgs, as it's written otherwise in the docs, the checked bytes are just a guess!
- syslog(LOG_DEBUG,"russ Controller:%d Zone:%d TurnOnVolume:%d",
- buf[4],buf[12],buf[21]);
- buf[12] = (buf[4]*ZONES_PER_CONTROLLER)+buf[12]; //controller + zonenumber
- if (buf[21] != zones[buf[12]].onvolume)
- updateZone(buf[12],buf[21],10);
- } else {
- //FIXME: just for debugging
- for (i=0; i<len; i++)
- printf("%d:0x%02X ",i,buf[i]);
- printf(" unknown len: %d\n",len);
- for (i=0; i<len; i++)
- printf("0x%02X ",buf[i]);
- printf("\n");
- }
- }
+ } //end with recvfrom
syslog(LOG_WARNING,"russ: closed socket"); //break in read-loop
pthread_exit(NULL);
-}
+} //end func russhandler
eibaddr_t readgaddr (const char *addr) {
int a, b, c;
@@ -682,11 +740,14 @@
char *p;
char pidstr[255];
- while ((c = getopt (argc, argv, "dp:i:l:a:z:u:")) != -1)
+ while ((c = getopt (argc, argv, "dp:i:l:a:z:u:s")) != -1)
switch (c) {
case 'd':
daemonize = 1;
break;
+ case 's':
+ sendOnStart = 1;
+ break;
case 'p':
pidfilename = optarg;
break;
@@ -782,6 +843,7 @@
// PTHREAD_CREATE_DETACHED?
knxthread = pthread_...
[truncated message content] |
|
From: <ma...@us...> - 2011-12-28 00:15:37
|
Revision: 613
http://openautomation.svn.sourceforge.net/openautomation/?rev=613&view=rev
Author: makki1
Date: 2011-12-28 00:15:30 +0000 (Wed, 28 Dec 2011)
Log Message:
-----------
Change cfgmaker to new infotrigger, various small adjustments, there is still a HEAVY bug in setting Bass/Treble if no absolute values are used though, be aware..
Modified Paths:
--------------
tools/russconnectd/trunk/ChangeLog
tools/russconnectd/trunk/Makefile.am
tools/russconnectd/trunk/cfgmaker.pl
tools/russconnectd/trunk/debian/changelog
tools/russconnectd/trunk/debian/files
tools/russconnectd/trunk/debian/russconnectd.default
Modified: tools/russconnectd/trunk/ChangeLog
===================================================================
--- tools/russconnectd/trunk/ChangeLog 2011-12-26 22:05:37 UTC (rev 612)
+++ tools/russconnectd/trunk/ChangeLog 2011-12-28 00:15:30 UTC (rev 613)
@@ -1,3 +1,7 @@
+*** trunk - 2011-12-28
+- WiP - not yet done: C3-support - (maybe also needed for C5/E5) send Device restart event to start RNet-communication
+- Fix cfgmaker for CometVisu, adjust to new infotrigger
+
*** 0.2 - 2011-10-15
- global UDP-socket sending with listen port as source to make socat happy
- parse partial/fragmented messages from Russound (WiP still pending fragments with multiple msg)
Modified: tools/russconnectd/trunk/Makefile.am
===================================================================
--- tools/russconnectd/trunk/Makefile.am 2011-12-26 22:05:37 UTC (rev 612)
+++ tools/russconnectd/trunk/Makefile.am 2011-12-28 00:15:30 UTC (rev 613)
@@ -11,7 +11,8 @@
ChangeLog\
INSTALL\
NEWS\
- russ_galist.ods
+ russ_galist.ods\
+ cfgmaker.pl
INTLTOOL_FILES = intltool-extract.in \
Modified: tools/russconnectd/trunk/cfgmaker.pl
===================================================================
--- tools/russconnectd/trunk/cfgmaker.pl 2011-12-26 22:05:37 UTC (rev 612)
+++ tools/russconnectd/trunk/cfgmaker.pl 2011-12-28 00:15:30 UTC (rev 613)
@@ -57,6 +57,16 @@
print VISU1 " <page name=\"$NamePrefix\">\n";
+print VISU2 "<!-- Change SourceNames in script and insert this on top between <mappings> and </mappings> -->\n";
+print VISU2 " <mapping name=\"RussoundSRC\">\n"
+." <entry value=\"0\">$SourceNames[0]</entry>\n"
+." <entry value=\"1\">$SourceNames[1]</entry>\n"
+." <entry value=\"2\">$SourceNames[2]</entry>\n"
+." <entry value=\"3\">$SourceNames[3]</entry>\n"
+." <entry value=\"4\">$SourceNames[4]</entry>\n"
+." <entry value=\"5\">$SourceNames[5]</entry>\n"
+." </mapping>\n\n\n";
+
# Globals
$conf->{addr2str($startga+1,1)}->{'name'} = $NamePrefix . " " . $gfuncnames[0];
$conf->{addr2str($startga+1,1)}->{'DPTSubId'} = 1.001;
@@ -93,7 +103,7 @@
print ESF "$NamePrefix.Controller$ctrl." . addr2str($basega+$i+20,1) . "\t" . "$NamePrefix $zonenames[$zone] C" . ($ctrl+1) . "-Z" . ($czone+1) . " $statenames[$i]" . "\t" . $EISmap{$statedpts[$i]} . "\tLow\n";
print XML "\t\t<object id=\"$zonenames[$zone]_C" . ($ctrl+1) . "_Z" . ($czone+1) . "_" . "$statenames[$i]\" gad=\"" . addr2str($basega+$i+20,1) . "\" type=\"$statedpts[$i]\">" . "$NamePrefix $zonenames[$zone] (C" . ($ctrl+1) . "/Z" . ($czone+1) . ") $statenames[$i]" . "</object>\n";
}
- print VISU1 ' <switch mapping="OnOff" styling="RedGreen">'
+ print VISU1 ' <switch mapping="OnOff" styling="GreenRed">'
."\n <label>$zonenames[$zone]</label>\n"
.' <address transform="DPT:1.001" readonly="false" type="">' . addr2str($basega,1) . "</address>\n"
.' <address transform="DPT:1.001" readonly="true" type="">' . addr2str($basega+20,1) . "</address>\n"
@@ -103,74 +113,71 @@
.' <address transform="DPT:5.001" readonly="false" type="">' . addr2str($basega+2,1) . "</address>\n"
.' <address transform="DPT:5.001" readonly="true" type="">' . addr2str($basega+22,1) . "</address>\n"
." </slide>\n";
+
print VISU2 " <page name=\"$NamePrefix $zonenames[$zone]\">\n";
- print VISU2 ' <switch mapping="OnOff" styling="RedGreen">'
+ print VISU2 ' <switch mapping="OnOff" styling="GreenRed">'
."\n <label>Power</label>\n"
.' <address transform="DPT:1.001" readonly="false" type="">' . addr2str($basega,1) . "</address>\n"
.' <address transform="DPT:1.001" readonly="true" type="">' . addr2str($basega+20,1) . "</address>\n"
." </switch>\n";
print VISU2 ' <slide min="0" max="100">'
- ."\n <label>Vol</label>\n"
+ ."\n <label>Volume</label>\n"
.' <address transform="DPT:5.001" readonly="false" type="">' . addr2str($basega+2,1) . "</address>\n"
.' <address transform="DPT:5.001" readonly="true" type="">' . addr2str($basega+22,1) . "</address>\n"
." </slide>\n";
- print VISU2 ' <info format="">'
- ."\n <label>Source</label>\n"
- .' <address transform="DPT:5.010" readonly="false" type="">' . addr2str($basega+1,1) . "</address>\n"
- .' <address transform="DPT:5.010" readonly="true" type="">' . addr2str($basega+21,1) . "</address>\n"
- ." </info>\n";
- print VISU2 " <multitrigger button1label=\"$SourceNames[0]\" button1value=\"0\" button2label=\"$SourceNames[1]\" button2value=\"1\" button3label=\"$SourceNames[2]\" button3value=\"2\" button4label=\"$SourceNames[3]\" button4value=\"3\">"
- ."\n <label>Source</label>\n"
- .' <address transform="DPT:5.010" readonly="false" type="">' . addr2str($basega+1,1) . "</address>\n"
- .' <address transform="DPT:5.010" readonly="true" type="">' . addr2str($basega+21,1) . "</address>\n"
- ." </multitrigger>\n";
- print VISU2 " <multitrigger button1label=\"$SourceNames[4]\" button1value=\"4\" button2label=\"$SourceNames[5]\" button2value=\"5\">"
- ."\n <label>Source</label>\n"
- .' <address transform="DPT:5.010" readonly="false" type="">' . addr2str($basega+1,1) . "</address>\n"
- .' <address transform="DPT:5.010" readonly="true" type="">' . addr2str($basega+21,1) . "</address>\n"
- ." </multitrigger>\n";
- print VISU2 ' <switch mapping="OnOff" styling="RedGreen">'
+ #$SourceNames[0]
+ print VISU2 ' <infotrigger uplabel=">" upvalue="1" downlabel="<" downvalue="-1" align="center" infoposition="1" change="absolute" min="0" max="5" mapping="RussoundSRC">'
+# <infotrigger uplabel=">" upvalue="1" downlabel="<" downvalue="-1" align="center" infoposition="1" change="absolute" min="0" max="5" mapping="RussoundSRC">
+# <label>Source</label>
+# <address transform="DPT:5.010" readonly="false" variant="">10/1/11</address>
+# <address transform="DPT:5.010" readonly="true" variant="">10/1/31</address>
+# </infotrigger>
+ ."\n <label>Quelle</label>\n"
+ .' <address transform="DPT:5.010" readonly="false">' . addr2str($basega+1,1) . "</address>\n"
+ .' <address transform="DPT:5.010" readonly="true">' . addr2str($basega+21,1) . "</address>\n"
+ ." </infotrigger>\n";
+ print VISU2 ' <switch mapping="OnOff" styling="GreenRed">'
."\n <label>Loudness</label>\n"
.' <address transform="DPT:1.001" readonly="false" type="">' . addr2str($basega+5,1) . "</address>\n"
.' <address transform="DPT:1.001" readonly="true" type="">' . addr2str($basega+25,1) . "</address>\n"
." </switch>\n";
- print VISU2 ' <infotrigger button1label="+" button1value="1" button2label="-" button2value="0" align="center" infoposition="1" format="%.0f %%">'
+ print VISU2 ' <infotrigger button1label="+" button1value="1" button2label="-" button2value="0" align="center" infoposition="1" format="%.0f %% ">'
."\n <label>Volume</label>\n"
- .' <address transform="DPT:1.008" readonly="false" type="">' . addr2str($basega+12,1) . "</address>\n"
- .' <address transform="DPT:5.001" readonly="true" type="">' . addr2str($basega+2,1) . "</address>\n"
- .' <address transform="DPT:5.001" readonly="true" type="">' . addr2str($basega+22,1) . "</address>\n"
+ .' <address transform="DPT:1.008" readonly="false" variant="button">' . addr2str($basega+12,1) . "</address>\n"
+ .' <address transform="DPT:5.001" readonly="true" variant="">' . addr2str($basega+2,1) . "</address>\n"
+ .' <address transform="DPT:5.001" readonly="true" variant="">' . addr2str($basega+22,1) . "</address>\n"
." </infotrigger>\n";
- print VISU2 ' <info format="%.0f %%">'
- ."\n <label>TurnOn Vol</label>\n"
+ print VISU2 ' <infotrigger align="center" infoposition="1" upvalue="2" downvalue="-2" change="absolute" format="%.0f %%">'
+ ."\n <label>TurnOn Volume</label>\n"
.' <address transform="DPT:5.001" readonly="false" type="">' . addr2str($basega+9,1) . "</address>\n"
.' <address transform="DPT:5.001" readonly="true" type="">' . addr2str($basega+29,1) . "</address>\n"
- ." </info>\n";
- print VISU2 ' <slide min="0" max="100">'
- ."\n <label>TurnOn Vol</label>\n"
- .' <address transform="DPT:5.001" readonly="false" type="">' . addr2str($basega+9,1) . "</address>\n"
- .' <address transform="DPT:5.001" readonly="true" type="">' . addr2str($basega+29,1) . "</address>\n"
- ." </slide>\n";
- print VISU2 ' <slide min="-10" max="10">'
+ ." </infotrigger>\n";
+# print VISU2 ' <slide min="0" max="100">'
+# ."\n <label>TurnOn Vol</label>\n"
+# .' <address transform="DPT:5.001" readonly="false" type="">' . addr2str($basega+9,1) . "</address>\n"
+# .' <address transform="DPT:5.001" readonly="true" type="">' . addr2str($basega+29,1) . "</address>\n"
+# ." </slide>\n";
+ print VISU2 ' <infotrigger align="center" infoposition="1" upvalue="1" downvalue="-1" change="absolute" min="-10" max="10">'
."\n <label>Bass</label>\n"
.' <address transform="DPT:6.001" readonly="false" type="">' . addr2str($basega+3,1) . "</address>\n"
.' <address transform="DPT:6.001" readonly="true" type="">' . addr2str($basega+23,1) . "</address>\n"
- ." </slide>\n";
- print VISU2 ' <slide min="-10" max="10">'
+ ." </infotrigger>\n";
+ print VISU2 ' <infotrigger align="center" infoposition="1" upvalue="1" downvalue="-1" change="absolute" min="-10" max="10">'
."\n <label>Treble</label>\n"
.' <address transform="DPT:6.001" readonly="false" type="">' . addr2str($basega+4,1) . "</address>\n"
.' <address transform="DPT:6.001" readonly="true" type="">' . addr2str($basega+24,1) . "</address>\n"
- ." </slide>\n";
- print VISU2 ' <slide min="-10" max="10">'
+ ." </infotrigger>\n";
+ print VISU2 ' <infotrigger align="center" infoposition="1" upvalue="1" downvalue="-1" change="absolute" min="-10" max="10">'
."\n <label>Balance</label>\n"
.' <address transform="DPT:6.001" readonly="false" type="">' . addr2str($basega+6,1) . "</address>\n"
.' <address transform="DPT:6.001" readonly="true" type="">' . addr2str($basega+26,1) . "</address>\n"
- ." </slide>\n";
- print VISU2 ' <switch mapping="OnOff" styling="RedGreen">'
+ ." </infotrigger>\n";
+ print VISU2 ' <switch mapping="OnOff" styling="GreenRed">'
."\n <label>Party</label>\n"
.' <address transform="DPT:1.001" readonly="false" type="">' . addr2str($basega+7,1) . "</address>\n"
.' <address transform="DPT:1.001" readonly="true" type="">' . addr2str($basega+27,1) . "</address>\n"
." </switch>\n";
- print VISU2 ' <switch mapping="OnOff" styling="RedGreen">'
+ print VISU2 ' <switch mapping="OnOff" styling="GreenRed">'
."\n <label>DnD</label>\n"
.' <address transform="DPT:1.001" readonly="false" type="">' . addr2str($basega+8,1) . "</address>\n"
.' <address transform="DPT:1.001" readonly="true" type="">' . addr2str($basega+28,1) . "</address>\n"
Modified: tools/russconnectd/trunk/debian/changelog
===================================================================
--- tools/russconnectd/trunk/debian/changelog 2011-12-26 22:05:37 UTC (rev 612)
+++ tools/russconnectd/trunk/debian/changelog 2011-12-28 00:15:30 UTC (rev 613)
@@ -1,3 +1,9 @@
+russconnectd (0.2-3) lenny; urgency=low
+
+ * rebuild for lenny
+
+ -- Michael Markstaller <de...@wi...> Sat, 22 Oct 2011 11:05:32 +0200
+
russconnectd (0.2-ubuntu1) oneiric; urgency=low
* new upstream
Modified: tools/russconnectd/trunk/debian/files
===================================================================
--- tools/russconnectd/trunk/debian/files 2011-12-26 22:05:37 UTC (rev 612)
+++ tools/russconnectd/trunk/debian/files 2011-12-28 00:15:30 UTC (rev 613)
@@ -1 +1 @@
-russconnectd_0.2-ubuntu1_i386.deb unknown extra
+russconnectd_0.2-3_i386.deb unknown extra
Modified: tools/russconnectd/trunk/debian/russconnectd.default
===================================================================
--- tools/russconnectd/trunk/debian/russconnectd.default 2011-12-26 22:05:37 UTC (rev 612)
+++ tools/russconnectd/trunk/debian/russconnectd.default 2011-12-28 00:15:30 UTC (rev 613)
@@ -13,7 +13,9 @@
# -a <KNX address> KNX start-address (see README)
# -z <number> Number of Zones to support
# -u <eib url> URL to conatct eibd like localo:/tmp/eib or ip:192.168.0.101
+# -s (Optional) send all values to KNX on startup of daemon
+# -k 0x71 (Optional) Keypad ID - defaults to 0x70 for CAx - use 0x71 for C5
# Additional options that are passed to the Daemon.
-DAEMON_ARGS="-d -i 127.0.0.1:16012 -l 16011 -a 10/1/0 -z 6 -u local:/tmp/eib"
+DAEMON_ARGS="-d -i 127.0.0.1:16012 -l 16011 -a 10/1/0 -z 6 -u local:/tmp/eib -s"
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2011-12-28 18:37:18
|
Revision: 614
http://openautomation.svn.sourceforge.net/openautomation/?rev=614&view=rev
Author: makki1
Date: 2011-12-28 18:37:09 +0000 (Wed, 28 Dec 2011)
Log Message:
-----------
russconnectd: Fix for setting Bass/Treble and add device restart-event on zone-polling to wakeup C3(?), prepare release 0.21
Modified Paths:
--------------
tools/russconnectd/trunk/configure.ac
tools/russconnectd/trunk/debian/changelog
tools/russconnectd/trunk/debian/files
tools/russconnectd/trunk/src/main.c
Modified: tools/russconnectd/trunk/configure.ac
===================================================================
--- tools/russconnectd/trunk/configure.ac 2011-12-28 00:15:30 UTC (rev 613)
+++ tools/russconnectd/trunk/configure.ac 2011-12-28 18:37:09 UTC (rev 614)
@@ -1,7 +1,7 @@
dnl Process this file with autoconf to produce a configure script.
dnl Created by Anjuta application wizard.
-AC_INIT(russconnectd, 0.2, de...@wi..., , http://openautomation.sourceforge.net)
+AC_INIT(russconnectd, 0.21, de...@wi..., , http://openautomation.sourceforge.net)
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION)
Modified: tools/russconnectd/trunk/debian/changelog
===================================================================
--- tools/russconnectd/trunk/debian/changelog 2011-12-28 00:15:30 UTC (rev 613)
+++ tools/russconnectd/trunk/debian/changelog 2011-12-28 18:37:09 UTC (rev 614)
@@ -1,3 +1,9 @@
+russconnectd (0.21-1) lenny; urgency=low
+
+ * fixes/new upstream
+
+ -- Michael Markstaller <de...@wi...> Wed, 28 Dec 2011 19:29:58 +0100
+
russconnectd (0.2-3) lenny; urgency=low
* rebuild for lenny
Modified: tools/russconnectd/trunk/debian/files
===================================================================
--- tools/russconnectd/trunk/debian/files 2011-12-28 00:15:30 UTC (rev 613)
+++ tools/russconnectd/trunk/debian/files 2011-12-28 18:37:09 UTC (rev 614)
@@ -1 +1 @@
-russconnectd_0.2-3_i386.deb unknown extra
+russconnectd_0.21-1_i386.deb unknown extra
Modified: tools/russconnectd/trunk/src/main.c
===================================================================
--- tools/russconnectd/trunk/src/main.c 2011-12-28 00:15:30 UTC (rev 613)
+++ tools/russconnectd/trunk/src/main.c 2011-12-28 18:37:09 UTC (rev 614)
@@ -140,6 +140,19 @@
void *sendrussPolling(unsigned char zone) {
syslog(LOG_DEBUG, "polling zone %d",zone);
pthread_mutex_trylock(&standbylock);
+
+ //Send device reset-event to wakeup (at least) C3 - yet untested
+ if (keypadid == 0x71) {
+ char buf_devreset[25] = { 0xF0, 0, 0, 0x7F, 0, 0, keypadid, 0x05, 0x02, 0x02, 0, 0, 0x55, 0x01, 0x03, 0, 0x35, 0, 0x01, 0, 0xF7 };
+ buf_devreset[4] = zone/ZONES_PER_CONTROLLER;
+ buf_devreset[5] = zone%ZONES_PER_CONTROLLER;
+ buf_devreset[19] = (int) russChecksum (buf_devreset,21-2);
+ if (sendto(udpSocket, buf_devreset, 21, 0, (struct sockaddr *) &si_other, slen)==-1)
+ syslog(LOG_WARNING,"sendto failed!");
+ usleep(20*1000); //FIXME: throttle a little
+ }
+
+ //Get Poweron-Volume
char buf_onvol[25] = { 0xF0, 0, 0, 0x7F, 0, 0, keypadid, 0x01, 0x05, 0x02, 0, 0, 0, 0x04, 0, 0, 0, 0xF7 };
buf_onvol[1] = zone/ZONES_PER_CONTROLLER;
buf_onvol[11] = zone%ZONES_PER_CONTROLLER;
@@ -148,6 +161,7 @@
syslog(LOG_WARNING,"sendto failed!");
usleep(20*1000); //FIXME: throttle a little (20ms)
+ //Get zonestate
char buf_getzone[25] = { 0xF0, 0, 0, 0x7F, 0, 0, keypadid, 0x01, 0x04, 0x02, 0, 0, 0x07, 0, 0, 0, 0xF7 };
buf_getzone[1] = zone/ZONES_PER_CONTROLLER;
buf_getzone[11] = zone%ZONES_PER_CONTROLLER;
@@ -199,12 +213,18 @@
break;
case 3: //bass
buf_msg2[0] = 0xF0;
- buf_msg2[21] = val;
+ if (val>127)
+ buf_msg2[21] = val-256+10;
+ else
+ buf_msg2[21] = val+10;
break;
case 4: //treb
buf_msg2[0] = 0xF0;
buf_msg2[13] = 0x01;
- buf_msg2[21] = val;
+ if (val>127)
+ buf_msg2[21] = val-256+10;
+ else
+ buf_msg2[21] = val+10;
break;
case 5: //loud
buf_msg2[0] = 0xF0;
@@ -787,7 +807,7 @@
if (!daemonize) {
setlogmask(LOG_UPTO(LOG_DEBUG));
openlog(DAEMON_NAME, LOG_CONS | LOG_NDELAY | LOG_PERROR | LOG_PID, LOG_USER);
- syslog(LOG_DEBUG, "startup with debug; Russ-IP: %s:%d, listenport %d, pidfile: %s, start address: %d, number of zones: %d, eibd: %s SendonStartup: %d KeypadID: %d",
+ syslog(LOG_DEBUG, "startup with debug; Russ-IP: %s:%d, listenport %d, pidfile: %s, start address: %d, number of zones: %d, eibd: %s SendonStartup: %d KeypadID: %li",
russipaddr, russport, listenport, pidfilename, knxstartaddress, numzones, eibd_url, sendOnStart, keypadid);
} else {
setlogmask(LOG_UPTO(LOG_INFO));
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2012-01-05 13:32:21
|
Revision: 633
http://openautomation.svn.sourceforge.net/openautomation/?rev=633&view=rev
Author: makki1
Date: 2012-01-05 13:32:10 +0000 (Thu, 05 Jan 2012)
Log Message:
-----------
russconnectd: Release 0.21, fixed bass/treble, better cfgmaker
Modified Paths:
--------------
tools/russconnectd/trunk/cfgmaker.pl
tools/russconnectd/trunk/openwrt/russconnectd/Makefile
tools/russconnectd/trunk/russ_galist.ods
Modified: tools/russconnectd/trunk/cfgmaker.pl
===================================================================
--- tools/russconnectd/trunk/cfgmaker.pl 2012-01-03 21:07:03 UTC (rev 632)
+++ tools/russconnectd/trunk/cfgmaker.pl 2012-01-05 13:32:10 UTC (rev 633)
@@ -1,14 +1,18 @@
#!/usr/bin/perl
use strict;
-my $ZONES_PER_CONTROLLER = 6; #static
-my @gfuncnames = qw(SetAllZonesPower WRITEONLYACT NA3 NA4 NA5 AllZonesPowerState);
my @funcnames = qw(SetPower SetSource SetVol SetBass SetTreble SetLoudness SetBalance SetParty SetDnD SetOnVol SourceSetCMD SourceKeypadCMD SetVolRelative);
my @statenames = qw(PowerState SourceSelected VolumeState BassState TrebleState LoudnessState BalanceState PartyState DnDState OnVolState);
my $NamePrefix = "Multiroom";
my @SourceNames = qw(UKW-Tuner vdr/mpd Denon-WZ WG1 WG2 Hobby);
+my $CV_switch_mapping = "On_Off";
+my $CV_switch_styling = "Green_Red";
+my $CV_source_mapping_name = "RussoundSRC";
+
### End config - Don't change below ###
#######################################
+my $ZONES_PER_CONTROLLER = 6; #static
+my @gfuncnames = qw(SetAllZonesPower WRITEONLYACT NA3 NA4 NA5 AllZonesPowerState);
use File::Copy;
use Config::Tiny;
@@ -58,7 +62,7 @@
print VISU1 " <page name=\"$NamePrefix\">\n";
print VISU2 "<!-- Change SourceNames in script and insert this on top between <mappings> and </mappings> -->\n";
-print VISU2 " <mapping name=\"RussoundSRC\">\n"
+print VISU2 " <mapping name=\"$CV_source_mapping_name\">\n"
." <entry value=\"0\">$SourceNames[0]</entry>\n"
." <entry value=\"1\">$SourceNames[1]</entry>\n"
." <entry value=\"2\">$SourceNames[2]</entry>\n"
@@ -103,7 +107,7 @@
print ESF "$NamePrefix.Controller$ctrl." . addr2str($basega+$i+20,1) . "\t" . "$NamePrefix $zonenames[$zone] C" . ($ctrl+1) . "-Z" . ($czone+1) . " $statenames[$i]" . "\t" . $EISmap{$statedpts[$i]} . "\tLow\n";
print XML "\t\t<object id=\"$zonenames[$zone]_C" . ($ctrl+1) . "_Z" . ($czone+1) . "_" . "$statenames[$i]\" gad=\"" . addr2str($basega+$i+20,1) . "\" type=\"$statedpts[$i]\">" . "$NamePrefix $zonenames[$zone] (C" . ($ctrl+1) . "/Z" . ($czone+1) . ") $statenames[$i]" . "</object>\n";
}
- print VISU1 ' <switch mapping="OnOff" styling="GreenRed">'
+ print VISU1 ' <switch mapping="'. $CV_switch_mapping .'" styling="'. $CV_switch_styling .'">'
."\n <label>$zonenames[$zone]</label>\n"
.' <address transform="DPT:1.001" readonly="false" type="">' . addr2str($basega,1) . "</address>\n"
.' <address transform="DPT:1.001" readonly="true" type="">' . addr2str($basega+20,1) . "</address>\n"
@@ -115,7 +119,7 @@
." </slide>\n";
print VISU2 " <page name=\"$NamePrefix $zonenames[$zone]\">\n";
- print VISU2 ' <switch mapping="OnOff" styling="GreenRed">'
+ print VISU2 ' <switch mapping="'. $CV_switch_mapping .'" styling="'. $CV_switch_styling .'">'
."\n <label>Power</label>\n"
.' <address transform="DPT:1.001" readonly="false" type="">' . addr2str($basega,1) . "</address>\n"
.' <address transform="DPT:1.001" readonly="true" type="">' . addr2str($basega+20,1) . "</address>\n"
@@ -136,7 +140,7 @@
.' <address transform="DPT:5.010" readonly="false">' . addr2str($basega+1,1) . "</address>\n"
.' <address transform="DPT:5.010" readonly="true">' . addr2str($basega+21,1) . "</address>\n"
." </infotrigger>\n";
- print VISU2 ' <switch mapping="OnOff" styling="GreenRed">'
+ print VISU2 ' <switch mapping="'. $CV_switch_mapping .'" styling="'. $CV_switch_styling .'">'
."\n <label>Loudness</label>\n"
.' <address transform="DPT:1.001" readonly="false" type="">' . addr2str($basega+5,1) . "</address>\n"
.' <address transform="DPT:1.001" readonly="true" type="">' . addr2str($basega+25,1) . "</address>\n"
@@ -172,12 +176,12 @@
.' <address transform="DPT:6.001" readonly="false" type="">' . addr2str($basega+6,1) . "</address>\n"
.' <address transform="DPT:6.001" readonly="true" type="">' . addr2str($basega+26,1) . "</address>\n"
." </infotrigger>\n";
- print VISU2 ' <switch mapping="OnOff" styling="GreenRed">'
+ print VISU2 ' <switch mapping="'. $CV_switch_mapping .'" styling="'. $CV_switch_styling .'">'
."\n <label>Party</label>\n"
.' <address transform="DPT:1.001" readonly="false" type="">' . addr2str($basega+7,1) . "</address>\n"
.' <address transform="DPT:1.001" readonly="true" type="">' . addr2str($basega+27,1) . "</address>\n"
." </switch>\n";
- print VISU2 ' <switch mapping="OnOff" styling="GreenRed">'
+ print VISU2 ' <switch mapping="'. $CV_switch_mapping .'" styling="'. $CV_switch_styling .'">'
."\n <label>DnD</label>\n"
.' <address transform="DPT:1.001" readonly="false" type="">' . addr2str($basega+8,1) . "</address>\n"
.' <address transform="DPT:1.001" readonly="true" type="">' . addr2str($basega+28,1) . "</address>\n"
Modified: tools/russconnectd/trunk/openwrt/russconnectd/Makefile
===================================================================
--- tools/russconnectd/trunk/openwrt/russconnectd/Makefile 2012-01-03 21:07:03 UTC (rev 632)
+++ tools/russconnectd/trunk/openwrt/russconnectd/Makefile 2012-01-05 13:32:10 UTC (rev 633)
@@ -1,7 +1,7 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=russconnectd
-PKG_VERSION:=0.1
+PKG_VERSION:=0.21
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
Modified: tools/russconnectd/trunk/russ_galist.ods
===================================================================
(Binary files differ)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2012-06-15 08:03:48
|
Revision: 884
http://openautomation.svn.sourceforge.net/openautomation/?rev=884&view=rev
Author: makki1
Date: 2012-06-15 08:03:36 +0000 (Fri, 15 Jun 2012)
Log Message:
-----------
Fix tabs/ident (only text changed)
Modified Paths:
--------------
tools/russconnectd/trunk/configure.ac
tools/russconnectd/trunk/src/main.c
Modified: tools/russconnectd/trunk/configure.ac
===================================================================
--- tools/russconnectd/trunk/configure.ac 2012-06-14 14:46:26 UTC (rev 883)
+++ tools/russconnectd/trunk/configure.ac 2012-06-15 08:03:36 UTC (rev 884)
@@ -1,7 +1,7 @@
dnl Process this file with autoconf to produce a configure script.
dnl Created by Anjuta application wizard.
-AC_INIT(russconnectd, 0.21, de...@wi..., , http://openautomation.sourceforge.net)
+AC_INIT(russconnectd, 0.22, de...@wi..., , http://openautomation.sourceforge.net)
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION)
Modified: tools/russconnectd/trunk/src/main.c
===================================================================
--- tools/russconnectd/trunk/src/main.c 2012-06-14 14:46:26 UTC (rev 883)
+++ tools/russconnectd/trunk/src/main.c 2012-06-15 08:03:36 UTC (rev 884)
@@ -1,7 +1,7 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
+/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4; tab-width: 4 -*- */
/*
* main.c
- * Copyright (C) Michael Markstaller 2011 <de...@wi...>
+ * Copyright (C) Michael Markstaller 2011-2012 <de...@wi...>
*
* russconnectd is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@@ -61,21 +61,21 @@
//FIXME:make struct zone dynamic
typedef struct Zone_t {
- char name[255];
- signed char balance;
- signed char bass;
- int dnd;
- int loudness;
- int partymode;
- signed char treble;
- int volume;
- int zonepower;
- int srcid;
- int onvolume;
- char srctxt[255];
- char srcinfo1[255];
- char srcinfo2[255];
- int inited;
+ char name[255];
+ signed char balance;
+ signed char bass;
+ int dnd;
+ int loudness;
+ int partymode;
+ signed char treble;
+ int volume;
+ int zonepower;
+ int srcid;
+ int onvolume;
+ char srctxt[255];
+ char srcinfo1[255];
+ char srcinfo2[255];
+ int inited;
} Zone_t;
Zone_t zones[MAX_ZONES];
@@ -97,13 +97,13 @@
socklen_t slen=sizeof(si_other);
void daemonShutdown() {
- //FIXME: clean exit pthread_exit(NULL); pthread_cancel(..);
- close(udpSocket);
- syslog(LOG_INFO, "%s daemon exiting", DAEMON_NAME);
- fprintf(stderr, "%s daemon exiting", DAEMON_NAME);
- close(pidFilehandle);
- unlink(pidfilename);
- exit(EXIT_SUCCESS);
+ //FIXME: clean exit pthread_exit(NULL); pthread_cancel(..);
+ close(udpSocket);
+ syslog(LOG_INFO, "%s daemon exiting", DAEMON_NAME);
+ fprintf(stderr, "%s daemon exiting", DAEMON_NAME);
+ close(pidFilehandle);
+ unlink(pidfilename);
+ exit(EXIT_SUCCESS);
}
void signal_handler(int sig) {
@@ -113,12 +113,12 @@
break;
case SIGTERM:
syslog(LOG_WARNING, "Received SIGTERM signal.");
- daemonShutdown();
- break;
+ daemonShutdown();
+ break;
case SIGINT:
syslog(LOG_WARNING, "Received SIGINT signal.");
- daemonShutdown();
- break;
+ daemonShutdown();
+ break;
default:
syslog(LOG_WARNING, "Unhandled signal (%d) %s", sig, strsignal(sig));
break;
@@ -126,704 +126,704 @@
}
char *russChecksum(char* buf, int len) {
- //FIXME: handle invert character
- /* The Invert Character is used in special cases as part of the Message Body. If the data in an
- RNETTM message body includes any byte values that have the MSB set to 1 (they have a Hex
- value greater than 0x7F) the byte will be rejected as only the lower 7 bits are used to hold data.
- In order to allow values greater than 0x7F to be accepted, the byte must first be bitwise inverted
- (e.g., 10010101 = 01101010), and the special Invert Character (0xF1) is inserted just prior to
- the inverted byte. When an RNETTM packet is received, the system must detect the 0xF1 invert
- character. The 0xF1 character is then discarded and the following byte is inverted back to its
- original value (e.g., 01101010 = 10010101).
- F1 = Special Invert Character
- 6A = Inverted Character (actual value 0x95)
- */
- int i,j=0;
- for (i=0;i<len;i++)
- j+=buf[i];
- j+=len;
- j&= 0x007F;
- return (char *) j;
+ //FIXME: handle invert character
+ /* The Invert Character is used in special cases as part of the Message Body. If the data in an
+ RNETTM message body includes any byte values that have the MSB set to 1 (they have a Hex
+ value greater than 0x7F) the byte will be rejected as only the lower 7 bits are used to hold data.
+ In order to allow values greater than 0x7F to be accepted, the byte must first be bitwise inverted
+ (e.g., 10010101 = 01101010), and the special Invert Character (0xF1) is inserted just prior to
+ the inverted byte. When an RNETTM packet is received, the system must detect the 0xF1 invert
+ character. The 0xF1 character is then discarded and the following byte is inverted back to its
+ original value (e.g., 01101010 = 10010101).
+ F1 = Special Invert Character
+ 6A = Inverted Character (actual value 0x95)
+ */
+ int i,j=0;
+ for (i=0;i<len;i++)
+ j+=buf[i];
+ j+=len;
+ j&= 0x007F;
+ return (char *) j;
}
void *sendrussPolling(unsigned char zone) {
- syslog(LOG_DEBUG, "polling zone %d",zone);
- pthread_mutex_trylock(&standbylock);
-
- //Send device reset-event to wakeup (at least) C3 - yet untested
- if (keypadid == 0x71) {
- char buf_devreset[25] = { 0xF0, 0, 0, 0x7F, 0, 0, keypadid, 0x05, 0x02, 0x02, 0, 0, 0x55, 0x01, 0x03, 0, 0x35, 0, 0x01, 0, 0xF7 };
- buf_devreset[4] = zone/ZONES_PER_CONTROLLER;
- buf_devreset[5] = zone%ZONES_PER_CONTROLLER;
- buf_devreset[19] = (int) russChecksum (buf_devreset,21-2);
- if (sendto(udpSocket, buf_devreset, 21, 0, (struct sockaddr *) &si_other, slen)==-1)
- syslog(LOG_WARNING,"sendto failed!");
- usleep(20*1000); //FIXME: throttle a little
- }
+ syslog(LOG_DEBUG, "polling zone %d",zone);
+ pthread_mutex_trylock(&standbylock);
- //Get Poweron-Volume
- char buf_onvol[25] = { 0xF0, 0, 0, 0x7F, 0, 0, keypadid, 0x01, 0x05, 0x02, 0, 0, 0, 0x04, 0, 0, 0, 0xF7 };
- buf_onvol[1] = zone/ZONES_PER_CONTROLLER;
- buf_onvol[11] = zone%ZONES_PER_CONTROLLER;
- buf_onvol[16] = (int) russChecksum (buf_onvol,18-2);
- if (sendto(udpSocket, buf_onvol, 18, 0, (struct sockaddr *) &si_other, slen)==-1)
- syslog(LOG_WARNING,"sendto failed!");
- usleep(20*1000); //FIXME: throttle a little (20ms)
+ //Send device reset-event to wakeup (at least) C3 - yet untested
+ if (keypadid == 0x71) {
+ char buf_devreset[25] = { 0xF0, 0, 0, 0x7F, 0, 0, keypadid, 0x05, 0x02, 0x02, 0, 0, 0x55, 0x01, 0x03, 0, 0x35, 0, 0x01, 0, 0xF7 };
+ buf_devreset[4] = zone/ZONES_PER_CONTROLLER;
+ buf_devreset[5] = zone%ZONES_PER_CONTROLLER;
+ buf_devreset[19] = (int) russChecksum (buf_devreset,21-2);
+ if (sendto(udpSocket, buf_devreset, 21, 0, (struct sockaddr *) &si_other, slen)==-1)
+ syslog(LOG_WARNING,"sendto failed!");
+ usleep(20*1000); //FIXME: throttle a little
+ }
- //Get zonestate
- char buf_getzone[25] = { 0xF0, 0, 0, 0x7F, 0, 0, keypadid, 0x01, 0x04, 0x02, 0, 0, 0x07, 0, 0, 0, 0xF7 };
- buf_getzone[1] = zone/ZONES_PER_CONTROLLER;
- buf_getzone[11] = zone%ZONES_PER_CONTROLLER;
- buf_getzone[15] = (int) russChecksum (buf_getzone,17-2);
- if (sendto(udpSocket, buf_getzone, 17, 0, (struct sockaddr *) &si_other, slen)==-1)
- syslog(LOG_WARNING,"sendto failed!");
+ //Get Poweron-Volume
+ char buf_onvol[25] = { 0xF0, 0, 0, 0x7F, 0, 0, keypadid, 0x01, 0x05, 0x02, 0, 0, 0, 0x04, 0, 0, 0, 0xF7 };
+ buf_onvol[1] = zone/ZONES_PER_CONTROLLER;
+ buf_onvol[11] = zone%ZONES_PER_CONTROLLER;
+ buf_onvol[16] = (int) russChecksum (buf_onvol,18-2);
+ if (sendto(udpSocket, buf_onvol, 18, 0, (struct sockaddr *) &si_other, slen)==-1)
+ syslog(LOG_WARNING,"sendto failed!");
+ usleep(20*1000); //FIXME: throttle a little (20ms)
- usleep(50*1000); //FIXME: throttle a little (50ms)
- return 0;
+ //Get zonestate
+ char buf_getzone[25] = { 0xF0, 0, 0, 0x7F, 0, 0, keypadid, 0x01, 0x04, 0x02, 0, 0, 0x07, 0, 0, 0, 0xF7 };
+ buf_getzone[1] = zone/ZONES_PER_CONTROLLER;
+ buf_getzone[11] = zone%ZONES_PER_CONTROLLER;
+ buf_getzone[15] = (int) russChecksum (buf_getzone,17-2);
+ if (sendto(udpSocket, buf_getzone, 17, 0, (struct sockaddr *) &si_other, slen)==-1)
+ syslog(LOG_WARNING,"sendto failed!");
+
+ usleep(50*1000); //FIXME: throttle a little (50ms)
+ return 0;
}
void *sendrussFunc(int controller, int zone, int func, int val) {
- syslog(LOG_DEBUG,"write ctrl %d zone %d func %d val 0x%02X",controller,zone,func,val);
+ syslog(LOG_DEBUG,"write ctrl %d zone %d func %d val 0x%02X",controller,zone,func,val);
- //TODO: send on-telegram to actuator
+ //TODO: send on-telegram to actuator
- //block here until something is received from russound (it's turned off)
- pthread_mutex_lock(&standbylock);
- pthread_mutex_unlock(&standbylock);
- char buf_msg1[25] = { 0, 0, 0, 0x7F, 0, 0, keypadid, 0x05, 0x02, 0x02, 0, 0, 0xF1, 0x23, 0, 0, 0, 0, 0, 0x01, 0, 0xF7 };
- buf_msg1[1] = controller;
- buf_msg1[17] = zone;
- char buf_msg2[25] = { 0, 0, 0, 0x7F, 0, 0, keypadid, 0, 0x05, 0x02, 0, 0, 0, 0, 0, 0, 0, 0x01, 0, 0x01, 0, 0, 0, 0xF7 };
- buf_msg2[1] = controller;
- buf_msg2[11] = zone;
+ //block here until something is received from russound (it's turned off)
+ pthread_mutex_lock(&standbylock);
+ pthread_mutex_unlock(&standbylock);
+ char buf_msg1[25] = { 0, 0, 0, 0x7F, 0, 0, keypadid, 0x05, 0x02, 0x02, 0, 0, 0xF1, 0x23, 0, 0, 0, 0, 0, 0x01, 0, 0xF7 };
+ buf_msg1[1] = controller;
+ buf_msg1[17] = zone;
+ char buf_msg2[25] = { 0, 0, 0, 0x7F, 0, 0, keypadid, 0, 0x05, 0x02, 0, 0, 0, 0, 0, 0, 0, 0x01, 0, 0x01, 0, 0, 0, 0xF7 };
+ buf_msg2[1] = controller;
+ buf_msg2[11] = zone;
- switch (func) {
- case -9: //all zones
- buf_msg1[0] = 0xF0;
- buf_msg1[1] = 0x7E;
- buf_msg1[13] = 0x22;
- buf_msg1[16] = val;
- break;
- case 0: //power
- buf_msg1[0] = 0xF0;
- buf_msg1[15] = val;
- break;
- case 1: //src
- buf_msg1[0] = 0xF0;
- buf_msg1[5] = zone;
- buf_msg1[9] = 0;
- buf_msg1[17] = val;
- buf_msg1[13] = 0x3E;
- break;
- case 2: //volume
- buf_msg1[0] = 0xF0;
- buf_msg1[13] = 0x21;
- buf_msg1[15] = val*100/255/2;
- break;
- case 3: //bass
- buf_msg2[0] = 0xF0;
- if (val>127)
- buf_msg2[21] = val-256+10;
- else
- buf_msg2[21] = val+10;
- break;
- case 4: //treb
- buf_msg2[0] = 0xF0;
- buf_msg2[13] = 0x01;
- if (val>127)
- buf_msg2[21] = val-256+10;
- else
- buf_msg2[21] = val+10;
- break;
- case 5: //loud
- buf_msg2[0] = 0xF0;
- buf_msg2[13] = 0x02;
- buf_msg2[21] = val;
- break;
- case 6: //bal
- buf_msg2[0] = 0xF0;
- buf_msg2[13] = 0x03;
- if (val>127)
- buf_msg2[21] = val-256+10;
- else
- buf_msg2[21] = val+10;
- break;
- case 7: //party
- buf_msg2[0] = 0xF0;
- buf_msg2[13] = 0x07;
- buf_msg2[21] = val;
- break;
- case 8: //dnd
- buf_msg2[0] = 0xF0;
- buf_msg2[13] = 0x06;
- buf_msg2[21] = val;
- break;
- case 9: //turnonvol
- buf_msg2[0] = 0xF0;
- buf_msg2[13] = 0x04;
- buf_msg2[21] = val*100/255/2;
- break;
- //TODO: 10 src cmd and 11 keypadcmd
- case 12: //volume relative up/down
- buf_msg1[0] = 0xF0;
- buf_msg1[5] = zone;
- if (val) {
- buf_msg1[12] = 0x7F;
- buf_msg1[13] = 0;
- buf_msg1[17] = 0;
- buf_msg1[18] = 0x01;
- buf_msg1[20] = 0xF7;
- buf_msg1[21] = 0; //clear
- } else {
- buf_msg1[12] = 0xF1;
- buf_msg1[13] = 0x7F; //clear
- }
- buf_msg1[15] = val;
- break;
- }
+ switch (func) {
+ case -9: //all zones
+ buf_msg1[0] = 0xF0;
+ buf_msg1[1] = 0x7E;
+ buf_msg1[13] = 0x22;
+ buf_msg1[16] = val;
+ break;
+ case 0: //power
+ buf_msg1[0] = 0xF0;
+ buf_msg1[15] = val;
+ break;
+ case 1: //src
+ buf_msg1[0] = 0xF0;
+ buf_msg1[5] = zone;
+ buf_msg1[9] = 0;
+ buf_msg1[17] = val;
+ buf_msg1[13] = 0x3E;
+ break;
+ case 2: //volume
+ buf_msg1[0] = 0xF0;
+ buf_msg1[13] = 0x21;
+ buf_msg1[15] = val*100/255/2;
+ break;
+ case 3: //bass
+ buf_msg2[0] = 0xF0;
+ if (val>127)
+ buf_msg2[21] = val-256+10;
+ else
+ buf_msg2[21] = val+10;
+ break;
+ case 4: //treb
+ buf_msg2[0] = 0xF0;
+ buf_msg2[13] = 0x01;
+ if (val>127)
+ buf_msg2[21] = val-256+10;
+ else
+ buf_msg2[21] = val+10;
+ break;
+ case 5: //loud
+ buf_msg2[0] = 0xF0;
+ buf_msg2[13] = 0x02;
+ buf_msg2[21] = val;
+ break;
+ case 6: //bal
+ buf_msg2[0] = 0xF0;
+ buf_msg2[13] = 0x03;
+ if (val>127)
+ buf_msg2[21] = val-256+10;
+ else
+ buf_msg2[21] = val+10;
+ break;
+ case 7: //party
+ buf_msg2[0] = 0xF0;
+ buf_msg2[13] = 0x07;
+ buf_msg2[21] = val;
+ break;
+ case 8: //dnd
+ buf_msg2[0] = 0xF0;
+ buf_msg2[13] = 0x06;
+ buf_msg2[21] = val;
+ break;
+ case 9: //turnonvol
+ buf_msg2[0] = 0xF0;
+ buf_msg2[13] = 0x04;
+ buf_msg2[21] = val*100/255/2;
+ break;
+ //TODO: 10 src cmd and 11 keypadcmd
+ case 12: //volume relative up/down
+ buf_msg1[0] = 0xF0;
+ buf_msg1[5] = zone;
+ if (val) {
+ buf_msg1[12] = 0x7F;
+ buf_msg1[13] = 0;
+ buf_msg1[17] = 0;
+ buf_msg1[18] = 0x01;
+ buf_msg1[20] = 0xF7;
+ buf_msg1[21] = 0; //clear
+ } else {
+ buf_msg1[12] = 0xF1;
+ buf_msg1[13] = 0x7F; //clear
+ }
+ buf_msg1[15] = val;
+ break;
+ }
- if (buf_msg1[0] && buf_msg1[21])
- buf_msg1[20] = (int) russChecksum (buf_msg1,22-2);
- else if (buf_msg1[0] && buf_msg1[20]) //keypadcmd without F1
- buf_msg1[19] = (int) russChecksum (buf_msg1,21-2);
- if (buf_msg2[0])
- buf_msg2[22] = (int) russChecksum (buf_msg2,24-2);
+ if (buf_msg1[0] && buf_msg1[21])
+ buf_msg1[20] = (int) russChecksum (buf_msg1,22-2);
+ else if (buf_msg1[0] && buf_msg1[20]) //keypadcmd without F1
+ buf_msg1[19] = (int) russChecksum (buf_msg1,21-2);
+ if (buf_msg2[0])
+ buf_msg2[22] = (int) russChecksum (buf_msg2,24-2);
- if (buf_msg1[0])
- if (sendto(udpSocket, buf_msg1, 22, 0, (struct sockaddr *) &si_other, slen)==-1)
- syslog(LOG_WARNING,"sendrussfunc sendto failed!");
- if (buf_msg2[0])
- if (sendto(udpSocket, buf_msg2, 24, 0, (struct sockaddr *) &si_other, slen)==-1)
- syslog(LOG_WARNING,"sendrussfunc sendto failed!");
- usleep(20*1000); //FIXME: throttle a little (20ms)
- if (buf_msg1[0] || buf_msg2[0])
- sendrussPolling (zone+(controller*ZONES_PER_CONTROLLER)); //fire update of states
- return 0;
+ if (buf_msg1[0])
+ if (sendto(udpSocket, buf_msg1, 22, 0, (struct sockaddr *) &si_other, slen)==-1)
+ syslog(LOG_WARNING,"sendrussfunc sendto failed!");
+ if (buf_msg2[0])
+ if (sendto(udpSocket, buf_msg2, 24, 0, (struct sockaddr *) &si_other, slen)==-1)
+ syslog(LOG_WARNING,"sendrussfunc sendto failed!");
+ usleep(20*1000); //FIXME: throttle a little (20ms)
+ if (buf_msg1[0] || buf_msg2[0])
+ sendrussPolling (zone+(controller*ZONES_PER_CONTROLLER)); //fire update of states
+ return 0;
}
void *sendKNXdgram(int type, int dpt, eibaddr_t dest, unsigned char val) {
- int len = 0;
- EIBConnection *con;
- unsigned char buf[255] = { 0, 0x80 };
- buf[1] = type; //0x40 response, 0x80 write
- syslog(LOG_DEBUG,"Send KNX dgram Type %d DPT %d dest %d val %d",type,dpt,dest,val);
- con = EIBSocketURL (eibd_url);
- if (!con)
- syslog(LOG_WARNING,"sendknxdgram: Open failed");
- if (EIBOpenT_Group (con, dest, 1) == -1)
- syslog(LOG_WARNING,"sendknxdgram: Connect failed");
- switch (dpt)
- {
- case 0:
- len=1;
- //for(i = 0; i < strlen(val)/2; i++)
- //raw value: nothing for now
- break;
- case 1:
- buf[1] |= val & 0x3f;
- len=2;
- break;
- case 3:
- // EIS2/DPT3 4bit dim
- buf[1] |= val & 0x3f;
- len=2;
- break;
- case 5:
- buf[2] = val*255/100;
- len=3;
- break;
- case 51:
- case 5001:
- buf[2] = val;
- len=3;
- break;
- case 6:
- case 6001:
- //FIXME: This is basically wrong but as we get a uchar we expect the sender to know..
- buf[2] = val;
- len=3;
- break;
+ int len = 0;
+ EIBConnection *con;
+ unsigned char buf[255] = { 0, 0x80 };
+ buf[1] = type; //0x40 response, 0x80 write
+ syslog(LOG_DEBUG,"Send KNX dgram Type %d DPT %d dest %d val %d",type,dpt,dest,val);
+ con = EIBSocketURL (eibd_url);
+ if (!con)
+ syslog(LOG_WARNING,"sendknxdgram: Open failed");
+ if (EIBOpenT_Group (con, dest, 1) == -1)
+ syslog(LOG_WARNING,"sendknxdgram: Connect failed");
+ switch (dpt)
+ {
+ case 0:
+ len=1;
+ //for(i = 0; i < strlen(val)/2; i++)
+ //raw value: nothing for now
+ break;
+ case 1:
+ buf[1] |= val & 0x3f;
+ len=2;
+ break;
+ case 3:
+ // EIS2/DPT3 4bit dim
+ buf[1] |= val & 0x3f;
+ len=2;
+ break;
+ case 5:
+ buf[2] = val*255/100;
+ len=3;
+ break;
+ case 51:
+ case 5001:
+ buf[2] = val;
+ len=3;
+ break;
+ case 6:
+ case 6001:
+ //FIXME: This is basically wrong but as we get a uchar we expect the sender to know..
+ buf[2] = val;
+ len=3;
+ break;
/*
- case 9:
- fval=atof(data);
- if (fval<0)
- sign = 0x8000;
- mant = (int)(fval * 100.0);
- while (abs(mant) > 2047) {
- mant = mant >> 1;
- exp++;
- }
- i = sign | (exp << 11) | (mant & 0x07ff);
- buf[2] = i >> 8;
- buf[3] = i & 0xff;
- //return $data >> 8, $data & 0xff;
- len=4;
- break;
- case 16:
- len=2;
- for (i=0;i<strlen(data); i++)
- {
- buf[i+2] = (int)(data[i]);
- len++;
- }
-*/
- }
+ case 9:
+ fval=atof(data);
+ if (fval<0)
+ sign = 0x8000;
+ mant = (int)(fval * 100.0);
+ while (abs(mant) > 2047) {
+ mant = mant >> 1;
+ exp++;
+ }
+ i = sign | (exp << 11) | (mant & 0x07ff);
+ buf[2] = i >> 8;
+ buf[3] = i & 0xff;
+ //return $data >> 8, $data & 0xff;
+ len=4;
+ break;
+ case 16:
+ len=2;
+ for (i=0;i<strlen(data); i++)
+ {
+ buf[i+2] = (int)(data[i]);
+ len++;
+ }
+*/
+ }
- len = EIBSendAPDU (con, len, buf);
- if (len == -1)
- syslog (LOG_WARNING,"sendknxdram: Request failed");
- EIBClose (con);
- usleep(50*1000); //throttle a little (50ms/max 20tps)
- return 0;
+ len = EIBSendAPDU (con, len, buf);
+ if (len == -1)
+ syslog (LOG_WARNING,"sendknxdram: Request failed");
+ EIBClose (con);
+ usleep(50*1000); //throttle a little (50ms/max 20tps)
+ return 0;
}
void *sendKNXresponse(eibaddr_t dest, int zone, int func) {
- syslog(LOG_DEBUG, "KNX response %d zone %d func %d", dest,zone,func);
- pthread_mutex_lock (&zonelock);
- switch (func) {
- case 0:
- case 20:
- sendKNXdgram (0x40,1,dest,zones[zone].zonepower);
- break;
- case 1:
- case 21:
- sendKNXdgram (0x40,51,dest,zones[zone].srcid);
- break;
- case 2:
- case 22:
- sendKNXdgram (0x40,5,dest,zones[zone].volume*2);
- break;
- case 3:
- case 23:
- if (zones[zone].bass<10)
- sendKNXdgram (0x40,51,dest,zones[zone].bass-10+256);
- else
- sendKNXdgram (0x40,51,dest,zones[zone].bass-10);
- break;
- case 4:
- case 24:
- if (zones[zone].treble<10)
- sendKNXdgram (0x40,51,dest,zones[zone].treble-10+256);
- else
- sendKNXdgram (0x40,51,dest,zones[zone].treble-10);
- break;
- case 5:
- case 25:
- sendKNXdgram (0x40,1,dest,zones[zone].loudness);
- break;
- case 6:
- case 26:
- if (zones[zone].balance<10)
- sendKNXdgram (0x40,51,dest,zones[zone].balance-10+256);
- else
- sendKNXdgram (0x40,51,dest,zones[zone].balance-10);
- break;
- case 27:
- sendKNXdgram (0x40,1,dest,zones[zone].partymode);
- break;
- case 28:
- sendKNXdgram (0x40,1,dest,zones[zone].dnd);
- break;
- case 29:
- sendKNXdgram (0x40,5,dest,zones[zone].onvolume*2);
- break;
- }
- pthread_mutex_unlock (&zonelock);
- return 0;
+ syslog(LOG_DEBUG, "KNX response %d zone %d func %d", dest,zone,func);
+ pthread_mutex_lock (&zonelock);
+ switch (func) {
+ case 0:
+ case 20:
+ sendKNXdgram (0x40,1,dest,zones[zone].zonepower);
+ break;
+ case 1:
+ case 21:
+ sendKNXdgram (0x40,51,dest,zones[zone].srcid);
+ break;
+ case 2:
+ case 22:
+ sendKNXdgram (0x40,5,dest,zones[zone].volume*2);
+ break;
+ case 3:
+ case 23:
+ if (zones[zone].bass<10)
+ sendKNXdgram (0x40,51,dest,zones[zone].bass-10+256);
+ else
+ sendKNXdgram (0x40,51,dest,zones[zone].bass-10);
+ break;
+ case 4:
+ case 24:
+ if (zones[zone].treble<10)
+ sendKNXdgram (0x40,51,dest,zones[zone].treble-10+256);
+ else
+ sendKNXdgram (0x40,51,dest,zones[zone].treble-10);
+ break;
+ case 5:
+ case 25:
+ sendKNXdgram (0x40,1,dest,zones[zone].loudness);
+ break;
+ case 6:
+ case 26:
+ if (zones[zone].balance<10)
+ sendKNXdgram (0x40,51,dest,zones[zone].balance-10+256);
+ else
+ sendKNXdgram (0x40,51,dest,zones[zone].balance-10);
+ break;
+ case 27:
+ sendKNXdgram (0x40,1,dest,zones[zone].partymode);
+ break;
+ case 28:
+ sendKNXdgram (0x40,1,dest,zones[zone].dnd);
+ break;
+ case 29:
+ sendKNXdgram (0x40,5,dest,zones[zone].onvolume*2);
+ break;
+ }
+ pthread_mutex_unlock (&zonelock);
+ return 0;
}
void *handleKNXdgram(eibaddr_t dest, unsigned char* buf, int len){
- unsigned char val;
- int func,zone,controller;
- switch (buf[1] & 0xC0) {
- case 0x00:
- func = (dest - knxstartaddress)%256;
- zone = (func-10)/40;
- func = (func-10)%40;
- controller = (dest - knxstartaddress)/256;
- sendKNXresponse (dest,zone+(controller*ZONES_PER_CONTROLLER),func);
- break;
- case 0x40:
- //FIXME: response dunno
- break;
- case 0x80:
- if (buf[1] & 0xC0) {
- if (len == 2)
- val = buf[1] & 0x3F;
- else
- val = buf[2];
- func = (dest - knxstartaddress)%256;
- zone = (func-10)/40;
- func = (func-10)%40;
- controller = (dest - knxstartaddress)/256;
- sendrussFunc(controller,zone,func,val);
- }
- break;
- }
- return 0;
+ unsigned char val;
+ int func,zone,controller;
+ switch (buf[1] & 0xC0) {
+ case 0x00:
+ func = (dest - knxstartaddress)%256;
+ zone = (func-10)/40;
+ func = (func-10)%40;
+ controller = (dest - knxstartaddress)/256;
+ sendKNXresponse (dest,zone+(controller*ZONES_PER_CONTROLLER),func);
+ break;
+ case 0x40:
+ //FIXME: response dunno
+ break;
+ case 0x80:
+ if (buf[1] & 0xC0) {
+ if (len == 2)
+ val = buf[1] & 0x3F;
+ else
+ val = buf[2];
+ func = (dest - knxstartaddress)%256;
+ zone = (func-10)/40;
+ func = (func-10)%40;
+ controller = (dest - knxstartaddress)/256;
+ sendrussFunc(controller,zone,func,val);
+ }
+ break;
+ }
+ return 0;
}
void *knxhandler()
{
- syslog(LOG_DEBUG, "KNX reader thread started");
- int len;
- EIBConnection *con;
- eibaddr_t dest;
- eibaddr_t src;
- unsigned char buf[255];
-
- while (1) //retry infinite
- {
- con = EIBSocketURL (eibd_url);
- if (!con) {
- syslog(LOG_WARNING, "eibd: Open failed");
- sleep(RETRY_TIME);
- continue;
- }
+ syslog(LOG_DEBUG, "KNX reader thread started");
+ int len;
+ EIBConnection *con;
+ eibaddr_t dest;
+ eibaddr_t src;
+ unsigned char buf[255];
- if (EIBOpen_GroupSocket (con, 0) == -1) {
- syslog(LOG_WARNING, "eibd: Connect failed");
- sleep(RETRY_TIME);
- continue;
- }
+ while (1) //retry infinite
+ {
+ con = EIBSocketURL (eibd_url);
+ if (!con) {
+ syslog(LOG_WARNING, "eibd: Open failed");
+ sleep(RETRY_TIME);
+ continue;
+ }
- while (1)
- {
- len = EIBGetGroup_Src (con, sizeof (buf), buf, &src, &dest);
- if (len == -1) {
- syslog(LOG_WARNING, "eibd: Read failed");
- sleep(RETRY_TIME);
- break;
- }
- if (len < 2) {
- syslog(LOG_WARNING, "eibd: Invalid Packet");
- break;
- }
- if (buf[0] & 0x3 || (buf[1] & 0xC0) == 0xC0) {
- syslog(LOG_WARNING, "eibd: Unknown APDU from %d to %d",src,dest);
- break;
- } else {
- if ( dest<knxstartaddress || dest > (knxstartaddress+(numzones/ZONES_PER_CONTROLLER*256)-1) ) //not for us
- continue;
- handleKNXdgram(dest,buf,len);
- }
- }
- syslog(LOG_WARNING,"eibd: closed connection"); //break in read-loop
- EIBClose (con);
- }
- pthread_exit(NULL);
+ if (EIBOpen_GroupSocket (con, 0) == -1) {
+ syslog(LOG_WARNING, "eibd: Connect failed");
+ sleep(RETRY_TIME);
+ continue;
+ }
+
+ while (1)
+ {
+ len = EIBGetGroup_Src (con, sizeof (buf), buf, &src, &dest);
+ if (len == -1) {
+ syslog(LOG_WARNING, "eibd: Read failed");
+ sleep(RETRY_TIME);
+ break;
+ }
+ if (len < 2) {
+ syslog(LOG_WARNING, "eibd: Invalid Packet");
+ break;
+ }
+ if (buf[0] & 0x3 || (buf[1] & 0xC0) == 0xC0) {
+ syslog(LOG_WARNING, "eibd: Unknown APDU from %d to %d",src,dest);
+ break;
+ } else {
+ if ( dest<knxstartaddress || dest > (knxstartaddress+(numzones/ZONES_PER_CONTROLLER*256)-1) ) //not for us
+ continue;
+ handleKNXdgram(dest,buf,len);
+ }
+ }
+ syslog(LOG_WARNING,"eibd: closed connection"); //break in read-loop
+ EIBClose (con);
+ }
+ pthread_exit(NULL);
}
void *updateZone(unsigned char num, unsigned char val, int func) {
- syslog(LOG_DEBUG, "update Zone %d val %d func %d",num,val,func);
- int controller = num/ZONES_PER_CONTROLLER;
- int zone = num%ZONES_PER_CONTROLLER;
- //lock mutex befor updating
- pthread_mutex_lock (&zonelock);
- switch (func) {
- case 1:
- zones[num].zonepower =val;
- if (zones[num].inited || sendOnStart)
- sendKNXdgram (0x80,1,(knxstartaddress+30)+(zone*40)+(controller*256),val);
- break;
- case 2:
- zones[num].srcid =val;
- if (zones[num].inited || sendOnStart)
- sendKNXdgram (0x80,51,(knxstartaddress+31)+(zone*40)+(controller*256),val);
- break;
- case 3:
- zones[num].volume =val;
- if (zones[num].inited || sendOnStart)
- sendKNXdgram (0x80,5,(knxstartaddress+32)+(zone*40)+(controller*256),val*2);
- break;
- case 4:
- zones[num].bass =val;
- if (zones[num].inited || sendOnStart) {
- if (val<10)
- sendKNXdgram (0x80,51,(knxstartaddress+33)+(zone*40)+(controller*256),val-10+256);
- else
- sendKNXdgram (0x80,51,(knxstartaddress+33)+(zone*40)+(controller*256),val-10);
- }
- break;
- case 5:
- zones[num].treble =val;
- if (zones[num].inited || sendOnStart) {
- if (val<10)
- sendKNXdgram (0x80,51,(knxstartaddress+34)+(zone*40)+(controller*256),val-10+256);
- else
- sendKNXdgram (0x80,51,(knxstartaddress+34)+(zone*40)+(controller*256),val-10);
- }
- break;
- case 6:
- zones[num].loudness =val;
- if (zones[num].inited || sendOnStart)
- sendKNXdgram (0x80,1,(knxstartaddress+35)+(zone*40)+(controller*256),val);
- break;
- case 7:
- zones[num].balance =val;
- if (zones[num].inited || sendOnStart) {
- if (val<10)
- sendKNXdgram (0x80,51,(knxstartaddress+36)+(zone*40)+(controller*256),val-10+256);
- else
- sendKNXdgram (0x80,51,(knxstartaddress+36)+(zone*40)+(controller*256),val-10);
- }
- break;
- case 8:
- zones[num].partymode =val;
- if (zones[num].inited || sendOnStart)
- sendKNXdgram (0x80,1,(knxstartaddress+37)+(zone*40)+(controller*256),val);
- break;
- case 9:
- zones[num].dnd =val;
- if (zones[num].inited || sendOnStart)
- sendKNXdgram (0x80,1,(knxstartaddress+38)+(zone*40)+(controller*256),val);
- break;
- case 10:
- zones[num].onvolume =val;
- if (zones[num].inited || sendOnStart)
- sendKNXdgram (0x80,5,(knxstartaddress+39)+(zone*40)+(controller*256),val*2);
- break;
- default:
- break;
- }
- pthread_mutex_unlock (&zonelock);
- return 0;
+ syslog(LOG_DEBUG, "update Zone %d val %d func %d",num,val,func);
+ int controller = num/ZONES_PER_CONTROLLER;
+ int zone = num%ZONES_PER_CONTROLLER;
+ //lock mutex befor updating
+ pthread_mutex_lock (&zonelock);
+ switch (func) {
+ case 1:
+ zones[num].zonepower =val;
+ if (zones[num].inited || sendOnStart)
+ sendKNXdgram (0x80,1,(knxstartaddress+30)+(zone*40)+(controller*256),val);
+ break;
+ case 2:
+ ...
[truncated message content] |
|
From: <ma...@us...> - 2012-11-19 20:32:04
|
Revision: 1149
http://openautomation.svn.sourceforge.net/openautomation/?rev=1149&view=rev
Author: makki1
Date: 2012-11-19 20:31:58 +0000 (Mon, 19 Nov 2012)
Log Message:
-----------
russconnectd/cfgmaker - add CSV and fix ESF-export to be more HS-liked
Modified Paths:
--------------
tools/russconnectd/trunk/README
tools/russconnectd/trunk/cfgmaker.pl
Modified: tools/russconnectd/trunk/README
===================================================================
--- tools/russconnectd/trunk/README 2012-11-19 20:31:07 UTC (rev 1148)
+++ tools/russconnectd/trunk/README 2012-11-19 20:31:58 UTC (rev 1149)
@@ -6,6 +6,8 @@
- controllers and zone-numbers are zero based!
- use socat or Moxa to get serial-data from/to UDP:
19200 8N1, No flowctrl, no special stop chars needed
+Tested and working with CAA6, CAV6, CA4 (one must set six zones, not four!)
+SEE ALSO: http://cometvisu.de/wiki/index.php?title=Russconnectd
*** INSTALL
- needs pthread and libeibclient from bcusdk/eibd, but autotools etc. should
Modified: tools/russconnectd/trunk/cfgmaker.pl
===================================================================
--- tools/russconnectd/trunk/cfgmaker.pl 2012-11-19 20:31:07 UTC (rev 1148)
+++ tools/russconnectd/trunk/cfgmaker.pl 2012-11-19 20:31:58 UTC (rev 1149)
@@ -52,6 +52,7 @@
# ESF output for poor guys
open ESF, ">", "export.esf" or die $!;
+open CSV, ">", "export_ETS4_GA_1-1_Name_GA.csv" or die $!;
open XML, ">:encoding(UTF-8)", "linknx.xml" or die $!;
# some visu_config snipplet for CometVisu - :encoding(UTF-8)??
@@ -76,8 +77,9 @@
$conf->{addr2str($startga+1,1)}->{'DPTSubId'} = 1.001;
$conf->{addr2str($startga+1,1)}->{'DPTId'} = 1;
#$conf->{addr2str($startga+1,1)}->{'DPT_SubTypeName'} = 'DPT_Switch';
-print ESF "Multiroom-export\n";
-print ESF "$NamePrefix.Controller." . addr2str($startga+1,1) . "\t$NamePrefix $gfuncnames[0]\t" . $EISmap{'1.001'} . "\tLow\n";
+print ESF "Multiroom-export\r\n";
+print ESF "$NamePrefix.Controller." . addr2str($startga+1,1) . "\t$NamePrefix $gfuncnames[0]\t" . $EISmap{'1.001'} . "\tLow\t\r\n";
+print CSV "$NamePrefix $gfuncnames[0]," . addr2str($startga+1,1) . "\n";
print XML "#<?xml version=\"1.0\" ?>\n<config>\n\t<objects>\n";
print XML "\t\t<object id=\"$NamePrefix"."_$gfuncnames[0]\" gad=\"" . addr2str($startga+1,1) . "\" type=\"1.001\">$NamePrefix $gfuncnames[0]</object>\n";
@@ -95,7 +97,8 @@
$conf->{addr2str($basega+$i,1)}->{'DPTSubId'} = $funcdpts[$i];
$conf->{addr2str($basega+$i,1)}->{'DPTId'} = split(".",$funcdpts[$i],1);
#$conf->{addr2str($basega+$i,1)}->{'DPT_SubTypeName'} = $funcdpts_sub[$i];
- print ESF "$NamePrefix.Controller$ctrl." . addr2str($basega+$i,1) . "\t" . "$NamePrefix $zonenames[$zone] C" . ($ctrl+1) . "-Z" . ($czone+1) . " $funcnames[$i]" . "\t" . $EISmap{$funcdpts[$i]} . "\tLow\n";
+ print ESF "$NamePrefix.Controller$ctrl." . addr2str($basega+$i,1) . "\t" . "$NamePrefix $zonenames[$zone] C" . ($ctrl+1) . "-Z" . ($czone+1) . " $funcnames[$i]" . "\t" . ($EISmap{$funcdpts[$i]}||"Uncertain (1 Byte)") . "\tLow\t\r\n";
+ print CSV "$NamePrefix $zonenames[$zone] C" . ($ctrl+1) . "-Z" . ($czone+1) . " $funcnames[$i]," . addr2str($basega+$i,1) . "\n";
print XML "\t\t<object id=\"$zonenames[$zone]_C" . ($ctrl+1) . "_Z" . ($czone+1) . "_" . "$funcnames[$i]\" gad=\"" . addr2str($basega+$i,1) . "\" type=\"$funcdpts[$i]\">" . "$NamePrefix $zonenames[$zone] (C" . ($ctrl+1) . "/Z" . ($czone+1) . ") $funcnames[$i]" . "</object>\n";
}
#states
@@ -104,7 +107,7 @@
$conf->{addr2str($basega+$i+20,1)}->{'DPTSubId'} = $statedpts[$i];
$conf->{addr2str($basega+$i+20,1)}->{'DPTId'} = split(".",$statedpts[$i],1);
#$conf->{addr2str($basega+$i+20,1)}->{'DPT_SubTypeName'} = $statedpts_sub[$i];
- print ESF "$NamePrefix.Controller$ctrl." . addr2str($basega+$i+20,1) . "\t" . "$NamePrefix $zonenames[$zone] C" . ($ctrl+1) . "-Z" . ($czone+1) . " $statenames[$i]" . "\t" . $EISmap{$statedpts[$i]} . "\tLow\n";
+ print ESF "$NamePrefix.Controller$ctrl." . addr2str($basega+$i+20,1) . "\t" . "$NamePrefix $zonenames[$zone] C" . ($ctrl+1) . "-Z" . ($czone+1) . " $statenames[$i]" . "\t" . ($EISmap{$statedpts[$i]}||"Uncertain (1 Byte)") . "\tLow\t\r\n";
print XML "\t\t<object id=\"$zonenames[$zone]_C" . ($ctrl+1) . "_Z" . ($czone+1) . "_" . "$statenames[$i]\" gad=\"" . addr2str($basega+$i+20,1) . "\" type=\"$statedpts[$i]\">" . "$NamePrefix $zonenames[$zone] (C" . ($ctrl+1) . "/Z" . ($czone+1) . ") $statenames[$i]" . "</object>\n";
}
print VISU1 ' <switch mapping="'. $CV_switch_mapping .'" styling="'. $CV_switch_styling .'">'
@@ -190,6 +193,7 @@
}
close ESF;
+close CSV;
print XML "\t</objects>\n</config>\n";
close XML;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2013-02-09 18:00:41
|
Revision: 1449
http://openautomation.svn.sourceforge.net/openautomation/?rev=1449&view=rev
Author: makki1
Date: 2013-02-09 18:00:33 +0000 (Sat, 09 Feb 2013)
Log Message:
-----------
Make it work with C5, not fully tested on older CA*
Modified Paths:
--------------
tools/russconnectd/trunk/configure.ac
tools/russconnectd/trunk/debian/changelog
tools/russconnectd/trunk/debian/files
tools/russconnectd/trunk/src/main.c
Modified: tools/russconnectd/trunk/configure.ac
===================================================================
--- tools/russconnectd/trunk/configure.ac 2013-02-09 16:26:33 UTC (rev 1448)
+++ tools/russconnectd/trunk/configure.ac 2013-02-09 18:00:33 UTC (rev 1449)
@@ -1,7 +1,7 @@
dnl Process this file with autoconf to produce a configure script.
dnl Created by Anjuta application wizard.
-AC_INIT(russconnectd, 0.22, de...@wi..., , http://openautomation.sourceforge.net)
+AC_INIT(russconnectd, 0.30, de...@wi..., , http://openautomation.sourceforge.net)
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION)
Modified: tools/russconnectd/trunk/debian/changelog
===================================================================
--- tools/russconnectd/trunk/debian/changelog 2013-02-09 16:26:33 UTC (rev 1448)
+++ tools/russconnectd/trunk/debian/changelog 2013-02-09 18:00:33 UTC (rev 1449)
@@ -1,3 +1,9 @@
+russconnectd (0.30-1) lenny; urgency=low
+
+ * adjust RNet for C5 - older models are untestet!
+
+ -- Michael Markstaller <de...@wi...> Sat, 09 Feb 2013 17:28:57 +0100
+
russconnectd (0.21-1) lenny; urgency=low
* fixes/new upstream
Modified: tools/russconnectd/trunk/debian/files
===================================================================
--- tools/russconnectd/trunk/debian/files 2013-02-09 16:26:33 UTC (rev 1448)
+++ tools/russconnectd/trunk/debian/files 2013-02-09 18:00:33 UTC (rev 1449)
@@ -1 +1 @@
-russconnectd_0.21-1_i386.deb unknown extra
+russconnectd_0.30-1_i386.deb unknown extra
Modified: tools/russconnectd/trunk/src/main.c
===================================================================
--- tools/russconnectd/trunk/src/main.c 2013-02-09 16:26:33 UTC (rev 1448)
+++ tools/russconnectd/trunk/src/main.c 2013-02-09 18:00:33 UTC (rev 1449)
@@ -161,8 +161,19 @@
}
//Get Poweron-Volume
+ /* same stuff, cc zz twice
+ 8.8.3 Get Turn On Volume
+ The current Turn On Volume for a particular zone can be obtained using the following message.
+ Byte # 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
+ Value F0 cc 00 7F cc zz kk 01 05 02 00 zz 00 04 00 00 xx F7
+ cc = controller number -1
+ zz = zone number -1
+ kk = keypad id = 0x70 (0x71 when connected to an ACA-E5).
+ xx = checksum */
char buf_onvol[25] = { 0xF0, 0, 0, 0x7F, 0, 0, keypadid, 0x01, 0x05, 0x02, 0, 0, 0, 0x04, 0, 0, 0, 0xF7 };
buf_onvol[1] = zone/ZONES_PER_CONTROLLER;
+ buf_onvol[4] = zone/ZONES_PER_CONTROLLER;
+ buf_onvol[5] = zone%ZONES_PER_CONTROLLER;
buf_onvol[11] = zone%ZONES_PER_CONTROLLER;
buf_onvol[16] = (int) russChecksum (buf_onvol,18-2);
if (sendto(udpSocket, buf_onvol, 18, 0, (struct sockaddr *) &si_other, slen)==-1)
@@ -181,6 +192,8 @@
xx = checksum
*/
buf_getzone[1] = zone/ZONES_PER_CONTROLLER;
+ buf_getzone[4] = zone/ZONES_PER_CONTROLLER;
+ buf_getzone[5] = zone%ZONES_PER_CONTROLLER;
buf_getzone[11] = zone%ZONES_PER_CONTROLLER;
buf_getzone[15] = (int) russChecksum (buf_getzone,17-2);
if (sendto(udpSocket, buf_getzone, 17, 0, (struct sockaddr *) &si_other, slen)==-1)
@@ -212,9 +225,23 @@
*/
char buf_msg1[25] = { 0, 0, 0, 0x7F, 0, 0, keypadid, 0x05, 0x02, 0x02, 0, 0, 0xF1, 0x23, 0, 0, 0, 0, 0, 0x01, 0, 0xF7 };
buf_msg1[1] = controller;
+ buf_msg1[4] = controller;
+ buf_msg1[5] = zone;
buf_msg1[17] = zone;
+ /* Same stuff here: 8.4.2 Set Bass
+ Select the Bass level for a particular zone using a discrete message.
+ Byte # 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
+ Value F0 cc 00 7F cc zz kk 00 05 02 00 zz 00 00 00 00 00 01 00 01 00 ## xx F7
+ cc = controller number -1
+ zz = zone number -1
+ kk = keypad id = 0x70 (0x71 when connected to an ACA-E5).
+ xx = checksum
+ Byte #22 = Bass level (0x00 = -10 ... 0x0A = Flat ... 0x14 = +10)
+ */
char buf_msg2[25] = { 0, 0, 0, 0x7F, 0, 0, keypadid, 0, 0x05, 0x02, 0, 0, 0, 0, 0, 0, 0, 0x01, 0, 0x01, 0, 0, 0, 0xF7 };
buf_msg2[1] = controller;
+ buf_msg2[4] = controller;
+ buf_msg2[5] = zone;
buf_msg2[11] = zone;
switch (func) {
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2013-02-11 16:47:18
|
Revision: 1471
http://openautomation.svn.sourceforge.net/openautomation/?rev=1471&view=rev
Author: makki1
Date: 2013-02-11 16:47:07 +0000 (Mon, 11 Feb 2013)
Log Message:
-----------
add 8zones for C5, monit, cleanup
Modified Paths:
--------------
tools/russconnectd/trunk/cfgmaker.pl
tools/russconnectd/trunk/configure.ac
tools/russconnectd/trunk/debian/changelog
tools/russconnectd/trunk/debian/files
tools/russconnectd/trunk/russ_galist.ods
tools/russconnectd/trunk/src/main.c
Added Paths:
-----------
tools/russconnectd/trunk/debian/russconnectd.dirs
tools/russconnectd/trunk/debian/russconnectd.install
tools/russconnectd/trunk/debian/russconnectd.monit
tools/russconnectd/trunk/debian/russconnectd.postinst
Modified: tools/russconnectd/trunk/cfgmaker.pl
===================================================================
--- tools/russconnectd/trunk/cfgmaker.pl 2013-02-11 11:53:24 UTC (rev 1470)
+++ tools/russconnectd/trunk/cfgmaker.pl 2013-02-11 16:47:07 UTC (rev 1471)
@@ -11,7 +11,7 @@
### End config - Don't change below ###
#######################################
-my $ZONES_PER_CONTROLLER = 6; #static
+my $zones_per_controller = 6;
my @gfuncnames = qw(SetAllZonesPower WRITEONLYACT NA3 NA4 NA5 AllZonesPowerState);
use File::Copy;
@@ -22,7 +22,13 @@
use XML::Simple;
getopts("a:z:n:f:", \my %opts);
my $conf = Config::Tiny->new;
-
+
+my $ga_per_zone = 40;
+if ($opts{z} % 8 == 0) {
+ $zones_per_controller = 8;
+ $ga_per_zone = 30;
+}
+
my @funcdpts = qw (1.001 5.010 5.001 6.001 6.001 1.001 6.001 1.001 1.001 5.001 5.010 5.010 1.008);
my @funcdpts_sub = qw (DPT_Switch DPT_Value_1_Ucount DPT_Scaling DPT_Percent_V8 DPT_Percent_V8 DPT_Switch DPT_Percent_V8 DPT_Switch DPT_Switch DPT_Scaling DPT_Value_1_Ucount DPT_Value_1_Ucount DPT_UpDown);
my @statedpts = qw(1.001 5.010 5.001 6.001 6.001 1.001 6.001 1.001 1.001 5.001);
@@ -85,11 +91,11 @@
print XML "\t\t<object id=\"$NamePrefix"."_$gfuncnames[0]\" gad=\"" . addr2str($startga+1,1) . "\" type=\"1.001\">$NamePrefix $gfuncnames[0]</object>\n";
for (my $zone=0;$zone<$opts{z};$zone++) {
- #sendKNXdgram (0x80,1,(knxstartaddress+30)+(zone*40)+(controller*256),val);
- my $ctrl = int($zone/$ZONES_PER_CONTROLLER);
- my $czone = int($zone%$ZONES_PER_CONTROLLER);
- my $basega = $startga+10 + ($czone*40) + ($ctrl*256);
+ my $ctrl = int($zone/$zones_per_controller);
+ my $czone = int($zone%$zones_per_controller);
+ my $basega = $startga+10 + ($czone*$ga_per_zone) + ($ctrl*256);
my $basegastr = addr2str($basega,1);
+ $zonenames[$zone] = "Zone " . ($zone+1) unless $zonenames[$zone];
print STDERR "Zone " . ($zone+1) . " is $zonenames[$zone] base: $basegastr\n";
# funcs
for (my $i=0;$i<$#funcnames+1;$i++) {
Modified: tools/russconnectd/trunk/configure.ac
===================================================================
--- tools/russconnectd/trunk/configure.ac 2013-02-11 11:53:24 UTC (rev 1470)
+++ tools/russconnectd/trunk/configure.ac 2013-02-11 16:47:07 UTC (rev 1471)
@@ -1,7 +1,7 @@
dnl Process this file with autoconf to produce a configure script.
dnl Created by Anjuta application wizard.
-AC_INIT(russconnectd, 0.30, de...@wi..., , http://openautomation.sourceforge.net)
+AC_INIT(russconnectd, 0.31, de...@wi..., , http://openautomation.sourceforge.net)
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION)
Modified: tools/russconnectd/trunk/debian/changelog
===================================================================
--- tools/russconnectd/trunk/debian/changelog 2013-02-11 11:53:24 UTC (rev 1470)
+++ tools/russconnectd/trunk/debian/changelog 2013-02-11 16:47:07 UTC (rev 1471)
@@ -1,3 +1,10 @@
+russconnectd (0.31-1) lenny; urgency=low
+
+ * make zones more flexible, support 8 Zones on C5
+ * add monit
+
+ -- Michael Markstaller <de...@wi...> Mon, 11 Feb 2013 17:37:08 +0100
+
russconnectd (0.30-1) lenny; urgency=low
* adjust RNet for C5 - older models are untestet!
Modified: tools/russconnectd/trunk/debian/files
===================================================================
--- tools/russconnectd/trunk/debian/files 2013-02-11 11:53:24 UTC (rev 1470)
+++ tools/russconnectd/trunk/debian/files 2013-02-11 16:47:07 UTC (rev 1471)
@@ -1 +1 @@
-russconnectd_0.30-1_i386.deb unknown extra
+russconnectd_0.31-1_i386.deb unknown extra
Added: tools/russconnectd/trunk/debian/russconnectd.dirs
===================================================================
--- tools/russconnectd/trunk/debian/russconnectd.dirs (rev 0)
+++ tools/russconnectd/trunk/debian/russconnectd.dirs 2013-02-11 16:47:07 UTC (rev 1471)
@@ -0,0 +1,4 @@
+etc
+usr/bin
+etc/monit/enable
+
Added: tools/russconnectd/trunk/debian/russconnectd.install
===================================================================
--- tools/russconnectd/trunk/debian/russconnectd.install (rev 0)
+++ tools/russconnectd/trunk/debian/russconnectd.install 2013-02-11 16:47:07 UTC (rev 1471)
@@ -0,0 +1,2 @@
+debian/russconnectd.monit etc/monit/enable
+
Added: tools/russconnectd/trunk/debian/russconnectd.monit
===================================================================
--- tools/russconnectd/trunk/debian/russconnectd.monit (rev 0)
+++ tools/russconnectd/trunk/debian/russconnectd.monit 2013-02-11 16:47:07 UTC (rev 1471)
@@ -0,0 +1,6 @@
+check process russconnectd with pidfile /var/run/russconnectd.pid
+ start program = "/etc/init.d/russconnectd start"
+ stop program = "/etc/init.d/russconnectd stop"
+ if cpu > 80% for 5 cycles then alert
+ if totalmem > 2.0 MB for 5 cycles then restart
+
Added: tools/russconnectd/trunk/debian/russconnectd.postinst
===================================================================
--- tools/russconnectd/trunk/debian/russconnectd.postinst (rev 0)
+++ tools/russconnectd/trunk/debian/russconnectd.postinst 2013-02-11 16:47:07 UTC (rev 1471)
@@ -0,0 +1,10 @@
+#!/bin/sh -e
+
+do_monit () {
+ if [ -x /usr/sbin/monit ]; then
+ monit reload
+ fi
+}
+
+do_monit
+
Property changes on: tools/russconnectd/trunk/debian/russconnectd.postinst
___________________________________________________________________
Added: svn:executable
+ *
Modified: tools/russconnectd/trunk/russ_galist.ods
===================================================================
(Binary files differ)
Modified: tools/russconnectd/trunk/src/main.c
===================================================================
--- tools/russconnectd/trunk/src/main.c 2013-02-11 11:53:24 UTC (rev 1470)
+++ tools/russconnectd/trunk/src/main.c 2013-02-11 16:47:07 UTC (rev 1471)
@@ -33,26 +33,26 @@
#include <pthread.h>
#include <eibclient.h>
+#include "../config.h"
-
#define DEBUG 1
-#define DAEMON_NAME "russconnectd"
+#define DAEMON_NAME PACKAGE_NAME " " PACKAGE_VERSION
#define USAGESTRING "\n"\
"\t-d Run as daemon/No debug output\n"\
"\t-p <pidfile> PID-filename\n"\
"\t-i <ip:port> IP-Address:Port to send UDP-packets to russound\n"\
"\t-l <UDP-port> UDP port to listen on\n"\
"\t-a <KNX address> KNX start-address (see README)\n"\
- "\t-z <number> Number of Zones to support\n"\
- "\t-u <eib url> URL to conatct eibd like localo:/tmp/eib or ip:192.168.0.101\n"\
+ "\t-z <number> Number of Zones to support - must be a multiple of 6 or 8\n"\
+ "\t-u <eib url> URL to conatct eibd like local:/tmp/eib or ip:192.168.0.101\n"\
"\t-s (Optional) send all values to KNX on startup of daemon\n"\
- "\t-k 0x71 (Optional) Keypad ID - defaults to 0x70 for CAx - use 0x71 for C5\n"
+ "\t-k 0x71 (Optional) Keypad ID - defaults to 0x70 for CAx - use 0x71 for C3/C5/E5\n"\
+ "\t-v " PACKAGE_NAME " " PACKAGE_VERSION "\n"
#define NUM_THREADS 3
-#define MAX_ZONES 31
+#define MAX_ZONES 47
#define RETRY_TIME 5
#define BUFLEN 1024
#define POLLING_INTERVAL 10
-#define ZONES_PER_CONTROLLER 6
pthread_mutex_t zonelock = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t initlock = PTHREAD_MUTEX_INITIALIZER;
@@ -84,7 +84,9 @@
char *eibd_url = "local:/tmp/eib";
int listenport = 16012;
int knxstartaddress = 50000;
-int numzones = ZONES_PER_CONTROLLER;
+int numzones = 6; //default to six
+int zones_per_controller = 6;
+int ga_per_zone = 40;
int pidFilehandle;
char *pidfilename = "/var/run/russconnectd.pid";
int sendOnStart = 0;
@@ -152,49 +154,31 @@
//Send device reset-event to wakeup (at least) E5 *NOT* C3/C5! - untested and most likely useless
if (keypadid == 0x71) {
char buf_devreset[25] = { 0xF0, 0, 0, 0x7F, 0, 0, keypadid, 0x05, 0x02, 0x02, 0, 0, 0x55, 0x01, 0x03, 0, 0x35, 0, 0x01, 0, 0xF7 };
- buf_devreset[4] = zone/ZONES_PER_CONTROLLER;
- buf_devreset[5] = zone%ZONES_PER_CONTROLLER;
+ buf_devreset[4] = zone/zones_per_controller;
+ buf_devreset[5] = zone%zones_per_controller;
buf_devreset[19] = (int) russChecksum (buf_devreset,21-2);
if (sendto(udpSocket, buf_devreset, 21, 0, (struct sockaddr *) &si_other, slen)==-1)
syslog(LOG_WARNING,"sendto failed!");
usleep(20*1000); //FIXME: throttle a little
}
- //Get Poweron-Volume
- /* same stuff, cc zz twice
- 8.8.3 Get Turn On Volume
- The current Turn On Volume for a particular zone can be obtained using the following message.
- Byte # 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
- Value F0 cc 00 7F cc zz kk 01 05 02 00 zz 00 04 00 00 xx F7
- cc = controller number -1
- zz = zone number -1
- kk = keypad id = 0x70 (0x71 when connected to an ACA-E5).
- xx = checksum */
+ //Get Poweron-Volume 8.8.3 Get Turn On Volume
char buf_onvol[25] = { 0xF0, 0, 0, 0x7F, 0, 0, keypadid, 0x01, 0x05, 0x02, 0, 0, 0, 0x04, 0, 0, 0, 0xF7 };
- buf_onvol[1] = zone/ZONES_PER_CONTROLLER;
- buf_onvol[4] = zone/ZONES_PER_CONTROLLER;
- buf_onvol[5] = zone%ZONES_PER_CONTROLLER;
- buf_onvol[11] = zone%ZONES_PER_CONTROLLER;
+ buf_onvol[1] = zone/zones_per_controller;
+ buf_onvol[4] = zone/zones_per_controller;
+ buf_onvol[5] = zone%zones_per_controller;
+ buf_onvol[11] = zone%zones_per_controller;
buf_onvol[16] = (int) russChecksum (buf_onvol,18-2);
if (sendto(udpSocket, buf_onvol, 18, 0, (struct sockaddr *) &si_other, slen)==-1)
syslog(LOG_WARNING,"sendto failed!");
usleep(20*1000); //FIXME: throttle a little (20ms)
- //Get zonestate
+ //Get zonestate in once
char buf_getzone[25] = { 0xF0, 0, 0, 0x7F, 0, 0, keypadid, 0x01, 0x04, 0x02, 0, 0, 0x07, 0, 0, 0, 0xF7 };
- //FIXME: according to RNet 1.004 controller and zone are inserted twice!
- /* This is the Request message for the parameter values of the selected Zone.
- Byte # 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
- Value F0 cc 00 7F cc zz kk 01 04 02 00 zz 07 00 00 xx F7
- cc = controller number -1
- zz = zone number -1
- kk = keypad id = 0x70 (0x71 when connected to an ACA-E5).
- xx = checksum
- */
- buf_getzone[1] = zone/ZONES_PER_CONTROLLER;
- buf_getzone[4] = zone/ZONES_PER_CONTROLLER;
- buf_getzone[5] = zone%ZONES_PER_CONTROLLER;
- buf_getzone[11] = zone%ZONES_PER_CONTROLLER;
+ buf_getzone[1] = zone/zones_per_controller;
+ buf_getzone[4] = zone/zones_per_controller;
+ buf_getzone[5] = zone%zones_per_controller;
+ buf_getzone[11] = zone%zones_per_controller;
buf_getzone[15] = (int) russChecksum (buf_getzone,17-2);
if (sendto(udpSocket, buf_getzone, 17, 0, (struct sockaddr *) &si_other, slen)==-1)
syslog(LOG_WARNING,"sendto failed!");
@@ -211,33 +195,13 @@
//block here until something is received from russound (it's turned off)
pthread_mutex_lock(&standbylock);
pthread_mutex_unlock(&standbylock);
- /* The whole stuff in RNET is a little different than it's written for the C5
- Zone and controller are set twice now, CA* understands the old, C5 not:
- 8.1.1 Set State
- Turn a specific Zone ON or OFF using a discrete message.
- Byte # 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
- Value F0 cc 00 7F cc zz kk 05 02 02 00 00 F1 23 00 ## 00 zz 00 01 xx F7
- cc = controller number -1
- zz = zone number -1
- kk = 0x70 (0x71 when connected to an ACA-E5).
- xx = checksum
- Byte #16 = 0x00 (off) or 0x01(on)
- */
+ //8.1.1 Set State
char buf_msg1[25] = { 0, 0, 0, 0x7F, 0, 0, keypadid, 0x05, 0x02, 0x02, 0, 0, 0xF1, 0x23, 0, 0, 0, 0, 0, 0x01, 0, 0xF7 };
buf_msg1[1] = controller;
buf_msg1[4] = controller;
buf_msg1[5] = zone;
buf_msg1[17] = zone;
- /* Same stuff here: 8.4.2 Set Bass
- Select the Bass level for a particular zone using a discrete message.
- Byte # 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
- Value F0 cc 00 7F cc zz kk 00 05 02 00 zz 00 00 00 00 00 01 00 01 00 ## xx F7
- cc = controller number -1
- zz = zone number -1
- kk = keypad id = 0x70 (0x71 when connected to an ACA-E5).
- xx = checksum
- Byte #22 = Bass level (0x00 = -10 ... 0x0A = Flat ... 0x14 = +10)
- */
+ // 8.4.2 Set Bass
char buf_msg2[25] = { 0, 0, 0, 0x7F, 0, 0, keypadid, 0, 0x05, 0x02, 0, 0, 0, 0, 0, 0, 0, 0x01, 0, 0x01, 0, 0, 0, 0xF7 };
buf_msg2[1] = controller;
buf_msg2[4] = controller;
@@ -246,7 +210,7 @@
switch (func) {
case -9: //all zones
- //FIXME: different on C5!
+ //FIXME: All on different on C5!
/* controller 0:
All On F0 7E 00 7F 00 00 71 05 02 02 00 00 F1 22 00 01 00 00 00 01 10 F7
All Off F0 7E 00 7F 00 00 71 05 02 02 00 00 F1 22 00 00 00 00 00 01 0F F7
@@ -350,7 +314,7 @@
syslog(LOG_WARNING,"sendrussfunc sendto failed!");
usleep(20*1000); //FIXME: throttle a little (20ms)
if (buf_msg1[0] || buf_msg2[0])
- sendrussPolling (zone+(controller*ZONES_PER_CONTROLLER)); //fire update of states
+ sendrussPolling (zone+(controller*zones_per_controller)); //fire update of states
return 0;
}
@@ -492,10 +456,10 @@
switch (buf[1] & 0xC0) {
case 0x00:
func = (dest - knxstartaddress)%256;
- zone = (func-10)/40;
- func = (func-10)%40;
+ zone = (func-10)/ga_per_zone;
+ func = (func-10)%ga_per_zone;
controller = (dest - knxstartaddress)/256;
- sendKNXresponse (dest,zone+(controller*ZONES_PER_CONTROLLER),func);
+ sendKNXresponse (dest,zone+(controller*zones_per_controller),func);
break;
case 0x40:
//FIXME: response dunno
@@ -507,8 +471,8 @@
else
val = buf[2];
func = (dest - knxstartaddress)%256;
- zone = (func-10)/40;
- func = (func-10)%40;
+ zone = (func-10)/ga_per_zone;
+ func = (func-10)%ga_per_zone;
controller = (dest - knxstartaddress)/256;
sendrussFunc(controller,zone,func,val);
}
@@ -557,7 +521,7 @@
syslog(LOG_WARNING, "eibd: Unknown APDU from %d to %d",src,dest);
break;
} else {
- if ( dest<knxstartaddress || dest > (knxstartaddress+(numzones/ZONES_PER_CONTROLLER*256)-1) ) //not for us
+ if ( dest<knxstartaddress || dest > (knxstartaddress+(numzones/zones_per_controller*256)-1) ) //not for us
continue;
handleKNXdgram(dest,buf,len);
}
@@ -572,72 +536,72 @@
void *updateZone(unsigned char num, unsigned char val, int func) {
syslog(LOG_DEBUG, "update Zone %d val %d func %d",num,val,func);
- int controller = num/ZONES_PER_CONTROLLER;
- int zone = num%ZONES_PER_CONTROLLER;
+ int controller = num/zones_per_controller;
+ int zone = num%zones_per_controller;
//lock mutex befor updating
pthread_mutex_lock (&zonelock);
switch (func) {
case 1:
zones[num].zonepower =val;
if (zones[num].inited || sendOnStart)
- sendKNXdgram (0x80,1,(knxstartaddress+30)+(zone*40)+(controller*256),val);
+ sendKNXdgram (0x80,1,(knxstartaddress+30)+(zone*ga_per_zone)+(controller*256),val);
break;
case 2:
zones[num].srcid =val;
if (zones[num].inited || sendOnStart)
- sendKNXdgram (0x80,51,(knxstartaddress+31)+(zone*40)+(controller*256),val);
+ sendKNXdgram (0x80,51,(knxstartaddress+31)+(zone*ga_per_zone)+(controller*256),val);
break;
case 3:
zones[num].volume =val;
if (zones[num].inited || sendOnStart)
- sendKNXdgram (0x80,5,(knxstartaddress+32)+(zone*40)+(controller*256),val*2);
+ sendKNXdgram (0x80,5,(knxstartaddress+32)+(zone*ga_per_zone)+(controller*256),val*2);
break;
case 4:
zones[num].bass =val;
if (zones[num].inited || sendOnStart) {
if (val<10)
- sendKNXdgram (0x80,51,(knxstartaddress+33)+(zone*40)+(controller*256),val-10+256);
+ sendKNXdgram (0x80,51,(knxstartaddress+33)+(zone*ga_per_zone)+(controller*256),val-10+256);
else
- sendKNXdgram (0x80,51,(knxstartaddress+33)+(zone*40)+(controller*256),val-10);
+ sendKNXdgram (0x80,51,(knxstartaddress+33)+(zone*ga_per_zone)+(controller*256),val-10);
}
break;
case 5:
zones[num].treble =val;
if (zones[num].inited || sendOnStart) {
if (val<10)
- sendKNXdgram (0x80,51,(knxstartaddress+34)+(zone*40)+(controller*256),val-10+256);
+ sendKNXdgram (0x80,51,(knxstartaddress+34)+(zone*ga_per_zone)+(controller*256),val-10+256);
else
- sendKNXdgram (0x80,51,(knxstartaddress+34)+(zone*40)+(controller*256),val-10);
+ sendKNXdgram (0x80,51,(knxstartaddress+34)+(zone*ga_per_zone)+(controller*256),val-10);
}
break;
case 6:
zones[num].loudness =val;
if (zones[num].inited || sendOnStart)
- sendKNXdgram (0x80,1,(knxstartaddress+35)+(zone*40)+(controller*256),val);
+ sendKNXdgram (0x80,1,(knxstartaddress+35)+(zone*ga_per_zone)+(controller*256),val);
break;
case 7:
zones[num].balance =val;
if (zones[num].inited || sendOnStart) {
if (val<10)
- sendKNXdgram (0x80,51,(knxstartaddress+36)+(zone*40)+(controller*256),val-10+256);
+ sendKNXdgram (0x80,51,(knxstartaddress+36)+(zone*ga_per_zone)+(controller*256),val-10+256);
else
- sendKNXdgram (0x80,51,(knxstartaddress+36)+(zone*40)+(controller*256),val-10);
+ sendKNXdgram (0x80,51,(knxstartaddress+36)+(zone*ga_per_zone)+(controller*256),val-10);
}
break;
case 8:
zones[num].partymode =val;
if (zones[num].inited || sendOnStart)
- sendKNXdgram (0x80,1,(knxstartaddress+37)+(zone*40)+(controller*256),val);
+ sendKNXdgram (0x80,1,(knxstartaddress+37)+(zone*ga_per_zone)+(controller*256),val);
break;
case 9:
zones[num].dnd =val;
if (zones[num].inited || sendOnStart)
- sendKNXdgram (0x80,1,(knxstartaddress+38)+(zone*40)+(controller*256),val);
+ sendKNXdgram (0x80,1,(knxstartaddress+38)+(zone*ga_per_zone)+(controller*256),val);
break;
case 10:
zones[num].onvolume =val;
if (zones[num].inited || sendOnStart)
- sendKNXdgram (0x80,5,(knxstartaddress+39)+(zone*40)+(controller*256),val*2);
+ sendKNXdgram (0x80,5,(knxstartaddress+39)+(zone*ga_per_zone)+(controller*256),val*2);
break;
default:
break;
@@ -651,7 +615,7 @@
if ((len==34) && (buf[0]==0xF0) && (buf[9]==0x04)) { //zone-status
syslog(LOG_DEBUG,"russ Controller:%d Zone:%d Status:%d src:%d vol:%d bass:%d treb:%d loud:%d bal:%d sys:%d shrsrc:%d party:%d,DnD:%d\n",
buf[4],buf[12],buf[20],buf[21],buf[22],buf[23],buf[24],buf[25],buf[26],buf[27],buf[28],buf[29],buf[30]);
- buf[12] = (buf[4]*ZONES_PER_CONTROLLER)+buf[12]; //controller + zonenumber
+ buf[12] = (buf[4]*zones_per_controller)+buf[12]; //controller + zonenumber
if (buf[20] != zones[buf[12]].zonepower || (sendOnStart && !zones[buf[12]].inited))
updateZone(buf[12],buf[20],1);
@@ -673,10 +637,10 @@
updateZone(buf[12],buf[30],9);
zones[buf[12]].inited = 1;
} else if ((len==24) && (buf[0]==0xF0) && (buf[9]==0x05) && (buf[13]==0x00)) { //zone turn-on volume
- //FIXME: this *might* be wrong andf trigger also on other msgs, as it's written otherwise in the docs, the checked bytes are just a guess!
+ //FIXME: this *might* be wrong and trigger also on other msgs, as it's written otherwise in the docs, the checked bytes are just a guess!
syslog(LOG_DEBUG,"russ Controller:%d Zone:%d TurnOnVolume:%d",
buf[4],buf[12],buf[21]);
- buf[12] = (buf[4]*ZONES_PER_CONTROLLER)+buf[12]; //controller + zonenumber
+ buf[12] = (buf[4]*zones_per_controller)+buf[12]; //controller + zonenumber
if (buf[21] != zones[buf[12]].onvolume || (sendOnStart && !zones[buf[12]].inited))
updateZone(buf[12],buf[21],10);
} else if ((len==23) && (buf[0]==0xF0) && (buf[7]==0x05)) { //FIXME: C5 sends this periodically
@@ -847,6 +811,20 @@
break;
case 'z':
numzones = atoi(optarg);
+ if (numzones < 6)
+ numzones = 6; //Quirk for CA4, we just use 6
+ if (numzones%6 == 0) {
+ zones_per_controller = 6;
+ ga_per_zone = 40;
+ }
+ else if (numzones%8 == 0) {
+ zones_per_controller = 8;
+ ga_per_zone = 30;
+ }
+ else {
+ fprintf (stderr, "Illegal number of zones: %d \nUsage: %s %s", numzones, argv[0], USAGESTRING);
+ return 1;
+ }
break;
case 'u':
eibd_url = optarg;
@@ -871,8 +849,8 @@
if (!daemonize) {
setlogmask(LOG_UPTO(LOG_DEBUG));
openlog(DAEMON_NAME, LOG_CONS | LOG_NDELAY | LOG_PERROR | LOG_PID, LOG_USER);
- syslog(LOG_DEBUG, "startup with debug; Russ-IP: %s:%d, listenport %d, pidfile: %s, start address: %d, number of zones: %d, eibd: %s SendonStartup: %d KeypadID: %li",
- russipaddr, russport, listenport, pidfilename, knxstartaddress, numzones, eibd_url, sendOnStart, keypadid);
+ syslog(LOG_DEBUG, "startup with debug; Russ-IP: %s:%d, listenport %d, pidfile: %s, start address: %d, number of zones/per controller/GAs: %d/%d/%d, eibd: %s SendonStartup: %d KeypadID: %li",
+ russipaddr, russport, listenport, pidfilename, knxstartaddress, numzones, zones_per_controller, ga_per_zone, eibd_url, sendOnStart, keypadid);
} else {
setlogmask(LOG_UPTO(LOG_INFO));
openlog(DAEMON_NAME, LOG_CONS, LOG_USER);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2013-02-18 17:37:24
|
Revision: 1504
http://openautomation.svn.sourceforge.net/openautomation/?rev=1504&view=rev
Author: makki1
Date: 2013-02-18 17:37:11 +0000 (Mon, 18 Feb 2013)
Log Message:
-----------
fix status-updates on multiple controllers, improve debug-msgs
Modified Paths:
--------------
tools/russconnectd/trunk/configure.ac
tools/russconnectd/trunk/debian/changelog
tools/russconnectd/trunk/debian/files
tools/russconnectd/trunk/debian/russconnectd.postinst
tools/russconnectd/trunk/src/main.c
Modified: tools/russconnectd/trunk/configure.ac
===================================================================
--- tools/russconnectd/trunk/configure.ac 2013-02-18 16:29:18 UTC (rev 1503)
+++ tools/russconnectd/trunk/configure.ac 2013-02-18 17:37:11 UTC (rev 1504)
@@ -1,7 +1,7 @@
dnl Process this file with autoconf to produce a configure script.
dnl Created by Anjuta application wizard.
-AC_INIT(russconnectd, 0.31, de...@wi..., , http://openautomation.sourceforge.net)
+AC_INIT(russconnectd, 0.32, de...@wi..., , http://openautomation.sourceforge.net)
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION)
Modified: tools/russconnectd/trunk/debian/changelog
===================================================================
--- tools/russconnectd/trunk/debian/changelog 2013-02-18 16:29:18 UTC (rev 1503)
+++ tools/russconnectd/trunk/debian/changelog 2013-02-18 17:37:11 UTC (rev 1504)
@@ -1,3 +1,15 @@
+russconnectd (0.32-1) lenny; urgency=low
+
+ * upstream version fixed multi-ctrl-bug, improved debugging
+
+ -- Michael Markstaller <de...@wi...> Mon, 18 Feb 2013 18:29:34 +0100
+
+russconnectd (0.31-2) lenny; urgency=low
+
+ * increase delay
+
+ -- Michael Markstaller <de...@wi...> Thu, 14 Feb 2013 21:14:01 +0100
+
russconnectd (0.31-1) lenny; urgency=low
* make zones more flexible, support 8 Zones on C5
Modified: tools/russconnectd/trunk/debian/files
===================================================================
--- tools/russconnectd/trunk/debian/files 2013-02-18 16:29:18 UTC (rev 1503)
+++ tools/russconnectd/trunk/debian/files 2013-02-18 17:37:11 UTC (rev 1504)
@@ -1 +1 @@
-russconnectd_0.31-1_i386.deb unknown extra
+russconnectd_0.32-1_i386.deb unknown extra
Modified: tools/russconnectd/trunk/debian/russconnectd.postinst
===================================================================
--- tools/russconnectd/trunk/debian/russconnectd.postinst 2013-02-18 16:29:18 UTC (rev 1503)
+++ tools/russconnectd/trunk/debian/russconnectd.postinst 2013-02-18 17:37:11 UTC (rev 1504)
@@ -7,4 +7,5 @@
}
do_monit
+/etc/init.d/russconnectd restart
Modified: tools/russconnectd/trunk/src/main.c
===================================================================
--- tools/russconnectd/trunk/src/main.c 2013-02-18 16:29:18 UTC (rev 1503)
+++ tools/russconnectd/trunk/src/main.c 2013-02-18 17:37:11 UTC (rev 1504)
@@ -159,7 +159,7 @@
buf_devreset[19] = (int) russChecksum (buf_devreset,21-2);
if (sendto(udpSocket, buf_devreset, 21, 0, (struct sockaddr *) &si_other, slen)==-1)
syslog(LOG_WARNING,"sendto failed!");
- usleep(20*1000); //FIXME: throttle a little
+ usleep(50*1000); //FIXME: throttle a little
}
//Get Poweron-Volume 8.8.3 Get Turn On Volume
@@ -171,7 +171,7 @@
buf_onvol[16] = (int) russChecksum (buf_onvol,18-2);
if (sendto(udpSocket, buf_onvol, 18, 0, (struct sockaddr *) &si_other, slen)==-1)
syslog(LOG_WARNING,"sendto failed!");
- usleep(20*1000); //FIXME: throttle a little (20ms)
+ usleep(50*1000); //FIXME: throttle a little (50ms)
//Get zonestate in once
char buf_getzone[25] = { 0xF0, 0, 0, 0x7F, 0, 0, keypadid, 0x01, 0x04, 0x02, 0, 0, 0x07, 0, 0, 0, 0xF7 };
@@ -312,7 +312,7 @@
if (buf_msg2[0])
if (sendto(udpSocket, buf_msg2, 24, 0, (struct sockaddr *) &si_other, slen)==-1)
syslog(LOG_WARNING,"sendrussfunc sendto failed!");
- usleep(20*1000); //FIXME: throttle a little (20ms)
+ usleep(50*1000); //FIXME: throttle a little (50ms)
if (buf_msg1[0] || buf_msg2[0])
sendrussPolling (zone+(controller*zones_per_controller)); //fire update of states
return 0;
@@ -323,7 +323,7 @@
EIBConnection *con;
unsigned char buf[255] = { 0, 0x80 };
buf[1] = type; //0x40 response, 0x80 write
- syslog(LOG_DEBUG,"Send KNX dgram Type %d DPT %d dest %d val %d",type,dpt,dest,val);
+ syslog(LOG_DEBUG,"Send KNX dgram Type %d DPT %d dest %d/%d/%d val %d",type,dpt,(dest >> 11) & 0x1f, (dest >> 8) & 0x07, dest & 0xff,val);
con = EIBSocketURL (eibd_url);
if (!con)
syslog(LOG_WARNING,"sendknxdgram: Open failed");
@@ -396,7 +396,7 @@
void *sendKNXresponse(eibaddr_t dest, int zone, int func) {
- syslog(LOG_DEBUG, "KNX response %d zone %d func %d", dest,zone,func);
+ syslog(LOG_DEBUG, "KNX response %d/%d/%d zone %d func %d", (dest >> 11) & 0x1f, (dest >> 8) & 0x07, dest & 0xff,zone,func);
pthread_mutex_lock (&zonelock);
switch (func) {
case 0:
@@ -518,7 +518,7 @@
break;
}
if (buf[0] & 0x3 || (buf[1] & 0xC0) == 0xC0) {
- syslog(LOG_WARNING, "eibd: Unknown APDU from %d to %d",src,dest);
+ syslog(LOG_WARNING, "eibd: Unknown APDU from %d to %d/%d/%d",src,(dest >> 11) & 0x1f, (dest >> 8) & 0x07, dest & 0xff);
break;
} else {
if ( dest<knxstartaddress || dest > (knxstartaddress+(numzones/zones_per_controller*256)-1) ) //not for us
@@ -612,32 +612,36 @@
void *parseRussMsg(unsigned char* buf, int len) {
int i;
- if ((len==34) && (buf[0]==0xF0) && (buf[9]==0x04)) { //zone-status
- syslog(LOG_DEBUG,"russ Controller:%d Zone:%d Status:%d src:%d vol:%d bass:%d treb:%d loud:%d bal:%d sys:%d shrsrc:%d party:%d,DnD:%d\n",
+ if ((len==34) && (buf[0]==0xF0) && (buf[9]==0x04)) { //zone-status
+ syslog(LOG_DEBUG,"russ Controller:%d Zone:%d Status:%d src:%d vol:%d bass:%d treb:%d loud:%d bal:%d sys:%d shrsrc:%d party:%d,DnD:%d\n",
buf[4],buf[12],buf[20],buf[21],buf[22],buf[23],buf[24],buf[25],buf[26],buf[27],buf[28],buf[29],buf[30]);
- buf[12] = (buf[4]*zones_per_controller)+buf[12]; //controller + zonenumber
+ //buf[12] = (buf[4]*zones_per_controller)+buf[12]; //controller + zonenumber
+ int controller = buf[4];
+ int zone = buf[12];
+ int localzone = zone + (controller * zones_per_controller);
- if (buf[20] != zones[buf[12]].zonepower || (sendOnStart && !zones[buf[12]].inited))
- updateZone(buf[12],buf[20],1);
- if (buf[21] != zones[buf[12]].srcid || (sendOnStart && !zones[buf[12]].inited))
- updateZone(buf[12],buf[21],2);
- if (buf[22] != zones[buf[12]].volume || (sendOnStart && !zones[buf[12]].inited))
- updateZone(buf[12],buf[22],3);
- if (buf[23] != zones[buf[12]].bass || (sendOnStart && !zones[buf[12]].inited))
- updateZone(buf[12],buf[23],4);
- if (buf[24] != zones[buf[12]].treble || (sendOnStart && !zones[buf[12]].inited))
- updateZone(buf[12],buf[24],5);
- if (buf[25] != zones[buf[12]].loudness || (sendOnStart && !zones[buf[12]].inited))
- updateZone(buf[12],buf[25],6);
- if (buf[26] != zones[buf[12]].balance || (sendOnStart && !zones[buf[12]].inited))
- updateZone(buf[12],buf[26],7);
- if (buf[29] != zones[buf[12]].partymode || (sendOnStart && !zones[buf[12]].inited))
- updateZone(buf[12],buf[29],8);
- if (buf[30] != zones[buf[12]].dnd || (sendOnStart && !zones[buf[12]].inited))
- updateZone(buf[12],buf[30],9);
- zones[buf[12]].inited = 1;
+ if (buf[20] != zones[localzone].zonepower || (sendOnStart && !zones[localzone].inited))
+ updateZone(localzone,buf[20],1);
+ if (buf[21] != zones[localzone].srcid || (sendOnStart && !zones[localzone].inited))
+ updateZone(localzone,buf[21],2);
+ if (buf[22] != zones[localzone].volume || (sendOnStart && !zones[localzone].inited))
+ updateZone(localzone,buf[22],3);
+ if (buf[23] != zones[localzone].bass || (sendOnStart && !zones[localzone].inited))
+ updateZone(localzone,buf[23],4);
+ if (buf[24] != zones[localzone].treble || (sendOnStart && !zones[localzone].inited))
+ updateZone(localzone,buf[24],5);
+ if (buf[25] != zones[localzone].loudness || (sendOnStart && !zones[localzone].inited))
+ updateZone(localzone,buf[25],6);
+ if (buf[26] != zones[localzone].balance || (sendOnStart && !zones[localzone].inited))
+ updateZone(localzone,buf[26],7);
+ if (buf[29] != zones[localzone].partymode || (sendOnStart && !zones[localzone].inited))
+ updateZone(localzone,buf[29],8);
+ if (buf[30] != zones[localzone].dnd || (sendOnStart && !zones[localzone].inited))
+ updateZone(localzone,buf[30],9);
+ zones[localzone].inited = 1;
} else if ((len==24) && (buf[0]==0xF0) && (buf[9]==0x05) && (buf[13]==0x00)) { //zone turn-on volume
//FIXME: this *might* be wrong and trigger also on other msgs, as it's written otherwise in the docs, the checked bytes are just a guess!
+ //FIXME: this *is* wrong and could be made more readable, see above if
syslog(LOG_DEBUG,"russ Controller:%d Zone:%d TurnOnVolume:%d",
buf[4],buf[12],buf[21]);
buf[12] = (buf[4]*zones_per_controller)+buf[12]; //controller + zonenumber
@@ -645,6 +649,9 @@
updateZone(buf[12],buf[21],10);
} else if ((len==23) && (buf[0]==0xF0) && (buf[7]==0x05)) { //FIXME: C5 sends this periodically
printf(" not parsed yet, len: %d ",len);
+ for (i=0; i<len; i++)
+ printf("0x%02X ",buf[i]);
+ printf("\n");
} else {
//FIXME: just for debugging
//for (i=0; i<len; i++)
@@ -849,8 +856,8 @@
if (!daemonize) {
setlogmask(LOG_UPTO(LOG_DEBUG));
openlog(DAEMON_NAME, LOG_CONS | LOG_NDELAY | LOG_PERROR | LOG_PID, LOG_USER);
- syslog(LOG_DEBUG, "startup with debug; Russ-IP: %s:%d, listenport %d, pidfile: %s, start address: %d, number of zones/per controller/GAs: %d/%d/%d, eibd: %s SendonStartup: %d KeypadID: %li",
- russipaddr, russport, listenport, pidfilename, knxstartaddress, numzones, zones_per_controller, ga_per_zone, eibd_url, sendOnStart, keypadid);
+ syslog(LOG_DEBUG, "startup with debug; Russ-IP: %s:%d, listenport %d, pidfile: %s, start address: %d/%d/%d, number of zones/per controller/GAs: %d/%d/%d, eibd: %s SendonStartup: %d KeypadID: %li",
+ russipaddr, russport, listenport, pidfilename, (knxstartaddress >> 11) & 0x1f, (knxstartaddress >> 8) & 0x07, knxstartaddress & 0xff, numzones, zones_per_controller, ga_per_zone, eibd_url, sendOnStart, keypadid);
} else {
setlogmask(LOG_UPTO(LOG_INFO));
openlog(DAEMON_NAME, LOG_CONS, LOG_USER);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2014-01-13 20:18:09
|
Revision: 2041
http://sourceforge.net/p/openautomation/code/2041
Author: makki1
Date: 2014-01-13 20:18:04 +0000 (Mon, 13 Jan 2014)
Log Message:
-----------
russconnectd pending updates and fixes (see changelog)
Modified Paths:
--------------
tools/russconnectd/trunk/ChangeLog
tools/russconnectd/trunk/configure.ac
tools/russconnectd/trunk/debian/changelog
tools/russconnectd/trunk/debian/files
tools/russconnectd/trunk/src/Makefile.am
tools/russconnectd/trunk/src/main.c
Modified: tools/russconnectd/trunk/ChangeLog
===================================================================
--- tools/russconnectd/trunk/ChangeLog 2013-12-12 15:46:30 UTC (rev 2040)
+++ tools/russconnectd/trunk/ChangeLog 2014-01-13 20:18:04 UTC (rev 2041)
@@ -1,3 +1,16 @@
+*** 0.34 - 2014-01-12
+- Remove (incomplete) standbylock-Mutex in sendRussPolling, thanks to Matthias@knxuf
+ This is useless until direct serial gets fully implemented.
+
+*** 0.33 - 2012-06-15
+- SetAllZonesPower repeat once as it's not 100% reliable (anymore?)
+
+*** 0.32 - 2012-02-18
+- C5 works
+- multiple-controllers fix
+- improved debugging
+- increase delay
+
*** trunk - 2011-12-28
- WiP - not yet done: C3-support - (maybe also needed for C5/E5) send Device restart event to start RNet-communication
- Fix cfgmaker for CometVisu, adjust to new infotrigger
Modified: tools/russconnectd/trunk/configure.ac
===================================================================
--- tools/russconnectd/trunk/configure.ac 2013-12-12 15:46:30 UTC (rev 2040)
+++ tools/russconnectd/trunk/configure.ac 2014-01-13 20:18:04 UTC (rev 2041)
@@ -1,7 +1,7 @@
dnl Process this file with autoconf to produce a configure script.
dnl Created by Anjuta application wizard.
-AC_INIT(russconnectd, 0.32, de...@wi..., , http://openautomation.sourceforge.net)
+AC_INIT(russconnectd, 0.34, mi...@ma..., , http://openautomation.sourceforge.net)
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION)
Modified: tools/russconnectd/trunk/debian/changelog
===================================================================
--- tools/russconnectd/trunk/debian/changelog 2013-12-12 15:46:30 UTC (rev 2040)
+++ tools/russconnectd/trunk/debian/changelog 2014-01-13 20:18:04 UTC (rev 2041)
@@ -1,5 +1,17 @@
-russconnectd (0.32-1) lenny; urgency=low
+russconnectd (0.34-1) lenny; urgency=low
+ * Fix standbylock
+
+ -- Michael Markstaller <mi...@ma...> Mon, 13 Jan 2014 20:49:47 +0100
+
+russconnectd (0.33-1) lenny; urgency=low
+
+ * repeat SetAllZonesPower
+
+ -- Michael Markstaller <de...@wi...> Sat, 15 Jun 2013 11:44:04 +0200
+
+russconnectd (0.32-2) lenny; urgency=low
+
* upstream version fixed multi-ctrl-bug, improved debugging
-- Michael Markstaller <de...@wi...> Mon, 18 Feb 2013 18:29:34 +0100
Modified: tools/russconnectd/trunk/debian/files
===================================================================
--- tools/russconnectd/trunk/debian/files 2013-12-12 15:46:30 UTC (rev 2040)
+++ tools/russconnectd/trunk/debian/files 2014-01-13 20:18:04 UTC (rev 2041)
@@ -1 +1 @@
-russconnectd_0.32-1_i386.deb unknown extra
+russconnectd_0.34-1_i386.deb unknown extra
Modified: tools/russconnectd/trunk/src/Makefile.am
===================================================================
--- tools/russconnectd/trunk/src/Makefile.am 2013-12-12 15:46:30 UTC (rev 2040)
+++ tools/russconnectd/trunk/src/Makefile.am 2014-01-13 20:18:04 UTC (rev 2041)
@@ -10,6 +10,7 @@
AM_CFLAGS =\
-Wall\
-g\
+ -std=gnu99\
-lpthread -leibclient
bin_PROGRAMS = russconnectd
Modified: tools/russconnectd/trunk/src/main.c
===================================================================
--- tools/russconnectd/trunk/src/main.c 2013-12-12 15:46:30 UTC (rev 2040)
+++ tools/russconnectd/trunk/src/main.c 2014-01-13 20:18:04 UTC (rev 2041)
@@ -149,7 +149,10 @@
void *sendrussPolling(unsigned char zone) {
syslog(LOG_DEBUG, "polling zone %d",zone);
+ /* useless/unfinished! if used we need to unlock the mutex afterwards but with current, UDP-based datagrams it's not nescessary
+ as the bytes cannot get mixed up on output..
pthread_mutex_trylock(&standbylock);
+ */
//Send device reset-event to wakeup (at least) E5 *NOT* C3/C5! - untested and most likely useless
if (keypadid == 0x71) {
@@ -195,6 +198,7 @@
//block here until something is received from russound (it's turned off)
pthread_mutex_lock(&standbylock);
pthread_mutex_unlock(&standbylock);
+
//8.1.1 Set State
char buf_msg1[25] = { 0, 0, 0, 0x7F, 0, 0, keypadid, 0x05, 0x02, 0x02, 0, 0, 0xF1, 0x23, 0, 0, 0, 0, 0, 0x01, 0, 0xF7 };
buf_msg1[1] = controller;
@@ -220,6 +224,13 @@
buf_msg1[1] = 0x7E;
buf_msg1[13] = 0x22;
buf_msg1[16] = val;
+ //FIXME: SetAllZonesPower(Off) doesn't work 100% reliable!
+ //FIXME: Send to all controllers, not only the first (though this worked fine for ages before!)
+ //Quirk: send to all zones as single command
+ for (int i=0;i<numzones;i++) { //call myself recursive.. maybe bad..
+ zones[i].inited = 0; //de-init state to force sending updates as we sometimes miss them here
+ sendrussFunc(zone/zones_per_controller,zone%zones_per_controller,0,val);
+ }
break;
case 0: //power
buf_msg1[0] = 0xF0;
@@ -308,13 +319,18 @@
if (buf_msg1[0])
if (sendto(udpSocket, buf_msg1, 22, 0, (struct sockaddr *) &si_other, slen)==-1)
- syslog(LOG_WARNING,"sendrussfunc sendto failed!");
+ syslog(LOG_WARNING,"sendrussfunc1 sendto failed!");
+
if (buf_msg2[0])
if (sendto(udpSocket, buf_msg2, 24, 0, (struct sockaddr *) &si_other, slen)==-1)
- syslog(LOG_WARNING,"sendrussfunc sendto failed!");
+ syslog(LOG_WARNING,"sendrussfunc2 sendto failed!");
usleep(50*1000); //FIXME: throttle a little (50ms)
- if (buf_msg1[0] || buf_msg2[0])
+ if ((buf_msg1[0] || buf_msg2[0]) && func > -1)
sendrussPolling (zone+(controller*zones_per_controller)); //fire update of states
+ else if ((buf_msg1[0] || buf_msg2[0]) && func < 0)
+ for (int i=0;i<numzones;i++)
+ sendrussPolling (i); //fire update of ALL states
+
return 0;
}
@@ -613,7 +629,7 @@
void *parseRussMsg(unsigned char* buf, int len) {
int i;
if ((len==34) && (buf[0]==0xF0) && (buf[9]==0x04)) { //zone-status
- syslog(LOG_DEBUG,"russ Controller:%d Zone:%d Status:%d src:%d vol:%d bass:%d treb:%d loud:%d bal:%d sys:%d shrsrc:%d party:%d,DnD:%d\n",
+ syslog(LOG_DEBUG,"msg34 russ Controller:%d Zone:%d Status:%d src:%d vol:%d bass:%d treb:%d loud:%d bal:%d sys:%d shrsrc:%d party:%d,DnD:%d\n",
buf[4],buf[12],buf[20],buf[21],buf[22],buf[23],buf[24],buf[25],buf[26],buf[27],buf[28],buf[29],buf[30]);
//buf[12] = (buf[4]*zones_per_controller)+buf[12]; //controller + zonenumber
int controller = buf[4];
@@ -642,24 +658,39 @@
} else if ((len==24) && (buf[0]==0xF0) && (buf[9]==0x05) && (buf[13]==0x00)) { //zone turn-on volume
//FIXME: this *might* be wrong and trigger also on other msgs, as it's written otherwise in the docs, the checked bytes are just a guess!
//FIXME: this *is* wrong and could be made more readable, see above if
- syslog(LOG_DEBUG,"russ Controller:%d Zone:%d TurnOnVolume:%d",
+ syslog(LOG_DEBUG,"msg24 russ Controller:%d Zone:%d TurnOnVolume:%d",
buf[4],buf[12],buf[21]);
buf[12] = (buf[4]*zones_per_controller)+buf[12]; //controller + zonenumber
if (buf[21] != zones[buf[12]].onvolume || (sendOnStart && !zones[buf[12]].inited))
updateZone(buf[12],buf[21],10);
- } else if ((len==23) && (buf[0]==0xF0) && (buf[7]==0x05)) { //FIXME: C5 sends this periodically
- printf(" not parsed yet, len: %d ",len);
- for (i=0; i<len; i++)
- printf("0x%02X ",buf[i]);
- printf("\n");
} else {
//FIXME: just for debugging
- //for (i=0; i<len; i++)
- // printf("%d:0x%02X ",i,buf[i]);
- printf(" unknown len: %d ",len);
+ //Above is pretty weird & guessed somewhat.. after 0.33 we understand better..
+ printf("unknown len: %d ",len);
for (i=0; i<len; i++)
printf("0x%02X ",buf[i]);
printf("\n");
+ for (i=0; i<len; i++)
+ printf("%d:0x%02X ",i,buf[i]);
+ printf("\n");
+ if (buf[0] == 0xF0) {
+ //target Special Controller IDs: 0x7F - Message should be processed by all keypads/display devices
+ //comes as 0/0/7F 17/18 byte
+ printf("RNET: Target C/Z/K %X/%X/%X, Source C/Z/K %X/%X/%X, Type: %X" , buf[1],buf[2],buf[3],buf[4],buf[5],buf[6], buf[7]);
+ switch (buf[7]) {
+ case 0: printf("(Set Data) "); break;
+ case 1:
+ printf("(Req Data) ");
+ //len17 - buf[8] 4=Volume?
+ break;
+ case 2: printf("(Handshake) "); break;
+ case 5: printf("(Event) "); break;
+ case 6: printf("(Display Msg) "); break;
+ }
+ for (i=8; i<len-2; i++)
+ printf("%d:0x%02X ",i,buf[i]);
+ printf("\n\n");
+ }
}
return 0;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|