[prev in list] [next in list] [prev in thread] [next in thread] 

List:       gnuradio-commit
Subject:    [Commit-gnuradio] r7904 - in gnuradio/trunk: . config gr-msdd6000 gr-msdd6000/doc gr-msdd6000/src gr
From:       jcorgan () gnuradio ! org
Date:       2008-02-29 19:26:50
Message-ID: 20080229192650.1F330380078 () nyquist ! gnuradio ! org
[Download RAW message or body]

Author: jcorgan
Date: 2008-02-29 12:26:49 -0700 (Fri, 29 Feb 2008)
New Revision: 7904

Added:
   gnuradio/trunk/config/grc_gr_msdd6000.m4
   gnuradio/trunk/gr-msdd6000/
   gnuradio/trunk/gr-msdd6000/AUTHORS
   gnuradio/trunk/gr-msdd6000/Makefile.am
   gnuradio/trunk/gr-msdd6000/doc/
   gnuradio/trunk/gr-msdd6000/doc/Softronics_Ltd_msdd6000_BlockDiagram.pdf
   gnuradio/trunk/gr-msdd6000/src/
   gnuradio/trunk/gr-msdd6000/src/Makefile.am
   gnuradio/trunk/gr-msdd6000/src/lib/
   gnuradio/trunk/gr-msdd6000/src/lib/Makefile.am
   gnuradio/trunk/gr-msdd6000/src/lib/msdd.i
   gnuradio/trunk/gr-msdd6000/src/lib/msdd_buffer_copy_behaviors.h
   gnuradio/trunk/gr-msdd6000/src/lib/msdd_source_base.cc
   gnuradio/trunk/gr-msdd6000/src/lib/msdd_source_base.h
   gnuradio/trunk/gr-msdd6000/src/lib/msdd_source_c.cc
   gnuradio/trunk/gr-msdd6000/src/lib/msdd_source_c.h
   gnuradio/trunk/gr-msdd6000/src/lib/msdd_source_s.cc
   gnuradio/trunk/gr-msdd6000/src/lib/msdd_source_s.h
   gnuradio/trunk/gr-msdd6000/src/python/
   gnuradio/trunk/gr-msdd6000/src/python/Makefile.am
   gnuradio/trunk/gr-msdd6000/src/python/qa_msdd6000.py
   gnuradio/trunk/gr-msdd6000/src/python/run_tests.in
   gnuradio/trunk/gr-msdd6000/src/python/test_tcp.py
   gnuradio/trunk/gr-msdd6000/src/python/test_udp.py
Removed:
   gnuradio/trunk/gr-msdd6000/AUTHORS
   gnuradio/trunk/gr-msdd6000/Makefile.am
   gnuradio/trunk/gr-msdd6000/doc/Softronics_Ltd_msdd6000_BlockDiagram.pdf
   gnuradio/trunk/gr-msdd6000/src/
   gnuradio/trunk/gr-msdd6000/src/Makefile.am
   gnuradio/trunk/gr-msdd6000/src/lib/
   gnuradio/trunk/gr-msdd6000/src/lib/Makefile.am
   gnuradio/trunk/gr-msdd6000/src/lib/msdd.i
   gnuradio/trunk/gr-msdd6000/src/lib/msdd_buffer_copy_behaviors.h
   gnuradio/trunk/gr-msdd6000/src/lib/msdd_source_base.cc
   gnuradio/trunk/gr-msdd6000/src/lib/msdd_source_base.h
   gnuradio/trunk/gr-msdd6000/src/lib/msdd_source_c.cc
   gnuradio/trunk/gr-msdd6000/src/lib/msdd_source_c.h
   gnuradio/trunk/gr-msdd6000/src/lib/msdd_source_s.cc
   gnuradio/trunk/gr-msdd6000/src/lib/msdd_source_s.h
   gnuradio/trunk/gr-msdd6000/src/python/Makefile.am
   gnuradio/trunk/gr-msdd6000/src/python/run_tests.in
Modified:
   gnuradio/trunk/AUTHORS
   gnuradio/trunk/config/Makefile.am
   gnuradio/trunk/configure.ac
Log:
Merged r7857:7898 from n4hy/msddLTS into trunk, with modification.  Adds gr-msdd6000 \
component, providing GNU Radio source and sink support for the Softronics Ltd. MSDD \
6000 receiver.

Modified: gnuradio/trunk/AUTHORS
===================================================================
--- gnuradio/trunk/AUTHORS	2008-02-29 19:02:04 UTC (rev 7903)
+++ gnuradio/trunk/AUTHORS	2008-02-29 19:26:49 UTC (rev 7904)
@@ -12,3 +12,4 @@
 Johnathan Corgan <jcorgan@corganenterprises.com>  Build system, ongoing stuff, \
release manager  Bdale Garbee <bdale@gag.com>           Debian release packages
 Tom Rondeau <trondeau@vt.edu>          Mostly digital waveforms and a little bit of \
trouble +Nate Goergen (UMD Student)

Modified: gnuradio/trunk/config/Makefile.am
===================================================================
--- gnuradio/trunk/config/Makefile.am	2008-02-29 19:02:04 UTC (rev 7903)
+++ gnuradio/trunk/config/Makefile.am	2008-02-29 19:26:49 UTC (rev 7904)
@@ -57,6 +57,7 @@
 	gr_check_usrp.m4 \
 	grc_pmt.m4 \
 	grc_usrp.m4 \
+	grc_gr_msdd6000.m4 \
 	gr_doxygen.m4 \
 	gr_fortran.m4 \
 	gr_gprof.m4 \

Copied: gnuradio/trunk/config/grc_gr_msdd6000.m4 (from rev 7884, \
gnuradio/branches/developers/n4hy/msddLTS/config/grc_gr_msdd6000.m4) \
                ===================================================================
--- gnuradio/trunk/config/grc_gr_msdd6000.m4	                        (rev 0)
+++ gnuradio/trunk/config/grc_gr_msdd6000.m4	2008-02-29 19:26:49 UTC (rev 7904)
@@ -0,0 +1,38 @@
+dnl Copyright 2001,2002,2003,2004,2005,2006,2008 Free Software Foundation, Inc.
+dnl 
+dnl This file is part of GNU Radio
+dnl 
+dnl GNU Radio is free software; you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 3, or (at your option)
+dnl any later version.
+dnl 
+dnl GNU Radio is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+dnl GNU General Public License for more details.
+dnl 
+dnl You should have received a copy of the GNU General Public License
+dnl along with GNU Radio; see the file COPYING.  If not, write to
+dnl the Free Software Foundation, Inc., 51 Franklin Street,
+dnl Boston, MA 02110-1301, USA.
+
+AC_DEFUN([GRC_GR_MSDD6000],[
+    GRC_ENABLE([gr-msdd6000])
+
+    AC_CONFIG_FILES([\
+	gr-msdd6000/Makefile \
+	gr-msdd6000/src/Makefile \
+	gr-msdd6000/src/lib/Makefile \
+	gr-msdd6000/src/python/Makefile
+	gr-msdd6000/src/python/run_tests
+    ])
+
+    dnl Don't do gr-msdd6000 if gnuradio-core skipped
+    GRC_CHECK_DEPENDENCY(gr-msdd6000, gnuradio-core)
+
+    GRC_BUILD_CONDITIONAL([gr-msdd6000],[
+        dnl run_tests is created from run_tests.in.  Make it executable.
+	AC_CONFIG_COMMANDS([run_tests_msdd6000], [chmod +x \
gr-msdd6000/src/python/run_tests]) +    ])
+])

Modified: gnuradio/trunk/configure.ac
===================================================================
--- gnuradio/trunk/configure.ac	2008-02-29 19:02:04 UTC (rev 7903)
+++ gnuradio/trunk/configure.ac	2008-02-29 19:26:49 UTC (rev 7904)
@@ -249,6 +249,7 @@
 GRC_MBLOCK			dnl this must come after GRC_PMT
 GRC_USRP
 GRC_GR_USRP			dnl this must come after GRC_USRP
+GRC_GR_MSDD6000
 GRC_GR_AUDIO_ALSA
 GRC_GR_AUDIO_JACK
 GRC_GR_AUDIO_OSS

Copied: gnuradio/trunk/gr-msdd6000 (from rev 7884, \
gnuradio/branches/developers/n4hy/msddLTS/gr-msdd6000)


Property changes on: gnuradio/trunk/gr-msdd6000
___________________________________________________________________
Name: svn:ignore
   + Makefile
Makefile.in


Deleted: gnuradio/trunk/gr-msdd6000/AUTHORS

Copied: gnuradio/trunk/gr-msdd6000/AUTHORS (from rev 7884, \
gnuradio/branches/developers/n4hy/msddLTS/gr-msdd6000/AUTHORS) \
                ===================================================================
--- gnuradio/trunk/gr-msdd6000/AUTHORS	                        (rev 0)
+++ gnuradio/trunk/gr-msdd6000/AUTHORS	2008-02-29 19:26:49 UTC (rev 7904)
@@ -0,0 +1,3 @@
+Charles Clancy
+Nate Goergen
+n4hy (Bob McGwier)

Deleted: gnuradio/trunk/gr-msdd6000/Makefile.am

Copied: gnuradio/trunk/gr-msdd6000/Makefile.am (from rev 7884, \
gnuradio/branches/developers/n4hy/msddLTS/gr-msdd6000/Makefile.am) \
                ===================================================================
--- gnuradio/trunk/gr-msdd6000/Makefile.am	                        (rev 0)
+++ gnuradio/trunk/gr-msdd6000/Makefile.am	2008-02-29 19:26:49 UTC (rev 7904)
@@ -0,0 +1,25 @@
+#
+# Copyright 2008 Free Software Foundation, Inc.
+# 
+# This file is part of GNU Radio
+# 
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+# 
+# GNU Radio is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with GNU Radio; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+# 
+
+include $(top_srcdir)/Makefile.common
+
+SUBDIRS = src
+

Copied: gnuradio/trunk/gr-msdd6000/doc (from rev 7898, \
gnuradio/branches/developers/n4hy/msddLTS/gr-msdd6000/doc)

Deleted: gnuradio/trunk/gr-msdd6000/doc/Softronics_Ltd_msdd6000_BlockDiagram.pdf

Copied: gnuradio/trunk/gr-msdd6000/doc/Softronics_Ltd_msdd6000_BlockDiagram.pdf (from \
rev 7898, gnuradio/branches/developers/n4hy/msddLTS/gr-msdd6000/doc/Softronics_Ltd_msdd6000_BlockDiagram.pdf)
 ===================================================================
--- gnuradio/trunk/gr-msdd6000/doc/Softronics_Ltd_msdd6000_BlockDiagram.pdf	          \
                (rev 0)
