[zaptel-commits] tzafrir: branch 1.2 r3643 - in /branches/1.2/xpp: ./ utils/ utils/zconf/ util...

SVN commits to the Zaptel project zaptel-commits at lists.digium.com
Thu Jan 10 12:12:28 CST 2008


Author: tzafrir
Date: Thu Jan 10 12:12:27 2008
New Revision: 3643

URL: http://svn.digium.com/view/zaptel?view=rev&rev=3643
Log:
xpp.r5254:
* Improved polarity reversal hangups in FXO (r5194).
  Fixed false detection of polarity reversals.
* Optimize xframe allocation, by not zeroing the whole
  memory (in get_xframe()).
* Fixed erronous error message that appeared sometimes
  from fpga_load during USB renumeration.
* Zaptel::Chans now provides battery() reporting for some FXO
  channels (Astribank FXO and wcfxo).

Added:
    branches/1.2/xpp/Kbuild
      - copied, changed from r3642, branches/1.2/xpp/Makefile
    branches/1.2/xpp/utils/zconf/Zaptel/Xpp/Line.pm   (with props)
Removed:
    branches/1.2/xpp/Makefile
Modified:
    branches/1.2/xpp/.version
    branches/1.2/xpp/Changelog_xpp
    branches/1.2/xpp/README.Astribank
    branches/1.2/xpp/card_bri.c
    branches/1.2/xpp/card_fxo.c
    branches/1.2/xpp/card_global.c
    branches/1.2/xpp/card_pri.c
    branches/1.2/xpp/init_card_9_29
    branches/1.2/xpp/utils/Makefile
    branches/1.2/xpp/utils/astribank_hook
    branches/1.2/xpp/utils/fpga_load.c
    branches/1.2/xpp/utils/lszaptel
    branches/1.2/xpp/utils/zapconf
    branches/1.2/xpp/utils/zaptel_hardware
    branches/1.2/xpp/utils/zconf/Zaptel.pm
    branches/1.2/xpp/utils/zconf/Zaptel/Chans.pm
    branches/1.2/xpp/utils/zconf/Zaptel/Config/Defaults.pm
    branches/1.2/xpp/utils/zconf/Zaptel/Hardware/PCI.pm
    branches/1.2/xpp/utils/zconf/Zaptel/Span.pm
    branches/1.2/xpp/utils/zconf/Zaptel/Xpp/Xpd.pm
    branches/1.2/xpp/xbus-core.c
    branches/1.2/xpp/xbus-pcm.c
    branches/1.2/xpp/xdefs.h
    branches/1.2/xpp/xframe_queue.c
    branches/1.2/xpp/xpd.h
    branches/1.2/xpp/xpp_usb.c
    branches/1.2/xpp/xpp_zap.c
    branches/1.2/xpp/xproto.c
    branches/1.2/xpp/xproto.h
    branches/1.2/xpp/zap_debug.c
    branches/1.2/xpp/zap_debug.h

Modified: branches/1.2/xpp/.version
URL: http://svn.digium.com/view/zaptel/branches/1.2/xpp/.version?view=diff&rev=3643&r1=3642&r2=3643
==============================================================================
--- branches/1.2/xpp/.version (original)
+++ branches/1.2/xpp/.version Thu Jan 10 12:12:27 2008
@@ -1,1 +1,1 @@
-trunk-r5178
+trunk-r5254

Modified: branches/1.2/xpp/Changelog_xpp
URL: http://svn.digium.com/view/zaptel/branches/1.2/xpp/Changelog_xpp?view=diff&rev=3643&r1=3642&r2=3643
==============================================================================
--- branches/1.2/xpp/Changelog_xpp (original)
+++ branches/1.2/xpp/Changelog_xpp Thu Jan 10 12:12:27 2008
@@ -1,4 +1,14 @@
-Mon Dec 24 2007 Tzafrir Cohen <tzafrir.cohen at xorcom.com> - xpp.r5178
+Thu Jan 10 2008 Oron Peled <oron.peled at xorcom.com> - xpp.r5254
+  * Improved polarity reversal hangups in FXO (r5194).
+    Fixed false detection of polarity reversals.
+  * Optimize xframe allocation, by not zeroing the whole
+    memory (in get_xframe()).
+  * Fixed erronous error message that appeared sometimes
+    from fpga_load during USB renumeration.
+  * Zaptel::Chans now provides battery() reporting for some FXO
+    channels (Astribank FXO and wcfxo).
+
+Tue Dec 25 2007 Tzafrir Cohen <tzafrir.cohen at xorcom.com> - xpp.r5179
   * xpd_pri: Basically ready.
   * PCM synchronization changes:
     - Each Astribank unit ticks independently. Each with its own PLL.

Copied: branches/1.2/xpp/Kbuild (from r3642, branches/1.2/xpp/Makefile)
URL: http://svn.digium.com/view/zaptel/branches/1.2/xpp/Kbuild?view=diff&rev=3643&p1=branches/1.2/xpp/Makefile&r1=3642&p2=branches/1.2/xpp/Kbuild&r2=3643
==============================================================================
--- branches/1.2/xpp/Makefile (original)
+++ branches/1.2/xpp/Kbuild Thu Jan 10 12:12:27 2008
@@ -30,7 +30,7 @@
 obj-m		+= xpd_bri.o
 endif
 
-xpp-y		+= xbus-core.o xbus-sysfs.o xbus-pcm.o xframe_queue.o xpp_zap.o xproto.o card_global.o
+xpp-y		+= xbus-core.o xbus-sysfs.o xbus-pcm.o xframe_queue.o xpp_zap.o xproto.o card_global.o zap_debug.o
 xpd_fxs-y	+= card_fxs.o
 xpd_fxo-y	+= card_fxo.o
 xpd_bri-y	+= card_bri.o
@@ -40,9 +40,6 @@
 EXTRA_CFLAGS	+= -DDEBUG_SYNC_PARPORT
 obj-m		+= parport_debug.o
 endif
-
-ctags:
-	ctags *.[ch]
 
 # Handle versioning
 XPP_VERSION_STR	?= $(shell if [ -r $(obj)/.version ]; then echo "\"`cat $(obj)/.version`\""; else echo '"Unknown"'; fi)

Modified: branches/1.2/xpp/README.Astribank
URL: http://svn.digium.com/view/zaptel/branches/1.2/xpp/README.Astribank?view=diff&rev=3643&r1=3642&r2=3643
==============================================================================
--- branches/1.2/xpp/README.Astribank (original)
+++ branches/1.2/xpp/README.Astribank Thu Jan 10 12:12:27 2008
@@ -821,8 +821,8 @@
 On each time an Astribank is initialized or destroyed a udev event is
 generated. The rules from our sample udev rules file (xpp/utils/xpp.rules) 
 make that event run the script /usr/share/zaptel/astribank_hook with the
