Changeset 662
- Timestamp:
- 10/20/07 12:23:54 (15 years ago)
- Files:
-
- trunk/libffado/src/bebob/bebob_avdevice.cpp (modified) (2 diffs)
- trunk/libffado/src/bebob/focusrite/focusrite_generic.cpp (modified) (1 diff)
- trunk/libffado/src/bebob/focusrite/focusrite_generic.h (modified) (3 diffs)
- trunk/libffado/src/bebob/focusrite/focusrite_saffire.cpp (modified) (3 diffs)
- trunk/libffado/src/bebob/focusrite/focusrite_saffire.h (modified) (2 diffs)
- trunk/libffado/src/bebob/focusrite/focusrite_saffirepro.cpp (modified) (4 diffs)
- trunk/libffado/src/bebob/focusrite/focusrite_saffirepro.h (modified) (3 diffs)
- trunk/libffado/support/mixer/mixer.py (modified) (3 diffs)
- trunk/libffado/support/mixer/mixer_saffire.py (added)
- trunk/libffado/support/mixer/mixer_saffire.ui (added)
- trunk/libffado/support/mixer/mixer_saffirepro.py (modified) (1 diff)
- trunk/libffado/support/mixer/SConscript (modified) (1 diff)
- trunk/libffado/tests/test-focusrite.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/libffado/src/bebob/bebob_avdevice.cpp
r661 r662 28 28 #include "bebob/bebob_mixer.h" 29 29 30 #include "bebob/focusrite/focusrite_saffire.h" 30 31 #include "bebob/focusrite/focusrite_saffirepro.h" 31 32 #include "bebob/terratec/terratec_device.h" … … 104 105 case 0x00000006: 105 106 return new Focusrite::SaffireProDevice(ieee1394Service, configRom); 107 case 0x00000000: 108 return new Focusrite::SaffireDevice(ieee1394Service, configRom); 106 109 default: // return a plain BeBoB device 107 110 return new AvDevice(ieee1394Service, configRom); trunk/libffado/src/bebob/focusrite/focusrite_generic.cpp
r661 r662 240 240 } 241 241 242 // low resolution volume control 243 VolumeControlLowRes::VolumeControlLowRes(FocusriteDevice& parent, int id, int shift) 244 : Control::Discrete() 245 , m_Parent(parent) 246 , m_cmd_id ( id ) 247 , m_bit_shift( shift ) 248 {} 249 VolumeControlLowRes::VolumeControlLowRes(FocusriteDevice& parent, int id, int shift, 250 std::string name, std::string label, std::string descr) 251 : Control::Discrete() 252 , m_Parent(parent) 253 , m_cmd_id ( id ) 254 , m_bit_shift( shift ) 255 { 256 setName(name); 257 setLabel(label); 258 setDescription(descr); 259 } 260 261 262 bool 263 VolumeControlLowRes::setValue(int v) 264 { 265 uint32_t reg; 266 uint32_t old_reg; 267 268 if (v>0xFF) v=0xFF; 269 else if (v<0) v=0; 270 271 if ( !m_Parent.getSpecificValue(m_cmd_id, ®) ) { 272 debugError( "getSpecificValue failed\n" ); 273 return 0; 274 } 275 276 old_reg=reg; 277 reg &= ~(0xFF<<m_bit_shift); 278 reg |= (v<<m_bit_shift); 279 280 debugOutput(DEBUG_LEVEL_VERBOSE, "setValue for id %d to %d, shift %d (reg: 0x%08X => 0x%08X)\n", 281 m_cmd_id, v, m_bit_shift, old_reg, reg); 282 283 if ( !m_Parent.setSpecificValue(m_cmd_id, reg) ) { 284 debugError( "setSpecificValue failed\n" ); 285 return false; 286 } else return true; 287 } 288 289 int 290 VolumeControlLowRes::getValue() 291 { 292 uint32_t val, reg; 293 294 if ( !m_Parent.getSpecificValue(m_cmd_id, ®) ) { 295 debugError( "getSpecificValue failed\n" ); 296 return 0; 297 } else { 298 val = (reg & 0xFF)>>m_bit_shift; 299 debugOutput(DEBUG_LEVEL_VERBOSE, "getValue for %d: reg: 0x%08X, result=%d\n", 300 m_cmd_id, reg, val); 301 return val; 302 } 303 } 304 305 306 // Saffire pro matrix mixer element 307 308 FocusriteMatrixMixer::FocusriteMatrixMixer(FocusriteDevice& p) 309 : Control::MatrixMixer("MatrixMixer") 310 , m_Parent(p) 311 { 312 } 313 314 FocusriteMatrixMixer::FocusriteMatrixMixer(FocusriteDevice& p,std::string n) 315 : Control::MatrixMixer(n) 316 , m_Parent(p) 317 { 318 } 319 320 void FocusriteMatrixMixer::addSignalInfo(std::vector<struct sSignalInfo> &target, 321 std::string name, std::string label, std::string descr) 322 { 323 struct sSignalInfo s; 324 s.name=name; 325 s.label=label; 326 s.description=descr; 327 328 target.push_back(s); 329 } 330 331 void FocusriteMatrixMixer::setCellInfo(int row, int col, int addr, bool valid) 332 { 333 struct sCellInfo c; 334 c.row=row; 335 c.col=col; 336 c.valid=valid; 337 c.address=addr; 338 339 m_CellInfo[row][col]=c; 340 } 341 342 void FocusriteMatrixMixer::show() 343 { 344 debugOutput(DEBUG_LEVEL_NORMAL, "Focusrite Matrix mixer\n"); 345 } 346 347 std::string FocusriteMatrixMixer::getRowName( const int row ) 348 { 349 debugOutput(DEBUG_LEVEL_VERBOSE, "name for row %d is %s\n", 350 row, m_RowInfo.at(row).name.c_str()); 351 return m_RowInfo.at(row).name; 352 } 353 354 std::string FocusriteMatrixMixer::getColName( const int col ) 355 { 356 debugOutput(DEBUG_LEVEL_VERBOSE, "name for col %d is %s\n", 357 col, m_ColInfo.at(col).name.c_str()); 358 return m_ColInfo.at(col).name; 359 } 360 361 int FocusriteMatrixMixer::canWrite( const int row, const int col ) 362 { 363 debugOutput(DEBUG_LEVEL_VERBOSE, "canWrite for row %d col %d is %d\n", 364 row, col, m_CellInfo.at(row).at(col).valid); 365 return m_CellInfo.at(row).at(col).valid; 366 } 367 368 double FocusriteMatrixMixer::setValue( const int row, const int col, const double val ) 369 { 370 int32_t v=val; 371 struct sCellInfo c=m_CellInfo.at(row).at(col); 372 373 debugOutput(DEBUG_LEVEL_VERBOSE, "setValue for id %d row %d col %d to %lf (%ld)\n", 374 c.address, row, col, val, v); 375 376 if (v>0x07FFF) v=0x07FFF; 377 else if (v<0) v=0; 378 379 if ( !m_Parent.setSpecificValue(c.address, v) ) { 380 debugError( "setSpecificValue failed\n" ); 381 return false; 382 } else return true; 383 } 384 385 double FocusriteMatrixMixer::getValue( const int row, const int col ) 386 { 387 struct sCellInfo c=m_CellInfo.at(row).at(col); 388 uint32_t val=0; 389 390 if ( !m_Parent.getSpecificValue(c.address, &val) ) { 391 debugError( "getSpecificValue failed\n" ); 392 return 0; 393 } else { 394 debugOutput(DEBUG_LEVEL_VERBOSE, "getValue for id %d row %d col %d = %lu\n", 395 c.address, row, col, val); 396 return val; 397 } 398 } 399 400 int FocusriteMatrixMixer::getRowCount( ) 401 { 402 return m_RowInfo.size(); 403 } 404 405 int FocusriteMatrixMixer::getColCount( ) 406 { 407 return m_ColInfo.size(); 408 } 409 410 242 411 } // Focusrite 243 412 } // BeBoB trunk/libffado/src/bebob/focusrite/focusrite_generic.h
r661 r662 30 30 31 31 #include "libcontrol/BasicElements.h" 32 #include "libcontrol/MatrixMixer.h" 32 33 33 34 namespace BeBoB { … … 48 49 49 50 private: 50 FocusriteDevice& m_Parent;51 FocusriteDevice& m_Parent; 51 52 unsigned int m_cmd_id; 52 53 unsigned int m_cmd_bit; … … 65 66 66 67 private: 67 FocusriteDevice& m_Parent;68 FocusriteDevice& m_Parent; 68 69 unsigned int m_cmd_id; 69 70 }; 70 71 72 class VolumeControlLowRes 73 : public Control::Discrete 74 { 75 public: 76 VolumeControlLowRes(FocusriteDevice& parent, int id, int shift); 77 VolumeControlLowRes(FocusriteDevice& parent, int id, int shift, 78 std::string name, std::string label, std::string descr); 79 80 virtual bool setValue(int v); 81 virtual int getValue(); 82 83 private: 84 FocusriteDevice& m_Parent; 85 unsigned int m_cmd_id; 86 unsigned int m_bit_shift; 87 }; 88 89 class FocusriteMatrixMixer : public Control::MatrixMixer 90 { 91 public: 92 FocusriteMatrixMixer(FocusriteDevice& parent); 93 FocusriteMatrixMixer(FocusriteDevice& parent, std::string n); 94 virtual ~FocusriteMatrixMixer() {}; 95 96 virtual void show(); 97 98 virtual std::string getRowName( const int ); 99 virtual std::string getColName( const int ); 100 virtual int canWrite( const int, const int ); 101 virtual double setValue( const int, const int, const double ); 102 virtual double getValue( const int, const int ); 103 virtual int getRowCount( ); 104 virtual int getColCount( ); 105 106 protected: 107 struct sSignalInfo { 108 std::string name; 109 std::string label; 110 std::string description; 111 }; 112 struct sCellInfo { 113 int row; 114 int col; 115 // indicates whether a cell can be valid, this 116 // doesn't mean that it is writable. Just that it can be. 117 bool valid; 118 // the address to use when manipulating this cell 119 int address; 120 }; 121 122 virtual void init() = 0; 123 virtual void addSignalInfo(std::vector<struct sSignalInfo> &target, 124 std::string name, std::string label, std::string descr); 125 virtual void setCellInfo(int row, int col, int addr, bool valid); 126 127 std::vector<struct sSignalInfo> m_RowInfo; 128 std::vector<struct sSignalInfo> m_ColInfo; 129 std::vector< std::vector<struct sCellInfo> > m_CellInfo; 130 131 FocusriteDevice& m_Parent; 132 }; 71 133 72 134 class FocusriteDevice : public BeBoB::AvDevice { trunk/libffado/src/bebob/focusrite/focusrite_saffire.cpp
r649 r662 35 35 getConfigRom().getNodeId() ); 36 36 37 // the saffire pro doesn't seem to like it if the commands are too fast 38 if (AVC::AVCCommand::getSleepAfterAVCCommand() < 1000) { 39 AVC::AVCCommand::setSleepAfterAVCCommand( 1000 ); 40 } 37 41 38 42 } … … 41 45 { 42 46 47 } 48 bool 49 SaffireDevice::buildMixer() 50 { 51 bool result=true; 52 debugOutput(DEBUG_LEVEL_VERBOSE, "Building a Focusrite Saffire mixer...\n"); 53 54 destroyMixer(); 55 56 // create the mixer object container 57 m_MixerContainer = new Control::Container("Mixer"); 58 59 if (!m_MixerContainer) { 60 debugError("Could not create mixer container...\n"); 61 return false; 62 } 63 64 // create control objects for the saffire 65 result &= m_MixerContainer->addElement( 66 new BinaryControl(*this, 67 FR_SAFFIRE_CMD_ID_SPDIF_SWITCH, 0, 68 "SpdifSwitch", "S/PDIF Switch", "S/PDIF Switch")); 69 70 // output mute controls 71 result &= m_MixerContainer->addElement( 72 new BinaryControl(*this, 73 FR_SAFFIRE_CMD_ID_BITFIELD_OUT12, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_MUTE, 74 "Out12Mute", "Out1/2 Mute", "Output 1/2 Mute")); 75 result &= m_MixerContainer->addElement( 76 new BinaryControl(*this, 77 FR_SAFFIRE_CMD_ID_BITFIELD_OUT34, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_MUTE, 78 "Out34Mute", "Out3/4 Mute", "Output 3/4 Mute")); 79 result &= m_MixerContainer->addElement( 80 new BinaryControl(*this, 81 FR_SAFFIRE_CMD_ID_BITFIELD_OUT56, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_MUTE, 82 "Out56Mute", "Out5/6 Mute", "Output 5/6 Mute")); 83 result &= m_MixerContainer->addElement( 84 new BinaryControl(*this, 85 FR_SAFFIRE_CMD_ID_BITFIELD_OUT78, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_MUTE, 86 "Out78Mute", "Out7/8 Mute", "Output 7/8 Mute")); 87 result &= m_MixerContainer->addElement( 88 new BinaryControl(*this, 89 FR_SAFFIRE_CMD_ID_BITFIELD_OUT910, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_MUTE, 90 "Out910Mute", "Out9/10 Mute", "Output 9/10 Mute")); 91 92 // output front panel hw volume control 93 result &= m_MixerContainer->addElement( 94 new BinaryControl(*this, 95 FR_SAFFIRE_CMD_ID_BITFIELD_OUT12, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_HWCTRL, 96 "Out12HwCtrl", "Out1/2 HwCtrl", "Output 1/2 Front Panel Hardware volume control")); 97 result &= m_MixerContainer->addElement( 98 new BinaryControl(*this, 99 FR_SAFFIRE_CMD_ID_BITFIELD_OUT34, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_HWCTRL, 100 "Out34HwCtrl", "Out3/4 HwCtrl", "Output 3/4 Front Panel Hardware volume control")); 101 result &= m_MixerContainer->addElement( 102 new BinaryControl(*this, 103 FR_SAFFIRE_CMD_ID_BITFIELD_OUT56, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_HWCTRL, 104 "Out56HwCtrl", "Out5/6 HwCtrl", "Output 5/6 Front Panel Hardware volume control")); 105 result &= m_MixerContainer->addElement( 106 new BinaryControl(*this, 107 FR_SAFFIRE_CMD_ID_BITFIELD_OUT78, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_HWCTRL, 108 "Out78HwCtrl", "Out7/8 HwCtrl", "Output 7/8 Front Panel Hardware volume control")); 109 110 // output level dim 111 result &= m_MixerContainer->addElement( 112 new BinaryControl(*this, 113 FR_SAFFIRE_CMD_ID_BITFIELD_OUT12, FR_SAFFIRE_CMD_ID_BITFIELD_BIT_DIM, 114 "Out12Dim", "Out1/2 Dim", "Output 1/2 Level Dim")); 115 116 // output level controls 117 result &= m_MixerContainer->addElement( 118 new VolumeControlLowRes(*this, 119 FR_SAFFIRE_CMD_ID_BITFIELD_OUT12, 0, 120 "Out12Level", "Out1/2 Level", "Output 1/2 Level")); 121 result &= m_MixerContainer->addElement( 122 new VolumeControlLowRes(*this, 123 FR_SAFFIRE_CMD_ID_BITFIELD_OUT34, 0, 124 "Out34Level", "Out3/4 Level", "Output 3/4 Level")); 125 result &= m_MixerContainer->addElement( 126 new VolumeControlLowRes(*this, 127 FR_SAFFIRE_CMD_ID_BITFIELD_OUT56, 0, 128 "Out56Level", "Out5/6 Level", "Output 5/6 Level")); 129 result &= m_MixerContainer->addElement( 130 new VolumeControlLowRes(*this, 131 FR_SAFFIRE_CMD_ID_BITFIELD_OUT78, 0, 132 "Out78Level", "Out7/8 Level", "Output 7/8 Level")); 133 134 // matrix mix controls 135 result &= m_MixerContainer->addElement( 136 new SaffireMatrixMixer(*this, SaffireMatrixMixer::eMMT_InputMix, "InputMix")); 137 138 result &= m_MixerContainer->addElement( 139 new SaffireMatrixMixer(*this, SaffireMatrixMixer::eMMT_PCMix, "PCMix")); 140 141 142 if (!result) { 143 debugWarning("One or more control elements could not be created."); 144 // clean up those that couldn't be created 145 destroyMixer(); 146 return false; 147 } 148 149 if (!addElement(m_MixerContainer)) { 150 debugWarning("Could not register mixer to device\n"); 151 // clean up 152 destroyMixer(); 153 return false; 154 } 155 156 return true; 157 } 158 159 bool 160 SaffireDevice::destroyMixer() 161 { 162 debugOutput(DEBUG_LEVEL_VERBOSE, "destroy mixer...\n"); 163 164 if (m_MixerContainer == NULL) { 165 debugOutput(DEBUG_LEVEL_VERBOSE, "no mixer to destroy...\n"); 166 return true; 167 } 168 169 if (!deleteElement(m_MixerContainer)) { 170 debugError("Mixer present but not registered to the avdevice\n"); 171 return false; 172 } 173 174 // remove and delete (as in free) child control elements 175 m_MixerContainer->clearElements(true); 176 delete m_MixerContainer; 177 return true; 43 178 } 44 179 … … 58 193 } 59 194 195 // Saffire pro matrix mixer element 196 197 SaffireMatrixMixer::SaffireMatrixMixer(SaffireDevice& p, 198 enum eMatrixMixerType type) 199 : FocusriteMatrixMixer(p, "MatrixMixer") 200 , m_type(type) 201 { 202 init(); 203 } 204 205 SaffireMatrixMixer::SaffireMatrixMixer(SaffireDevice& p, 206 enum eMatrixMixerType type, std::string n) 207 : FocusriteMatrixMixer(p, n) 208 , m_type(type) 209 { 210 init(); 211 } 212 213 void SaffireMatrixMixer::init() 214 { 215 if (m_type==eMMT_PCMix) { 216 addSignalInfo(m_RowInfo, "PC12", "PC 1/2", "PC Channel 1/2"); 217 addSignalInfo(m_RowInfo, "PC34", "PC 3/4", "PC Channel 3/4"); 218 addSignalInfo(m_RowInfo, "PC56", "PC 5/6", "PC Channel 5/6"); 219 addSignalInfo(m_RowInfo, "PC78", "PC 7/8", "PC Channel 7/8"); 220 addSignalInfo(m_RowInfo, "PC910", "PC 9/10", "PC Channel 9/10"); 221 222 addSignalInfo(m_ColInfo, "OUT12", "OUT 1/2", "Output 1/2"); 223 addSignalInfo(m_ColInfo, "OUT34", "OUT 3/4", "Output 3/4"); 224 addSignalInfo(m_ColInfo, "OUT56", "OUT 5/6", "Output 5/6"); 225 addSignalInfo(m_ColInfo, "OUT78", "OUT 7/8", "Output 7/8"); 226 addSignalInfo(m_ColInfo, "OUT910", "OUT 9/10", "Output 9/10"); 227 228 // init the cell matrix 229 #define FOCUSRITE_SAFFIRE_PCMIX_NB_COLS 5 230 #define FOCUSRITE_SAFFIRE_PCMIX_NB_ROWS 5 231 232 std::vector<struct sCellInfo> tmp_cols( FOCUSRITE_SAFFIRE_PCMIX_NB_COLS ); 233 std::vector< std::vector<struct sCellInfo> > tmp_all(FOCUSRITE_SAFFIRE_PCMIX_NB_ROWS, tmp_cols); 234 m_CellInfo = tmp_all; 235 236 struct sCellInfo c; 237 c.row=-1; 238 c.col=-1; 239 c.valid=false; 240 c.address=0; 241 242 for (int i=0;i<FOCUSRITE_SAFFIRE_PCMIX_NB_ROWS;i++) { 243 for (int j=0;j<FOCUSRITE_SAFFIRE_PCMIX_NB_COLS;j++) { 244 m_CellInfo[i][j]=c; 245 } 246 } 247 248 // now set the cells that are valid 249 setCellInfo(0,0,FR_SAFFIRE_CMD_ID_PC12_TO_OUT12, true); 250 setCellInfo(0,1,FR_SAFFIRE_CMD_ID_PC12_TO_OUT34, true); 251 setCellInfo(0,2,FR_SAFFIRE_CMD_ID_PC12_TO_OUT56, true); 252 setCellInfo(0,3,FR_SAFFIRE_CMD_ID_PC12_TO_OUT79, true); 253 setCellInfo(0,4,FR_SAFFIRE_CMD_ID_PC12_TO_OUT910, true); 254 setCellInfo(1,0,FR_SAFFIRE_CMD_ID_PC34_TO_OUT12, true); 255 setCellInfo(1,1,FR_SAFFIRE_CMD_ID_PC34_TO_OUT34, true); 256 setCellInfo(1,2,FR_SAFFIRE_CMD_ID_PC34_TO_OUT56, true); 257 setCellInfo(1,3,FR_SAFFIRE_CMD_ID_PC34_TO_OUT79, true); 258 setCellInfo(1,4,FR_SAFFIRE_CMD_ID_PC34_TO_OUT910, true); 259 setCellInfo(2,0,FR_SAFFIRE_CMD_ID_PC56_TO_OUT12, true); 260 setCellInfo(2,1,FR_SAFFIRE_CMD_ID_PC56_TO_OUT34, true); 261 setCellInfo(2,2,FR_SAFFIRE_CMD_ID_PC56_TO_OUT56, true); 262 setCellInfo(2,3,FR_SAFFIRE_CMD_ID_PC56_TO_OUT79, true); 263 setCellInfo(2,4,FR_SAFFIRE_CMD_ID_PC56_TO_OUT910, true); 264 setCellInfo(3,0,FR_SAFFIRE_CMD_ID_PC78_TO_OUT12, true); 265 setCellInfo(3,1,FR_SAFFIRE_CMD_ID_PC78_TO_OUT34, true); 266 setCellInfo(3,2,FR_SAFFIRE_CMD_ID_PC78_TO_OUT56, true); 267 setCellInfo(3,3,FR_SAFFIRE_CMD_ID_PC78_TO_OUT79, true); 268 setCellInfo(3,4,FR_SAFFIRE_CMD_ID_PC78_TO_OUT910, true); 269 setCellInfo(4,0,FR_SAFFIRE_CMD_ID_PC910_TO_OUT12, true); 270 setCellInfo(4,1,FR_SAFFIRE_CMD_ID_PC910_TO_OUT34, true); 271 setCellInfo(4,2,FR_SAFFIRE_CMD_ID_PC910_TO_OUT56, true); 272 setCellInfo(4,3,FR_SAFFIRE_CMD_ID_PC910_TO_OUT79, true); 273 setCellInfo(4,4,FR_SAFFIRE_CMD_ID_PC910_TO_OUT910, true); 274 275 } else if (m_type==eMMT_InputMix) { 276 addSignalInfo(m_RowInfo, "IN1", "Input 1", "Analog Input 1"); 277 addSignalInfo(m_RowInfo, "IN2", "Input 2", "Analog Input 2"); 278 addSignalInfo(m_RowInfo, "SPDIFL", "SPDIF L", "S/PDIF Left Input"); 279 addSignalInfo(m_RowInfo, "SPDIFR", "SPDIF R", "S/PDIF Right Input"); 280 addSignalInfo(m_RowInfo, "REV1", "REVERB 1", "Reverb CH1 return"); 281 addSignalInfo(m_RowInfo, "REV1", "REVERB 2", "Reverb CH2 return"); 282 283 addSignalInfo(m_ColInfo, "OUT1", "OUT 1", "Output 1"); 284 addSignalInfo(m_ColInfo, "OUT2", "OUT 2", "Output 2"); 285 addSignalInfo(m_ColInfo, "OUT3", "OUT 3", "Output 3"); 286 addSignalInfo(m_ColInfo, "OUT4", "OUT 4", "Output 4"); 287 addSignalInfo(m_ColInfo, "OUT5", "OUT 5", "Output 5"); 288 addSignalInfo(m_ColInfo, "OUT6", "OUT 6", "Output 6"); 289 addSignalInfo(m_ColInfo, "OUT7", "OUT 7", "Output 7"); 290 addSignalInfo(m_ColInfo, "OUT8", "OUT 8", "Output 8"); 291 addSignalInfo(m_ColInfo, "OUT9", "OUT 9", "Output 9"); 292 addSignalInfo(m_ColInfo, "OUT10", "OUT 10", "Output 10"); 293 294 // init the cell matrix 295 #define FOCUSRITE_SAFFIRE_INPUTMIX_NB_COLS 10 296 #define FOCUSRITE_SAFFIRE_INPUTMIX_NB_ROWS 6 297 298 std::vector<struct sCellInfo> tmp_cols( FOCUSRITE_SAFFIRE_INPUTMIX_NB_COLS ); 299 std::vector< std::vector<struct sCellInfo> > tmp_all(FOCUSRITE_SAFFIRE_INPUTMIX_NB_ROWS,tmp_cols); 300 m_CellInfo = tmp_all; 301 302 struct sCellInfo c; 303 c.row=-1; 304 c.col=-1; 305 c.valid=false; 306 c.address=0; 307 308 for (int i=0;i<FOCUSRITE_SAFFIRE_INPUTMIX_NB_ROWS;i++) { 309 for (int j=0;j<FOCUSRITE_SAFFIRE_INPUTMIX_NB_COLS;j++) { 310 m_CellInfo[i][j]=c; 311 } 312 } 313 314 // now set the cells that are valid 315 setCellInfo(0,0,FR_SAFFIRE_CMD_ID_IN1_TO_OUT1, true); 316 setCellInfo(0,2,FR_SAFFIRE_CMD_ID_IN1_TO_OUT3, true); 317 setCellInfo(0,4,FR_SAFFIRE_CMD_ID_IN1_TO_OUT5, true); 318 setCellInfo(0,6,FR_SAFFIRE_CMD_ID_IN1_TO_OUT7, true); 319 setCellInfo(0,8,FR_SAFFIRE_CMD_ID_IN1_TO_OUT9, true); 320 setCellInfo(1,1,FR_SAFFIRE_CMD_ID_IN2_TO_OUT2, true); 321 setCellInfo(1,3,FR_SAFFIRE_CMD_ID_IN2_TO_OUT4, true); 322 setCellInfo(1,5,FR_SAFFIRE_CMD_ID_IN2_TO_OUT6, true); 323 setCellInfo(1,7,FR_SAFFIRE_CMD_ID_IN2_TO_OUT8, true); 324 setCellInfo(1,9,FR_SAFFIRE_CMD_ID_IN2_TO_OUT10, true); 325 setCellInfo(2,0,FR_SAFFIRE_CMD_ID_IN3_TO_OUT1, true); 326 setCellInfo(2,2,FR_SAFFIRE_CMD_ID_IN3_TO_OUT3, true); 327 setCellInfo(2,4,FR_SAFFIRE_CMD_ID_IN3_TO_OUT5, true); 328 setCellInfo(2,6,FR_SAFFIRE_CMD_ID_IN3_TO_OUT7, true); 329 setCellInfo(2,8,FR_SAFFIRE_CMD_ID_IN3_TO_OUT9, true); 330 setCellInfo(3,1,FR_SAFFIRE_CMD_ID_IN4_TO_OUT2, true); 331 setCellInfo(3,3,FR_SAFFIRE_CMD_ID_IN4_TO_OUT4, true); 332 setCellInfo(3,5,FR_SAFFIRE_CMD_ID_IN4_TO_OUT6, true); 333 setCellInfo(3,7,FR_SAFFIRE_CMD_ID_IN4_TO_OUT8, true); 334 setCellInfo(3,9,FR_SAFFIRE_CMD_ID_IN4_TO_OUT10, true); 335 336 setCellInfo(4,0,FR_SAFFIRE_CMD_ID_REV1_TO_OUT1, true); 337 setCellInfo(5,1,FR_SAFFIRE_CMD_ID_REV2_TO_OUT2, true); 338 setCellInfo(4,2,FR_SAFFIRE_CMD_ID_REV1_TO_OUT3, true); 339 setCellInfo(5,3,FR_SAFFIRE_CMD_ID_REV2_TO_OUT4, true); 340 setCellInfo(4,4,FR_SAFFIRE_CMD_ID_REV1_TO_OUT5, true); 341 setCellInfo(5,5,FR_SAFFIRE_CMD_ID_REV2_TO_OUT6, true); 342 setCellInfo(4,6,FR_SAFFIRE_CMD_ID_REV1_TO_OUT7, true); 343 setCellInfo(5,7,FR_SAFFIRE_CMD_ID_REV2_TO_OUT8, true); 344 setCellInfo(4,8,FR_SAFFIRE_CMD_ID_REV1_TO_OUT9, true); 345 setCellInfo(5,9,FR_SAFFIRE_CMD_ID_REV2_TO_OUT10, true); 346 347 } else { 348 debugError("Invalid mixer type\n"); 349 } 350 } 351 352 void SaffireMatrixMixer::show() 353 { 354 debugOutput(DEBUG_LEVEL_NORMAL, "Saffire Pro Matrix mixer type %d\n"); 355 } 356 60 357 } // Focusrite 61 358 } // BeBoB trunk/libffado/src/bebob/focusrite/focusrite_saffire.h
r649 r662 29 29 #include "focusrite_generic.h" 30 30 31 #include "libcontrol/BasicElements.h" 32 #include "libcontrol/MatrixMixer.h" 33 34 // The ID's for the hardware input matrix mixer 35 #define FR_SAFFIRE_CMD_ID_IN1_TO_OUT1 1 36 #define FR_SAFFIRE_CMD_ID_IN1_TO_OUT3 2 37 #define FR_SAFFIRE_CMD_ID_IN1_TO_OUT5 3 38 #define FR_SAFFIRE_CMD_ID_IN1_TO_OUT7 4 39 #define FR_SAFFIRE_CMD_ID_IN1_TO_OUT9 0 40 #define FR_SAFFIRE_CMD_ID_IN2_TO_OUT2 16 41 #define FR_SAFFIRE_CMD_ID_IN2_TO_OUT4 17 42 #define FR_SAFFIRE_CMD_ID_IN2_TO_OUT6 18 43 #define FR_SAFFIRE_CMD_ID_IN2_TO_OUT8 19 44 #define FR_SAFFIRE_CMD_ID_IN2_TO_OUT10 15 45 #define FR_SAFFIRE_CMD_ID_IN3_TO_OUT1 6 46 #define FR_SAFFIRE_CMD_ID_IN3_TO_OUT3 7 47 #define FR_SAFFIRE_CMD_ID_IN3_TO_OUT5 8 48 #define FR_SAFFIRE_CMD_ID_IN3_TO_OUT7 9 49 #define FR_SAFFIRE_CMD_ID_IN3_TO_OUT9 5 50 #define FR_SAFFIRE_CMD_ID_IN4_TO_OUT2 21 51 #define FR_SAFFIRE_CMD_ID_IN4_TO_OUT4 22 52 #define FR_SAFFIRE_CMD_ID_IN4_TO_OUT6 23 53 #define FR_SAFFIRE_CMD_ID_IN4_TO_OUT8 24 54 #define FR_SAFFIRE_CMD_ID_IN4_TO_OUT10 20 55 56 // reverb return id's (part of hardware input mixer) 57 #define FR_SAFFIRE_CMD_ID_REV1_TO_OUT1 11 58 #define FR_SAFFIRE_CMD_ID_REV2_TO_OUT2 26 59 #define FR_SAFFIRE_CMD_ID_REV1_TO_OUT3 12 60 #define FR_SAFFIRE_CMD_ID_REV2_TO_OUT4 27 61 #define FR_SAFFIRE_CMD_ID_REV1_TO_OUT5 13 62 #define FR_SAFFIRE_CMD_ID_REV2_TO_OUT6 28 63 #define FR_SAFFIRE_CMD_ID_REV1_TO_OUT7 14 64 #define FR_SAFFIRE_CMD_ID_REV2_TO_OUT8 29 65 #define FR_SAFFIRE_CMD_ID_REV1_TO_OUT9 10 66 #define FR_SAFFIRE_CMD_ID_REV2_TO_OUT10 25 67 68 // The ID's for the playback matrix mixer 69 #define FR_SAFFIRE_CMD_ID_PC12_TO_OUT12 36 70 #define FR_SAFFIRE_CMD_ID_PC12_TO_OUT34 37 71 #define FR_SAFFIRE_CMD_ID_PC12_TO_OUT56 38 72 #define FR_SAFFIRE_CMD_ID_PC12_TO_OUT79 39 73 #define FR_SAFFIRE_CMD_ID_PC12_TO_OUT910 35 74 #define FR_SAFFIRE_CMD_ID_PC34_TO_OUT12 41 75 #define FR_SAFFIRE_CMD_ID_PC34_TO_OUT34 42 76 #define FR_SAFFIRE_CMD_ID_PC34_TO_OUT56 43 77 #define FR_SAFFIRE_CMD_ID_PC34_TO_OUT79 44 78 #define FR_SAFFIRE_CMD_ID_PC34_TO_OUT910 40 79 #define FR_SAFFIRE_CMD_ID_PC56_TO_OUT12 46 80 #define FR_SAFFIRE_CMD_ID_PC56_TO_OUT34 47 81 #define FR_SAFFIRE_CMD_ID_PC56_TO_OUT56 48 82 #define FR_SAFFIRE_CMD_ID_PC56_TO_OUT79 49 83 #define FR_SAFFIRE_CMD_ID_PC56_TO_OUT910 45 84 #define FR_SAFFIRE_CMD_ID_PC78_TO_OUT12 51 85 #define FR_SAFFIRE_CMD_ID_PC78_TO_OUT34 52 86 #define FR_SAFFIRE_CMD_ID_PC78_TO_OUT56 53 87 #define FR_SAFFIRE_CMD_ID_PC78_TO_OUT79 54 88 #define FR_SAFFIRE_CMD_ID_PC78_TO_OUT910 50 89 #define FR_SAFFIRE_CMD_ID_PC910_TO_OUT12 31 90 #define FR_SAFFIRE_CMD_ID_PC910_TO_OUT34 32 91 #define FR_SAFFIRE_CMD_ID_PC910_TO_OUT56 33 92 #define FR_SAFFIRE_CMD_ID_PC910_TO_OUT79 34 93 #define FR_SAFFIRE_CMD_ID_PC910_TO_OUT910 30 94 95 // the control ID's 96 #define FR_SAFFIRE_CMD_ID_BITFIELD_OUT12 55 97 #define FR_SAFFIRE_CMD_ID_BITFIELD_OUT34 56 98 #define FR_SAFFIRE_CMD_ID_BITFIELD_OUT56 57 99 #define FR_SAFFIRE_CMD_ID_BITFIELD_OUT78 58 100 #define FR_SAFFIRE_CMD_ID_BITFIELD_OUT910 59 101 102 #define FR_SAFFIRE_CMD_ID_BITFIELD_BIT_DIM 24 103 #define FR_SAFFIRE_CMD_ID_BITFIELD_BIT_MUTE 25 104 #define FR_SAFFIRE_CMD_ID_BITFIELD_BIT_HWCTRL 26 105 106 // other stuff 107 #define FR_SAFFIRE_CMD_ID_MONITOR_DIAL 61 108 #define FR_SAFFIRE_CMD_ID_SPDIF_SWITCH 62 109 110 #define FR_SAFFIRE_CMD_ID_METERING_IN1 64 111 #define FR_SAFFIRE_CMD_ID_METERING_IN2 65 112 #define FR_SAFFIRE_CMD_ID_METERING_IN3 66 113 #define FR_SAFFIRE_CMD_ID_METERING_IN4 67 114 115 #define FR_SAFFIRE_CMD_ID_SPDIF_DETECT 79 116 31 117 namespace BeBoB { 32 118 namespace Focusrite { 119 120 class SaffireDevice; 121 122 class SaffireMatrixMixer : public FocusriteMatrixMixer 123 { 124 public: 125 enum eMatrixMixerType { 126 eMMT_InputMix, 127 eMMT_PCMix 128 }; 129 130 public: 131 SaffireMatrixMixer(SaffireDevice& parent, enum eMatrixMixerType type); 132 SaffireMatrixMixer(SaffireDevice& parent, enum eMatrixMixerType type, std::string n); 133 virtual ~SaffireMatrixMixer() {}; 134 135 virtual void show(); 136 137 protected: 138 void init(); 139 enum eMatrixMixerType m_type; 140 }; 33 141 34 142 class SaffireDevice : public FocusriteDevice { … … 41 149 virtual void setVerboseLevel(int l); 42 150 151 virtual bool buildMixer(); 152 virtual bool destroyMixer(); 153 154 private: 155 Control::Container *m_MixerContainer; 43 156 }; 44 157 trunk/libffado/src/bebob/focusrite/focusrite_saffirepro.cpp
r661 r662 145 145 result &= m_MixerContainer->addElement( 146 146 new BinaryControl(*this, 147 FR_SAFFIREPRO_CMD_ID_BITFIELD_OUT12, FR_SAFFIREPRO_CMD_ID_BITFIELD_BIT_ PAD,147 FR_SAFFIREPRO_CMD_ID_BITFIELD_OUT12, FR_SAFFIREPRO_CMD_ID_BITFIELD_BIT_DIM, 148 148 "Out12Dim", "Out1/2 Dim", "Output 1/2 Level Dim")); 149 149 result &= m_MixerContainer->addElement( 150 150 new BinaryControl(*this, 151 FR_SAFFIREPRO_CMD_ID_BITFIELD_OUT34, FR_SAFFIREPRO_CMD_ID_BITFIELD_BIT_ PAD,151 FR_SAFFIREPRO_CMD_ID_BITFIELD_OUT34, FR_SAFFIREPRO_CMD_ID_BITFIELD_BIT_DIM, 152 152 "Out34Dim", "Out3/4 Dim", "Output 3/4 Level Dim")); 153 153 result &= m_MixerContainer->addElement( 154 154 new BinaryControl(*this, 155 FR_SAFFIREPRO_CMD_ID_BITFIELD_OUT56, FR_SAFFIREPRO_CMD_ID_BITFIELD_BIT_ PAD,155 FR_SAFFIREPRO_CMD_ID_BITFIELD_OUT56, FR_SAFFIREPRO_CMD_ID_BITFIELD_BIT_DIM, 156 156 "Out56Dim", "Out5/6 Dim", "Output 5/6 Level Dim")); 157 157 result &= m_MixerContainer->addElement( 158 158 new BinaryControl(*this, 159 FR_SAFFIREPRO_CMD_ID_BITFIELD_OUT78, FR_SAFFIREPRO_CMD_ID_BITFIELD_BIT_ PAD,159 FR_SAFFIREPRO_CMD_ID_BITFIELD_OUT78, FR_SAFFIREPRO_CMD_ID_BITFIELD_BIT_DIM, 160 160 "Out78Dim", "Out7/8 Dim", "Output 7/8 Level Dim")); 161 161 … … 357 357 SaffireProMatrixMixer::SaffireProMatrixMixer(SaffireProDevice& p, 358 358 enum eMatrixMixerType type) 359 : Control::MatrixMixer("MatrixMixer") 360 , m_Parent(p) 359 : FocusriteMatrixMixer(p, "MatrixMixer") 361 360 , m_type(type) 362 361 { 363 init( type);362 init(); 364 363 } 365 364 366 365 SaffireProMatrixMixer::SaffireProMatrixMixer(SaffireProDevice& p, 367 366 enum eMatrixMixerType type, std::string n) 368 : Control::MatrixMixer(n) 369 , m_Parent(p) 367 : FocusriteMatrixMixer(p, n) 370 368 , m_type(type) 371 369 { 372 init(type); 373 } 374 375 void SaffireProMatrixMixer::addSignalInfo(std::vector<struct sSignalInfo> &target, 376 std::string name, std::string label, std::string descr) 377 { 378 struct sSignalInfo s; 379 s.name=name; 380 s.label=label; 381 s.description=descr; 382 383 target.push_back(s); 384 } 385 386 void SaffireProMatrixMixer::setCellInfo(int row, int col, int addr, bool valid) 387 { 388 struct sCellInfo c; 389 c.row=row; 390 c.col=col; 391 c.valid=valid; 392 c.address=addr; 393 394 m_CellInfo[row][col]=c; 395 } 396 397 void SaffireProMatrixMixer::init(enum eMatrixMixerType type) 398 { 399 if (type==eMMT_OutputMix) { 370 init(); 371 } 372 373 void SaffireProMatrixMixer::init() 374 { 375 if (m_type==eMMT_OutputMix) { 400 376 addSignalInfo(m_RowInfo, "PC1", "PC 1", "PC Channel 1"); 401 377 addSignalInfo(m_RowInfo, "PC2", "PC 2", "PC Channel 2"); … … 472 448 setCellInfo(11,9,FR_SAFFIREPRO_CMD_ID_MIX2_TO_OUT10, true); 473 449 474 } else if ( type==eMMT_InputMix) {450 } else if (m_type==eMMT_InputMix) { 475 451 addSignalInfo(m_RowInfo, "AN1", "Analog 1", "Analog Input 1"); 476 452 addSignalInfo(m_RowInfo, "AN2", "Analog 2", "Analog Input 2"); … … 591 567 } 592 568 593 std::string SaffireProMatrixMixer::getRowName( const int row )594 {595 debugOutput(DEBUG_LEVEL_VERBOSE, "name for row %d is %s\n",596 row, m_RowInfo.at(row).name.c_str());597 return m_RowInfo.at(row).name;598 }599 600 std::string SaffireProMatrixMixer::getColName( const int col )601 {602 debugOutput(DEBUG_LEVEL_VERBOSE, "name for col %d is %s\n",603 col, m_ColInfo.at(col).name.c_str());604 return m_ColInfo.at(col).name;605 }606 607 int SaffireProMatrixMixer::canWrite( const int row, const int col )608 {609 debugOutput(DEBUG_LEVEL_VERBOSE, "canWrite for row %d col %d is %d\n",610 row, col, m_CellInfo.at(row).at(col).valid);611 return m_CellInfo.at(row).at(col).valid;612 }613 614 double SaffireProMatrixMixer::setValue( const int row, const int col, const double val )615 {616 int32_t v=val;617 struct sCellInfo c=m_CellInfo.at(row).at(col);618 619 debugOutput(DEBUG_LEVEL_VERBOSE, "setValue for id %d row %d col %d to %lf (%ld)\n",620 c.address, row, col, val, v);621 622 if (v>0x07FFF) v=0x07FFF;623 else if (v<0) v=0;624 625 if ( !m_Parent.setSpecificValue(c.address, v) ) {626 debugError( "setSpecificValue failed\n" );627 return false;628 } else return true;629 }630 631 double SaffireProMatrixMixer::getValue( const int row, const int col )632 {633 struct sCellInfo c=m_CellInfo.at(row).at(col);634 uint32_t val=0;635 636 if ( !m_Parent.getSpecificValue(c.address, &val) ) {637 debugError( "getSpecificValue failed\n" );638 return 0;639 } else {640 debugOutput(DEBUG_LEVEL_VERBOSE, "getValue for id %d row %d col %d = %lf\n",641 c.address, row, col, val);642 return val;643 }644 }645 646 int SaffireProMatrixMixer::getRowCount( )647 {648 return m_RowInfo.size();649 }650 651 int SaffireProMatrixMixer::getColCount( )652 {653 return m_ColInfo.size();654 }655 656 569 } // Focusrite 657 570 } // BeBoB trunk/libffado/src/bebob/focusrite/focusrite_saffirepro.h
r661 r662 30 30 31 31 #include "libcontrol/BasicElements.h" 32 #include "libcontrol/MatrixMixer.h"33 32 34 33 #include <vector> … … 161 160 class SaffireProDevice; 162 161 163 class SaffireProMatrixMixer : public Control::MatrixMixer162 class SaffireProMatrixMixer : public FocusriteMatrixMixer 164 163 { 165 164 public: … … 176 175 virtual void show(); 177 176 178 virtual std::string getRowName( const int ); 179 virtual std::string getColName( const int ); 180 virtual int canWrite( const int, const int ); 181 virtual double setValue( const int, const int, const double ); 182 virtual double getValue( const int, const int ); 183 virtual int getRowCount( ); 184 virtual int getColCount( ); 185 186 private: 187 struct sSignalInfo { 188 std::string name; 189 std::string label; 190 std::string description; 191 }; 192 struct sCellInfo { 193 int row; 194 int col; 195 // indicates whether a cell can be valid, this 196 // doesn't mean that it is writable. Just that it can be. 197 bool valid; 198 // the address to use when manipulating this cell 199 int address; 200 }; 201 202 void init(enum eMatrixMixerType type); 203 void addSignalInfo(std::vector<struct sSignalInfo> &target, 204 std::string name, std::string label, std::string descr); 205 void setCellInfo(int row, int col, int addr, bool valid); 206 207 std::vector<struct sSignalInfo> m_RowInfo; 208 std::vector<struct sSignalInfo> m_ColInfo; 209 std::vector< std::vector<struct sCellInfo> > m_CellInfo; 210 211 SaffireProDevice& m_Parent; 212 enum eMatrixMixerType m_type; 177 protected: 178 void init(); 179 enum eMatrixMixerType m_type; 213 180 }; 214 181 trunk/libffado/support/mixer/mixer.py
r653 r662 6 6 from mixer_phase24 import * 7 7 from mixer_saffirepro import * 8 from mixer_saffire import * 8 9 import sys 9 10 import dbus … … 15 16 [(0x00130e, 0x00000003),'SaffireProMixer'], 16 17 [(0x00130e, 0x00000006),'SaffireProMixer'], 18 [(0x00130e, 0x00000000),'SaffireMixer'], 17 19 ] 18 20 … … 123 125 app.setMainWidget(forms[idx]) 124 126 125 QObject.connect(app,SIGNAL("lastWindowClosed()"),app,SLOT("quit()")) 127 if forms: 128 QObject.connect(app,SIGNAL("lastWindowClosed()"),app,SLOT("quit()")) 126 129 127 app.exec_loop() 130 app.exec_loop() 131 else: 132 print "No supported device found..." trunk/libffado/support/mixer/mixer_saffirepro.py
r661 r662 354 354 'ac3pass': ['/Mixer/AC3pass', self.chkAC3], 355 355 'midithru': ['/Mixer/MidiTru', self.chkMidiThru], 356 # The following controls are available but have no GUI elements yet 357 #'out12mute': ['/Mixer/Out12Mute', self.chkOut12Mute], 358 #'out12hwctrl': ['/Mixer/Out12HwCtrl', self.chkOut12HwCtrl], 359 #'out12pad': ['/Mixer/Out12Pad', self.chkOut12Pad], 360 #'out12dim': ['/Mixer/Out12Dim', self.chkOut12Dim], 361 #'out34mute': ['/Mixer/Out34Mute', self.chkOut34Mute], 362 #'out34hwctrl': ['/Mixer/Out34HwCtrl', self.chkOut34HwCtrl], 363 #'out34pad': ['/Mixer/Out34Pad', self.chkOut34Pad], 364 #'out34dim': ['/Mixer/Out34Dim', self.chkOut34Dim], 365 #'out56mute': ['/Mixer/Out56Mute', self.chkOut56Mute], 366 #'out56hwctrl': ['/Mixer/Out56HwCtrl', self.chkOut56HwCtrl], 367 #'out56pad': ['/Mixer/Out56Pad', self.chkOut56Pad], 368 #'out56dim': ['/Mixer/Out56Dim', self.chkOut56Dim], 369 #'out78mute': ['/Mixer/Out78Mute', self.chkOut78Mute], 370 #'out78hwctrl': ['/Mixer/Out78HwCtrl', self.chkOut78HwCtrl], 371 #'out78pad': ['/Mixer/Out78Pad', self.chkOut78Pad], 372 #'out78dim': ['/Mixer/Out78Dim', self.chkOut78Dim], 373 #'out910mute': ['/Mixer/Out910Mute', self.chkOut910Mute], 374 #'out910hwctrl': ['/Mixer/Out910HwCtrl', self.chkOut910HwCtrl], 375 #'out910pad': ['/Mixer/Out910Pad', self.chkOut910Pad], 376 #'out910dim': ['/Mixer/Out910Dim', self.chkOut910Dim], 356 377 } 357 378 trunk/libffado/support/mixer/SConscript
r653 r662 4 4 5 5 if env.has_key('PYUIC'): 6 for app in ["mixer_phase24.ui","mixer_phase88.ui","mixer_saffirepro.ui" ]:6 for app in ["mixer_phase24.ui","mixer_phase88.ui","mixer_saffirepro.ui","mixer_saffire.ui"]: 7 7 env.Command( target=app.replace(".","")+".py", source=app, action="$PYUIC $SOURCE > $TARGET" ) trunk/libffado/tests/test-focusrite.cpp
r661 r662 166 166 cmd.setVerbose( DEBUG_LEVEL_NORMAL ); 167 167 168 uint32_t old_vals[129]; 168 #define TOTAL_IDS_TO_SCAN 128 169 uint32_t old_vals[TOTAL_IDS_TO_SCAN+1]; 169 170 170 171 while(1) { 171 for (int id=0; id<128;id++) { 172 for (int id=0; id<TOTAL_IDS_TO_SCAN;id++) { 173 if (id==64) continue; // metering 174 if (id==65) continue; // metering 175 if (id==66) continue; // metering 176 if (id==67) continue; // metering 172 177 cmd.setCommandType( AVC::AVCCommand::eCT_Status ); 173 178 cmd.setNodeId( arguments.node );