Browse Source

choose audio with stream selector (fixed number of in/outports)

master
Clemens Richter 9 years ago
parent
commit
aa844f412b
  1. 1685
      apps/fft-multi-decoder_fixed_hackrf.grc
  2. 61
      lib/stream_router_impl.cc
  3. 5
      lib/stream_router_impl.h
  4. 45
      python/max_freq.py
  5. 29
      python/rds_parser_table_qt.py

1685
apps/fft-multi-decoder_fixed_hackrf.grc

File diff suppressed because it is too large Load Diff

61
lib/stream_router_impl.cc

@ -40,9 +40,16 @@ namespace gr {
*/ */
stream_router_impl::stream_router_impl(int ninputs,int noutputs) stream_router_impl::stream_router_impl(int ninputs,int noutputs)
: gr::sync_block("stream_router", : gr::sync_block("stream_router",
gr::io_signature::make(1, 1, sizeof(float)), gr::io_signature::make(3, 9, sizeof(float)),
gr::io_signature::make(1, 1, sizeof(float))) gr::io_signature::make(3, 3, sizeof(float)))
{} {
message_port_register_in(pmt::mp("ctrl"));
set_msg_handler(pmt::mp("ctrl"), boost::bind(&stream_router_impl::parse_ctrl_msg, this, _1));
//outmappings={0,1,2};
outmappings[0]=0;
outmappings[1]=1;
outmappings[2]=2;
}
/* /*
* Our virtual destructor. * Our virtual destructor.
@ -51,13 +58,53 @@ namespace gr {
{ {
} }
int void stream_router_impl::parse_ctrl_msg(pmt::pmt_t pdu) {
stream_router_impl::work(int noutput_items, if(!pmt::is_pair(pdu)) {
std::cout << "wrong input message (not a pair)" << std::endl;
return;
}
pmt::pmt_t inport = pmt::car(pdu); // meta declares type 0:RDS, 1:sync/nosync
pmt::pmt_t outport = pmt::cdr(pdu);
if(!pmt::is_integer(inport) or !pmt::is_integer(outport)) {
std::cout << "wrong input message (not a long)" << std::endl;
return;
}
std::cout << pdu << std::endl;
outmappings[pmt::to_long(outport)]=pmt::to_long(inport);
//pmt::to_long(meta)
// if(1L==pmt::to_long(meta) && pmt::eqv(sync,pmt::PMT_F)){
// lout<< "entered nosync"<<std::endl;
// lout<<"mode: "<<mode<<std::endl;
// mode=COPY;
// lout<<"mode: "<<mode<<std::endl;
// }
}
int stream_router_impl::work(int noutput_items,
gr_vector_const_void_star &input_items, gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items) gr_vector_void_star &output_items)
{ {
const float *in = (const float *) input_items[0]; // const float *in0 = (const float *) input_items[0];
float *out = (float *) output_items[0]; // const float *in1 = (const float *) input_items[1];
// const float *in2 = (const float *) input_items[2];
const float *inports[] = {
(const float *) input_items[0],(const float *) input_items[1],(const float *) input_items[2]
,(const float *) input_items[3],(const float *) input_items[4],(const float *) input_items[5]
,(const float *) input_items[6],(const float *) input_items[7],(const float *) input_items[8]
};
float *outs[] = {(float *) output_items[0],(float *) output_items[1],(float *) output_items[2]};
// float *outL = (float *) output_items[0];
// float *outC = (float *) output_items[1];
// float *outR = (float *) output_items[2];
for (int i = 0; i < noutput_items; i++) {
for (int outport=0;outport<3;outport++){
outs[outport][i]=inports[outmappings[outport]][i];
}
// outL[i]=in0[i];
// outC[i]=in1[i];
// outR[i]=in2[i];
}
// Do <+signal processing+> // Do <+signal processing+>

5
lib/stream_router_impl.h

@ -39,8 +39,13 @@ namespace gr {
int work(int noutput_items, int work(int noutput_items,
gr_vector_const_void_star &input_items, gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items); gr_vector_void_star &output_items);
void parse_ctrl_msg(pmt::pmt_t pdu);
int outmappings[3];
}; };
} // namespace multirds } // namespace multirds
} // namespace gr } // namespace gr

45
python/max_freq.py

@ -57,28 +57,29 @@ class max_freq(gr.sync_block):
return freq return freq
def handle_ctrl_msg(self,msg): def handle_ctrl_msg(self,msg):
m = pmt.pmt_to_python.pmt_to_dict(msg) if pmt.is_dict():
if m.has_key("cmd") and m["cmd"]=="set_audio_freq": m = pmt.pmt_to_python.pmt_to_dict(msg)
#print(m) if m.has_key("cmd") and m["cmd"]=="set_audio_freq":
#print(self.last_station_indices) #print(m)
freq_index=self.freq_to_index(m["freq"]) #print(self.last_station_indices)
if m["chan"]=="left" and freq_index<self.fft_len-5: freq_index=self.freq_to_index(m["freq"])
if self.last_station_indices[0]==freq_index: if m["chan"]=="left" and freq_index<self.fft_len-5:
self.index_fixed[0]=False if self.last_station_indices[0]==freq_index:
print("decoder 0 free") self.index_fixed[0]=False
else: print("decoder 0 free")
self.last_station_indices[0]=freq_index else:
self.index_fixed[0]=True self.last_station_indices[0]=freq_index
print("decoder 0 fixed to %i"%m["freq"]) self.index_fixed[0]=True
if m["chan"]=="right" and freq_index<self.fft_len-5: print("decoder 0 fixed to %i"%m["freq"])
if self.last_station_indices[1]==freq_index: if m["chan"]=="right" and freq_index<self.fft_len-5:
self.index_fixed[1]=False if self.last_station_indices[1]==freq_index:
print("decoder 1 free") self.index_fixed[1]=False
else: print("decoder 1 free")
self.last_station_indices[1]=freq_index else:
self.index_fixed[1]=True self.last_station_indices[1]=freq_index
print("decoder 1 fixed to %i"%m["freq"]) self.index_fixed[1]=True
#print(self.last_station_indices) print("decoder 1 fixed to %i"%m["freq"])
#print(self.last_station_indices)
if m.has_key("cmd") and m["cmd"]=="switch mode": if m.has_key("cmd") and m["cmd"]=="switch mode":
self.searchMode=not self.searchMode self.searchMode=not self.searchMode
print("searchMode: %s"%self.searchMode) print("searchMode: %s"%self.searchMode)

29
python/rds_parser_table_qt.py

@ -1144,12 +1144,19 @@ class rds_parser_table_qt_Widget(QtGui.QWidget):
details_button.clicked.connect(functools.partial(self.getDetails, row=rowPosition)) details_button.clicked.connect(functools.partial(self.getDetails, row=rowPosition))
button_layout.addWidget(details_button) button_layout.addWidget(details_button)
#2017-03-17 disabled LR buttons #2017-03-17 disabled LR buttons
#left_button=QtGui.QPushButton("L") #2017-04-24 enabled LR buttons
left_button=QtGui.QPushButton("L")
#left_button.clicked.connect(functools.partial(self.setAudio, row=rowPosition,audio_channel="left")) #left_button.clicked.connect(functools.partial(self.setAudio, row=rowPosition,audio_channel="left"))
#button_layout.addWidget(left_button) left_button.clicked.connect(functools.partial(self.setAudio2, row=rowPosition,audio_channel=0))
#right_button=QtGui.QPushButton("R") button_layout.addWidget(left_button)
center_button=QtGui.QPushButton("C")
#center_button.clicked.connect(functools.partial(self.setAudio, row=rowPosition,audio_channel="center"))
center_button.clicked.connect(functools.partial(self.setAudio2, row=rowPosition,audio_channel=1))
button_layout.addWidget(center_button)
right_button=QtGui.QPushButton("R")
#right_button.clicked.connect(functools.partial(self.setAudio, row=rowPosition,audio_channel="right")) #right_button.clicked.connect(functools.partial(self.setAudio, row=rowPosition,audio_channel="right"))
#button_layout.addWidget(right_button) right_button.clicked.connect(functools.partial(self.setAudio2, row=rowPosition,audio_channel=2))
button_layout.addWidget(right_button)
cellWidget = QtGui.QWidget() cellWidget = QtGui.QWidget()
cellWidget.setLayout(button_layout) cellWidget.setLayout(button_layout)
@ -1255,6 +1262,20 @@ class rds_parser_table_qt_Widget(QtGui.QWidget):
#catch: #catch:
#print("no freq, cant set decoder")#show notification? popup: too intrusive, log: maybe not visible, other possibility? #print("no freq, cant set decoder")#show notification? popup: too intrusive, log: maybe not visible, other possibility?
#print("freq not in RX BW")#automatically shift freq-tune? #print("freq not in RX BW")#automatically shift freq-tune?
def setAudio2(self,row,audio_channel):
PIcol=self.colorder.index('ID')
PI=str(self.table.cellWidget(row,PIcol).text())
#find port:
for port,decoder in enumerate(self.tableobj.decoders):
if decoder['PI']==PI:
#self.tableobj.decoders[port]['PI']
inport=pmt.from_long(port)
outport=pmt.from_long(audio_channel)
print("sending chan:%i"%audio_channel)
send_pmt=pmt.cons(inport, outport) #make PDU: (metadata, data) pair
self.tableobj.message_port_pub(pmt.intern('ctrl'), send_pmt)
def getDetails(self,row): def getDetails(self,row):
PIcol=self.colorder.index('ID') PIcol=self.colorder.index('ID')
PI=str(self.table.cellWidget(row,PIcol).text()) PI=str(self.table.cellWidget(row,PIcol).text())

Loading…
Cancel
Save