00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00044 #include"channel-manager.h"
00045 #include<assert.h>
00046 #include<iostream>
00047
00048
00049
00050 ChannelManager::ChannelManager()
00051 {
00052 bind("startFreq_", &startFreq);
00053 bind("endFreq_", &endFreq);
00054 }
00055
00056 ChannelManager::~ChannelManager()
00057 {
00058 }
00059
00060
00061 static class ChannelManagerClass : public TclClass {
00062 public:
00063 ChannelManagerClass() : TclClass("ChannelManager") {}
00064 TclObject* create(int, const char*const*) { return (new ChannelManager); }
00065 } class_ChannelManager;
00066
00067
00068
00069
00070 void ChannelManager::addChannel(MSpectralMask* sm)
00071 {
00072 chlist.push_back(sm);
00073 reallocateChannels();
00074 }
00075
00076
00077
00078 void ChannelManager::reallocateChannels()
00079 {
00080 int numchs = chlist.size();
00081 double totbw = endFreq - startFreq;
00082 assert(totbw>0);
00083 assert(numchs>0);
00084 double chbw = totbw / numchs;
00085
00086 std::list<MSpectralMask*>::iterator iter = chlist.begin();
00087
00088
00089 double fc = startFreq + chbw/2;
00090
00091 int chid = 0;
00092
00093 while (iter != chlist.end())
00094 {
00095 MSpectralMask* sm = *iter;
00096 sm->setFreq(fc);
00097 sm->setBandwidth(chbw);
00098 fc += chbw;
00099 iter++;
00100 }
00101 }
00102
00103 int ChannelManager::command(int argc, const char*const* argv)
00104 {
00105 Tcl& tcl = Tcl::instance();
00106
00107 if(argc == 2)
00108 {
00109 if(strcasecmp(argv[1], "print")==0)
00110 {
00111 printChannels();
00112 return TCL_OK;
00113 }
00114 }
00115
00116 if(argc == 3)
00117 {
00118 if(strcasecmp(argv[1], "addChannel")==0)
00119 {
00120 MSpectralMask* msm = dynamic_cast<MSpectralMask*>(TclObject::lookup(argv[2]));
00121 if (!msm)
00122 return TCL_ERROR;
00123 addChannel(msm);
00124 return TCL_OK;
00125 }
00126 }
00127
00128 return TclObject::command(argc, argv);
00129 }
00130
00131
00132 void ChannelManager::printChannels()
00133 {
00134 int chid = 0;
00135 std::list<MSpectralMask*>::iterator iter = chlist.begin() ;
00136 while (iter != chlist.end())
00137 {
00138 chid++;
00139 std::cout << " Channel " << chid
00140 << ": freq " << (*iter)->getFreq()
00141 << " bw " << (*iter)->getBandwidth()
00142 << std::endl;
00143 iter++;
00144 }
00145 }