+++ gnuradio/trunk/gr-msdd6000/doc/Softronics_Ltd_msdd6000_BlockDiagram.pdf	2008-02-29 \
19:26:49 UTC (rev 7904) @@ -0,0 +1,318 @@
+%PDF-1.3
+%쏢
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+x\ُqH\NKG5x>}y7O؊
+_UΒ\꫺,m
4p~yp৿n)1_Sź%6BU` \
fvO;w-ojnsju[R!o)ul/ٸ"=Hm+$HW
 +yl㚒G_	̸mIyʨ%X3	e"G  \
j<&,aҷf5RvW]~~L;俐u))QkE5=4޾? \
.6]]3cSŸW7EM<f$cZm&[3)Qk$cO^rd<ǒJ#-⟡?*Z7&vs\9Cak \
H^lSv.WJ/0jRω< \
sK+aUj$IX[5EO|Kob6.q}dV,k^QM$hݒr`=2ΞtݑyoU \
bl,Ai8zy2б#5KS`3DՑAgd17DЕcLjdHvbj-4fMl-3ۑdX \
{Ӓ7miy_T&=)aֹ- \
+FVcY<7YCB@PCTɂ5i4|%V) \
=$M_TqT>/w?_m+P \
%	c4d>]LEҦ;v))mV#duxklKqJ2e!HuEP(+I-rv` \
l[<`10!H2knd+e=':J+4fpZ/7X.`ѪZT~?pciZ=TC" \
jy'%N^qE,zfuTtEͿJuٟv:^\7J)MBAr&_о~hiVsG:xV8~;N=0jfu-"Hk
 +MBmdQ9> \
E_+Y*|!*P&l}Ɇ.emA6DΓ!"b|L>V(}l \
>4ZUJFZ_02gMkMMٰ<=<$f'TRB7$RtI	G65	cceMbTN}F2dSE'	_nܒIpx&c
> 
+v[<Jp>ۅ,dq:`#	rUp]hΞjWܙI	%q8S諏XA[2=s>i)s} \
 )Ju4MVґ@p$TR2)~no8yΡheڈRZʐ2NVN \
:ed`($iIQ#O;9SY`૤AV'\6GaNFdIxƍMh3ɥ0>p{*24pǓ1ס3VIUfZQĉeBkv𤸍4a6j \
 +D%UJAYІzreakmq.:b<
!GDILcG}PJA*$p28A@T4-1eo|e R[Ga/XRdu]?6\uè \ \
X0or2GA{LdZ@kL7lcE:E3R˶:-d_4%[.Q1xS.&b7 \
[,^u#o?:XvK7G>`CQhp]dWZp򬷬+kad \
lFޜqhN$ьƭ-0b?B4%7w'LE,AܻY~5v<k9&Y$ā\ViwZ \
$1ݧ/Ӵ{pú?k-yp52F+ZsH+{:~@PmT^yn:i2Mxϫ/%db \
1IY䊈N0\d]tmT_vvw&\,ڍ.&7 \
ِ"pqֳ4_(f\hQk	1Cb1(	j-;;K%0CȣbaR=}h5%54K*v	XI1 \
%wlo[cRoAߘ&:rj^NDpK?a=Sq%T9KsÅ \
Kmc!@SDdz3x2$V0G7d]q5Xҽ+rn%p)9uzpvT<Jl_
 +dWiֆ&z5$4Ý8FWaΒZiy"7r)mq`S7HϹ]qmZE@I86=bmͩmω5ƉB
 ZԯR)\u웮6tJrMچ9	1ؓtMN"dxԁJ \
Xb7#d5;,VB>eswV`Ɓ"&qIӣ+cwBӏ.Xk%S2<: \
+3j|7"[9sTNB[$>bj@T ;Gh +5z4[U !gRkj!f \
0~(%HLJj(/@E'y{A#VAX!qU:[bJbyHOdK%s
 +yTLgB+q[iܥW
+Nƶ;` 6]|k0n42z7 퇽4zÓrYX0>B
7e˂TL gMrƄ|BGZIbۈKB}Mi}E הQW9 
VQB&AX^ȼxO ,Jy
+3Bǽ[P'8h5X6qVGB<*׻y)TyD>*3
u	ڑ,0s^c˖chR`W_(<<Zp -qOf
)  ?l:
+p"af75vl{2\qUʜz]5 xQu=4']lKN%7
+qoqMUp \
U1sVL|p'57A*]~!p*7c]aA>EhB|if>ϩ	3L+0x'O \
hJ_la"30`$sH]Ta|	s(clڛ	*8ܹ*fOiƺ:YY] \
Sx"?:! Yi4B+ \
9FrkT>{;N̘#ZOO8+d^!9p@E4#1nKB}]ce{#iǼՌ=]qE5 \
;*uʽ&4}v[˂7t_sq%	WSrM.#mCRshJټ5.&C_Z$+ĔTK:)rc- \
ʘbJnIu r[ |pVtgK/
+뷰+av*g5hdi(큵nVҩ.Gr4U1&CF&qhK
+*[gr/&]_fkg%ʬ+]7^LJ)ZTF/&NS,6ٽ6p3 \
7|,Kbl7H9%k\Čekk':I7qoD6#JvM"7s> \
1|Qq֫q^  +X I{,. FdQEƁJ<>wi~* 1x^}A#u.m+x
+M/YM]/LW*q \
$(gfIiaK/Xp>B㪄NÍP:/a5-Y'}&]/H=~3W89|(C"TI/ٹ\U?`YTz}\%#<
 +1y;ƿZ5ruVutoih't!!!XoKo:}]L˥̃<"\6[-ƛDwOOH7-`۾%5YFl \
$w{~-{%YkwOv4d{VCv=#_&,ץX#qtR9zJ.wڕ+O<( \
<:=ҥ['KnET4.xۯȮNY[!Ҵ-vG*'r;Z4rǃn \
CK/siUcɱB'2tܗ.烒*eveoc|;18X8x\Ci[,13co׽WŀԢ_
 +q:~;/xCĨ7b!DqSfyAA^Ucf'?0{[n
Ts=F}2ە+S5-eJ*$/Dž#t.2$-dB
+ĔMą,6\n)[,ɳnJO_ \
<t~+Xt84r+8MGbo|?.){<<)?<Ӗ˯\p8tJӹ3`aG|
 +[ lQθpP:u@Hv@OF2}Xxdž;B[`:͟GasyI2O
 +O8>l5WU(!qAʚ\kW`[ZM܎68
+ݨڣtxt1Wo˺XTk%ZUu<>l#_rzNw \
o%m<SZigKbt	y/LͿ%A&KpȹvEdI?v{֯X61LO \
të'ȎS`-Ӿ5.c2׫+2%ԇ8F*+QYsPW \
i/x:ڈ3`kA \
ԄgX.SbFΞ˺nN0UrzkqC-iOs2<GA?xB?6bwI.ޒN^''0sZW}!ɶ[o> \
Z=uuuΝQnmu}3΀Ns'V?\KtzS;!۽E΢}pGϮ\_؉ \
8WyC@G=:J^x5#\Zbcφng_߬9;)ޟjY \
pg_oϾcor-Vb8~GNbK0-w2x \
_QOl|5zpϿub}ZA&&vh||t`07R7'SbOC05d߫}<?ruJo3Bd#|wlwK^
 
+{ X?݈*?赦_8JZCՃ;;=s;4\́bGSDZ[]$9tg=䘺i/ \
j0o	%uVpcuk4u{(=)"jiӌji̝>	5F*FUC~eNv4t}M@H>c'T
 +6endstream
+endobj
+6 0 obj
+5987
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 612 792]
+/Rotate 90/Parent 3 0 R
+/Resources<</ProcSet[/PDF /Text]
+/ExtGState 14 0 R
+/Font 15 0 R
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+/Rotate 90>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+>>
+endobj
+7 0 obj
+<</Type/ExtGState
+/OPM 1>>endobj
+14 0 obj
+<</R7
+7 0 R>>
+endobj
+15 0 obj
+<</R13
+13 0 R/R11
+11 0 R/R9
+9 0 R>>
+endobj
+16 0 obj
+<</Length1 27760/Filter/FlateDecode/Length 17 0 R>>stream
+x	xTU0>:U)IU2"$$B a0)0YT
+2D[Aі"aH8S-*n͕ۍH+zk*}s^{X{gW@! V \
IHnog6'_G?1{ŲBH2yqϿyO"Ta\0w9C \
a]cM@g eRBDnX<{f2=-u7\լie2!3pye \
nZ޼dnsUpAH]FiۍPE_8EhH٥']iGϡq \
r؃1E>h,D 1:a?X]~H \
w$@}UtFo,Feh<ԿE_0h$ \
Ȁ؉f~cx=~oM^hUċ(mar'~tى(e$8 \
(%zhDףh0B!$c#idFp/@OctZ6=MlILi#ʃ1-D_R<<o7;MW&~x	9!,E302D/7h4= \
aA`0h'FG1G}؇Y~7b$ṣ~]C(p=ߡۘp=^縇W[VddgxO7ȍju \
=7wtx0^1܃"$ul#O_1Rv8{=!ww0S_ \
1A90z;PS?OA/KF  f7%bty<
q!|pL&3iagbL'sUv;c	Xbn7{{{;Wsfsax,+%L=tMa=,q.Z<O'0`aRE&d.YG6{~x7	r \
]L	314f:saYüͼÜf>gza\l]>fn	w˧"i/M \
 fatC<dkq/dcaaXIGLDalamXWd>JoZ0 \
UԎDzؗU=܄=n&MDς4J#x8O*i)* /E^<߆Z.q2:TxX \
c#@su}p9H/`VOhss@1 fQ|m \
ajt}t|!/Dppzn)P1HԵ2Ȓbz4 \
AԻ?K<3qsb1-~ppD'@T }>_=9}8?r+n?k-~ \
`{z(@2`6}EX"00t2Ey LJfZ13 \
'EF'1.l_vj3 .X;q \
+6dAK@juØ>l'qP@[ߢh0}Q9Hjw,8?	pM&ʹ`'1 \
c][`fGr:Tcx!jV9쪊CFJ(i>r:6E5ADX`d)i9ѣh:42f^@V͕ub&ZʚԜO5dMRM*PEAP \
Vu(ЉMh=աh ֫z\x0Ձn +լXydS54 +GdD
Bk#5r>DG<j:=rXվ`0Z?G͊9WA#nb \
wXHg߽yKf5sBsf^cfFi0[s>!	[G4ll^ ͛7b./ \
R?6d4mk' 7>	Ur~sC#iNӢ@L +
-ؼ	ƻ9&lzDl
+*}}vy-๲ \
>ՒD>91*G^*czux	(4"4`N7w0<{0T'*6VdaLѴYB)|VC  \
PWWL7F)\"5(ñ|J" XS0=]ZE'jVP=vftH! ?|wfA":! \
Yv1DK/8%K.7#;bbΥfi`H;I	#77p[;T|T,fH*F|^
 +Dy4`׉zN3p &6NQ90xPg҃R
	_zE730^6Ny|EY
 ͛kBMgv&ZgjhsMvontqA;jDa Vixi
]*X*'7LF4
˂.PE4=\ʥMZNDץ!Ԫz݉'^hv'Iz<0,>PwsT=o- \
 ΅ +h22cnfGj/:;̶bJeB1P783Tm/XE#XwVpji
 wIlni/$#άBJś`K3!Lp3[:NìBPt~P\8A#3ՌvCZmy)**fFeψ^a(5fcd \
خ:15? +\~1FFL&wHJ*#391bS5vhɤgg35LF}y@3
+7],Ab*aPc߫#g0Z9L*Gk!.'ba6lKMP	2Q3m,4 \
hv鑬.ø\od#s[mz5wT\yYx&_J4KF@+kpIc2tLU!#L$)v;=ߦ \
Ra^NGTOcb!/"tQH$@a	ۃ;Ig0G',y=\S/:KEMa/n0v:H)
 +T
+9Ji"AvB] vϷd<O+O~՞ܧ;r#cqY{Z%q>@QYeG.leZV \
b +v1@A ,+P{%w_n+ΖŪ`Nt^ߦǚoc`4!R=VI֣:pXn-Vpw[ݦ,JѬC4D3@4DѬh&h&	 \
	 t:&h! ^zz ^B  4B
 4t
 4t"("(! H("(!@t@""*@C
+ z ztrs7r@q8r\9 xjtd \
5ւkGa`[k98 +@"C"11DLh6h6
 
 t6ps/
7VOעp
> }zx+ڥ ;p5*Õ(G==\"n Np{Nco\jYv
+{n#3_/^'*Qt9
+ݧkl"WJ~# gKፐf
> /|\%Q%]
1g$a =ߞ3߉&~Z +
ίC-3QptcZQ(Hܑ":s 8Ԟ;_%(Aܳm_%G \
x =wsW)g)T8	MÉ)PmBZ;:ʆ~0;) \
+AfQ.]x̣}x820 p5++ \
@'ٝx&*W۫dZ}0F]ٛB[8 \
a"dޤwg5__Vpʿ???ߘ \
kG0Q7g10vN}5?_8J'-+8J1gwR[|ጰU. \
+!!ShU$EYE^dE""ޙ \
T	.̳gJO#,4lL-4ƺgYعIN,-㘵NceژP?aF!7F6>'hz5a_ \
سh+*ݕaR~}y4=vRClOz4VL#hmvjw3QFVw 
]l31H(T;Wj6A5K&GZ
pZ
(Y/^POVP^/GVz,u:9.rrZn pC( ސU
+zzސ
+RzJOֱ]cσ:a1p)ISh\pMW,pZg,O4͚3ƖVք#/⁡}呓ͭn
 YhMj*hc
ʪ)ŕ*WR}}>
U 
7Ny%计Aa᧑!Cc
+8ZTPUPEhk}ө"-"jT+P%MI%5[J؍F.^;x/Ǟ˗/Rjcjc&HjBހy퓤n( \
2q0`u	o5uxӋ|-8B^&+;24}Jvoz(Pf'CR[e \
{pdwѭp^DDE0,izm4GKl|4Re$%+'/-OuC \
9xAyTj6ıq#\0Gqp;W*!^o`Qd]04}l7UxYF`0eг"e9Td}wxzqY#*mXdHހ=Ӵ{{ \
z Lr̰sXha + \
q}r\~Vա}d(@aC;!tfJWh}gWύ녙VVloS_X$߉DSY׍L0UFy7#vIKKNϷ,p.夜$
 RƐ1HF-"|@>ߕU,;&nJwVgĽKTB31k2B\:LI'K?7B"܈qiQ>,j \
W&/,)T6ȢVݷu{'߁_RLԕ${xmxޅqpUoV5XLb9	MѤ-`2}cNr!Q02JLFMgleY|m(|(?[>5^(UV \
O?0):ņLdqX# \
Wj3z|o{{i#ҧxeraw72hv{gWrgy3 \
nt?{,=i{E+JWWKߚ~"]L;"D5)JF<ALXh$Fv]6N:t:o>$xV_q*,b_0Y \
b-ǖp#%(=n)ch7fRYQ-D$Gd \
<>auQJ!_KO<8[^,A2 \
HN%{PVIaay5^U۾uxh1~p~ԸQNſKzusݒ_>?cVJW|JZrKid~9#:=..3WT܉4c5>(
 +vvbBQv8(? ]r!ݕČݰFzr>N^~# \
Yްk%><l-免MbJ)V>hyKǞP漄a~Pf8*K&L]d ZU \
cF3|7|۷gg|-^\pӺE:>eN0ݰť_	V^e \
Orc@)c8xFW<d<e2]٭R^U$:WN6(2?y΀h&FVa HДn8$<$  \
bY@`L u^s%YKhOoSƮMZZNE,2l6_$UqƷ9$Z@ovR\b)q,؂ɚɭ_<?ߋs1pݷH&nW \
jDSXfiyXiCdجAKȺ \
++2`jt6iR&bzuH.b$4/D(S3؝Ȯ{'~V[,~P%jZ2*Ҿlf5@]XsaoAͪG#h/$3 \
Rb) R=BťK_K&@-D:^A60 \
^5+5yM}YG0oߜ>c}[7l>H3](iCn[ \
嘭Mqp,jG]8pnТ(v0Ha]֤RBbN\ױcLgaY4}MʌuFlfOZ=YOM
 +ٳԎI	xH
s9:V: @b%9~F<"zo[8?v	4ONʘ\wk?x~9rMkJJ
 .Ă=la;XM114`# @
+
:c 36J~!.(0hvM1* SX ;
cͪ:s	qֲ̋+ݎ)>-^ Ed?&'%>c]=tBEX9P$#9
y}}]Sokƛ"hEr+;O*ϸ؝3E]Clw7aXXlfz债dar/leݚtGZH[NKy$V<P5ŪTfeL
 +Is<?)3csY}_w]jk>mhNNZA)JmT\ex?}5^{?_5i	MޕѩKEe\ozĉ'xzrkx \
fLwղ;n[1{vZcOqqa2װZ$>=#2@]Se7MKM1D&V:v}~bp9B`N-ɘcR$:sIND:bζ$s^#OY՛Sey&/"S)kR
 e`X'ڲh篾[{\w?I.܂
'>M1iݲ^$.$$NjRYyO	,4 \
kAV̅2|yrq0**"2-˟3<lfdIb	xeo8^5o0YL90҃TcYDsfcbf+($K.Z%"&YRq
 %`ws?aP<X.3>n{e7
b+$wRDR"(Lژlջ|8L]dzˤn2 \
an;xsU2*_L}=B*WUXV \
+:$>0i;ȱA{(3jl/o	_$U%C6-`h< um"% \
+؊@$wwt,ռ\860u ЕsG=As/ \
Z٨>JnWfz!/TigBU_\6ʅܜc	9mdnx][_16i\y/*ꩵca \
On~;~3?=vαE$_qQH\_W|dl?|L؋Nh679wkһ̻o)[3) \
˹](r#L6'qsۥ7J\zDt҉i.w+45baTjw<-Z \
3MSHo[ܑ&`@ÄtIHmga';!4RSP \
+`t%vAD?<W?78?>◿}m~|o \
.Vdݗ_~JBgȏj%y\sٹF.U:8r 6PYͪK$MYi \
@Z@jJTJ K$Hgق)N+UJ0BA~Φyd;8[FϨaҰᴜζٵ~&spDi!RL
 hvȁ[.r$&R_ː2uP
V
+`j(IH_@G*V[qOw[1H$L_S \
>?m[v:h0zb[E"(9	_ׁԘȀCCcoL[UXl|ۙ޾dNctlOﻟbvp1HS
 +zqqkO],y<o^80,M3,boaWy)﫧U(i~oIcgZ/Y)YklFF-Y`fkBS,
 ɓ&c엋dF\\
+WE\΀4hb
*	)tV2dMc|{`ܕO??xd}9mӋx;93|f
[c"atZr2C$9A<R
+ɉm]9[ԔzIaVPRmkU!TG'W2sP}NNLr \
?EnyO@!Q`~|QpT`P"Ӹz8?5sg8s	F(zM1qH&v\JeU[h<w50P4ÊiY
 +,͓*Յ&UGn7a
`BQkm";XR(;Nmi9wϾD\ \
f;]VLv@]|͚=ԃZ_k"u-0o?=8tYؕr^0-?rKM\_a5z-M`PP##qk#(
 +Đ&
ȁ!C#Rg#jO
\xI"}%"6ƪ_l@*\ib9;ٹ*_ސ''i9Vw-y+s"v@^AnfjRVKTq \
n!C؈4T4	@$AKR,~@,qFA(Mbh1PO DD͔1PT15	 \
#A%+u؈{w{iC%T<^"Y.fD	4YB27aS'V:dN49 VⱵ \
+mf* " *SeQ(ߪgVx=j_K_K׭zzv31J}7&W}UdG0 \
+P1 ~|XGЫP4$UEIbxøD
+
+EVC%t4aFL AdDBF|Θ3f5f74fC
$RQI?64)"_!d .9Hҁj܆t$QףI@b \
I#݇$J5@ezփRPO*8	<q2Ōư5z؊vÿ \
-~(2P0C:gN+ƘDC*)D7z48B쥐]"d2xz회 \
	\a()ML$;	HY99-rI0VX%l#<K~yH*Cel߷ \
yj1Fa? 5۹+b$w{*rn72notltmt5
+V {`+P$O8sɪHZ (]KoJoNoMoKgIۆ0fV5/_u1
W?pm$ݱ3 v_ԁxW|
پ}Сnώ0<T'翧x \
yZ6uٻ(NpjVL&SFfFNzQj~\j\ʧ]._ҖS3,)+ZzM왵}7^|b׍.m;й{})4`VUE7r \
:Qnc*,2,2om̋ \
S,df:4<ʼtlX%H(mܕKNd4&֙4ęѮ(Fѡ6Վmvb@@"EU/q74p \
T" retZHٹpAեHN"ؙ:rق \
+Y,?`}n[ʼn%W{*Fg?{O|׳?gǘY \
N7rt7N|\ҙ~0,0F\nn2~,㉐1*_c&3Z`g\7ҷݱ3j \
s=Ȅ	3_--3o{濇defʕHVU3G)sC7+37)3wɻ3m,)|&ř)ddŮ)n \
,vn>L"H!#>+3h4bi7qފpwcyU4+rsmjlZ%?hvR>
 G%4n	mJK `K.]i|҇> \
3=@v+Mr%`-ugyk&#)岛:[.~t(1ʈ̚.LY4^/} \
w]NV,jǏ ՑhڰgIm>`{{z!e87OYr/ۛJHvݽOcL?Ȥ.o*"^jZcd(\^v-oq&B!k0zLZV \
\jU&4#*ɯ`[}*%*t~ڢ6"$>'>}o#FA(H \
+BD%uݲszSoPFPŅld4R;z_iHWkuX )t{i \
@7l %T +{j" u{lݺՋn??XcOMc8LB<~mљ^9cSbH-}k|Nt'	QEwo#; \
_(ReI\rP? *20̥SU<؁,QpLJe[Oe;A2'L( \
zZ15ml{/iW?hLjRW:jdPuEI 4 %& +/񐾿s
+̲䯍IC-ONg] ғް?< m4<d$/vy8G) \
zf3Y"x@<r-٫:v|?SnceMVkqVF \
,#rC($x!8;nX !^9"|-=
+ (urInY@3Rz(^TB\2
+/W|OJd!wQ!եNKKZ2'LoC4xj|0&}X~op	2&9;Bhƥ;c}d~byj<Ssyܕ3].k}FWN9.?_| \
⁖J2Gg]"Y5"9rU:wSbHgA.&Y*O;ɲ`TT2=b=
 s~Rw	XQ	043bEp	h^J%3\sp-v1.O 	H-|(Le }H& \
j/L-ދ/=29kNiGwP1-tr/kNcwtOQ6,9juw \
B/;AO6>ylʣ?k'}UP}@<;:#ԴovOmZv m \
ȡ?ZݹCeojxPfϻ5q^h(/~<9MVK١P[o$[Fd	"'Z3]Aۜ3~1F܌7)Oze-z*>ZnRRȻ7hy<< \
4ld~N~,u@n;_Ӭ177޹nܻ}g#~&c$|T +]sN \
&4֨syu6͞dUU	/y``XXg;j\hX˜enf%Ҽ˼uz)t \
+ELGL% +dDl(1db@TEC%[Ng(0ATЈMvꇻzg{0T8% \
hx+ uK؁f-m>bgK'MϱǦ/.K \
\X,TLLVrԚ@%95a"!g,Sm<,Iv\j4A0a)dW?){ \
Io4CzF)F=(BkZh0X |.k/'vf}ſ~YWܸn M\aM \
Q/4<Nl.Њ_v!PM}-(^Qd_#e<z__7O*J9͡ph&KxqԐQ&
  'kDLn+յz|\b?F2%pA2tfqFX=jׄYMѝeP:DT1#cq65aSݭ+Z<n*=OWŭ0aJ֔aŪ \
fuZ@P`-nw !dURd=E%h޽I,h&ڽId%D/`:HLI<jquϖ]; \
_/wzӘ;fˬrmEy-ŏvh|#F,OI<"WjRDZ-8$ \
cxq,cw)6An/2C`VI_:MЫ.(?=A/|?Ë7Nߵ~t|\=GZN \
K^&Yő _F;uA9u~?Q'ک6M\ \
,Z6r<%t`RxNpi^УRڰ33+&3neCR]Q:qHJlAzTտgA✞7K"Dt);sM2OgM(,~:?xnuq?B}"ȀG`
 +۵џⷶoksX=G"Qum3Nv;N='=i4K~ǿ,j䖋u"cP6(`/Mf
 +(n- <{,$k:}%OnƁm7C7ݴdnk_gum=47 \
Ĕ|UÒ	Oq9`Z`jd6>c H*uFb$+~k^C*)J޵֝V2úֺzZU* \
6P$<..\g)N}XMTsMwGװ \
/Uq}uStꨫN,ds__]̀=90|[벸B;;sʗ{X(]ׂ+2~5\!v.PҲsg``+,,g$_cԙk3̬ܜ2ci"f	Y \
[5fffLR*͎otP!~8XtjPĩ#~'ĉ%b>l#?.gT \
o3Re^\sz	(T׀S\,(uRcc'	NQuEXo0#`1[gboM \
'Gn~ۑ*~2hßL{zZAzʬܡ<J滙|0Ө쎨JHtfvD?J \
Ulng0]zMjbC,a	S%. \
uiШK+-Ҳ]~ݘ`]x5`f/&$5yJzcI2DF)u=جdV<|uP)7ڍ4n'X_3ԯon;`Wdn]qErS{7;,n?ݼ
 i9hٯ?ÅvK)o>z
;CyckcA. CLcMQq 7t \
f.+c7#	`tSts1Mt=։vPB҂> # \
R\P!_ef<7^㨴3MVVq;쪝^^fA=^vѲ'qօizCEK \
z^5.91u1%TZRm! icݳnzuAvesz>/0rCwo` \
i.[SOә8C"g(  V+yLT`x`?9Ag#!"haRwd+ \
b$aɨ~,o~4ɬA$B0qZ&;-/bPVq\)g4K \
`4ձ{ݪ]s1Җ:6owt֮~t_u.jۂOƹq&M|` \
d85Nt^g	'Q8Qn>/C8o9AxP \
+;r"`/d6*aoWm a=OYaXAd'`Ra%둇! \
+	8V7]ɓ~9feEDD	J+$=ٙar~8J1`\PlȹtON	 έSv*= \
+04hLHlkBϥz=@ct@nxFa*.VIA}ҲQ-)t1ckG_c;a \
YqxL]US|;VՆ#yѩ`8@SsBI^eU&^%Ƴ6 2=;5׉BS \
+8M;DhY2"z6^hnO~ĹDii"c>+)NRO^Gl-=Zca_[=F)o \
pjgUt88Q~4usͤX*m]Q2 \
!l+j-Pfnn9CM#GL][?agx<N&qU?)K x~,1 \
T-'`Q&2)3GpYVkʅ \
HƓAÐD7SInVU$53(KrjN)'fT;1怹Ȭךyp :#
+b	j5nj&pmFMp;B1cYuE*%Y-s7D-7
+h[.q$#،"eAkIMS}ۦ([dl(7Fp=GQI)T\iЁA%AG&wV&ᎏͅ&_-7N
 ձ7aVmɷYX~ken4.o122^0H1XfX%vьN)FYbbU5k&5b~dvnE'ڹ:~O.; \
 +s9[׆+=;>w.$<N~gm/XacU0!Ƃ#I<
3ط-F6o:S;o)u ݊v~x|`7\0ERt|| \
5,wETmz:^gϬOk{92n9ruy==oW$/8Ztmc/
 +7.T2ejח6au8;|k,ul8âRЛ{g{֍lHE.0ؐQ? \
`T6e	BDJtF!+FY( RP9|PF GUkQ \
ڂ$J1<R<y#J.ZVTߍ[韹_|+gЙ?kr \
                Hy".ES=8p9ঃrUw{
!p 7=m,}mz!߃PuuG \
P@:hwm'sAMtp↔33aeYLʐ桴E>/s7'IOB_;`}*PWH-h
 +endstream
+endobj
+17 0 obj
+17364
+endobj
+18 0 obj
+<</Length1 24376/Filter/FlateDecode/Length 19 0 R>>stream
+xy|E8\GsLrLO	BB`$͑pDLG$&( \
	((YEA]Uq!&uU<X_\̼OLwSOuUuwSYBQT[3!7G
 +kLj:Bkܬ0a(8y!gBm?_w 35cf#
+gAN/g͹foqӢN3͙v<y?
+M̈O#߼o^_}k1]nh&eD"C.|csrޞر؍aڊEF[x:r"@ґy$ \
7 7ȗh3Gpdt[Jy}I8<aE8_!SrO$YλQ<GŋP	z \
"Q&Ȋ/_)%M9hZ:82݄.{#OBOD4یD[PƢ&4mBϓAF>t
 +??菜]g+ Ț5h>=:hChZCq \
wC[Y!hU@FAwXp^LA(Buh*݅:ԁv5BV~Ef4t;ڎ \
`8doC9Iw7=ȃ>^|Aډ?R|^w''%#!MNt<H[ZNٹ\5HN \
O?\iy(+J䯑o@4h +Z|}9p fX<O 76 \
^ů᷉I!:r/O2z䲸| 9oEBO   \
"HJ$/2;r(foh)?;>A ߣ8;D<xJ|= (~?wN \
wSw!x \
i&8%ud=y9L'H/Ui*ͥpat8]MԮn7q=_>q|:?{}Ƙ[nO"':bqJ|L/I]0,^tɁh+7x"ոœ \
Jr5$<Z +e\a,zbbooeh9nLw
D&U~
+Zx0ƒ+H:]-ak8]j{%}o|zbsrr:}!gA\Kgb/hd@{o
 4ߎ9FW:{/r%#A"[9!fh7 R \
nI.q`<܌qpd)sQ0} \
	}.<FTh4'{WЧ@>&tN҇ ? \
ߣ@o%1Qǟϵ:tAOV~E>E>|sPdNyd.zşA	zlpȌXL:& \
/A_ZEAvס	F \
3OXB](ldD<Eb'E/{ġz/RVZR\TX?8/wP`@fFzZ_$'%z=n3!>aWmVY1ɒ(LjB-!.3mv6
 +]R mBZLuKZz~%VrT3PLBoL:
`dZ5<i\X ;JZhVWmSL#F0DL
+dȅ\iaPldr6$*MYd]ьiC*G&9CxĵiׄP-h4A#ׄ!x6
ݧmسN]4OO>mjCNkd#CE'ܿ\ #V\ZHWWgkrZg|å~66 3^Qղ
+^}?;: φԌJVrӆZ}}Lwu-wxz
JmĆ4"1qȤmhu \
]&g66-1[.̸Xg,W]w(mAHV4@JY2шt!yDju+g5M[}~i!C=X1E|(eg3GDBE9tiT
 6mCr~?:ut
\o^kC$Lb5Kk.ޒ"brBHʼgSqV=~JV%Fꉿ֗^p2RcҀ43*g	>F4D͑Dj<
 +v'3{!l?=DmUԖѴ)J92/ņeU̫)$^mU]իҴ-uF^iz^eKwFKUg4|[^9~WN፶rbCx#Z7nK.
                
!(%KٕƮP5 Qإ#ԨN2k;IL5AQġ+9}3avjֆ|nlrG'%mIm-gchqY9&zYk\vLKYebQŊ%6,CKNPTi
 lzB؎S}-/jt#cc(3:5f{QQ@ \
S3fh^Pv޸]cj,g {8
CƢ\
KwtC<vShxha4tn
m6z;"=h>,?)+72l/0n#GPp8LH6	\IT&NCy<#y-i=OB<g4dG$[" \
lIP#`ن5@ @ 0TG[z"%h	A6H} ` \
=x]5%mcwG"*2Um0E@iV +VF \
9'%pYD;ϼџ9П2s[*UacxA \
(.,0PAG(ʋ(ʎQE(rE3(>E(2G Xg	D;v&L \
ڙ@3hg	D;v&L \
ڙ@3hg	D;Q0Bz@oDс(گ+礗d*x1A?kC+:hv-<LKpl@ۖnt+zТ5~NFW=E(E
 +[n`E%938᥸SdN(r@C;쒾8!'U;:Q!؎
B

+[Oǎm=hFGV2 Y \
k;MoQ@bz:WA(Б=/}s6Av~ +trc \
<CvN	}^V' |򽚕{e6_|ҍjCRoA1\ \
+.~73ZvNaߌ|-k:x \
4&U^<*;	/e<Q'`=w2C \
]|eWRgÃ^Mb6}^(A=SlSd1^rHd̒I$A$Gq} \
3ʐ3*AJa	DP&J՝b.TIW5lFVU_OH&p8FCd%
 $anl
> ډF\PpU7IK,
r/kv{l.E첝]Ck'4$7Y&XZ5AEY9jlwe+綏ll)6ځusC;JHcfvh;}.!h~v>F;vfk#Alڤ!4h3;
 ]Ҧ7thm7V9m#k
+
+  ' N2k|I_dG-Mh1rḺa7_n`:oЧ;k@c8XI_8	nXqS;r9$@3=2nPlUƪYٱ*X
 +vx 7_Zo[䮜=2<n3;WQu({BumX	F(_FQMO8?vofxPK \
     z`u:m,a&ßhs0XBB5M:_`up0d \
F/]r4 U(ZuK/SKp1Q$F<E&{	#$/||sJlrTy \
$v=PF{.<i\5^<o)И)J:&zAH{sU[N5@MԿ+y,5呓C|"
 &N8Er) 8'uog#PDf## \
`\qށpS\a;	JK%΂ ̴TQ  \
Xu|LDGI콢v`\W3OJ&Z^Niژ6'*j4NnF͸Y2Z鏲|'nɈQD&KW(,
 +*3GH$ 
+BnW*  $:iAèZǝ8{L_Ezl?(xwpnBMqq%'on
>ޔXx?g30}gk \
S\ѤI	o6Yl7t3-a66#I	rM53&>h̭:9M@$ݖm\w͹Yyj2ꥼ̚LyiF4 \
݌͝&0vOC=Ҏ1flS_MQ&8|wHeM(?E{A@'N[\ \
+bFqIqA3!^BZj,go{]|um&9S~x[?KLY~ݔirQuWTe>?~~S1 \
e^}R$K3YҽZ1&4 aA4hUbs4q=\.NzZz?pE \
.&f* 10n1uؤt66%Qs	ZLwťζY0yӖEt+t5;q4 \
5=&&ox#9)o5 D ~| xkn|!bQ6HE|'it \
+҈1e7rtKo<'?J_ԑOV2謯2S7?_v7U$O|ӕ͙ \
 WtòHǣ*su
+ fr3BBB=}Uu:۳#WaL;u4C@ \
CɝsLۉ.6VCͬm3Yƛc`q'2-6!}Mj3qq~Q \
t[B~riLj/pO`o>1op`2[(7 \
dH7H:ߑs~,҄$1I3]e)gKIҳ҇	f|ApS\N0iNi3晰 \
4A'MQ!fNKc*8fZK YYA'-D_61κU[R\ \
8{PLU	aҺ/(dg~a"\\U6xj \
+Zw&ߍ(Oe*ތm榛Az_r&*s^6(Er|>#X
 + YZֱ,U|)P&hFT@,M \
\ogYUfͳX7XXEqvJ7y\tރ#tT}/\d~3 +TmymY>x \
1[s[!3%Dr&plJ!Q(#6n \
3-4.v+W>غdmⱕ#w~6N{?wlS^h \
߆{gN/+m.ro,$_Q"Հ#[u'\ 4G5Qcݍd \
+b^+Xkl6b#yS7)4Uz" \
d5Peb%7d|<kzrmrK2ZEK	Xۓ_kSp٦a\[֯0/ 4 \
Pr(5?>_oY~3cUmw|;oy~G \
IK?~GAj'Oڑ=%Qw\o$}GHJ18<B&Wc͏߷AAkgVҐlٖ}'TZۘ^IE \
&` bLrӃZsˤA;VtmE3޳v͍(/=b"P5 \
Nzy nPbY':8	k&M)A/'1B<Mr)$H$S.&v&2;Cn2	"e2|njj1AdW4$*%{-gRKw
 ,@Ӊ$PR@ q>WQpt OJ' \
υ1uhp=W/9QQ@7;0~1p{%^M \
+V02iw5^kv9q~_PkqG +%
YF\_;qG04OBLU\3ңƕyhRFeE#)Ol{",X%*uyէjI2(eoPj+U| \
xmoHoz<ǽOS	K%8m1Pf#GR'hL$+%Y~E}0
 k$}G-Z$;t;Fvڱ4O.-2E*`;SʺcJ\55	AfĜ
SAA(V <~
+]dKѿ?]Nڗ޺5|7OoqA~dw<tv?N;86'uf\o0ߵw>~ew׶̏.RI>l'B!N'SxExB|@
 +aFx(r&E!T%`r")U?PRI߬R)rS:/l!"$괖RZnV\ԐElQ-JZm	aH+]1mZ^` \
Aܨ  +Y@Jn95}|w* (pPt#FlQBˣ 0sX \
zR˷K>rfo7!0<&Thjh2Hfȶ6BD!B=p)+if"Ehk]ǣo0XDFk&2bbN$bPܵ$<g&[
 +	Ka]=,RTQ0'iv/S[WP[YJTIL7I{j\8#D \
c!FX"{̲G}L-4kV*J:e>c`xY$j_C}וfc.iYXiJZ'ˋk5*Yen.DK%0FensEL.5W̔Dя0YfT"a9.	Jb \
D*/e Ghu&Fìf}؟| +^%0e.+)5@nӡ;+I8҆` \
_jxSsp{G8rK y,L,l&0;T
+*&6zO01ko2ֶ++gb^96+.`>ar=:on-k߈.6	b \
 }>9,~+y>T]
+zl*?E/kIdًc NגQ<FpYcZe. \
{J%h'qYލ.[އ}tZ'̥ \
+JR<ƒ@i*s/><>'I9"S5Pt"saF)ds^;Ht2)Wn \
.ΐI2y>ϪPJtA;BC"2]% \
+ڨ˪@3[Z;LFH"HPS%˦Pu3`]oo#la8JRʖJhi>Eml]JqǗa5kj)V \
olSp:x#sbܩoOyoa7Blm{/mzL|V\1;7øcI_ƙHȋbW'gٰLݏՄ,ԊEN+7IOjII^!PpaLk!
 +*O,O&0?ńVpJba!.f
]7N}ѨWtzIwW?wf7}_h0-	mu>OMj㲽e>ےLRj \
/֘Xƨ`-o_XoY>c2u)].#Cq_zT9]~HLsvS	ycG	1 \
#Ƽ_Ȋ&eibx8&4ȝ/V[X/"#zd62T(\09hgR#
 dx17m5gC
+f,

+p o2,|weݻO.닱Cr3xg$?lܪ1\KmΉ|vAjOMʖĮ7=d% \
<_Fd]2W-(>ɕ+NXRtT2>JHS,s,5'x&e͵ \
6S1P,]_Xbe_#uٛ\ 1`o \
U'9/Q7[Mm涀<j =%ㄹNčmg琇< \
+m"пFqWb3֦ [U6Eq[ \
+sE陙EZr3!S3a0`xog{b \
+6K)˖q*ǶUyW^_=,k}XfkQ1 \
{̜ӟx%ܻlOElIzAԈ)\tuɤJڟ`	B*</u{WB'Yۘo"BxDH\LnW9
 FCDt/M0M^#5ԖaI`JdG!b??9ݤxij$7@ih0~F \
s[ֽe$4T@GwdJ@cǁӃsާrO/<{.OJq4:f;fynt{Ny
 +|emI4*B菤NԽIy %N:'6͉!grp=Ί4[EN ^%
 jFs!^?Tuѯ]~q͉H_
+VSI*u^ gclSm-  6ڝ=ҥW50ӫ\@z \
eko˶HUԬhe" ǞӂX7!ˀa(aRѥ], \
ť|2|*kod_ڹ&,߿U;f\#sG_6l~~pӷş9aЪW>3.O4"[WV\;r;rDS/MLFHo \
7t?/yeV,B}6 /CqAS)M( Æ:Ix=K+ED.:`p*p \
8,`1zJirI&1YƼrf$hۆy3V41]#kVoq[çM'ZYtݻ \
m{7&7N\ÍWϜ*i4$HFb at[xi{HbCBmҔMhs:NY@MlSV \
y)\޴BxP+F6fVaS\W@$ \
Ȁp;ƚkI7&",8EMgΚtBϓk[Q1>P'7h8Cp^`j\aUJ[.Lf3+i~-|P2+/Wh?d|m
 Gg0|
+(v+p<"oV:Vˇ+-˭2'D$ɧ힄8Ck
+NAc3ITD#rl-lR3M̴,os[%N{R~ڲ[#>>ROK??JtW:H:MT{4]:VcSKY	 \
Z	H8J@p^$0+b`7IvcHT:jw#ӣz猍}gac;,__zQ`/qE19!e \
S4')dJf1idbcnYS[9	HS+0A'V#0 \
2)+9z%G6kYG!F܀Q*  b?b{Ծ<~ \
P]4O<._öcm?55δ`w	!67?);.FQ8,~ \
G_P0C="p[9sqɋzg\PELkr,P+H*j8qq+v"%d\j	89`w!L2D*ުVt \
G!uăB7I/-UTp對kNpsu.Z4'Ծ;rf6bz#7e0e \
rݑ=~D5,Qx܀%rэp|#iƁ]Is?Tz>ح΅?щ̹7W{+?J=< \
$?j>pݝKӮT^eylrK<SLW.-~~\֬ySVdCJJ=YJJ=eA>'n@>qŃydvsԣx5#e'VIMӍ%Jc	
 +gmJQGQ`6kÐ+ԦhJBZeG9J'~MO,~03Uf?c).tuj[2s׶ʹR[yju]Ʋ9
 ?F
ޥz|87eĐJxUw߿C3ghM>OSW@qwekӓ_|]t/h \
%m\Ӻzђk@>'#uM-	{xU8*1Q?9@%es-[KITl.{*s=wy3x۳gxwvw}x?9 \
pAX>V?JʞyAI6ծ-&7E&E)cD˔ lQ0k[!$Ե[f=d=m6k \
r+v|݌j@y?huA싻[PbALKIXWK +޽0{ \
:jczq1WON|KS\}7MrڤeOI^6z#~{~oduEz𖢽L \
yXѴ](Ȃ)%#no} \
>Kz)ΒƥrP,N녥ZaxZ`(ih顇azu)܈TZ4ųv(v<fV]	|:G|Dvz \
> $:I׶#<wq\=lt߈fٺ`'s!lűHß`'OݜqЙn>EyQ3dschn4{[(yp+}ND_GGI''*PYM#h]F??6I	qd \
> &Iba8XFäz:4)\/ΒZu:o1D;}t_:> \
> =CC}>I?ط.???JL.me,x(&fhэQ \
> &pl4QnU.2@0\xLJ';|<^Gx }+ \
> Yc9f!lSݤmw1ž0b_r\l/'j|(1Ax.f;}2Q*WH^i/v`x)~`"b#$f!VtqaP8IEW<l[j,wRcB/YӇ^ \
> wM_)^5!eqgF06
kr\.
+E?G)U7ۼRi]YA ۝ \
0~[w;lc_ZSbRAHlmXGy$/iË:RQTӒC2'<?jv$^a=9s[##1#9s@f \
%*QQQR&+e4Yټɶl -39;햝;SB9>@ \
I'}p$#cSe \
ɤ/'D0!ss0!t@v6T4@EU5{|<$&%i))8;[x\nOJN\&SZ6'b$SQPUuS]=b'I^֕H29wQ&gtG6Jc \
n	`{hw%j2At:ht5j[,d޶^4	H{/qύϿ-rC-4%3P4Kn|wFb^+߿p2Gs<2JOQ
 /z,?wzu9qfS.jo\9dE߭d"u`A)d\vq5җ1`p \
h1p#sHX+Q/GEb*w \
+}7}}UEK>۔!4pŮ*aipJ,\J7eZ#ʇVņ$>+?kmUZee7Qr!6mI[=hCv5xb6=&G6fFU3kQ9b&̹
 +3Klx<5<cC좏PG`IEwM@$cmspI3]s#; \
ޙ4lHZUlJW7T]\x3ޒ	_>b߄94#/zA/9G/ \
/@R#MY9,UY芭1A+ \
+tA+QE^YU8$faUTAj3/tB2)>\Cg@m~8`@7 8> \
:5}-_[V~Jq5 \
;_=Fovjdpsp8򶣸z?v5D΅o>j(?02QLA3j3Gc \
hmmgݧWI)I$lq35ح6L5lCЉm6ME*0+6N*lH \
+htV!pKjX3*[ԫbaTBu&31>sjm "%kD{
l2d?*8ͭk=nc9~q">!xug޺ϘuN<7To \
ByY @˜2-KX4x?gg;b9iqX<&>b&kEb9bVfC6Lr'~A \
l`Ā +X0c@"`&qH6=XD1D	/{?!:2*JKX`g#԰9vQ7]79	'}_[z3>rjZШkz \
vq![.0uCz}u!r<0Q8y`i?%Wܧwc=^aW>ǽ$8)iy)OskFNhp&/t/KU!Sɍhܘ \
Js2.8~艢pnz 7PYMVG:*BLE  \
L@p@b?[E)""L^|pWaӜ \
;C'8:yg7"_8"0ܳg[Oak֗؝yȝ˖ ˂, Vu: \
`ŕd1K? u`ɓ]wE+]Hǿp{=-oxց˄xFB
+|2ٯ7:ꀱ-WLţL|Fh"1<AL*gQrBDdBeZ \
6	,b@&A b+ l2u@ T(
+/TE3>,B|SV
+- <xn|<엝V7(}㳶2SQw|/Lk(+F^0~'3~x{}tK=/g{ \
*M@E<@.QtT>a`%0n>JFkm/L]W|=?.S6lnxĺUxVh̦b*eR \
Z, rl)}ƕAMV
+#űn]mVxE@&'("9fƅoyp&
8`Q%"cRn$2<f ǚ2LSpI$"Q75s% i;T=	1
y.i;D4RA(?ng">ye_490;EPԋ=OSv>9`A\t	0*l	aG[ \
ڣqƦ)9]axw=xS}S̾RI S2!h) \
+6ي!<a=7b	FjfR+*LE<jQq3,A{ћt#)ߢ4OLJآ2*# \
uK2!sh0;Ẑ8 2}R8	H%c0WQ;Xk-Y \
                +Ǵ)	ZǝeS>f
