3 * This file is part of the libCEC(R) library.
5 * libCEC(R) is Copyright (C) 2011-2012 Pulse-Eight Limited. All rights reserved.
6 * libCEC(R) is an original work, containing original code.
8 * libCEC(R) is a trademark of Pulse-Eight Limited.
10 * This program is dual-licensed; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
25 * Alternatively, you can license this library under a commercial license,
26 * please contact Pulse-Eight Licensing for more information.
28 * For more information contact:
29 * Pulse-Eight Licensing <license@pulse-eight.com>
30 * http://www.pulse-eight.com/
31 * http://www.pulse-eight.net/
34 #include "lib/adapter/AdapterCommunication.h"
38 typedef enum cec_adapter_messagecode
42 MSGCODE_TIMEOUT_ERROR
,
47 MSGCODE_RECEIVE_FAILED
,
48 MSGCODE_COMMAND_ACCEPTED
,
49 MSGCODE_COMMAND_REJECTED
,
53 MSGCODE_TRANSMIT_IDLETIME
,
54 MSGCODE_TRANSMIT_ACK_POLARITY
,
55 MSGCODE_TRANSMIT_LINE_TIMEOUT
,
56 MSGCODE_TRANSMIT_SUCCEEDED
,
57 MSGCODE_TRANSMIT_FAILED_LINE
,
58 MSGCODE_TRANSMIT_FAILED_ACK
,
59 MSGCODE_TRANSMIT_FAILED_TIMEOUT_DATA
,
60 MSGCODE_TRANSMIT_FAILED_TIMEOUT_LINE
,
61 MSGCODE_FIRMWARE_VERSION
,
62 MSGCODE_START_BOOTLOADER
,
63 MSGCODE_GET_BUILDDATE
,
64 MSGCODE_SET_CONTROLLED
,
65 MSGCODE_GET_AUTO_ENABLED
,
66 MSGCODE_SET_AUTO_ENABLED
,
67 MSGCODE_GET_DEFAULT_LOGICAL_ADDRESS
,
68 MSGCODE_SET_DEFAULT_LOGICAL_ADDRESS
,
69 MSGCODE_GET_LOGICAL_ADDRESS_MASK
,
70 MSGCODE_SET_LOGICAL_ADDRESS_MASK
,
71 MSGCODE_GET_PHYSICAL_ADDRESS
,
72 MSGCODE_SET_PHYSICAL_ADDRESS
,
73 MSGCODE_GET_DEVICE_TYPE
,
74 MSGCODE_SET_DEVICE_TYPE
,
75 MSGCODE_GET_HDMI_VERSION
,
76 MSGCODE_SET_HDMI_VERSION
,
80 MSGCODE_GET_ADAPTER_TYPE
,
81 MSGCODE_FRAME_EOM
= 0x80,
82 MSGCODE_FRAME_ACK
= 0x40,
83 } cec_adapter_messagecode
;
85 typedef enum p8_cec_adapter_type
87 P8_ADAPTERTYPE_UNKNOWN
= 0,
88 P8_ADAPTERTYPE_EXTERNAL
,
89 P8_ADAPTERTYPE_DAUGHTERBOARD
,
90 } p8_cec_adapter_type
;
92 class CCECAdapterMessage
96 * @brief Create an empty message.
98 CCECAdapterMessage(void);
101 * @brief Create a message with a command that is to be transmitted over the CEC line.
102 * @param command The command to transmit.
103 * @param iLineTimeout The line timeout to use when sending this message.
105 CCECAdapterMessage(const cec_command
&command
, uint8_t iLineTimeout
= 3);
108 * @return the message as human readable string.
110 std::string
ToString(void) const;
113 * @brief Translate the messagecode into a human readable string.
114 * @param msgCode The messagecode to translate.
115 * @return The messagecode as string.
117 static const char *ToString(cec_adapter_messagecode msgCode
);
120 * @brief Get the byte at the given position.
121 * @param pos The position to get.
122 * @return The requested byte, or 0 when it's out of range.
124 uint8_t At(uint8_t pos
) const;
125 uint8_t operator[](uint8_t pos
) const;
128 * @return The size of the packet in bytes.
130 uint8_t Size(void) const;
133 * @return True when empty, false otherwise.
135 bool IsEmpty(void) const;
138 * @brief Clear this message and reset everything to the initial values.
143 * @brief Shift the message by the given number of bytes.
144 * @param iShiftBy The number of bytes to shift.
146 void Shift(uint8_t iShiftBy
);
149 * @brief Append the given message to this message.
150 * @param data The message to append.
152 void Append(CCECAdapterMessage
&data
);
155 * @brief Append the given datapacket to this message.
156 * @param data The packet to add.
158 void Append(cec_datapacket
&data
);
161 * @brief Adds a byte to this message. Does not escape the byte.
162 * @param byte The byte to add.
164 void PushBack(uint8_t byte
);
167 * @brief Adds a byte to this message and escapes the byte if needed.
168 * @param byte The byte to add.
170 void PushEscaped(uint8_t byte
);
173 * @brief Adds a byte to this message.
174 * @param byte The byte to add.
175 * @return True when a full message was received, false otherwise.
177 bool PushReceivedByte(uint8_t byte
);
180 * @return The messagecode inside this adapter message, or MSGCODE_NOTHING if there is none.
182 cec_adapter_messagecode
Message(void) const;
185 * @return The messagecode (if provided) that this message is responding to
187 cec_adapter_messagecode
ResponseTo(void) const;
190 * @return True when this message is a transmission, false otherwise.
192 bool IsTranmission(void) const;
195 * @return True when the EOM bit is set, false otherwise.
197 bool IsEOM(void) const;
200 * @return True when the ACK bit is set, false otherwise.
202 bool IsACK(void) const;
205 * @brief Checks whether the given messagecode is an error message.
206 * @param code The code to check.
207 * @return True when it's an error, false otherwise.
209 static bool MessageCodeIsError(const cec_adapter_messagecode code
);
212 * @return True when this message contains an error code, false otherwise.
214 bool IsError(void) const;
217 * @return True when this message has been replied with an error code, false otherwise.
219 bool ReplyIsError(void) const;
222 * @return True when this message has been replied with an error code and needs to be retried, false otherwise.
224 bool NeedsRetry(void) const;
227 * @return The logical address of the initiator, or CECDEVICE_UNKNOWN if unknown.
229 cec_logical_address
Initiator(void) const;
232 * @return The logical address of the destination, or CECDEVICE_UNKNOWN if unknown.
234 cec_logical_address
Destination(void) const;
237 * @return True when this message contains a start message, false otherwise.
239 bool HasStartMessage(void) const;
242 * @brief Push this adapter message to the end of the given cec_command.
243 * @param command The command to push this message to.
244 * @return True when a full CEC message was received, false otherwise.
246 bool PushToCecCommand(cec_command
&command
) const;
249 * @return The response messagecode.
251 cec_adapter_messagecode
Reply(void) const;
253 cec_datapacket response
; /**< the response to this message */
254 cec_datapacket packet
; /**< the actual data */
255 cec_adapter_message_state state
; /**< the current state of this message */
256 int32_t transmit_timeout
; /**< the timeout to use when sending this message */
257 uint8_t lineTimeout
; /**< the default CEC line timeout to use when sending this message */
258 bool bFireAndForget
; /**< true to auto delete, don't wait for a response */
261 bool bNextByteIsEscaped
; /**< true when the next byte that is added will be escaped, false otherwise */