-parameter 'add' or 'remove'. Currently this script will just adjust the
-Astribank sync settings (by running xpp_sync). 
+parameter 'add' or 'remove', if such script exists. An example script
+that just adjusts the Astribank sync settings is included in xpp/utils. 
 
 
 Registering in Zaptel

Modified: branches/1.2/xpp/card_bri.c
URL: http://svn.digium.com/view/zaptel/branches/1.2/xpp/card_bri.c?view=diff&rev=3643&r1=3642&r2=3643
==============================================================================
--- branches/1.2/xpp/card_bri.c (original)
+++ branches/1.2/xpp/card_bri.c Thu Jan 10 12:12:27 2008
@@ -151,7 +151,11 @@
 				)
 #define	BRI_BCHAN_SIGCAP	ZT_SIG_CLEAR
 
-#define	IS_NT(xpd)	((xpd)->type == XPD_TYPE_BRI_NT)
+#define	IS_NT(xpd)		((xpd)->type == XPD_TYPE_BRI_NT)
+
+/* shift in PCM highway */
+#define	SUBUNIT_PCM_SHIFT	4
+#define	PCM_SHIFT(mask, sunit)	((mask) << (SUBUNIT_PCM_SHIFT * (sunit)))
 
 /*---------------- BRI Protocol Commands ----------------------------------*/
 
@@ -723,7 +727,7 @@
 		for(i = 0; i < MAX_SUBUNIT; i++) {
 			xpd_t	*sub_xpd = xpd_byaddr(xbus, xpd->addr.unit, i);
 			if(sub_xpd) {
-				tmp_pcm_mask |= (sub_xpd->wanted_pcm_mask << (SUBUNIT_PCM_SHIFT * i));
+				tmp_pcm_mask |= PCM_SHIFT(sub_xpd->wanted_pcm_mask, i);
 				line_count += 2;
 			}
 		}
@@ -1077,7 +1081,7 @@
 				pcm += ZT_CHUNKSIZE;
 			}
 		}
-		pcm_mask |= (wanted_lines << SUBUNIT_PCM_SHIFT * subunit);
+		pcm_mask |= PCM_SHIFT(wanted_lines, subunit);
 		XPD_COUNTER(tmp_xpd, PCM_WRITE)++;
 		spin_unlock_irqrestore(&tmp_xpd->lock, flags);
 	}
@@ -1399,6 +1403,7 @@
 		.card_tick	= BRI_card_tick,
 		.card_pcm_fromspan	= BRI_card_pcm_fromspan,
 		.card_pcm_tospan	= BRI_card_pcm_tospan,
+		.card_ioctl	= BRI_card_ioctl,
 		.card_close	= BRI_card_close,
 		.card_register_reply	= BRI_card_register_reply,
 

Modified: branches/1.2/xpp/card_fxo.c
URL: http://svn.digium.com/view/zaptel/branches/1.2/xpp/card_fxo.c?view=diff&rev=3643&r1=3642&r2=3643
==============================================================================
--- branches/1.2/xpp/card_fxo.c (original)
+++ branches/1.2/xpp/card_fxo.c Thu Jan 10 12:12:27 2008
@@ -55,7 +55,6 @@
 #define	NUM_LEDS		1
 #define	DELAY_UNTIL_DIALTONE	3000
 
-#define	POLREV_START		3	/* time after offhook to ignore polarity reversals (in ticks) */
 #define	POLREV_THRESHOLD	1000	/* minimum duration for polarity reversal detection (in ticks) */
 #define	BAT_THRESHOLD		3
 #define	BAT_DEBOUNCE		1000	/* compensate for battery voltage fluctuation (in ticks) */
@@ -105,11 +104,11 @@
 #endif
 	struct proc_dir_entry	*fxo_info;
 	uint			poll_counter;
+	signed char		battery_voltage[CHANNELS_PERXPD];
 	xpp_line_t		battery;
 	ushort			battery_debounce[CHANNELS_PERXPD];
 	xpp_line_t		polarity;
 	ushort			polarity_counter[CHANNELS_PERXPD];
-	uint			offhook_timestamp[CHANNELS_PERXPD];
 	ushort			current_counter[CHANNELS_PERXPD];
 	xpp_line_t		ledstate[NUM_LEDS];	/* 0 - OFF, 1 - ON */
 	xpp_line_t		ledcontrol[NUM_LEDS];	/* 0 - OFF, 1 - ON */
@@ -280,7 +279,6 @@
 	ret = DAA_DIRECT_REQUEST(xbus, xpd, pos, DAA_WRITE, DAA_REG_RING, value);
 	if(to_offhook) {
 		BIT_SET(xpd->offhook, pos);
-		priv->offhook_timestamp[pos] = priv->poll_counter;
 	} else {
 		BIT_CLR(xpd->offhook, pos);
 		BIT_CLR(xpd->cid_on, pos);
@@ -709,14 +707,21 @@
 	return 0;
 }
 