-WA_ &d/1K@ tXZ
+Y~9ߔ)?WgOa'YCAMm|rł"!NfDOysleY5Ηi=b=bfɞhuG'LKxy٣ \
k9s?N8eY/o*8TO^ꦌj=;pcggdU'eN3ʑڌc93 \
NTAy(vT  +5hG^4
@W 
fQ*Z4 1h4`# B'VQUUXws^=<~}y \
:*|H[PM?prc0n߇^h!>CBᝣ.aS \
w^ +c	:dxg(VLFcX9by4
ggmA` ԨuB[m$OtB6{/$Y$O`
+endstream
+endobj
+19 0 obj
+16265
+endobj
+20 0 obj
+<</Subtype/Type1C/Filter/FlateDecode/Length 21 0 R>>stream
+xeP]HSa>;g\i
Rߘ#ѥA.rN ζڏ5UeI8&	^XXb]"8^E>Azl*JT9CiJ>Ê'QQ*(K%jy,3o?˞ \
w^RVVRi6Qg,wJh2#r'BN!qks87j㑻Qq}	2IgEM \
列9Y$v.%`y7Ny/;>`$Q#r΀zG40V@@6r|H"OI
 +%F2 蕁d"{>&cIlq[8jVS5UE2^sϖfL-a䰚S0pŰ1jTN:PUUOb'yBH8E^&3FM?|ohVtd|hkcwC \
 6D?`n-&^WA5N)27 \
;}pI|ٚ]ǟ~xrUxc>uxPmP5ו)HLDaϩ#scK8zagK&DFuBi \
	zj;:fT	/y +endstream
