2 Copyright (C) 2012 Intel Corporation
3 Copyright (C) 2015 Cogent Embedded Inc.
4 Copyright (C) 2015 Renesas Electronics Corporation
6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with this library; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 #include "cansocket.h"
23 #include "cansocketreader.h"
25 CANSocketReader::CANSocketReader(CANObserver& observer, CANSocket& socket) :
32 CANSocketReader::~CANSocketReader()
39 bool CANSocketReader::start()
43 bool res = CUtil::Thread::start();
45 // try to set higher priority
46 if (res) res = setPriority(4);
50 void CANSocketReader::stop()
54 CUtil::Thread::stop();
58 void CANSocketReader::run()
65 CANSocket::CANSocketReadSuccess success = mSocket.read(message);
69 case CANSocket::READING_SUCCEEDED:
70 dispatchMessage(message);
73 case CANSocket::READING_TIMED_OUT:
77 case CANSocket::READING_FAILED:
79 LOG_ERROR("reading failed");
80 mObserver.errorOccured(CANObserver::GENERAL_ERROR);
86 void CANSocketReader::dispatchMessage(const CANFrameInfo &message)
88 struct can_frame frame = message.frame;
90 switch (message.status)
92 case CANFrameInfo::CANMessageStatus::GOOD:
93 if(frame.can_id & CAN_ERR_FLAG) {
94 frame.can_id &= (CAN_ERR_FLAG|CAN_ERR_MASK);
95 mObserver.errorFrameReceived(frame);
97 else if( frame.can_id & CAN_RTR_FLAG){
98 if(!( frame.can_id & CAN_EFF_FLAG)){
99 frame.can_id &= CAN_SFF_MASK;
102 frame.can_id &= (~CAN_RTR_FLAG);
104 mObserver.remoteTransmissionRequest(frame);
106 else if(frame.can_id & CAN_EFF_FLAG){
107 frame.can_id &= CAN_EFF_MASK;
108 mObserver.extendedFrameReceived(frame);
111 frame.can_id &= CAN_SFF_MASK;
112 mObserver.standardFrameReceived(frame);
116 case CANFrameInfo::CANMessageStatus::TIMEOUT:
117 if(frame.can_id & CAN_EFF_FLAG)
118 frame.can_id &= CAN_EFF_MASK;
120 frame.can_id &= CAN_SFF_MASK;
122 mObserver.timeoutDetected(frame);
126 LOG_ERROR("Unexpected CAN message status " << message.status);
127 mObserver.errorOccured(CANObserver::GENERAL_ERROR);