+#ifndef ZT_GET_PARAMS_V1
+#define zt_alarm_channel(a,b) zt_qevent_lock(a,( (b)==ZT_ALARM_NONE )? \
+	ZT_EVENT_NOALARM : ZT_EVENT_ALARM)
+#endif
 static void update_battery_status(xpd_t *xpd, byte data_low, lineno_t chipsel)
 {
 	struct FXO_priv_data	*priv;
 	byte			bat = abs((signed char)data_low);
 	byte			pol = IS_SET(data_low, 7);
-
-	priv = xpd->priv;
-	BUG_ON(!priv);
+	int			msec;
+
+
+	priv = xpd->priv;
+	BUG_ON(!priv);
+	priv->battery_voltage[chipsel] = data_low;
 	if(bat < BAT_THRESHOLD) {
 		/*
 		 * Check for battery voltage fluctuations
@@ -725,12 +730,12 @@
 			int	milliseconds;
 
 			milliseconds = priv->battery_debounce[chipsel]++ *
-					poll_battery_interval;
+				poll_battery_interval;
 			if(milliseconds > BAT_DEBOUNCE) {
 				LINE_DBG(SIGNAL, xpd, chipsel, "BATTERY OFF voltage=%d\n", bat);
 				BIT_CLR(priv->battery, chipsel);
 				if(SPAN_REGISTERED(xpd))
-					zt_qevent_lock(&xpd->chans[chipsel], ZT_EVENT_ALARM);
+					zt_alarm_channel(&xpd->chans[chipsel], ZT_ALARM_RED);
 			}
 
 		}
@@ -740,45 +745,47 @@
 			LINE_DBG(SIGNAL, xpd, chipsel, "BATTERY ON voltage=%d\n", bat);
 			BIT_SET(priv->battery, chipsel);
 			if(SPAN_REGISTERED(xpd))
-				zt_qevent_lock(&xpd->chans[chipsel], ZT_EVENT_NOALARM);
+				zt_alarm_channel(&xpd->chans[chipsel], ZT_ALARM_NONE);
 		}
 	}
 	/*
 	 * Handle reverse polarity
 	 */
-	if (IS_SET(xpd->offhook, chipsel)) {				/* Learn the current polarity */
-		if (priv->poll_counter - priv->offhook_timestamp[chipsel] < POLREV_START) {
-			priv->polarity_counter[chipsel] = 0;
-			if (pol)
-				BIT_SET(priv->polarity, chipsel);
-			else
-				BIT_CLR(priv->polarity, chipsel);
-		} else if (IS_SET(priv->polarity, chipsel) != pol) {	/* Polarity has reversed */
-			int	milliseconds;
-
-			milliseconds = priv->polarity_counter[chipsel]++ * poll_battery_interval;
-			if (milliseconds >= POLREV_THRESHOLD) {
-				if (pol)
-					BIT_SET(priv->polarity, chipsel);
-				else
-					BIT_CLR(priv->polarity, chipsel);
-				priv->polarity_counter[chipsel] = 0;
-				/* Inform Zaptel */
-				LINE_DBG(SIGNAL, xpd, chipsel, "Send ZT_EVENT_POLARITY\n");
-				zt_qevent_lock(&xpd->chans[chipsel], ZT_EVENT_POLARITY);
+	if(IS_SET(priv->polarity, chipsel) == pol) {
+		/* same, same, nothing to see here, move on */
+		priv->polarity_counter[chipsel] = 0;
+		return;
+	}
+	/*
+	 * Track polarity reversals and debounce spikes.
+	 * Only reversals with long duration count.
+	 */
+	msec = priv->polarity_counter[chipsel]++ * poll_battery_interval;
+	if (msec >= POLREV_THRESHOLD) {
+		LINE_DBG(SIGNAL, xpd, chipsel, "Polarity is %s\n",
+				(pol)?"Positive":"Negative");
+		priv->polarity_counter[chipsel] = 0;
+		if (pol)
+			BIT_SET(priv->polarity, chipsel);
+		else
+			BIT_CLR(priv->polarity, chipsel);
+		/* polarity reversal during offhook should be reported to zaptel */
+		if(IS_SET(xpd->offhook, chipsel)) {
+			/* Inform Zaptel */
+			LINE_DBG(SIGNAL, xpd, chipsel, "Send ZT_EVENT_POLARITY\n");
+			zt_qevent_lock(&xpd->chans[chipsel], ZT_EVENT_POLARITY);
 #if 0
-				/*
-				 * These two lines hangup the channel (by sending a message to
-				 * the firmware), and inform Zaptel that the line has been hung-up.
-				 * They are not needed if Asterisk does the hangup after receiving
-				 * a notification from Zaptel (which is sent by the above zt_qevent_lock().
-				 * Asterisk does that if it has "hanguponpolarityswitch=1" in zapata.conf.
-				 */
-				do_sethook(xpd, chipsel, 0);
-				update_line_status(xpd, chipsel, 0);
-				pcm_recompute(xpd, 0);
-#endif
-			}
+			/*
+			 * These two lines hangup the channel (by sending a message to
+			 * the firmware), and inform Zaptel that the line has been hung-up.
+			 * They are not needed if Asterisk does the hangup after receiving
+			 * a notification from Zaptel (which is sent by the above zt_qevent_lock().
+			 * Asterisk does that if it has "hanguponpolarityswitch=1" in zapata.conf.
+			 */
+			do_sethook(xpd, chipsel, 0);
+			update_line_status(xpd, chipsel, 0);
+			pcm_recompute(xpd, 0);
+#endif
 		}
 	}
 }
@@ -931,34 +938,38 @@
 	len += sprintf(page + len, "\t%-17s: ", "Channel");
 	for_each_line(xpd, i) {
 		if(!IS_SET(xpd->digital_outputs, i) && !IS_SET(xpd->digital_inputs, i))
-			len += sprintf(page + len, "%2d ", i % 10);
+			len += sprintf(page + len, "%3d ", i % 10);
 	}
 	len += sprintf(page + len, "\n\t%-17s: ", "ledstate");
 	for_each_line(xpd, i) {
 		if(!IS_SET(xpd->digital_outputs, i) && !IS_SET(xpd->digital_inputs, i))
-			len += sprintf(page + len, "%2d ", IS_SET(priv->ledstate[LED_GREEN], i));
+			len += sprintf(page + len, "%3d ", IS_SET(priv->ledstate[LED_GREEN], i));
 	}
 	len += sprintf(page + len, "\n\t%-17s: ", "blinking");
 	for_each_line(xpd, i) {
 		if(!IS_SET(xpd->digital_outputs, i) && !IS_SET(xpd->digital_inputs, i))
-			len += sprintf(page + len, "%2d ", IS_BLINKING(priv,i,LED_GREEN));
+			len += sprintf(page + len, "%3d ", IS_BLINKING(priv,i,LED_GREEN));
 	}
 	len += sprintf(page + len, "\n\t%-17s: ", "battery");
 	for_each_line(xpd, i) {
-		len += sprintf(page + len, "%2d ", IS_SET(priv->battery, i));
+		len += sprintf(page + len, "%3d ", IS_SET(priv->battery, i));
 	}
 	len += sprintf(page + len, "\n\t%-17s: ", "polarity");
 	for_each_line(xpd, i) {
-		len += sprintf(page + len, "%2d ", IS_SET(priv->polarity, i));
+		len += sprintf(page + len, "%3d ", IS_SET(priv->polarity, i));
 	}
 	len += sprintf(page + len, "\n\t%-17s: ", "polarity_counter");
 	for_each_line(xpd, i) {
-		len += sprintf(page + len, "%2d ", priv->polarity_counter[i]);
+		len += sprintf(page + len, "%3d ", priv->polarity_counter[i]);
+	}
+	len += sprintf(page + len, "\n\t%-17s: ", "battery_voltage");
+	for_each_line(xpd, i) {
+		len += sprintf(page + len, "%3d ", priv->battery_voltage[i]);
 	}
 #ifdef	WITH_METERING
 	len += sprintf(page + len, "\n\t%-17s: ", "metering");
 	for_each_line(xpd, i) {
-		len += sprintf(page + len, "%2d ", priv->metering_count[i]);
+		len += sprintf(page + len, "%3d ", priv->metering_count[i]);
 	}
 #endif
 	len += sprintf(page + len, "\n");

Modified: branches/1.2/xpp/card_global.c
URL: http://svn.digium.com/view/zaptel/branches/1.2/xpp/card_global.c?view=diff&rev=3643&r1=3642&r2=3643
==============================================================================
--- branches/1.2/xpp/card_global.c (original)
+++ branches/1.2/xpp/card_global.c Thu Jan 10 12:12:27 2008
@@ -78,7 +78,10 @@
 			regnum, subreg, data_low, data_high);
 	reg_cmd = &RPACKET_FIELD(pack, GLOBAL, REGISTER_REQUEST, reg_cmd);
 	reg_cmd->bytes = sizeof(*reg_cmd) - 1;	// do not count the 'bytes' field
+	reg_cmd->eoframe = 0;
+	reg_cmd->multibyte = 0;
 	REG_FIELD(reg_cmd, chipsel) = chipsel;
+	REG_FIELD(reg_cmd, reserved) = 0;	/* force reserved bits to 0 */
 	REG_FIELD(reg_cmd, read_request) = (writing) ? 0 : 1;
 	REG_FIELD(reg_cmd, do_subreg) = do_subreg;
 	REG_FIELD(reg_cmd, regnum) = regnum;
@@ -137,11 +140,10 @@
 	struct card_desc_struct	*card_desc;
 
 	BUG_ON(!xbus);
-	if((card_desc = kmalloc(sizeof(struct card_desc_struct), GFP_ATOMIC)) == NULL) {
+	if((card_desc = KZALLOC(sizeof(struct card_desc_struct), GFP_ATOMIC)) == NULL) {
 		XBUS_ERR(xbus, "Card description allocation failed.\n");
 		return -ENOMEM;
 	}
-	memset(card_desc, 0, sizeof(struct card_desc_struct));
 	card_desc->magic = CARD_DESC_MAGIC;
 	INIT_LIST_HEAD(&card_desc->card_list);
 	card_desc->xbus = xbus;
@@ -168,7 +170,7 @@
 	if(!xpd) {
 		XBUS_NOTICE(xbus, "%s: received %s for non-existing unit (%1d%1d)\n",
 				__FUNCTION__, cmd->name,
-				XPACKET_ADDR(pack).unit, XPACKET_ADDR(pack).subunit);
+				XPACKET_ADDR_UNIT(pack), XPACKET_ADDR_SUBUNIT(pack));
 		return -EPROTO;
 	}
 	return CALL_XMETHOD(card_register_reply, xbus, xpd, reg);
@@ -205,7 +207,7 @@
 		return 0;
 	if(!xpd) {
 		snprintf(tmp_name, TMP_NAME_LEN, "%s(%1d%1d)", xbus->busname,
-			XPACKET_ADDR(pack).unit, XPACKET_ADDR(pack).subunit);
+			XPACKET_ADDR_UNIT(pack), XPACKET_ADDR_SUBUNIT(pack));
 	} else {
 		snprintf(tmp_name, TMP_NAME_LEN, "%s/%s", xbus->busname, xpd->xpdname);
 	}

Modified: branches/1.2/xpp/card_pri.c
URL: http://svn.digium.com/view/zaptel/branches/1.2/xpp/card_pri.c?view=diff&rev=3643&r1=3642&r2=3643
==============================================================================
--- branches/1.2/xpp/card_pri.c (original)
+++ branches/1.2/xpp/card_pri.c Thu Jan 10 12:12:27 2008
@@ -1214,8 +1214,16 @@
 	if(!priv->layer1_up)
 		dchan_state(xpd, 0);
 	if(SPAN_REGISTERED(xpd) && xpd->span.alarms != alarms) {
-			xpd->span.alarms = alarms;
-			zt_alarm_notify(&xpd->span);
+		char	str1[MAX_PROC_WRITE];
+		char	str2[MAX_PROC_WRITE];
+
+		alarm2str(xpd->span.alarms, str1, sizeof(str1));
+		alarm2str(alarms, str2, sizeof(str2));
+		XPD_NOTICE(xpd, "Alarms: 0x%X (%s) => 0x%X (%s)\n",
+				xpd->span.alarms, str1,
+				alarms, str2);
+		xpd->span.alarms = alarms;
+		zt_alarm_notify(&xpd->span);
 	}
 	priv->reg_frs0 = data_low;
 	priv->layer1_replies++;

Modified: branches/1.2/xpp/init_card_9_29
URL: http://svn.digium.com/view/zaptel/branches/1.2/xpp/init_card_9_29?view=diff&rev=3643&r1=3642&r2=3643
==============================================================================
--- branches/1.2/xpp/init_card_9_29 (original)
+++ branches/1.2/xpp/init_card_9_29 Thu Jan 10 12:12:27 2008
@@ -126,23 +126,21 @@
 	my @pri_specs;
 	my $match;
 	my $setup;
+	# For lab tests
+	my $labfile = "${0}.setup";
 
 	# Source default files
-	foreach my $default_file ("${0}.setup", '/etc/default/zaptel', '/etc/sysconfig/zaptel') {
-		next unless -r $default_file;
-		my $setup_var = 'XPP_PRI_SETUP';
-		my %source_defaults;
-		my $setup_string;
-		%source_defaults = Zaptel::Config::Defaults::do_source($default_file, $setup_var);
-		last unless defined $source_defaults{$setup_var};
-		$setup_string = $source_defaults{$setup_var};
-		$setup_string =~ s/^\s+//;		# trim
-		$setup_string =~ s/\s+$//;		# trim
-		$setup_string =~ s/\s+/\n/g;		# cannonical spaces
-		logit "From $default_file: $setup_var=\n$setup_string\n";
-		@pri_specs = split(/\s+/, $setup_string);
-		last;
-	}
+	$ENV{ZAPTEL_DEFAULTS} = "$labfile" if -r "$labfile";
+	my $setup_var = 'XPP_PRI_SETUP';
+	my $setup_string;
+	my ($default_file, %source_defaults) =
+		Zaptel::Config::Defaults::source_vars($setup_var);
+	$setup_string = $source_defaults{$setup_var};
+	$setup_string =~ s/^\s+//;		# trim
+	$setup_string =~ s/\s+$//;		# trim
+	$setup_string =~ s/\s+/\n/g;		# cannonical spaces
+	logit "From $default_file: $setup_var=\n$setup_string\n";
+	@pri_specs = split(/\s+/, $setup_string);
 	push(@pri_specs, 'NUM/*=TE,E1');	# Fall back default (last)
 	logit "pri_specs: @pri_specs";
 SPEC:

Modified: branches/1.2/xpp/utils/Makefile
URL: http://svn.digium.com/view/zaptel/branches/1.2/xpp/utils/Makefile?view=diff&rev=3643&r1=3642&r2=3643
==============================================================================
--- branches/1.2/xpp/utils/Makefile (original)
+++ branches/1.2/xpp/utils/Makefile Thu Jan 10 12:12:27 2008
@@ -31,7 +31,6 @@
 XPD_FIRMWARE	= $(wildcard ../firmwares/*.hex)
 XPD_INIT_DATA	= $(XPD_FIRMWARE) init_fxo_modes
 XPD_INIT	= $(wildcard ../init_card_?_*) ../calibrate_slics xpp_fxloader
-XPD_INIT_PERL	= ../init_card_6_29 ../init_card_7_29 ../init_card_9_29
 
 # Variables that should be defined above, but need sane defaults:
 # FIXME: Are those values really sane?
@@ -82,7 +81,6 @@
 	$(INSTALL) -d $(DESTDIR)$(DATADIR)
 	$(INSTALL_DATA) $(XPD_INIT_DATA) $(DESTDIR)$(DATADIR)/
 	$(INSTALL) $(XPD_INIT) $(DESTDIR)$(DATADIR)/
-	$(INSTALL) astribank_hook $(DESTDIR)$(DATADIR)/
 	$(INSTALL) -d $(DESTDIR)$(MANDIR)
 	$(INSTALL_DATA) $(MAN_INSTALL) $(DESTDIR)$(MANDIR)/
 	$(INSTALL) -d $(DESTDIR)$(HOTPLUG_USB_DIR)
@@ -130,7 +128,7 @@
 init_fxo_modes: print_modes
 	./$< >$@
 
-perlcheck: $(PERL_SCRIPTS) $(XPD_INIT_PERL)
+perlcheck: $(PERL_SCRIPTS)
 	for i in $^; do perl -I./zconf -c $$i || exit 1; done
 	touch $@
 

Modified: branches/1.2/xpp/utils/astribank_hook
URL: http://svn.digium.com/view/zaptel/branches/1.2/xpp/utils/astribank_hook?view=diff&rev=3643&r1=3642&r2=3643
==============================================================================
--- branches/1.2/xpp/utils/astribank_hook (original)
+++ branches/1.2/xpp/utils/astribank_hook Thu Jan 10 12:12:27 2008
@@ -1,14 +1,22 @@
 #! /bin/sh
+
+# This is an example of an Astribank device hook. The xpp.rules file
+# calls /usr/share/zaptel/astribank_hook after a new Astribank is ready 
+# and after and old Astribank device has been destroyed.
+#
+# This example script sets the sync source, and thus makes the call to
+# xpp_sync in the init.d script unnecessary.
 
 set -e
 
-xpp_sync="/root/xortel/xpp_sync"
+xpp_sync="/usr/sbin/xpp_sync"
 
 me=`basename $0`
 INIT_DIR=`dirname $0`
 XPP_BASE=/proc/xpp
 export XPP_BASE
 LOGGER="logger -s -t $me"
+XPP_SYNC='auto'
 
 ZAPTEL_BOOT_DEBIAN=${ZAPTEL_BOOT_DEBIAN:-/etc/default/zaptel}
 ZAPTEL_BOOT_FEDORA=${ZAPTEL_BOOT_FEDORA:-/etc/sysconfig/zaptel}
@@ -29,16 +37,14 @@
 ## If you wish to trace this script:
 #exec 2> "/tmp/astribank_hook_$XBUS_NAME"
 
-$LOGGER -p kern.info "$ACTION: $*"
-
-$LOGGER -p kern.info "Change Sync"
+$LOGGER -p kern.info "$ACTION: $*. Setting sync to $XPP_SYNC."
 
 case "$ACTION" in
 add)
-	"$xpp_sync" auto
+	"$xpp_sync" $XPP_SYNC
 	;;
 remove)
-	"$xpp_sync" auto
+	"$xpp_sync" $XPP_SYNC
 	;;
 *)
 	;;

Modified: branches/1.2/xpp/utils/fpga_load.c
URL: http://svn.digium.com/view/zaptel/branches/1.2/xpp/utils/fpga_load.c?view=diff&rev=3643&r1=3642&r2=3643
==============================================================================
--- branches/1.2/xpp/utils/fpga_load.c (original)
+++ branches/1.2/xpp/utils/fpga_load.c Thu Jan 10 12:12:27 2008
@@ -28,6 +28,7 @@
 
 static int	verbose = LOG_WARNING;
 static char	*progname;
+static int	disconnected = 0;
 
 #define	MAX_HEX_LINES	10000
 #define	PACKET_SIZE	512
@@ -238,18 +239,22 @@
 	return snprintf(buf, len, "%s", tmp);
 }
 
-void my_usb_device_cleanup(struct my_usb_device *mydev, const struct astribank_type *abtype)
+void my_usb_device_cleanup(struct my_usb_device *mydev)
 {
 	assert(mydev != NULL);
 	if(!mydev->handle) {
 		return;	/* Nothing to do */
 	}
-	if(usb_release_interface(mydev->handle, abtype->my_interface_num) != 0) {
-		ERR("Releasing interface: usb: %s\n", usb_strerror());
+	if(!disconnected) {
+		if(usb_release_interface(mydev->handle, mydev->abtype->my_interface_num) != 0) {
+			ERR("Releasing interface: usb: %s\n", usb_strerror());
+		}
 	}
 	if(usb_close(mydev->handle) != 0) {
 		ERR("Closing device: usb: %s\n", usb_strerror());
 	}
+	disconnected = 1;
+	mydev->handle = NULL;
 }
 
 static void show_device_info(const struct my_usb_device *mydev)
@@ -295,8 +300,17 @@
 	}
 	ret = usb_bulk_write(mydev->handle, mydev->my_ep_out, p, len, timeout);
 	if(ret < 0) {
-		ERR("bulk_write to endpoint 0x%x failed: %s\n", mydev->my_ep_out, usb_strerror());
-		dump_packet("send_usb[ERR]", p, len);
+		/*
+		 * If the device was gone, it may be the
+		 * result of renumeration. Ignore it.
+		 */
+		if(ret != -ENODEV) {
+			ERR("bulk_write to endpoint 0x%x failed: %s\n", mydev->my_ep_out, usb_strerror());
+			dump_packet("send_usb[ERR]", p, len);
+		} else {
+			disconnected = 1;
+			my_usb_device_cleanup(mydev);
+		}
 		return ret;
 	} else if(ret != len) {
 		ERR("bulk_write to endpoint 0x%x short write: %s\n", mydev->my_ep_out, usb_strerror());
@@ -611,8 +625,8 @@
 	DBG("Renumerating with 0x%X\n", pt);
 	phead->header.op = pt;
 	ret = send_usb("renumerate[W]", mydev, phead, 1, TIMEOUT);
-	if(ret < 0)
-		return ret;
+	if(ret < 0 && ret != -ENODEV)
+			return ret;
 #if 0
 	/*
 	 * FIXME: we count on our USB firmware to reset the device... should we?
@@ -984,6 +998,6 @@
 	}
 	DBG("Exiting\n");
 dev_err:
-	my_usb_device_cleanup(&mydev, abtype);
+	my_usb_device_cleanup(&mydev);
 	return ret;
 }

Modified: branches/1.2/xpp/utils/lszaptel
URL: http://svn.digium.com/view/zaptel/branches/1.2/xpp/utils/lszaptel?view=diff&rev=3643&r1=3642&r2=3643
==============================================================================
--- branches/1.2/xpp/utils/lszaptel (original)
+++ branches/1.2/xpp/utils/lszaptel Thu Jan 10 12:12:27 2008
@@ -13,8 +13,20 @@
 
 use Zaptel;
 use Zaptel::Span;
+use Zaptel::Xpp;
+use Zaptel::Xpp::Xbus;
+use Zaptel::Xpp::Xpd;
+
+my @xbuses = Zaptel::Xpp::xbuses("SORT_CONNECTOR");
+my @xpds = map { $_->xpds } @xbuses;
 
 foreach my $span (Zaptel::spans()) {
+	my $spanno = $span->num;
+	my $xpd = $span->xpd;
+	my @lines;
+	my $index = 0;
+
+	@lines = @{$xpd->lines} if defined $xpd;
 	printf "### Span %2d: %s %s\n", $span->num, $span->name, $span->description;
 	foreach my $chan ($span->chans()) {
 		my %type_map = (
@@ -22,7 +34,11 @@
 			IN	=> 'Input'
 			);
 		my ($type) = map { $type_map{$_} or $_ } $chan->type || ("unknown");
-		printf "%3d %-10s %-10s %s\n", $chan->num, $type, $chan->signalling, $chan->info;
+		my $batt = "";
+		$batt = "(battery)" if $chan->battery;
+		printf "%3d %-10s %-10s %s %s\n",
+			$chan->num, $type, $chan->signalling, $chan->info, $batt;
+		$index++;
 	}
 }
 

Modified: branches/1.2/xpp/utils/zapconf
URL: http://svn.digium.com/view/zaptel/branches/1.2/xpp/utils/zapconf?view=diff&rev=3643&r1=3642&r2=3643
==============================================================================
--- branches/1.2/xpp/utils/zapconf (original)
+++ branches/1.2/xpp/utils/zapconf Thu Jan 10 12:12:27 2008
@@ -502,16 +502,9 @@
 }
 
 sub set_defaults {
-	my $zaptel_boot_debian = $ENV{ZAPTEL_BOOT_DEBIAN} || "/etc/default/zaptel";
-	my $zaptel_boot_fedora = $ENV{ZAPTEL_BOOT_FEDORA} || "/etc/sysconfig/zaptel";
-
 	# Source default files
-	my %source_defaults;
-	foreach my $defaults ($zaptel_boot_debian, $zaptel_boot_fedora) {
-		%source_defaults = Zaptel::Config::Defaults::do_source(
-					$defaults, keys(%zaptel_default_vars))
-						if -r $defaults;
-	}
+	my ($default_file, %source_defaults) =
+		Zaptel::Config::Defaults::source_vars(keys(%zaptel_default_vars));
 	map_zaptel_defaults(%source_defaults);
 	# Fixups
 	foreach my $val (values %default_zaptel_signalling, values %default_zapata_signalling) {

Modified: branches/1.2/xpp/utils/zaptel_hardware
URL: http://svn.digium.com/view/zaptel/branches/1.2/xpp/utils/zaptel_hardware?view=diff&rev=3643&r1=3642&r2=3643
==============================================================================
--- branches/1.2/xpp/utils/zaptel_hardware (original)
+++ branches/1.2/xpp/utils/zaptel_hardware Thu Jan 10 12:12:27 2008
@@ -75,9 +75,9 @@
 	my $loaded;
 	if($dev->is_astribank) {
 		$xbus = $dev->xbus;
-		$loaded = $dev->loaded;
 	}
-	die "driver should be '$driver' but is actually '$loaded'"
+	$loaded = $dev->loaded;
+	warn "driver should be '$driver' but is actually '$loaded'\n"
 		if defined($loaded) && $driver ne $loaded;
 	$driver = "$driver" . (($loaded) ? "+" : "-");
 	my $description = $dev->description || "";

Modified: branches/1.2/xpp/utils/zconf/Zaptel.pm
URL: http://svn.digium.com/view/zaptel/branches/1.2/xpp/utils/zconf/Zaptel.pm?view=diff&rev=3643&r1=3642&r2=3643
==============================================================================
--- branches/1.2/xpp/utils/zconf/Zaptel.pm (original)
+++ branches/1.2/xpp/utils/zconf/Zaptel.pm Thu Jan 10 12:12:27 2008
@@ -14,7 +14,7 @@
 
 Zaptel - Perl interface to Zaptel information
 
-This package allows access from perl to information about Zaptel
+This package allows access from Perl to information about Zaptel
 hardware and loaded Zaptel devices.
 
 =head1 SYNOPSIS

Modified: branches/1.2/xpp/utils/zconf/Zaptel/Chans.pm
URL: http://svn.digium.com/view/zaptel/branches/1.2/xpp/utils/zconf/Zaptel/Chans.pm?view=diff&rev=3643&r1=3642&r2=3643
==============================================================================
--- branches/1.2/xpp/utils/zconf/Zaptel/Chans.pm (original)
+++ branches/1.2/xpp/utils/zconf/Zaptel/Chans.pm Thu Jan 10 12:12:27 2008
@@ -10,31 +10,86 @@
 use strict;
 use Zaptel::Utils;
 
+=head1 NAME
+
+Zaptel::Chans - Perl interface to a Zaptel channel information
+
+This package allows access from perl to information about a Zaptel
+channel. It is part of the Zaptel Perl package.
+
+=head1 battery()
+
+Returns 1 if channel reports to have battery (A remote PBX connected to
+an FXO port), 0 if channel reports to not have battery and C<undef>
+otherwise.
+
+Currently only wcfxo and Astribank FXO modules report battery. For the
+rest of the channels 
+
+=head1 fqn()
+
+(Fully Qualified Name) Returns the full "name" of the channel.
+
+=head1 index()
+
+Returns the number of this channel (in the span).
+
+=head1 num()
+
+Returns the number of this channel as a Zaptel channel.
+
+=head signalling()
+
+Returns the signalling set for this channel through /etc/zaptel.conf .
+This is always empty before ztcfg was run. And shows the "other" type
+for FXS and for FXO.
+
+=head1 span()
+
+Returns a reference to the span to which this channel belongs.
+
+=head1 type()
+
+Returns the type of the channel: 'FXS', 'FXO', 'EMPTY', etc.
+
+=cut
+
 sub new($$$$$$) {
 	my $pack = shift or die "Wasn't called as a class method\n";
 	my $span = shift or die "Missing a span parameter\n";
+	my $index = shift;
 	my $line = shift or die "Missing an input line\n";
+	defined $index or die "Missing an index parameter\n";
+	my $self = {
+			'SPAN' => $span,
+			'INDEX' => $index,
+		};
+	bless $self, $pack;
 	my ($num, $fqn, $rest) = split(/\s+/, $line, 3);
 	$num or die "Missing a channel number parameter\n";
 	$fqn or die "Missing a channel fqn parameter\n";
 	my $signalling = '';
-	if(defined $rest && ($rest =~ s/(\w+)//)) {
-		$signalling = $1;
+	my $info = '';
+	if(defined $rest) {
+		if($rest =~ s/^\s*(\w+)\s*//) {
+			$signalling = $1;
+		}
+		if($rest =~ s/(.*)//) {
+			$info = $1;
+		}
 	}