+endobj
+21 0 obj
+642
+endobj
+13 0 obj
+<</BaseFont/ANAPBW+TTE1CC3880t00/FontDescriptor 12 0 R/Type/Font
+/FirstChar 1/LastChar 52/Widths[ 556 556 556 556 333 556 556 556 833 722 500 278 611 \
278 778 +722 611 667 667 556 333 611 556 556 556 611 611 278 611 278 722
+722 722 722 722 667 667 667 611 556 556 389 278 778 556 278 556
+556 556 1000 722 556]
+/Encoding 22 0 R/Subtype/TrueType>>
+endobj
+22 0 obj
+<</Type/Encoding/BaseEncoding/WinAnsiEncoding/Differences[
+1/three/two/five/zero/hyphen/four/six/one/M/H/z/I/F/space/O/U/T/S/P/s/t/L/seven/eight/nine/n/d/slash/b/i/A/D/C/R/B/E/V/X/o/v/e/r/period/G/J/l/a/y/c/trademark/N/x]>>
 +endobj
+11 0 obj
+<</BaseFont/GCCBBY+TTE1CFF4E0t00/FontDescriptor 10 0 R/Type/Font
+/FirstChar 1/LastChar 41/Widths[ 556 556 333 556 833 722 500 278 722 611 778 611 556 \
556 556 +389 333 556 278 611 278 611 722 722 556 778 722 667 611 556 667
+722 667 667 889 611 278 333 611 556 556]
+/Encoding 23 0 R/Subtype/TrueType>>
+endobj
+23 0 obj
+<</Type/Encoding/BaseEncoding/WinAnsiEncoding/Differences[
+1/three/zero/hyphen/six/M/H/z/space/D/o/w/n/c/v/e/r/t/seven/I/F/i/g/R/N/one/G/B/E/h/nine/V/C/P/S/m/p/l/f/d/k/a]>>
 +endobj
