1c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/* 2c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Copyright (C) Texas Instruments - http://www.ti.com/ 3c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * 4c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Licensed under the Apache License, Version 2.0 (the "License"); 5c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * you may not use this file except in compliance with the License. 6c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * You may obtain a copy of the License at 7c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * 8c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * http://www.apache.org/licenses/LICENSE-2.0 9c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * 10c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Unless required by applicable law or agreed to in writing, software 11c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * distributed under the License is distributed on an "AS IS" BASIS, 12c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * See the License for the specific language governing permissions and 14c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * limitations under the License. 15c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 16c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 17c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 18c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 19c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#ifndef __MESSAGEQUEUE_H__ 20c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define __MESSAGEQUEUE_H__ 21c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 22c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "DebugUtils.h" 23c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <stdint.h> 24c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 25c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev///Uncomment this macro to debug the message queue implementation 26c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//#define DEBUG_LOG 27c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 28c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev///Camera HAL Logging Functions 29c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#ifndef DEBUG_LOG 30c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 31c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define MSGQ_LOGDA(str) 32c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define MSGQ_LOGDB(str, ...) 33c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 34c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#undef LOG_FUNCTION_NAME 35c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#undef LOG_FUNCTION_NAME_EXIT 36c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define LOG_FUNCTION_NAME 37c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define LOG_FUNCTION_NAME_EXIT 38c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 39c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else 40c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 41c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define MSGQ_LOGDA DBGUTILS_LOGDA 42c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define MSGQ_LOGDB DBGUTILS_LOGDB 43c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 44c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif 45c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 46c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define MSGQ_LOGEA DBGUTILS_LOGEA 47c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define MSGQ_LOGEB DBGUTILS_LOGEB 48c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 49c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 50c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevnamespace TIUTILS { 51c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 52c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev///Message type 53c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstruct Message 54c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 55c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev unsigned int command; 56c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void* arg1; 57c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void* arg2; 58c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void* arg3; 59c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void* arg4; 60c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int64_t id; 61c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}; 62c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 63c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev///Message queue implementation 64c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevclass MessageQueue 65c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 66c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic: 67c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 68c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev MessageQueue(); 69c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ~MessageQueue(); 70c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 71c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Get a message from the queue 72c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev android::status_t get(Message*); 73c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 74c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Get the input file descriptor of the message queue 75c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int getInFd(); 76c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 77c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Set the input file descriptor for the message queue 78c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void setInFd(int fd); 79c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 80c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Queue a message 81c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev android::status_t put(Message*); 82c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 83c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Returns if the message queue is empty or not 84c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool isEmpty(); 85c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 86f9df3ee5cfb3c3177bcc630abf6d756e8a60254cSundar Raman void clear(); 87f9df3ee5cfb3c3177bcc630abf6d756e8a60254cSundar Raman 88c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Force whether the message queue has message or not 89c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void setMsg(bool hasMsg=false); 90c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 91c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Wait for message in maximum three different queues with a timeout 92c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev static int waitForMsg(MessageQueue *queue1, MessageQueue *queue2=0, MessageQueue *queue3=0, int timeout = 0); 93c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 94c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool hasMsg() 95c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 96c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return mHasMsg; 97c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 98c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 99c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevprivate: 100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int fd_read; 101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int fd_write; 102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool mHasMsg; 103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}; 104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}; 106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif 108