-	my $info = '';
-	if(defined $rest && ($rest =~ s/(.*)//)) {
-		$info = $1;
-	}
-	my $self = {};
-	bless $self, $pack;
-	$self->{SPAN} = $span;
 	$self->{NUM} = $num;
 	$self->{FQN} = $fqn;
 	$self->{SIGNALLING} = $signalling;
 	$self->{INFO} = $info;
 	my $type;
 	if($fqn =~ m|\bXPP_(\w+)/.*$|) {
-		$type = $1;		# One of our AB
+		$type = $1;		# An Astribank
+	} elsif ($fqn =~ m{\bWCFXO/.*}) {
+		$type = "FXO"; # wcfxo - x100p and relatives.
+		# A single port card. The driver issue RED alarm when
+		# There's no better
+		$self->{BATTERY} = !($span->description =~ /\bRED\b/);
 	} elsif ($fqn =~ m{\bFXS/.*}) {
 		$type = "FXS"; # likely Rhino
 	} elsif ($fqn =~ m{\bFXO/.*}) {
@@ -69,6 +124,18 @@
 	return $self;
 }
 
+=head1 probe_type()
+
+In the case of some cards, the information in /proc/zaptel is not good
+enough to tell the type of each channel. In this case an extra explicit
+probe is needed.
+
+Currently this is implemented by using some invocations of ztcfg(8).
+
+It may later be replaced by ztscan(8).
+
+=cut
+
 my $ztcfg = $ENV{ZTCFG} || '/sbin/ztcfg';
 sub probe_type($) {
 	my $self = shift;
@@ -100,4 +167,21 @@
 	return $type;
 }
 
+sub battery($) {
+	my $self = shift or die;
+	my $span = $self->span or die;
+
+	return undef unless $self->type eq 'FXO';
+	return $self->{BATTERY} if defined $self->{BATTERY};
+
+	my $xpd = $span->xpd;
+	my $index = $self->index;
+	return undef if !$xpd;
+
+	# It's an XPD (FXO)
+	my @lines = @{$xpd->lines};
+	my $line = $lines[$index];
+	return $line->battery;
+}
+
 1;

Modified: branches/1.2/xpp/utils/zconf/Zaptel/Config/Defaults.pm
URL: http://svn.digium.com/view/zaptel/branches/1.2/xpp/utils/zconf/Zaptel/Config/Defaults.pm?view=diff&rev=3643&r1=3642&r2=3643
==============================================================================
--- branches/1.2/xpp/utils/zconf/Zaptel/Config/Defaults.pm (original)
+++ branches/1.2/xpp/utils/zconf/Zaptel/Config/Defaults.pm Thu Jan 10 12:12:27 2008
@@ -26,4 +26,29 @@
 	return %vars;
 }
 