+9 0 obj
+<</BaseFont/SFXIBP+Times-Roman/FontDescriptor 8 0 R/Type/Font
+/FirstChar 32/LastChar 55/Widths[
+250 0 0 0 0 0 0 0 0 0 0 0 0 333 0 0
+500 500 500 0 0 0 0 500]
+/Encoding/WinAnsiEncoding/Subtype/Type1>>
+endobj
+12 0 obj
+<</Type/FontDescriptor/FontName/ANAPBW+TTE1CC3880t00/FontBBox[-1 -210 877 728]/Flags \
4 +/Ascent 728
+/CapHeight 728
+/Descent -210
+/ItalicAngle 0
+/StemV 131
+/MissingWidth 750
+/FontFile2 16 0 R>>
+endobj
+10 0 obj
+<</Type/FontDescriptor/FontName/GCCBBY+TTE1CFF4E0t00/FontBBox[-5 -210 878 728]/Flags \
4 +/Ascent 728
+/CapHeight 728
+/Descent -210
+/ItalicAngle 0
+/StemV 131
+/MissingWidth 750
+/FontFile2 18 0 R>>
+endobj
+8 0 obj
+<</Type/FontDescriptor/FontName/SFXIBP+Times-Roman/FontBBox[0 -14 476 676]/Flags 4
+/Ascent 676
+/CapHeight 676
+/Descent -14
+/ItalicAngle 0
+/StemV 71
+/MissingWidth 250
+/CharSet(/seven/space/hyphen/zero/one/two)/FontFile3 20 0 R>>
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 8.15)
+/CreationDate(D:20070228093838)
+/ModDate(D:20070228093838)
+/Title(Microsoft Word - MSDD-6000 Simplified Block.doc)
+/Creator(PScript5.dll Version 5.2)
+/Author(Phillip  Rezin)>>endobj
+xref
+0 24
+0000000000 65535 f 
+0000006322 00000 n 
+0000043061 00000 n 
+0000006253 00000 n 
+0000006092 00000 n 
+0000000015 00000 n 
+0000006072 00000 n 
+0000006370 00000 n 
+0000042818 00000 n 
+0000042188 00000 n 
+0000042610 00000 n 
+0000041684 00000 n 
+0000042402 00000 n 
+0000041084 00000 n 
+0000006411 00000 n 
+0000006441 00000 n 
+0000006493 00000 n 
+0000023942 00000 n 
+0000023964 00000 n 
+0000040314 00000 n 
+0000040336 00000 n 
+0000041064 00000 n 
+0000041444 00000 n 
+0000041999 00000 n 
+trailer
+<< /Size 24 /Root 1 0 R /Info 2 0 R
+/ID [(Džg\(31)(Džg\(31)]
+>>
+startxref
+43285
+%%EOF

Copied: gnuradio/trunk/gr-msdd6000/src (from rev 7884, \
gnuradio/branches/developers/n4hy/msddLTS/gr-msdd6000/src)


Property changes on: gnuradio/trunk/gr-msdd6000/src
___________________________________________________________________
Name: svn:ignore
   + Makefile
Makefile.in


Deleted: gnuradio/trunk/gr-msdd6000/src/Makefile.am

Copied: gnuradio/trunk/gr-msdd6000/src/Makefile.am (from rev 7884, \
gnuradio/branches/developers/n4hy/msddLTS/gr-msdd6000/src/Makefile.am) \
                ===================================================================
--- gnuradio/trunk/gr-msdd6000/src/Makefile.am	                        (rev 0)
+++ gnuradio/trunk/gr-msdd6000/src/Makefile.am	2008-02-29 19:26:49 UTC (rev 7904)
@@ -0,0 +1,22 @@
+#
+# Copyright 2004,2005,2006 Free Software Foundation, Inc.
+# 
+# This file is part of GNU Radio
+# 
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+# 
+# GNU Radio is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with GNU Radio; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+# 
+
+SUBDIRS = lib python

Copied: gnuradio/trunk/gr-msdd6000/src/lib (from rev 7884, \
gnuradio/branches/developers/n4hy/msddLTS/gr-msdd6000/src/lib)


Property changes on: gnuradio/trunk/gr-msdd6000/src/lib
___________________________________________________________________
Name: svn:ignore
   + Makefile
Makefile.in
.libs
.deps
msdd.cc
msdd.py
*.pyc


Deleted: gnuradio/trunk/gr-msdd6000/src/lib/Makefile.am

Copied: gnuradio/trunk/gr-msdd6000/src/lib/Makefile.am (from rev 7884, \
gnuradio/branches/developers/n4hy/msddLTS/gr-msdd6000/src/lib/Makefile.am) \
                ===================================================================
--- gnuradio/trunk/gr-msdd6000/src/lib/Makefile.am	                        (rev 0)
+++ gnuradio/trunk/gr-msdd6000/src/lib/Makefile.am	2008-02-29 19:26:49 UTC (rev 7904)
@@ -0,0 +1,117 @@
+#
+# Copyright 2008 Free Software Foundation, Inc.
+# 
+# This file is part of GNU Radio
+# 
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+# 
+# GNU Radio is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with GNU Radio; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+# 
+
+
+include $(top_srcdir)/Makefile.common
+
+# Install this stuff so that it ends up as the gnuradio.msdd module
+# This usually ends up at:
+#   ${prefix}/lib/python${python_version}/site-packages/gnuradio
+
+ourpythondir = $(grpythondir)
+ourlibdir    = $(grpyexecdir)
+
+AM_CPPFLAGS = 				\
+	$(STD_DEFINES_AND_INCLUDES)  	\
+	$(PYTHON_CPPFLAGS) 		\
+	$(WITH_INCLUDES) 		\
+	$(CPPUNIT_INCLUDES)
+
+noinst_LTLIBRARIES = libmsdd.la
+
+libmsdd_la_SOURCES =  			\
+	msdd_source_base.cc  		\
+	msdd_source_c.cc  		\
+	msdd_source_s.cc
+
+# ------------------------------------------------------------------------
+#  This is the swig-ish part of the Makefile.
+#  It builds the msdd module which we'll load into python
+# ------------------------------------------------------------------------
+
+SWIGCPPPYTHONARGS = -fvirtual -python -modern $(PYTHON_CPPFLAGS) \
+	$(STD_DEFINES_AND_INCLUDES) $(WITH_SWIG_INCLUDES) $(WITH_INCLUDES)
+
+ALL_IFILES = 				\
+	$(LOCAL_IFILES)			\
+	$(NON_LOCAL_IFILES)		
+
+NON_LOCAL_IFILES =			\
+	$(top_srcdir)/gnuradio-core/src/lib/swig/gnuradio.i
+
+LOCAL_IFILES = 				\
+	$(top_srcdir)/gr-msdd6000/src/lib/msdd.i				
+
+
+# These files are built by SWIG.  The first is the C++ glue.
+# # The second is the python wrapper that loads the _msdd shared library
+# # and knows how to call our extensions.
+#
+#
+#
+swig_built_sources =			\
+	msdd.cc				\
+	msdd.py	
+
+# This gets msdd.py installed in the right place
+#
+ourpython_PYTHON =			\
+	msdd.py
+
+
+ourlib_LTLIBRARIES = _msdd.la
+
+# These are the source files that go into the shared library
+_msdd_la_SOURCES = 			\
+	msdd.cc
+
+# magic flag
+_msdd_la_LDFLAGS = $(NO_UNDEFINED) -module -avoid-version 
+
+# link the library against some comon swig runtime code and the 
+# c++ standard library
+
+_msdd_la_LIBADD = 			\
+	$(GNURADIO_CORE_LA)             \
+	$(PYTHON_LDFLAGS)		\
+	libmsdd.la			\
+	-lstdc++
+
+msdd.cc msdd.py: msdd.i $(ALL_FILES)
+	$(SWIG) $(SWIGCPPPYTHONARGS) -module msdd -o msdd.cc $(LOCAL_IFILES)
+
+# These headers get installed in ${prefix}/include/gnuradio
+grinclude_HEADERS =			\
+	msdd_buffer_copy_behaviors.h	\
+	msdd_source_base.h		\
+	msdd_source_c.h			\
+	msdd_source_s.h			
+
+# These swig headers get installed in ${prefix}/include/gnuradio/swig
+swiginclude_HEADERS = 			\
+	$(LOCAL_IFILES)
+
+MOSTLYCLEANFILES = $(BUILT_SOURCES) *.pyc *~
+
+# Don't distribute output of swig
+dist-hook:
+	@for file in $(BUILT_SOURCES); do echo $(RM) $(distdir)/$$file; done
+	@for file in $(BUILT_SOURCES); do $(RM) $(distdir)/$$file; done

Deleted: gnuradio/trunk/gr-msdd6000/src/lib/msdd.i

Copied: gnuradio/trunk/gr-msdd6000/src/lib/msdd.i (from rev 7884, \
gnuradio/branches/developers/n4hy/msddLTS/gr-msdd6000/src/lib/msdd.i) \
                ===================================================================
--- gnuradio/trunk/gr-msdd6000/src/lib/msdd.i	                        (rev 0)
+++ gnuradio/trunk/gr-msdd6000/src/lib/msdd.i	2008-02-29 19:26:49 UTC (rev 7904)
@@ -0,0 +1,254 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2008 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ * 
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+%feature("autodoc", "1");		// generate python docstrings
+
+%include "exception.i"
+%import "gnuradio.i"				// the common stuff
+
+%{
+
+#include "gnuradio_swig_bug_workaround.h"	// mandatory bug fix
+#include <stdexcept>
+#include "msdd_source_s.h"
+#include "msdd_source_c.h"
+%}
+
+// ================================================================
+//			   abstract classes
+// ================================================================
+
+// ----------------------------------------------------------------
+
+class msdd_source_base : public gr_sync_block {
+
+ protected:
+  msdd_source_base (const std::string &name,
+		    gr_io_signature_sptr output_signature,
+		    int which_board,
+		    msdd_source_base::msdd_command_type_t opp_mode,
+		    const char *src, 
+		    unsigned short port_src
+		    ) throw (std::runtime_error);
+
+  /*!
+   * \brief return number of msdd input bytes required to produce noutput items.
+   */
+  int ninput_bytes_reqd_for_noutput_items (int noutput_items) = 0;
+
+  /*!
+   * \brief number of bytes in a low-level sample
+   */
+  unsigned int sizeof_basic_sample() const;
+
+  /*!
+   * \brief convert between native msdd format and output item format
+   *
+   * \param output_items[out]   stream(s) of output items
+   * \param output_index[in]    starting index in output_items
+   * \param output_items_available[in]  number of empty items available at \
item[index] +   * \param output_items_produced[out]  number of items produced by copy
+   * \param msdd_buffer[in]   source buffer
+   * \param msdd_buffer_length[in]  number of bytes available in \p msdd_buffer
+   * \param bytes_read[out]   number of bytes read from \p msdd_buffer
+   *
+   * The copy must consume all bytes available.  That is, \p bytes_read must equal
+   * \p msdd_buffer_length.
+   */
+  virtual void copy_from_msdd_buffer (gr_vector_void_star &output_items,
+				      int output_index,
+				      int output_items_available,
+				      int &output_items_produced,
+				      const void *msdd_buffer,
+				      int msdd_buffer_length,
+				      int &bytes_read) = 0;
+  
+  int readsock(int sockfd, unsigned char* buf, int nbytes);
+  
+  void* make_request_packet(unsigned int& size, unsigned int number_samples);
+  
+ public:
+  //! magic value used on alternate register read interfaces
+  static const int READ_FAILED = -99999;
+
+  ~msdd_source_base ();
+
+  int work (int noutput_items,
+	    gr_vector_const_void_star &input_items,
+	    gr_vector_void_star &output_items);
+
+  bool start();
+  bool stop();
+  
+  /*!
+   * \brief Set Programmable Gain Amplifier (PGA)
+   *
+   * \param which	which D/A [0,3]
+   * \param gain_in_db	gain value (linear in dB)
+   *
+   * gain is rounded to closest setting supported by hardware.
+   * Note that DAC 0 and DAC 1 share a gain setting as do DAC 2 and DAC 3.
+   * Setting DAC 0 affects DAC 1 and vice versa.  Same with DAC 2 and DAC 3.
+   *
+   * \returns true iff sucessful.
+   *
+   * \sa pga_min(), pga_max(), pga_db_per_step()
+   */
+  bool set_pga (int which, double gain_in_db);
+
+  /*!
+   * \brief Return programmable gain amplifier gain in dB.
+   *
+   * \param which	which D/A [0,3]
+   */
+  double pga (int which) const;
+
+  /*!
+   * \brief Return minimum legal PGA gain in dB.
+   */
+  double pga_min () const;
+
+  /*!
+   * \brief Return maximum legal PGA gain in dB.
+   */
+  double pga_max () const;
+
+  /*!
+   * \brief Return hardware step size of PGA (linear in dB).
+   */
+  double pga_db_per_step () const;
+
+  /*!
+   * \brief open a socket specified by the port and ip address info
+   *
+   * Opens a socket, binds to the address, and waits for a connection
+   * over UDP. If any of these fail, the fuction retuns the error and exits.
+   */
+  bool open();
+
+  /*!
+   * \brief Close current socket.
+   *
+   * Shuts down read/write on the socket
+   */
+  bool close();
+  
+  /*!
+   * \brief Set decimator rate.  \p rate must be EVEN and in [8, 256].
+   *
+   * The final complex sample rate across the USB is
+   *   adc_freq () / decim_rate ()
+   */
+  bool set_decim_rate (unsigned int rate);
+
+  /*!
+   * \brief set the center frequency of the digital down converter.
+   *
+   * \p channel must be 0.  \p freq is the center frequency in Hz.
+   * It must be in the range [-FIXME, FIXME].  The frequency specified is
+   * quantized.  Use rx_freq to retrieve the actual value used.
+   */
+  bool set_rx_freq (int channel, double freq);
+
+  void set_verbose (bool verbose);
+
+  // ACCESSORS
+
+  unsigned int decim_rate () const;
+  double rx_freq (int channel) const;
+  int noverruns () const { return d_noverruns; }
+
+  /*!
+   * \brief return the msdd's serial number.
+   *
+   * \returns non-zero length string iff successful.
+   */
+  std::string serial_number();
+  
+  bool set_desired_packet_size (int which, unsigned long packet_size);
+
+  unsigned long desired_packet_size (int which) const;
+
+};
+
+
+// ================================================================
+//      concrete sources
+// ================================================================
+
+
+// ----------------------------------------------------------------
+
+GR_SWIG_BLOCK_MAGIC(msdd,source_s)
+
+msdd_source_s_sptr
+msdd_make_source_s (int which_board, 
+		    unsigned int decim_rate,
+		    unsigned int fft_points,
+		    double initial_rx_freq,
+		    int opp_mode,
+		    const char *src, 
+		    unsigned short port_src
+		    ) throw (std::runtime_error);
+
+
+class msdd_source_s : public msdd_source_base {
+protected:
+  msdd_source_s (int which_board, 
+		 unsigned int decim_rate,
+		 unsigned int fft_points,
+		 double initial_rx_freq,
+		 int opp_mode,
+		 const char *src, 
+		 unsigned short port_src
+		 ) throw (std::runtime_error);
+  
+  virtual int ninput_bytes_reqd_for_noutput_items (int noutput_items);
+  
+public:
+  ~msdd_source_s ();
+};
+
+
+GR_SWIG_BLOCK_MAGIC(msdd,source_c)
+
+msdd_source_c_sptr
+msdd_make_source_c (int which_board, 
+		    int opp_mode,
+		    const char *src, 
+		    unsigned short port_src
+		    ) throw (std::runtime_error);
+
+
+class msdd_source_c : public msdd_source_base {
+protected:
+  msdd_source_c (int which_board, 
+		 int opp_mode,
+		 const char *src, 
+		 unsigned short port_src
+		 ) throw (std::runtime_error);
+  
+  virtual int ninput_bytes_reqd_for_noutput_items (int noutput_items);
+  
+public:
+  ~msdd_source_c ();
+};

Deleted: gnuradio/trunk/gr-msdd6000/src/lib/msdd_buffer_copy_behaviors.h

Copied: gnuradio/trunk/gr-msdd6000/src/lib/msdd_buffer_copy_behaviors.h (from rev \
7884, gnuradio/branches/developers/n4hy/msddLTS/gr-msdd6000/src/lib/msdd_buffer_copy_behaviors.h)
 ===================================================================
--- gnuradio/trunk/gr-msdd6000/src/lib/msdd_buffer_copy_behaviors.h	                  \
                (rev 0)
+++ gnuradio/trunk/gr-msdd6000/src/lib/msdd_buffer_copy_behaviors.h	2008-02-29 \
19:26:49 UTC (rev 7904) @@ -0,0 +1,59 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2008 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ * 
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+#ifndef MSDD_BUFFER_COPY_BEHAVIORS_H_
+#define MSDD_BUFFER_COPY_BEHAVIORS_H_
+
+namespace msdd {
+	
+  class BufferCopyBehavior 
+  {
+  public: 
+    virtual void operator() (gr_vector_void_star &a, const void * b, unsigned int \
output_index, unsigned int nitems) = 0; +    virtual ~BufferCopyBehavior() {};
+  };
+	  
+  template <class Tin, class Tout> 
+  class BufferCopyBehaviorGeneric : public BufferCopyBehavior {
+    void operator() (gr_vector_void_star &a, const void * b, unsigned int \
output_index, unsigned int nitems) { +      Tout 	*out(&(reinterpret_cast<Tout \
*>(a[0]))[output_index]);	// sloppy +      const Tin 	*in(reinterpret_cast<const Tin \
*>(b)); // equisloppy +      
+      for (unsigned int i = 0; i < nitems; ++i) {
+	out[i] = in[i];
+      }
+    }
+  };
+  
+  template <class Tin>
+  class BufferCopyBehaviorComplex : public BufferCopyBehavior {
+    void operator() (gr_vector_void_star &a, const void * b, unsigned int \
output_index, unsigned int nitems) { +      gr_complex \
*out(&(reinterpret_cast<gr_complex *>(a[0]))[output_index]);	// sloppy +      const \
Tin 	*in(reinterpret_cast<const Tin *>(b)); // equisloppy +      
+      for (unsigned int i = 0; i < nitems; ++i) {
+	out[i] = gr_complex (in[4*i+1],in[4*i+3]);
+      }
+    }
+  };
+}
+
+#endif /*MSDD_BUFFER_COPY_BEHAVIORS_H_*/

Deleted: gnuradio/trunk/gr-msdd6000/src/lib/msdd_source_base.cc

Copied: gnuradio/trunk/gr-msdd6000/src/lib/msdd_source_base.cc (from rev 7884, \
gnuradio/branches/developers/n4hy/msddLTS/gr-msdd6000/src/lib/msdd_source_base.cc) \
                ===================================================================
--- gnuradio/trunk/gr-msdd6000/src/lib/msdd_source_base.cc	                        \
                (rev 0)
+++ gnuradio/trunk/gr-msdd6000/src/lib/msdd_source_base.cc	2008-02-29 19:26:49 UTC \
(rev 7904) @@ -0,0 +1,817 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2008 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ * 
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+//#define MSDD_DEBUG_TRUE
+//#define MSDD_DEBUG2_TRUE
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <msdd_source_base.h>
+#include <gr_io_signature.h>
+#include <assert.h>
+#include <netdb.h>
+#include <omnithread.h>
+#include <stdexcept>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+
+#ifdef MSDD_DEBUG_TRUE
+#include <iostream>
+#define MSDD_DEBUG(x) std::cout << x << std::endl;
+#else
+#define MSDD_DEBUG(x)
+#endif
+
+
+#ifdef MSDD_DEBUG2_TRUE
+#include <iostream>
+#define MSDD_DEBUG2(x) std::cout << x << std::endl;
+#else
+#define MSDD_DEBUG2(x)
+#endif
+
+#include <iostream>
+
+namespace {
+  const int OUTPUT_MAX((1 << 15)*8);
+  const double PGA_MAX(75);
+  const double PGA_MIN(10);
+  const double PGA_STEP(.5);
+  const double DEFAULT_RX_FREQ(2.417e6);
+  const double DEFAULT_GAIN(32);
+  const msdd_source_base::msdd_fft_mode_t \
DEFAULT_FFT_MODE(msdd_source_base::MODE_MAG); +  const \
msdd_source_base::msdd_fft_points_t DEFAULT_FFT_POINTS(msdd_source_base::S8192); +  \
const msdd_source_base::msdd_decimation_t \
DEFAULT_DECIMATION_RATE(msdd_source_base::D2); +}
+
+class msdd_source_base::Impl {
+  
+public:
+  Impl(int opp_mode) :
+    d_noverruns (0),
+    d_deci_rate (DEFAULT_DECIMATION_RATE),
+    d_rx_freq ((unsigned long) DEFAULT_RX_FREQ),
+    d_gain(DEFAULT_GAIN),
+    d_verbose (false),
+    d_updated(false),
+    d_msdd_command_type((msdd_command_type_t) opp_mode),
+    d_msdd_fft_mode(DEFAULT_FFT_MODE),
+    d_desired_sample_size(2^15),
+    d_fft_points (DEFAULT_FFT_POINTS)
+  {
+  }
+
+  int            d_noverruns;
+  msdd_decimation_t   d_deci_rate;
+  unsigned long  d_rx_freq;
+  double         d_gain;
+  bool           d_verbose;
+  bool           d_updated;  
+  msdd_command_type_t d_msdd_command_type;
+  msdd_fft_mode_t d_msdd_fft_mode;
+  unsigned long  d_desired_sample_size;
+  
+  int            d_socket;        // handle to socket
+  int            d_socket_rcv;    // handle to socket retuned in the accept call
+  struct in_addr d_ip_src;        // store the source IP address to use
+  unsigned short d_port_src;      // the port number to open for connections to this \
service +  sockaddr_in    d_sockaddr_src;  // store the source sockaddr data \
(formatted IP address and port number)  +  std::auto_ptr<unsigned char> d_temp_buff;  \
// hold buffer between calls +  
+  omni_mutex    d_mutex;
+  msdd_fft_points_t   d_fft_points; 
+  
+  struct msdd_request_fft_packet {
+    msdd_command_type_t command_type;
+    int foo_x20;
+    unsigned int center_freq_mhz;
+    int offset_freq_hz;
+    int gain;
+    msdd_fft_window_type_t window_type;
+    msdd_fft_points_t fft_points;
+    msdd_decimation_t decimation;
+    msdd_fft_mode_t fft_mode;
+    int number_sets;
+  } __attribute__((__packed__));
+  
+  struct msdd_request_iq_packet {
+    msdd_command_type_t command_type;
+    int foo0x18;
+    unsigned int center_freq_mhz;
+    int offset_freq_hz;
+    int gain;
+    int number;
+    msdd_decimation_t decimation;
+    int number_sets;
+  } __attribute__((__packed__));
+
+  void make_request_fft_packet(msdd_request_fft_packet& packet);
+  
+  void make_request_iq_packet(msdd_request_iq_packet& packet, unsigned int \
number_samples); +  
+  msdd_request_fft_packet   d_fft_request_packet; // fft request packet
+  msdd_request_iq_packet    d_iq_request_packet; // fft request packet
+};
+
+
+msdd_source_base::msdd_source_base (const std::string &name,
+				    gr_io_signature_sptr output_signature,
+				    int which_board,
+				    int opp_mode,
+				    const char *src, 
+				    unsigned short port_src
+				    ) throw (std::runtime_error)
+  : gr_sync_block (name,
+		   gr_make_io_signature (0, 0, 0),
+		   output_signature),
+    pimpl(new Impl(opp_mode))
+{
+  int ret (0);
+    
+  // Set up the address stucture for the source address and port numbers
+  // Get the source IP address from the host name
+  struct hostent *hsrc (gethostbyname(src));
+    
+  if(hsrc) {   // if the source was provided as a host namex
+    pimpl->d_ip_src = *(struct in_addr*)hsrc->h_addr_list[0];    
+  }
+  else { // assume it was specified as an IP address
+    if((ret=inet_aton(src, &pimpl->d_ip_src)) == 0) {            // format IP \
address +      perror("Not a valid source IP address or host name");
+      throw std::runtime_error("can't initialize source socket");
+    }
+  }
+    
+  pimpl->d_port_src = htons(port_src);     // format port number
+  
+  pimpl->d_sockaddr_src.sin_family = AF_INET;
+  pimpl->d_sockaddr_src.sin_addr   = pimpl->d_ip_src;
+  pimpl->d_sockaddr_src.sin_port   = pimpl->d_port_src;
+  
+  pimpl->d_temp_buff.reset(new unsigned char[OUTPUT_MAX + 
+					     std::max(sizeof(Impl::msdd_request_iq_packet),
+						      sizeof(Impl::msdd_request_fft_packet))]);   // allow it to hold up to \
payload_size bytes +  
+  set_output_multiple (OUTPUT_MAX / output_signature->sizeof_stream_item (0));
+}
+				      
+
+bool
+msdd_source_base::open()
+{
+  omni_mutex_lock l(pimpl->d_mutex);   // hold mutex for duration of this function
+  // create socket
+  MSDD_DEBUG2("MSDD: Before socket ")
+  pimpl->d_socket = socket(PF_INET, SOCK_STREAM, 0);
+  if(pimpl->d_socket == -1) {
+    perror("socket open");
+    throw std::runtime_error("can't open socket");
+  }
+
+  // Turn on reuse address
+  int opt_val (1);
+  if(setsockopt(pimpl->d_socket, SOL_SOCKET, SO_REUSEADDR, (void*)&opt_val, \
sizeof(int)) == -1) { +    perror("SO_REUSEADDR");
+    throw std::runtime_error("can't set socket option SO_REUSEADDR");
+  }
+
+  // Don't wait when shutting down
+  linger lngr;
+  lngr.l_onoff  = 1;
+  lngr.l_linger = 0;
+  if(setsockopt(pimpl->d_socket, SOL_SOCKET, SO_LINGER, (void*)&lngr, \
sizeof(linger)) == -1) { +    perror("SO_LINGER");
+    throw std::runtime_error("can't set socket option SO_LINGER");
+  }
+
+  // Set a timeout on the receive function to not block indefinitely
+  // This value can (and probably should) be changed
+  //  timeval timeout;
+  //  timeout.tv_sec = 1;
+  //  timeout.tv_usec = 0;
+  //  if(setsockopt(d_socket, SOL_SOCKET, SO_RCVTIMEO, (void*)&timeout, \
sizeof(timeout)) == -1) { +  //    perror("SO_RCVTIMEO");
+  //    throw std::runtime_error("can't set socket option SO_RCVTIMEO");
+  //  }
+
+  // bind socket to an address and port number to listen on
+  MSDD_DEBUG2("MSDD: Before socket bind to " << pimpl->d_sockaddr_src.sin_port)
+  if(::connect(pimpl->d_socket, (struct sockaddr*)&pimpl->d_sockaddr_src, \
sizeof(pimpl->d_sockaddr_src)) == -1) { +    perror("socket bind");
+    throw std::runtime_error("can't bind socket");
+  }
+
+  MSDD_DEBUG2("MSDD: Socket open")
+  pimpl->d_updated = true;
+  return pimpl->d_socket != 0;
+}
+
+/* read n bytes from a socket descriptor */
+int 
+msdd_source_base::readsock(int sockfd, unsigned char* buf, int nbytes) {
+  int nleft (nbytes);
+  int nread (0);
+    
+  while (nleft > 0) {
+    MSDD_DEBUG2("MSDD: Before socket read: " << nleft)
+    if ((nread = ::read(sockfd, buf, nleft)) < 0) {
+      return(nread); /* error, nread < 0 */
+    } else if (nread == 0) {
+      break;
+    }
+            
+    nleft -= nread;
+    buf += nread;
+  }
+  return(nbytes - nleft);
+}
+
+bool
+msdd_source_base::close()
+{
+  omni_mutex_lock l(pimpl->d_mutex);   // hold mutex for duration of this function
+  
+  if (pimpl->d_socket){
+    shutdown(pimpl->d_socket, SHUT_RDWR);
+    pimpl->d_socket = 0;
+  }
+  pimpl->d_updated = true;
+  
+  return true;
+}
+
+msdd_source_base::~msdd_source_base ()
+{
+  msdd_source_base::close();
+}
+
+unsigned int
+msdd_source_base::sizeof_basic_sample() const
+{
+  switch (pimpl->d_msdd_command_type) {
+  case SAMPLES_REALTIME:
+    return 4;
+  case SAMPLES_FFT:
+    switch (pimpl->d_msdd_fft_mode) {
+    case MODE_IQ:
+    case MODE_MAG:
+      return 4;
+    case MODE_MAGDB:
+      return 1;
+    default:
+      assert (false); // bad mode
+    }
+  default:
+    assert (false); // bad mode
+  }
+}
+
+bool
+msdd_source_base::start()
+{
+  return msdd_source_base::open();
+}
+
+bool
+msdd_source_base::stop()
+{
+  return msdd_source_base::close();
+}
+
+void* 
+msdd_source_base::make_request_packet(unsigned int& size, unsigned int \
number_samples) { +  switch (pimpl->d_msdd_command_type) {
+  case SAMPLES_REALTIME:
+    pimpl->make_request_iq_packet(pimpl->d_iq_request_packet, number_samples);
+    size = sizeof (pimpl->d_iq_request_packet);
+    return &pimpl->d_iq_request_packet;
+  case SAMPLES_FFT:
+    pimpl->make_request_fft_packet(pimpl->d_fft_request_packet);
+    size = sizeof (pimpl->d_fft_request_packet);
+    return &pimpl->d_fft_request_packet;
+  default:
+    assert (false); // bad mode
+  }
+}
+
+void 
+msdd_source_base::Impl::make_request_fft_packet(msdd_request_fft_packet& packet) 
+{
+  packet.command_type = SAMPLES_FFT;  // FFT samples Command
+  packet.foo_x20 = 0x20;
+  packet.center_freq_mhz = d_rx_freq;
+  packet.offset_freq_hz = 0;
+  packet.gain = (int) d_gain; // gain
+  packet.window_type = WINDOW_HANNING; // magic number
+  packet.fft_points = d_fft_points;
+  packet.decimation = d_deci_rate;
+  packet.fft_mode = MODE_MAGDB;
+  packet.number_sets = 1;
+}
+
+void 
+msdd_source_base::Impl::make_request_iq_packet(msdd_request_iq_packet& packet, \
unsigned int number_samples)  +{
+  packet.command_type = SAMPLES_REALTIME;  // FFT samples Command
+  packet.foo0x18 = 0x18; // magic number
+  packet.center_freq_mhz = d_rx_freq;
+  packet.offset_freq_hz = 0;
+  packet.gain = (int) d_gain; // gain
+  packet.number = number_samples * 4;
+  packet.decimation = d_deci_rate;
+  packet.number_sets = 1;
+}
+
+int
+msdd_source_base::work (int noutput_items,
+			gr_vector_const_void_star &input_items,
+			gr_vector_void_star &output_items)
+{
+  int output_index (0);
+  int output_items_produced;
+  int bytes_read;
+  
+  unsigned int packet_size;
+  
+  MSDD_DEBUG("MSDD: requested items: " << noutput_items)
+  int noutput_items_desired = std::min (noutput_items, (int) \
pimpl->d_desired_sample_size); +  MSDD_DEBUG("MSDD: desired items: " << \
noutput_items_desired) +    
+  while (output_index < noutput_items_desired){
+
+    int nbytes = (pimpl->d_msdd_command_type == SAMPLES_REALTIME) ? 
+      ninput_bytes_reqd_for_noutput_items (noutput_items_desired - output_index) :
+      ninput_bytes_reqd_for_noutput_items (msdd_source_base::fft_points());
+    
+    void* request_packet = msdd_source_base::make_request_packet(packet_size, \
noutput_items_desired); +    
+    nbytes = std::min (nbytes, OUTPUT_MAX);
+    MSDD_DEBUG2("MSDD: payload sizes: nbytes1: " << nbytes )
+      
+    // send request
+    int result_nbytes = ::write(pimpl->d_socket, request_packet, packet_size);
+    //assert (result_nbytes == sizeof(msdd_request_packet));
+    
+    // receive ack
+    result_nbytes = ::read (pimpl->d_socket, (unsigned char*) request_packet, \
packet_size); +    MSDD_DEBUG2("MSDD: response: " << result_nbytes)
+    //assert (result_nbytes == sizeof(msdd_request_packet));
+    
+    // receive payload
+    result_nbytes = msdd_source_base::readsock (pimpl->d_socket, \
pimpl->d_temp_buff.get(), nbytes); +    MSDD_DEBUG("MSDD: reading bytes: " << nbytes \
<< " received: " << result_nbytes) +    if (result_nbytes > (int) nbytes){
+      // fprintf (stderr, "msdd_source: overrun\n");
+      fputs ("uO", stderr);
+      pimpl->d_noverruns++;
+      result_nbytes = nbytes; // truncate
+    }
+    
+    if (result_nbytes < 0)	// We've got a problem.  Usually board unplugged or \
powered down. +      return -1;		// Indicate we're done.
+
+    if (result_nbytes != nbytes){	// not really an error, but unexpected
+      fprintf (stderr, "msdd_source: short read.  Expected %d, got %d\n",
+	       nbytes, result_nbytes);
+    }
+
+    copy_from_msdd_buffer (output_items,
+			   output_index,
+			   noutput_items_desired - output_index,   // output_items_available
+			   output_items_produced,	   // [out]
+			   pimpl->d_temp_buff.get(),				   // usrp_buffer
+			   result_nbytes,
+			   bytes_read);			   // [out]
+    
+    output_index += output_items_produced;
+    
+    if (pimpl->d_msdd_command_type == SAMPLES_FFT) break; 
+  }
+
+  MSDD_DEBUG("MSDD: items produced: " << output_items_produced << " index: " << \
output_index) +  
+  //assert(false);
+  return output_index;
+}
+
+
+bool
+msdd_source_base::set_decim_rate (unsigned int rate)
+{
+  bool result (true);
+  switch (rate) {
+  case 1:
+    pimpl->d_deci_rate = D0;
+    break;
+  case 2:
+    pimpl->d_deci_rate = D1;
+    break;      
+  case 4:
+    pimpl->d_deci_rate = D2;
+    break;	  
+  case 8:
+    pimpl->d_deci_rate = D3;
+    break;	  
+  case 16:
+    pimpl->d_deci_rate = D4;
+    break;
+  case 32:
+    pimpl->d_deci_rate = D5;
+    break;
+  case 64:
+    pimpl->d_deci_rate = D6;
+    break;
+  case 128:
+    pimpl->d_deci_rate = D7;
+    break;
+  case 256:
+    pimpl->d_deci_rate = D8;
+    break;
+  default:
+    result = false;
+  }
+  
+  return result;
+}
+//
+//bool
+//msdd_source_base::set_nchannels (int nchan)
+//{
+//  // return d_usrp->set_nchannels (nchan);
+//	return true;
+//}
+//
+//bool
+//msdd_source_base::set_mux (int mux)
+//{
+//  return d_usrp->set_mux (mux);
+//}
+
+bool
+msdd_source_base::set_rx_freq (int channel, double freq)
+{
+  assert (channel == 0);
+  bool result (false);
+  
+  if (freq >=  30e6 && freq <= 6e9) {
+    pimpl->d_rx_freq = (unsigned long) freq / 1000000;
+    result = true;
+  }
+  
+  return result;
+}
+
+
+unsigned long
+msdd_source_base::set_fft_size (int channel, unsigned long fft_size)
+{
+  assert (channel == 1);
+  
+  switch (fft_size) {
+  case 256:        
+    pimpl->d_fft_points = S256;
+    break;
+  case 512:
+    pimpl->d_fft_points = S512;       
+    break;
+  case 1024:
+    pimpl->d_fft_points = S1024;
+    break;        
+  case 2048:
+    pimpl->d_fft_points = S2048;
+    break;        
+  case 4096:
+    pimpl->d_fft_points = S4096;
+    break;        
+  case 8192:
+    pimpl->d_fft_points = S8192;
+    break;        
+  case 16384:
+    pimpl->d_fft_points = S16384;
+    break;        
+  case 32768:
+    pimpl->d_fft_points = S32768;
+    break;        
+  }
+  
+  return msdd_source_base::fft_points();
+}
+
+//
+//long
+//msdd_source_base::fpga_master_clock_freq() const
+//{
+//  return d_usrp->fpga_master_clock_freq();
+//}
+//
+//long
+//msdd_source_base::converter_rate() const
+//{
+//  // return d_usrp->converter_rate();
+//	return 8;
+//}
+
+unsigned int
+msdd_source_base::decim_rate () const
+{
+  return 1 << pimpl->d_deci_rate;
+}
+//
+//int
+//msdd_source_base::nchannels () const
+//{
+//  return d_usrp->nchannels ();
+//}
+//
+//int
+//msdd_source_base::mux () const
+//{
+//  return d_usrp->mux ();
+//}
+
+double
+msdd_source_base::rx_freq (int channel) const
+{
+  assert (channel == 0);
+  
+  return pimpl->d_rx_freq;
+}
+
+unsigned int
+msdd_source_base::fft_points() const
+{
+  return (1 << pimpl->d_fft_points);
+}
+
+int 
+msdd_source_base::noverruns () const 
+{ 
+  return pimpl->d_noverruns; 
+}
+
+//bool
+//msdd_source_base::set_fpga_mode (int mode)
+//{
+//  return d_usrp->set_fpga_mode (mode);
+//}
+//
+//bool
+//msdd_source_base::set_ddc_phase (int channel, int phase)
+//{
+//  return d_usrp->set_ddc_phase(channel, phase);
+//}
+//
+//bool
+//msdd_source_base::set_dc_offset_cl_enable(int bits, int mask)
+//{
+//  return d_usrp->set_dc_offset_cl_enable(bits, mask);
+//}
+
+void
+msdd_source_base::set_verbose (bool verbose)
+{  
+  pimpl->d_verbose = verbose;
+}
+//
+//bool
+//msdd_source_base::write_aux_dac (int which_dboard, int which_dac, int value)
+//{
+//  return d_usrp->write_aux_dac (which_dboard, which_dac, value);
+//}
+//
+//int
+//msdd_source_base::read_aux_adc (int which_dboard, int which_adc)
+//{
+//  return d_usrp->read_aux_adc (which_dboard, which_adc);
+//}
+//
+//bool
+//msdd_source_base::write_eeprom (int i2c_addr, int eeprom_offset, const std::string \
buf) +//{
+//  return d_usrp->write_eeprom (i2c_addr, eeprom_offset, buf);
+//}
+//
+//std::string
+//msdd_source_base::read_eeprom (int i2c_addr, int eeprom_offset, int len)
+//{
+//  return d_usrp->read_eeprom (i2c_addr, eeprom_offset, len);
+//}
+//
+//bool
+//msdd_source_base::write_i2c (int i2c_addr, const std::string buf)
+//{
+//  return d_usrp->write_i2c (i2c_addr, buf);
+//}
+//
+//std::string
+//msdd_source_base::read_i2c (int i2c_addr, int len)
+//{
+//  return d_usrp->read_i2c (i2c_addr, len);
+//}
+//
+bool
+msdd_source_base::set_pga (int which, double gain)
+{
+  if (gain >= PGA_MIN & gain <= PGA_MAX) {
+    pimpl->d_gain = gain;
+    return true;
+  }
+  return false;
+}
+
+double
+msdd_source_base::pga (int which) const
+{
+  return pimpl->d_gain;
+}
+
+double
+msdd_source_base::pga_min () const
+{
+  return PGA_MIN;
+}
+
+double
+msdd_source_base::pga_max () const
+{
+  return PGA_MAX;
+}
+
+double
+msdd_source_base::pga_db_per_step () const
+{
+  return PGA_STEP;
+}
+
+//int
+//msdd_source_base::daughterboard_id (int which) const
+//{
+//  return d_usrp->daughterboard_id (which);
+//}
+//
+//
+//bool
+//msdd_source_base::set_adc_offset (int which, int offset)
+//{
+//  return d_usrp->set_adc_offset (which, offset);
+//}
+//
+//bool
+//msdd_source_base::set_dac_offset (int which, int offset, int offset_pin)
+//{
+//  return d_usrp->set_dac_offset (which, offset, offset_pin);
+//}
+//
+//bool
+//msdd_source_base::set_adc_buffer_bypass (int which, bool bypass)
+//{
+//  return d_usrp->set_adc_buffer_bypass (which, bypass);
+//}
+
+std::string
+msdd_source_base::serial_number()
+{
+  return "SoftTronics MSDD 6000";
+}
+//
+//bool
+//msdd_source_base::_write_oe (int which_dboard, int value, int mask)
+//{
+//  return d_usrp->_write_oe (which_dboard, value, mask);
+//}
+//
+//bool
+//msdd_source_base::write_io (int which_dboard, int value, int mask)
+//{
+//  return d_usrp->write_io (which_dboard, value, mask);
+//}
+//
+//int
+//msdd_source_base::read_io (int which_dboard)
+//{
+//  return d_usrp->read_io (which_dboard);
+//}
+//
+//
+//
+//
+//// internal routines...
+//
+//bool
+//msdd_source_base::_write_fpga_reg (int regno, int value)
+//{
+//  return d_usrp->_write_fpga_reg (regno, value);
+//}
+//
+//bool
+//msdd_source_base::_write_fpga_reg_masked (int regno, int value, int mask)
+//{
+//  return d_usrp->_write_fpga_reg_masked (regno, value, mask);
+//}
+//
+//int
+//msdd_source_base::_read_fpga_reg (int regno)
+//{
+//  return d_usrp->_read_fpga_reg (regno);
+//}
+//
+//bool
+//msdd_source_base::_write_9862 (int which_codec, int regno, unsigned char value)
+//{
+//  return d_usrp->_write_9862 (which_codec, regno, value);
+//}
+//
+//int
+//msdd_source_base::_read_9862 (int which_codec, int regno) const
+//{
+//  return d_usrp->_read_9862 (which_codec, regno);
+//}
+//
+//bool
+//msdd_source_base::_write_spi (int optional_header, int enables,
+//			       int format, std::string buf)
+//{
+//  return d_usrp->_write_spi (optional_header, enables, format, buf);
+//}
+//
+//std::string
+//msdd_source_base::_read_spi (int optional_header, int enables, int format, int \
len) +//{
+//  return d_usrp->_read_spi (optional_header, enables, format, len);
+//}
+//
+//bool
+//msdd_source_base::set_format(unsigned int format)
+//{
+//  return d_usrp->set_format(format);
+//}
+//
+//unsigned int
+//msdd_source_base::format() const
+//{
+//  return d_usrp->format();
+//}
+//
+//unsigned int
+//msdd_source_base::make_format(int width, int shift, bool want_q, bool \
bypass_halfband) +//{
+//  return usrp_standard_rx::make_format(width, shift, want_q, bypass_halfband);
+//}
+//
+//int
+//msdd_source_base::format_width(unsigned int format)
+//{
+//  return usrp_standard_rx::format_width(format);
+//}
+//
+//int
+//msdd_source_base::format_shift(unsigned int format)
+//{
+//  return usrp_standard_rx::format_shift(format);
+//}
+//
+//bool
+//msdd_source_base::format_want_q(unsigned int format)
+//{
+//  return usrp_standard_rx::format_want_q(format);
+//}
+//
+//bool
+//msdd_source_base::format_bypass_halfband(unsigned int format)
+//{
+//  return usrp_standard_rx::format_bypass_halfband(format);
+//}
+
+bool msdd_source_base::set_desired_packet_size (int which, unsigned long \
packet_size) { +  bool result(false);
+  
+  if (pimpl->d_desired_sample_size < 2^32) { // FIXME: find maximum sample request \
for MSDD check if greater than  +    pimpl->d_desired_sample_size = packet_size;
+  }
+  return result;
+}
+
+unsigned long msdd_source_base::desired_packet_size (int which) const {
+  return pimpl->d_desired_sample_size;
+}

