//------------------------------------------------------------------------- bool DcBootControl::activateBank( int bankNumber ) { bool rtval = false; // Parameter Checking if(bankNumber != 0 && bankNumber != 1) { DCLOG() << "Invalid bank number specified"; return false; } // Verify system state if(!isBootcode()) { DCLOG() << "not in boot code, can't activate a bank"; return false; } // Do it if(0 == bankNumber) { QRtAutoTrigger mtrigger(DCBC_ACTIVATE_BANK0_SUCCESS,_pMidiIn); _pMidiOut->dataOut(DCBC_ACTIVATE_BANK0); if(mtrigger.wait(1000)) { mtrigger.setPattern(DCBC_DEACTIVATE_BANK1_SUCCESS); _pMidiOut->dataOut(DCBC_DEACTIVATE_BANK1); if(mtrigger.wait(1000)) { rtval = true; } } } else { QRtAutoTrigger mtrigger(DCBC_ACTIVATE_BANK1_SUCCESS,_pMidiIn); _pMidiOut->dataOut(DCBC_ACTIVATE_BANK1); if(mtrigger.wait(1000)) { mtrigger.setPattern(DCBC_DEACTIVATE_BANK0_SUCCESS); _pMidiOut->dataOut(DCBC_DEACTIVATE_BANK0); if(mtrigger.wait(1000)) { rtval = true; } } } return rtval; }
//------------------------------------------------------------------------- bool DcBootControl::getBootCodeInfo(DcBootCodeInfo& bcInfo) { DcCodeBankInfo codeInfo; if(!isBootcode()) { return false; } else { QRtMidiDevIdent id; if(identify(&id)) { bcInfo.setVersion(id.FwVersion); } QRtAutoTrigger autotc(RESPONCE_BANK_INFO_ANY,_pMidiIn); _pMidiOut->dataOut(CMD_GET_BANK0_INFO); if(!autotc.wait(500)) { codeInfo.clear(); } else { QRtMidiData md; autotc.dequeue(md); codeInfo.init(md); } bcInfo.setBank(0,codeInfo); _pMidiOut->dataOut(CMD_GET_BANK1_INFO); if(!autotc.wait(500)) { codeInfo.clear(); } else { QRtMidiData md; autotc.dequeue(md); codeInfo.init(md); } bcInfo.setBank(1,codeInfo); } return bcInfo.isOk(); }
//------------------------------------------------------------------------- bool DcBootControl::enableBootcode( ) { QRtMidiData md; QRtMidiData responceData; // The device is in boot mode if it responses to the Echo command. if(isBootcode()) { return true; } QRtMidiData priRst = makePrivateResetCmd(); if(0 == priRst.length()) return false; QRtMidiTrigger tc(RESPONCE_ENABLE_RECOVERY_ANY); QRtAutoTrigger autoch(&tc,_pMidiIn); // Issue a private reset _pMidiOut->dataOut(priRst); QThread::msleep(100); // Issue "enable recovery" no more than 300ms after reset to keep the device in boot code. for (int idx = 0; idx < 40 ; idx++) { _pMidiOut->dataOut(CMD_ENABLE_RECOVERY); QThread::msleep(20); if(tc.dequeue(responceData)) { break; } } bool rtval = false; if(responceData.match(RESPONCE_ENABLE_RECOVERY_ACK)) { // Verify device is in boot code if(!isBootcode()) { DCLOG() << "Failed to verify device is in boot code"; } else { DCLOG() << "Device is running boot code"; rtval = true; } } else if(responceData.match(RESPONCE_ENABLE_RECOVERY_REJECTED)) { DCLOG() << "The device has rejected the enable recovery command"; } else if(responceData.match(RESPONCE_ENABLE_RECOVERY_FAILED)) { DCLOG() << "Device has failed the enabled recovery command"; } else { DCLOG() << "Timeout entering boot code"; } return rtval; }
bool DcBootControl::enableBootcode( ) { DcMidiData md; DcMidiData responceData; // The device is in boot mode if it responses to the Echo command. if(isBootcode()) { return true; } DcMidiData priRst = makePrivateResetCmd(); if(0 == priRst.length()) { return false; } DcMidiTrigger tc( _blindMode ? "F0 00 01 55" : RESPONCE_ENABLE_RECOVERY_ANY ); DcAutoTrigger autoch(&tc,_pMidiIn); if( _blindMode ) { DCLOG() << "Attempting to enable boot code in blind mode"; } // Issue a private reset _pMidiOut->dataOut(priRst); QThread::msleep(100); // Issue "enable recovery" no more than 300ms after reset to keep the device in boot code. for (int idx = 0; idx < 40 ; idx++) { _pMidiOut->dataOut(CMD_ENABLE_RECOVERY); QThread::msleep(20); if(tc.dequeue(responceData)) { break; } } bool rtval = false; if(_blindMode ) { DCLOG() << "Device is running 'blind mode' boot code"; rtval = true; } else { if( responceData.match( RESPONCE_ENABLE_RECOVERY_ACK ) ) { // Verify device is in boot code if( !isBootcode() ) { DCLOG() << "Failed to verify device is in boot code"; // Just send a reset in case status was lost _pMidiOut->dataOut( "F0 00 01 55 42 01 F7" ); } else { DCLOG() << "Device is running boot code"; rtval = true; } } else if( responceData.match( RESPONCE_ENABLE_RECOVERY_REJECTED ) ) { DCLOG() << "The device has rejected the enable recovery command"; } else if( responceData.match( RESPONCE_ENABLE_RECOVERY_FAILED ) ) { DCLOG() << "Device has failed the enabled recovery command"; } else { // Never saw the requested responce from the device // Who knows what's going on now - incase the device is in boot-mode // Send a reset command. _pMidiOut->dataOut( "F0 00 01 55 42 01 F7" ); DCLOG() << "Timeout entering boot code"; } } return rtval; }