///////////////////////////////////////////////////////////////////// // Mouse Event overrides ///////////////////////////////////////////////////////////////////// void CFreqCtrl::mouseMoveEvent(QMouseEvent * event) { QPoint pt = event->pos(); //find which digit is to be edited if (isActiveWindow()) { if (!hasFocus()) setFocus(Qt::MouseFocusReason); for (int i = m_DigStart; i < m_NumDigits; i++) { if (inRect(m_DigitInfo[i].dQRect, pt)) { if (!m_DigitInfo[i].editmode) { m_DigitInfo[i].editmode = TRUE; m_ActiveEditDigit = i; } } else { //un-highlight the previous digit if moved off it if (m_DigitInfo[i].editmode) { m_DigitInfo[i].editmode = FALSE; m_DigitInfo[i].modified = TRUE; } } } updateCtrl(FALSE); } }
////////////////////////////////////////////////////////////////////////////// // Sets the Digit and comma and decimal pt color ////////////////////////////////////////////////////////////////////////////// void CFreqCtrl::setDigitColor(QColor cr) { m_UpdateAll = TRUE; m_DigitColor = cr; for(int i=m_DigStart; i<m_NumDigits; i++) m_DigitInfo[i].modified = TRUE; updateCtrl(TRUE); }
////////////////////////////////////////////////////////////////////////////// // Sets the frequency and individual digit values ////////////////////////////////////////////////////////////////////////////// void CFreqCtrl::setFrequency(qint64 freq) { int i; qint64 acc = 0; qint64 rem; int val; if (freq == m_Oldfreq) return; if (freq < m_MinFreq) freq = m_MinFreq; if (freq > m_MaxFreq) freq = m_MaxFreq; m_freq = freq - freq % m_MinStep; rem = m_freq; m_LeadZeroPos = m_NumDigits; for (i = m_NumDigits-1; i >= m_DigStart; i--) { val = (int)(rem / m_DigitInfo[i].weight); if (m_DigitInfo[i].val != val) { m_DigitInfo[i].val = val; m_DigitInfo[i].modified = TRUE; } rem = rem - val*m_DigitInfo[i].weight; acc += val; if ((acc == 0) && (i > m_DecPos)) { m_LeadZeroPos = i; } } // When frequency is negative all non-zero digits that // have changed will have a negative sign. This loop will // change all digits back to positive, except the one at // position m_leadZeroPos-1 /** TBC if this works for all configurations */ if (m_freq < 0) { if (m_DigitInfo[m_LeadZeroPos-1].val > 0) m_DigitInfo[m_LeadZeroPos-1].val = -m_DigitInfo[m_LeadZeroPos-1].val; for (i = 0; i < (m_LeadZeroPos-1); i++) { if (m_DigitInfo[i].val < 0) m_DigitInfo[i].val = -m_DigitInfo[i].val; } } // signal the new frequency to world m_Oldfreq = m_freq; emit newFrequency(m_freq); updateCtrl(m_LastLeadZeroPos != m_LeadZeroPos); m_LastLeadZeroPos = m_LeadZeroPos; }
////////////////////////////////////////////////////////////////////////////// // Sets the Background color ////////////////////////////////////////////////////////////////////////////// void CFreqCtrl::setBkColor(QColor cr) { m_UpdateAll = true; m_BkColor = cr; for (int i = m_DigStart; i < m_NumDigits; i++) m_DigitInfo[i].modified = true; updateCtrl(true); }
void CFreqCtrl::leaveEvent( QEvent * ) { //called when mouse cursor leaves this control so deactivate any highlights if(m_ActiveEditDigit>=0) { if( m_DigitInfo[m_ActiveEditDigit].editmode ) { m_DigitInfo[m_ActiveEditDigit].editmode = FALSE; m_DigitInfo[m_ActiveEditDigit].modified = TRUE; m_ActiveEditDigit = -1; updateCtrl(FALSE); } } }
////////////////////////////////////////////////////////////////////////////// // Sets the Digit units ////////////////////////////////////////////////////////////////////////////// void CFreqCtrl::setUnits(FUNITS units) { switch(units) { case UNITS_HZ: m_DecPos = 0; m_UnitString = "Hz "; break; case UNITS_KHZ: m_DecPos = 3; m_UnitString = "kHz"; break; case UNITS_MHZ: m_DecPos = 6; m_UnitString = "MHz"; break; case UNITS_GHZ: m_DecPos = 9; m_UnitString = "GHz"; break; case UNITS_SEC: m_DecPos = 6; m_UnitString = "Sec"; break; case UNITS_MSEC: m_DecPos = 3; m_UnitString = "mS "; break; case UNITS_USEC: m_DecPos = 0; m_UnitString = "uS "; break; case UNITS_NSEC: m_DecPos = 0; m_UnitString = "nS "; break; } m_UpdateAll = TRUE; updateCtrl(TRUE); }
void ApplicationWindow::ctrlAction(int id) { unsigned ctrl_class = V4L2_CTRL_ID2CLASS(id); if (ctrl_class == V4L2_CID_PRIVATE_BASE) ctrl_class = V4L2_CTRL_CLASS_USER; unsigned ctrl = id & 0xffff; QCheckBox *cbox = static_cast<QCheckBox *>(widgetMap[ctrl_class | CTRL_UPDATE_ON_CHANGE]); bool update = cbox->isChecked(); bool all = (ctrl == CTRL_UPDATE || (update && ctrl == CTRL_UPDATE_ON_CHANGE)); if (ctrl == CTRL_DEFAULTS) { setDefaults(ctrl_class); return; } if (ctrl == CTRL_REFRESH) { refresh(ctrl_class); return; } if (!update && !all && ctrlMap[id].type != V4L2_CTRL_TYPE_BUTTON) return; if (ctrl_class == V4L2_CTRL_CLASS_USER) { if (!all) { updateCtrl(id); return; } for (unsigned i = 0; i < classMap[ctrl_class].size(); i++) { updateCtrl(classMap[ctrl_class][i]); } return; } if (!all) { updateCtrl(id); return; } unsigned count = classMap[ctrl_class].size(); struct v4l2_ext_control *c = new v4l2_ext_control[count]; struct v4l2_ext_controls ctrls; int idx = 0; for (unsigned i = 0; i < count; i++) { unsigned id = classMap[ctrl_class][i]; if (ctrlMap[id].flags & (V4L2_CTRL_FLAG_READ_ONLY | V4L2_CTRL_FLAG_INACTIVE)) continue; c[idx].id = id; if (ctrlMap[id].type == V4L2_CTRL_TYPE_INTEGER64) c[idx].value64 = getVal64(id); else c[idx].value = getVal(id); idx++; } memset(&ctrls, 0, sizeof(ctrls)); ctrls.count = idx; ctrls.ctrl_class = ctrl_class; ctrls.controls = c; if (::ioctl(fd, VIDIOC_S_EXT_CTRLS, &ctrls)) { int err = errno; if (ctrls.error_idx >= ctrls.count) { printf("error: %s\n", strerror(err)); } else { id = c[ctrls.error_idx].id; printf("error %08x (%s): %s\n", id, ctrlMap[id].name, strerror(err)); } } delete [] c; refresh(ctrl_class); }
////////////////////////////////////////////////////////////////////////////// // Sets the Mouse edit selection text background color ////////////////////////////////////////////////////////////////////////////// void CFreqCtrl::setHighlightColor(QColor cr) { m_UpdateAll = TRUE; m_HighlightColor = cr; updateCtrl(TRUE); }
////////////////////////////////////////////////////////////////////////////// // Sets the Units text color ////////////////////////////////////////////////////////////////////////////// void CFreqCtrl::setUnitsColor(QColor cr) { m_UpdateAll = TRUE; m_UnitsColor = cr; updateCtrl(TRUE); }
////////////////////////////////////////////////////////////////////////////// // Sets the Mouse edit selection text background color ////////////////////////////////////////////////////////////////////////////// void CFreqCtrl::setHighlightColor(QColor cr) { m_UpdateAll = true; m_HighlightColor = cr; updateCtrl(true); }
////////////////////////////////////////////////////////////////////////////// // Sets the Units text color ////////////////////////////////////////////////////////////////////////////// void CFreqCtrl::setUnitsColor(QColor cr) { m_UpdateAll = true; m_UnitsColor = cr; updateCtrl(true); }
////////////////////////////////////////////////////////////////////////////// // Sets the frequency and individual digit values ////////////////////////////////////////////////////////////////////////////// void CFreqCtrl::setFrequency(qint64 freq) { int i; qint64 acc = 0; qint64 rem; int val; if (freq == m_Oldfreq) return; if (freq < m_MinFreq) freq = m_MinFreq; if (freq > m_MaxFreq) freq = m_MaxFreq; m_freq = freq - freq % m_MinStep; rem = m_freq; m_LeadZeroPos = m_NumDigits; for (i = m_NumDigits-1; i >= m_DigStart; i--) { val = (int)(rem / m_DigitInfo[i].weight); if (m_DigitInfo[i].val != val) { m_DigitInfo[i].val = val; m_DigitInfo[i].modified = true; } rem = rem - val*m_DigitInfo[i].weight; acc += val; if ((acc == 0) && (i > m_DecPos)) { m_LeadZeroPos = i; } } // If the sign changed and the frequency is less than 1 unit, // redraw the leading zero to get the correct sign. if ((m_Oldfreq ^ m_freq) < 0 && m_DigitInfo[m_LeadZeroPos - 1].val == 0) m_DigitInfo[m_LeadZeroPos - 1].modified = true; // When frequency is negative all non-zero digits that // have changed will have a negative sign. This loop will // change all digits back to positive, except the one at // position m_leadZeroPos-1. If that position is zero, // it will be checked in the drawing method, drawDigits(). /** TBC if this works for all configurations */ if (m_freq < 0) { if (m_DigitInfo[m_LeadZeroPos-1].val > 0) m_DigitInfo[m_LeadZeroPos-1].val = -m_DigitInfo[m_LeadZeroPos-1].val; for (i = 0; i < (m_LeadZeroPos-1); i++) { if (m_DigitInfo[i].val < 0) m_DigitInfo[i].val = -m_DigitInfo[i].val; } } // signal the new frequency to world m_Oldfreq = m_freq; emit newFrequency(m_freq); updateCtrl(m_LastLeadZeroPos != m_LeadZeroPos); m_LastLeadZeroPos = m_LeadZeroPos; }
void ApplicationWindow::ctrlAction(int id) { unsigned ctrl_class = V4L2_CTRL_ID2CLASS(id); if (ctrl_class == V4L2_CID_PRIVATE_BASE) ctrl_class = V4L2_CTRL_CLASS_USER; unsigned ctrl = id & 0xffff; QCheckBox *cbox = static_cast<QCheckBox *>(m_widgetMap[ctrl_class | CTRL_UPDATE_ON_CHANGE]); bool update = cbox->isChecked(); bool all = (ctrl == CTRL_UPDATE || (update && ctrl == CTRL_UPDATE_ON_CHANGE)); if (ctrl == CTRL_DEFAULTS) { setDefaults(ctrl_class); return; } if (ctrl == CTRL_REFRESH) { refresh(ctrl_class); return; } if (m_ctrlMap[id].type == V4L2_CTRL_TYPE_INTEGER && (m_ctrlMap[id].flags & V4L2_CTRL_FLAG_SLIDER)) { QWidget *w = m_widgetMap[id]; int v = static_cast<QSlider *>(w)->value(); info(QString("Value: %1").arg(v)); } if (!update && !all && m_ctrlMap[id].type != V4L2_CTRL_TYPE_BUTTON) return; if (!m_haveExtendedUserCtrls && ctrl_class == V4L2_CTRL_CLASS_USER) { if (!all) { updateCtrl(id); return; } for (unsigned i = 0; i < m_classMap[ctrl_class].size(); i++) { updateCtrl(m_classMap[ctrl_class][i]); } return; } if (!all) { updateCtrl(id); return; } unsigned count = m_classMap[ctrl_class].size(); struct v4l2_ext_control *c = new v4l2_ext_control[count]; struct v4l2_ext_controls ctrls; int idx = 0; for (unsigned i = 0; i < count; i++) { unsigned id = m_classMap[ctrl_class][i]; if (m_ctrlMap[id].flags & CTRL_FLAG_DISABLED) continue; c[idx].id = id; c[idx].size = 0; if (m_ctrlMap[id].type == V4L2_CTRL_TYPE_INTEGER64) c[idx].value64 = getVal64(id); else if (m_ctrlMap[id].type == V4L2_CTRL_TYPE_STRING) { c[idx].size = m_ctrlMap[id].maximum + 1; c[idx].string = (char *)malloc(c[idx].size); strcpy(c[idx].string, getString(id).toLatin1()); } else c[idx].value = getVal(id); idx++; } memset(&ctrls, 0, sizeof(ctrls)); ctrls.count = idx; ctrls.ctrl_class = ctrl_class; ctrls.controls = c; if (ioctl(VIDIOC_S_EXT_CTRLS, &ctrls)) { if (ctrls.error_idx >= ctrls.count) { error(errno); } else { errorCtrl(c[ctrls.error_idx].id, errno); } } for (unsigned i = 0; i < ctrls.count; i++) { if (c[i].size) free(c[i].string); } delete [] c; refresh(ctrl_class); }