Deleted: gnuradio/trunk/gr-msdd6000/src/lib/msdd_source_base.h

Copied: gnuradio/trunk/gr-msdd6000/src/lib/msdd_source_base.h (from rev 7884, \
gnuradio/branches/developers/n4hy/msddLTS/gr-msdd6000/src/lib/msdd_source_base.h) \
                ===================================================================
--- gnuradio/trunk/gr-msdd6000/src/lib/msdd_source_base.h	                        \
                (rev 0)
+++ gnuradio/trunk/gr-msdd6000/src/lib/msdd_source_base.h	2008-02-29 19:26:49 UTC \
(rev 7904) @@ -0,0 +1,307 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2008 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ * 
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef INCLUDED_MSDD_SOURCE_BASE_H
+#define INCLUDED_MSDD_SOURCE_BASE_H
+#include <gr_sync_block.h>
+#include <stdexcept>
+
+/*!
+ * \brief abstract interface to MSDD 6000 Softronics module Rx path (Rev 1)
+ */
+
+class msdd_source_base : public gr_sync_block {
+public: 
+  enum msdd_command_type_t {
+    COMMAND_STATUS = 0,
+    SAMPLES_REALTIME = 1,
+    SAMPLES_FFT = 2,
+  };
+  
+  enum msdd_fft_window_type_t {
+    WINDOW_RECTANGLE = 0,
+    WINDOW_HANNING = 1,
+    WINDOW_HAMMING = 2,
+    WINDOW_BLACKMAN = 3
+  };
+  
+  enum msdd_fft_mode_t {
+    MODE_IQ=0, 
+    MODE_MAG=1, 
+    MODE_MAGDB=2
+  };
+  
+  enum msdd_decimation_t {
+    D0=0, 
+    D1=1, 
+    D2=2, 
+    D3=3, 
+    D4=4, 
+    D5=5, 
+    D6=6, 
+    D7=7, 
+    D8=8
+  };    
+  
+  enum msdd_fft_points_t {
+    S256=8, 
+    S512=9, 
+    S1024=10, 
+    S2048=11, 
+    S4096=12, 
+    S8192=13, 
+    S16384=14, 
+    S32768=15
+  };
+  
+private:
+   
+  class Impl;
+  friend class Impl;
+  std::auto_ptr<Impl> pimpl;
+
+protected:
+   
+  msdd_source_base (const std::string &name,
+		    gr_io_signature_sptr output_signature,
+		    int which_board,
+		    int opp_mode,
+		    const char *src, 
+		    unsigned short port_src
+		    ) throw (std::runtime_error);
+
+  /*!
+   * \brief return number of msdd input bytes required to produce noutput items.
+   */
+  virtual int ninput_bytes_reqd_for_noutput_items (int noutput_items) = 0;
+
+  /*!
+   * \brief number of bytes in a low-level sample
+   */
+  unsigned int sizeof_basic_sample() const;
+
+  virtual void copy_from_msdd_buffer (gr_vector_void_star &output_items,
+				      int output_index,
+				      int output_items_available,
+				      int &output_items_produced,
+				      const void *msdd_buffer,
+				      int msdd_buffer_length,
+				      int &bytes_read) = 0;
+  
+  int readsock(int sockfd, unsigned char* buf, int nbytes);
+  
+  void* make_request_packet(unsigned int& size, unsigned int number_samples);
+  
+  unsigned long set_fft_size (int channel, unsigned long fft_size);
+  
+public:
+  //! magic value used on alternate register read interfaces
+  static const int READ_FAILED = -99999;
+  
+  ~msdd_source_base ();
+
+  int work (int noutput_items,
+	    gr_vector_const_void_star &input_items,
+	    gr_vector_void_star &output_items);
+  
+  bool start();
+  bool stop();
+
+  /*!
+   * \brief open a socket specified by the port and ip address info
+   *
+   * Opens a socket, binds to the address, and waits for a connection
+   * over UDP. If any of these fail, the fuction retuns the error and exits.
+   */
+  bool open();
+
+  /*!
+   * \brief Close current socket.
+   *
+   * Shuts down read/write on the socket
+   */
+  bool close();
+  
+  /*!
+   * \brief Set decimator rate.  \p rate must be EVEN and in [8, 256].
+   *
+   * The final complex sample rate across the USB is
+   *   adc_freq () / decim_rate ()
+   */
+  bool set_decim_rate (unsigned int rate);
+  //bool set_nchannels (int nchan);
+  //bool set_mux (int mux);
+
+  /*!
+   * \brief set the center frequency of the digital down converter.
+   *
+   * \p channel must be 0.  \p freq is the center frequency in Hz.
+   * It must be in the range [-FIXME, FIXME].  The frequency specified is
+   * quantized.  Use rx_freq to retrieve the actual value used.
+   */
+  bool set_rx_freq (int channel, double freq);
+
+  /*!
+   * \brief
+   */
+  bool set_opp_mode (int channel, msdd_command_type_t mode);
+  
+//
+//  /*!
+//   * \brief set fpga special modes
+//   */
+//  bool set_fpga_mode (int mode);
+
+  void set_verbose (bool verbose);
+//
+//  /*!
+//   * \brief Set the digital down converter phase register.
+//   *
+//   * \param channel	which ddc channel [0, 3]
+//   * \param phase	32-bit integer phase value.
+//   */
+//  bool set_ddc_phase(int channel, int phase);
+//
+  /*!
+   * \brief Set Programmable Gain Amplifier (PGA)
+   *
+   * \param which	which A/D [0,3]
+   * \param gain_in_db	gain value (linear in dB)
+   *
+   * gain is rounded to closest setting supported by hardware.
+   *
+   * \returns true iff sucessful.
+   *
+   * \sa pga_min(), pga_max(), pga_db_per_step()
+   */
+  bool set_pga (int which, double gain_in_db);
+
+  /*!
+   * \brief Return programmable gain amplifier gain setting in dB.
+   *
+   * \param which	which A/D [0,3]
+   */
+  double pga (int which) const;
+
+  /*!
+   * \brief Return minimum legal PGA setting in dB.
+   */
+  double pga_min () const;
+
+  /*!
+   * \brief Return maximum legal PGA setting in dB.
+   */
+  double pga_max () const;
+
+  /*!
+   * \brief Return hardware step size of PGA (linear in dB).
+   */
+  double pga_db_per_step () const;
+
+  // ACCESSORS
+
+//  long converter_rate() const;
+
+  unsigned int decim_rate () const;
+//  int nchannels () const;
+//  int mux () const;
+  double rx_freq (int channel) const;
+  unsigned int fft_points() const;
+  int noverruns () const;
+
+  /*!
+   * \brief return the msdd's serial number.
+   *
+   * \returns non-zero length string iff successful.
+   */
+  std::string serial_number();
+
+//  /*!
+//   * \brief Enable/disable automatic DC offset removal control loop in FPGA
+//   *
+//   * \param bits  which control loops to enable
+//   * \param mask  which \p bits to pay attention to
+//   *
+//   * If the corresponding bit is set, enable the automatic DC
+//   * offset correction control loop.
+//   *
+//   * <pre>
+//   * The 4 low bits are significant:
+//   *
+//   *   ADC0 = (1 << 0)
+//   *   ADC1 = (1 << 1)
+//   *   ADC2 = (1 << 2)
+//   *   ADC3 = (1 << 3)
+//   * </pre>
+//   *
+//   * By default the control loop is enabled on all ADC's.
+//   */
+//  bool set_dc_offset_cl_enable(int bits, int mask);
+
+  /*!
+   * \brief Specify Rx data format.
+   *
+   * \param format	format specifier
+   *
+   * Rx data format control register
+   *
+   *     3                   2                   1                       
+   *   1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+   *  +-----------------------------------------+-+-+---------+-------+
+   *  |          Reserved (Must be zero)        |B|Q|  WIDTH  | SHIFT |
+   *  +-----------------------------------------+-+-+---------+-------+
+   *
+   *  SHIFT specifies arithmetic right shift [0, 15]
+   *  WIDTH specifies bit-width of I & Q samples across the USB [1, 16] (not all \
valid) +   *  Q     if set deliver both I & Q, else just I
+   *  B     if set bypass half-band filter.
+   *
+   * Right now the acceptable values are:
+   *
+   *   B  Q  WIDTH  SHIFT
+   *   0  1    16     0
+   *   0  1     8     8
+   *
+   * More valid combos to come.
+   *
+   * Default value is 0x00000300  16-bits, 0 shift, deliver both I & Q.
+   */
+//  bool set_format(unsigned int format);
+
+  /*!
+   * \brief return current format
+   */
+//  unsigned int format () const;
+//
+//  static unsigned int make_format(int width=16, int shift=0,
+//				  bool want_q=true, bool bypass_halfband=false);
+//  static int format_width(unsigned int format);
+//  static int format_shift(unsigned int format);
+//  static bool format_want_q(unsigned int format);
+//  static bool format_bypass_halfband(unsigned int format);
+
+    bool set_desired_packet_size (int which, unsigned long packet_size);
+
+    unsigned long desired_packet_size (int which) const;
+};
+
+#endif /* INCLUDED_MSDD_SOURCE_BASE_H */

