bool BlinkyTapeUploader::upgradeFirmware(int timeout) { QByteArray sketch = QByteArray(reinterpret_cast<const char*>(PRODUCTION_DATA),PRODUCTION_LENGTH); bootloaderPollTimeout = timeout; char buff[BUFF_LENGTH]; snprintf(buff, BUFF_LENGTH, "Sketch size: %iB", sketch.length()), qDebug() << buff; // The entire sketch must fit into the available memory, minus a single page // at the end of flash for the configuration header // TODO: Could save ~100 bytes if we let the sketch spill into the unused portion // of the header. if(sketch.length() > FLASH_MEMORY_AVAILABLE) { qDebug() << "sketch can't fit into memory!"; errorString = QString("Sorry! The Pattern is a bit too big to fit in BlinkyTape memory right now. We're working on improving this! Avaiable space=%1, Pattern size=%2") .arg(FLASH_MEMORY_AVAILABLE) .arg(sketch.length()); return false; } // Put the sketch, pattern, and metadata into the programming queue. flashData.push_back(FlashSection(PRODUCTION_ADDRESS, sketch)); setProgress(0); // TODO: Calculate this based on feedback from the programmer. setMaxProgress(300); stateStartTime = QDateTime::currentDateTime(); state = State_WaitForBootloaderPort; bootloaderResetTimer->singleShot(0,this,SLOT(doWork())); return true; }
bool BlinkyTapeUploader::startUpload(BlinkyController& tape) { setProgress(0); // TODO: Calculate this based on feedback from the programmer. setMaxProgress(300); bootloaderPollTimeout = BOOTLOADER_POLL_TIMEOUT; // Now, start the polling processes to detect a new bootloader // We can't reset if we weren't already connected... if(!tape.isConnected()) { errorString = "Not connected to a tape, cannot upload again"; return false; } // Next, tell the tape to reset. tape.reset(); stateStartTime = QDateTime::currentDateTime(); state = State_WaitForBootloaderPort; bootloaderResetTimer->singleShot(0,this,SLOT(doWork())); return true; }
void PlanTJScheduler::run() { if ( m_haltScheduling ) { deleteLater(); return; } if ( m_stopScheduling ) { return; } setMaxProgress( PROGRESS_MAX_VALUE ); { // mutex --> m_projectMutex.lock(); m_managerMutex.lock(); m_project = new Project(); loadProject( m_project, m_pdoc ); m_project->setName( "Schedule: " + m_project->name() ); //Debug m_project->stopcalculation = false; m_manager = m_project->scheduleManager( m_mainmanagerId ); Q_CHECK_PTR( m_manager ); Q_ASSERT( m_manager->expected() ); Q_ASSERT( m_manager != m_mainmanager ); Q_ASSERT( m_manager->scheduleId() == m_mainmanager->scheduleId() ); Q_ASSERT( m_manager->expected() != m_mainmanager->expected() ); m_manager->setName( "Schedule: " + m_manager->name() ); //Debug m_schedule = m_manager->expected(); bool x = connect(m_manager, SIGNAL(sigLogAdded(Schedule::Log)), this, SLOT(slotAddLog(Schedule::Log))); Q_ASSERT( x ); Q_UNUSED( x ); m_project->initiateCalculation( *m_schedule ); m_project->initiateCalculationLists( *m_schedule ); m_usePert = m_manager->usePert(); m_recalculate = m_manager->recalculate(); if ( m_recalculate ) { m_backward = false; } else { m_backward = m_manager->schedulingDirection(); } m_project->setCurrentSchedule( m_manager->expected()->id() ); m_schedule->setPhaseName( 0, xi18nc( "@info/plain" , "Init" ) ); QLocale locale; KFormat format(locale); if ( ! m_backward ) { logDebug( m_project, 0, QString( "Schedule project using TJ Scheduler, starting at %1, granularity %2" ).arg( QDateTime::currentDateTime().toString() ).arg( format.formatDuration( m_granularity ) ), 0 ); if ( m_recalculate ) { logInfo( m_project, 0, xi18nc( "@info/plain" , "Re-calculate project from start time: %1", locale.toString(m_project->constraintStartTime(), QLocale::ShortFormat) ), 0 ); } else { logInfo( m_project, 0, xi18nc( "@info/plain" , "Schedule project from start time: %1", locale.toString(m_project->constraintStartTime(), QLocale::ShortFormat) ), 0 ); } logInfo( m_project, 0, xi18nc( "@info/plain" , "Project target finish time: %1", locale.toString(m_project->constraintEndTime(), QLocale::ShortFormat) ), 0 ); } else { logDebug( m_project, 0, QString( "Schedule project backward using TJ Scheduler, starting at %1, granularity %2" ).arg( locale.toString(QDateTime::currentDateTime(), QLocale::ShortFormat) ).arg( format.formatDuration( m_granularity ) ), 0 ); logInfo( m_project, 0, xi18nc( "@info/plain" , "Schedule project from end time: %1", locale.toString(m_project->constraintEndTime(), QLocale::ShortFormat) ), 0 ); } m_managerMutex.unlock(); m_projectMutex.unlock(); } // <--- mutex setProgress( 2 ); if ( ! kplatoToTJ() ) { result = 1; setProgress( PROGRESS_MAX_VALUE ); return; } setMaxProgress( PROGRESS_MAX_VALUE ); connect(m_tjProject, SIGNAL(updateProgressBar(int,int)), this, SLOT(setProgress(int))); m_schedule->setPhaseName( 1, xi18nc( "@info/plain" , "Schedule" ) ); logInfo( m_project, 0, "Start scheduling", 1 ); bool r = solve(); if ( ! r ) { debugPlan<<"Scheduling failed"; result = 2; logError( m_project, 0, xi18nc( "@info/plain" , "Failed to schedule project" ) ); setProgress( PROGRESS_MAX_VALUE ); return; } if ( m_haltScheduling ) { debugPlan<<"Scheduling halted"; logInfo( m_project, 0, "Scheduling halted" ); deleteLater(); return; } m_schedule->setPhaseName( 2, xi18nc( "@info/plain" , "Update" ) ); logInfo( m_project, 0, "Scheduling finished, update project", 2 ); if ( ! kplatoFromTJ() ) { logError( m_project, 0, "Project update failed" ); } setProgress( PROGRESS_MAX_VALUE ); m_schedule->setPhaseName( 3, xi18nc( "@info/plain" , "Finish" ) ); }