Skip to content

Commit

Permalink
added calMutex; statsBox is updated at correct point in resize
Browse files Browse the repository at this point in the history
  • Loading branch information
jaredmales committed Nov 13, 2023
1 parent de3b24a commit d38ac1d
Show file tree
Hide file tree
Showing 6 changed files with 183 additions and 158 deletions.
26 changes: 17 additions & 9 deletions src/images/fitsImage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,18 +86,26 @@ void fitsImage::imageTimerout()

int fitsImage::readImage()
{
///The cfitsio data structure
fitsfile * fptr {nullptr};
///The cfitsio data structure
fitsfile * fptr {nullptr};

int fstatus = 0;
int fstatus = 0;

fits_open_file(&fptr, m_imagePath.c_str(), READONLY, &fstatus);
fits_open_file(&fptr, m_imagePath.c_str(), READONLY, &fstatus);

if (fstatus)
{
if(!m_reported) std::cerr << "rtimv: " << m_imagePath << " not found.\n";
m_reported = true;
return -1;
if (fstatus)
{
//we try again 100 ms later in case this was a rewrite of the existing file
mx::sys::milliSleep(100);
fstatus = 0;
fits_open_file(&fptr, m_imagePath.c_str(), READONLY, &fstatus);

if(fstatus)
{
if(!m_reported) std::cerr << "rtimv: " << m_imagePath << " not found.\n";
m_reported = true;
return -1;
}
}
m_reported = false;

Expand Down
5 changes: 3 additions & 2 deletions src/rtimvBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -715,13 +715,14 @@ void rtimvBase::changeImdata(bool newdata)
//Here we realize we need to resize
if(m_images[0]->nx() != m_nx || m_images[0]->ny() != m_ny || !m_qim)
{
//Need to lock a mutex here
std::unique_lock<std::mutex> lock(m_calMutex);
setImsize(m_images[0]->nx(), m_images[0]->ny());

resized = true;
}

if(resized || newdata) //need to copy new data to m_calData
//If it's new data we copy it to m_calData
if(resized || newdata)
{
std::unique_lock<std::mutex> lock(m_rawMutex);

Expand Down
9 changes: 8 additions & 1 deletion src/rtimvBase.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -197,9 +197,16 @@ protected slots:
float * m_calData {nullptr};
uint8_t * m_satData {nullptr};

///Mutex for locking access to memory
///Mutex for locking access to raw pixels
/** This is used by rtimvImage derived classes to protect
* deletion and recreation of the m_data array they manage.
*
*/
std::mutex m_rawMutex;

///Mutex for locking access to calibrated pixels
std::mutex m_calMutex;

///@}

/** \name Calibrated Pixel Access
Expand Down
185 changes: 95 additions & 90 deletions src/rtimvMainWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -389,6 +389,12 @@ void rtimvMainWindow::postChangeImdata()

//So we need to initialize the viewport center, etc.
center();

//and update stats box
if(m_statsBox)
{
statsBoxMoved(m_statsBox);
}
}
else
{
Expand Down Expand Up @@ -691,72 +697,80 @@ void rtimvMainWindow::updateMouseCoords()

if( mx < 0 || mx > m_qpmi->boundingRect().width() || my < 0 || my > m_qpmi->boundingRect().height() )
{
nullMouseCoords();
nullMouseCoords();
}

if(m_userItemSelected)
{
nullMouseCoords();
userItemMouseCoords(m_userItemMouseViewX, m_userItemMouseViewY);
nullMouseCoords();
userItemMouseCoords(m_userItemMouseViewX, m_userItemMouseViewY);
}

if(!m_nullMouseCoords)
{
idx_x = ((int64_t)(mx-0));
if(idx_x < 0) idx_x = 0;
if(idx_x > (int64_t) m_nx-1) idx_x = m_nx-1;


idx_y = (int)(m_qpmi->boundingRect().height() - (my-0));
if(idx_y < 0) idx_y = 0;
if(idx_y > (int64_t) m_ny-1) idx_y = m_ny-1;
idx_x = ((int64_t)(mx-0));
if(idx_x < 0) idx_x = 0;
if(idx_x > (int64_t) m_nx-1) idx_x = m_nx-1;

idx_y = (int)(m_qpmi->boundingRect().height() - (my-0));
if(idx_y < 0) idx_y = 0;
if(idx_y > (int64_t) m_ny-1) idx_y = m_ny-1;

float val;
//mutex scope
{
std::unique_lock<std::mutex> lock(m_calMutex, std::try_to_lock);
if(!lock.owns_lock())
{
return;
}
val = calPixel(idx_x, idx_y);
}

float val = calPixel(idx_x, idx_y);

if(m_showStaticCoords)
{
ui.graphicsView->textCoordX(mx-0.5);
ui.graphicsView->textCoordY(m_qpmi->boundingRect().height() - my-0.5);
ui.graphicsView->textPixelVal( val );
}
if(m_showStaticCoords)
{
ui.graphicsView->textCoordX(mx-0.5);
ui.graphicsView->textCoordY(m_qpmi->boundingRect().height() - my-0.5);
ui.graphicsView->textPixelVal( val );
}

if(m_showToolTipCoords)
{
char valStr[32];
char posStr[32];

if(m_showToolTipCoords)
{
char valStr[32];
char posStr[32];

if(fabs(val) < 1e-1)
{
snprintf(valStr, sizeof(valStr), "%0.04g", val);
}
else
{
snprintf(valStr, sizeof(valStr), "%0.02f", val);
}
snprintf(posStr, sizeof(posStr), "%0.2f %0.2f", mx-0.5, m_qpmi->boundingRect().height() - my-0.5 );
ui.graphicsView->showMouseToolTip(valStr, posStr, QPoint(ui.graphicsView->mouseViewX(),ui.graphicsView->mouseViewY()));
fontLuminance(ui.graphicsView->m_mouseCoords);
}

if(imcp)
{
imcp->updateMouseCoords(mx, my, val );
}
if(fabs(val) < 1e-1)
{
snprintf(valStr, sizeof(valStr), "%0.04g", val);
}
else
{
snprintf(valStr, sizeof(valStr), "%0.02f", val);
}
snprintf(posStr, sizeof(posStr), "%0.2f %0.2f", mx-0.5, m_qpmi->boundingRect().height() - my-0.5 );
ui.graphicsView->showMouseToolTip(valStr, posStr, QPoint(ui.graphicsView->mouseViewX(),ui.graphicsView->mouseViewY()));
fontLuminance(ui.graphicsView->m_mouseCoords);
}

if(imcp)
{
imcp->updateMouseCoords(mx, my, val );
}

}
}

//Adjust bias and contrast
if(rightClickDragging)
{
float dx = ui.graphicsView->mouseViewX() - rightClickStart.x();
float dy = ui.graphicsView->mouseViewY() - rightClickStart.y();

float dbias = dx/ui.graphicsView->viewport()->width();
float dcontrast = -1.*dy/ui.graphicsView->viewport()->height();

bias(biasStart + dbias*.5*(imdat_max+imdat_min));
contrast(contrastStart + dcontrast*(imdat_max-imdat_min));
if(!m_amChangingimdata) changeImdata();
float dx = ui.graphicsView->mouseViewX() - rightClickStart.x();
float dy = ui.graphicsView->mouseViewY() - rightClickStart.y();
float dbias = dx/ui.graphicsView->viewport()->width();
float dcontrast = -1.*dy/ui.graphicsView->viewport()->height();
bias(biasStart + dbias*.5*(imdat_max+imdat_min));
contrast(contrastStart + dcontrast*(imdat_max-imdat_min));
if(!m_amChangingimdata) changeImdata();
}

} //rtimvMainWindow::updateMouseCoords
Expand Down Expand Up @@ -966,35 +980,26 @@ void rtimvMainWindow::userItemMouseCoords( float mx,
float my
)
{
if(m_qpmi == nullptr) return;
if(m_qpmi == nullptr) return;

int idx_x = ((int64_t)(mx-0));
if(idx_x < 0) idx_x = 0;
if(idx_x > (int64_t) m_nx-1) idx_x = m_nx-1;
int idx_x = ((int64_t)(mx-0));
if(idx_x < 0) idx_x = 0;
if(idx_x > (int64_t) m_nx-1) idx_x = m_nx-1;

int idx_y = (int)(m_qpmi->boundingRect().height() - (my-0));
if(idx_y < 0) idx_y = 0;
if(idx_y > (int64_t) m_ny-1) idx_y = m_ny-1;
int idx_y = (int)(m_qpmi->boundingRect().height() - (my-0));
if(idx_y < 0) idx_y = 0;
if(idx_y > (int64_t) m_ny-1) idx_y = m_ny-1;

/*pixelF _pixel = pixel();
float val = 0;
//Mutex scope
{
std::unique_lock<std::mutex> lock(m_accessMutex, std::try_to_lock);
if(lock.owns_lock())
{
_pixel = pixel();
if(_pixel != nullptr) val = _pixel(this, (int)(idx_y*m_nx) + (int)(idx_x));
}
}
//Here either _pixel is not null, and val is a good value
// or _pixel is null and we should ignore val
if(_pixel == nullptr) return;
*/

float val = calPixel(idx_x, idx_y);
float val;
//mutex scope
{
std::unique_lock<std::mutex> lock(m_calMutex, std::try_to_lock);
if(!lock.owns_lock())
{
return;
}
val = calPixel(idx_x, idx_y);
}

char valStr[32];
char posStr[32];
Expand Down Expand Up @@ -1283,7 +1288,7 @@ void rtimvMainWindow::doLaunchStatsBox()

if(!imStats)
{
imStats = new rtimvStats(this, this, Qt::WindowFlags());
imStats = new rtimvStats(this, &m_calMutex, this, Qt::WindowFlags());
imStats->setAttribute(Qt::WA_DeleteOnClose); //Qt will delete imstats when it closes.
connect(imStats, SIGNAL(finished(int )), this, SLOT(imStatsClosed(int )));
}
Expand Down Expand Up @@ -1327,18 +1332,19 @@ void rtimvMainWindow::imStatsClosed(int result)

void rtimvMainWindow::statsBoxMoved(StretchBox * sb)
{
static_cast<void>(sb);
static_cast<void>(sb);

if(!m_statsBox) return;
if(!m_qpmi) return;
if(!m_statsBox) return;

QPointF np = m_qpmi->mapFromItem(m_statsBox, QPointF(m_statsBox->rect().x(),m_statsBox->rect().y()));
QPointF np2 = m_qpmi->mapFromItem(m_statsBox, QPointF(m_statsBox->rect().x()+m_statsBox->rect().width(),m_statsBox->rect().y()+m_statsBox->rect().height()));
if(!m_qpmi) return;

if(imStats)
{
imStats->setImdata(m_nx, m_ny, np.x(), np2.x(), m_ny-np2.y(), m_ny-np.y());
}
QPointF np = m_qpmi->mapFromItem(m_statsBox, QPointF(m_statsBox->rect().x(),m_statsBox->rect().y()));
QPointF np2 = m_qpmi->mapFromItem(m_statsBox, QPointF(m_statsBox->rect().x()+m_statsBox->rect().width(),m_statsBox->rect().y()+m_statsBox->rect().height()));

if(imStats)
{
imStats->setImdata(m_nx, m_ny, np.x(), np2.x(), m_ny-np2.y(), m_ny-np.y());
}
}


Expand Down Expand Up @@ -1796,9 +1802,8 @@ void rtimvMainWindow::keyPressEvent(QKeyEvent * ke)
break;
case Qt::Key_BracketRight:
return squareUp();
case Qt::Key_Up:
std::cerr << "up arrow\n";
return;
/*case Qt::Key_Up:
return;*/
default:
break;
}
Expand Down
Loading

0 comments on commit d38ac1d

Please sign in to comment.