Deleted: gnuradio/trunk/gr-msdd6000/src/lib/msdd_source_c.cc

Copied: gnuradio/trunk/gr-msdd6000/src/lib/msdd_source_c.cc (from rev 7884, \
gnuradio/branches/developers/n4hy/msddLTS/gr-msdd6000/src/lib/msdd_source_c.cc) \
                ===================================================================
--- gnuradio/trunk/gr-msdd6000/src/lib/msdd_source_c.cc	                        (rev \
                0)
+++ gnuradio/trunk/gr-msdd6000/src/lib/msdd_source_c.cc	2008-02-29 19:26:49 UTC (rev \
7904) @@ -0,0 +1,111 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2008 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ * 
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+//#define MSDD_DEBUG2_TRUE
+
+#ifdef MSDD_DEBUG2_TRUE
+#include <iostream>
+#define MSDD_DEBUG2(x) std::cout << x << std::endl;
+#else
+#define MSDD_DEBUG2(x)
+#endif
+
+#include <msdd_source_c.h>
+#include <gr_io_signature.h>
+
+namespace {
+  static const int NBASIC_SAMPLES_PER_ITEM = 2;	// I & Q
+};
+
+msdd_source_c_sptr
+msdd_make_source_c (int which_board, 
+		    int opp_mode,
+		    const char *src, 
+		    unsigned short port_src
+		    ) throw (std::runtime_error)
+{
+  return msdd_source_c_sptr (new msdd_source_c (
+  						which_board,
+						opp_mode,
+						src,
+						port_src
+						));
+}
+
+msdd_source_c::msdd_source_c (int which_board,
+			      int opp_mode,
+			      const char *src, 
+			      unsigned short port_src
+			      ) throw (std::runtime_error)
+  : msdd_source_base ("msdd_source_c",
+		      gr_make_io_signature (1, 1, 2 * sizeof (int)),
+		      which_board, opp_mode, src, port_src
+		      )
+{
+
+  switch (sizeof_basic_sample()) {	
+  case 4:
+	  d_buffer_copy_behavior.reset(
+	   new msdd::BufferCopyBehaviorComplex <short> ());
+    break;
+  default:
+    assert(false);    
+  }				  
+  
+}
+
+msdd_source_c::~msdd_source_c ()
+{
+}
+
+int
+msdd_source_c::ninput_bytes_reqd_for_noutput_items (int noutput_items)
+{
+  return noutput_items * NBASIC_SAMPLES_PER_ITEM * sizeof_basic_sample();
+}
+
+/*
+ * Copy 8 bit fft from mdss buffer into output buffer
+ */
+void
+msdd_source_c::copy_from_msdd_buffer (gr_vector_void_star &output_items,
+				      int output_index,
+				      int output_items_available,
+				      int &output_items_produced,
+				      const void *msdd_buffer,
+				      int buffer_length,
+				      int &bytes_read)
+{
+  unsigned nmsdd_bytes_per_item = NBASIC_SAMPLES_PER_ITEM * sizeof_basic_sample();
+  
+  unsigned int nitems = std::min (output_items_available,
+				  (int)(buffer_length / nmsdd_bytes_per_item));
+  
+  (*d_buffer_copy_behavior.get())(output_items, msdd_buffer, output_index, nitems);
+  
+  output_items_produced = nitems;
+  bytes_read = nitems * nmsdd_bytes_per_item;
+}

Deleted: gnuradio/trunk/gr-msdd6000/src/lib/msdd_source_c.h

Copied: gnuradio/trunk/gr-msdd6000/src/lib/msdd_source_c.h (from rev 7884, \
gnuradio/branches/developers/n4hy/msddLTS/gr-msdd6000/src/lib/msdd_source_c.h) \
                ===================================================================
--- gnuradio/trunk/gr-msdd6000/src/lib/msdd_source_c.h	                        (rev \
                0)
