Files
ecmc_plugin_socketcan/src/ecmcCANOpenPDO.h
2024-12-16 09:24:16 +01:00

79 lines
2.0 KiB
C++

/*************************************************************************\
* Copyright (c) 2019 European Spallation Source ERIC
* ecmc is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*
* ecmcCANOpenPDO.h
*
* Created on: Mar 22, 2020
* Author: anderssandstrom
*
\*************************************************************************/
#ifndef ECMC_CANOPEN_PDO_H_
#define ECMC_CANOPEN_PDO_H_
#include <stdexcept>
#include "ecmcDataItem.h"
#include "ecmcAsynPortDriver.h"
#include "ecmcSocketCANDefs.h"
#include "ecmcCANOpenPDO.h"
#include "inttypes.h"
#include <string>
#include "ecmcSocketCANWriteBuffer.h"
#include "epicsMutex.h"
#include <linux/can.h>
#include <linux/can/raw.h>
#define ECMC_CAN_ERROR_PDO_TIMEOUT 100
class ecmcCANOpenPDO {
public:
ecmcCANOpenPDO(ecmcSocketCANWriteBuffer* writeBuffer,
uint32_t nodeId,
uint32_t cobId,
ecmc_can_direction rw,
uint32_t ODSize,
int readTimeoutMs,
int writeCycleMs, //if <0 the write on demand..
int exeSampleTimeMs,
const char *name,
int dbgMode);
~ecmcCANOpenPDO();
void execute();
void newRxFrame(can_frame *frame);
void setValue(uint64_t data);
int writeValue();
private:
int validateFrame(can_frame *frame);
ecmcSocketCANWriteBuffer *writeBuffer_;
uint32_t cobId_; // with cobid
uint32_t nodeId_;
int readTimeoutMs_;
int writeCycleMs_;
int exeSampleTimeMs_;
ecmc_can_direction rw_;
uint32_t ODSize_;
int exeCounter_;
int busy_;
uint8_t *dataBuffer_;
int errorCode_;
void printBuffer();
int dbgMode_;
can_frame writeFrame_;
epicsMutexId dataMutex_;
char* name_;
static std::string to_string(int value);
//ASYN
void initAsyn();
void refreshAsynParams();
int refreshNeeded_;
ecmcAsynDataItem *dataParam_;
ecmcAsynDataItem *errorParam_;
};
#endif /* ECMC_CANOPEN_PDO_H_ */