+sub source_vars {
+	my @vars = @_;
+	my $default_file;
+	my %system_files = (
+			"/etc/default/zaptel"	=> 'Debian and friends',
+			"/etc/sysconfig/zaptel"	=> 'Red Hat and friends',
+		);
+
+	if(defined $ENV{ZAPTEL_DEFAULTS}) {
+		$default_file = $ENV{ZAPTEL_DEFAULTS};
+	} else {
+		foreach my $f (keys %system_files) {
+			if(-r $f) {
+				if(defined $default_file) {
+					die "An '$f' collides with '$default_file'";
+				}
+				$default_file = $f;
+			}
+		}
+	}
+	die "No default_file" unless $default_file;
+	my %vars = Zaptel::Config::Defaults::do_source($default_file, @vars);
+	return ($default_file, %vars);
+}
+
 1;

Modified: branches/1.2/xpp/utils/zconf/Zaptel/Hardware/PCI.pm
URL: http://svn.digium.com/view/zaptel/branches/1.2/xpp/utils/zconf/Zaptel/Hardware/PCI.pm?view=diff&rev=3643&r1=3642&r2=3643
==============================================================================
--- branches/1.2/xpp/utils/zconf/Zaptel/Hardware/PCI.pm (original)
+++ branches/1.2/xpp/utils/zconf/Zaptel/Hardware/PCI.pm Thu Jan 10 12:12:27 2008
@@ -91,7 +91,9 @@
 	'1397:08b4/b556'	=> { DRIVER => 'qozap', DESCRIPTION => 'Junghanns DuoBRI ISDN card' },
 	'1397:08b4'		=> { DRIVER => 'qozap', DESCRIPTION => 'Junghanns QuadBRI ISDN card' },
 	'1397:16b8'		=> { DRIVER => 'qozap', DESCRIPTION => 'Junghanns OctoBRI ISDN card' },