+++ gnuradio/trunk/gr-msdd6000/src/lib/msdd_source_c.h	2008-02-29 19:26:49 UTC (rev \
7904) @@ -0,0 +1,79 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2008 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ * 
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef INCLUDED_MSDD_SOURCE_C_H
+#define INCLUDED_MSDD_SOURCE_C_H
+
+#include <msdd_source_base.h>
+#include <msdd_buffer_copy_behaviors.h>
+#include <stdexcept>
+
+class msdd_source_c;
+typedef boost::shared_ptr<msdd_source_c> msdd_source_c_sptr;
+
+// public shared_ptr constructor
+
+msdd_source_c_sptr
+msdd_make_source_c (int which_board, 
+		    int opp_mode,
+		    const char *src, 
+		    unsigned short port_src
+		    ) throw (std::runtime_error);
+
+/*!
+ * \brief interface to MSDD Rx path
+ *
+ * output: 1 stream of short
+ */
+class msdd_source_c : public msdd_source_base {
+private:
+  friend msdd_source_c_sptr
+  msdd_make_source_c (int which_board, 
+		      int opp_mode,
+		      const char *src, 
+		      unsigned short port_src
+		      ) throw (std::runtime_error);
+
+  std::auto_ptr<msdd::BufferCopyBehavior> d_buffer_copy_behavior;
+
+protected:
+  msdd_source_c (int which_board, 
+		 int opp_mode,
+		 const char *src, 
+		 unsigned short port_src
+		 ) throw (std::runtime_error);
+
+  int ninput_bytes_reqd_for_noutput_items (int noutput_items);
+
+  virtual void copy_from_msdd_buffer (gr_vector_void_star &output_items,
+				      int output_index,
+				      int output_items_available,
+				      int &output_items_produced,
+				      const void *msdd_buffer,
+				      int buffer_length,
+				      int &bytes_read);
+
+public:
+  ~msdd_source_c ();
+};
+
+#endif /* INCLUDED_MSDD_SOURCE_C_H */

Deleted: gnuradio/trunk/gr-msdd6000/src/lib/msdd_source_s.cc

Copied: gnuradio/trunk/gr-msdd6000/src/lib/msdd_source_s.cc (from rev 7884, \
gnuradio/branches/developers/n4hy/msddLTS/gr-msdd6000/src/lib/msdd_source_s.cc) \
                ===================================================================
--- gnuradio/trunk/gr-msdd6000/src/lib/msdd_source_s.cc	                        (rev \
                0)
+++ gnuradio/trunk/gr-msdd6000/src/lib/msdd_source_s.cc	2008-02-29 19:26:49 UTC (rev \
7904) @@ -0,0 +1,130 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2008 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ * 
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define MSDD_DEBUG2_TRUE
+
+#ifdef MSDD_DEBUG2_TRUE
+#include <iostream>
+#define MSDD_DEBUG2(x) std::cout << x << std::endl;
+#else
+#define MSDD_DEBUG2(x)
+#endif
+
+#include <msdd_source_s.h>
+#include <gr_io_signature.h>
+
+namespace {
+  static const int NBASIC_SAMPLES_PER_ITEM = 1;
+}
+
+msdd_source_s_sptr
+msdd_make_source_s (int which_board, 
+		    unsigned int decim_rate,
+		    unsigned int fft_points,
+		    double initial_rx_freq,
+		    int opp_mode,
+		    const char *src, 
+		    unsigned short port_src
+		    ) throw (std::runtime_error)
+{
+  return msdd_source_s_sptr (new msdd_source_s (which_board,
+						decim_rate,
+						fft_points,
+						initial_rx_freq,
+						opp_mode,
+						src,
+						port_src
+						));
+}
+
+
+msdd_source_s::msdd_source_s (int which_board,
+			      unsigned int decim_rate,
+			      unsigned int fft_points,
+			      double initial_rx_freq,
+			      int opp_mode,
+			      const char *src, 
+			      unsigned short port_src
+			      ) throw (std::runtime_error)
+  : msdd_source_base ("msdd_source_s",
+		      gr_make_io_signature (1, 1, sizeof (int)),
+		      which_board, opp_mode, src, port_src
+		      )
+{
+
+  switch (sizeof_basic_sample()) {
+  case 1:
+       d_buffer_copy_behavior.reset(
+        new msdd::BufferCopyBehaviorGeneric<short, unsigned char>());
+    break;
+  case 2:
+       d_buffer_copy_behavior.reset(
+       	new msdd::BufferCopyBehaviorGeneric<short, float>());
+    break;
+  case 4:
+       d_buffer_copy_behavior.reset(
+       	new msdd::BufferCopyBehaviorGeneric<short, int>());
+    break;
+  default:
+       assert(false);
+  }
+
+}
+
+msdd_source_s::~msdd_source_s ()
+{
+}
+
+int
+msdd_source_s::ninput_bytes_reqd_for_noutput_items (int noutput_items)
+{
+  return noutput_items * NBASIC_SAMPLES_PER_ITEM * sizeof_basic_sample();
+}
+
+void
+msdd_source_s::copy_from_msdd_buffer (gr_vector_void_star &output_items,
+				      int output_index,
+				      int output_items_available,
+				      int &output_items_produced,
+				      const void *msdd_buffer,
+				      int buffer_length,
+				      int &bytes_read)
+{
+  MSDD_DEBUG2("copy_from_msdd_buffer: output_index: " << output_index << " \
output_items_available: " << output_items_available << " buflen: " << buffer_length) \
+ +   unsigned nmsdd_bytes_per_item 
+    (msdd_source_s::ninput_bytes_reqd_for_noutput_items(1));
+  
+  unsigned int nitems = std::min (output_items_available,
+				  (int)(buffer_length / nmsdd_bytes_per_item));
+  
+  MSDD_DEBUG2("copy_from_msdd_buffer: nmsdd_bytes_per_item: " << \
nmsdd_bytes_per_item << " nitems: " << nitems) +
+  (*d_buffer_copy_behavior.get())(output_items, msdd_buffer, output_index, nitems);
+
+  output_items_produced = nitems;
+  bytes_read = nitems * nmsdd_bytes_per_item;
+}

Deleted: gnuradio/trunk/gr-msdd6000/src/lib/msdd_source_s.h

Copied: gnuradio/trunk/gr-msdd6000/src/lib/msdd_source_s.h (from rev 7884, \
gnuradio/branches/developers/n4hy/msddLTS/gr-msdd6000/src/lib/msdd_source_s.h) \
                ===================================================================
--- gnuradio/trunk/gr-msdd6000/src/lib/msdd_source_s.h	                        (rev \
                0)
+++ gnuradio/trunk/gr-msdd6000/src/lib/msdd_source_s.h	2008-02-29 19:26:49 UTC (rev \
7904) @@ -0,0 +1,87 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2008 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ * 
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef INCLUDED_MSDD_SOURCE_S_H
+#define INCLUDED_MSDD_SOURCE_S_H
+
+#include <msdd_source_base.h>
+#include <msdd_buffer_copy_behaviors.h>
+#include <stdexcept>
+
+class msdd_source_s;
+typedef boost::shared_ptr<msdd_source_s> msdd_source_s_sptr;
+
+// public shared_ptr constructor
+
+msdd_source_s_sptr
+msdd_make_source_s (int which_board, 
+		    unsigned int decim_rate,
+		    unsigned int fft_points,
+		    double initial_rx_freq,
+		    int opp_mode,
+		    const char *src, 
+		    unsigned short port_src
+		    ) throw (std::runtime_error);
+
+/*!
+ * \brief interface to MSDD Rx path
+ *
+ * output: 1 stream of short
+ */
+class msdd_source_s : public msdd_source_base {
+private:
+  friend msdd_source_s_sptr
+  msdd_make_source_s (int which_board, 
+		      unsigned int decim_rate,
+		      unsigned int fft_points,
+		      double initial_rx_freq,
+		      int opp_mode,
+		      const char *src, 
+		      unsigned short port_src
+		      ) throw (std::runtime_error);
+
+  std::auto_ptr<msdd::BufferCopyBehavior> d_buffer_copy_behavior;
+  
+protected:
+  msdd_source_s (int which_board, 
+		 unsigned int decim_rate,
+		 unsigned int fft_points,
+		 double initial_rx_freq,
+		 int opp_mode,
+		 const char *src, 
+		 unsigned short port_src
+		 ) throw (std::runtime_error);
+
+  int ninput_bytes_reqd_for_noutput_items (int noutput_items);
+
+  virtual void copy_from_msdd_buffer (gr_vector_void_star &output_items,
+				      int output_index,
+				      int output_items_available,
+				      int &output_items_produced,
+				      const void *msdd_buffer,
+				      int buffer_length,
+				      int &bytes_read);
+public:
+  ~msdd_source_s ();
+};
+
+#endif /* INCLUDED_MSDD_SOURCE_S_H */

Copied: gnuradio/trunk/gr-msdd6000/src/python (from rev 7898, \
gnuradio/branches/developers/n4hy/msddLTS/gr-msdd6000/src/python)


Property changes on: gnuradio/trunk/gr-msdd6000/src/python
___________________________________________________________________
Name: svn:ignore
   + Makefile
Makefile.in
run_tests


Deleted: gnuradio/trunk/gr-msdd6000/src/python/Makefile.am

Copied: gnuradio/trunk/gr-msdd6000/src/python/Makefile.am (from rev 7898, \
gnuradio/branches/developers/n4hy/msddLTS/gr-msdd6000/src/python/Makefile.am) \
                ===================================================================
--- gnuradio/trunk/gr-msdd6000/src/python/Makefile.am	                        (rev 0)
+++ gnuradio/trunk/gr-msdd6000/src/python/Makefile.am	2008-02-29 19:26:49 UTC (rev \
7904) @@ -0,0 +1,48 @@
+#
+# Copyright 2008 Free Software Foundation, Inc.
+# 
+# This file is part of GNU Radio
+# 
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+# 
+# GNU Radio is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with GNU Radio; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+# 
+
+include $(top_srcdir)/Makefile.common
+
+EXAMPLE_FILES =
+
+EXTRA_DIST = run_tests.in \
+	     $(EXAMPLE_FILES)
+
+ourdatadir = $(exampledir)/msdd6000
+ourdata_DATA = $(EXAMPLE_FILES)
+
+noinst_PYTHON = 			\
+	qa_msdd6000.py			\
+	test_udp.py			\
+	test_tcp.py
+
+TESTS = 				\
+	run_tests
+
+
+# Make example scripts with #! executable
+install-data-local: install-ourdataDATA
+	for i in `find $(ourdatadir) -type f ! -perm 755`; do \
+	  if head -1 $$i | grep -q '^#!'; then \
+	    chmod 755 $$i; \
+	    echo "made executable: $$i"; \
+	  fi; \
+	done

Added: gnuradio/trunk/gr-msdd6000/src/python/qa_msdd6000.py
===================================================================
--- gnuradio/trunk/gr-msdd6000/src/python/qa_msdd6000.py	                        (rev \
                0)
+++ gnuradio/trunk/gr-msdd6000/src/python/qa_msdd6000.py	2008-02-29 19:26:49 UTC (rev \
7904) @@ -0,0 +1,40 @@
+#!/usr/bin/env python
+#
+# Copyright 2008 Free Software Foundation, Inc.
+# 
+# This file is part of GNU Radio
+# 
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+# 
+# GNU Radio is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with GNU Radio; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+# 
+
+from gnuradio import gr, gr_unittest
+import msdd
+
+class qa_usrp (gr_unittest.TestCase):
+
+    def setUp (self):
+        self.tb = gr.top_block ()
+
+    def tearDown (self):
+        self.tb = None
+
+    def test_000_nop (self):
+        """Just see if we can import the module...
+	"""
+        pass
+    
+if __name__ == '__main__':
+    gr_unittest.main ()


Property changes on: gnuradio/trunk/gr-msdd6000/src/python/qa_msdd6000.py
___________________________________________________________________
Name: svn:executable
   + *

Deleted: gnuradio/trunk/gr-msdd6000/src/python/run_tests.in

Copied: gnuradio/trunk/gr-msdd6000/src/python/run_tests.in (from rev 7898, \
gnuradio/branches/developers/n4hy/msddLTS/gr-msdd6000/src/python/run_tests.in) \
                ===================================================================
--- gnuradio/trunk/gr-msdd6000/src/python/run_tests.in	                        (rev \
                0)
+++ gnuradio/trunk/gr-msdd6000/src/python/run_tests.in	2008-02-29 19:26:49 UTC (rev \
7904) @@ -0,0 +1,10 @@
+#!/bin/sh
+
+# 1st parameter is absolute path to component source directory
+# 2nd parameter is absolute path to component build directory
+# 3rd parameter is path to Python QA directory
+
+@top_builddir@/run_tests.sh \
+    @abs_top_srcdir@/gr-msdd6000 \
+    @abs_top_builddir@/gr-msdd6000 \
+    @srcdir@

Copied: gnuradio/trunk/gr-msdd6000/src/python/test_tcp.py (from rev 7902, \
gnuradio/branches/developers/n4hy/msddLTS/gr-msdd6000/src/python_test/test_tcp.py) \
                ===================================================================
--- gnuradio/trunk/gr-msdd6000/src/python/test_tcp.py	                        (rev 0)
+++ gnuradio/trunk/gr-msdd6000/src/python/test_tcp.py	2008-02-29 19:26:49 UTC (rev \
7904) @@ -0,0 +1,78 @@
+#!/usr/bin/python
+
+from socket import *
+import string
+import time
+import struct;
+import random;
+
+myport = random.randint(1025,65535);
+
+port = 10000
+host = "10.45.4.43"
+myaddr = ("10.45.1.229",myport);
+
+buf = 100000;
+
+TCPSock = socket(AF_INET,SOCK_STREAM);
+#TCPSock = socket(AF_INET,SOCK_DGRAM);
+TCPSock.bind(myaddr);
+TCPSock.connect((host,port));
+
+f_mhz = 2400;	
+f_hz = 0;	
+gain = 2; 	
+window = 3; 	#0=rect, 1=hanning, 2=hamming, 3=blackman
+#samples = 0xffffffff; 	#8-15	fft:(returns 2^number[8-15]) raw:(returns number)
+samples = 2; 	#8-15	fft:(returns 2^number[8-15]) raw:(returns number)
+decim = 2; 	#0-8  
+#decim = decim+16;	# +16 to use 16bit instead of 32 bit 
+mode = 1; 	#0=IQ, 1=MAG, 2=MAGDB
+sets = 0xffffffff;	
+#sets = 1;
+
+fft_data = struct.pack("<IIIIIIIIII", 0x02, 0x20, f_mhz, f_hz, gain,window, samples, \
decim, mode,sets); +raw_data = struct.pack("<IIIIIIII", 0x01, 0x18, f_mhz, f_hz, \
gain,samples, decim,sets); +stat_data = struct.pack("!II", 0x0000, 0x0000)
+
+data = raw_data;
+
+#TCPSock.sendto(data, (host,port))
+TCPSock.send(data);
+
+print "sent"
+
+
+
+count = 0;
+while(1):
+	data,addr = TCPSock.recvfrom(buf);
+	
+	print "got response"
+	
+	print "Data length: %d bytes."%(len(data));
+	if(len(data)==12):
+		a,b,c = struct.unpack("!III",data);
+		print "%x,%x,%x"%(a,b,c);
+
+	datavector = [];
+
+	for d in data:
+		a = struct.unpack("<b",d);
+		datavector.append(a);
+
+	print datavector;
+		
+	count = count + 1;
+	
+	if(count > 1):
+		sets = 3;
+		raw_data_2 = struct.pack("<IIIIIIII", 0x01, 0x18, f_mhz, f_hz, gain,samples, \
decim,sets); +		TCPSock.send(raw_data_2);
+		
+		
+		
+TCPSock.close();
+
+
+

Copied: gnuradio/trunk/gr-msdd6000/src/python/test_udp.py (from rev 7902, \
gnuradio/branches/developers/n4hy/msddLTS/gr-msdd6000/src/python_test/test_udp.py) \
                ===================================================================
--- gnuradio/trunk/gr-msdd6000/src/python/test_udp.py	                        (rev 0)
+++ gnuradio/trunk/gr-msdd6000/src/python/test_udp.py	2008-02-29 19:26:49 UTC (rev \
7904) @@ -0,0 +1,40 @@
+#!/usr/bin/python
+
+from socket import *
+import string
+import time
+import struct;
+
+
+port = 10001
+host = "10.45.4.43"
+
+myaddr = ("10.45.1.229",10000);
+
+buf = 1024;
+
+UDPSock = socket(AF_INET,SOCK_DGRAM);
+UDPSock.bind(myaddr);
+
+f_mhz = 2400;
+f_hz = 1;
+gain = 3;
+samples = 512;
+decim = 2;
+sets = 16;
+
+
+req_data = struct.pack("<IIIIIIIIII", 0x0001, 0x0002, f_mhz, f_hz, gain, samples, \
decim, sets); +data = struct.pack("<II", 0x0000, 0x0000);
+
+
+
+UDPSock.sendto(stat_data, (host,port))
+
+
+print "sent"
+
+data,addr = UDPSock.recvfrom(buf);
+print "got response"
+
+


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic