API Quality Check Rules
Apply these 7 validation categories when reviewing or generating API classes for Scopy plugins.
CRITICAL
[A1] Inheritance & Structure
- Class inherits from
ApiObject Q_OBJECTmacro is present in the class body- Export macro (
SCOPY_<PLUGIN>_EXPORT) is on the class declaration - Constructor takes
<Plugin>Plugin *as its sole argument
[A2] Plugin Integration
friend class <Plugin>_APIis declared in the plugin headerm_apiis declared as<Plugin>_API *m_api = nullptr;in the plugin headerinitApi()is declared in the plugin headerinitApi()is the last call inonConnect()beforereturn truedelete m_api; m_api = nullptr;is the first statement inonDisconnect()ScopyJS::GetInstance()->registerApi(m_api)is called insideinitApi()m_api->setObjectName("<name>")uses a lowercase, short name consistent with similar plugins- The
.cppfile ends with#include "moc_<plugin>_api.cpp"
[A3] Null Safety
- Every
Q_INVOKABLEmethod null-checks plugin/instrument members before accessing them readFromWidget()/writeToWidget()null-checkm_widgetGroupbefore use
[A5] Conversion Correctness
Cross-reference the tool's IIOWidget lambdas to verify:
- Hz attributes: getter divides raw value ÷1e6; setter multiplies by ×1e6
- Suffix attributes (e.g.
" dB"): getter strips the suffix before returning - dBFS↔linear: getter applies
20*log10(1/linear)rounded to int; setter appliespow(10, -val/20) - Combo attributes: setter validates the input against a static
QStringListbefore callingwriteToWidget
WARNING
[A4] API Coverage
getTools()method is present- Every writable IIOWidget has a getter and a setter; every read-only widget has only a getter
- Generic
readWidget()/writeWidget()helpers are present
[A6] Private Helper Pattern
readFromWidget(const QString &key)andwriteToWidget(const QString &key, const QString &value)are declared as private helpers- Both helpers null-check
m_plugin->m_widgetGroupbefore accessing it
INFO
[A7] Naming & Types
- Getters return
QString; setter parameters useconst QString & - No public getters were added to instrument classes just for API access — use
friend classinstead - Naming follows the convention:
get<Attribute>()/set<Attribute>()