Fixed char array undefined symbol bug

This commit is contained in:
2025-05-15 11:25:56 +02:00
parent b267200039
commit 3c345e37da

View File

@ -8,6 +8,17 @@
#include <math.h> #include <math.h>
#include <unistd.h> #include <unistd.h>
// Generic fallback - if the compiler tries to compile this function, it fails.
template <typename T>
asynStatus setAxisParam(sinqAxis *axis, const char *indexName,
int (sinqController::*func)(), T writeValue,
const char *callerFunctionName, int lineNumber) {
static_assert(
sizeof(T) == 0,
"no specialization of setAxisParam exists for the given type");
return asynError;
}
template <> template <>
asynStatus setAxisParam<int>(sinqAxis *axis, const char *indexName, asynStatus setAxisParam<int>(sinqAxis *axis, const char *indexName,
int (sinqController::*func)(), int writeValue, int (sinqController::*func)(), int writeValue,
@ -43,6 +54,20 @@ setAxisParam<double>(sinqAxis *axis, const char *indexName,
return asynSuccess; return asynSuccess;
} }
template <>
asynStatus setAxisParam<char *>(sinqAxis *axis, const char *indexName,
int (sinqController::*func)(), char *writeValue,
const char *callerFunctionName,
int lineNumber) {
int indexValue = (axis->pController()->*func)();
asynStatus status = axis->setStringParam(indexValue, writeValue);
if (status != asynSuccess) {
return axis->pController()->paramLibAccessFailed(
status, indexName, axis->axisNo(), callerFunctionName, lineNumber);
}
return asynSuccess;
}
template <> template <>
asynStatus setAxisParam<const char *>(sinqAxis *axis, const char *indexName, asynStatus setAxisParam<const char *>(sinqAxis *axis, const char *indexName,
int (sinqController::*func)(), int (sinqController::*func)(),
@ -58,6 +83,17 @@ asynStatus setAxisParam<const char *>(sinqAxis *axis, const char *indexName,
return asynSuccess; return asynSuccess;
} }
// Generic fallback - if the compiler tries to compile this function, it fails.
template <typename T>
asynStatus getAxisParam(sinqAxis *axis, const char *indexName,
int (sinqController::*func)(), T *readValue,
const char *callerFunctionName, int lineNumber) {
static_assert(
sizeof(T) == 0,
"no specialization of getAxisParam exists for the given type");
return asynError;
}
template <> template <>
asynStatus getAxisParam<int>(sinqAxis *axis, const char *indexName, asynStatus getAxisParam<int>(sinqAxis *axis, const char *indexName,
int (sinqController::*func)(), int *readValue, int (sinqController::*func)(), int *readValue,
@ -112,6 +148,16 @@ asynStatus getAxisParam<char>(sinqAxis *axis, const char *indexName,
return asynSuccess; return asynSuccess;
} }
template <size_t N>
asynStatus getAxisParam(sinqAxis *axis, const char *indexName,
int (sinqController::*func)(), char (&readValue)[N],
const char *callerFunctionName, int lineNumber) {
// Decay the array to char*
return getAxisParam<char>(axis, indexName, func,
static_cast<char *>(readValue),
callerFunctionName, lineNumber);
}
template <> template <>
asynStatus asynStatus
getAxisParam<std::string>(sinqAxis *axis, const char *indexName, getAxisParam<std::string>(sinqAxis *axis, const char *indexName,
@ -309,7 +355,8 @@ asynStatus sinqAxis::poll(bool *moving) {
"waitingMessage" is briefly put into the paramLib again, then the PVs are "waitingMessage" is briefly put into the paramLib again, then the PVs are
updated and then the message text is cleared again. updated and then the message text is cleared again.
*/ */
getAxisParamChecked(this, motorMessageText, &waitingMessage); getAxisParamChecked(this, motorMessageText,
static_cast<char *>(waitingMessage));
// Clear the communication // Clear the communication
setAxisParamChecked(this, motorStatusCommsError, false); setAxisParamChecked(this, motorStatusCommsError, false);
@ -331,9 +378,11 @@ asynStatus sinqAxis::poll(bool *moving) {
If doPoll cleared the error message paramLib entry, but an old message If doPoll cleared the error message paramLib entry, but an old message
is still waiting, set the old message. is still waiting, set the old message.
*/ */
getAxisParamChecked(this, motorMessageText, &newMessage); getAxisParamChecked(this, motorMessageText,
static_cast<char *>(newMessage));
if (newMessage[0] == '\0') { if (newMessage[0] == '\0') {
setAxisParamChecked(this, motorMessageText, waitingMessage); setAxisParamChecked(this, motorMessageText,
static_cast<char *>(waitingMessage));
} }
setAxisParamChecked(this, motorStatusProblem, true); setAxisParamChecked(this, motorStatusProblem, true);
} else { } else {