+	'1397:30b1'		=> { DRIVER => 'cwain', DESCRIPTION => 'HFC-E1 ISDN E1 card' },
 	'1397:2bd0'		=> { DRIVER => 'zaphfc', DESCRIPTION => 'HFC-S ISDN BRI card' },
+	'1397:f001'		=> { DRIVER => 'ztgsm', DESCRIPTION => 'HFC-GSM Cologne Chips GSM' },
 
 	# Rhino cards (based on pci.ids)
 	'0b0b:0105'	=> { DRIVER => 'r1t1', DESCRIPTION => 'Rhino R1T1' },
@@ -159,8 +161,19 @@
 	}
 
 	while(</sys/bus/pci/drivers/*/[0-9]*>) {
-		m,([^/]+)/([^/]+)$,,;
-		$pci_devs{$2}{LOADED} = $1;
+		m,^(.*?)/([^/]+)/([^/]+)$,;
+		my $prefix = $1;
+		my $drvname = $2;
+		my $id = $3;
+		my $l = readlink "$prefix/$drvname/module";
+		# Find the real module name (if we can).
+		if(defined $l) {
+			my $moduledir = "$prefix/$drvname/$l";
+			my $modname = $moduledir;
+			$modname =~ s:^.*/::;
+			$drvname = $modname;
+		}
+		$pci_devs{$id}{LOADED} = $drvname;
 	}
 	foreach (sort keys %pci_devs) {
 		my $dev = $pci_devs{$_};

Modified: branches/1.2/xpp/utils/zconf/Zaptel/Span.pm
URL: http://svn.digium.com/view/zaptel/branches/1.2/xpp/utils/zconf/Zaptel/Span.pm?view=diff&rev=3643&r1=3642&r2=3643
==============================================================================
--- branches/1.2/xpp/utils/zconf/Zaptel/Span.pm (original)
+++ branches/1.2/xpp/utils/zconf/Zaptel/Span.pm Thu Jan 10 12:12:27 2008
@@ -10,6 +10,7 @@
 use strict;
 use Zaptel::Utils;
 use Zaptel::Chans;
+use Zaptel::Xpp::Xpd;
 
 my $proc_base = "/proc/zaptel";
 
@@ -50,6 +51,12 @@
 	my $self = { NUM => $num };
 	bless $self, $pack;
 	$self->{TYPE} = "UNKNOWN";
+	my @xpds = Zaptel::Xpp::Xpd::xpds_by_spanno;
+	my $xpd = $xpds[$num];
+	if(defined $xpd) {
+		die "Spanno mismatch: $xpd->spanno, $num" unless $xpd->spanno == $num;
+		$self->{XPD} = $xpd;
+	}
 	open(F, "$proc_base/$num") or die "Failed to open '$proc_base/$num\n";
 	my $head = <F>;
 	chomp $head;
@@ -92,16 +99,20 @@
 	$self->{IS_ZAPTEL_SYNC_MASTER} =
 		($self->{DESCRIPTION} =~ /\(MASTER\)/) ? 1 : 0;
 	$self->{CHANS} = [];
+	my @channels;
+	my $index = 0;
 	while(<F>) {
 		chomp;
 		s/^\s*//;
 		s/\s*$//;
 		next unless /\S/;
-		my $c = Zaptel::Chans->new($self, $_);
-		push(@{$self->{CHANS}}, $c);
+		my $c = Zaptel::Chans->new($self, $index, $_);
+		push(@channels, $c);
+		$index++;
 	}
 	close F;
-
+	@channels = sort { $a->num <=> $b->num } @channels;
+	$self->{CHANS} = \@channels;
 	$self->{YELLOW} = undef;
 	$self->{CRC4} = undef;
 	if($self->is_bri()) {

Added: branches/1.2/xpp/utils/zconf/Zaptel/Xpp/Line.pm
URL: http://svn.digium.com/view/zaptel/branches/1.2/xpp/utils/zconf/Zaptel/Xpp/Line.pm?view=auto&rev=3643
==============================================================================
--- branches/1.2/xpp/utils/zconf/Zaptel/Xpp/Line.pm (added)
+++ branches/1.2/xpp/utils/zconf/Zaptel/Xpp/Line.pm Thu Jan 10 12:12:27 2008
@@ -1,0 +1,59 @@
+package Zaptel::Xpp::Line;
+#
+# Written by Oron Peled <oron at actcom.co.il>
+# Copyright (C) 2008, Xorcom
+# This program is free software; you can redistribute and/or
+# modify it under the same terms as Perl itself.
+#
+# $Id$
+#
+use strict;
+use Zaptel::Utils;
+
+my $proc_base = "/proc/xpp";
+
+sub new($$$) {
+	my $pack = shift or die "Wasn't called as a class method\n";
+	my $xpd = shift or die;
+	my $index = shift;
+	defined $index or die;
+	my $self = {};
+	bless $self, ref($xpd);
+	$self->{XPD} = $xpd;
+	$self->{INDEX} = $index;
+	return $self;
+}
+
+sub create_all($$) {
+	my $pack = shift or die "Wasn't called as a class method\n";
+	my $xpd = shift || die;
+	my $procdir = shift || die;
+	local $/ = "\n";
+	my @lines;
+	for(my $i = 0; $i < $xpd->{CHANNELS}; $i++) {
+		my $line = Zaptel::Xpp::Line->new($xpd, $i);
+		push(@lines, $line);
+	}
+	$xpd->{LINES} = \@lines;
+	my ($infofile) = glob "$procdir/*_info";
+	die "Failed globbing '$procdir/*_info'" unless defined $infofile;
+	my $type = $xpd->type;
+	open(F, "$infofile") || die "Failed opening '$infofile': $!";
+	while (<F>) {
+		chomp;
+		if($type eq 'FXO') {
+			if(s/^\s*battery\s*:\s*//) {
+				my @batt = split;
+				foreach my $l (@lines) {
+					die unless @batt;
+					$l->{BATTERY} = shift @batt;
+				}
+				die if @batt;
+			}
+		}
+	}
+	close F;
+}
+
+
+1;

Propchange: branches/1.2/xpp/utils/zconf/Zaptel/Xpp/Line.pm
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: branches/1.2/xpp/utils/zconf/Zaptel/Xpp/Line.pm
------------------------------------------------------------------------------
    svn:keywords = Authord Date Id Revision

Propchange: branches/1.2/xpp/utils/zconf/Zaptel/Xpp/Line.pm
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: branches/1.2/xpp/utils/zconf/Zaptel/Xpp/Xpd.pm
URL: http://svn.digium.com/view/zaptel/branches/1.2/xpp/utils/zconf/Zaptel/Xpp/Xpd.pm?view=diff&rev=3643&r1=3642&r2=3643
==============================================================================
--- branches/1.2/xpp/utils/zconf/Zaptel/Xpp/Xpd.pm (original)
+++ branches/1.2/xpp/utils/zconf/Zaptel/Xpp/Xpd.pm Thu Jan 10 12:12:27 2008
@@ -9,6 +9,8 @@
 #
 use strict;
 use Zaptel::Utils;
+use Zaptel::Xpp;
+use Zaptel::Xpp::Line;
 
 my $proc_base = "/proc/xpp";
 
@@ -64,21 +66,15 @@
 	return $result;
 }
 
-#
-# Backward compatibility for old drivers
-# before changeset:5119
-#
-# Newer drivers should directly have $xpd->spanno
-#
-sub spanno_of_xpd($) {
-	my $xpd = shift || die;
-
-	warn "Running on old driver. Keep going...\n";
-	use Zaptel;
-	my @spans = Zaptel::spans;
-
-	my ($span) = grep { $_->name eq $xpd->fqn } @spans;
-	return ($span) ? $span->num : 0;
+sub xpds_by_spanno() {
+	my @xbuses = Zaptel::Xpp::xbuses("SORT_CONNECTOR");
+	my @xpds = map { $_->xpds } @xbuses;
+	@xpds = grep { $_->spanno } @xpds;
+	@xpds = sort { $a->spanno <=> $b->spanno } @xpds;
+	my @spanno = map { $_->spanno } @xpds;
+	my @idx;
+	@idx[@spanno] = @xpds;	# The spanno is the index now
+	return @idx;
 }
 
 sub new($$) {
@@ -92,8 +88,18 @@
 	local $/ = "\n";
 	open(F, "$procdir/summary") || die "Missing summary file in $procdir";
 	my $head = <F>;
-	chomp $head;
-	# "XPD-00 (BRI_TE ,card present, span 3)"
+	chomp $head;	# "XPD-00 (BRI_TE ,card present, span 3)"
+	# The driver does not export the number of channels...
+	# Let's find it indirectly
+	while(<F>) {
+		chomp;
+		if(s/^\s*offhook\s*:\s*//) {
+			my @offhook = split;
+			@offhook || die "No channels in '$procdir/summary'";
+			$self->{CHANNELS} = @offhook;
+			last;
+		}
+	}
 	close F;
 	$head =~ s/^(XPD-(\d\d))\s+// || die;
 	$self->{ID} = $2;
@@ -105,13 +111,12 @@
 	#warn "Garbage in '$procdir/summary': rest='$rest'\n" if $rest;
 	if($span =~ s/span\s+(\d+)//) {	# since changeset:5119
 		$self->{SPANNO} = $1;
-	} else {

[... 653 lines stripped ...]



More information about the zaptel-commits mailing list