169 files changed, 64432 insertions, 116 deletions
@@ -6,10 +6,36 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) +DVB_PATH := $(wildcard vendor/amlogic/dvb) +TVAPI_PATH := $(LOCAL_PATH)/tvapi +LIB_SQLITE_PATH := $(wildcard external/sqlite) +AM_LIBPLAYER_PATH := $(wildcard vendor/amlogic/frameworks/av/LibPlayer) LOCAL_MODULE_RELATIVE_PATH := hw LOCAL_SHARED_LIBRARIES := libcutils liblog LOCAL_SRC_FILES := tv_input.cpp LOCAL_MODULE := tv_input.amlogic LOCAL_MODULE_TAGS := optional +LOCAL_C_INCLUDES += \ + $(TVAPI_PATH)/libtv \ + $(TVAPI_PATH)/android \ + $(DVB_PATH)/android/ndk/include \ + $(DVB_PATH)/include/am_adp \ + $(DVB_PATH)/include/am_mw \ + $(DVB_PATH)/include/am_ver \ + $(DVB_PATH)/android/ndk/include \ + $(LIB_SQLITE_PATH)/dist \ + $(TVAPI_PATH)/libtv/tvdb \ + $(TVAPI_PATH)/libtv/tv \ + $(TVAPI_PATH)/libtv/include \ + $(AM_LIBPLAYER_PATH)/amadec/include \ + $(AM_LIBPLAYER_PATH)/amcodec/include \ + $(AM_LIBPLAYER_PATH)/amffmpeg \ + $(AM_LIBPLAYER_PATH)/amplayer \ + system/media/audio_effects/include \ + + +LOCAL_SHARED_LIBRARIES += \ + libtv \ + libtvserver include $(BUILD_SHARED_LIBRARY) diff --git a/tv_input.cpp b/tv_input.cpp index ea709de..822c7c8 100644 --- a/tv_input.cpp +++ b/tv_input.cpp @@ -22,7 +22,8 @@ #include <cutils/native_handle.h> #include <hardware/tv_input.h> - +#include <tv/CTv.h> +#include <tvserver/TvService.h> /*****************************************************************************/ #define ATV_DEV_ID 1 @@ -32,19 +33,20 @@ #define HDMI2_DEV_ID 5 #define HDMI3_DEV_ID 6 -typedef struct tv_input_private -{ +typedef struct tv_input_private { tv_input_device_t device; // Callback related data - const tv_input_callback_ops_t* callback; - void* callback_data; + const tv_input_callback_ops_t *callback; + void *callback_data; + //TvService* pTvService; + CTv *pTv; } tv_input_private_t; -static int notify_ATV_device_available(tv_input_private_t* priv) +static int notify_ATV_device_available(tv_input_private_t *priv) { - tv_input_event_t event; - event.device_info.device_id =ATV_DEV_ID; + tv_input_event_t event; + event.device_info.device_id = ATV_DEV_ID; event.device_info.type = TV_INPUT_TYPE_TUNER; event.type = TV_INPUT_EVENT_DEVICE_AVAILABLE; event.device_info.audio_type = AUDIO_DEVICE_NONE; @@ -52,10 +54,10 @@ static int notify_ATV_device_available(tv_input_private_t* priv) return 0; } -static int notify_DTV_device_available(tv_input_private_t* priv) +static int notify_DTV_device_available(tv_input_private_t *priv) { - tv_input_event_t event; - event.device_info.device_id =DTV_DEV_ID; + tv_input_event_t event; + event.device_info.device_id = DTV_DEV_ID; event.device_info.type = TV_INPUT_TYPE_TUNER; event.type = TV_INPUT_EVENT_DEVICE_AVAILABLE; event.device_info.audio_type = AUDIO_DEVICE_NONE; @@ -63,10 +65,10 @@ static int notify_DTV_device_available(tv_input_private_t* priv) return 0; } -static int notify_AV_device_available(tv_input_private_t* priv) +static int notify_AV_device_available(tv_input_private_t *priv) { - tv_input_event_t event; - event.device_info.device_id =AV_DEV_ID; + tv_input_event_t event; + event.device_info.device_id = AV_DEV_ID; event.device_info.type = TV_INPUT_TYPE_COMPONENT; event.type = TV_INPUT_EVENT_DEVICE_AVAILABLE; event.device_info.audio_type = AUDIO_DEVICE_NONE; @@ -74,10 +76,10 @@ static int notify_AV_device_available(tv_input_private_t* priv) return 0; } -static int notify_hdmi_device_available(tv_input_private_t* priv, int dev_id, uint32_t port_id) +static int notify_hdmi_device_available(tv_input_private_t *priv, int dev_id, uint32_t port_id) { - tv_input_event_t event; - event.device_info.device_id =dev_id; + tv_input_event_t event; + event.device_info.device_id = dev_id; event.device_info.type = TV_INPUT_TYPE_HDMI; event.type = TV_INPUT_EVENT_DEVICE_AVAILABLE; event.device_info.hdmi.port_id = port_id; @@ -86,144 +88,151 @@ static int notify_hdmi_device_available(tv_input_private_t* priv, int dev_id, ui return 0; } -static int get_stream_configs(int dev_id, int* num_configurations, const tv_stream_config_t** configs) +static int get_stream_configs(int dev_id, int *num_configurations, const tv_stream_config_t **configs) { - tv_stream_config_t* mconfig = (tv_stream_config_t*)malloc(sizeof(mconfig)); - if (!mconfig) { - return -1; - } - switch (dev_id) { - case ATV_DEV_ID: - mconfig->stream_id=ATV_DEV_ID; - mconfig->type =TV_STREAM_TYPE_INDEPENDENT_VIDEO_SOURCE ; - mconfig->max_video_width = 1920; - mconfig->max_video_height = 1080; - *num_configurations = 1; - *configs = mconfig; - break; - case DTV_DEV_ID: - mconfig->stream_id=DTV_DEV_ID; - mconfig->type =TV_STREAM_TYPE_INDEPENDENT_VIDEO_SOURCE ; - mconfig->max_video_width = 1920; - mconfig->max_video_height = 1080; - *num_configurations = 1; - *configs = mconfig; - break; - case AV_DEV_ID: - mconfig->stream_id=AV_DEV_ID; - mconfig->type =TV_STREAM_TYPE_INDEPENDENT_VIDEO_SOURCE ; - mconfig->max_video_width = 1920; - mconfig->max_video_height = 1080; - *num_configurations = 1; - *configs = mconfig; - break; - case HDMI1_DEV_ID: - mconfig->stream_id=HDMI1_DEV_ID; - mconfig->type =TV_STREAM_TYPE_INDEPENDENT_VIDEO_SOURCE ; - mconfig->max_video_width = 1920; - mconfig->max_video_height = 1080; - *num_configurations = 1; - *configs = mconfig; - break; - case HDMI2_DEV_ID: - mconfig->stream_id=HDMI2_DEV_ID; - mconfig->type =TV_STREAM_TYPE_INDEPENDENT_VIDEO_SOURCE ; - mconfig->max_video_width = 1920; - mconfig->max_video_height = 1080; - *num_configurations = 1; - *configs = mconfig; - break; - case HDMI3_DEV_ID: - mconfig->stream_id=HDMI3_DEV_ID; - mconfig->type =TV_STREAM_TYPE_INDEPENDENT_VIDEO_SOURCE ; - mconfig->max_video_width = 1920; - mconfig->max_video_height = 1080; - *num_configurations = 1; - *configs = mconfig; - break; - default: - break; - } - return 0; + tv_stream_config_t *mconfig = (tv_stream_config_t *)malloc(sizeof(mconfig)); + if (!mconfig) { + return -1; + } + switch (dev_id) { + case ATV_DEV_ID: + mconfig->stream_id = ATV_DEV_ID; + mconfig->type = TV_STREAM_TYPE_INDEPENDENT_VIDEO_SOURCE ; + mconfig->max_video_width = 1920; + mconfig->max_video_height = 1080; + *num_configurations = 1; + *configs = mconfig; + break; + case DTV_DEV_ID: + mconfig->stream_id = DTV_DEV_ID; + mconfig->type = TV_STREAM_TYPE_INDEPENDENT_VIDEO_SOURCE ; + mconfig->max_video_width = 1920; + mconfig->max_video_height = 1080; + *num_configurations = 1; + *configs = mconfig; + break; + case AV_DEV_ID: + mconfig->stream_id = AV_DEV_ID; + mconfig->type = TV_STREAM_TYPE_INDEPENDENT_VIDEO_SOURCE ; + mconfig->max_video_width = 1920; + mconfig->max_video_height = 1080; + *num_configurations = 1; + *configs = mconfig; + break; + case HDMI1_DEV_ID: + mconfig->stream_id = HDMI1_DEV_ID; + mconfig->type = TV_STREAM_TYPE_INDEPENDENT_VIDEO_SOURCE ; + mconfig->max_video_width = 1920; + mconfig->max_video_height = 1080; + *num_configurations = 1; + *configs = mconfig; + break; + case HDMI2_DEV_ID: + mconfig->stream_id = HDMI2_DEV_ID; + mconfig->type = TV_STREAM_TYPE_INDEPENDENT_VIDEO_SOURCE ; + mconfig->max_video_width = 1920; + mconfig->max_video_height = 1080; + *num_configurations = 1; + *configs = mconfig; + break; + case HDMI3_DEV_ID: + mconfig->stream_id = HDMI3_DEV_ID; + mconfig->type = TV_STREAM_TYPE_INDEPENDENT_VIDEO_SOURCE ; + mconfig->max_video_width = 1920; + mconfig->max_video_height = 1080; + *num_configurations = 1; + *configs = mconfig; + break; + default: + break; + } + return 0; } -static int tv_input_device_open(const struct hw_module_t* module, - const char* name, struct hw_device_t** device); +static int tv_input_device_open(const struct hw_module_t *module, + const char *name, struct hw_device_t **device); static struct hw_module_methods_t tv_input_module_methods = { - open: tv_input_device_open +open: + tv_input_device_open }; tv_input_module_t HAL_MODULE_INFO_SYM = { - common: { - tag: HARDWARE_MODULE_TAG, +common: + { +tag: + HARDWARE_MODULE_TAG, version_major: 0, version_minor: 1, - id: TV_INPUT_HARDWARE_MODULE_ID, - name: "TVInput module", - author: "Amlogic", - methods: &tv_input_module_methods, +id: + TV_INPUT_HARDWARE_MODULE_ID, +name: "TVInput module" + , +author: "Amlogic" + , +methods: + &tv_input_module_methods, } }; /*****************************************************************************/ -static int tv_input_initialize(struct tv_input_device* dev, - const tv_input_callback_ops_t* callback, void* data) +static int tv_input_initialize(struct tv_input_device *dev, + const tv_input_callback_ops_t *callback, void *data) { if (dev == NULL || callback == NULL) { return -EINVAL; } - tv_input_private_t* priv = (tv_input_private_t*)dev; + tv_input_private_t *priv = (tv_input_private_t *)dev; if (priv->callback != NULL) { return -EEXIST; } priv->callback = callback; priv->callback_data = data; -/* ATV_DEVICE_AVAILABLE */ - notify_ATV_device_available(priv); -/* DTV_DEVICE_AVAILABLE */ - notify_DTV_device_available(priv); -/* AV_DEVICE_AVAILABLE */ - notify_AV_device_available(priv); -/* HDMI1_DEVICE_AVAILABLE */ - notify_hdmi_device_available(priv, HDMI1_DEV_ID, 1); -/* HDMI2_DEVICE_AVAILABLE */ - notify_hdmi_device_available(priv, HDMI2_DEV_ID, 2); -/* HDMI3_DEVICE_AVAILABLE */ - notify_hdmi_device_available(priv, HDMI3_DEV_ID, 3); + /* ATV_DEVICE_AVAILABLE */ + notify_ATV_device_available(priv); + /* DTV_DEVICE_AVAILABLE */ + notify_DTV_device_available(priv); + /* AV_DEVICE_AVAILABLE */ + notify_AV_device_available(priv); + /* HDMI1_DEVICE_AVAILABLE */ + notify_hdmi_device_available(priv, HDMI1_DEV_ID, 1); + /* HDMI2_DEVICE_AVAILABLE */ + notify_hdmi_device_available(priv, HDMI2_DEV_ID, 2); + /* HDMI3_DEVICE_AVAILABLE */ + notify_hdmi_device_available(priv, HDMI3_DEV_ID, 3); return 0; } -static int tv_input_get_stream_configurations(const struct tv_input_device* dev, - int device_id, int* num_configurations, - const tv_stream_config_t** configs) +static int tv_input_get_stream_configurations(const struct tv_input_device *dev, + int device_id, int *num_configurations, + const tv_stream_config_t **configs) { - if (get_stream_configs(device_id, num_configurations, configs) == 0) { - return 0; - } + if (get_stream_configs(device_id, num_configurations, configs) == 0) { + return 0; + } return -EINVAL; } -static int tv_input_open_stream(struct tv_input_device*, int, tv_stream_t*) +static int tv_input_open_stream(struct tv_input_device *, int, tv_stream_t *) { return -EINVAL; } -static int tv_input_close_stream(struct tv_input_device*, int, int) +static int tv_input_close_stream(struct tv_input_device *, int, int) { return -EINVAL; } static int tv_input_request_capture( - struct tv_input_device*, int, int, buffer_handle_t, uint32_t) + struct tv_input_device *, int, int, buffer_handle_t, uint32_t) { return -EINVAL; } -static int tv_input_cancel_capture(struct tv_input_device*, int, int, uint32_t) +static int tv_input_cancel_capture(struct tv_input_device *, int, int, uint32_t) { return -EINVAL; } @@ -232,7 +241,10 @@ static int tv_input_cancel_capture(struct tv_input_device*, int, int, uint32_t) static int tv_input_device_close(struct hw_device_t *dev) { - tv_input_private_t* priv = (tv_input_private_t*)dev; + tv_input_private_t *priv = (tv_input_private_t *)dev; + if (priv->pTv != NULL) { + delete priv->pTv; + } if (priv) { free(priv); } @@ -241,25 +253,27 @@ static int tv_input_device_close(struct hw_device_t *dev) /*****************************************************************************/ -static int tv_input_device_open(const struct hw_module_t* module, - const char* name, struct hw_device_t** device) +static int tv_input_device_open(const struct hw_module_t *module, + const char *name, struct hw_device_t **device) { int status = -EINVAL; if (!strcmp(name, TV_INPUT_DEFAULT_DEVICE)) { - tv_input_private_t* dev = (tv_input_private_t*)malloc(sizeof(*dev)); + tv_input_private_t *dev = (tv_input_private_t *)malloc(sizeof(*dev)); /* initialize our state here */ memset(dev, 0, sizeof(*dev)); - + /*intialize tv*/ + dev->pTv = new CTv(); + TvService::instantiate(dev->pTv); /* initialize the procs */ dev->device.common.tag = HARDWARE_DEVICE_TAG; dev->device.common.version = TV_INPUT_DEVICE_API_VERSION_0_1; - dev->device.common.module = const_cast<hw_module_t*>(module); + dev->device.common.module = const_cast<hw_module_t *>(module); dev->device.common.close = tv_input_device_close; dev->device.initialize = tv_input_initialize; dev->device.get_stream_configurations = - tv_input_get_stream_configurations; + tv_input_get_stream_configurations; dev->device.open_stream = tv_input_open_stream; dev->device.close_stream = tv_input_close_stream; dev->device.request_capture = tv_input_request_capture; diff --git a/tvapi/Android.mk b/tvapi/Android.mk new file mode 100644 index 0000000..5053e7d --- a/dev/null +++ b/tvapi/Android.mk @@ -0,0 +1 @@ +include $(call all-subdir-makefiles) diff --git a/tvapi/android/Android.mk b/tvapi/android/Android.mk new file mode 100644 index 0000000..5053e7d --- a/dev/null +++ b/tvapi/android/Android.mk @@ -0,0 +1 @@ +include $(call all-subdir-makefiles) diff --git a/tvapi/android/include/ITv.h b/tvapi/android/include/ITv.h new file mode 100644 index 0000000..2fd6f6d --- a/dev/null +++ b/tvapi/android/include/ITv.h @@ -0,0 +1,51 @@ +#ifndef ANDROID_AMLOGIC_ITV_H +#define ANDROID_AMLOGIC_ITV_H + +#include <utils/RefBase.h> +#include <binder/IInterface.h> +#include <binder/Parcel.h> +#include <binder/IMemory.h> +#include <utils/String8.h> +#include <include/Tv.h> + +using namespace android; + +class ITvClient; + +class ITv: public IInterface +{ +public: + DECLARE_META_INTERFACE(Tv); + + virtual void disconnect() = 0; + + // connect new client with existing tv remote + virtual status_t connect(const sp<ITvClient> &client) = 0; + + // prevent other processes from using this ITv interface + virtual status_t lock() = 0; + + // allow other processes to use this ITv interface + virtual status_t unlock() = 0; + + virtual status_t processCmd(const Parcel &p, Parcel *r) = 0; + + //share mem for subtitle bmp + virtual status_t createSubtitle(const sp<IMemory> &share_mem) = 0; + //share mem for video/hdmi bmp + virtual status_t createVideoFrame(const sp<IMemory> &share_mem) = 0; + +}; + +// ---------------------------------------------------------------------------- + +class BnTv: public BnInterface<ITv> +{ +public: + virtual status_t onTransact( uint32_t code, + const Parcel &data, + Parcel *reply, + uint32_t flags = 0); +}; + +#endif diff --git a/tvapi/android/include/ITvClient.h b/tvapi/android/include/ITvClient.h new file mode 100644 index 0000000..fcebd6c --- a/dev/null +++ b/tvapi/android/include/ITvClient.h @@ -0,0 +1,30 @@ +#ifndef ANDROID_AMLOGIC_ITV_CLIENT_H +#define ANDROID_AMLOGIC_ITV_CLIENT_H + +#include <utils/RefBase.h> +#include <binder/IInterface.h> +#include <binder/Parcel.h> +#include <binder/IMemory.h> +#include <utils/Timers.h> + +using namespace android; + +class ITvClient: public IInterface +{ +public: + DECLARE_META_INTERFACE(TvClient); + + virtual void notifyCallback(int32_t msgType, const Parcel &p) = 0; +}; + + +class BnTvClient: public BnInterface<ITvClient> +{ +public: + virtual status_t onTransact(uint32_t code, + const Parcel &data, + Parcel *reply, + uint32_t flags = 0); +}; + +#endif diff --git a/tvapi/android/include/ITvService.h b/tvapi/android/include/ITvService.h new file mode 100644 index 0000000..cd0d366 --- a/dev/null +++ b/tvapi/android/include/ITvService.h @@ -0,0 +1,35 @@ +#ifndef ANDROID_AMLOGIC_ITVSERVICE_H +#define ANDROID_AMLOGIC_ITVSERVICE_H + +#include <utils/RefBase.h> +#include <binder/IInterface.h> +#include <binder/Parcel.h> +#include <include/ITvClient.h> +#include <include/ITv.h> + +using namespace android; + + +class ITvService : public IInterface +{ +public: + enum { + CONNECT = IBinder::FIRST_CALL_TRANSACTION, + }; + +public: + DECLARE_META_INTERFACE(TvService); + + virtual sp<ITv> connect(const sp<ITvClient> &tvClient) = 0; +}; + +class BnTvService: public BnInterface<ITvService> +{ +public: + virtual status_t onTransact(uint32_t code, + const Parcel &data, + Parcel *reply, + uint32_t flags = 0); +}; + +#endif diff --git a/tvapi/android/include/Tv.h b/tvapi/android/include/Tv.h new file mode 100644 index 0000000..ed6b324 --- a/dev/null +++ b/tvapi/android/include/Tv.h @@ -0,0 +1,82 @@ +#ifndef ANDROID_AMLOGIC_TV_H +#define ANDROID_AMLOGIC_TV_H + +#include <utils/Timers.h> +#include <include/ITvClient.h> +#include <binder/MemoryHeapBase.h> +#include <binder/MemoryBase.h> +#include <utils/threads.h> + +using namespace android; + +class ITvService; +class ITv; + +// ref-counted object for callbacks +class TvListener: virtual public RefBase +{ +public: + virtual void notify(int32_t msgType, const Parcel &ext) = 0; +}; + +class Tv : public BnTvClient, public IBinder::DeathRecipient +{ +public: + // construct a tv client from an existing remote + static sp<Tv> create(const sp<ITv> &tv); + static sp<Tv> connect(); + ~Tv(); + void init(); + status_t reconnect(); + void disconnect(); + status_t lock(); + status_t unlock(); + + status_t getStatus() + { + return mStatus; + } + status_t processCmd(const Parcel &p, Parcel *r); + status_t createSubtitle(const sp<IMemory> &share_mem); + status_t createVideoFrame(const sp<IMemory> &share_mem); + void setListener(const sp<TvListener> &listener); + + // ITvClient interface + virtual void notifyCallback(int32_t msgType, const Parcel &p); + + sp<ITv> remote(); + +private: + Tv(); + Tv(const Tv &); + Tv &operator = (const Tv); + virtual void binderDied(const wp<IBinder> &who); + + class DeathNotifier: public IBinder::DeathRecipient + { + public: + DeathNotifier() {} + virtual void binderDied(const wp<IBinder> &who); + }; + + static sp<DeathNotifier> mDeathNotifier; + + // helper function to obtain tv service handle + static const sp<ITvService> &getTvService(); + + sp<ITv> mTv; + status_t mStatus; + + sp<TvListener> mListener; + + friend class DeathNotifier; + + static Mutex mLock; + static sp<ITvService> mTvService; + + sp<MemoryHeapBase> mBmpMemHeap; + sp<MemoryBase> mBmpMemBase; +}; + + +#endif diff --git a/tvapi/android/include/tvcmd.h b/tvapi/android/include/tvcmd.h new file mode 100644 index 0000000..a105926 --- a/dev/null +++ b/tvapi/android/include/tvcmd.h @@ -0,0 +1,594 @@ +#ifndef ANDROID_AMLOGIC_TVCMD_H +#define ANDROID_AMLOGIC_TVCMD_H + +enum tvcmd_e { + // Tv function + OPEN_TV = 1, + CLOSE_TV = 2, + START_TV = 3, + STOP_TV = 4, + GET_TV_STATUS = 5, + GET_LAST_SOURCE_INPUT = 6, + GET_CURRENT_SOURCE_INPUT = 7, + GET_CURRENT_SOURCE_INPUT_TYPE = 8, + GET_CURRENT_SIGNAL_INFO = 9, + IS_SOURCE_SWTICH_DONE = 10, + SET_SOURCE_INPUT = 11, + RUN_ADC_AUTO_CALIBRATION = 12, + IS_DVI_SIGNAL = 13, + IS_VGA_TIMEING_IN_HDMI = 14, + GET_VIDEO_PATH_STATUS = 15, + GET_VIDEO_STREAM_STATUS = 16, + GET_FIRST_START_SWITCH_TYPE = 17, + SET_PREVIEW_WINDOW = 18, + GET_SOURCE_CONNECT_STATUS = 19, + //Tv function END + + // VGA + RUN_VGA_AUTO_ADJUST = 20, + GET_VGA_AUTO_ADJUST_STATUS = 21, + IS_VGA_AUTO_ADJUST_DONE = 22, + SET_VGA_HPOS = 23, + GET_VGA_HPOS = 24, + SET_VGA_VPOS = 25, + GET_VGA_VPOS = 26, + SET_VGA_CLOCK = 27, + GET_VGA_CLOCK = 28, + SET_VGA_PHASE = 29, + GET_VGA_PHASE = 30, + SET_VGA_AJUST_PARA = 31, + GET_VGA_AJUST_PARA = 32, + SET_VGAPARAM_DEFAULT = 33, + + // 3D + SET_3D_MODE = 61, + GET_3D_MODE = 62, + SET_3D_LR_SWITH = 63, + GET_3D_LR_SWITH = 64, + SET_3D_TO_2D_MODE = 65, + GET_3D_TO_2D_MODE = 66, + SET_3D_DEPTH = 67, + GET_3D_DEPTH = 68, + GET_3D_AUTO_DETECT = 69, + SET_3D_AUTO_DETECT = 70, + // 3D END + + //Screen related + SET_VIDEO_DISABLE = 80, + + // PQ + SET_SCENEMODE = 192, + GET_SCENEMODE = 193, + SET_BRIGHTNESS = 194, + GET_BRIGHTNESS = 195, + SAVE_BRIGHTNESS = 196, + SET_CONTRAST = 197, + GET_CONTRAST = 198, + SAVE_CONTRAST = 199, + SET_SATUATION = 200, + GET_SATUATION = 201, + SAVE_SATUATION = 202, + SET_HUE = 203, + GET_HUE = 204, + SAVE_HUE = 205, + SET_PQMODE = 206, + GET_PQMODE = 207, + SAVE_PQMODE = 208, + SET_SHARPNESS = 209, + GET_SHARPNESS = 210, + SAVE_SHARPNESS = 211, + SET_BACKLIGHT = 212, + GET_BACKLIGHT = 213, + SAVE_BACKLIGHT = 214, + SET_COLOR_MODE = 215, + GET_COLOR_MODE = 216, + SAVE_COLOR_MODE = 217, + SET_COLOR_TEMPERATURE = 218, + GET_COLOR_TEMPERATURE = 219, + SAVE_COLOR_TEMPERATURE = 220, + SET_DISPLAY_MODE = 221, + GET_DISPLAY_MODE = 222, + SAVE_DISPLAY_MODE = 223, + SET_NOISE_REDUCTION_MODE = 224, + GET_NOISE_REDUCTION_MODE = 225, + SAVE_NOISE_REDUCTION_MODE = 226, + SETRGBOGO_POSTOFFSET = 227, + //SETRGBOGO_POSTOFFSET_G = 228, + //SETRGBOGO_POSTOFFSET_B = 229, + SETRGBOGO_GAIN = 230, + //SETRGBOGO_GAIN_G = 231, + //SETRGBOGO_GAIN_B = 232, + GETRGBOGO_POSTOFFSET = 233, + //GETRGBOGO_POSTOFFSET_G = 234, + //GETRGBOGO_POSTOFFSET_B = 235, + GETRGBOGO_GAIN = 236, + //GETRGBOGO_GAIN_G = 237, + //GETRGBOGO_GAIN_B = 238, + + // FACTORY + FACTORY_SETPQMODE_BRIGHTNESS = 240, + FACTORY_GETPQMODE_BRIGHTNESS = 241, + FACTORY_SETPQMODE_CONTRAST = 242, + FACTORY_GETPQMODE_CONTRAST = 243, + FACTORY_SETPQMODE_SATURATION = 244, + FACTORY_GETPQMODE_SATURATION = 245, + FACTORY_SETPQMODE_HUE = 246, + FACTORY_GETPQMODE_HUE = 247, + FACTORY_SETPQMODE_SHARPNESS = 248, + FACTORY_GETPQMODE_SHARPNESS = 249, + FACTORY_SETCOLORTEMP_RGAIN = 250, + FACTORY_SAVECOLORTEMP_RGAIN = 251, + FACTORY_GETCOLORTEMP_RGAIN = 252, + FACTORY_SETCOLORTEMP_GGAIN = 253, + FACTORY_SAVECOLORTEMP_GGAIN = 254, + FACTORY_GETCOLORTEMP_GGAIN = 255, + FACTORY_SETCOLORTEMP_BGAIN = 256, + FACTORY_SAVECOLORTEMP_BGAIN = 257, + FACTORY_GETCOLORTEMP_BGAIN = 258, + FACTORY_SETCOLORTEMP_ROFFSET = 259, + FACTORY_SAVECOLORTEMP_ROFFSET = 260, + FACTORY_GETCOLORTEMP_ROFFSET = 261, + FACTORY_SETCOLORTEMP_GOFFSET = 262, + FACTORY_SAVECOLORTEMP_GOFFSET = 263, + FACTORY_GETCOLORTEMP_GOFFSET = 264, + FACTORY_SETCOLORTEMP_BOFFSET = 265, + FACTORY_SAVECOLORTEMP_BOFFSET = 266, + FACTORY_GETCOLORTEMP_BOFFSET = 267, + FACTORY_SETTESTPATTERN = 268, + FACTORY_GETTESTPATTERN = 269, + FACTORY_RESETPQMODE = 270, + FACTORY_RESETCOLORTEMP = 271, + FACTORY_RESETPAMAMSDEFAULT = 272, + FACTORY_SETDDRSSC = 273, + FACTORY_GETDDRSSC = 274, + FACTORY_SETLVDSSSC = 275, + FACTORY_GETLVDSSSC = 276, + FACTORY_SETNOLINEPARAMS = 277, + FACTORY_GETNOLINEPARAMS = 278, + FACTORY_SETOVERSCAN = 279, + FACTORY_GETOVERSCAN = 280, + FACTORY_SET_OUT_DEFAULT = 281, + FACTORY_GETGLOBALOGO_RGAIN = 282, + FACTORY_GETGLOBALOGO_GGAIN = 283, + FACTORY_GETGLOBALOGO_BGAIN = 284, + FACTORY_GETGLOBALOGO_ROFFSET = 285, + FACTORY_GETGLOBALOGO_GOFFSET = 286, + FACTORY_GETGLOBALOGO_BOFFSET = 287, + FACTORY_SETGLOBALOGO_RGAIN = 288, + FACTORY_SETGLOBALOGO_GGAIN = 289, + FACTORY_SETGLOBALOGO_BGAIN = 290, + FACTORY_SETGLOBALOGO_ROFFSET = 291, + FACTORY_SETGLOBALOGO_GOFFSET = 292, + FACTORY_SETGLOBALOGO_BOFFSET = 293, + FACTORY_CLEAN_ALL_TABLE_FOR_PROGRAM = 294, + + + // FACTORY END + + // AUDIO + // AUDIO MUTE + SET_AUDIO_MUTEKEY_STATUS = 301, + GET_AUDIO_MUTEKEY_STATUS = 302, + SET_AUDIO_FORCE_MUTE_STATUS = 303, + GET_AUDIO_FORCE_MUTE_STATUS = 304, + SET_AUDIO_AVOUT_MUTE_STATUS = 305, + GET_AUDIO_AVOUT_MUTE_STATUS = 306, + SET_AUDIO_SPDIF_MUTE_STATUS = 307, + GET_AUDIO_SPDIF_MUTE_STATUS = 308, + // AUDIO MASTER VOLUME + SET_AUDIO_MASTER_VOLUME = 309, + GET_AUDIO_MASTER_VOLUME = 310, + SAVE_CUR_AUDIO_MASTER_VOLUME = 311, + GET_CUR_AUDIO_MASTER_VOLUME = 312, + // AUDIO BALANCE + SET_AUDIO_BALANCE = 313, + GET_AUDIO_BALANCE = 314, + SAVE_CUR_AUDIO_BALANCE = 315, + GET_CUR_AUDIO_BALANCE = 316, + // AUDIO SUPPERBASS VOLUME + SET_AUDIO_SUPPER_BASS_VOLUME = 317, + GET_AUDIO_SUPPER_BASS_VOLUME = 318, + SAVE_CUR_AUDIO_SUPPER_BASS_VOLUME = 319, + GET_CUR_AUDIO_SUPPER_BASS_VOLUME = 320, + // AUDIO SUPPERBASS SWITCH + SET_AUDIO_SUPPER_BASS_SWITCH = 321, + GET_AUDIO_SUPPER_BASS_SWITCH = 322, + SAVE_CUR_AUDIO_SUPPER_BASS_SWITCH = 323, + GET_CUR_AUDIO_SUPPER_BASS_SWITCH = 324, + // AUDIO SRS SURROUND SWITCH + SET_AUDIO_SRS_SURROUND = 325, + GET_AUDIO_SRS_SURROUND = 326, + SAVE_CUR_AUDIO_SRS_SURROUND = 327, + GET_CUR_AUDIO_SRS_SURROUND = 328, + // AUDIO SRS DIALOG CLARITY + SET_AUDIO_SRS_DIALOG_CLARITY = 329, + GET_AUDIO_SRS_DIALOG_CLARITY = 330, + SAVE_CUR_AUDIO_SRS_DIALOG_CLARITY = 331, + GET_CUR_AUDIO_SRS_DIALOG_CLARITY = 332, + // AUDIO SRS TRUBASS + SET_AUDIO_SRS_TRU_BASS = 333, + GET_AUDIO_SRS_TRU_BASS = 334, + SAVE_CUR_AUDIO_SRS_TRU_BASS = 335, + GET_CUR_AUDIO_SRS_TRU_BASS = 336, + // AUDIO BASS + SET_AUDIO_BASS_VOLUME = 337, + GET_AUDIO_BASS_VOLUME = 338, + SAVE_CUR_AUDIO_BASS_VOLUME = 339, + GET_CUR_AUDIO_BASS_VOLUME = 340, + // AUDIO TREBLE + SET_AUDIO_TREBLE_VOLUME = 341, + GET_AUDIO_TREBLE_VOLUME = 342, + SAVE_CUR_AUDIO_TREBLE_VOLUME = 343, + GET_CUR_AUDIO_TREBLE_VOLUME = 344, + // AUDIO SOUND MODE + SET_AUDIO_SOUND_MODE = 345, + GET_AUDIO_SOUND_MODE = 346, + SAVE_CUR_AUDIO_SOUND_MODE = 347, + GET_CUR_AUDIO_SOUND_MODE = 348, + // AUDIO WALL EFFECT + SET_AUDIO_WALL_EFFECT = 349, + GET_AUDIO_WALL_EFFECT = 350, + SAVE_CUR_AUDIO_WALL_EFFECT = 351, + GET_CUR_AUDIO_WALL_EFFECT = 352, + // AUDIO EQ MODE + SET_AUDIO_EQ_MODE = 353, + GET_AUDIO_EQ_MODE = 354, + SAVE_CUR_AUDIO_EQ_MODE = 355, + GET_CUR_AUDIO_EQ_MODE = 356, + // AUDIO EQ GAIN + GET_AUDIO_EQ_RANGE = 357, + GET_AUDIO_EQ_BAND_COUNT = 358, + SET_AUDIO_EQ_GAIN = 359, + GET_AUDIO_EQ_GAIN = 360, + GET_CUR_EQ_GAIN = 361, + SAVE_CUR_AUDIO_EQ_GAIN = 362, + SET_AUDIO_EQ_SWITCH = 363, + // AUDIO SPDIF SWITCH + SET_AUDIO_SPDIF_SWITCH = 364, + GET_AUDIO_SPDIF_SWITCH = 365, + SAVE_CUR_AUDIO_SPDIF_SWITCH = 366, + GET_CUR_AUDIO_SPDIF_SWITCH = 367, + // AUDIO SPDIF MODE + SET_AUDIO_SPDIF_MODE = 368, + GET_AUDIO_SPDIF_MODE = 369, + SAVE_CUR_AUDIO_SPDIF_MODE = 370, + GET_CUR_AUDIO_SPDIF_MODE = 371, + // amAudio + OPEN_AMAUDIO = 372, + CLOSE_AMAUDIO = 373, + SET_AMAUDIO_INPUT_SR = 374, + SET_AMAUDIO_OUTPUT_MODE = 375, + SET_AMAUDIO_MUSIC_GAIN = 376, + SET_AMAUDIO_LEFT_GAIN = 377, + SET_AMAUDIO_RIGHT_GAIN = 378, + SET_AMAUDIO_REV1 = 379, + SET_AMAUDIO_REV2 = 380, + SET_AMAUDIO_REV3 = 381, + SET_AMAUDIO_REV4 = 382, + SET_AMAUDIO_REV5 = 383, + //AUDIO INPUT LEVEL SWITCH + SELECT_LINE_IN_CHANNEL = 384, + SET_LINE_IN_CAPTURE_VOL = 385, + HANDLE_AUDIO_HEADSET_PLUG_IN = 386, + HANDLE_AUDIO_HEADSET_PULL_OUT = 387, + SET_AUDIO_VOL_COMP = 388, + GET_AUDIO_VOL_COMP = 389, + SET_NOISE_GATE_THRESHOLD = 390, + SAVE_AUDIO_VOL_COMP = 391, + SET_KALAOK_IO_LEVEL = 392, + AUDIO_SET_DOUBLE_OUTPUT_ENABLE = 393, + USB_AUDIO_OUPUT_MODULE_ENABLE = 394, + GET_USB_AUDIO_DOUBLE_OUPUT_MODULE_ENABLE = 395, + GET_USB_AUDIO_OUPUT_MODULE_ENABLE = 396, + SET_AUDIO_SOURCE_FOR_KARAOKE = 397, + //AUDIO END + + // CALLBACK + SEARCH_CALLBACK = 501, + SIGLE_DETECT_CALLBACK = 502, + VGA_CALLBACK = 503, + DREAM_PANEL_CALLBACK = 504, + ADC_CALIBRATION_CALLBACK = 505, + SOURCE_SWITCH_CALLBACK = 506, + CHANNEL_SELECT_CALLBACK = 507, + STATUS_3D_CALLBACK = 508, + DTV_AV_PLAYBACK_CALLBACK = 509, + SOURCE_CONNECT_CALLBACK = 510, + HDMIRX_CEC_CALLBACK = 511, + SERIAL_COMMUNICATION_CALLBACK = 512, + CLOSE_CAPTION_CALLBACK = 514, + VCHIP_CALLBACK = 515, + UPGRADE_FBC_CALLBACK = 516, + HEADSET_STATUS_CALLBACK = 517, + + RELEASE_RESOURCE_CALLBACK = 530, + RESOURCES_STATE_CHANGED_CALLBACK = 531, + RESOURCE_STATE_CHANGED_LISTEN_NOFIFY_CALLBACK = 532, + + SUBTITLE_UPDATE_CALLBACK = 540, + SCAN_EVENT_CALLBACK = 541, + EPG_EVENT_CALLBACK = 542, + VFRAME_BMP_EVENT_CALLBACK = 543, + // CALLBACK END + + // SSM + SSM_INIT_DEVICE = 600, + SSM_SAVE_ONE_BYTE = 601, + SSM_READ_ONE_BYTE = 602, + SSM_SAVE_N_BYTES = 603, + SSM_READ_N_BYTES = 604, + SSM_SAVE_POWER_ON_OFF_CHANNEL = 605, + SSM_READ_POWER_ON_OFF_CHANNEL = 606, + SSM_SAVE_SOURCE_INPUT = 607, + SSM_READ_SOURCE_INPUT = 608, + SSM_SAVE_LAST_SOURCE_INPUT = 609, + SSM_READ_LAST_SOURCE_INPUT = 610, + SSM_SAVE_SYS_LANGUAGE = 611, + SSM_READ_SYS_LANGUAGE = 612, + SSM_SAVE_AGING_MODE = 613, + SSM_READ_AGING_MODE = 614, + SSM_SAVE_PANEL_TYPE = 615, + SSM_READ_PANEL_TYPE = 616, + SSM_SAVE_MAC_ADDR = 617, + SSM_READ_MAC_ADDR = 618, + SSM_SAVE_BAR_CODE = 619, + SSM_READ_BAR_CODE = 620, + SSM_SAVE_POWER_ON_MUSIC_SWITCH = 623, + SSM_READ_POWER_ON_MUSIC_SWITCH = 624, + SSM_SAVE_POWER_ON_MUSIC_VOL = 625, + SSM_READ_POWER_ON_MUSIC_VOL = 626, + SSM_SAVE_SYS_SLEEP_TIMER = 627, + SSM_READ_SYS_SLEEP_TIMER = 628, + SSM_SET_BUS_STATUS = 629, + SSM_GET_BUS_STATUS = 630, + SSM_SAVE_INPUT_SRC_PARENTAL_CTL = 631, + SSM_READ_INPUT_SRC_PARENTAL_CTL = 632, + SSM_SAVE_PARENTAL_CTL_SWITCH = 633, + SSM_READ_PARENTAL_CTL_SWITCH = 634, + SSM_SAVE_PARENTAL_CTL_PASS_WORD = 635, + SSM_READ_PARENTAL_CTL_PASS_WORD = 636, + SSM_SAVE_USING_DEF_HDCP_KEY_FLAG = 637, + SSM_READ_USING_DEF_HDCP_KEY_FLAG = 638, + SSM_GET_CUSTOMER_DATA_START = 639, + SSM_GET_CUSTOMER_DATA_LEN = 640, + SSM_SAVE_STANDBY_MODE = 641, + SSM_READ_STANDBY_MODE = 642, + SSM_SAVE_LOGO_ON_OFF_FLAG = 643, + SSM_READ_LOGO_ON_OFF_FLAG = 644, + SSM_SAVE_HDMIEQ_MODE = 645, + SSM_READ_HDMIEQ_MODE = 646, + SSM_SAVE_HDMIINTERNAL_MODE = 647, + SSM_READ_HDMIINTERNAL_MODE = 648, + SSM_SAVE_DISABLE_3D = 649, + SSM_READ_DISABLE_3D = 650, + SSM_SAVE_GLOBAL_OGOENABLE = 651, + SSM_READ_GLOBAL_OGOENABLE = 652, + SSM_SAVE_LOCAL_DIMING_STATUS = 653, + SSM_READ_LOCAL_DIMING_STATUS = 654, + SSM_SAVE_NON_STANDARD_STATUS = 655, + SSM_READ_NON_STANDARD_STATUS = 656, + SSM_SAVE_ADB_SWITCH_STATUS = 657, + SSM_READ_ADB_SWITCH_STATUS = 658, + SSM_SAVE_SERIAL_CMD_SWITCH_STATUS = 659, + SSM_READ_SERIAL_CMD_SWITCH_STATUS = 660, + SSM_SET_HDCP_KEY = 661, + SSM_SAVE_CHROMA_STATUS = 662, + SSM_SAVE_CA_BUFFER_SIZE = 663, + SSM_READ_CA_BUFFER_SIZE = 664, + SSM_GET_ATV_DATA_START = 665, + SSM_GET_ATV_DATA_LEN = 666, + SSM_GET_VPP_DATA_START = 667, + SSM_GET_VPP_DATA_LEN = 668, + SSM_SAVE_NOISE_GATE_THRESHOLD_STATUS = 669, + SSM_READ_NOISE_GATE_THRESHOLD_STATUS = 670, + SSM_SAVE_PROJECT_ID = 673, + SSM_READ_PROJECT_ID = 674, + SSM_SAVE_HDCPKEY = 675, + SSM_READ_HDCPKEY = 676, + SSM_READ_BLACKOUT_ENABLE = 677, + SSM_REFRESH_HDCPKEY = 678, + + // Misc + MISC_PROP_SET = 701, + MISC_PROP_GET = 702, + MISC_CFG_SET = 703, + MISC_CFG_GET = 704, + MISC_READ_ADC_VAL = 707, + MISC_SET_WDT_USER_PET = 708, + MISC_SET_WDT_USER_COUNTER = 709, + MISC_SET_WDT_USER_PET_RESET_ENABLE = 710, + MISC_GET_TV_API_VERSION = 713, + MISC_GET_DVB_API_VERSION = 714, + MISC_SERIAL_SWITCH = 715, + MISC_SERIAL_SEND_DATA = 716, + MISC_CHANNEL_EXPORT = 721, + MISC_CHANNEL_IMPORT = 722, + MISC_GET_PROJECT_INFO = 723, + MISC_GET_PLATFORM_TYPE = 724, + + //Extra + FORMAT_PARTITION = 801, + DELETE_DIR_FILES = 802, + REQUEST_RESOURCES = 803, + RELEASED_RESOURCES = 804, + SET_LISTEN_TO_RESOURCE = 805, + QUERY_RESOURCE_STATE = 806, + GET_DISPLAY_RESOLUTION_CONFIG = 808, + GET_DISPLAY_RESOLUTION_INFO = 809, + HDMIRX_CEC_SEND_CUSTOM_MESSAGE = 810, + HDMIRX_CEC_SEND_CUSTOM_WAIT_REPLY_MESSAGE = 811, + HDMIRX_CEC_SEND_BROADCAST_STANDBY_MESSAGE = 812, + HDMIRX_CEC_SEND_GIVE_CEC_VERSION_MESSAGE = 813, + HDMIRX_CEC_SEND_GIVE_DEV_VENDOR_ID_MESSAGE = 814, + HDMIRX_CEC_SEND_GIVE_OSD_NAME_MESSAGE = 815, + GET_HDMI_KSV_INFO = 816, + + //Fac_FBC + FACTORY_FBC_UPGRADE = 900, + FACTORY_FBC_SET_BRIGHTNESS = 901, + FACTORY_FBC_GET_BRIGHTNESS = 902, + FACTORY_FBC_SET_CONTRAST = 903, + FACTORY_FBC_GET_CONTRAST = 904, + FACTORY_FBC_SET_SATURATION = 905, + FACTORY_FBC_GET_SATURATION = 906, + FACTORY_FBC_SET_HUE = 907, + FACTORY_FBC_GET_HUE = 908, + FACTORY_FBC_SET_BACKLIGHT = 909, + FACTORY_FBC_GET_BACKLIGHT = 910, + FACTORY_FBC_SET_PIC_MODE = 911, + FACTORY_FBC_GET_PIC_MODE = 912, + FACTORY_FBC_SET_GAIN_RED = 913, + FACTORY_FBC_GET_GAIN_RED = 914, + FACTORY_FBC_SET_GAIN_GREEN = 915, + FACTORY_FBC_GET_GAIN_GREEN = 916, + FACTORY_FBC_SET_GAIN_BLUE = 917, + FACTORY_FBC_GET_GAIN_BLUE = 918, + FACTORY_FBC_SET_OFFSET_RED = 919, + FACTORY_FBC_GET_OFFSET_RED = 920, + FACTORY_FBC_SET_OFFSET_GREEN = 921, + FACTORY_FBC_GET_OFFSET_GREEN = 922, + FACTORY_FBC_SET_OFFSET_BLUE = 923, + FACTORY_FBC_GET_OFFSET_BLUE = 924, + FACTORY_FBC_SET_COLORTEMP_MODE = 925, + FACTORY_FBC_GET_COLORTEMP_MODE = 926, + FACTORY_FBC_SET_WB_INIT = 927, + FACTORY_FBC_GET_WB_INIT = 928, + FACTORY_FBC_SET_TEST_PATTERN = 929, + FACTORY_FBC_GET_TEST_PATTERN = 930, + FACTORY_FBC_SET_BACKLIGHT_EN = 931, + FACTORY_FBC_GET_BACKLIGHT_EN = 932, + FACTORY_FBC_SET_LVDS_SSG = 933, + FACTORY_FBC_SET_ELEC_MODE = 934, + FACTORY_FBC_GET_MAINCODE_VERSION = 935, + FACTORY_FBC_PANEL_POWER_SWITCH = 936, + FACTORY_FBC_PANEL_GET_INFO = 937, + FACTORY_FBC_PANEL_SUSPEND = 938, + FACTORY_FBC_SEND_KEY_TO_FBC = 939, + FACTORY_FBC_POWER_REBOOT = 940, + FACTORY_FBC_GET_ELEC_MODE = 941, + FACTORY_FBC_PANEL_USER_SETTING_DEFAULT = 942, + FACTORY_FBC_SET_BACKLIGHT_N360 = 943, + FACTORY_FBC_GET_BACKLIGHT_N360 = 944, + FACTORY_FBC_SET_COLORTEMP_MODE_N360 = 945, + FACTORY_FBC_GET_COLORTEMP_MODE_N360 = 946, + + //T868 for cvt + FACTORY_SETBACKLIGHT_PWM_FREQUENCY = 1000, + FACTORY_GETBACKLIGHT_PWM_FREQUENCY = 1001, + FACTORY_SETBACKLIGHT_SWITCH_STATUS = 1002, + FACTORY_GETBACKLIGHT_SWITCH_STATUS = 1003, + FACTORY_SETBACKLIGHT_PWM_DUTY = 1004, + FACTORY_GETBACKLIGHT_PWM_DUTY = 1005, + FACTORY_SETLVDS_COLOR_DEPTH = 1006, + FACTORY_GETLVDS_COLOR_DEPTH = 1007, + FACTORY_SETLVDS_DITHER_STATUS = 1008, + FACTORY_GETLVDS_DITHER_STATUS = 1009, + FACTORY_SETLVDS_MAPPING_STATUS = 1010, + FACTORY_GETLVDS_MAPPING_STATUS = 1011, + FACTORY_SETLVDS_PORT_SWAP_STATUS = 1012, + FACTORY_GETLVDS_PORT_SWAP_STATUS = 1013, + FACTORY_SET_SN = 1014, + FACTORY_GET_SN = 1015, + + //Uniform White Balance + FACTORY_WHITE_BALANCE_SET_GAIN_RED = 1100, + FACTORY_WHITE_BALANCE_GET_GAIN_RED = 1101, + FACTORY_WHITE_BALANCE_SET_GAIN_GREEN = 1102, + FACTORY_WHITE_BALANCE_GET_GAIN_GREEN = 1103, + FACTORY_WHITE_BALANCE_SET_GAIN_BLUE = 1104, + FACTORY_WHITE_BALANCE_GET_GAIN_BLUE = 1105, + FACTORY_WHITE_BALANCE_SET_OFFSET_RED = 1106, + FACTORY_WHITE_BALANCE_GET_OFFSET_RED = 1107, + FACTORY_WHITE_BALANCE_SET_OFFSET_GREEN = 1108, + FACTORY_WHITE_BALANCE_GET_OFFSET_GREEN = 1109, + FACTORY_WHITE_BALANCE_SET_OFFSET_BLUE = 1110, + FACTORY_WHITE_BALANCE_GET_OFFSET_BLUE = 1111, + FACTORY_WHITE_BALANCE_GET_COLOR_TMP = 1112, + FACTORY_WHITE_BALANCE_SET_COLOR_TMP = 1113, + FACTORY_WHITE_BALANCE_SAVE_PRAMAS = 1114, + FACTORY_WHITE_BALANCE_SET_WB_INIT = 1115, + FACTORY_WHITE_BALANCE_GET_WB_INIT = 1116, + FACTORY_WHITE_BALANCE_SET_GRAY_PATTERN = 1117, + FACTORY_WHITE_BALANCE_GET_GRAY_PATTERN = 1118, + FACTORY_WHITE_BALANCE_OPEN_GRAY_PATTERN = 1119, + FACTORY_WHITE_BALANCE_CLOSE_GRAY_PATTERN = 1120, + FACTORY_WHITE_BALANCE_GET_ALL_PRAMAS = 1121, + + //dtv + ATV_GET_CURRENT_PROGRAM_ID = 1389, + DTV_GET_CURRENT_PROGRAM_ID = 1390, + ATV_SAVE_PROGRAM_ID = 1391, + DTV_SCAN_MANUAL_BETWEEN_FREQ = 1392, + ATV_GET_MIN_MAX_FREQ = 1393, + DTV_GET_SCAN_FREQUENCY_LIST = 1394, + DTV_GET_CHANNEL_INFO = 1395, + ATV_GET_CHANNEL_INFO = 1396, + ATV_SCAN_MANUAL = 1397, + ATV_SCAN_MANUAL_BY_NUMBER = 1387, + ATV_SCAN_AUTO = 1398, + DTV_SCAN_MANUAL = 1399, + DTV_SCAN_AUTO = 1400, + TV_SUBTITLE_DRAW_END = 1401, + PLAY_PROGRAM = 1402, + STOP_PROGRAM_PLAY = 1403, + GET_PROGRAM_LIST = 1404, + STOP_SCAN = 1405, + DTV_GET_SNR = 1406, + DTV_GET_BER = 1407, + DTV_GET_STRENGTH = 1408, + DTV_GET_AUDIO_TRACK_NUM = 1409, + DTV_GET_AUDIO_TRACK_INFO = 1410, + DTV_SWITCH_AUDIO_TRACK = 1411, + DTV_GET_EPG_UTC_TIME = 1412, + DTV_GET_CUR_FREQ = 1413, + DTV_GET_EPG_INFO_POINT_IN_TIME = 1414, + DTV_GET_EPG_INFO_DURATION = 1415, + SET_FRONTEND_PARA = 1416, + DTV_SET_PROGRAM_NAME = 1417, + DTV_SET_PROGRAM_SKIPPED = 1418, + DTV_SET_PROGRAM_FAVORITE = 1419, + DTV_DETELE_PROGRAM = 1420, + DTV_SWAP_PROGRAM = 1421, + DTV_SET_PROGRAM_LOCKED = 1422, + DTV_SET_BOOKING_FLAG = 1423, + DTV_GET_BOOKED_EVENT = 1424, + DTV_GET_CURR_AUDIO_TRACK_INDEX = 1425, + DTV_SET_AUDIO_CHANNEL_MOD = 1426, + DTV_GET_AUDIO_CHANNEL_MOD = 1427, + DTV_GET_FREQ_BY_PROG_ID = 1428, + DTV_GET_VIDEO_FMT_INFO = 1429, + DTV_START_RECORD = 1430, + DTV_STOP_RECORD = 1431, + DTV_SET_RECORD_ALL_TS = 1432, + DTV_SCAN_AUTO_ATSC = 1433, + DTV_TEST_1 = 1451, + DTV_TEST_2 = 1452, + DTV_TEST_3 = 1453, + TV_CLEAR_ALL_PROGRAM = 1454, + SET_BLACKOUT_ENABLE = 1455, + START_AUTO_BACKLIGHT = 1456, + STOP_AUTO_BACKLIGHT = 1457, + IS_AUTO_BACKLIGHTING = 1458, + TV_PRINT_DEBUG_INFO = 2000, + + //customer interface + FACTROY_FBC_SET_LIGHT_SENSOR_STATUS_N310 = 3000, + FACTROY_FBC_GET_LIGHT_SENSOR_STATUS_N310 = 3001, + FACTROY_FBC_SET_DREAM_PANEL_STATUS_N310 = 3002, + FACTROY_FBC_GET_DREAM_PANEL_STATUS_N310 = 3003, + SSM_EEPROM_SAVE_ONE_BYTE_N310_N311 = 3004, + SSM_EEPROM_READ_ONE_BYTE_N310_N311 = 3005, + SSM_EEPROM_SAVE_N_BYTES_N310_N311 = 3006, + SSM_EEPROM_READ_N_BYTES_N310_N311 = 3007, + SSM_FLASH_SAVE_ONE_BYTE_N310_N311 = 3008, + SSM_FLASH_READ_ONE_BYTE_N310_N311 = 3009, + SSM_FLASH_SAVE_N_BYTES_N310_N311 = 3010, + SSM_FLASH_READ_N_BYTES_N310_N311 = 3011, + FACTROY_FBC_SET_MULT_PQ_STATUS_N310 = 3012, + FACTROY_FBC_GET_MULT_PQ_STATUS_N310 = 3013, + FACTROY_FBC_SET_MEMC_STATUS_N310 = 3014, + FACTROY_FBC_GET_MEMC_STATUS_N310 = 3015, + +}; + +#endif //ANDROID_AMLOGIC_TVCMD_H diff --git a/tvapi/android/jni/Android.mk b/tvapi/android/jni/Android.mk new file mode 100644 index 0000000..b1e2e3e --- a/dev/null +++ b/tvapi/android/jni/Android.mk @@ -0,0 +1,66 @@ +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := optional + +LOCAL_SRC_FILES:= \ + android_amlogic_tv.cpp +LOCAL_SHARED_LIBRARIES := \ + libcutils \ + libutils \ + libbinder \ + libtvbinder \ + libnativehelper \ + libandroid_runtime \ + liblog \ + libskia + +LOCAL_C_INCLUDES += \ + frameworks/base/core/jni \ + $(LOCAL_PATH)/../ \ + external/skia/include \ + +LOCAL_MODULE:= libtv_jni +LOCAL_PRELINK_MODULE := false +include $(BUILD_SHARED_LIBRARY) + + + + +#cfbc communication jni lib +include $(CLEAR_VARS) +LOCAL_MODULE_TAGS := optional + +LOCAL_C_INCLUDES += \ + frameworks/base/core/jni \ + $(LOCAL_PATH)/../../libtv \ + $(LOCAL_PATH)/../../libtv/tv \ + bionic/libc/include \ + bionic/libc/private \ + system/extras/ext4_utils \ + bionic/libc/include + +LOCAL_SRC_FILES := \ + ../../libtv/tv/CTvLog.cpp \ + ../../libtv/tvutils/CFile.cpp \ + ../../libtv/tvutils/CThread.cpp \ + ../../libtv/tvutils/CMsgQueue.cpp \ + ../../libtv/tvutils/zepoll.cpp \ + ../../libtv/tv/CFbcCommunication.cpp \ + ../../libtv/tvutils/serial_base.cpp \ + ../../libtv/tvutils/CSerialPort.cpp \ + ../../libtv/tvutils/CHdmiCecCmd.cpp \ + cfbc_jni.cpp \ + cfbc_test.cpp + +LOCAL_SHARED_LIBRARIES := \ + libcutils \ + libutils \ + libandroid_runtime \ + liblog \ + libdl + +LOCAL_MODULE:= libcfbc_jni +LOCAL_PRELINK_MODULE := false +#include $(BUILD_EXECUTABLE) +#include $(BUILD_SHARED_LIBRARY) diff --git a/tvapi/android/jni/android_amlogic_tv.cpp b/tvapi/android/jni/android_amlogic_tv.cpp new file mode 100644 index 0000000..ec531ef --- a/dev/null +++ b/tvapi/android/jni/android_amlogic_tv.cpp @@ -0,0 +1,456 @@ +#define LOG_TAG "Tv-JNI" +#include <utils/Log.h> + +#include "jni.h" +#include "JNIHelp.h" +#include "android_runtime/AndroidRuntime.h" +#include <utils/Vector.h> +#include <include/Tv.h> +#include <binder/IMemory.h> +#include <binder/Parcel.h> +#include <binder/MemoryHeapBase.h> +#include <binder/MemoryBase.h> +#include <core/SkBitmap.h> +#include "android_util_Binder.h" +#include "android_os_Parcel.h" +using namespace android; + +struct fields_t { + jfieldID context; + jmethodID post_event; +}; + +#ifdef LOG_TAG +#undef LOG_TAG +#define LOG_TAG "TvJNI" +#endif + +static fields_t fields; +static Mutex sLock; +class JNITvContext: public TvListener +{ +public: + JNITvContext(JNIEnv *env, jobject weak_this, jclass clazz, const sp<Tv> &tv); + ~JNITvContext() + { + release(); + } + virtual void notify(int32_t msgType, const Parcel &p); + void addCallbackBuffer(JNIEnv *env, jbyteArray cbb); + sp<Tv> getTv() + { + Mutex::Autolock _l(mLock); + return mTv; + } + void release(); + Parcel *mExtParcel; +private: + jobject mTvJObjectWeak; // weak reference to java object + jclass mTvJClass; // strong reference to java class + sp<Tv> mTv; // strong reference to native object + Mutex mLock; + + Vector<jbyteArray> mCallbackBuffers; // Global reference application managed byte[] + bool mManualBufferMode; // Whether to use application managed buffers. + bool mManualTvCallbackSet; // Whether the callback has been set, used to reduce unnecessary calls to set the callback. +}; + +sp<Tv> get_native_tv(JNIEnv *env, jobject thiz, JNITvContext **pContext) +{ + sp<Tv> tv; + Mutex::Autolock _l(sLock); + JNITvContext *context = reinterpret_cast<JNITvContext *>(env->GetIntField(thiz, fields.context)); + if (context != NULL) { + tv = context->getTv(); + } + if (tv == 0) { + jniThrowException(env, "java/lang/RuntimeException", "Method called after release()"); + } + + if (pContext != NULL) *pContext = context; + return tv; +} + +JNITvContext::JNITvContext(JNIEnv *env, jobject weak_this, jclass clazz, const sp<Tv> &tv) +{ + mTvJObjectWeak = env->NewGlobalRef(weak_this); + mTvJClass = (jclass)env->NewGlobalRef(clazz); + mTv = tv; + ALOGD("tvjni----------------------JNITvContext::JNITvContext("); + mManualBufferMode = false; + mManualTvCallbackSet = false; + //mExtParcel = parcelForJavaObject(env, ext_parcel); +} + +void JNITvContext::release() +{ + ALOGD("release"); + Mutex::Autolock _l(mLock); + JNIEnv *env = AndroidRuntime::getJNIEnv(); + + if (mTvJObjectWeak != NULL) { + env->DeleteGlobalRef(mTvJObjectWeak); + mTvJObjectWeak = NULL; + } + if (mTvJClass != NULL) { + env->DeleteGlobalRef(mTvJClass); + mTvJClass = NULL; + } + mTv.clear(); +} + +// connect to tv service +static void android_amlogic_Tv_native_setup(JNIEnv *env, jobject thiz, jobject weak_this) +{ + sp<Tv> tv = Tv::connect(); + + ALOGD("android_amlogic_Tv_native_setup."); + + if (tv == NULL) { + jniThrowException(env, "java/lang/RuntimeException", "Fail to connect to tv service"); + return; + } + + // make sure tv amlogic is alive + if (tv->getStatus() != NO_ERROR) { + jniThrowException(env, "java/lang/RuntimeException", "Tv initialization failed!"); + return; + } + + jclass clazz = env->GetObjectClass(thiz); + if (clazz == NULL) { + jniThrowException(env, "java/lang/RuntimeException", "Can't find android/amlogic/Tv!"); + return; + } + + sp<JNITvContext> context = new JNITvContext(env, weak_this, clazz, tv); + context->incStrong(thiz); + tv->setListener(context); + + env->SetIntField(thiz, fields.context, (int)context.get()); +} + + +static void android_amlogic_Tv_release(JNIEnv *env, jobject thiz) +{ + // TODO: Change to LOGE + JNITvContext *context = NULL; + sp<Tv> tv; + { + Mutex::Autolock _l(sLock); + context = reinterpret_cast<JNITvContext *>(env->GetIntField(thiz, fields.context)); + + // Make sure we do not attempt to callback on a deleted Java object. + env->SetIntField(thiz, fields.context, 0); + } + + ALOGD("release tv"); + + // clean up if release has not been called before + if (context != NULL) { + tv = context->getTv(); + context->release(); + ALOGD("native_release: context=%p tv=%p", context, tv.get()); + + // clear callbacks + if (tv != NULL) { + //tv->setPreviewCallbackFlags(FRAME_CALLBACK_FLAG_NOOP); + tv->disconnect(); + } + + // remove context to prevent further Java access + context->decStrong(thiz); + } +} + +void JNITvContext::notify(int32_t msgType, const Parcel &p) +{ + // VM pointer will be NULL if object is released + Mutex::Autolock _l(mLock); + if (mTvJObjectWeak == NULL) { + ALOGW("callback on dead tv object"); + return; + } + + JNIEnv *env = AndroidRuntime::getJNIEnv(); + + jobject jParcel = createJavaParcelObject(env); + if (jParcel != NULL) { + Parcel *nativeParcel = parcelForJavaObject(env, jParcel); + nativeParcel->write(p.data(), p.dataSize()); + env->CallStaticVoidMethod(mTvJClass, fields.post_event, mTvJObjectWeak, msgType, jParcel); + env->DeleteLocalRef(jParcel); + } +} + + +void JNITvContext::addCallbackBuffer(JNIEnv *env, jbyteArray cbb) +{ + if (cbb != NULL) { + Mutex::Autolock _l(mLock); + jbyteArray callbackBuffer = (jbyteArray)env->NewGlobalRef(cbb); + mCallbackBuffers.push(cbb); + ALOGD("Adding callback buffer to queue, %d total", mCallbackBuffers.size()); + } else { + ALOGE("Null byte array!"); + } +} + +static jint android_amlogic_Tv_processCmd(JNIEnv *env, jobject thiz, jobject pObj, jobject rObj) +{ + sp<Tv> tv = get_native_tv(env, thiz, NULL); + if (tv == 0) return -1; + + Parcel *p = parcelForJavaObject(env, pObj); + //jclass clazz; + //clazz = env->FindClass("android/os/Parcel"); + //LOG_FATAL_IF(clazz == NULL, "Unable to find class android.os.Parcel"); + + + //jmethodID mConstructor = env->GetMethodID(clazz, "<init>", "(I)V"); + //jobject replayobj = env->NewObject(clazz, mConstructor, 0); + Parcel *r = parcelForJavaObject(env, rObj); + + + return tv->processCmd(*p, r); + //if ( != NO_ERROR) { + // jniThrowException(env, "java/lang/RuntimeException", "StartTv failed"); + // return -1; + // } + //return 0; +} + +static void android_amlogic_Tv_addCallbackBuffer(JNIEnv *env, jobject thiz, jbyteArray bytes) +{ + JNITvContext *context = reinterpret_cast<JNITvContext *>(env->GetIntField(thiz, fields.context)); + + ALOGD("addCallbackBuffer"); + if (context != NULL) { + context->addCallbackBuffer(env, bytes); + } +} + +static void android_amlogic_Tv_reconnect(JNIEnv *env, jobject thiz) +{ + sp<Tv> tv = get_native_tv(env, thiz, NULL); + if (tv == 0) return; + + if (tv->reconnect() != NO_ERROR) { + jniThrowException(env, "java/io/IOException", "reconnect failed"); + return; + } +} + +static void android_amlogic_Tv_lock(JNIEnv *env, jobject thiz) +{ + sp<Tv> tv = get_native_tv(env, thiz, NULL); + if (tv == 0) return; + + ALOGD("lock"); + + if (tv->lock() != NO_ERROR) { + jniThrowException(env, "java/lang/RuntimeException", "lock failed"); + } +} + +static void android_amlogic_Tv_unlock(JNIEnv *env, jobject thiz) +{ + sp<Tv> tv = get_native_tv(env, thiz, NULL); + if (tv == 0) return; + + ALOGD("unlock"); + + if (tv->unlock() != NO_ERROR) { + jniThrowException(env, "java/lang/RuntimeException", "unlock failed"); + } +} + +static void android_amlogic_Tv_create_subtitle_bitmap(JNIEnv *env, jobject thiz, jobject bmpobj) +{ + ALOGD("create subtitle bmp"); + sp<Tv> tv = get_native_tv(env, thiz, NULL); + if (tv == 0) return; + + //get skbitmap + jclass bmp_clazz; + jfieldID skbmp_fid; + jint hbmp; + bmp_clazz = env->FindClass("android/graphics/Bitmap"); + skbmp_fid = env->GetFieldID(bmp_clazz, "mNativeBitmap", "I"); + hbmp = env->GetIntField(bmpobj, skbmp_fid); + SkBitmap *pSkBmp = reinterpret_cast<SkBitmap *>(hbmp); + ALOGD("pSkBmp = %d", hbmp); + ALOGD("bmp width = %d height = %d", pSkBmp->width(), pSkBmp->height()); + env->DeleteLocalRef(bmp_clazz); + + //alloc share mem + sp<MemoryHeapBase> MemHeap = new MemoryHeapBase(1920 * 1080 * 4, 0, "subtitle bmp"); + ALOGD("heap id = %d", MemHeap->getHeapID()); + if (MemHeap->getHeapID() < 0) { + return; + } + sp<MemoryBase> MemBase = new MemoryBase(MemHeap, 0, 1920 * 1080 * 4); + pSkBmp->setPixels(MemBase->pointer()); + + + //send share mem to server + tv->createSubtitle(MemBase); + return; +} + +static void android_amlogic_Tv_create_video_frame_bitmap(JNIEnv *env, jobject thiz, jobject bmpobj ) +{ + ALOGD("create video frame bmp"); + sp<Tv> tv = get_native_tv(env, thiz, NULL); + if (tv == 0) return; + + //get skbitmap + jclass bmp_clazz; + jfieldID skbmp_fid; + jint hbmp; + bmp_clazz = env->FindClass("android/graphics/Bitmap"); + skbmp_fid = env->GetFieldID(bmp_clazz, "mNativeBitmap", "I"); + hbmp = env->GetIntField(bmpobj, skbmp_fid); + SkBitmap *pSkBmp = reinterpret_cast<SkBitmap *>(hbmp); + ALOGD("pSkBmp = %d", hbmp); + ALOGD("bmp width = %d height = %d", pSkBmp->width(), pSkBmp->height()); + env->DeleteLocalRef(bmp_clazz); + + //alloc share mem + sp<MemoryHeapBase> MemHeap = new MemoryHeapBase(1280 * 720 * 4 + 1, 0, "video frame bmp"); + ALOGD("heap id = %d", MemHeap->getHeapID()); + if (MemHeap->getHeapID() < 0) { + return; + } + sp<MemoryBase> MemBase = new MemoryBase(MemHeap, 0, 1280 * 720 * 4 + 1); + pSkBmp->setPixels(MemBase->pointer()); + + + //send share mem to server + tv->createVideoFrame(MemBase); + return; +} + +//------------------------------------------------- + +static JNINativeMethod camMethods[] = { + { + "native_setup", + "(Ljava/lang/Object;)V", + (void *)android_amlogic_Tv_native_setup + }, + { + "native_release", + "()V", + (void *)android_amlogic_Tv_release + }, + { + "processCmd", + "(Landroid/os/Parcel;Landroid/os/Parcel;)I", + (void *)android_amlogic_Tv_processCmd + }, + { + "addCallbackBuffer", + "([B)V", + (void *)android_amlogic_Tv_addCallbackBuffer + }, + { + "reconnect", + "()V", + (void *)android_amlogic_Tv_reconnect + }, + { + "lock", + "()V", + (void *)android_amlogic_Tv_lock + }, + { + "unlock", + "()V", + (void *)android_amlogic_Tv_unlock + }, + { + "native_create_subtitle_bitmap", + "(Ljava/lang/Object;)V", + (void *)android_amlogic_Tv_create_subtitle_bitmap + }, + { + "native_create_video_frame_bitmap", + "(Ljava/lang/Object;)V", + (void *)android_amlogic_Tv_create_video_frame_bitmap + }, + +}; + +struct field { + const char *class_name; + const char *field_name; + const char *field_type; + jfieldID *jfield; +}; + +static int find_fields(JNIEnv *env, field *fields, int count) +{ + for (int i = 0; i < count; i++) { + field *f = &fields[i]; + jclass clazz = env->FindClass(f->class_name); + if (clazz == NULL) { + ALOGE("Can't find %s", f->class_name); + return -1; + } + + jfieldID field = env->GetFieldID(clazz, f->field_name, f->field_type); + if (field == NULL) { + ALOGE("Can't find %s.%s", f->class_name, f->field_name); + return -1; + } + + *(f->jfield) = field; + } + + return 0; +} + +// Get all the required offsets in java class and register native functions +int register_android_amlogic_Tv(JNIEnv *env) +{ + field fields_to_find[] = { + { "android/amlogic/Tv", "mNativeContext", "I", &fields.context } + }; + + ALOGD("register_android_amlogic_Tv."); + + if (find_fields(env, fields_to_find, NELEM(fields_to_find)) < 0) + return -1; + + jclass clazz = env->FindClass("android/amlogic/Tv"); + fields.post_event = env->GetStaticMethodID(clazz, "postEventFromNative", "(Ljava/lang/Object;ILandroid/os/Parcel;)V"); + if (fields.post_event == NULL) { + ALOGE("Can't find android/amlogic/Tv.postEventFromNative"); + return -1; + } + + // Register native functions + return AndroidRuntime::registerNativeMethods(env, "android/amlogic/Tv", camMethods, NELEM(camMethods)); +} + + +jint JNI_OnLoad(JavaVM *vm, void *reserved) +{ + JNIEnv *env = NULL; + jint result = -1; + + if (vm->GetEnv((void **) &env, JNI_VERSION_1_4) != JNI_OK) { + ALOGE("ERROR: GetEnv failed\n"); + goto bail; + } + assert(env != NULL); + + register_android_amlogic_Tv(env); + + /* success -- return valid version number */ + result = JNI_VERSION_1_4; +bail: + return result; +} + diff --git a/tvapi/android/jni/cfbc_jni.cpp b/tvapi/android/jni/cfbc_jni.cpp new file mode 100644 index 0000000..7ec7d86 --- a/dev/null +++ b/tvapi/android/jni/cfbc_jni.cpp @@ -0,0 +1,167 @@ +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <assert.h> +#include "jni.h" +#include "JNIHelp.h" +#include "android_runtime/AndroidRuntime.h" +#include "tv/CFbcCommunication.h" + +#define TAG "joey_jni" +#define JNI_DBG(a...) __android_log_print(ANDROID_LOG_INFO, TAG, a) +#define MAX_CNT 128 + +static JNIEnv *jni_local_env = NULL; +static jclass jni_local_clz = NULL; +static jobject jni_local_obj = NULL; +static jmethodID jni_local_mid = NULL; +static JavaVM *m_vm = NULL; +static CFbcCommunication *g_cfbc_handle = NULL; + +JNIEnv *getJNIEnv(bool *needsDetach) +{ + JNIEnv *env = NULL; + jint result = -1; + if (m_vm->GetEnv((void **) &env, JNI_VERSION_1_4) != JNI_OK) { + __android_log_print(ANDROID_LOG_INFO, TAG, "ERROR: GetEnv failed\n"); + + int status = m_vm->AttachCurrentThread(&env, NULL); + if (status < 0) { + __android_log_print(ANDROID_LOG_INFO, TAG, "callback_handler: failed to attach current thread"); + return NULL; + } + + *needsDetach = true; + } + + __android_log_print(ANDROID_LOG_INFO, TAG, "GetEnv Success"); + return env; +} + +void detachJNI() +{ + int result = m_vm->DetachCurrentThread(); + if (result != JNI_OK) { + __android_log_print(ANDROID_LOG_INFO, TAG, "thread detach failed: %#x", result); + } +} + +//this data buf is same as cmd buf +void java_jni_callback(char *str, int cnt, int data_buf[]) +{ + char temp_str[MAX_CNT]; + int idx = 0; + if (str != NULL && cnt > 0) { + memset(temp_str, 0, sizeof(temp_str)); + JNI_DBG("java jni string is:\n%s, cnt:%d.", str, cnt); + //strcpy(temp_str, "Call From C/C++!"); + memcpy(temp_str, str, strlen(str) % MAX_CNT); + + if (NULL != jni_local_obj) { + bool needsDetach = false; + jint j_cnt = data_buf[1]; + jint j_data_buf[MAX_CNT]; + for (idx = 0; idx < j_cnt; idx++) { + idx %= MAX_CNT; + j_data_buf[idx] = data_buf[idx]; + JNI_DBG("java_jni_callback the %d data is:0x%x, %d.", idx, j_data_buf[idx], data_buf[idx]); + } + + //jobject obj; + jni_local_env = getJNIEnv(&needsDetach); + //obj = (*jni_local_env)->NewGlobalRef(jni_local_env,jni_local_obj); + jni_local_clz = jni_local_env->GetObjectClass(jni_local_obj); + //this func name and parameters should be same as the callback defined in java code + jni_local_mid = jni_local_env->GetMethodID(jni_local_clz, "android_java_callback", "(Ljava/lang/String;[I)I"); + + jstring str1 = jni_local_env->NewStringUTF(temp_str); + + jintArray cc_data_arr = jni_local_env->NewIntArray(j_cnt); + jni_local_env->SetIntArrayRegion(cc_data_arr, 0, cnt, j_data_buf); + //jint *temp_data = jni_local_env->GetIntArrayElements(cc_data_arr, NULL); + + jint cnt = jni_local_env->CallIntMethod(jni_local_obj, jni_local_mid, str1, cc_data_arr); + + //jni_local_env->ReleaseIntArrayElements(cc_data_arr, temp_data, 0); + //jni_local_env->ReleaseIntArrayElements(cc_cmd_arr, temp_cmd, 0); + JNI_DBG("%s %d be called.", __FUNCTION__, __LINE__); + + if (needsDetach) { + detachJNI(); + } + } + } +} + +//here we needn't to match the java package name +static jint jni_java_exec_cmd(JNIEnv *env, jobject obj, jintArray cmdArray) +{ + jint *arry = env->GetIntArrayElements(cmdArray, NULL); + jint length = env->GetArrayLength(cmdArray); + + int cmd_cnt = arry[1], idx = 0; + int cmd_array[MAX_CNT]; + memset(cmd_array, 0, sizeof(cmd_array)); + for (idx = 0; idx < cmd_cnt; idx++) + cmd_array[idx] = arry[idx]; + + JNI_DBG("%s %s %d be called.", __FILE__, __FUNCTION__, __LINE__); + + if (g_cfbc_handle == NULL) { + g_cfbc_handle = new CFbcCommunication(); + g_cfbc_handle->run("cfbc_thread", 0, 0); + } + + //g_cfbc_handle->handleCmd(COMM_DEV_CEC, cmd_array); + //c_exec_cmd(cmd_array); + + if (NULL == jni_local_obj) { + jni_local_obj = env->NewGlobalRef(obj); + } + +#if 0 + /* this is used to terminate the jni call if needed + ** and we should handle the pthread we create in c layer + */ + if (cmd_array[0] == 0x1002) { + if (NULL != jni_local_obj) + env->DeleteGlobalRef(jni_local_obj); + } +#endif + return 0; +} + +//the name of 'exec_cmd' should be same as the native func in java code +static JNINativeMethod gMethods[] = { + {"exec_cmd", "([I)I", (void *)jni_java_exec_cmd}, +}; + +static int register_android_MyFunc(JNIEnv *env) +{ + JNI_DBG("%s %s %d be called.", __FILE__, __FUNCTION__, __LINE__); + //the name below should be same as the class name in which native method declared in Java layer + return android::AndroidRuntime::registerNativeMethods(env, "com/fbc/MyFunc", gMethods, NELEM(gMethods)); +} + +jint JNI_OnLoad(JavaVM *vm, void *reserved) +{ + JNIEnv *env = NULL; + JNI_DBG("%s %s %d be called.", __FILE__, __FUNCTION__, __LINE__); + //c_set_callback(&java_jni_callback); + if (vm->GetEnv((void **)&env, JNI_VERSION_1_4) != JNI_OK) { + JNI_DBG("Error GetEnv\n"); + return -1; + } + + assert(env != NULL); + if (register_android_MyFunc(env) < 0) { + JNI_DBG("register_android_test_hdi error.\n"); + return -1; + } + + m_vm = vm; + return JNI_VERSION_1_4; +} diff --git a/tvapi/android/jni/cfbc_test.cpp b/tvapi/android/jni/cfbc_test.cpp new file mode 100644 index 0000000..ecba2e6 --- a/dev/null +++ b/tvapi/android/jni/cfbc_test.cpp @@ -0,0 +1,43 @@ +#include "stdlib.h" +#include "stdio.h" +#include "tv/CFbcCommunication.h" + +int main(int argc, char **argv) +{ + int idx = 0, send_buf[128], recv_buf[128], cmd_value = 1, run_flag = 0, run_cnt = 0, cmd_type = 0, read_flag = 0; + printf("run begin.......\n"); + if (argc < 4) { + printf("usage:./libcfbc_jni cmd_type cmd_value run_cnt(all hex mode)\n"); + return 0; + } + + cmd_type = strtol(argv[1], NULL, 16); + cmd_value = strtol(argv[2], NULL, 16); + run_cnt = strtol(argv[3], NULL, 16); + + CFbcCommunication *cfbcHandle = new CFbcCommunication(); + printf("to test.......\n"); + cfbcHandle->run(); + sleep(0.2); + + switch (cmd_type) { + default: + for (idx = 0; idx < run_cnt; idx++) { + memset(send_buf, 0, sizeof(send_buf)); + memset(recv_buf, 0, sizeof(recv_buf)); + send_buf[0] = cmd_type; + send_buf[1] = 3; + send_buf[2] = cmd_value; + printf("\n\n======%d to set value is:0x%02x\n", idx, cmd_value); + cfbcHandle->handleCmd(COMM_DEV_SERIAL, send_buf, recv_buf); + sleep(1); + } + break; + } + + printf("wait to exit......\n"); + cfbcHandle->requestExitAndWait(); + delete cfbcHandle; + printf("program exited\n"); + return 0; +} diff --git a/tvapi/android/libtvbinder/Android.mk b/tvapi/android/libtvbinder/Android.mk new file mode 100644 index 0000000..e7820a3 --- a/dev/null +++ b/tvapi/android/libtvbinder/Android.mk @@ -0,0 +1,24 @@ +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := optional + +LOCAL_SRC_FILES:= \ + Tv.cpp \ + ITv.cpp \ + ITvClient.cpp \ + ITvService.cpp + +LOCAL_SHARED_LIBRARIES := \ + libcutils \ + libutils \ + libbinder \ + libui + +LOCAL_MODULE:= libtvbinder + +LOCAL_C_INCLUDES += \ + $(LOCAL_PATH)/../ + +LOCAL_PRELINK_MODULE := false +include $(BUILD_SHARED_LIBRARY) diff --git a/tvapi/android/libtvbinder/ITv.cpp b/tvapi/android/libtvbinder/ITv.cpp new file mode 100644 index 0000000..aa81345 --- a/dev/null +++ b/tvapi/android/libtvbinder/ITv.cpp @@ -0,0 +1,145 @@ +//#define LOG_NDEBUG 0 +#define LOG_TAG "ITv" +#include <utils/Log.h> +#include <stdint.h> +#include <sys/types.h> +#include <binder/Parcel.h> +#include <include/ITv.h> + +enum { + DISCONNECT = IBinder::FIRST_CALL_TRANSACTION, + START_PREVIEW, + SEND_COMMAND, + CONNECT, + LOCK, + UNLOCK, + TV_CMD, + TV_CREATE_SUBTITLE, + TV_CREATE_VIDEO_FRAME, +}; + +class BpTv: public BpInterface<ITv> +{ +public: + BpTv(const sp<IBinder> &impl) + : BpInterface<ITv>(impl) + { + } + + // disconnect from tv service + void disconnect() + { + Parcel data, reply; + data.writeInterfaceToken(ITv::getInterfaceDescriptor()); + remote()->transact(DISCONNECT, data, &reply); + } + + status_t processCmd(const Parcel &p, Parcel *r) + { + Parcel data, reply; + data.writeInterfaceToken(ITv::getInterfaceDescriptor()); + data.write(p.data(), p.dataSize()); + remote()->transact(TV_CMD, data, &reply); + r->write(reply.data(), reply.dataSize()); + r->setDataPosition(0); + return 0; + } + + virtual status_t createVideoFrame(const sp<IMemory> &share_mem) + { + Parcel data, reply; + data.writeInterfaceToken(ITv::getInterfaceDescriptor()); + data.writeStrongBinder(share_mem->asBinder()); + remote()->transact(TV_CREATE_VIDEO_FRAME, data, &reply); + return reply.readInt32(); + } + + virtual status_t createSubtitle(const sp<IMemory> &share_mem) + { + Parcel data, reply; + data.writeInterfaceToken(ITv::getInterfaceDescriptor()); + data.writeStrongBinder(share_mem->asBinder()); + remote()->transact(TV_CREATE_SUBTITLE, data, &reply); + return reply.readInt32(); + } + virtual status_t connect(const sp<ITvClient> &tvClient) + { + Parcel data, reply; + data.writeInterfaceToken(ITv::getInterfaceDescriptor()); + data.writeStrongBinder(tvClient->asBinder()); + remote()->transact(CONNECT, data, &reply); + return reply.readInt32(); + } + virtual status_t lock() + { + Parcel data, reply; + data.writeInterfaceToken(ITv::getInterfaceDescriptor()); + remote()->transact(LOCK, data, &reply); + return reply.readInt32(); + } + virtual status_t unlock() + { + Parcel data, reply; + data.writeInterfaceToken(ITv::getInterfaceDescriptor()); + remote()->transact(UNLOCK, data, &reply); + return reply.readInt32(); + } +}; + +IMPLEMENT_META_INTERFACE(Tv, "android.amlogic.ITv"); + +status_t BnTv::onTransact( + uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) +{ + switch (code) { + case DISCONNECT: { + CHECK_INTERFACE(ITv, data, reply); + disconnect(); + return NO_ERROR; + } + break; + case CONNECT: { + CHECK_INTERFACE(ITv, data, reply); + sp<ITvClient> tvClient = interface_cast<ITvClient>(data.readStrongBinder()); + reply->writeInt32(connect(tvClient)); + return NO_ERROR; + } + break; + case LOCK: { + CHECK_INTERFACE(ITv, data, reply); + reply->writeInt32(lock()); + return NO_ERROR; + } + break; + case UNLOCK: { + CHECK_INTERFACE(ITv, data, reply); + reply->writeInt32(unlock()); + return NO_ERROR; + } + break; + case TV_CMD: { + CHECK_INTERFACE(ITv, data, reply); + processCmd(data, reply); + //reply->write(tmp.data(), tmp.dataSize()); + return NO_ERROR; + } + case TV_CREATE_SUBTITLE: { + CHECK_INTERFACE(ITv, data, reply); + sp<IMemory> buffer = interface_cast<IMemory>(data.readStrongBinder()); + createSubtitle(buffer); + //reply->write(tmp.data(), tmp.dataSize()); + return NO_ERROR; + } + case TV_CREATE_VIDEO_FRAME: { + CHECK_INTERFACE(ITv, data, reply); + sp<IMemory> buffer = interface_cast<IMemory>(data.readStrongBinder()); + createVideoFrame(buffer); + //reply->write(tmp.data(), tmp.dataSize()); + return NO_ERROR; + } + break; + default: + return BBinder::onTransact(code, data, reply, flags); + } +} + diff --git a/tvapi/android/libtvbinder/ITvClient.cpp b/tvapi/android/libtvbinder/ITvClient.cpp new file mode 100644 index 0000000..fc6d9bb --- a/dev/null +++ b/tvapi/android/libtvbinder/ITvClient.cpp @@ -0,0 +1,59 @@ +#define LOG_TAG "ITvClient" +#include <utils/Log.h> +#include <stdint.h> +#include <sys/types.h> +#include <include/ITvClient.h> +#include "../include/tvcmd.h" +enum { + NOTIFY_CALLBACK = IBinder::FIRST_CALL_TRANSACTION, +}; + +class BpTvClient: public BpInterface<ITvClient> +{ +public: + BpTvClient(const sp<IBinder> &impl) : + BpInterface<ITvClient> (impl) + { + } + + // generic callback from tv service to app + void notifyCallback(int32_t msgType, const Parcel &p) + { + ALOGV("BpTvClient notifyCallback datasize = %d pos = %d", p.dataSize(), p.dataPosition()); + Parcel data, reply; + data.writeInterfaceToken(ITvClient::getInterfaceDescriptor()); + data.writeInt32(msgType); + data.write(p.data(), p.dataSize()); + remote()->transact(NOTIFY_CALLBACK, data, &reply, IBinder::FLAG_ONEWAY); + } +}; + +IMPLEMENT_META_INTERFACE(TvClient, "android.amlogic.ITvClient"); + +// ---------------------------------------------------------------------- +status_t BnTvClient::onTransact(uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) +{ + int i = 0, loop_count = 0; + + switch (code) { + case NOTIFY_CALLBACK: { + CHECK_INTERFACE(ITvClient, data, reply); + Parcel ext; + int32_t msgType = data.readInt32(); + + ext.appendFrom(const_cast<Parcel *>(&data), data.dataPosition(), data.dataAvail()); + + + switch (msgType) { + default: + ALOGE("BnTvClient::onTransact NOTIFY_CALLBACK msg type ----= %d", msgType); + break; + } + notifyCallback(msgType, ext); + return NO_ERROR; + } + break; + default: + return BBinder::onTransact(code, data, reply, flags); + } +} diff --git a/tvapi/android/libtvbinder/ITvService.cpp b/tvapi/android/libtvbinder/ITvService.cpp new file mode 100644 index 0000000..d68c60d --- a/dev/null +++ b/tvapi/android/libtvbinder/ITvService.cpp @@ -0,0 +1,51 @@ + +#include <stdint.h> +#include <sys/types.h> +#include <utils/Log.h> +#include <binder/Parcel.h> +#include <binder/IPCThreadState.h> +#include <binder/IServiceManager.h> + +#include <include/ITvService.h> + +class BpTvService: public BpInterface<ITvService> +{ +public: + BpTvService(const sp<IBinder> &impl) + : BpInterface<ITvService>(impl) + { + } + + // connect to tv service + virtual sp<ITv> connect(const sp<ITvClient> &tvClient) + { + Parcel data, reply; + data.writeInterfaceToken(ITvService::getInterfaceDescriptor()); + data.writeStrongBinder(tvClient->asBinder()); + remote()->transact(BnTvService::CONNECT, data, &reply); + return interface_cast<ITv>(reply.readStrongBinder()); + } +}; + +IMPLEMENT_META_INTERFACE(TvService, "android.amlogic.ITvService"); + +// ---------------------------------------------------------------------- + +status_t BnTvService::onTransact( + uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) +{ + switch (code) { + case CONNECT: { + CHECK_INTERFACE(ITvService, data, reply); + sp<ITvClient> tvClient = interface_cast<ITvClient>(data.readStrongBinder()); + sp<ITv> tv = connect(tvClient); + ALOGD("BnTvService::onTransact( sp<ITv> tv = connect(tvClient);"); + reply->writeStrongBinder(tv->asBinder()); + return NO_ERROR; + } + break; + default: + return BBinder::onTransact(code, data, reply, flags); + } +} + diff --git a/tvapi/android/libtvbinder/Tv.cpp b/tvapi/android/libtvbinder/Tv.cpp new file mode 100644 index 0000000..29935d1 --- a/dev/null +++ b/tvapi/android/libtvbinder/Tv.cpp @@ -0,0 +1,189 @@ +#define LOG_TAG "Tv" +#include <utils/Log.h> +#include <utils/threads.h> +#include <signal.h> +#include <binder/IServiceManager.h> +#include <binder/IMemory.h> + +#include <include/Tv.h> +#include <include/ITvService.h> + +// client singleton for tv service binder interface +Mutex Tv::mLock; +sp<ITvService> Tv::mTvService; +sp<Tv::DeathNotifier> Tv::mDeathNotifier; + +// establish binder interface to tv service +const sp<ITvService> &Tv::getTvService() +{ + Mutex::Autolock _l(mLock); + if (mTvService.get() == 0) { + sp<IServiceManager> sm = defaultServiceManager(); + sp<IBinder> binder; + do { + binder = sm->getService(String16("aml.tvserver")); + if (binder != 0) + break; + ALOGW("TvService not published, waiting..."); + usleep(500000); // 0.5 s + } while (true); + if (mDeathNotifier == NULL) { + mDeathNotifier = new DeathNotifier(); + } + binder->linkToDeath(mDeathNotifier); + mTvService = interface_cast<ITvService>(binder); + } + ALOGE_IF(mTvService == 0, "no TvService!?"); + return mTvService; +} + +Tv::Tv() +{ + init(); +} + +// construct a tv client from an existing tv remote +sp<Tv> Tv::create(const sp<ITv> &tv) +{ + ALOGD("create"); + if (tv == 0) { + ALOGE("tv remote is a NULL pointer"); + return 0; + } + + sp<Tv> c = new Tv(); + if (tv->connect(c) == NO_ERROR) { + c->mStatus = NO_ERROR; + c->mTv = tv; + tv->asBinder()->linkToDeath(c); + } + return c; +} + +void Tv::init() +{ + mStatus = UNKNOWN_ERROR; +} + +Tv::~Tv() +{ + disconnect(); +} + +sp<Tv> Tv::connect() +{ + ALOGD("Tv::connect------------------------------------------"); + sp<Tv> c = new Tv(); + const sp<ITvService> &cs = getTvService(); + if (cs != 0) { + c->mTv = cs->connect(c); + } + if (c->mTv != 0) { + c->mTv->asBinder()->linkToDeath(c); + c->mStatus = NO_ERROR; + } else { + c.clear(); + } + return c; +} + +void Tv::disconnect() +{ + ALOGD("disconnect"); + if (mTv != 0) { + mTv->disconnect(); + mTv->asBinder()->unlinkToDeath(this); + mTv = 0; + } +} + +status_t Tv::reconnect() +{ + ALOGD("reconnect"); + sp <ITv> c = mTv; + if (c == 0) return NO_INIT; + return c->connect(this); +} + +sp<ITv> Tv::remote() +{ + return mTv; +} + +status_t Tv::lock() +{ + sp <ITv> c = mTv; + if (c == 0) return NO_INIT; + return c->lock(); +} + +status_t Tv::unlock() +{ + sp <ITv> c = mTv; + if (c == 0) return NO_INIT; + return c->unlock(); +} + +status_t Tv::processCmd(const Parcel &p, Parcel *r) +{ + sp <ITv> c = mTv; + if (c == 0) return NO_INIT; + return c->processCmd(p, r); +} + +// +status_t Tv::createSubtitle(const sp<IMemory> &share_mem) +{ + sp <ITv> c = mTv; + if (c == 0) return NO_INIT; + return c->createSubtitle(share_mem); +} + +status_t Tv::createVideoFrame(const sp<IMemory> &share_mem) +{ + sp <ITv> c = mTv; + if (c == 0) return NO_INIT; + return c->createVideoFrame(share_mem); +} + + +void Tv::setListener(const sp<TvListener> &listener) +{ + ALOGD("tv------------Tv::setListener"); + Mutex::Autolock _l(mLock); + mListener = listener; +} + + +// callback from tv service +void Tv::notifyCallback(int32_t msgType, const Parcel &p) +{ + int size = p.dataSize(); + int pos = p.dataPosition(); + p.setDataPosition(0); + sp<TvListener> listener; + { + Mutex::Autolock _l(mLock); + listener = mListener; + } + if (listener != NULL) { + listener->notify(msgType, p); + } +} + +void Tv::binderDied(const wp<IBinder> &who) +{ + ALOGW("ITv died"); + //notifyCallback(1, 2, 0); +} + +void Tv::DeathNotifier::binderDied(const wp<IBinder> &who) +{ + ALOGW("-----------------binderDied"); + Mutex::Autolock _l(Tv::mLock); + Tv::mTvService.clear(); + ALOGW("kill myself"); + kill(getpid(), SIGKILL); + ALOGW("----------------Tv server died!"); +} + diff --git a/tvapi/android/tvserver/Android.mk b/tvapi/android/tvserver/Android.mk new file mode 100644 index 0000000..34c9eed --- a/dev/null +++ b/tvapi/android/tvserver/Android.mk @@ -0,0 +1,85 @@ +LOCAL_PATH:= $(call my-dir) + + +DVB_PATH := $(wildcard external/dvb) + +ifeq ($(DVB_PATH), ) + DVB_PATH := $(wildcard vendor/amlogic/dvb) +endif + +AM_LIBPLAYER_PATH := $(wildcard vendor/amlogic/frameworks/av/LibPlayer) +LIB_ZVBI_PATH := $(wildcard external/libzvbi) +LIB_SQLITE_PATH := $(wildcard external/sqlite) + + +#tvserver +include $(CLEAR_VARS) + + + +LOCAL_MODULE_TAGS := optional + +LOCAL_SRC_FILES:= \ + TvService.cpp + +LOCAL_SHARED_LIBRARIES := \ + libtv + +LOCAL_SHARED_LIBRARIES += \ + libui \ + libutils \ + libbinder \ + libcutils \ + libsqlite \ + libmedia \ + libtvbinder \ + libhardware_legacy \ + libdl \ + libskia \ + libtinyxml + +LOCAL_SHARED_LIBRARIES += \ + libzvbi \ + libntsc_decode \ + libam_mw \ + libam_adp \ + libam_ver + +LOCAL_STATIC_LIBRARIES := \ + lib$(strip $(TVAPI_TARGET_BOARD_VERSION)) +LOCAL_C_INCLUDES := \ + $(LOCAL_PATH)/../../libtv \ + $(LOCAL_PATH)/../ \ + $(LOCAL_PATH)/../../libtv/tvdb \ + $(LOCAL_PATH)/../../libtv/tv \ + $(LOCAL_PATH)/../../libtv/include \ + $(LOCAL_PATH)/../../build/include \ + $(LOCAL_PATH)/../../libtv/projects + +LOCAL_C_INCLUDES += \ + bionic/libc/include \ + bionic/libc/private \ + system/extras/ext4_utils \ + $(LOCAL_PATH)/../ \ + $(LIB_SQLITE_PATH)/dist \ + system/media/audio_effects/include + + +LOCAL_C_INCLUDES += \ + $(LIB_ZVBI_PATH)/ntsc_decode/include \ + $(LIB_ZVBI_PATH)/ntsc_decode/include/ntsc_dmx \ + $(LIB_ZVBI_PATH)/src \ + $(DVB_PATH)/include/am_adp \ + $(DVB_PATH)/include/am_mw \ + $(DVB_PATH)/include/am_ver \ + $(DVB_PATH)/android/ndk/include \ + $(AM_LIBPLAYER_PATH)/amadec/include \ + $(AM_LIBPLAYER_PATH)/amcodec/include \ + $(AM_LIBPLAYER_PATH)/amffmpeg \ + $(AM_LIBPLAYER_PATH)/amplayer + +LOCAL_CFLAGS += -DTARGET_BOARD_$(strip $(TVAPI_TARGET_BOARD_VERSION)) + +LOCAL_MODULE:= libtvserver + +include $(BUILD_SHARED_LIBRARY) diff --git a/tvapi/android/tvserver/TvService.cpp b/tvapi/android/tvserver/TvService.cpp new file mode 100644 index 0000000..72406df --- a/dev/null +++ b/tvapi/android/tvserver/TvService.cpp @@ -0,0 +1,4375 @@ +#include <utils/Log.h> +#include <binder/IServiceManager.h> +#include <binder/IPCThreadState.h> +#include <utils/String16.h> +#include <utils/Errors.h> +#include <binder/MemoryBase.h> +#include <binder/MemoryHeapBase.h> +#include <include/ITvService.h> +#include <hardware/hardware.h> +#include "TvService.h" +#include <cutils/atomic.h> +#include <cutils/properties.h> +#include <stdint.h> +#include <tvconfig/tvconfig.h> +#include <tvsetting/CTvSetting.h> +#include <audio/audio_api.h> +#include <tvutils/tvutils.h> +#include <version/version.h> +#include "../include/tvcmd.h" +#include "tv/CTvLog.h" +#include <tvdb/CTvRegion.h> +#include <xxxconfig.h> +extern "C" { +#include <stdio.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <pthread.h> +#include <signal.h> +#include "make_ext4fs.h" +#include "am_ver.h" +} +#define LOG_TAG "TvService" + +#define PICTURE_TIMEOUT seconds(5) + +static int getCallingPid() +{ + return IPCThreadState::self()->getCallingPid(); +} + +void TvService::instantiate(CTv *pTv) +{ + defaultServiceManager()->addService(String16("aml.tvserver"), new TvService( pTv)); +} + +TvService::TvService(CTv *pTv) : + BnTvService() +{ + mpStartTvClient = NULL; + mpScannerClient = NULL; + mUsers = 0; + mpTv = pTv; + mpTv->setTvObserver(this); + mCapVidFrame.setObserver(this); + mpTv->OpenTv(); +} + + +TvService::~TvService() +{ + mpStartTvClient = NULL; + mpScannerClient = NULL; + int client_size = m_v_Clients.size(); + wp<Client> client; + for (int i = 0; i < client_size; i++) { + client = m_v_Clients[i]; + if (client != 0) { + LOGW("some client still connect it!"); + } + } + if (mpTv != NULL) { + delete mpTv; + mpTv = NULL; + } +} + +void TvService::onTvEvent(const CTvEv &ev) +{ + int type = ev.getEvType(); + LOGD("TvService::onTvEvent ev type = %d", type); + switch (type) { + case CTvEv::TV_EVENT_COMMOM: { + break; + } + case CTvEv::TV_EVENT_SCANNER: { + CTvScanner::ScannerEvent *pScannerEv = (CTvScanner::ScannerEvent *) (&ev); + if (mpScannerClient != NULL) { + sp<Client> ScannerClient = mpScannerClient.promote(); + if (ScannerClient != 0) { + Parcel p; + p.writeInt32(pScannerEv->mType); + p.writeInt32(pScannerEv->mPercent); + p.writeInt32(pScannerEv->mTotalChannelCount); + p.writeInt32(pScannerEv->mLockedStatus); + p.writeInt32(pScannerEv->mChannelNumber); + p.writeInt32(pScannerEv->mFrequency); + p.writeString16(String16(pScannerEv->mProgramName)); + p.writeInt32(pScannerEv->mprogramType); + p.writeString16(String16(pScannerEv->mMSG)); + p.writeInt32(pScannerEv->mStrength); + p.writeInt32(pScannerEv->mSnr); + ScannerClient->notifyCallback(SCAN_EVENT_CALLBACK, p); + } + } + break; + } + case CTvEv::TV_EVENT_EPG: { + CTvEpg::EpgEvent *pEpgEvent = (CTvEpg::EpgEvent *) (&ev); + int client_size = m_v_Clients.size(); + wp<Client> client; + for (int i = 0; i < client_size; i++) { + client = m_v_Clients[i]; + if (client != 0) { + sp<Client> currentClient = client.promote(); + if (currentClient != 0) { + Parcel p; + p.writeInt32(pEpgEvent->type); + p.writeInt32(pEpgEvent->time); + p.writeInt32(pEpgEvent->programID); + p.writeInt32(pEpgEvent->channelID); + currentClient->getTvClient()->notifyCallback(EPG_EVENT_CALLBACK, p); + } + } + } + break; + } + case CTvEv::TV_EVENT_HDMI_IN_CAP: { + CTvScreenCapture::CapEvent *pCapEvt = (CTvScreenCapture::CapEvent *)(&ev); + int client_size = m_v_Clients.size(); + wp<Client> client; + for (int i = 0; i < client_size; i++) { + client = m_v_Clients[i]; + if (client != 0) { + sp<Client> currentClient = client.promote(); + if (currentClient != 0) { + Parcel p; + p.writeInt32(pCapEvt->mFrameNum); + p.writeInt32(pCapEvt->mFrameSize); + p.writeInt32(pCapEvt->mFrameWide); + p.writeInt32(pCapEvt->mFrameHeight); + currentClient->getTvClient()->notifyCallback(VFRAME_BMP_EVENT_CALLBACK, p); + } + } + } + break; + } + case CTvEv::TV_EVENT_AV_PLAYBACK: { + TvEvent::AVPlaybackEvent *pEv = (TvEvent::AVPlaybackEvent *)(&ev); + int client_size = m_v_Clients.size(); + wp<Client> client; + for (int i = 0; i < client_size; i++) { + client = m_v_Clients[i]; + if (client != 0) { + sp<Client> currentClient = client.promote(); + if (currentClient != 0) { + Parcel p; + p.writeInt32(pEv->mMsgType); + p.writeInt32(pEv->mProgramId); + currentClient->getTvClient()->notifyCallback(DTV_AV_PLAYBACK_CALLBACK, p); + } + } + } + break; + } + case CTvEv::TV_EVENT_SIGLE_DETECT: { + TvEvent::SignalInfoEvent *pEv = (TvEvent::SignalInfoEvent *)(&ev); + + int client_size = m_v_Clients.size(); + wp<Client> client; + for (int i = 0; i < client_size; i++) { + client = m_v_Clients[i]; + if (client != 0) { + sp<Client> currentClient = client.promote(); + if (currentClient != 0) { + Parcel p; + p.writeInt32(pEv->mTrans_fmt); + p.writeInt32(pEv->mFmt); + p.writeInt32(pEv->mStatus); + p.writeInt32(pEv->mReserved); + currentClient->getTvClient()->notifyCallback(SIGLE_DETECT_CALLBACK, p); + } + } + } + break; + } + case CTvEv::TV_EVENT_ADC_CALIBRATION: { + TvEvent::ADCCalibrationEvent *pEv = (TvEvent::ADCCalibrationEvent *)(&ev); + int client_size = m_v_Clients.size(); + wp<Client> client; + for (int i = 0; i < client_size; i++) { + client = m_v_Clients[i]; + if (client != 0) { + sp<Client> currentClient = client.promote(); + if (currentClient != 0) { + Parcel p; + p.writeInt32(pEv->mState); + currentClient->getTvClient()->notifyCallback(ADC_CALIBRATION_CALLBACK, p); + } + } + } + break; + } + case CTvEv::TV_EVENT_VGA: { //VGA + TvEvent::VGAEvent *pEv = (TvEvent::VGAEvent *)(&ev); + int client_size = m_v_Clients.size(); + wp<Client> client; + for (int i = 0; i < client_size; i++) { + client = m_v_Clients[i]; + if (client != 0) { + sp<Client> currentClient = client.promote(); + if (currentClient != 0) { + Parcel p; + p.writeInt32(pEv->mState); + currentClient->getTvClient()->notifyCallback(VGA_CALLBACK, p); + } + } + } + break; + } + case CTvEv::TV_EVENT_SOURCE_CONNECT: { + TvEvent::SourceConnectEvent *pEv = (TvEvent::SourceConnectEvent *)(&ev); + int client_size = m_v_Clients.size(); + wp<Client> client; + for (int i = 0; i < client_size; i++) { + client = m_v_Clients[i]; + if (client != 0) { + sp<Client> currentClient = client.promote(); + if (currentClient != 0) { + Parcel p; + p.writeInt32(pEv->mSourceInput); + p.writeInt32(pEv->connectionState); + currentClient->getTvClient()->notifyCallback(SOURCE_CONNECT_CALLBACK, p); + } + } + } + break; + } + case CTvEv::TV_EVENT_HDMIRX_CEC: { + TvEvent::HDMIRxCECEvent *pEv = (TvEvent::HDMIRxCECEvent *)(&ev); + int client_size = m_v_Clients.size(); + wp<Client> client; + for (int i = 0; i < client_size; i++) { + client = m_v_Clients[i]; + if (client != 0) { + sp<Client> currentClient = client.promote(); + if (currentClient != 0) { + Parcel p; + + p.writeInt32(pEv->mDataCount); + for (int j = 0; j < pEv->mDataCount; j++) { + p.writeInt32(pEv->mDataBuf[j]); + } + + currentClient->getTvClient()->notifyCallback(HDMIRX_CEC_CALLBACK, p); + } + } + } + break; + } + case CTvEv::TV_EVENT_UPGRADE_FBC: { + TvEvent::UpgradeFBCEvent *pEv = (TvEvent::UpgradeFBCEvent *)(&ev); + + int client_size = m_v_Clients.size(); + wp<Client> client; + for (int i = 0; i < client_size; i++) { + client = m_v_Clients[i]; + if (client != 0) { + sp<Client> currentClient = client.promote(); + if (currentClient != 0) { + Parcel p; + p.writeInt32(pEv->mState); + p.writeInt32(pEv->param); + currentClient->getTvClient()->notifyCallback(UPGRADE_FBC_CALLBACK, p); + } + } + } + break; + } + case CTvEv::TV_EVENT_SERIAL_COMMUNICATION: { + TvEvent::SerialCommunicationEvent *pEv = (TvEvent::SerialCommunicationEvent *)(&ev); + int client_size = m_v_Clients.size(); + wp<Client> client; + for (int i = 0; i < client_size; i++) { + client = m_v_Clients[i]; + if (client != 0) { + sp<Client> currentClient = client.promote(); + if (currentClient != 0) { + Parcel p; + + p.writeInt32(pEv->mDevId); + p.writeInt32(pEv->mDataCount); + for (int j = 0; j < pEv->mDataCount; j++) { + p.writeInt32(pEv->mDataBuf[j]); + } + + currentClient->getTvClient()->notifyCallback(SERIAL_COMMUNICATION_CALLBACK, p); + } + } + } + break; + } + + case CTvEv::TV_EVENT_2d4G_HEADSET: { + TvEvent::HeadSetOf2d4GEvent *pEv = (TvEvent::HeadSetOf2d4GEvent *)(&ev); + LOGD("SendDtvStats status: =%d para2: =%d", pEv->state, pEv->para); + int client_size = m_v_Clients.size(); + wp<Client> client; + for (int i = 0; i < client_size; i++) { + client = m_v_Clients[i]; + if (client != 0) { + sp<Client> currentClient = client.promote(); + if (currentClient != 0) { + Parcel p; + p.writeInt32(pEv->state); + p.writeInt32(pEv->para); + currentClient->getTvClient()->notifyCallback(HEADSET_STATUS_CALLBACK, p); + } + } + } + break; + } + + default: + break; + } +} + +sp<ITv> TvService::connect(const sp<ITvClient> &tvClient) +{ + int callingPid = getCallingPid(); + LOGD("TvService::connect E (pid %d, client %p)", callingPid, tvClient->asBinder().get()); + + Mutex::Autolock lock(mServiceLock); + + int client_size = m_v_Clients.size(); + wp<Client> client; + for (int i = 0; i < client_size; i++) { + client = m_v_Clients[i]; + if (client != 0) { + sp<Client> currentClient = client.promote(); + if (currentClient != 0) { + sp<ITvClient> currentTvClient(currentClient->getTvClient()); + if (tvClient->asBinder() == currentTvClient->asBinder()) { + LOGD("TvService::connect X (pid %d, same client %p) is reconnecting...", callingPid, tvClient->asBinder().get()); + return currentClient; + } else { + //LOGD("TvService::connect X (pid %d, new client %p) rejected. " + // "(old pid %d, old client %p)", callingPid, tvClient->asBinder().get(), currentClient->mClientPid, currentTvClient->asBinder().get()); + // if (kill(currentClient->mClientPid, 0) == -1 && errno == ESRCH) { + // LOGE("The old client is dead!"); + // } + //return client; + //return currentClient; + continue; + } + } else { + LOGE("client (pid %d) have delete ------------not exist", callingPid); + client.clear(); + m_v_Clients.removeAt(i); + client_size--; + continue; + } + } + } + + if (mUsers > 0) { + LOGE("Still have client, rejected"); + //return client; + } + LOGD("TvService::connect X 3"); + // client = new Client(this, tvClient, callingPid); + //mClient = client; + + sp<Client> newclient = new Client(this, tvClient, callingPid, mpTv); + m_v_Clients.add(newclient); + +#if DEBUG_CLIENT_REFERENCES + //client->trackMe(true, true); +#endif + //mCurClient = client; + LOGD("TvService::connect X 4"); + return newclient; +} + +void TvService::removeClient(const sp<ITvClient> &tvClient) +{ + int callingPid = getCallingPid(); + + Mutex::Autolock lock(mServiceLock); + + int client_size = m_v_Clients.size(); + wp<Client> client; + for (int i = 0; i < client_size; i++) { + client = m_v_Clients[i]; + if (client != 0) { + sp<Client> currentClient = client.promote(); + if (currentClient != 0) { + sp<ITvClient> currentTvClient(currentClient->getTvClient()); + if (tvClient->asBinder() == currentTvClient->asBinder()) { + LOGD("find client , and remove it pid = %d, client = %p i=%d", callingPid, tvClient->asBinder().get(), i); + client.clear(); + LOGD("find client , and remove it pid1 "); + m_v_Clients.removeAt(i); + LOGD("find client , and remove it pid2 "); + break; + } else { + LOGW("removeClient (pid %d): mClient doesn't match!", callingPid); + continue; + } + } else { + LOGW("removeclient currentClient == 0 (pid %d)", callingPid); + client.clear(); + m_v_Clients.removeAt(i); + client_size--; + continue; + } + } else { + LOGW("removeclient client == 0 (pid %d)", callingPid); + client.clear(); + m_v_Clients.removeAt(i); + client_size--; + continue; + } + } + + LOGD("removeClient (pid %d) done", callingPid); +} + +void TvService::incUsers() +{ + android_atomic_inc(&mUsers); +} + +void TvService::decUsers() +{ + android_atomic_dec(&mUsers); +} + +TvService::Client::Client(const sp<TvService> &tvService, const sp<ITvClient> &tvClient, pid_t clientPid, CTv *pTv) +{ + int callingPid = getCallingPid(); + LOGD("Client::Client E (pid %d)", callingPid); + mTvService = tvService; + mTvClient = tvClient; + mClientPid = clientPid; + tvService->incUsers(); + mpTv = pTv; + mIsStartTv = false; +} + +status_t TvService::Client::checkPid() +{ + int callingPid = getCallingPid(); + if (mClientPid == callingPid) + return NO_ERROR; + LOGD("Attempt to use locked tv (client %p) from different process " + " (old pid %d, new pid %d)", getTvClient()->asBinder().get(), mClientPid, callingPid); + return -EBUSY; +} + +status_t TvService::Client::lock() +{ + int callingPid = getCallingPid(); + LOGD("lock from pid %d (mClientPid %d)", callingPid, mClientPid); + Mutex::Autolock _l(mLock); + // lock tv to this client if the the tv is unlocked + if (mClientPid == 0) { + mClientPid = callingPid; + return NO_ERROR; + } + // returns NO_ERROR if the client already owns the tv, -EBUSY otherwise + return checkPid(); +} + +status_t TvService::Client::unlock() +{ + int callingPid = getCallingPid(); + LOGD("unlock from pid %d (mClientPid %d)", callingPid, mClientPid); + Mutex::Autolock _l(mLock); + // allow anyone to use tv + status_t result = checkPid(); + if (result == NO_ERROR) { + mClientPid = 0; + LOGD("clear mTvClient (pid %d)", callingPid); + // we need to remove the reference so that when app goes + // away, the reference count goes to 0. + mTvClient.clear(); + } + return result; +} + +status_t TvService::Client::connect(const sp<ITvClient> &client) +{ + int callingPid = getCallingPid(); + LOGD("Client::connect E (pid %d, client %p)", callingPid, client->asBinder().get()); + { + sp<ITvClient> oldClient; + { + Mutex::Autolock _l(mLock); + if (mClientPid != 0 && checkPid() != NO_ERROR) { + LOGW("Tried to connect to locked tv (old pid %d, new pid %d)", mClientPid, callingPid); + return -EBUSY; + } + oldClient = mTvClient; + + // did the client actually change? + if ((mTvClient != NULL) && (client->asBinder() == mTvClient->asBinder())) { + LOGD("Connect to the same client"); + return NO_ERROR; + } + + mTvClient = client; + mClientPid = -1; + LOGD("Connect to the new client (pid %d, client %p)", callingPid, mTvClient->asBinder().get()); + } + + } + mClientPid = callingPid; + return NO_ERROR; +} + +TvService::Client::~Client() +{ + if (mIsStartTv) mpTv->StopTvLock(); + + int callingPid = getCallingPid(); + // tear down client + LOGD("Client::~Client E (pid %d, client %p)", callingPid, getTvClient()->asBinder().get()); + // make sure we tear down the hardware + mClientPid = callingPid; + disconnect(); + LOGD("Client::~Client X (pid %d)", mClientPid); +} + +void TvService::Client::disconnect() +{ + int callingPid = getCallingPid(); + + LOGD("Client::disconnect() E (pid %d client %p)", callingPid, getTvClient()->asBinder().get()); + + Mutex::Autolock lock(mLock); + if (mClientPid <= 0) { + LOGE("tv is unlocked (mClientPid = %d), don't tear down hardware", mClientPid); + return; + } + if (checkPid() != NO_ERROR) { + LOGE("Different client - don't disconnect"); + return; + } + + mTvService->removeClient(mTvClient); + mTvService->decUsers(); + + LOGD("Client::disconnect() X (pid %d)", callingPid); +} + +status_t TvService::Client::createVideoFrame(const sp<IMemory> &share_mem) +{ + LOGD(" mem=%p size=%d", share_mem->pointer() == NULL, share_mem->size()); + int Len = 0; + Mutex::Autolock lock(mLock); + mTvService->mCapVidFrame.InitVCap(share_mem); + mTvService->mCapVidFrame.SetVideoParameter(1280, 720, 50); + + mTvService->mCapVidFrame.VideoStart(); + mTvService->mCapVidFrame.GetVideoData(&Len); + mTvService->mCapVidFrame.VideoStop(); + mTvService->mCapVidFrame.DeinitVideoCap(); + + return 0; +} + +status_t TvService::Client::createSubtitle(const sp<IMemory> &share_mem) +{ + LOGD("TvService::Client::createSubtitle mem=%d size=%d", share_mem->pointer() == NULL, share_mem->size()); + //pSub = new CTvSubtitle(share_mem, this); + //pSub->run(); + return 0; +} +status_t TvService::Client::processCmd(const Parcel &p, Parcel *r) +{ + int tmp_i_buf[128] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}; + unsigned char tmp_uc_buf[512] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}; + unsigned char tmp_uc_buf2[512] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}; + int8_t tmp_int8_buf[512] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}; + static int source_input = 0; + int *data_ptr = NULL; + + int cmd = p.readInt32(); + + LOGD("client=%d cmd=%d", getCallingPid(), cmd); + switch (cmd) { + // Tv function + case OPEN_TV: { + break; + } + case CLOSE_TV: { + int ret = mpTv->CloseTv(); + r->writeInt32(ret); + break; + } + case START_TV: { + int mode = p.readInt32(); + int ret = mpTv->StartTvLock(); + //mTvService->mpStartTvClient = this; + mIsStartTv = true; + r->writeInt32(ret); + break; + } + case STOP_TV: { + int ret = mpTv->StopTvLock(); + r->writeInt32(ret); + mIsStartTv = false; + break; + } + case GET_TV_STATUS: { + int ret = 0; + ret = (int)mpTv->GetTvStatus(); + r->writeInt32(ret); + break; + } + case GET_LAST_SOURCE_INPUT: { + int ret = (int)mpTv->GetLastSourceInput(); + r->writeInt32(ret); + break; + } + case GET_CURRENT_SOURCE_INPUT: { + int ret = (int)mpTv->GetCurrentSourceInputLock(); + r->writeInt32(ret); + break; + } + case GET_CURRENT_SOURCE_INPUT_TYPE: { + int ret = 0;//(int)mpTv->Tvin_GetSrcInputType(); + r->writeInt32(ret); + break; + } + case GET_CURRENT_SIGNAL_INFO: { + tvin_info_t siginfo = mpTv->GetCurrentSignalInfo(); + int frame_rate = mpTv->getHDMIFrameRate(); + LOGD("superman--frame_rate = %d", frame_rate); + r->writeInt32(siginfo.trans_fmt); + r->writeInt32(siginfo.fmt); + r->writeInt32(siginfo.status); + r->writeInt32(frame_rate); + break; + } + case IS_SOURCE_SWTICH_DONE: { + //int ret = mpTv->Tv_IsSourceSwtichDone(); + r->writeInt32(0); + break; + } + case SET_SOURCE_INPUT: { + int sourceinput = p.readInt32(); + tvin_window_pos_t win_pos; + LOGD(" SetSourceInput sourceId= %x", sourceinput); + source_input = sourceinput; + /*win_pos.x1 = p.readInt32(); + win_pos.y1 = p.readInt32(); + win_pos.x2 = p.readInt32(); + win_pos.y2 = p.readInt32();*/ + int ret = mpTv->SetSourceSwitchInput((tv_source_input_t)sourceinput); + r->writeInt32(ret); + break; + } + case RUN_ADC_AUTO_CALIBRATION: { + // int ret = mpTv->Tv_RunADCAutoCalibration(); + // r->writeInt32(ret); + break; + } + case IS_DVI_SIGNAL: { + int ret = mpTv->IsDVISignal(); + r->writeInt32(ret); + break; + } + case IS_VGA_TIMEING_IN_HDMI: { + int ret = mpTv->isVgaFmtInHdmi(); + r->writeInt32(ret); + break; + } + case GET_VIDEO_PATH_STATUS: { + int path_type = p.readInt32(); + int ret = 0;//(int)mpTv->Tvin_CheckPathActive((tv_path_type_t)path_type); + r->writeInt32(ret); + break; + } + case GET_VIDEO_STREAM_STATUS: { + // int ret = (int)mpTv->Tvin_CheckVideoStreamStatus(); + // r->writeInt32(ret); + break; + } + case GET_FIRST_START_SWITCH_TYPE: { + //int tmp_val = 0; + //int ret = (int)mpTv->Tv_GetFirstStartSwitchType(&tmp_val); + //r->writeInt32(ret); + r->writeInt32(1); + break; + } + case SET_PREVIEW_WINDOW: { + tvin_window_pos_t win_pos; + win_pos.x1 = p.readInt32(); + win_pos.y1 = p.readInt32(); + win_pos.x2 = p.readInt32(); + win_pos.y2 = p.readInt32(); + int ret = (int)mpTv->SetPreviewWindow(win_pos); + r->writeInt32(ret); + break; + } + + case SET_VIDEO_DISABLE: { + int value = p.readInt32(); + int ret = 0;//(int)mpTv->Tv_SetVideoDisable(value); + r->writeInt32(ret); + break; + } + + case GET_SOURCE_CONNECT_STATUS: { + int source_input = p.readInt32(); + int ret = mpTv->GetSourceConnectStatus(source_input); + r->writeInt32(ret); + break; + } + //Tv function END + + //VGA + case RUN_VGA_AUTO_ADJUST: { + //int ret = mpTv->Tv_RunVGAAutoAdjust(); + int ret = 0; + r->writeInt32(ret); + break; + } + case GET_VGA_AUTO_ADJUST_STATUS: { + // int fmt = p.readInt32(); + //int ret = (int) mpTv->Tv_GetVagAutoAdjustStatus(); + int ret = 0; + r->writeInt32(ret); + break; + } + case IS_VGA_AUTO_ADJUST_DONE: { + int fmt = p.readInt32(); + int ret = 0;//mpTv->Tv_IsVGAAutoAdjustDone((tvin_sig_fmt_t)fmt); + r->writeInt32(ret); + break; + } + case SET_VGA_HPOS: { + // int value = p.readInt32(); + // int fmt = p.readInt32(); + //int ret = mpTv->Tv_SetVGAHPos(value, (tvin_sig_fmt_t)fmt); + int ret = 0; + r->writeInt32(ret); + break; + } + case GET_VGA_HPOS: { + // int fmt = p.readInt32(); + // int ret = mpTv->Tv_GetVGAHPos((tvin_sig_fmt_t)fmt); + int ret = 0; + r->writeInt32(ret); + break; + } + + case SET_VGA_VPOS: { + // int value = p.readInt32(); + // int fmt = p.readInt32(); + // int ret = mpTv->Tv_SetVGAVPos(value, (tvin_sig_fmt_t)fmt); + int ret = 0; + r->writeInt32(ret); + break; + } + case GET_VGA_VPOS: { + // int fmt = p.readInt32(); + // int ret = mpTv->Tv_GetVGAVPos((tvin_sig_fmt_t)fmt); + int ret = 0; + r->writeInt32(ret); + break; + } + + case SET_VGA_CLOCK: { + // int value = p.readInt32(); + // int fmt = p.readInt32(); + // int ret = mpTv->Tv_SetVGAClock(value, (tvin_sig_fmt_t)fmt); + int ret = 0; + r->writeInt32(ret); + break; + } + case GET_VGA_CLOCK: { + // int fmt = p.readInt32(); + // int ret = mpTv->Tv_GetVGAClock((tvin_sig_fmt_t)fmt); + int ret = 0; + r->writeInt32(ret); + break; + } + + case SET_VGA_PHASE: { + // int value = p.readInt32(); + // int fmt = p.readInt32(); + // int ret = mpTv->Tv_SetVGAPhase(value, (tvin_sig_fmt_t)fmt); + int ret = 0; + r->writeInt32(ret); + break; + } + case GET_VGA_PHASE: { + // int fmt = p.readInt32(); + // int ret = mpTv->Tv_GetVGAPhase((tvin_sig_fmt_t)fmt); + int ret = 0; + r->writeInt32(ret); + break; + } + case SET_VGA_AJUST_PARA: { + tvafe_vga_parm_t adjparam; + adjparam.clk_step = p.readInt32(); + adjparam.phase = p.readInt32(); + adjparam.hpos_step = p.readInt32(); + adjparam.vpos_step = p.readInt32(); + adjparam.vga_in_clean = p.readInt32(); + int fmt = p.readInt32(); + int ret = 0/*SetVGAAjustPara(adjparam, (tvin_sig_fmt_t)fmt)*/; + r->writeInt32(ret); + break; + } + case GET_VGA_AJUST_PARA: { + tvafe_vga_parm_t adjparam; + int fmt = p.readInt32(); + int ret = 0/*GetVGAAjustPara(&adjparam, (tvin_sig_fmt_t)fmt)*/; + r->writeInt32(adjparam.clk_step); + r->writeInt32(adjparam.phase); + r->writeInt32(adjparam.hpos_step); + r->writeInt32(adjparam.vpos_step); + r->writeInt32(adjparam.vga_in_clean); + r->writeInt32(ret); + break; + } + case SET_VGAPARAM_DEFAULT: { + // int ret = (int)mpTv->TvinResetVgaAjustParam(); + // r->writeInt32(ret); + break; + } + // VGA END + + // 3D + + case SET_3D_MODE: { + int mode = p.readInt32(); + int ret = mpTv->Tv_Set3DMode((VIDEO_3D_MODE_T)mode); + r->writeInt32(ret); + break; + } + case GET_3D_MODE: { + int ret = (int)mpTv->Tv_Get3DMode(); + r->writeInt32(ret); + break; + } + case SET_3D_LR_SWITH: { + int on_off = p.readInt32(); + //int status = p.readInt32(); + int ret = mpTv->Tv_Set3DLRSwith(on_off); + r->writeInt32(ret); + break; + } + case GET_3D_LR_SWITH: { + int ret = mpTv->Tv_Get3DLRSwith(); + r->writeInt32(ret); + break; + } + case SET_3D_TO_2D_MODE: { + int mode = p.readInt32(); + //int status = p.readInt32(); + int ret = mpTv->Tv_Set3DTo2DMode(mode); + r->writeInt32(ret); + break; + } + case GET_3D_TO_2D_MODE: { + int ret = mpTv->Tv_Get3DTo2DMode(); + r->writeInt32(ret); + break; + } + case SET_3D_DEPTH: { + int value = p.readInt32(); + int ret = mpTv->Tv_Set3DDepth(value); + r->writeInt32(ret); + break; + } + case GET_3D_DEPTH: { + int ret = mpTv->GetSave3DDepth(); + r->writeInt32(ret); + break; + } + // 3D END + + // PQ + case SET_BRIGHTNESS: { + int brightness = p.readInt32(); + int source_type = p.readInt32(); + int is_save = p.readInt32(); + int ret = mpTv->Tv_SetBrightness(brightness, (tv_source_input_type_t)source_type, is_save); + r->writeInt32(ret); + break; + } + case GET_BRIGHTNESS: { + int source_type = p.readInt32(); + LOGD("GET_BRIGHTNESS------------=%d", source_type); + int ret = mpTv->Tv_GetBrightness((tv_source_input_type_t)source_type); + r->writeInt32(ret); + break; + } + + case SET_CONTRAST: { + int contrast = p.readInt32(); + int source_type = p.readInt32(); + int is_save = p.readInt32(); + int ret = mpTv->Tv_SetContrast(contrast, (tv_source_input_type_t)source_type, is_save); + r->writeInt32(ret); + break; + } + case GET_CONTRAST: { + int source_type = p.readInt32(); + int ret = mpTv->Tv_GetContrast((tv_source_input_type_t)source_type); + r->writeInt32(ret); + break; + } + case SET_SATUATION: { + int satuation = p.readInt32(); + int source_type = p.readInt32(); + int fmt = p.readInt32(); + int is_save = p.readInt32(); + int ret = mpTv->Tv_SetSaturation(satuation, (tv_source_input_type_t)source_type, (tvin_sig_fmt_t)fmt, is_save); + r->writeInt32(ret); + break; + } + case GET_SATUATION: { + int source_type = p.readInt32(); + int ret = mpTv->Tv_GetSaturation((tv_source_input_type_t)source_type); + r->writeInt32(ret); + break; + } + case SET_HUE: { + int hue = p.readInt32(); + int source_type = p.readInt32(); + int fmt = p.readInt32(); + int is_save = p.readInt32(); + int ret = mpTv->Tv_SetHue(hue, (tv_source_input_type_t)source_type, (tvin_sig_fmt_t)fmt, is_save); + r->writeInt32(ret); + break; + } + case GET_HUE: { + int source_type = p.readInt32(); + int ret = mpTv->Tv_GetHue((tv_source_input_type_t)source_type); + r->writeInt32(ret); + break; + } + case SET_SCENEMODE: { + int mode = p.readInt32(); + int is_save = p.readInt32(); + int ret = 0;//mpTv->Tv_SetSceneMode((vpp_scene_mode_t)mode,is_save); + r->writeInt32(ret); + break; + } + case GET_SCENEMODE: { + int ret = 0;//(int)mpTv->Tv_GetSceneMode(); + r->writeInt32(ret); + break; + } + case SET_PQMODE: { + int mode = p.readInt32(); + int source_type = p.readInt32(); + int is_save = p.readInt32(); + int ret = mpTv->Tv_SetPQMode((vpp_picture_mode_t)mode, (tv_source_input_type_t)source_type, is_save); + r->writeInt32(ret); + break; + } + case GET_PQMODE: { + int source_type = p.readInt32(); + int ret = (int)mpTv->Tv_GetPQMode((tv_source_input_type_t)source_type); + r->writeInt32(ret); + break; + } + case SET_SHARPNESS: { + int value = p.readInt32(); + int source_type = p.readInt32(); + int en = p.readInt32(); + int status_3d = p.readInt32(); + int is_save = p.readInt32(); + int ret = mpTv->Tv_SetSharpness(value, (tv_source_input_type_t)source_type, en, is_save); + r->writeInt32(ret); + break; + } + case GET_SHARPNESS: { + int source_type = p.readInt32(); + int ret = mpTv->Tv_GetSharpness((tv_source_input_type_t)source_type); + r->writeInt32(ret); + break; + } + case SAVE_SHARPNESS: { + int value = p.readInt32(); + int source_type = p.readInt32(); + int en = p.readInt32(); + int ret = mpTv->Tv_SaveSharpness(value, (tv_source_input_type_t)source_type, en); + r->writeInt32(ret); + break; + } + case SET_BACKLIGHT: { + int value = p.readInt32(); + int source_type = p.readInt32(); + int is_save = p.readInt32(); + int ret = -1; + if (GetPlatformHaveFBCFlag() == 0) { + ret = mpTv->Tv_SetBacklight(value, (tv_source_input_type_t)source_type, is_save); + } else { + ret = mpTv->Tv_FactorySet_FBC_Backlight(value); + } + r->writeInt32(ret); + break; + } + case GET_BACKLIGHT: { + int source_type = p.readInt32(); + int ret = 0; + if (GetPlatformHaveFBCFlag() == 0) { + ret = mpTv->Tv_GetBacklight((tv_source_input_type_t)source_type); + } else { + ret = mpTv->Tv_FactoryGet_FBC_Backlight(); + } + r->writeInt32(ret); + break; + } + case SET_COLOR_TEMPERATURE: { + int mode = p.readInt32(); + int source_type = p.readInt32(); + int is_save = p.readInt32(); + int ret = -1; + if (GetPlatformHaveFBCFlag() == 0) { + ret = mpTv->Tv_SetColorTemperature((vpp_color_temperature_mode_t)mode, (tv_source_input_type_t)source_type, is_save); + } else { + mode = mpTv->Tv_FactoryWhiteBalanceColorTempMappingG92Fbc(mode); + ret = mpTv->Tv_FactorySet_FBC_ColorTemp_Mode(mode); + } + r->writeInt32(ret); + break; + } + case GET_COLOR_TEMPERATURE: { + int source_type = p.readInt32(); + int ret = 0; + if (GetPlatformHaveFBCFlag() == 0) { + ret = mpTv->Tv_GetColorTemperature((tv_source_input_type_t)source_type); + } else { + ret = mpTv->Tv_FactoryGet_FBC_ColorTemp_Mode(); + ret = mpTv->Tv_FactoryWhiteBalanceColorTempMappingFbc2G9(ret); + } + r->writeInt32(ret); + break; + } + case SAVE_COLOR_TEMPERATURE: { + int mode = p.readInt32(); + int source_type = p.readInt32(); + int ret = mpTv->Tv_SaveColorTemp((vpp_color_temperature_mode_t)mode, (tv_source_input_type_t)source_type); + r->writeInt32(ret); + break; + } + case SET_DISPLAY_MODE: { + int mode = p.readInt32(); + int source_type = p.readInt32(); + int fmt = p.readInt32(); + int is_save = p.readInt32(); + int ret = mpTv->Tv_SetDisplayMode((vpp_display_mode_t)mode, (tv_source_input_type_t)source_type, (tvin_sig_fmt_t)fmt, is_save); + r->writeInt32(ret); + break; + } + case GET_DISPLAY_MODE: { + int source_type = p.readInt32(); + int ret = (int)mpTv->Tv_GetDisplayMode((tv_source_input_type_t)source_type); + r->writeInt32(ret); + break; + } + case SAVE_DISPLAY_MODE: { + int mode = p.readInt32(); + int source_type = p.readInt32(); + int ret = mpTv->Tv_SaveDisplayMode((vpp_display_mode_t)mode, (tv_source_input_type_t)source_type); + r->writeInt32(ret); + break; + } + case SET_NOISE_REDUCTION_MODE: { + int mode = p.readInt32(); + int source_type = p.readInt32(); + int is_save = p.readInt32(); + int ret = mpTv->Tv_SetNoiseReductionMode((vpp_noise_reduction_mode_t)mode, (tv_source_input_type_t)source_type, is_save); + r->writeInt32(ret); + break; + } + case GET_NOISE_REDUCTION_MODE: { + int source_type = p.readInt32(); + int ret = mpTv->Tv_GetNoiseReductionMode((tv_source_input_type_t)source_type); + r->writeInt32(ret); + break; + } + case SAVE_NOISE_REDUCTION_MODE: { + int mode = p.readInt32(); + int source_type = p.readInt32(); + int ret = mpTv->Tv_SaveNoiseReductionMode((vpp_noise_reduction_mode_t)mode, (tv_source_input_type_t)source_type); + r->writeInt32(ret); + break; + } + case SETRGBOGO_POSTOFFSET: { + int type = p.readInt32(); + int offset = p.readInt32(); + int ret = 0; + ret = mpTv->Tv_SetRGBOGO_PostOffset(type, offset); + r->writeInt32(ret); + break; + } + case SETRGBOGO_GAIN: { + int type = p.readInt32(); + int mode = p.readInt32(); + int ret = 0; + ret = mpTv->Tv_SetRGBOGO_Gain(type, mode); + r->writeInt32(ret); + break; + } + case GETRGBOGO_POSTOFFSET: { + int ret = 0; + int type = p.readInt32(); + ret = mpTv->Tv_GetRGBOGO_PostOffset(type); + r->writeInt32(ret); + break; + } + case GETRGBOGO_GAIN: { + int type = p.readInt32(); + int ret = 0; + ret = mpTv->Tv_GetRGBOGO_Gain(type); + r->writeInt32(ret); + break; + } + // PQ END + + // FACTORY + case FACTORY_SETPQMODE_BRIGHTNESS: { + int source_type = p.readInt32(); + int pq_mode = p.readInt32(); + int brightness = p.readInt32(); + int ret = mpTv->Tv_FactorySetPQMode_Brightness(source_type, pq_mode, brightness); + r->writeInt32(ret); + break; + } + case FACTORY_GETPQMODE_BRIGHTNESS: { + int source_type = p.readInt32(); + int pq_mode = p.readInt32(); + int ret = mpTv->Tv_FactoryGetPQMode_Brightness(source_type, pq_mode); + r->writeInt32(ret); + break; + } + case FACTORY_SETPQMODE_CONTRAST: { + int source_type = p.readInt32(); + int pq_mode = p.readInt32(); + int contrast = p.readInt32(); + int ret = mpTv->Tv_FactorySetPQMode_Contrast(source_type, pq_mode, contrast); + r->writeInt32(ret); + break; + } + case FACTORY_GETPQMODE_CONTRAST: { + int source_type = p.readInt32(); + int pq_mode = p.readInt32(); + int ret = mpTv->Tv_FactoryGetPQMode_Contrast(source_type, pq_mode); + r->writeInt32(ret); + break; + } + case FACTORY_SETPQMODE_SATURATION: { + int source_type = p.readInt32(); + int pq_mode = p.readInt32(); + int saturation = p.readInt32(); + int ret = mpTv->Tv_FactorySetPQMode_Saturation(source_type, pq_mode, saturation); + r->writeInt32(ret); + break; + } + case FACTORY_GETPQMODE_SATURATION: { + int source_type = p.readInt32(); + int pq_mode = p.readInt32(); + int ret = mpTv->Tv_FactoryGetPQMode_Saturation(source_type, pq_mode); + r->writeInt32(ret); + break; + } + case FACTORY_SETPQMODE_HUE: { + int source_type = p.readInt32(); + int pq_mode = p.readInt32(); + int hue = p.readInt32(); + int ret = mpTv->Tv_FactorySetPQMode_Hue(source_type, pq_mode, hue); + r->writeInt32(ret); + break; + } + case FACTORY_GETPQMODE_HUE: { + int source_type = p.readInt32(); + int pq_mode = p.readInt32(); + int ret = mpTv->Tv_FactoryGetPQMode_Hue(source_type, pq_mode); + r->writeInt32(ret); + break; + } + case FACTORY_SETPQMODE_SHARPNESS: { + int source_type = p.readInt32(); + int pq_mode = p.readInt32(); + int sharpness = p.readInt32(); + int ret = mpTv->Tv_FactorySetPQMode_Sharpness(source_type, pq_mode, sharpness); + r->writeInt32(ret); + break; + } + case FACTORY_GETPQMODE_SHARPNESS: { + int source_type = p.readInt32(); + int pq_mode = p.readInt32(); + int ret = mpTv->Tv_FactoryGetPQMode_Sharpness(source_type, pq_mode); + r->writeInt32(ret); + break; + } + case FACTORY_SETCOLORTEMP_RGAIN: { + int source_type = p.readInt32(); + int colortemp_mode = p.readInt32(); + int rgain = p.readInt32(); + int ret = mpTv->Tv_FactorySetColorTemp_Rgain(source_type, colortemp_mode, rgain); + r->writeInt32(ret); + break; + } + case FACTORY_SAVECOLORTEMP_RGAIN: { + int source_type = p.readInt32(); + int colortemp_mode = p.readInt32(); + int rgain = p.readInt32(); + int ret = mpTv->Tv_FactorySaveColorTemp_Rgain(source_type, colortemp_mode, rgain); + r->writeInt32(ret); + break; + } + case FACTORY_GETCOLORTEMP_RGAIN: { + int source_type = p.readInt32(); + int colortemp_mode = p.readInt32(); + int ret = mpTv->Tv_FactoryGetColorTemp_Rgain(source_type, colortemp_mode); + r->writeInt32(ret); + break; + } + case FACTORY_SETCOLORTEMP_GGAIN: { + int source_type = p.readInt32(); + int colortemp_mode = p.readInt32(); + int ggain = p.readInt32(); + int ret = mpTv->Tv_FactorySetColorTemp_Ggain(source_type, colortemp_mode, ggain); + r->writeInt32(ret); + break; + } + case FACTORY_SAVECOLORTEMP_GGAIN: { + int source_type = p.readInt32(); + int colortemp_mode = p.readInt32(); + int ggain = p.readInt32(); + int ret = mpTv->Tv_FactorySaveColorTemp_Ggain(source_type, colortemp_mode, ggain); + r->writeInt32(ret); + break; + } + case FACTORY_GETCOLORTEMP_GGAIN: { + int source_type = p.readInt32(); + int colortemp_mode = p.readInt32(); + int ret = mpTv->Tv_FactoryGetColorTemp_Ggain(source_type, colortemp_mode); + r->writeInt32(ret); + break; + } + case FACTORY_SETCOLORTEMP_BGAIN: { + int source_type = p.readInt32(); + int colortemp_mode = p.readInt32(); + int bgain = p.readInt32(); + int ret = mpTv->Tv_FactorySetColorTemp_Bgain(source_type, colortemp_mode, bgain); + r->writeInt32(ret); + break; + } + case FACTORY_SAVECOLORTEMP_BGAIN: { + int source_type = p.readInt32(); + int colortemp_mode = p.readInt32(); + int bgain = p.readInt32(); + int ret = mpTv->Tv_FactorySaveColorTemp_Bgain(source_type, colortemp_mode, bgain); + r->writeInt32(ret); + break; + } + case FACTORY_GETCOLORTEMP_BGAIN: { + int source_type = p.readInt32(); + int colortemp_mode = p.readInt32(); + int ret = mpTv->Tv_FactoryGetColorTemp_Bgain(source_type, colortemp_mode); + r->writeInt32(ret); + break; + } + case FACTORY_SETCOLORTEMP_ROFFSET: { + int source_type = p.readInt32(); + int colortemp_mode = p.readInt32(); + int roffset = p.readInt32(); + int ret = mpTv->Tv_FactorySetColorTemp_Roffset(source_type, colortemp_mode, roffset); + r->writeInt32(ret); + break; + } + case FACTORY_SAVECOLORTEMP_ROFFSET: { + int source_type = p.readInt32(); + int colortemp_mode = p.readInt32(); + int roffset = p.readInt32(); + int ret = mpTv->Tv_FactorySaveColorTemp_Roffset(source_type, colortemp_mode, roffset); + r->writeInt32(ret); + break; + } + case FACTORY_GETCOLORTEMP_ROFFSET: { + int source_type = p.readInt32(); + int colortemp_mode = p.readInt32(); + int ret = mpTv->Tv_FactoryGetColorTemp_Roffset(source_type, colortemp_mode); + r->writeInt32(ret); + break; + } + case FACTORY_SETCOLORTEMP_GOFFSET: { + int source_type = p.readInt32(); + int colortemp_mode = p.readInt32(); + int goffset = p.readInt32(); + int ret = mpTv->Tv_FactorySetColorTemp_Goffset(source_type, colortemp_mode, goffset); + r->writeInt32(ret); + break; + } + case FACTORY_SAVECOLORTEMP_GOFFSET: { + int source_type = p.readInt32(); + int colortemp_mode = p.readInt32(); + int goffset = p.readInt32(); + int ret = mpTv->Tv_FactorySaveColorTemp_Goffset(source_type, colortemp_mode, goffset); + r->writeInt32(ret); + break; + } + case FACTORY_GETCOLORTEMP_GOFFSET: { + int source_type = p.readInt32(); + int colortemp_mode = p.readInt32(); + int ret = mpTv->Tv_FactoryGetColorTemp_Goffset(source_type, colortemp_mode); + r->writeInt32(ret); + break; + } + case FACTORY_SETCOLORTEMP_BOFFSET: { + int source_type = p.readInt32(); + int colortemp_mode = p.readInt32(); + int boffset = p.readInt32(); + int ret = mpTv->Tv_FactorySetColorTemp_Boffset(source_type, colortemp_mode, boffset); + r->writeInt32(ret); + break; + } + case FACTORY_SAVECOLORTEMP_BOFFSET: { + int source_type = p.readInt32(); + int colortemp_mode = p.readInt32(); + int boffset = p.readInt32(); + int ret = mpTv->Tv_FactorySaveColorTemp_Boffset(source_type, colortemp_mode, boffset); + r->writeInt32(ret); + break; + } + case FACTORY_GETCOLORTEMP_BOFFSET: { + int source_type = p.readInt32(); + int colortemp_mode = p.readInt32(); + int ret = mpTv->Tv_FactoryGetColorTemp_Boffset(source_type, colortemp_mode); + r->writeInt32(ret); + break; + } + case FACTORY_SETTESTPATTERN: { + int pattern = p.readInt32(); + int ret = mpTv->Tv_FactorySetTestPattern(pattern); + r->writeInt32(ret); + break; + } + case FACTORY_GETTESTPATTERN: { + int ret = mpTv->Tv_FactoryGetTestPattern(); + r->writeInt32(ret); + break; + } + case FACTORY_RESETPQMODE: { + int ret = mpTv->Tv_FactoryResetPQMode(); + r->writeInt32(ret); + break; + } + case FACTORY_RESETCOLORTEMP: { + int ret = mpTv->Tv_FactoryResetColorTemp(); + r->writeInt32(ret); + break; + } + case FACTORY_RESETPAMAMSDEFAULT: { + int ret = mpTv->Tv_FactorySetParamsDefault(); + r->writeInt32(ret); + break; + } + case FACTORY_SETDDRSSC: { + int setp = p.readInt32(); + int ret = mpTv->Tv_FactorySetDDRSSC(setp); + r->writeInt32(ret); + break; + } + case FACTORY_GETDDRSSC: { + int ret = mpTv->Tv_FactoryGetDDRSSC(); + r->writeInt32(ret); + break; + } + case FACTORY_SETLVDSSSC: { + int setp = p.readInt32(); + int ret = mpTv->Tv_FactorySetLVDSSSC(setp); + r->writeInt32(ret); + break; + } + case FACTORY_GETLVDSSSC: { + int ret = mpTv->Tv_FactoryGetLVDSSSC(); + r->writeInt32(ret); + break; + } + case FACTORY_SETNOLINEPARAMS: { + noline_params_t params; + int noline_params_type = p.readInt32(); + int source_type = p.readInt32(); + params.osd0 = p.readInt32(); + params.osd25 = p.readInt32(); + params.osd50 = p.readInt32(); + params.osd75 = p.readInt32(); + params.osd100 = p.readInt32(); + int ret = mpTv->Tv_FactorySetNolineParams(noline_params_type, source_type, params); + r->writeInt32(ret); + break; + } + case FACTORY_GETNOLINEPARAMS: { + int noline_params_type = p.readInt32(); + int source_type = p.readInt32(); + noline_params_t params = mpTv->Tv_FactoryGetNolineParams(noline_params_type, source_type); + r->writeInt32(params.osd0); + r->writeInt32(params.osd25); + r->writeInt32(params.osd50); + r->writeInt32(params.osd75); + r->writeInt32(params.osd100); + break; + } + case FACTORY_SETOVERSCAN: { + tvin_cutwin_t cutwin_t; + int source_type = p.readInt32(); + int fmt = p.readInt32(); + int status_3d = p.readInt32(); + int trans_fmt = p.readInt32(); + cutwin_t.hs = p.readInt32(); + cutwin_t.he = p.readInt32(); + cutwin_t.vs = p.readInt32(); + cutwin_t.ve = p.readInt32(); + int ret = mpTv->Tv_FactorySetOverscan(source_type, fmt, status_3d, trans_fmt, cutwin_t); + r->writeInt32(ret); + break; + } + case FACTORY_GETOVERSCAN: { + int source_type = p.readInt32(); + int fmt = p.readInt32(); + int status_3d = p.readInt32(); + int trans_fmt = p.readInt32(); + tvin_cutwin_t cutwin_t = mpTv->Tv_FactoryGetOverscan(source_type, fmt, status_3d, trans_fmt); + r->writeInt32(cutwin_t.hs); + r->writeInt32(cutwin_t.he); + r->writeInt32(cutwin_t.vs); + r->writeInt32(cutwin_t.ve); + break; + } + case FACTORY_SET_OUT_DEFAULT: { + int ret = 0; + ret = mpTv->Tv_SSMFacRestoreDefaultSetting(); + r->writeInt32(ret); + break; + } + case FACTORY_GETGLOBALOGO_RGAIN: { + int ret = 0; + r->writeInt32(ret); + break; + } + case FACTORY_GETGLOBALOGO_GGAIN: { + int ret = 0; + r->writeInt32(ret); + break; + } + case FACTORY_GETGLOBALOGO_BGAIN: { + int ret = 0; + r->writeInt32(ret); + break; + } + case FACTORY_GETGLOBALOGO_ROFFSET: { + int ret = 0; + r->writeInt32(ret); + break; + } + case FACTORY_GETGLOBALOGO_GOFFSET: { + int ret = 0; + r->writeInt32(ret); + break; + } + case FACTORY_GETGLOBALOGO_BOFFSET: { + int ret = 0; + r->writeInt32(ret); + break; + } + case FACTORY_SETGLOBALOGO_RGAIN: { + int ret = 0; + r->writeInt32(ret); + break; + } + case FACTORY_SETGLOBALOGO_GGAIN: { + int p1 = p.readInt32(); + int ret = 0; + r->writeInt32(ret); + break; + } + case FACTORY_SETGLOBALOGO_BGAIN: { + int p1 = p.readInt32(); + int ret = 0; + r->writeInt32(ret); + break; + } + case FACTORY_SETGLOBALOGO_ROFFSET: { + int p1 = p.readInt32(); + int ret = 0; + r->writeInt32(ret); + break; + } + case FACTORY_SETGLOBALOGO_GOFFSET: { + int p1 = p.readInt32(); + int ret = 0; + r->writeInt32(ret); + break; + } + case FACTORY_SETGLOBALOGO_BOFFSET: { + int p1 = p.readInt32(); + int ret = 0; + r->writeInt32(ret); + break; + } + case FACTORY_CLEAN_ALL_TABLE_FOR_PROGRAM: { + int ret = mpTv->ClearAnalogFrontEnd(); + mpTv->clearDbAllProgramInfoTable(); + r->writeInt32(ret); + break; + } + case FACTORY_SETBACKLIGHT_PWM_FREQUENCY: { + int value = p.readInt32(); + int ret = 0;//mpTv->GetVpp().Tv_FactorySetBacklightPWM_Frequency(value); + r->writeInt32(ret); + break; + } + case FACTORY_GETBACKLIGHT_PWM_FREQUENCY: { + int ret = 0;//mpTv->GetVpp().Tv_FactoryGetBacklightPWM_Frequency(); + r->writeInt32(ret); + break; + } + case FACTORY_SETBACKLIGHT_SWITCH_STATUS: { + int value = p.readInt32(); + int ret = 0;//mpTv->GetVpp().Tv_FactorySetBacklight_Switch_status(value); + r->writeInt32(ret); + break; + } + case FACTORY_GETBACKLIGHT_SWITCH_STATUS: { + int ret = 0;//mpTv->GetVpp().Tv_FactoryGetBacklight_Switch_status(); + r->writeInt32(ret); + break; + } + case FACTORY_SETBACKLIGHT_PWM_DUTY: { + int value = p.readInt32(); + int ret = 0;//mpTv->GetVpp().Tv_FactorySetBacklightPWM_Duty(value); + r->writeInt32(ret); + break; + } + case FACTORY_GETBACKLIGHT_PWM_DUTY: { + int ret = 0;//mpTv->GetVpp().Tv_FactoryGetBacklightPWM_Duty(); + r->writeInt32(ret); + break; + } + + case FACTORY_SETLVDS_COLOR_DEPTH: { + int value = p.readInt32(); + int ret = 0;//mpTv->GetVpp().Tv_FactorySetLVDS_ColorDepth(value); + r->writeInt32(ret); + break; + } + case FACTORY_GETLVDS_COLOR_DEPTH: { + int ret = 0;//mpTv->GetVpp().Tv_FactoryGetLVDS_ColorDepth(); + r->writeInt32(ret); + break; + } + case FACTORY_SETLVDS_DITHER_STATUS: { + int value = p.readInt32(); + int ret = 0;//mpTv->GetVpp().Tv_FactorySetLVDS_ColorDither_status(value); + r->writeInt32(ret); + break; + } + case FACTORY_GETLVDS_DITHER_STATUS: { + int ret = 0;//mpTv->GetVpp().Tv_FactoryGetLVDS_ColorDither_status(); + r->writeInt32(ret); + break; + } + case FACTORY_SETLVDS_MAPPING_STATUS: { + int value = p.readInt32(); + int ret = 0;//mpTv->GetVpp().Tv_FactorySetLVDS_Mapping_status(value); + r->writeInt32(ret); + break; + } + case FACTORY_GETLVDS_MAPPING_STATUS: { + int ret = 0;//mpTv->GetVpp().Tv_FactoryGetLVDS_Mapping_status(); + r->writeInt32(ret); + break; + } + case FACTORY_SETLVDS_PORT_SWAP_STATUS: { + int value = p.readInt32(); + int ret = 0;//mpTv->GetVpp().Tv_FactorySetLVDS_PortSwap_status(value); + r->writeInt32(ret); + break; + } + case FACTORY_GETLVDS_PORT_SWAP_STATUS: { + int ret = 0;//mpTv->GetVpp().Tv_FactoryGetLVDS_PortSwap_status(); + r->writeInt32(ret); + break; + } + // FACTORY END + + // AUDIO + // AUDIO MUTE + case SET_AUDIO_MUTEKEY_STATUS: { + int status = p.readInt32(); + int ret = mpTv->SetAudioMuteForSystem(status); + r->writeInt32(ret); + break; + } + case GET_AUDIO_MUTEKEY_STATUS: { + int ret = mpTv->GetAudioMuteForSystem(); + r->writeInt32(ret); + break; + } + case SET_AUDIO_FORCE_MUTE_STATUS: { + int status = p.readInt32(); + int ret = 0;//pTv->getTvAudio().AudioSetForceMuteStatus(status); + r->writeInt32(ret); + break; + } + case GET_AUDIO_FORCE_MUTE_STATUS: { + int ret = 0;//mpTv->AudioGetForceMuteStatus(); + r->writeInt32(ret); + break; + } + case SET_AUDIO_AVOUT_MUTE_STATUS: { + int status = p.readInt32(); + int ret = mpTv->SetAudioAVOutMute(status); + r->writeInt32(ret); + break; + } + case GET_AUDIO_AVOUT_MUTE_STATUS: { + int ret = mpTv->GetAudioAVOutMute(); + r->writeInt32(ret); + break; + } + case SET_AUDIO_SPDIF_MUTE_STATUS: { + int status = p.readInt32(); + int ret = mpTv->SetAudioSPDIFMute(status); + r->writeInt32(ret); + break; + } + case GET_AUDIO_SPDIF_MUTE_STATUS: { + int ret = mpTv->GetAudioSPDIFMute(); + r->writeInt32(ret); + break; + } + // AUDIO MASTER VOLUME + case SET_AUDIO_MASTER_VOLUME: { + int vol = p.readInt32(); + int ret = mpTv->SetAudioMasterVolume(vol); + r->writeInt32(ret); + break; + } + case GET_AUDIO_MASTER_VOLUME: { + int ret = mpTv->GetAudioMasterVolume(); + r->writeInt32(ret); + break; + } + case SAVE_CUR_AUDIO_MASTER_VOLUME: { + int vol = p.readInt32(); + int ret = mpTv->SaveCurAudioMasterVolume(vol); + r->writeInt32(ret); + break; + } + case GET_CUR_AUDIO_MASTER_VOLUME: { + int ret = mpTv->GetCurAudioMasterVolume(); + r->writeInt32(ret); + break; + } + //AUDIO BALANCE + case SET_AUDIO_BALANCE: { + int vol = p.readInt32(); + int ret = mpTv->SetAudioBalance(vol); + r->writeInt32(ret); + break; + } + case GET_AUDIO_BALANCE: { + int ret = mpTv->GetAudioBalance(); + r->writeInt32(ret); + break; + } + case SAVE_CUR_AUDIO_BALANCE: { + int vol = p.readInt32(); + int ret = mpTv->SaveCurAudioBalance(vol); + r->writeInt32(ret); + break; + } + case GET_CUR_AUDIO_BALANCE: { + int ret = mpTv->GetCurAudioBalance(); + r->writeInt32(ret); + break; + } + //AUDIO SUPPERBASS VOLUME + case SET_AUDIO_SUPPER_BASS_VOLUME: { + int vol = p.readInt32(); + int ret = mpTv->SetAudioSupperBassVolume(vol); + r->writeInt32(ret); + break; + } + case GET_AUDIO_SUPPER_BASS_VOLUME: { + int ret = mpTv->GetAudioSupperBassVolume(); + r->writeInt32(ret); + break; + } + case SAVE_CUR_AUDIO_SUPPER_BASS_VOLUME: { + int vol = p.readInt32(); + int ret = mpTv->SaveCurAudioSupperBassVolume(vol); + r->writeInt32(ret); + break; + } + case GET_CUR_AUDIO_SUPPER_BASS_VOLUME: { + int ret = mpTv->GetCurAudioSupperBassVolume(); + r->writeInt32(ret); + break; + } + //AUDIO SUPPERBASS SWITCH + case SET_AUDIO_SUPPER_BASS_SWITCH: { + int vol = p.readInt32(); + int ret = mpTv->SetAudioSupperBassSwitch(vol); + r->writeInt32(ret); + break; + } + case GET_AUDIO_SUPPER_BASS_SWITCH: { + int ret = mpTv->GetAudioSupperBassSwitch(); + r->writeInt32(ret); + break; + } + case SAVE_CUR_AUDIO_SUPPER_BASS_SWITCH: { + int vol = p.readInt32(); + int ret = mpTv->SaveCurAudioSupperBassSwitch(vol); + r->writeInt32(ret); + break; + } + case GET_CUR_AUDIO_SUPPER_BASS_SWITCH: { + int ret = mpTv->GetCurAudioSupperBassSwitch(); + r->writeInt32(ret); + break; + } + //AUDIO SRS SURROUND SWITCH + case SET_AUDIO_SRS_SURROUND: { + int vol = p.readInt32(); + int ret = mpTv->SetAudioSRSSurround(vol); + mpTv->RefreshAudioMasterVolume(SOURCE_MAX); + r->writeInt32(ret); + break; + } + case GET_AUDIO_SRS_SURROUND: { + int ret = mpTv->GetAudioSRSSurround(); + r->writeInt32(ret); + break; + } + case SAVE_CUR_AUDIO_SRS_SURROUND: { + int vol = p.readInt32(); + int ret = mpTv->SaveCurAudioSrsSurround(vol); + r->writeInt32(ret); + break; + } + case GET_CUR_AUDIO_SRS_SURROUND: { + int ret = mpTv->GetCurAudioSRSSurround(); + r->writeInt32(ret); + break; + } + //AUDIO SRS DIALOG CLARITY + case SET_AUDIO_SRS_DIALOG_CLARITY: { + int vol = p.readInt32(); + int ret = mpTv->SetAudioSrsDialogClarity(vol); + mpTv->RefreshAudioMasterVolume(SOURCE_MAX); + r->writeInt32(ret); + break; + } + case GET_AUDIO_SRS_DIALOG_CLARITY: { + int ret = mpTv->GetAudioSrsDialogClarity(); + r->writeInt32(ret); + break; + } + case SAVE_CUR_AUDIO_SRS_DIALOG_CLARITY: { + int vol = p.readInt32(); + int ret = mpTv->SaveCurAudioSrsDialogClarity(vol); + r->writeInt32(ret); + break; + } + case GET_CUR_AUDIO_SRS_DIALOG_CLARITY: { + int ret = mpTv->GetCurAudioSrsDialogClarity(); + r->writeInt32(ret); + break; + } + //AUDIO SRS TRUBASS + case SET_AUDIO_SRS_TRU_BASS: { + int vol = p.readInt32(); + int ret = mpTv->SetAudioSrsTruBass(vol); + mpTv->RefreshAudioMasterVolume(SOURCE_MAX); + r->writeInt32(ret); + break; + } + case GET_AUDIO_SRS_TRU_BASS: { + int ret = mpTv->GetAudioSrsTruBass(); + r->writeInt32(ret); + break; + } + case SAVE_CUR_AUDIO_SRS_TRU_BASS: { + int vol = p.readInt32(); + int ret = mpTv->SaveCurAudioSrsTruBass(vol); + r->writeInt32(ret); + break; + } + case GET_CUR_AUDIO_SRS_TRU_BASS: { + int ret = mpTv->GetCurAudioSrsTruBass(); + r->writeInt32(ret); + break; + } + //AUDIO BASS + case SET_AUDIO_BASS_VOLUME: { + int vol = p.readInt32(); + int ret = mpTv->SetAudioBassVolume(vol); + r->writeInt32(ret); + break; + } + case GET_AUDIO_BASS_VOLUME: { + int ret = mpTv->GetAudioBassVolume(); + r->writeInt32(ret); + break; + } + case SAVE_CUR_AUDIO_BASS_VOLUME: { + int vol = p.readInt32(); + int ret = mpTv->SaveCurAudioBassVolume(vol); + r->writeInt32(ret); + break; + } + case GET_CUR_AUDIO_BASS_VOLUME: { + int ret = mpTv->GetCurAudioBassVolume(); + r->writeInt32(ret); + break; + } + //AUDIO TREBLE + case SET_AUDIO_TREBLE_VOLUME: { + int vol = p.readInt32(); + int ret = mpTv->SetAudioTrebleVolume(vol); + r->writeInt32(ret); + break; + } + case GET_AUDIO_TREBLE_VOLUME: { + int ret = mpTv->GetAudioTrebleVolume(); + r->writeInt32(ret); + break; + } + case SAVE_CUR_AUDIO_TREBLE_VOLUME: { + int vol = p.readInt32(); + int ret = mpTv->SaveCurAudioTrebleVolume(vol); + r->writeInt32(ret); + break; + } + case GET_CUR_AUDIO_TREBLE_VOLUME: { + int ret = mpTv->GetCurAudioTrebleVolume(); + r->writeInt32(ret); + break; + } + //AUDIO SOUND MODE + case SET_AUDIO_SOUND_MODE: { + int vol = p.readInt32(); + int ret = mpTv->SetAudioSoundMode(vol); + r->writeInt32(ret); + break; + } + case GET_AUDIO_SOUND_MODE: { + int ret = mpTv->GetAudioSoundMode(); + r->writeInt32(ret); + break; + } + case SAVE_CUR_AUDIO_SOUND_MODE: { + int vol = p.readInt32(); + int ret = mpTv->SaveCurAudioSoundMode(vol); + r->writeInt32(ret); + break; + } + case GET_CUR_AUDIO_SOUND_MODE: { + int ret = mpTv->GetCurAudioSoundMode(); + r->writeInt32(ret); + break; + } + //AUDIO WALL EFFECT + case SET_AUDIO_WALL_EFFECT: { + int vol = p.readInt32(); + int ret = mpTv->SetAudioWallEffect(vol); + r->writeInt32(ret); + break; + } + case GET_AUDIO_WALL_EFFECT: { + int ret = mpTv->GetAudioWallEffect(); + r->writeInt32(ret); + break; + } + case SAVE_CUR_AUDIO_WALL_EFFECT: { + int vol = p.readInt32(); + int ret = mpTv->SaveCurAudioWallEffect(vol); + r->writeInt32(ret); + break; + } + case GET_CUR_AUDIO_WALL_EFFECT: { + int ret = mpTv->GetCurAudioWallEffect(); + r->writeInt32(ret); + break; + } + //AUDIO EQ MODE + case SET_AUDIO_EQ_MODE: { + int vol = p.readInt32(); + int ret = mpTv->SetAudioEQMode(vol); + r->writeInt32(ret); + break; + } + case GET_AUDIO_EQ_MODE: { + int ret = mpTv->GetAudioEQMode(); + r->writeInt32(ret); + break; + } + case SAVE_CUR_AUDIO_EQ_MODE: { + int vol = p.readInt32(); + int ret = mpTv->SaveCurAudioEQMode(vol); + r->writeInt32(ret); + break; + } + case GET_CUR_AUDIO_EQ_MODE: { + int ret = mpTv->GetCurAudioEQMode(); + r->writeInt32(ret); + break; + } + //AUDIO EQ GAIN + case GET_AUDIO_EQ_RANGE: { + int buf[2]; + int ret = mpTv->GetAudioEQRange(buf); + r->writeInt32(2); + r->writeInt32(buf[0]); + r->writeInt32(buf[1]); + r->writeInt32(ret); + break; + } + case GET_AUDIO_EQ_BAND_COUNT: { + int ret = mpTv->GetAudioEQBandCount(); + r->writeInt32(ret); + break; + } + case SET_AUDIO_EQ_GAIN: { + int i = 0, tmp_buf_size = 0, ret = 0; + tmp_buf_size = p.readInt32(); + for (i = 0; i < tmp_buf_size; i++) { + tmp_i_buf[i] = p.readInt32(); + } + ret = mpTv->SetAudioEQGain(tmp_i_buf); + r->writeInt32(ret); + break; + } + case GET_AUDIO_EQ_GAIN: { + int i = 0, tmp_buf_size = 0, ret = 0; + ret = mpTv->GetAudioEQGain(tmp_i_buf); + tmp_buf_size = mpTv->GetAudioEQBandCount(); + r->writeInt32(tmp_buf_size); + for (i = 0; i < tmp_buf_size; i++) { + r->writeInt32(tmp_i_buf[i]); + } + r->writeInt32(ret); + break; + } + case SAVE_CUR_AUDIO_EQ_GAIN: { + int i = 0, tmp_buf_size = 0, ret = 0; + tmp_buf_size = p.readInt32(); + for (i = 0; i < tmp_buf_size; i++) { + tmp_i_buf[i] = p.readInt32(); + } + ret = mpTv->SaveCurAudioEQGain(tmp_i_buf); + r->writeInt32(ret); + break; + } + case GET_CUR_EQ_GAIN: { + int i = 0, tmp_buf_size = 0, ret = 0; + ret = mpTv->GetCurAudioEQGain(tmp_i_buf); + tmp_buf_size = mpTv->GetAudioEQBandCount(); + r->writeInt32(tmp_buf_size); + for (i = 0; i < tmp_buf_size; i++) { + r->writeInt32(tmp_i_buf[i]); + } + r->writeInt32(ret); + break; + } + case SET_AUDIO_EQ_SWITCH: { + int tmpVal = p.readInt32(); + int ret = mpTv->SetAudioEQSwitch(tmpVal); + r->writeInt32(ret); + break; + } + // AUDIO SPDIF SWITCH + case SET_AUDIO_SPDIF_SWITCH: { + int tmp_val = p.readInt32(); + int ret = mpTv->SetAudioSPDIFSwitch(tmp_val); + r->writeInt32(ret); + break; + } + case GET_AUDIO_SPDIF_SWITCH: { + int ret = 0;//mpTv->GetAudioSPDIFSwitch(); + r->writeInt32(ret); + break; + } + case AUDIO_SET_DOUBLE_OUTPUT_ENABLE: { + int tmp_val = p.readInt32(); + int ret = mpTv->amAudioSetDoubleOutputSwitch(tmp_val); + r->writeInt32(ret); + break; + } + case USB_AUDIO_OUPUT_MODULE_ENABLE: { + int tmp_val = p.readInt32(); + int ret = mpTv->UsbAudioOuputModuleSwitch(tmp_val); + r->writeInt32(ret); + break; + } + + case GET_USB_AUDIO_DOUBLE_OUPUT_MODULE_ENABLE: { + int ret = mpTv->GetAmAudioSetDoubleOutputSwitch(); + r->writeInt32(ret); + break; + } + + case GET_USB_AUDIO_OUPUT_MODULE_ENABLE: { + int ret = mpTv->GetCurUsbAudioOuputModuleSwitch(); + r->writeInt32(ret); + break; + } + + case SAVE_CUR_AUDIO_SPDIF_SWITCH: { + int tmp_val = p.readInt32(); + int ret = mpTv->SaveCurAudioSPDIFSwitch(tmp_val); + r->writeInt32(ret); + break; + } + case GET_CUR_AUDIO_SPDIF_SWITCH: { + int ret = mpTv->GetCurAudioSPDIFSwitch(); + r->writeInt32(ret); + break; + } + //AUDIO SPDIF MODE + case SET_AUDIO_SPDIF_MODE: { + int vol = p.readInt32(); + int progId = p.readInt32(); + int audioTrackId = p.readInt32(); + int ret = mpTv->SetAudioSPDIFMode(vol); + mpTv->ResetAudioDecoderForPCMOutput(); + r->writeInt32(ret); + break; + } + case GET_AUDIO_SPDIF_MODE: { + int ret = 0;//mpTv->GetAudioSPDIFMode(); + r->writeInt32(ret); + break; + } + case SAVE_CUR_AUDIO_SPDIF_MODE: { + int vol = p.readInt32(); + int ret = mpTv->SaveCurAudioSPDIFMode(vol); + r->writeInt32(ret); + break; + } + case GET_CUR_AUDIO_SPDIF_MODE: { + int ret = mpTv->GetCurAudioSPDIFMode(); + r->writeInt32(ret); + break; + } + case OPEN_AMAUDIO: { + int sr = p.readInt32(); + int output_dev = p.readInt32(); + int ret = mpTv->OpenAmAudio(sr, output_dev); + r->writeInt32(ret); + break; + } + case CLOSE_AMAUDIO: { + int ret = mpTv->CloseAmAudio(); + r->writeInt32(ret); + break; + } + case SET_AMAUDIO_INPUT_SR: { + int sr = p.readInt32(); + int output_dev = p.readInt32(); + int ret = mpTv->SetAmAudioInputSr(sr, output_dev); + r->writeInt32(ret); + break; + } + case SET_AMAUDIO_OUTPUT_MODE: { + int tmp_val = p.readInt32(); + int ret = mpTv->SetAmAudioOutputMode(tmp_val); + r->writeInt32(ret); + break; + } + case SET_AMAUDIO_MUSIC_GAIN: { + int tmp_val = p.readInt32(); + int ret = mpTv->SetAmAudioMusicGain(tmp_val); + r->writeInt32(ret); + break; + } + case SET_AMAUDIO_LEFT_GAIN: { + int tmp_val = p.readInt32(); + int ret = mpTv->SetAmAudioLeftGain(tmp_val); + r->writeInt32(ret); + break; + } + case SET_AMAUDIO_RIGHT_GAIN: { + int tmp_val = p.readInt32(); + int ret = mpTv->SetAmAudioRightGain(tmp_val); + r->writeInt32(ret); + break; + } + case SELECT_LINE_IN_CHANNEL: { + int channel = p.readInt32(); + int ret = mpTv->AudioLineInSelectChannel(channel); + r->writeInt32(ret); + LOGD("SELECT_LINE_IN_CHANNEL: channel = %d; ret = %d.\n", channel, ret); + break; + } + case SET_KALAOK_IO_LEVEL: { + int level = p.readInt32(); + int ret = mpTv->SetKalaokIO(level); + r->writeInt32(ret); + mpTv->AudioSetAudioInSource(CC_AUDIO_IN_SOURCE_LINEIN); + LOGD("SET KALAOK H LEVEL: level = %d; ret = %d.\n", level, ret); + break; + } + + case SET_LINE_IN_CAPTURE_VOL: { + int l_vol = p.readInt32(); + int r_vol = p.readInt32(); + int ret = mpTv->AudioSetLineInCaptureVolume(l_vol, r_vol); + r->writeInt32(ret); + break; + } + case HANDLE_AUDIO_HEADSET_PLUG_IN: { + int ret = mpTv->AudioHandleHeadsetPlugIn(); + r->writeInt32(ret); + break; + } + case HANDLE_AUDIO_HEADSET_PULL_OUT: { + int ret = mpTv->AudioHandleHeadsetPullOut(); + r->writeInt32(ret); + break; + } + case SET_AUDIO_VOL_COMP: { + int tmpVal = p.readInt32(); + int ret = mpTv->SetCurProgramAudioVolumeCompensationVal(tmpVal); + r->writeInt32(ret); + break; + } + case GET_AUDIO_VOL_COMP: { + int ret = mpTv->GetAudioVolumeCompensationVal(-1); + r->writeInt32(ret); + break; + } + case SAVE_AUDIO_VOL_COMP: { + int tmpVal = p.readInt32(); + int ret = -1;//mpTv->atvSaveAudioVolumeCompensationVal(tmpVal); + LOGD("this cmd is empty!!!!!!!!!!!!!!!!!!!"); + r->writeInt32(ret); + break; + } + case SET_NOISE_GATE_THRESHOLD: { + int ret = 0; + r->writeInt32(ret); + break; + } + case SET_AUDIO_SOURCE_FOR_KARAOKE: { + int sourceinput = p.readInt32(); + int ret = mpTv->Tv_SetAudioSourceType((tv_source_input_t)sourceinput); + r->writeInt32(ret); + break; + } + // AUDIO END + + // SSM + case SSM_INIT_DEVICE: { + int tmpRet = 0; + tmpRet = mpTv->Tv_SSMRestoreDefaultSetting();//mpTv->Tv_SSMInitDevice(); + r->writeInt32(tmpRet); + break; + } + /*case SSM_SAVE_ONE_BYTE: { + int tmpOffset = p.readInt32(); + int tmpVal = p.readInt32(); + int tmpRet; + tmpRet = SSMWriteOneByte(tmpOffset, tmpVal); + r->writeInt32(tmpRet); + break; + } + case SSM_READ_ONE_BYTE: { + int tmpOffset = p.readInt32(); + int tmpRet = 0; + SSMReadOneByte(tmpOffset, &tmpRet); + r->writeInt32(tmpRet); + break; + } + case SSM_SAVE_N_BYTES: { + int i = 0, tmp_offset = 0, tmp_data_len = 0, ret = -1; + + tmp_offset = p.readInt32(); + tmp_data_len = p.readInt32(); + + if (tmp_data_len > 0) { + data_ptr = new int[tmp_data_len]; + + if (data_ptr != NULL) { + for (i = 0; i < tmp_data_len; i++) { + data_ptr[i] = p.readInt32(); + } + + ret = SSMWriteNTypes(tmp_offset, tmp_data_len, data_ptr); + + delete data_ptr; + data_ptr = NULL; + } + } + + r->writeInt32(ret); + break; + } + case SSM_READ_N_BYTES: { + int i = 0, tmp_offset = 0, tmp_data_len = 0, ret = -1; + tmp_offset = p.readInt32(); + tmp_data_len = p.readInt32(); + + if (tmp_data_len > 0) { + data_ptr = new int[tmp_data_len]; + if (data_ptr != NULL) { + ret = SSMReadNTypes(tmp_offset, tmp_data_len, data_ptr); + if (ret < 0) { + tmp_data_len = 0; + } + r->writeInt32(tmp_data_len); + for (i = 0; i < tmp_data_len; i++) { + r->writeInt32(data_ptr[i]); + } + delete data_ptr; + data_ptr = NULL; + } + } + r->writeInt32(ret); + break; + }*/ + case SSM_SAVE_POWER_ON_OFF_CHANNEL: { + int tmpPowerChanNum = p.readInt32(); + int tmpRet; + tmpRet = SSMSavePowerOnOffChannel(tmpPowerChanNum); + r->writeInt32(tmpRet); + break; + } + case SSM_READ_POWER_ON_OFF_CHANNEL: { + int tmpRet = 0; + tmpRet = SSMReadPowerOnOffChannel(); + r->writeInt32(tmpRet); + break; + } + case SSM_SAVE_SOURCE_INPUT: { + int tmpSouceInput = p.readInt32(); + int tmpRet; + tmpRet = SSMSaveSourceInput(tmpSouceInput); + r->writeInt32(tmpRet); + break; + } + case SSM_READ_SOURCE_INPUT: { + int tmpRet = 0; + tmpRet = SSMReadSourceInput(); + r->writeInt32(tmpRet); + break; + } + case SSM_SAVE_LAST_SOURCE_INPUT: { + int tmpLastSouceInput = p.readInt32(); + int tmpRet; + tmpRet = SSMSaveLastSelectSourceInput(tmpLastSouceInput); + r->writeInt32(tmpRet); + break; + } + case SSM_READ_LAST_SOURCE_INPUT: { + int tmpRet = 0; + tmpRet = SSMReadLastSelectSourceInput(); + r->writeInt32(tmpRet); + break; + } + case SSM_SAVE_SYS_LANGUAGE: { + int tmpVal = p.readInt32(); + int tmpRet; + tmpRet = SSMSaveSystemLanguage(tmpVal); + r->writeInt32(tmpRet); + break; + } + case SSM_READ_SYS_LANGUAGE: { + int tmpRet = 0; + tmpRet = SSMReadSystemLanguage(); + r->writeInt32(tmpRet); + break; + } + case SSM_SAVE_AGING_MODE: { + int tmpVal = p.readInt32(); + int tmpRet; + tmpRet = SSMSaveAgingMode(tmpVal); + r->writeInt32(tmpRet); + break; + } + case SSM_READ_AGING_MODE: { + int tmpRet = 0; + tmpRet = SSMReadAgingMode(); + r->writeInt32(tmpRet); + break; + } + case SSM_SAVE_PANEL_TYPE: { + int tmpVal = p.readInt32(); + int tmpRet; + tmpRet = SSMSavePanelType(tmpVal); + r->writeInt32(tmpRet); + break; + } + case SSM_READ_PANEL_TYPE: { + int tmpRet = 0; + tmpRet = SSMReadPanelType(); + r->writeInt32(tmpRet); + break; + } + case SSM_SAVE_MAC_ADDR: { + int i = 0, tmp_buf_size = 0, ret = 0; + tmp_buf_size = p.readInt32(); + for (i = 0; i < tmp_buf_size; i++) { + tmp_uc_buf[i] = p.readInt32(); + } + ret = KeyData_SaveMacAddress(tmp_uc_buf); + r->writeInt32(ret); + break; + } + case SSM_READ_MAC_ADDR: { + int i = 0, tmp_buf_size = 0, ret = 0; + ret = KeyData_ReadMacAddress(tmp_uc_buf); + tmp_buf_size = KeyData_GetMacAddressDataLen(); + r->writeInt32(tmp_buf_size); + for (i = 0; i < tmp_buf_size; i++) { + r->writeInt32(tmp_uc_buf[i]); + } + r->writeInt32(ret); + break; + } + case SSM_SAVE_BAR_CODE: { + int i = 0, tmp_buf_size = 0, ret = 0; + tmp_buf_size = p.readInt32(); + for (i = 0; i < tmp_buf_size; i++) { + tmp_uc_buf[i] = p.readInt32(); + } + ret = KeyData_SaveBarCode(tmp_uc_buf); + r->writeInt32(ret); + break; + } + case SSM_READ_BAR_CODE: { + int i = 0, tmp_buf_size = 0, ret = 0; + ret = KeyData_ReadBarCode(tmp_uc_buf); + tmp_buf_size = KeyData_GetBarCodeDataLen(); + r->writeInt32(tmp_buf_size); + for (i = 0; i < tmp_buf_size; i++) { + r->writeInt32(tmp_uc_buf[i]); + } + r->writeInt32(ret); + break; + } + case SSM_SAVE_PROJECT_ID: { + int tmpVal = p.readInt32(); + int tmpRet; + tmpRet = KeyData_SaveProjectID(tmpVal); + r->writeInt32(tmpRet); + break; + } + case SSM_READ_PROJECT_ID: { + int tmpRet = 0; + tmpRet = KeyData_ReadProjectID(); + r->writeInt32(tmpRet); + break; + } + case SSM_SAVE_HDCPKEY: { + int i = 0, tmp_buf_size = 0, ret = 0; + tmp_buf_size = p.readInt32(); + for (i = 0; i < tmp_buf_size; i++) { + tmp_uc_buf[i] = p.readInt32(); + } + ret = SSMSaveHDCPKey(tmp_uc_buf); + r->writeInt32(ret); + break; + } + case SSM_READ_HDCPKEY: { + int i = 0, tmp_buf_size = 0, ret = 0; + ret = SSMReadHDCPKey(tmp_uc_buf); + tmp_buf_size = SSMGetHDCPKeyDataLen(); + r->writeInt32(tmp_buf_size); + for (i = 0; i < tmp_buf_size; i++) { + r->writeInt32(tmp_uc_buf[i]); + } + r->writeInt32(ret); + break; + } + case SSM_SAVE_POWER_ON_MUSIC_SWITCH: { + int tmpVal = p.readInt32(); + int tmpRet; + tmpRet = SSMSavePowerOnMusicSwitch(tmpVal); + r->writeInt32(tmpRet); + break; + } + case SSM_READ_POWER_ON_MUSIC_SWITCH: { + int tmpRet = 0; + tmpRet = SSMReadPowerOnMusicSwitch(); + r->writeInt32(tmpRet); + break; + } + case SSM_SAVE_POWER_ON_MUSIC_VOL: { + int tmpVal = p.readInt32(); + int tmpRet; + tmpRet = SSMSavePowerOnMusicVolume(tmpVal); + r->writeInt32(tmpRet); + break; + } + case SSM_READ_POWER_ON_MUSIC_VOL: { + int tmpRet = 0; + tmpRet = SSMReadPowerOnMusicVolume(); + r->writeInt32(tmpRet); + break; + } + case SSM_SAVE_SYS_SLEEP_TIMER: { + int tmpVal = p.readInt32(); + int tmpRet; + tmpRet = SSMSaveSystemSleepTimer(tmpVal); + r->writeInt32(tmpRet); + break; + } + case SSM_READ_SYS_SLEEP_TIMER: { + int tmpRet = 0; + tmpRet = SSMReadSystemSleepTimer(); + r->writeInt32(tmpRet); + break; + } + case SSM_SET_BUS_STATUS: { + int tmpVal = p.readInt32(); + int tmpRet = 0; + //showboz + //tmpRet = SSMSetBusStatus(tmpVal); + r->writeInt32(tmpRet); + break; + } + case SSM_GET_BUS_STATUS: { + int tmpRet = 0; + //showboz + //tmpRet = SSMGetBusStatus(); + r->writeInt32(tmpRet); + break; + } + case SSM_SAVE_INPUT_SRC_PARENTAL_CTL: { + int tmpSourceIndex = p.readInt32(); + int tmpCtlFlag = p.readInt32(); + int tmpRet; + tmpRet = SSMSaveInputSourceParentalControl(tmpSourceIndex, tmpCtlFlag); + r->writeInt32(tmpRet); + break; + } + case SSM_READ_INPUT_SRC_PARENTAL_CTL: { + int tmpSourceIndex = p.readInt32(); + int tmpRet = 0; + tmpRet = SSMReadInputSourceParentalControl(tmpSourceIndex); + r->writeInt32(tmpRet); + break; + } + case SSM_SAVE_PARENTAL_CTL_SWITCH: { + int tmpSwitchFlag = p.readInt32(); + int tmpRet; + tmpRet = SSMSaveParentalControlSwitch(tmpSwitchFlag); + r->writeInt32(tmpRet); + break; + } + case SSM_READ_PARENTAL_CTL_SWITCH: { + int tmpRet = 0; + tmpRet = SSMReadParentalControlSwitch(); + r->writeInt32(tmpRet); + break; + } + case SSM_SAVE_PARENTAL_CTL_PASS_WORD: { + String16 pass_wd_str = p.readString16(); + int tmpRet; + tmpRet = SSMSaveParentalControlPassWord((unsigned char *)pass_wd_str.string(), pass_wd_str.size() * sizeof(unsigned short)); + r->writeInt32(tmpRet); + break; + } + case SSM_READ_PARENTAL_CTL_PASS_WORD: { + int tmpChanID = p.readInt32(); + unsigned short tmp_buf [SSM_RW_PARENTAL_CTL_PASSWORD_LEN + 1]; + String16 pass_wd_str; + SSMReadParentalControlPassWord(tmp_buf); + tmp_buf[SSM_RW_PARENTAL_CTL_PASSWORD_LEN / sizeof(unsigned short)] = 0; + pass_wd_str.setTo((const unsigned short *) tmp_buf); + r->writeString16(pass_wd_str); + break; + } + case SSM_SAVE_USING_DEF_HDCP_KEY_FLAG: { + break; + } + case SSM_READ_USING_DEF_HDCP_KEY_FLAG: { + break; + } + case SSM_GET_CUSTOMER_DATA_START: { + int tmpRet = 0; + tmpRet = SSMGetCustomerDataStart(); + r->writeInt32(tmpRet); + break; + } + case SSM_GET_CUSTOMER_DATA_LEN: { + int tmpRet = 0; + tmpRet = SSMGetCustomerDataLen(); + r->writeInt32(tmpRet); + break; + } + case SSM_SAVE_STANDBY_MODE: { + int tmp_val = p.readInt32(); + int tmpRet; + tmpRet = SSMSaveStandbyMode(tmp_val); + r->writeInt32(tmpRet); + break; + } + case SSM_READ_STANDBY_MODE: { + int tmpRet = 0; + tmpRet = SSMReadStandbyMode(); + r->writeInt32(tmpRet); + break; + } + case SSM_SAVE_LOGO_ON_OFF_FLAG: { + int tmpSwitchFlag = p.readInt32(); + int tmpRet; + tmpRet = SSMSaveLogoOnOffFlag(tmpSwitchFlag); + r->writeInt32(tmpRet); + break; + } + case SSM_READ_LOGO_ON_OFF_FLAG: { + int tmpRet = 0; + tmpRet = SSMReadLogoOnOffFlag(); + r->writeInt32(tmpRet); + break; + } + case SSM_SAVE_HDMIEQ_MODE: { + int tmpSwitchFlag = p.readInt32(); + int tmpRet; + tmpRet = SSMSaveHDMIEQMode(tmpSwitchFlag); + r->writeInt32(tmpRet); + break; + } + case SSM_READ_HDMIEQ_MODE: { + int tmpRet = 0; + tmpRet = SSMReadHDMIEQMode(); + r->writeInt32(tmpRet); + break; + } + case SSM_SAVE_HDMIINTERNAL_MODE: { + int tmp_val = p.readInt32(); + int tmpRet; + tmpRet = SSMSaveHDMIInternalMode(tmp_val); + r->writeInt32(tmpRet); + break; + } + case SSM_READ_HDMIINTERNAL_MODE: { + int tmpRet = 0; + tmpRet = SSMReadHDMIInternalMode(); + r->writeInt32(tmpRet); + break; + } + case SSM_SAVE_DISABLE_3D: { + int tmp_val = p.readInt32(); + int tmpRet; + tmpRet = SSMSaveDisable3D(tmp_val); + r->writeInt32(tmpRet); + break; + } + case SSM_READ_DISABLE_3D: { + int tmpRet = 0; + tmpRet = SSMReadDisable3D(); + r->writeInt32(tmpRet); + break; + } + case SSM_SAVE_GLOBAL_OGOENABLE: { + int tmp_val = p.readInt32(); + int tmpRet; + tmpRet = SSMSaveGlobalOgoEnable(tmp_val); + r->writeInt32(tmpRet); + break; + } + case SSM_READ_GLOBAL_OGOENABLE: { + int tmpRet = 0; + tmpRet = SSMReadGlobalOgoEnable(); + r->writeInt32(tmpRet); + break; + } + case SSM_SAVE_NON_STANDARD_STATUS: { + int tmp_val = p.readInt32(); + int tmpRet; + tmpRet = SSMSaveNonStandardValue(tmp_val); + r->writeInt32(tmpRet); + break; + } + case SSM_READ_NON_STANDARD_STATUS: { + int tmpRet = 0; + tmpRet = SSMReadNonStandardValue(); + r->writeInt32(tmpRet); + break; + } + case SSM_SAVE_ADB_SWITCH_STATUS: { + int tmp_val = p.readInt32(); + int tmpRet; + tmpRet = SSMSaveAdbSwitchValue(tmp_val); + r->writeInt32(tmpRet); + break; + } + case SSM_READ_ADB_SWITCH_STATUS: { + int tmpRet = 0; + tmpRet = SSMReadAdbSwitchValue(); + r->writeInt32(tmpRet); + break; + } + case SSM_SAVE_SERIAL_CMD_SWITCH_STATUS: { + int tmp_val = p.readInt32(); + int tmpRet; + tmpRet = SSMSaveSerialCMDSwitchValue(tmp_val); + tmpRet |= mpTv->SetSerialSwitch(SERIAL_A, tmp_val); + r->writeInt32(tmpRet); + break; + } + case SSM_READ_SERIAL_CMD_SWITCH_STATUS: { + int tmpRet = 0; + tmpRet = SSMReadSerialCMDSwitchValue(); + r->writeInt32(tmpRet); + break; + } + case SSM_SET_HDCP_KEY: { + int tmpRet = 0; + tmpRet = SSMSetHDCPKey(); + r->writeInt32(tmpRet); + break; + } + case SSM_REFRESH_HDCPKEY: { + int tmpRet = 0; + tmpRet = SSMRefreshHDCPKey(); + r->writeInt32(tmpRet); + break; + } + case SSM_SAVE_CHROMA_STATUS: { + int tmp_val = p.readInt32(); + int tmpRet; + tmpRet = SSMSaveChromaStatus(tmp_val); + r->writeInt32(tmpRet); + break; + } + case SSM_SAVE_CA_BUFFER_SIZE: { + int tmp_val = p.readInt32(); + int tmpRet; + tmpRet = SSMSaveCABufferSizeValue(tmp_val); + r->writeInt32(tmpRet); + break; + } + case SSM_READ_CA_BUFFER_SIZE: { + int tmpRet = 0; + tmpRet = SSMReadCABufferSizeValue(); + r->writeInt32(tmpRet); + break; + } + case SSM_GET_ATV_DATA_START: { + int tmpRet = 0; + tmpRet = SSMGetATVDataStart(); + r->writeInt32(tmpRet); + break; + } + case SSM_GET_ATV_DATA_LEN: { + int tmpRet = 0; + tmpRet = SSMGetATVDataLen(); + r->writeInt32(tmpRet); + break; + } + case SSM_GET_VPP_DATA_START: { + int tmpRet = 0; + tmpRet = SSMGetVPPDataStart(); + r->writeInt32(tmpRet); + break; + } + case SSM_GET_VPP_DATA_LEN: { + int tmpRet = 0; + tmpRet = SSMGetVPPDataLen(); + r->writeInt32(tmpRet); + break; + } + case SSM_SAVE_NOISE_GATE_THRESHOLD_STATUS: { + int tmp_val = p.readInt32(); + int tmpRet; + tmpRet = SSMSaveNoiseGateThresholdValue(tmp_val); + r->writeInt32(tmpRet); + break; + } + case SSM_READ_NOISE_GATE_THRESHOLD_STATUS: { + int tmpRet = 0; + tmpRet = SSMReadNoiseGateThresholdValue(); + r->writeInt32(tmpRet); + break; + } + case SSM_EEPROM_SAVE_ONE_BYTE_N310_N311: { + int tmpOffset = p.readInt32(); + int tmpVal = p.readInt32(); + int tmpRet; + tmpRet = SSMSaveEEP_One_N310_N311(tmpOffset, tmpVal); + r->writeInt32(tmpRet); + break; + } + case SSM_EEPROM_READ_ONE_BYTE_N310_N311: { + int tmpOffset = p.readInt32(); + int tmpRet = 0; + tmpRet = SSMReadEEP_One_N310_N311(tmpOffset); + r->writeInt32(tmpRet); + break; + } + case SSM_EEPROM_SAVE_N_BYTES_N310_N311: { + int i = 0, tmp_offset = 0, tmp_data_len = 0, ret = -1; + + tmp_offset = p.readInt32(); + tmp_data_len = p.readInt32(); + + if (tmp_data_len > 0) { + data_ptr = new int[tmp_data_len]; + + if (data_ptr != NULL) { + for (i = 0; i < tmp_data_len; i++) { + data_ptr[i] = p.readInt32(); + } + + ret = SSMSaveEEP_N_N310_N311(tmp_offset, tmp_data_len, data_ptr); + + delete data_ptr; + data_ptr = NULL; + } + } + + r->writeInt32(ret); + break; + } + case SSM_EEPROM_READ_N_BYTES_N310_N311: { + int i = 0, tmp_offset = 0, tmp_data_len = 0, ret = -1; + tmp_offset = p.readInt32(); + tmp_data_len = p.readInt32(); + + if (tmp_data_len > 0) { + data_ptr = new int[tmp_data_len]; + if (data_ptr != NULL) { + ret = SSMReadEEP_N_N310_N311(tmp_offset, tmp_data_len, data_ptr); + if (ret < 0) { + tmp_data_len = 0; + } + r->writeInt32(tmp_data_len); + for (i = 0; i < tmp_data_len; i++) { + r->writeInt32(data_ptr[i]); + } + delete data_ptr; + data_ptr = NULL; + } + } + r->writeInt32(ret); + break; + } + case SSM_FLASH_SAVE_ONE_BYTE_N310_N311: { + int tmpOffset = p.readInt32(); + int tmpVal = p.readInt32(); + int tmpRet; + tmpRet = SSMSaveFlash_One_N310_N311(tmpOffset, tmpVal); + r->writeInt32(tmpRet); + break; + } + case SSM_FLASH_READ_ONE_BYTE_N310_N311: { + int tmpOffset = p.readInt32(); + int tmpRet = 0; + tmpRet = SSMReadFlash_One_N310_N311(tmpOffset); + r->writeInt32(tmpRet); + break; + } + case SSM_FLASH_SAVE_N_BYTES_N310_N311: { + int i = 0, tmp_offset = 0, tmp_data_len = 0, ret = -1; + + tmp_offset = p.readInt32(); + tmp_data_len = p.readInt32(); + + if (tmp_data_len > 0) { + data_ptr = new int[tmp_data_len]; + + if (data_ptr != NULL) { + for (i = 0; i < tmp_data_len; i++) { + data_ptr[i] = p.readInt32(); + } + + ret = SSMSaveFlash_N_N310_N311(tmp_offset, tmp_data_len, data_ptr); + + delete data_ptr; + data_ptr = NULL; + } + } + + r->writeInt32(ret); + break; + } + case SSM_FLASH_READ_N_BYTES_N310_N311: { + int i = 0, tmp_offset = 0, tmp_data_len = 0, ret = -1; + tmp_offset = p.readInt32(); + tmp_data_len = p.readInt32(); + + if (tmp_data_len > 0) { + data_ptr = new int[tmp_data_len]; + if (data_ptr != NULL) { + ret = SSMReadFlash_N_N310_N311(tmp_offset, tmp_data_len, data_ptr); + if (ret < 0) { + tmp_data_len = 0; + } + r->writeInt32(tmp_data_len); + for (i = 0; i < tmp_data_len; i++) { + r->writeInt32(data_ptr[i]); + } + delete data_ptr; + data_ptr = NULL; + } + } + r->writeInt32(ret); + break; + } + // SSM END + + //MISC + case MISC_PROP_SET: { + int tmpRet; + String16 tmp_str16; + String8 key_str, value_str; + + tmp_str16 = p.readString16(); + key_str = String8(tmp_str16); + tmp_str16 = p.readString16(); + value_str = String8(tmp_str16); + + tmpRet = property_set(key_str.string(), value_str.string()); + r->writeInt32(tmpRet); + break; + } + case MISC_PROP_GET: { + char prop_value[PROPERTY_VALUE_MAX]; + String16 tmp_str16; + String8 key_str, def_str; + + tmp_str16 = p.readString16(); + key_str = String8(tmp_str16); + tmp_str16 = p.readString16(); + def_str = String8(tmp_str16); + + memset(prop_value, '\0', PROPERTY_VALUE_MAX); + property_get(key_str.string(), prop_value, def_str.string()); + tmp_str16 = String16(prop_value); + + r->writeString16(tmp_str16); + break; + } + case MISC_CFG_SET: { + int tmpRet; + String16 tmp_str16; + String8 key_str, value_str; + + tmp_str16 = p.readString16(); + key_str = String8(tmp_str16); + tmp_str16 = p.readString16(); + value_str = String8(tmp_str16); + + tmpRet = config_set_str("TV", key_str.string(), value_str.string()); + r->writeInt32(tmpRet); + break; + } + case MISC_CFG_GET: { + const char *prop_value; + String16 tmp_str16; + String8 key_str, def_str; + + tmp_str16 = p.readString16(); + key_str = String8(tmp_str16); + tmp_str16 = p.readString16(); + def_str = String8(tmp_str16); + + prop_value = config_get_str("TV", key_str.string(), def_str.string()); + tmp_str16 = String16(prop_value); + + r->writeString16(tmp_str16); + break; + } + case MISC_READ_ADC_VAL: { + int tmpChanNum = p.readInt32(); + int tmpRet = 0; + tmpRet = ReadADCSpecialChannelValue(tmpChanNum); + r->writeInt32(tmpRet); + break; + } + case MISC_SET_WDT_USER_PET: { + int counter = p.readInt32(); + int ret = TvMisc_SetUserCounter(counter); + r->writeInt32(ret); + break; + } + case MISC_SET_WDT_USER_COUNTER: { + int counter_time_out = p.readInt32(); + int ret = TvMisc_SetUserCounterTimeOut(counter_time_out); + r->writeInt32(ret); + break; + } + case MISC_SET_WDT_USER_PET_RESET_ENABLE: { + int enable = p.readInt32(); + int ret = TvMisc_SetUserPetResetEnable(enable); + r->writeInt32(ret); + break; + } + case MISC_GET_TV_API_VERSION: { + const char *tmp_str8; + String16 tmp_str16; + + // write tvapi version info + tmp_str8 = tvservice_get_git_branch_info(); + tmp_str16 = String16(tmp_str8); + r->writeString16(tmp_str16); + + tmp_str8 = tvservice_get_git_version_info(); + tmp_str16 = String16(tmp_str8); + r->writeString16(tmp_str16); + + tmp_str8 = tvservice_get_last_chaned_time_info(); + tmp_str16 = String16(tmp_str8); + r->writeString16(tmp_str16); + + tmp_str8 = tvservice_get_build_time_info(); + tmp_str16 = String16(tmp_str8); + r->writeString16(tmp_str16); + + tmp_str8 = tvservice_get_build_name_info(); + tmp_str16 = String16(tmp_str8); + r->writeString16(tmp_str16); + break; + } + case MISC_GET_DVB_API_VERSION: { + const char *tmp_str8; + String16 tmp_str16; + + // write dvb version info + tmp_str8 = dvb_get_git_branch_info(); + tmp_str16 = String16(tmp_str8); + r->writeString16(tmp_str16); + + tmp_str8 = dvb_get_git_version_info(); + tmp_str16 = String16(tmp_str8); + r->writeString16(tmp_str16); + + tmp_str8 = dvb_get_last_chaned_time_info(); + tmp_str16 = String16(tmp_str8); + r->writeString16(tmp_str16); + + tmp_str8 = dvb_get_build_time_info(); + tmp_str16 = String16(tmp_str8); + r->writeString16(tmp_str16); + + tmp_str8 = dvb_get_build_name_info(); + tmp_str16 = String16(tmp_str8); + r->writeString16(tmp_str16); + + break; + } + case MISC_SERIAL_SWITCH: { + int dev_id = p.readInt32(); + int switch_val = p.readInt32(); + int ret = mpTv->SetSerialSwitch(dev_id, switch_val); + r->writeInt32(ret); + break; + } + case MISC_SERIAL_SEND_DATA: { + int i = 0, tmp_buf_size = 0, ret = 0; + + int dev_id = p.readInt32(); + + tmp_buf_size = p.readInt32(); + if (tmp_buf_size > sizeof(tmp_uc_buf)) { + tmp_buf_size = sizeof(tmp_uc_buf); + } + + for (i = 0; i < tmp_buf_size; i++) { + tmp_uc_buf[i] = p.readInt32() & 0xFF; + } + + ret = mpTv->SendSerialData(dev_id, tmp_buf_size, tmp_uc_buf); + r->writeInt32(ret); + break; + } + case MISC_CHANNEL_EXPORT: { + LOGD("MISC_CHANNEL_EXPORT"); + int ret = 0; + String16 tmp_str16; + String8 tmp_str; + + tmp_str16 = p.readString16(); + tmp_str = String8(tmp_str16); + + ret = mpTv->ChannelExport(tmp_str.string()); + r->writeInt32(ret); + break; + } + case MISC_CHANNEL_IMPORT: { + LOGD("MISC_CHANNEL_IMPORT"); + String16 tmp_str16; + String8 tmp_str; + + tmp_str16 = p.readString16(); + tmp_str = String8(tmp_str16); + int ret = 0; + ret = mpTv->ChannelImport(tmp_str.string()); + r->writeInt32(ret); + break; + } + case MISC_GET_PROJECT_INFO: { + String16 tmp_str16; + project_info_t tmpInfo; + + if (mpTv->Tv_GetProjectInfo(&tmpInfo) < 0) { + strcpy(tmpInfo.version, "UNKOWN"); + strcpy(tmpInfo.panel_type, "UNKOWN"); + strcpy(tmpInfo.panel_outputmode, "UNKOWN"); + strcpy(tmpInfo.panel_rev, "UNKOWN"); + strcpy(tmpInfo.panel_name, "UNKOWN"); + strcpy(tmpInfo.amp_curve_name, "UNKOWN"); + } + + r->writeString16(String16(tmpInfo.version)); + r->writeString16(String16(tmpInfo.panel_type)); + r->writeString16(String16(tmpInfo.panel_outputmode)); + r->writeString16(String16(tmpInfo.panel_rev)); + r->writeString16(String16(tmpInfo.panel_name)); + r->writeString16(String16(tmpInfo.amp_curve_name)); + break; + } + case MISC_GET_PLATFORM_TYPE: { + int ret = mpTv->Tv_GetPlatformType(); + r->writeInt32(ret); + break; + } + //MISC END + + // EXTAR + case DELETE_DIR_FILES: { + String16 strPath = p.readString16(); + if (strPath.size() <= 0) { + r->writeInt32(-1); + break; + } + String8 strP8 = String8(strPath); + int tmp_flag = p.readInt32(); + int ret = TvMisc_DeleteDirFiles(strP8.string(), tmp_flag); + r->writeInt32(ret); + break; + } + case ATV_GET_CURRENT_PROGRAM_ID: { + int atvLastProgramId = mpTv->getATVProgramID(); + r->writeInt32(atvLastProgramId); + break; + } + case DTV_GET_CURRENT_PROGRAM_ID: { + int dtvLastProgramId = mpTv->getDTVProgramID(); + r->writeInt32(dtvLastProgramId); + break; + } + case ATV_SAVE_PROGRAM_ID: { + int progID = p.readInt32(); + int retCnt = 0; + mpTv->saveATVProgramID(progID); + r->writeInt32(retCnt); + break; + } + case ATV_GET_MIN_MAX_FREQ: { + int min, max; + int tmpRet = mpTv->getATVMinMaxFreq(&min, &max); + r->writeInt32(min); + r->writeInt32(max); + r->writeInt32(tmpRet); + break; + } + case DTV_GET_SCAN_FREQUENCY_LIST: { + Vector<sp<CTvChannel> > out; + int tmpRet = CTvRegion::getChannelListByName("CHINA,Default DTMB ALL", out); + r->writeInt32(out.size()); + for (int i = 0; i < out.size(); i++) { + r->writeInt32(out[i]->getID()); + r->writeInt32(out[i]->getFrequency()); + } + r->writeInt32(tmpRet); + break; + } + case DTV_GET_CHANNEL_INFO: { + int dbID = p.readInt32(); + channel_info_t chan_info; + int ret = mpTv->getChannelInfoBydbID(dbID, chan_info); + r->writeInt32(chan_info.freq); + r->writeInt32(chan_info.uInfo.dtvChanInfo.strength); + r->writeInt32(chan_info.uInfo.dtvChanInfo.quality); + r->writeInt32(chan_info.uInfo.dtvChanInfo.ber); + r->writeInt32(ret); + break; + } + case ATV_GET_CHANNEL_INFO: { + int dbID = p.readInt32(); + channel_info_t chan_info; + int ret = mpTv->getChannelInfoBydbID(dbID, chan_info); + r->writeInt32(chan_info.freq); + r->writeInt32(chan_info.uInfo.atvChanInfo.finefreq); + r->writeInt32(chan_info.uInfo.atvChanInfo.videoStd); + r->writeInt32(chan_info.uInfo.atvChanInfo.audioStd); + r->writeInt32(chan_info.uInfo.atvChanInfo.isAutoStd); + r->writeInt32(ret); + break; + } + case ATV_SCAN_MANUAL: { + int tmpRet = 0; + int startFreq = p.readInt32(); + int endFreq = p.readInt32(); + int videoStd = p.readInt32(); + int audioStd = p.readInt32(); + tmpRet = mpTv->atvMunualScan(startFreq, endFreq, videoStd, audioStd); + mTvService->mpScannerClient = this; + r->writeInt32(tmpRet); + break; + } + case ATV_SCAN_MANUAL_BY_NUMBER: { + int tmpRet = 0; + int startFreq = p.readInt32(); + int endFreq = p.readInt32(); + int videoStd = p.readInt32(); + int audioStd = p.readInt32(); + int storeType = p.readInt32(); + int currentNum = p.readInt32(); + tmpRet = mpTv->atvMunualScan(startFreq, endFreq, videoStd, audioStd, storeType, currentNum); + mTvService->mpScannerClient = this; + r->writeInt32(tmpRet); + break; + } + + case ATV_SCAN_AUTO: { + int tmpRet = 0; + LOGD("%s, atv auto scan!!!\n", "TV"); + int videoStd = p.readInt32(); + int audioStd = p.readInt32(); + int searchType = p.readInt32(); + tmpRet = mpTv->atvAutoScan(videoStd, audioStd, searchType); + mTvService->mpScannerClient = this; + r->writeInt32(tmpRet); + break; + } + case DTV_SCAN_MANUAL: { + int tmpRet = 0; + int freq = p.readInt32(); + tmpRet = mpTv->dtvManualScan(freq, freq); + mTvService->mpScannerClient = this; + r->writeInt32(tmpRet); + break; + } + case DTV_SCAN_MANUAL_BETWEEN_FREQ: { + int tmpRet = 0; + int beginFreq = p.readInt32(); + int endFreq = p.readInt32(); + int modulation = p.readInt32(); + tmpRet = mpTv->dtvManualScan(beginFreq, endFreq, modulation); + mTvService->mpScannerClient = this; + r->writeInt32(tmpRet); + break; + } + case DTV_SCAN_AUTO: { + int tmpRet = 0; + tmpRet = mpTv->dtvAutoScan(); + mTvService->mpScannerClient = this; + r->writeInt32(tmpRet); + break; + } + case DTV_SCAN_AUTO_ATSC: { + int tmpRet = 0; + int attenna = p.readInt32(); + int vstd = p.readInt32(); + int astd = p.readInt32(); + tmpRet = mpTv->dtvAutoScanAtscLock(attenna, vstd, astd); + mTvService->mpScannerClient = this; + r->writeInt32(tmpRet); + break; + } + case TV_SUBTITLE_DRAW_END: { + int tmpRet = 0; + //if(pSub)pSub->lock.unlock(); + r->writeInt32(tmpRet); + break; + } + case STOP_PROGRAM_PLAY: { + int tmpRet = -1; + tmpRet = mpTv->stopPlayingLock(); + r->writeInt32(tmpRet); + break; + } + case DTV_TEST_1: { + // int progid = p.readInt32(); + //CTvProgram prog; + // int ret = CTvProgram::selectByID(progid, prog); + //CTvEvent ev; + //ret = ev.getProgPresentEvent(prog.getSrc(), prog.getID(), mpTv->getTvTime(), ev); + //r->writeString16(String16(ev.getName())); + break; + } + case DTV_TEST_2: { + //int cmd = p.readInt32(); + //CTvDatabase::GetTvDb()->importXmlToDB("/etc/tv_default.xml"); + //r->writeString16(String16("xml")); + break; + } + + case TV_CLEAR_ALL_PROGRAM: { + int tmpRet = 0; + int arg0 = p.readInt32(); + + tmpRet = mpTv->clearAllProgram(arg0); + mTvService->mpScannerClient = this; + r->writeInt32(tmpRet); + break; + } + + case GET_DISPLAY_RESOLUTION_CONFIG: { + int tmpRet = 0; + tmpRet = mpTv->GetDisplayResolutionConfig(); + r->writeInt32(tmpRet); + break; + } + + case GET_DISPLAY_RESOLUTION_INFO: { + int tmpRet = 0; + tmpRet = mpTv->GetDisplayResolutionInfo(); + r->writeInt32(tmpRet); + break; + } + + case HDMIRX_CEC_SEND_CUSTOM_MESSAGE: { + int i = 0, tmp_buf_size = 0, ret = 0; + tmp_buf_size = p.readInt32(); + for (i = 0; i < tmp_buf_size; i++) { + tmp_uc_buf[i] = p.readInt32(); + } + + int tmpRet = 0; + tmpRet = mpTv->SendHDMIRxCECCustomMessage(tmp_uc_buf); + r->writeInt32(tmpRet); + break; + } + + case HDMIRX_CEC_SEND_CUSTOM_WAIT_REPLY_MESSAGE: { + int i = 0, tmp_buf_size = 0, ret = 0; + int WaitCmd = 0, timeout = 0; + tmp_buf_size = p.readInt32(); + for (i = 0; i < tmp_buf_size; i++) { + tmp_uc_buf[i] = p.readInt32(); + } + + WaitCmd = p.readInt32(); + timeout = p.readInt32(); + + int tmpRet = 0; + tmpRet = mpTv->SendHDMIRxCECCustomMessageAndWaitReply(tmp_uc_buf, tmp_uc_buf2, WaitCmd, timeout); + + r->writeInt32(tmpRet); + if (tmpRet > 0) { + for (i = 0; i < tmpRet; i++) { + r->writeInt32(tmp_uc_buf2[i]); + } + } + + r->writeInt32(tmpRet); + break; + } + + case HDMIRX_CEC_SEND_BROADCAST_STANDBY_MESSAGE: { + int tmpRet = 0; + tmpRet = mpTv->SendHDMIRxCECBoradcastStandbyMessage(); + r->writeInt32(tmpRet); + break; + } + + case HDMIRX_CEC_SEND_GIVE_CEC_VERSION_MESSAGE: { + int i = 0, tmp_buf_size = 0, ret = 0; + int sourceinput = p.readInt32(); + LOGD("HDMIRX_CEC_SEND_GIVE_CEC_VERSION_MESSAGE: sourceinput = %x", sourceinput); + tmp_buf_size = mpTv->SendHDMIRxCECGiveCECVersionMessage((tv_source_input_t)sourceinput, tmp_uc_buf); + r->writeInt32(tmp_buf_size); + for (i = 0; i < tmp_buf_size; i++) { + r->writeInt32(tmp_uc_buf[i]); + } + r->writeInt32(tmp_buf_size); + break; + } + + case HDMIRX_CEC_SEND_GIVE_DEV_VENDOR_ID_MESSAGE: { + int i = 0, tmp_buf_size = 0, ret = 0; + int sourceinput = p.readInt32(); + LOGD("HDMIRX_CEC_SEND_GIVE_DEV_VENDOR_ID_MESSAGE: sourceinput = %x", sourceinput); + tmp_buf_size = mpTv->SendHDMIRxCECGiveDeviceVendorIDMessage((tv_source_input_t)sourceinput, tmp_uc_buf); + r->writeInt32(tmp_buf_size); + for (i = 0; i < tmp_buf_size; i++) { + r->writeInt32(tmp_uc_buf[i]); + } + r->writeInt32(tmp_buf_size); + break; + } + + case HDMIRX_CEC_SEND_GIVE_OSD_NAME_MESSAGE: { + int i = 0, tmp_buf_size = 0, ret = 0; + int sourceinput = p.readInt32(); + LOGD("HDMIRX_CEC_SEND_GIVE_OSD_NAME_MESSAGE: sourceinput = %x", sourceinput); + tmp_buf_size = mpTv->SendHDMIRxCECGiveOSDNameMessage((tv_source_input_t)sourceinput, tmp_uc_buf); + r->writeInt32(tmp_buf_size); + for (i = 0; i < tmp_buf_size; i++) { + r->writeInt32(tmp_uc_buf[i]); + } + r->writeInt32(tmp_buf_size); + break; + } + + case GET_HDMI_KSV_INFO: { + int tmpRet = 0; + int ksv_data[2] = {0, 0}; + tmpRet = mpTv->GetHdmiHdcpKeyKsvInfo(ksv_data); + r->writeInt32(tmpRet); + r->writeInt32(ksv_data[0]); + r->writeInt32(ksv_data[1]); + break; + } + + case FACTORY_FBC_UPGRADE: { + String16 tmpName = p.readString16(); + String8 strName = String8(tmpName); + sprintf((char *)tmp_uc_buf, "%s", strName.string()); + int mode = p.readInt32(); + int upgrade_blk_size = p.readInt32(); + int ret = mpTv->StartUpgradeFBC((char *)tmp_uc_buf, mode, upgrade_blk_size); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_SET_BRIGHTNESS: { + int value = p.readInt32(); + int ret = mpTv->Tv_FactorySet_FBC_Brightness(value); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_GET_BRIGHTNESS: { + int ret = mpTv->Tv_FactoryGet_FBC_Brightness(); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_SET_CONTRAST: { + int value = p.readInt32(); + int ret = mpTv->Tv_FactorySet_FBC_Contrast(value); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_GET_CONTRAST: { + int ret = mpTv->Tv_FactoryGet_FBC_Contrast(); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_SET_SATURATION: { + int value = p.readInt32(); + int ret = mpTv->Tv_FactorySet_FBC_Saturation(value); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_GET_SATURATION: { + int ret = mpTv->Tv_FactoryGet_FBC_Saturation(); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_SET_HUE: { + int value = p.readInt32(); + int ret = mpTv->Tv_FactorySet_FBC_HueColorTint(value); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_GET_HUE: { + int ret = mpTv->Tv_FactoryGet_FBC_HueColorTint(); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_SET_BACKLIGHT: { + int value = p.readInt32(); + int ret = mpTv->Tv_FactorySet_FBC_Backlight(value); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_GET_BACKLIGHT: { + int ret = mpTv->Tv_FactoryGet_FBC_Backlight(); + r->writeInt32(ret); + break; + } + case FACTORY_FBC_SET_BACKLIGHT_N360: { + int value = p.readInt32(); + int ret = mpTv->Tv_FactorySet_FBC_Backlight_N360(value); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_GET_BACKLIGHT_N360: { + int ret = mpTv->Tv_FactoryGet_FBC_Backlight_N360(); + r->writeInt32(ret); + break; + } + case FACTROY_FBC_SET_LIGHT_SENSOR_STATUS_N310: { + int value = p.readInt32(); + int ret = mpTv->Tv_FactorySet_FBC_LightSensor_Status_N310(value); + r->writeInt32(ret); + break; + } + + case FACTROY_FBC_GET_LIGHT_SENSOR_STATUS_N310: { + int ret = mpTv->Tv_FactoryGet_FBC_LightSensor_Status_N310(); + r->writeInt32(ret); + break; + } + case FACTROY_FBC_SET_DREAM_PANEL_STATUS_N310: { + int value = p.readInt32(); + int ret = mpTv->Tv_FactorySet_FBC_Dream_Panel_Status_N310(value); + r->writeInt32(ret); + break; + } + + case FACTROY_FBC_GET_DREAM_PANEL_STATUS_N310: { + int ret = mpTv->Tv_FactoryGet_FBC_Dream_Panel_Status_N310(); + r->writeInt32(ret); + break; + } + case FACTROY_FBC_SET_MULT_PQ_STATUS_N310: { + int value = p.readInt32(); + int ret = mpTv->Tv_FactorySet_FBC_MULT_PQ_Status_N310(value); + r->writeInt32(ret); + break; + } + + case FACTROY_FBC_GET_MULT_PQ_STATUS_N310: { + int ret = mpTv->Tv_FactoryGet_FBC_MULT_PQ_Status_N310(); + r->writeInt32(ret); + break; + } + case FACTROY_FBC_SET_MEMC_STATUS_N310: { + int value = p.readInt32(); + int ret = mpTv->Tv_FactorySet_FBC_MEMC_Status_N310(value); + r->writeInt32(ret); + break; + } + + case FACTROY_FBC_GET_MEMC_STATUS_N310: { + int ret = mpTv->Tv_FactoryGet_FBC_MEMC_Status_N310(); + r->writeInt32(ret); + break; + } + + + case FACTORY_FBC_SET_BACKLIGHT_EN : { + int value = p.readInt32(); + int ret = mpTv->Tv_FactorySet_FBC_backlight_onoff(value); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_GET_BACKLIGHT_EN: { + int ret = mpTv->Tv_FactoryGet_FBC_backlight_onoff(); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_SET_LVDS_SSG: { + int value = p.readInt32(); + int ret = mpTv->Tv_FactorySet_FBC_LVDS_SSG_Set(value); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_SET_ELEC_MODE: { + int value = p.readInt32(); + int ret = mpTv->Tv_FactorySet_FBC_ELEC_MODE(value); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_GET_ELEC_MODE: { + int ret = mpTv->Tv_FactoryGet_FBC_ELEC_MODE(); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_SET_PIC_MODE: { + int value = p.readInt32(); + int ret = mpTv->Tv_FactorySet_FBC_Picture_Mode(value); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_GET_PIC_MODE: { + int ret = mpTv->Tv_FactoryGet_FBC_Picture_Mode(); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_SET_TEST_PATTERN: { + int value = p.readInt32(); + int ret = mpTv->Tv_FactorySet_FBC_Set_Test_Pattern(value); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_GET_TEST_PATTERN: { + int ret = mpTv->Tv_FactoryGet_FBC_Get_Test_Pattern(); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_SET_GAIN_RED: { + int value = p.readInt32(); + int ret = mpTv->Tv_FactorySet_FBC_Gain_Red(value); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_GET_GAIN_RED: { + int ret = mpTv->Tv_FactoryGet_FBC_Gain_Red(); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_SET_GAIN_GREEN: { + int value = p.readInt32(); + int ret = mpTv->Tv_FactorySet_FBC_Gain_Green(value); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_GET_GAIN_GREEN: { + int ret = mpTv->Tv_FactoryGet_FBC_Gain_Green(); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_SET_GAIN_BLUE: { + int value = p.readInt32(); + int ret = mpTv->Tv_FactorySet_FBC_Gain_Blue(value); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_GET_GAIN_BLUE: { + int ret = mpTv->Tv_FactoryGet_FBC_Gain_Blue(); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_SET_OFFSET_RED: { + int value = p.readInt32(); + int ret = mpTv->Tv_FactorySet_FBC_Offset_Red(value); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_GET_OFFSET_RED: { + int ret = mpTv->Tv_FactoryGet_FBC_Offset_Red(); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_SET_OFFSET_GREEN: { + int value = p.readInt32(); + int ret = mpTv->Tv_FactorySet_FBC_Offset_Green(value); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_GET_OFFSET_GREEN: { + int ret = mpTv->Tv_FactoryGet_FBC_Offset_Green(); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_SET_OFFSET_BLUE: { + int value = p.readInt32(); + int ret = mpTv->Tv_FactorySet_FBC_Offset_Blue(value); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_GET_OFFSET_BLUE: { + int ret = mpTv->Tv_FactoryGet_FBC_Offset_Blue(); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_SET_COLORTEMP_MODE: { + int value = p.readInt32(); + int ret = mpTv->Tv_FactorySet_FBC_ColorTemp_Mode(value); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_GET_COLORTEMP_MODE: { + int ret = mpTv->Tv_FactoryGet_FBC_ColorTemp_Mode(); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_SET_COLORTEMP_MODE_N360: { + int value = p.readInt32(); + int ret = mpTv->Tv_FactorySet_FBC_ColorTemp_Mode_N360(value); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_GET_COLORTEMP_MODE_N360: { + int ret = mpTv->Tv_FactoryGet_FBC_ColorTemp_Mode_N360(); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_SET_WB_INIT: { + int value = p.readInt32(); + int ret = mpTv->Tv_FactorySet_FBC_WB_Initial(value); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_GET_WB_INIT: { + int ret = mpTv->Tv_FactoryGet_FBC_WB_Initial(); + r->writeInt32(ret); + break; + } + + case FACTORY_FBC_GET_MAINCODE_VERSION: { + char sw_version[64]; + char build_time[64]; + char git_version[64]; + char git_branch[64]; + char build_name[64]; + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Get_FBC_MAINCODE_Version(COMM_DEV_SERIAL, sw_version, build_time, git_version, git_branch, build_name); + r->writeString16(String16(sw_version)); + r->writeString16(String16(build_time)); + r->writeString16(String16(git_version)); + r->writeString16(String16(git_branch)); + r->writeString16(String16(build_name)); + } else { + r->writeString16(String16("No FBC")); + r->writeString16(String16("No FBC")); + r->writeString16(String16("No FBC")); + r->writeString16(String16("No FBC")); + r->writeString16(String16("No FBC")); + } + break; + } + case FACTORY_SET_SN: { + char StrFactSN[64] = {0}; + String16 strTemFactorySn = p.readString16(); + String8 strFactorySn = String8(strTemFactorySn); + sprintf((char *)StrFactSN, "%s", strFactorySn.string()); + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + int iRet = fbcIns->cfbc_Set_FBC_Factory_SN(COMM_DEV_SERIAL, (const char *)StrFactSN); + r->writeInt32(iRet); + } else { + r->writeInt32(-1); + } + break; + } + case FACTORY_GET_SN: { + char factorySerialNumber[64] = {0}; + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Get_FBC_Factory_SN(COMM_DEV_SERIAL, factorySerialNumber); + r->writeString16(String16(factorySerialNumber)); + } else { + r->writeString16(String16("No FBC")); + } + break; + } + case FACTORY_FBC_PANEL_GET_INFO: { + char panel_model[64]; + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Get_FBC_Get_PANel_INFO(COMM_DEV_SERIAL, panel_model); + r->writeString16(String16(panel_model)); + } else { + r->writeString16(String16("")); + } + break; + } + case FACTORY_FBC_PANEL_POWER_SWITCH: { + int value = p.readInt32(); + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + int ret = fbcIns->cfbc_Set_FBC_panel_power_switch(COMM_DEV_SERIAL, value); + r->writeInt32(ret); + } else { + r->writeInt32(-1); + } + break; + } + case FACTORY_FBC_PANEL_SUSPEND: { + int value = p.readInt32(); + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + int ret = fbcIns->cfbc_Set_FBC_suspend(COMM_DEV_SERIAL, value); + r->writeInt32(ret); + } else { + r->writeInt32(-1); + } + break; + } + case FACTORY_FBC_PANEL_USER_SETTING_DEFAULT: { + int value = p.readInt32(); + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + int ret = fbcIns->cfbc_Set_FBC_User_Setting_Default(COMM_DEV_SERIAL, value); + r->writeInt32(ret); + } else { + r->writeInt32(-1); + } + break; + } + case FACTORY_FBC_POWER_REBOOT: { + int value = p.readInt32(); + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + int ret = fbcIns->cfbc_SendRebootToUpgradeCmd(COMM_DEV_SERIAL, value); + r->writeInt32(ret); + } else { + r->writeInt32(-1); + } + break; + } + case FACTORY_FBC_SEND_KEY_TO_FBC: { + int keyCode = p.readInt32(); + int param = p.readInt32(); + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + int ret = fbcIns->cfbc_FBC_Send_Key_To_Fbc(COMM_DEV_SERIAL, keyCode, param); + r->writeInt32(ret); + } else { + r->writeInt32(-1); + } + break; + } + case FACTORY_WHITE_BALANCE_SET_GAIN_RED: { + int source_type = p.readInt32(); + int colortemp_mode = p.readInt32(); + int value = p.readInt32(); + int ret = mpTv->Tv_FactorySetWhiteBalanceRedGain(source_type, colortemp_mode, value); + r->writeInt32(ret); + break; + } + case FACTORY_WHITE_BALANCE_GET_GAIN_RED: { + int source_type = p.readInt32(); + int colortemp_mode = p.readInt32(); + int ret = mpTv->Tv_FactoryGetWhiteBalanceRedGain(source_type, colortemp_mode); + r->writeInt32(ret); + break; + } + case FACTORY_WHITE_BALANCE_SET_GAIN_GREEN: { + int source_type = p.readInt32(); + int colortemp_mode = p.readInt32(); + int value = p.readInt32(); + int ret = mpTv->Tv_FactorySetWhiteBalanceGreenGain(source_type, colortemp_mode, value); + r->writeInt32(ret); + break; + } + case FACTORY_WHITE_BALANCE_GET_GAIN_GREEN: { + int source_type = p.readInt32(); + int colortemp_mode = p.readInt32(); + int ret = mpTv->Tv_FactoryGetWhiteBalanceGreenGain(source_type, colortemp_mode); + r->writeInt32(ret); + break; + } + case FACTORY_WHITE_BALANCE_SET_GAIN_BLUE: { + int source_type = p.readInt32(); + int colortemp_mode = p.readInt32(); + int value = p.readInt32(); + int ret = mpTv->Tv_FactorySetWhiteBalanceBlueGain(source_type, colortemp_mode, value); + r->writeInt32(ret); + break; + } + case FACTORY_WHITE_BALANCE_GET_GAIN_BLUE: { + int source_type = p.readInt32(); + int colortemp_mode = p.readInt32(); + int ret = mpTv->Tv_FactoryGetWhiteBalanceBlueGain(source_type, colortemp_mode); + r->writeInt32(ret); + break; + } + case FACTORY_WHITE_BALANCE_SET_OFFSET_RED: { + int source_type = p.readInt32(); + int colortemp_mode = p.readInt32(); + int value = p.readInt32(); + int ret = mpTv->Tv_FactorySetWhiteBalanceRedOffset(source_type, colortemp_mode, value); + r->writeInt32(ret); + break; + } + case FACTORY_WHITE_BALANCE_GET_OFFSET_RED: { + int source_type = p.readInt32(); + int colortemp_mode = p.readInt32(); + int ret = mpTv->Tv_FactoryGetWhiteBalanceRedOffset(source_type, colortemp_mode); + r->writeInt32(ret); + break; + } + case FACTORY_WHITE_BALANCE_SET_OFFSET_GREEN: { + int source_type = p.readInt32(); + int colortemp_mode = p.readInt32(); + int value = p.readInt32(); + int ret = mpTv->Tv_FactorySetWhiteBalanceGreenOffset(source_type, colortemp_mode, value); + r->writeInt32(ret); + break; + } + case FACTORY_WHITE_BALANCE_GET_OFFSET_GREEN: { + int source_type = p.readInt32(); + int colortemp_mode = p.readInt32(); + int ret = mpTv->Tv_FactoryGetWhiteBalanceGreenOffset(source_type, colortemp_mode); + r->writeInt32(ret); + break; + } + case FACTORY_WHITE_BALANCE_SET_OFFSET_BLUE: { + int source_type = p.readInt32(); + int colortemp_mode = p.readInt32(); + int value = p.readInt32(); + int ret = mpTv->Tv_FactorySetWhiteBalanceBlueOffset(source_type, colortemp_mode, value); + r->writeInt32(ret); + break; + } + case FACTORY_WHITE_BALANCE_GET_OFFSET_BLUE: { + int source_type = p.readInt32(); + int colortemp_mode = p.readInt32(); + int ret = mpTv->Tv_FactoryGetWhiteBalanceBlueOffset(source_type, colortemp_mode); + r->writeInt32(ret); + break; + } + case FACTORY_WHITE_BALANCE_GET_COLOR_TMP: { + int source_type = p.readInt32(); + int ret = mpTv->Tv_FactoryGetWhiteBalanceColorTempMode(source_type); + r->writeInt32(ret); + break; + } + case FACTORY_WHITE_BALANCE_SET_COLOR_TMP: { + int source_type = p.readInt32(); + int Tempmode = p.readInt32(); + int is_save = p.readInt32(); + int ret = mpTv->Tv_FactorySetWhiteBalanceColorTempMode(source_type, Tempmode, is_save); + r->writeInt32(ret); + break; + } + case FACTORY_WHITE_BALANCE_SAVE_PRAMAS: { + int source_type = p.readInt32(); + int mode = p.readInt32(); + int r_gain = p.readInt32(); + int g_gain = p.readInt32(); + int b_gain = p.readInt32(); + int r_offset = p.readInt32(); + int g_offset = p.readInt32(); + int b_offset = p.readInt32(); + int ret = mpTv->Tv_FactorySaveWhiteBalancePramas(source_type, mode, r_gain, g_gain, b_gain, r_offset, g_offset, b_offset); + r->writeInt32(ret); + break; + } + case FACTORY_WHITE_BALANCE_OPEN_GRAY_PATTERN: { + int ret = mpTv->Tv_FactoryOpenWhiteBalanceGrayPattern(); + r->writeInt32(ret); + break; + } + case FACTORY_WHITE_BALANCE_CLOSE_GRAY_PATTERN: { + int ret = mpTv->Tv_FactoryCloseWhiteBalanceGrayPattern(); + r->writeInt32(ret); + break; + } + case FACTORY_WHITE_BALANCE_SET_GRAY_PATTERN: { + int value = p.readInt32(); + int ret = mpTv->Tv_FactorySetWhiteBalanceGrayPattern(value); + r->writeInt32(ret); + break; + } + case FACTORY_WHITE_BALANCE_GET_GRAY_PATTERN: { + int ret = mpTv->Tv_FactoryGetWhiteBalanceGrayPattern(); + r->writeInt32(ret); + break; + } + case FACTORY_WHITE_BALANCE_GET_ALL_PRAMAS: { + int Tempmode = p.readInt32(); + int ret = -1; + tcon_rgb_ogo_t params; + if (GetPlatformHaveFBCFlag() == 0) { //T868 + ret = mpTv->GetColorTemperatureParams((vpp_color_temperature_mode_t)Tempmode, ¶ms); + } else { //T866 + ret = mpTv->Tv_FactoryWhiteBalanceGetAllParams(Tempmode, ¶ms); + } + r->writeInt32(ret); + r->writeInt32(params.r_gain); + r->writeInt32(params.g_gain); + r->writeInt32(params.b_gain); + r->writeInt32(params.r_post_offset); + r->writeInt32(params.g_post_offset); + r->writeInt32(params.b_post_offset); + } + case STOP_SCAN: { + mpTv->stopScanLock(); + break; + } + case DTV_GET_SNR: { + int tmpRet = 0; + tmpRet = mpTv->getFrontendSNR(); + r->writeInt32(tmpRet); + break; + } + case DTV_GET_BER: { + int tmpRet = 0; + tmpRet = mpTv->getFrontendBER(); + r->writeInt32(tmpRet); + break; + } + case DTV_GET_STRENGTH: { + int tmpRet = 0; + tmpRet = mpTv->getFrontendSignalStrength(); + r->writeInt32(tmpRet); + break; + } + case DTV_GET_AUDIO_TRACK_NUM: { + int programId = p.readInt32(); + int retCnt = 0; + retCnt = mpTv->getAudioTrackNum(programId); + r->writeInt32(retCnt); + break; + } + case DTV_GET_AUDIO_TRACK_INFO: { + int progId = p.readInt32(); + int aIdx = p.readInt32(); + int aFmt = -1; + int iRet = -1; + String8 lang; + iRet = mpTv->getAudioInfoByIndex(progId, aIdx, &aFmt, lang); + r->writeInt32(aFmt); + r->writeString16(String16(lang)); + break; + } + case DTV_SWITCH_AUDIO_TRACK: { + int progId = p.readInt32(); + int aTackIdx = p.readInt32(); + int ret = -1; + ret = mpTv->switchAudioTrack(progId, aTackIdx); + r->writeInt32(ret); + if (0 == ret) { + CTvProgram prog; + prog.setCurrAudioTrackIndex(progId, aTackIdx); + } + break; + } + case DTV_GET_CURR_AUDIO_TRACK_INDEX: { + int currAduIdx = -1; + int progId = p.readInt32(); + CTvProgram prog; + CTvProgram::selectByID(progId, prog); + currAduIdx = prog.getCurrAudioTrackIndex(); + r->writeInt32(currAduIdx); + break; + } + case DTV_SET_AUDIO_CHANNEL_MOD: { + int audioChannelIdx = p.readInt32(); + mpTv->setAudioChannel(audioChannelIdx); + break; + } + case DTV_GET_AUDIO_CHANNEL_MOD: { + int currChannelMod; + currChannelMod = mpTv->getAudioChannel(); + r->writeInt32(currChannelMod); + break; + } + case DTV_GET_CUR_FREQ: { + int progId = p.readInt32(); + int freq = 0; + int iRet = -1; + CTvProgram prog; + CTvChannel channel; + + iRet = CTvProgram::selectByID(progId, prog); + if (0 != iRet) return -1; + prog.getChannel(channel); + freq = channel.getFrequency(); + r->writeInt32(freq); + break; + } + case DTV_GET_EPG_UTC_TIME: { + int iRet = -1; + int utcTime = 0; + + utcTime = mpTv->getTvTime(); + + r->writeInt32(utcTime); + break; + } + case DTV_GET_EPG_INFO_POINT_IN_TIME: { + int progid = p.readInt32(); + int utcTime = p.readInt32(); + CTvProgram prog; + int ret = CTvProgram::selectByID(progid, prog); + CTvEvent ev; + ret = ev.getProgPresentEvent(prog.getSrc(), prog.getID(), utcTime, ev); + r->writeString16(String16(ev.getName())); + r->writeString16(String16(ev.getDescription())); + r->writeString16(String16(ev.getExtDescription())); + r->writeInt32(ev.getStartTime()); + r->writeInt32(ev.getEndTime()); + r->writeInt32(ev.getSubFlag()); + r->writeInt32(ev.getEventId()); + break; + } + case DTV_GET_EPG_INFO_DURATION: { + int iRet = -1; + int iObOutSize = 0; + Vector<sp<CTvEvent> > epgOut; + int progid = p.readInt32(); + int iUtcStartTime = p.readInt32(); + int iDurationTime = p.readInt32(); + CTvProgram prog; + CTvEvent ev; + iRet = CTvProgram::selectByID(progid, prog); + if (0 != iRet) { + break; + } + iRet = ev.getProgScheduleEvents(prog.getSrc(), prog.getID(), iUtcStartTime, iDurationTime, epgOut); + if (0 != iRet) { + break; + } + iObOutSize = epgOut.size(); + if (0 == iObOutSize) { + break; + } + + r->writeInt32(iObOutSize); + for (int i = 0; i < iObOutSize; i ++) { + r->writeString16(String16(epgOut[i]->getName())); + r->writeString16(String16(epgOut[i]->getDescription())); + r->writeString16(String16(ev.getExtDescription())); + r->writeInt32(epgOut[i]->getStartTime()); + r->writeInt32(epgOut[i]->getEndTime()); + r->writeInt32(epgOut[i]->getSubFlag()); + r->writeInt32(epgOut[i]->getEventId()); + } + break; + } + case DTV_SET_PROGRAM_NAME: { + CTvProgram prog; + int progid = p.readInt32(); + String16 tmpName = p.readString16(); + String8 strName = String8(tmpName); + prog.updateProgramName(progid, strName); + break; + } + case DTV_SET_PROGRAM_SKIPPED: { + CTvProgram prog; + int progid = p.readInt32(); + bool bSkipFlag = p.readInt32(); + prog.setSkipFlag(progid, bSkipFlag); + break; + } + case DTV_SET_PROGRAM_FAVORITE: { + CTvProgram prog; + int progid = p.readInt32(); + bool bFavorite = p.readInt32(); + prog.setFavoriteFlag(progid, bFavorite); + break; + } + case DTV_DETELE_PROGRAM: { + CTvProgram prog; + int progid = p.readInt32(); + prog.deleteProgram(progid); + break; + } + case SET_BLACKOUT_ENABLE: { + int enable = p.readInt32(); + mpTv->setBlackoutEnable(enable); + break; + } + case START_AUTO_BACKLIGHT: { + mpTv->startAutoBackLight(); + break; + } + case STOP_AUTO_BACKLIGHT: { + mpTv->stopAutoBackLight(); + break; + } + case IS_AUTO_BACKLIGHTING: { + int on = mpTv->getAutoBackLight_on_off(); + r->writeInt32(on); + break; + } + case SSM_READ_BLACKOUT_ENABLE: { + int enable = mpTv->getSaveBlackoutEnable(); + r->writeInt32(enable); + break; + } + case DTV_SWAP_PROGRAM: { + CTvProgram prog; + int firstProgId = p.readInt32(); + int secondProgId = p.readInt32(); + CTvProgram::selectByID(firstProgId, prog); + int firstChanOrderNum = prog.getChanOrderNum(); + CTvProgram::selectByID(secondProgId, prog); + int secondChanOrderNum = prog.getChanOrderNum(); + prog.swapChanOrder(firstProgId, firstChanOrderNum, secondProgId, secondChanOrderNum); + break; + } + case DTV_SET_PROGRAM_LOCKED: { + CTvProgram prog; + int progid = p.readInt32(); + bool bLocked = p.readInt32(); + prog.setLockFlag(progid, bLocked); + break; + } + case DTV_SET_BOOKING_FLAG: { + CTvEvent ev; + int iEvtId = p.readInt32(); + bool iBookFlag = (bool)p.readInt32(); + ev.bookEvent(iEvtId, iBookFlag); + break; + } + case DTV_GET_FREQ_BY_PROG_ID: { + int freq = 0; + int progid = p.readInt32(); + CTvProgram prog; + int ret = CTvProgram::selectByID(progid, prog); + if (ret != 0) return -1; + CTvChannel channel; + prog.getChannel(channel); + freq = channel.getFrequency(); + r->writeInt32(freq); + break; + } + case DTV_GET_BOOKED_EVENT: { + CTvBooking tvBook; + Vector<sp<CTvBooking> > vTvBookOut; + tvBook.getBookedEventList(vTvBookOut); + int iObOutSize = vTvBookOut.size(); + if (0 == iObOutSize) { + break; + } + r->writeInt32(iObOutSize); + for (int i = 0; i < iObOutSize; i ++) { + r->writeString16(String16(vTvBookOut[i]->getProgName())); + r->writeString16(String16(vTvBookOut[i]->getEvtName())); + r->writeInt32(vTvBookOut[i]->getStartTime()); + r->writeInt32(vTvBookOut[i]->getDurationTime()); + r->writeInt32(vTvBookOut[i]->getBookId()); + r->writeInt32(vTvBookOut[i]->getProgramId()); + r->writeInt32(vTvBookOut[i]->getEventId()); + } + break; + } + case SET_FRONTEND_PARA: { + int ret = -1; + frontend_para_set_t feParms; + feParms.mode = (fe_type_t)p.readInt32(); + feParms.freq = p.readInt32(); + feParms.videoStd = (atv_video_std_t)p.readInt32(); + feParms.audioStd = (atv_audio_std_t)p.readInt32(); + feParms.para1 = p.readInt32(); + feParms.para2 = p.readInt32(); + mpTv->resetFrontEndPara(feParms); + r->writeInt32(ret); + break; + } + case PLAY_PROGRAM: { + int progid = p.readInt32(); + mpTv->playProgramLock(progid); + break; + } + case GET_PROGRAM_LIST: { + Vector<sp<CTvProgram> > out; + int type = p.readInt32(); + int skip = p.readInt32(); + CTvProgram::selectByType(type, skip, out); + r->writeInt32(out.size()); + for (int i = 0; i < out.size(); i++) { + r->writeInt32(out[i]->getID()); + r->writeInt32(out[i]->getChanOrderNum()); + r->writeInt32(out[i]->getMajor()); + r->writeInt32(out[i]->getMinor()); + r->writeInt32(out[i]->getProgType()); + r->writeString16(String16(out[i]->getName())); + r->writeInt32(out[i]->getProgSkipFlag()); + r->writeInt32(out[i]->getFavoriteFlag()); + r->writeInt32(out[i]->getVideo()->getFormat()); + CTvChannel ch; + out[i]->getChannel(ch); + r->writeInt32(ch.getDVBTSID()); + r->writeInt32(out[i]->getServiceId()); + r->writeInt32(out[i]->getVideo()->getPID()); + r->writeInt32(out[i]->getVideo()->getPID()); + + int audioTrackSize = out[i]->getAudioTrackSize(); + r->writeInt32(audioTrackSize); + for (int j = 0; j < audioTrackSize; j++) { + r->writeString16(String16(out[i]->getAudio(j)->getLang())); + r->writeInt32(out[i]->getAudio(j)->getFormat()); + r->writeInt32(out[i]->getAudio(j)->getPID()); + } + r->writeInt32(ch.getFrequency()); + } + break; + } + case DTV_GET_VIDEO_FMT_INFO: { + int srcWidth = 0; + int srcHeight = 0; + int srcFps = 0; + int srcInterlace = 0; + int iRet = -1; + + iRet == mpTv->getVideoFormatInfo(&srcWidth, &srcHeight, &srcFps, &srcInterlace); + r->writeInt32(srcWidth); + r->writeInt32(srcHeight); + r->writeInt32(srcFps); + r->writeInt32(srcInterlace); + r->writeInt32(iRet); + } + break; + + case DTV_START_RECORD: { + char buf[256]; + String16 tmpName = p.readString16(); + String8 strName = String8(tmpName); + sprintf(buf, "%s", strName.string()); + mpTv->SetRecordFileName(buf); + mpTv->StartToRecord(); + } + break; + case DTV_STOP_RECORD: + mpTv->StopRecording(); + break; + case DTV_SET_RECORD_ALL_TS: { + int sel = p.readInt32(); + mpTv->SetRecCurTsOrCurProgram(sel); + } + break; + case TV_PRINT_DEBUG_INFO: + mpTv->printDebugInfo(); + break; + // EXTAR END + default: + LOGD("default"); + break; + } + return 0; +} + +sp<TvService::Client> TvService::Client::getClientFromCookie(void *user) +{ + sp<Client> client = 0; + /* + TvService *service = static_cast<TvService*> (user); + if (service != NULL) { + Mutex::Autolock ourLock(service->mServiceLock); + if (service->mClient != 0) { + client = service->mClient.promote(); + if (client == 0) { + LOGE("getClientFromCookie: client appears to have died"); + service->mClient.clear(); + } + } else { + LOGE("getClientFromCookie: got callback but client was NULL"); + } + }*/ + return client; +} + +void TvService::Client::notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2, void *user) +{ + LOGD("notifyCallback(%d)", msgType); + + sp<Client> client = getClientFromCookie(user); + if (client == 0) { + return; + } + + switch (msgType) { + //case TV_MSG_SHUTTER: + // ext1 is the dimension of the yuv picture. + // client->handleShutter((image_rect_type *)ext1); + // break; + default: + sp<ITvClient> c = client->mTvClient; + if (c != NULL) { + //c->notifyCallback(msgType, ext1, ext2); + } + break; + } + +#if DEBUG_CLIENT_REFERENCES + if (client->getStrongCount() == 1) { + LOGE("++++++++++++++++ (NOTIFY CALLBACK) THIS WILL CAUSE A LOCKUP!"); + client->printRefs(); + } +#endif +} + +int TvService::Client::notifyCallback(const int &msgtype, const Parcel &p) +{ + mTvClient->notifyCallback(msgtype, p); + return 0; +} + +status_t TvService::onTransact(uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) +{ + // permission checks... + switch (code) { + case BnTvService::CONNECT: + IPCThreadState *ipc = IPCThreadState::self(); + const int pid = ipc->getCallingPid(); + const int self_pid = getpid(); + if (pid != self_pid) { + // we're called from a different process, do the real check + /*if (!checkCallingPermission( + String16("android.permission.TV"))) + { + const int uid = ipc->getCallingUid(); + LOGE("Permission Denial: " + "can't use the tv pid=%d, uid=%d", pid, uid); + return PERMISSION_DENIED; + }*/ + } + break; + } + + status_t err = BnTvService::onTransact(code, data, reply, flags); + +#if DEBUG_HEAP_LEAKS + LOGE("+++ onTransact err %d code %d", err, code); + + if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) { + LOGE("+++ onTransact code %d", code); + + CHECK_INTERFACE(ITvService, data, reply); + + switch (code) { + case 1000: { + if (gWeakHeap != 0) { + sp<IMemoryHeap> h = gWeakHeap.promote(); + IMemoryHeap *p = gWeakHeap.unsafe_get(); + LOGE("CHECKING WEAK REFERENCE %p (%p)", h.get(), p); + if (h != 0) + h->printRefs(); + bool attempt_to_delete = data.readInt32() == 1; + if (attempt_to_delete) { + // NOT SAFE! + LOGE("DELETING WEAK REFERENCE %p (%p)", h.get(), p); + if (p) delete p; + } + return NO_ERROR; + } + } + break; + default: + break; + } + } +#endif // DEBUG_HEAP_LEAKS + return err; +} + diff --git a/tvapi/android/tvserver/TvService.h b/tvapi/android/tvserver/TvService.h new file mode 100644 index 0000000..66a6418 --- a/dev/null +++ b/tvapi/android/tvserver/TvService.h @@ -0,0 +1,83 @@ +#ifndef ANDROID_SERVERS_TV_TVSERVICE_H +#define ANDROID_SERVERS_TV_TVSERVICE_H + +#include <include/ITvService.h> +#include <include/Tv.h> +#include <utils/threads.h> +#include <utils/Vector.h> +#include <stdint.h> +#include <tv/CTv.h> +#include "tv/CTvScreenCapture.h" + +using namespace android; + +#define DEBUG_HEAP_LEAKS 0 +#define RESOURCE_NUMS 5 + +class TvService: public BnTvService , public CTv::TvIObserver, public CTvScreenCapture::TvIObserver +{ +public: + class Client: public BnTv + { + public: + Client(const sp<TvService> &tvService, const sp<ITvClient> &tvClient, pid_t clientPid, CTv *pTv); + Client(); + virtual ~Client(); + virtual void disconnect(); + virtual status_t connect(const sp<ITvClient> &client); + virtual status_t lock(); + virtual status_t unlock(); + virtual status_t processCmd(const Parcel &p, Parcel *r); + virtual status_t createSubtitle(const sp<IMemory> &share_mem); + virtual status_t createVideoFrame(const sp<IMemory> &share_mem); + + // our client... + const sp<ITvClient> &getTvClient() const + { + return mTvClient; + } + + int notifyCallback(const int &msgtype, const Parcel &p); + String16 mStrName; + static void notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2, void *user); + private: + friend class CTv; + friend class TvService; + status_t checkPid(); + static sp<Client> getClientFromCookie(void *user); + + mutable Mutex mLock; + mutable Condition mReady; + sp<TvService> mTvService; + sp<ITvClient> mTvClient; + pid_t mClientPid; + int mGetNotifyFlag; + int mCurProgIndex; + CTv *mpTv; + bool mIsStartTv; + };//end client + + virtual sp<ITv> connect(const sp<ITvClient> &tvClient); + + virtual void onTvEvent(const CTvEv &ev); + void removeClient(const sp<ITvClient> &tvClient); + + Client *mpStartTvClient; + wp<Client> mpScannerClient; + static void instantiate(CTv *pTv); + Vector< wp<Client> > m_v_Clients; + +private: + TvService(CTv *pTv); + virtual ~TvService(); + virtual status_t onTransact(uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags); + volatile int32_t mUsers; + virtual void incUsers(); + virtual void decUsers(); + mutable Mutex mServiceLock; + CTv *mpTv; + CTvScreenCapture mCapVidFrame; + +}; + +#endif diff --git a/tvapi/android/tvserver/main.cpp b/tvapi/android/tvserver/main.cpp new file mode 100644 index 0000000..0218dbe --- a/dev/null +++ b/tvapi/android/tvserver/main.cpp @@ -0,0 +1,23 @@ +#include <sys/types.h> +#include <unistd.h> +#include <grp.h> +#include <binder/IPCThreadState.h> +#include <binder/ProcessState.h> +#include <binder/IServiceManager.h> +#include <utils/Log.h> +#include "TvService.h" + +using namespace android; + +int main(int argc, char **argv) +{ + sp<ProcessState> proc(ProcessState::self()); + sp<IServiceManager> sm = defaultServiceManager(); + TvService::instantiate(); + + ProcessState::self()->startThreadPool(); + IPCThreadState::self()->joinThreadPool(); + + return 0; +} + diff --git a/tvapi/build/include/.gitignore b/tvapi/build/include/.gitignore new file mode 100644 index 0000000..e69de29 --- a/dev/null +++ b/tvapi/build/include/.gitignore diff --git a/tvapi/build/include/xxxconfig.h b/tvapi/build/include/xxxconfig.h new file mode 100644 index 0000000..2f305c9 --- a/dev/null +++ b/tvapi/build/include/xxxconfig.h @@ -0,0 +1 @@ +#include <ref_n300_v1/ref_n300_v1.h> diff --git a/tvapi/docs/TVMiddleware初期.wps b/tvapi/docs/TVMiddleware初期.wps new file mode 100644 index 0000000..2a842e7 --- a/dev/null +++ b/tvapi/docs/TVMiddleware初期.wps @@ -0,0 +1,252 @@ +ࡱ +NB\vj +NB\S(u, +NB\. +NNNN, +NN(u^\NT +NSNTekYt}Y, + + + + + + + + + + + + +& +& +& +& +& +& +& +& +& +& + + +& +& +& +& +& +& +& +& +& +& +& + +& +& +& +& +& +& +& +& +& +& +& +& +& +& +& +& +& +& +& +& +& + +& +& +& +& +& +& +& +& +& +& +& +& +& +& +& +& +& +& +& +& +& +& +& +& +& +& +& +& +& +& +& +& +& +& +& +& +& +& +& + +& +0 +0 + + +6mҍ~>N{Tr +<@-J~bDien-lؠ3XPj*U
RXftlVu,|[2[ƠXMŲ/́bx
gd
L +H$< \_CQ>87!\L/@CW
@mD +"X3 +ih +9d`,]pZN +UϼNL6k&gDg
5u^=l@!9 +i64nJ iQmq;-k;>(P.H|Ǯz{N +`YB`nH"k6W6sRX)PПa,Kٜd_ߵY79iRݻl,$<7eDe/4KA_!r6ڰ 6fAoCh4(*CWZxpu084ٕkWBhwjX/[E0N(2u6 +Yō}SSx9N.9-9rQZ+C;dʼn-~ΘYu$;hǶ&q$~p~gc)f;͚,coi߆8F_LnHrMqajIVC証OðwxK +,6Kߺ:xrc'H^ZDӾqYj_q㑋K4n$0}{D@%*/$װOyReY ?ȂLYR_늲@-?k5x= +9G3βԩ0ȓa]x@)bʸqt
ʢCˠbT1lvݵ/ + + + + + +000000;[ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tvapi/docs/tv.uml b/tvapi/docs/tv.uml new file mode 100644 index 0000000..15238f7 --- a/dev/null +++ b/tvapi/docs/tv.uml @@ -0,0 +1,6093 @@ +<?xml version="1.0" encoding="UTF-8"?> +<XPD:PROJECT xmlns:XPD="http://www.staruml.com" version="1"> +<XPD:HEADER> +<XPD:SUBUNITS> +</XPD:SUBUNITS> +<XPD:PROFILES> +<XPD:PROFILE>UMLStandard</XPD:PROFILE> +<XPD:PROFILE>Java</XPD:PROFILE> +<XPD:PROFILE>Cpp</XPD:PROFILE> +</XPD:PROFILES> +</XPD:HEADER> +<XPD:BODY> +<XPD:OBJ name="DocumentElement" type="UMLProject" guid="CoZuu0bDp0eooW1pQg6aQwAA"> +<XPD:ATTR name="Title" type="string">tv</XPD:ATTR> +<XPD:ATTR name="#OwnedElements" type="integer">5</XPD:ATTR> +<XPD:OBJ name="OwnedElements[0]" type="UMLModel" guid="6Ncym1qqME6Qmj4IRHZMIQAA"> +<XPD:ATTR name="Name" type="string">Use Case Model</XPD:ATTR> +<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR> +<XPD:ATTR name="StereotypeName" type="string">useCaseModel</XPD:ATTR> +<XPD:REF name="Namespace">CoZuu0bDp0eooW1pQg6aQwAA</XPD:REF> +<XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR> +<XPD:OBJ name="OwnedDiagrams[0]" type="UMLUseCaseDiagram" guid="nzFiqgF5PEKC+zYpaFKlCQAA"> +<XPD:ATTR name="Name" type="string">tv功</XPD:ATTR> +<XPD:REF name="DiagramOwner">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF> +<XPD:OBJ name="DiagramView" type="UMLUseCaseDiagramView" guid="nx0lwQzrskWozLI1S3LzQgAA"> +<XPD:REF name="Diagram">nzFiqgF5PEKC+zYpaFKlCQAA</XPD:REF> +<XPD:ATTR name="#OwnedViews" type="integer">17</XPD:ATTR> +<XPD:OBJ name="OwnedViews[0]" type="UMLActorView" guid="gvI3mIExBEmaszVtF0V6bwAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">116</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">40</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">86</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">78</XPD:ATTR> +<XPD:REF name="Model">jE6Hh4xWzk+ss1P1I88QbQAA</XPD:REF> +<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="FSYMWbRzs0mJbYfl9CkXfAAA"> +<XPD:OBJ name="NameLabel" type="LabelView" guid="+Fy828Qip0uc61sSAd0UwQAA"> +<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR> +<XPD:ATTR name="Text" type="string">user</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="TbdT9IJSLU+fl/JTxDnxxQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="LabelView" guid="aTiAvGpnHUGxIA1FbazntAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="UA5dbT7GVU2OqjVX9PXuWAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">jE6Hh4xWzk+ss1P1I88QbQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="9c90i0MrUkKipskFCo8wlgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">jE6Hh4xWzk+ss1P1I88QbQAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[1]" type="UMLUseCaseView" guid="gjXEJSzeBk24cBss5DrAhAAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">396</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">125</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">45</XPD:ATTR> +<XPD:REF name="Model">nAsf5tia702zzSQAu6L6VwAA</XPD:REF> +<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="WQwWYMpQtUCP6CaPlCcltQAA"> +<XPD:OBJ name="NameLabel" type="LabelView" guid="Nbu2DNQyW0K3OkEns8o8FgAA"> +<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR> +<XPD:ATTR name="Text" type="string">搜台</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="k8VZH0rfeUaxBRl8mSLwDAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="LabelView" guid="EL3VwTjdHkCZndTAtu6x0QAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="FCs4dSUL6ES18h1zCz8l6AAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">nAsf5tia702zzSQAu6L6VwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="sTCdfdSS0UiUUNZ/B2e/FAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">nAsf5tia702zzSQAu6L6VwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="ExtensionPointCompartment" type="UMLExtensionPointCompartmentView" guid="GczyMXZXJEmnDD4a7NAunwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">nAsf5tia702zzSQAu6L6VwAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[2]" type="UMLUseCaseView" guid="Frl6rGi4ekOSrHn6gJ5XLQAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">452</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">64</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">124</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">45</XPD:ATTR> +<XPD:REF name="Model">yCRgNkRB+EGAwzfBjdJbqwAA</XPD:REF> +<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="k0GCedKioUeNGvdENFUs4AAA"> +<XPD:OBJ name="NameLabel" type="LabelView" guid="GZ0SKDfylkCAWEwMblBG9gAA"> +<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR> +<XPD:ATTR name="Text" type="string">换台</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="zw9u23HITU+F7D/MPgZyoQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="LabelView" guid="ZaIixThNIkGc744Tm3CsugAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="aH6LRR4We0O3VrbkDZF2cwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">yCRgNkRB+EGAwzfBjdJbqwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="HAEKTxJSV0uP4v52ffOFQwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">yCRgNkRB+EGAwzfBjdJbqwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="ExtensionPointCompartment" type="UMLExtensionPointCompartmentView" guid="bSOUAy1Buk+obB82eUrFSQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">yCRgNkRB+EGAwzfBjdJbqwAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[3]" type="UMLUseCaseView" guid="Hyu7+1e/cES0Ae1OqV75fwAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">428</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">124</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">237</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">45</XPD:ATTR> +<XPD:REF name="Model">W59J2q05J0K29agobcVJpwAA</XPD:REF> +<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="3d2gFNlI6EK+jsWimDIS+QAA"> +<XPD:OBJ name="NameLabel" type="LabelView" guid="SVBydeRF006GMrAfC3ETqwAA"> +<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR> +<XPD:ATTR name="Text" type="string">得到当前台的信息/屏显</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="SU3HDI+ru0WNDK77syR/GQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="LabelView" guid="CS3PuOwuBkW7+xAe2clbBAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="6VTL4WFMHEigYGfaMrdGYwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">W59J2q05J0K29agobcVJpwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="7rrGYYen40CFqpViVSVmAQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">W59J2q05J0K29agobcVJpwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="ExtensionPointCompartment" type="UMLExtensionPointCompartmentView" guid="18I+62RrWEOFbvJ7hjlg4AAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">W59J2q05J0K29agobcVJpwAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[4]" type="UMLUseCaseView" guid="JsuyLQhZc0Sm5Tx7vxV+jAAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">416</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">212</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">178</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">45</XPD:ATTR> +<XPD:REF name="Model">ExhZCRayVUq9VZBeXyOzSgAA</XPD:REF> +<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="kfnOa+AQV0Kj4BKPF56htAAA"> +<XPD:OBJ name="NameLabel" type="LabelView" guid="6bLEGGIsiU6zFFc9j4F49wAA"> +<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR> +<XPD:ATTR name="Text" type="string">得到全部台的列表</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="ADRdb9imSEChWP9jDiJFWgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="LabelView" guid="Gp396ZK3MUyBaxd1WCTOIQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="c8pFLtSKjE+idXYMkFpEQAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">ExhZCRayVUq9VZBeXyOzSgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="8s4aZ7v9JkWne3xJfZ0IqgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">ExhZCRayVUq9VZBeXyOzSgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="ExtensionPointCompartment" type="UMLExtensionPointCompartmentView" guid="qTH2RWpVvkyOG5CaahXI1AAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">ExhZCRayVUq9VZBeXyOzSgAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[5]" type="UMLAssociationView" guid="VKBbewCQmUyNjzWZhk3pLQAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Points" type="Points">201,70;396,34</XPD:ATTR> +<XPD:REF name="Model">hXa1Ze5PcEWvFq3WssbumAAA</XPD:REF> +<XPD:REF name="Head">gjXEJSzeBk24cBss5DrAhAAA</XPD:REF> +<XPD:REF name="Tail">gvI3mIExBEmaszVtF0V6bwAA</XPD:REF> +<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="dgQAXdF4ZESvmtHR7mV1eAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">hXa1Ze5PcEWvFq3WssbumAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="nl0ivvTPhk6+ZWGNY3Z7QQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:REF name="Model">hXa1Ze5PcEWvFq3WssbumAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="21Re8Yow20OMsCn0YuNvyQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">hXa1Ze5PcEWvFq3WssbumAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="g4iIuaL510KG496BLjSxFAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">1h+kSCXpe0eWYNVJ4SXvTQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="gJVKivaSkUOMWN8rIdDn4gAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">2RBODiwfOUCUVzGJ/32wAAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="TwLEoTMD10ehV8UPEkC8GAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">1h+kSCXpe0eWYNVJ4SXvTQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="xB9CaPtaBEGmmoo1GYSHmAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">2RBODiwfOUCUVzGJ/32wAAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="9JL65E1Ll0K/gBYTvW27ggAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">1h+kSCXpe0eWYNVJ4SXvTQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="bGKgfsVj9UqvRKTQT54jnwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">2RBODiwfOUCUVzGJ/32wAAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="W8FWavR8aUaHm9U8dXz4VgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">1h+kSCXpe0eWYNVJ4SXvTQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="hx6u1xKLF028b6Yykl/JVwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">2RBODiwfOUCUVzGJ/32wAAAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[6]" type="UMLAssociationView" guid="T2Ct5boioEq1zBkQPfP1uAAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Points" type="Points">201,79;452,85</XPD:ATTR> +<XPD:REF name="Model">GWeTbEaAQUO+r17c6TtqcAAA</XPD:REF> +<XPD:REF name="Head">Frl6rGi4ekOSrHn6gJ5XLQAA</XPD:REF> +<XPD:REF name="Tail">gvI3mIExBEmaszVtF0V6bwAA</XPD:REF> +<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="itC6+9KIkUOoqvWzhIL9eAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">GWeTbEaAQUO+r17c6TtqcAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="yn7EMIRfMUivZuavba1QKgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:REF name="Model">GWeTbEaAQUO+r17c6TtqcAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="qp8dQ4Cl50OUly+002LHkwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">GWeTbEaAQUO+r17c6TtqcAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="K/CL0noaSEeVxfiH/AYdPQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">7KhVXW2jsUGTY2YhCHULSAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="Cko4gh6CNESvzEaGX7xrTwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">LAvKrCSTOk+Idehr21cMIwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="gJsX46E8OEivWSn9FKGyIgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">7KhVXW2jsUGTY2YhCHULSAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="YXCHfhVdWUSEN2ZT/RAgUwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">LAvKrCSTOk+Idehr21cMIwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="+sQ4dyQOwEyKXN3Siy8SeAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">7KhVXW2jsUGTY2YhCHULSAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="3/az9bmrj0OrABD1RgT7zgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">LAvKrCSTOk+Idehr21cMIwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="g0gSj9MvXEy5XaeQkbjoOwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">7KhVXW2jsUGTY2YhCHULSAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="QhKdEmGlb021SYaW2m8l2AAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">LAvKrCSTOk+Idehr21cMIwAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[7]" type="UMLAssociationView" guid="AyvrWm4rVU2nEQ3SaHF+pwAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Points" type="Points">201,86;428,125</XPD:ATTR> +<XPD:REF name="Model">R+Mv7uh5kEuKr/Bia3KOhAAA</XPD:REF> +<XPD:REF name="Head">Hyu7+1e/cES0Ae1OqV75fwAA</XPD:REF> +<XPD:REF name="Tail">gvI3mIExBEmaszVtF0V6bwAA</XPD:REF> +<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="Ic1rMSlGuEiOmC74Gs5VPgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">R+Mv7uh5kEuKr/Bia3KOhAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="LmeDzwQ4WE+N9ctpkvJC2QAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:REF name="Model">R+Mv7uh5kEuKr/Bia3KOhAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="/4mMqWe3yUWrZLbs6l2tZwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">R+Mv7uh5kEuKr/Bia3KOhAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="/DGBSl3cJ0S8W6nJJJGcfwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">X1+FYBSOWkaYgLu2FjOTXwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="m94XoFukck+27/0mViZU2gAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">BPqYWvTNKEOfCOeMpPA44AAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="QQK2e0FGJkigWh9ObCBDRgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">X1+FYBSOWkaYgLu2FjOTXwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="rl15HxW7wUGsb4vRn7Al9wAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">BPqYWvTNKEOfCOeMpPA44AAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="WxqNKB0NhUqZpADhZw+P3QAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">X1+FYBSOWkaYgLu2FjOTXwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="A1ODeRbq4kaOK4HMvaTeRQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">BPqYWvTNKEOfCOeMpPA44AAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="Tj9w6ngJfUqetSitERQ8NQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">X1+FYBSOWkaYgLu2FjOTXwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="LFchLERMEE2qPO6m3DpPuQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">BPqYWvTNKEOfCOeMpPA44AAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[8]" type="UMLAssociationView" guid="QIXdxKII/kqOJOJMY5AcogAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Points" type="Points">201,97;455,212</XPD:ATTR> +<XPD:REF name="Model">WrC8vAeUYkO3tLCoOTTa7gAA</XPD:REF> +<XPD:REF name="Head">JsuyLQhZc0Sm5Tx7vxV+jAAA</XPD:REF> +<XPD:REF name="Tail">gvI3mIExBEmaszVtF0V6bwAA</XPD:REF> +<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="Xq0mZflYI0KV42hvumdugQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">WrC8vAeUYkO3tLCoOTTa7gAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="vwdwId1yNkaUtmkTI1YWuQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:REF name="Model">WrC8vAeUYkO3tLCoOTTa7gAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="1uoVEwi+dkyCZb5M7Pve2wAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">WrC8vAeUYkO3tLCoOTTa7gAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="4paVVhhoOU2GUrsd9Xm/FwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">pVT44Y4IlkCvW0rXC+dzRgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="kbnyVybMKEKdAdKhGeseZgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">uJNUdzUQLUu2aPlejTqjNwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="66pNRRmKjku3rnBmhfUBCgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">pVT44Y4IlkCvW0rXC+dzRgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="g5PdiNFseUGXOynpmdruGwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">uJNUdzUQLUu2aPlejTqjNwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="i3/GDxY4DU6ZMPvt2/tUdgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">pVT44Y4IlkCvW0rXC+dzRgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="71PEDgUjsU+2i57rKSIWiQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">uJNUdzUQLUu2aPlejTqjNwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="Bn3vSuvCAEGkNyVyOiDjtAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">pVT44Y4IlkCvW0rXC+dzRgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="WnuHsx6mVUGcSN3xCQss6QAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">uJNUdzUQLUu2aPlejTqjNwAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[9]" type="UMLUseCaseView" guid="B39+MGxIAUu2bla4M15wGQAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">428</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">344</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">182</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">45</XPD:ATTR> +<XPD:REF name="Model">5KAC2LjvX0qQF9lBa5DyCwAA</XPD:REF> +<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="G5wIehwq+0eIoXt5370UvgAA"> +<XPD:OBJ name="NameLabel" type="LabelView" guid="+OT5iGpyX0mfkpXaUy+lWgAA"> +<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR> +<XPD:ATTR name="Text" type="string">设置各种参数信息</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="liywRdQGmEmxnhyRBal4rAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="LabelView" guid="7R4zEmy7t0WDv/dHHBAF0AAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="kRxUjogV4k2YkluNvawsMAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">5KAC2LjvX0qQF9lBa5DyCwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="u8URrWr/hkiwdkqgLJdW+wAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">5KAC2LjvX0qQF9lBa5DyCwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="ExtensionPointCompartment" type="UMLExtensionPointCompartmentView" guid="KOSNG5KSM0CFIOZucCSmlwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">5KAC2LjvX0qQF9lBa5DyCwAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[10]" type="UMLAssociationView" guid="xD4JWSKF3EOTqNmsPzbc5QAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Points" type="Points">201,112;491,344</XPD:ATTR> +<XPD:REF name="Model">y+qwgLasMEm0UKrVQN8iJQAA</XPD:REF> +<XPD:REF name="Head">B39+MGxIAUu2bla4M15wGQAA</XPD:REF> +<XPD:REF name="Tail">gvI3mIExBEmaszVtF0V6bwAA</XPD:REF> +<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="Aug+XiD/L0C98F0lb8QKAgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">y+qwgLasMEm0UKrVQN8iJQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="+HDBsjEDKEqWUJZ9hnAU4QAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:REF name="Model">y+qwgLasMEm0UKrVQN8iJQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="8N0unm4hwUy3Q/ipJnkyXAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">y+qwgLasMEm0UKrVQN8iJQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="0NmimauDo0yxCgPn4bFExgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">iK2QfBiThkWwoji6bSWtswAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="evKHrFVG9kazUYsWGKYoRQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">jJgG/r4rjE2qAhy/U/lg2wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="YPI7wcCBTUybTm1Spbgg8QAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">iK2QfBiThkWwoji6bSWtswAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="JgCUSElncUaW/Ryki1kRMQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">jJgG/r4rjE2qAhy/U/lg2wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="ntmWchFV+UqAdPT3cz9/JQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">iK2QfBiThkWwoji6bSWtswAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="vquz6rX3pkKrylGBjx30IAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">jJgG/r4rjE2qAhy/U/lg2wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="edAtn71weU2/fvAr2uihoQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">iK2QfBiThkWwoji6bSWtswAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="CXIajd5ee06Zf7q4GbpG1QAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">jJgG/r4rjE2qAhy/U/lg2wAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[11]" type="UMLUseCaseView" guid="grqGSNiheUuwFijgmxch+gAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">236</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">280</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">130</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">45</XPD:ATTR> +<XPD:REF name="Model">eLOxpsSp0EC08r5lL9rsZAAA</XPD:REF> +<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="yd3L6GZKLkeQZ1rwi7QUdwAA"> +<XPD:OBJ name="NameLabel" type="LabelView" guid="kTZxfY7VPkO7bRwo+0E/QgAA"> +<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR> +<XPD:ATTR name="Text" type="string">预约</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="bjVlyswu/kSF04Iq8TwUcwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="LabelView" guid="xcQ9Vgj+k0eBpJoVYqjU+QAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="54HAvDvDa06v58oCDBCKXwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">eLOxpsSp0EC08r5lL9rsZAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="H5TD/VVzokWAABxo66dDiwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">eLOxpsSp0EC08r5lL9rsZAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="ExtensionPointCompartment" type="UMLExtensionPointCompartmentView" guid="qqfU97a8nUqfLL2CFuWnjQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">eLOxpsSp0EC08r5lL9rsZAAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[12]" type="UMLAssociationView" guid="kVRyhJmyWEyyp5wuc+OXngAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Points" type="Points">183,117;286,280</XPD:ATTR> +<XPD:REF name="Model">0s9c8w+QxUaASZ+fMtRSqQAA</XPD:REF> +<XPD:REF name="Head">grqGSNiheUuwFijgmxch+gAA</XPD:REF> +<XPD:REF name="Tail">gvI3mIExBEmaszVtF0V6bwAA</XPD:REF> +<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="FypCN9NIE0C9ShWHmH/yxQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">0s9c8w+QxUaASZ+fMtRSqQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="UYBImTsT3kmMLO4UVo7iDgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:REF name="Model">0s9c8w+QxUaASZ+fMtRSqQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="Dv0knjRPxEiA3FR76MzcQgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">0s9c8w+QxUaASZ+fMtRSqQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="qZ6wG2yUdUCrkCtj+ADq5gAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">rXVVaNhetUi+zkmUpV2EJAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="oRaZRwRR1E+ugfvMU7Mx7AAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">HQZk+9nVI02CjFsZTEmJFgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="5xmhglHNPkebUvE0zYQ+1QAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">rXVVaNhetUi+zkmUpV2EJAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="Rf4Y2d2tx0eAEgaVNgix1gAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">HQZk+9nVI02CjFsZTEmJFgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="TJu7E2BYn0e7KDkLvMy6zQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">rXVVaNhetUi+zkmUpV2EJAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="e0J/wN1wUUGY7r7RQqgfrQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">HQZk+9nVI02CjFsZTEmJFgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="HuuHMInFx0awxMfN0WO7nAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">rXVVaNhetUi+zkmUpV2EJAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="LK/960VLGUqFEI3dQB55GgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">HQZk+9nVI02CjFsZTEmJFgAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[13]" type="UMLUseCaseView" guid="1rgOrFraekaSjgPeaxo6VQAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">44</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">276</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">121</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">45</XPD:ATTR> +<XPD:REF name="Model">DfNIoYa4GU+CP71/W8SrWwAA</XPD:REF> +<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="gO3lj/0VEkmcGBM22vSVygAA"> +<XPD:OBJ name="NameLabel" type="LabelView" guid="5VgGyt6LmU26Ugzte0ke+QAA"> +<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR> +<XPD:ATTR name="Text" type="string">回放</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="OYamm5Q5wEmGKhCOoHHMVQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="LabelView" guid="SG00AIBfJE6CGLnrfQ6vHAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="rgrH2S52KUirNQUR897hjAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">DfNIoYa4GU+CP71/W8SrWwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="/Uw/TQZhfEa2XXCMAwNycQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">DfNIoYa4GU+CP71/W8SrWwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="ExtensionPointCompartment" type="UMLExtensionPointCompartmentView" guid="c8C4qOOrcUa+n6I+x3qsmwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">DfNIoYa4GU+CP71/W8SrWwAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[14]" type="UMLAssociationView" guid="FyWt2ux4n0C/jIWXlvGepAAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Points" type="Points">148,117;109,276</XPD:ATTR> +<XPD:REF name="Model">oYdSRRagC0OKiYHxCgS7CAAA</XPD:REF> +<XPD:REF name="Head">1rgOrFraekaSjgPeaxo6VQAA</XPD:REF> +<XPD:REF name="Tail">gvI3mIExBEmaszVtF0V6bwAA</XPD:REF> +<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="tzUYyPqymkyQTrpQ3ESfLQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">oYdSRRagC0OKiYHxCgS7CAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="WsC4wpiLwESJvBADsJOD0QAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:REF name="Model">oYdSRRagC0OKiYHxCgS7CAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="240EHYi+MUSGtsZ2MH9vbAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">oYdSRRagC0OKiYHxCgS7CAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="HGprZSDtFUGe58XLDa/llAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">AeXEiqTUjkaieSlGxTKX+QAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="jriPICawik+i/5uQ1tPPJQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">teHN23xRpE6lugxstCxsawAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="sgsEShSJaUa0m4iY/pH+kgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">AeXEiqTUjkaieSlGxTKX+QAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="oHna4JnixU6x5HHrqy8Y0gAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">teHN23xRpE6lugxstCxsawAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="zD5xP/cAIkyWZDkkr5ToygAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">AeXEiqTUjkaieSlGxTKX+QAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="CcjzfOb/A06oYHNBWwMyYAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">teHN23xRpE6lugxstCxsawAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="k/ixsOc3uECBJHIoPEzSCQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">AeXEiqTUjkaieSlGxTKX+QAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="eJcfvTsAsUKZSOjduilFwAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">teHN23xRpE6lugxstCxsawAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[15]" type="UMLUseCaseView" guid="mlqnICP04kuE2DQduAxCnAAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">676</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">208</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">121</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">45</XPD:ATTR> +<XPD:REF name="Model">eVrNXR8NqEC5uMEFgGKQ1gAA</XPD:REF> +<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="SRnkj+mMmkOMwzyxJwTibAAA"> +<XPD:OBJ name="NameLabel" type="LabelView" guid="2afuLG9SqEymSxMJuyHxJgAA"> +<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR> +<XPD:ATTR name="Text" type="string">保存数据</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="wUkUa3V6VU6SXo+560ZANAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="LabelView" guid="eeGzvESJskW2qRwldE4o8gAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="ZBT2RXZyKE2KgZdND0TQCwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">eVrNXR8NqEC5uMEFgGKQ1gAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="ayKElX0k9EWwlzIjQHBReAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">eVrNXR8NqEC5uMEFgGKQ1gAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="ExtensionPointCompartment" type="UMLExtensionPointCompartmentView" guid="TjYDD4DDi06is7FTfdSgGgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">eVrNXR8NqEC5uMEFgGKQ1gAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[16]" type="UMLActorView" guid="8+OH6W5lhU2orgFp9fejxAAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">896</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">36</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">72</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">78</XPD:ATTR> +<XPD:REF name="Model">EIFC2d0E6EScGB1xXji93AAA</XPD:REF> +<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="n/aO4ZyhvEOJuT58CBcC5gAA"> +<XPD:OBJ name="NameLabel" type="LabelView" guid="2ZhkQxFuGk2UQcb3DISJAQAA"> +<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR> +<XPD:ATTR name="Text" type="string">开发人员</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="y1MqUzbc4UeDdpEsqrK3GwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="LabelView" guid="0Oeejnt4GEuk0csGmClAQAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="55svG5LVmEayI1yOLF/hYgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">EIFC2d0E6EScGB1xXji93AAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="qt7RVSofskyCOe4IXevE3gAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">EIFC2d0E6EScGB1xXji93AAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +</XPD:OBJ> +</XPD:OBJ> +<XPD:ATTR name="#OwnedElements" type="integer">17</XPD:ATTR> +<XPD:OBJ name="OwnedElements[0]" type="UMLActor" guid="jE6Hh4xWzk+ss1P1I88QbQAA"> +<XPD:ATTR name="Name" type="string">user</XPD:ATTR> +<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">3</XPD:ATTR> +<XPD:REF name="Views[0]">gvI3mIExBEmaszVtF0V6bwAA</XPD:REF> +<XPD:REF name="Views[1]">UA5dbT7GVU2OqjVX9PXuWAAA</XPD:REF> +<XPD:REF name="Views[2]">9c90i0MrUkKipskFCo8wlgAA</XPD:REF> +<XPD:ATTR name="#Associations" type="integer">7</XPD:ATTR> +<XPD:REF name="Associations[0]">2RBODiwfOUCUVzGJ/32wAAAA</XPD:REF> +<XPD:REF name="Associations[1]">LAvKrCSTOk+Idehr21cMIwAA</XPD:REF> +<XPD:REF name="Associations[2]">BPqYWvTNKEOfCOeMpPA44AAA</XPD:REF> +<XPD:REF name="Associations[3]">uJNUdzUQLUu2aPlejTqjNwAA</XPD:REF> +<XPD:REF name="Associations[4]">jJgG/r4rjE2qAhy/U/lg2wAA</XPD:REF> +<XPD:REF name="Associations[5]">HQZk+9nVI02CjFsZTEmJFgAA</XPD:REF> +<XPD:REF name="Associations[6]">teHN23xRpE6lugxstCxsawAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[1]" type="UMLUseCase" guid="nAsf5tia702zzSQAu6L6VwAA"> +<XPD:ATTR name="Name" type="string">搜台</XPD:ATTR> +<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">gjXEJSzeBk24cBss5DrAhAAA</XPD:REF> +<XPD:REF name="Views[1]">FCs4dSUL6ES18h1zCz8l6AAA</XPD:REF> +<XPD:REF name="Views[2]">sTCdfdSS0UiUUNZ/B2e/FAAA</XPD:REF> +<XPD:REF name="Views[3]">GczyMXZXJEmnDD4a7NAunwAA</XPD:REF> +<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR> +<XPD:REF name="Associations[0]">1h+kSCXpe0eWYNVJ4SXvTQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[2]" type="UMLUseCase" guid="yCRgNkRB+EGAwzfBjdJbqwAA"> +<XPD:ATTR name="Name" type="string">换台</XPD:ATTR> +<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">Frl6rGi4ekOSrHn6gJ5XLQAA</XPD:REF> +<XPD:REF name="Views[1]">aH6LRR4We0O3VrbkDZF2cwAA</XPD:REF> +<XPD:REF name="Views[2]">HAEKTxJSV0uP4v52ffOFQwAA</XPD:REF> +<XPD:REF name="Views[3]">bSOUAy1Buk+obB82eUrFSQAA</XPD:REF> +<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR> +<XPD:REF name="Associations[0]">7KhVXW2jsUGTY2YhCHULSAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[3]" type="UMLUseCase" guid="W59J2q05J0K29agobcVJpwAA"> +<XPD:ATTR name="Name" type="string">得到当前台的信息/屏显</XPD:ATTR> +<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">Hyu7+1e/cES0Ae1OqV75fwAA</XPD:REF> +<XPD:REF name="Views[1]">6VTL4WFMHEigYGfaMrdGYwAA</XPD:REF> +<XPD:REF name="Views[2]">7rrGYYen40CFqpViVSVmAQAA</XPD:REF> +<XPD:REF name="Views[3]">18I+62RrWEOFbvJ7hjlg4AAA</XPD:REF> +<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR> +<XPD:REF name="Associations[0]">X1+FYBSOWkaYgLu2FjOTXwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[4]" type="UMLUseCase" guid="ExhZCRayVUq9VZBeXyOzSgAA"> +<XPD:ATTR name="Name" type="string">得到全部台的列表</XPD:ATTR> +<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">JsuyLQhZc0Sm5Tx7vxV+jAAA</XPD:REF> +<XPD:REF name="Views[1]">c8pFLtSKjE+idXYMkFpEQAAA</XPD:REF> +<XPD:REF name="Views[2]">8s4aZ7v9JkWne3xJfZ0IqgAA</XPD:REF> +<XPD:REF name="Views[3]">qTH2RWpVvkyOG5CaahXI1AAA</XPD:REF> +<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR> +<XPD:REF name="Associations[0]">pVT44Y4IlkCvW0rXC+dzRgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[5]" type="UMLAssociation" guid="hXa1Ze5PcEWvFq3WssbumAAA"> +<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">VKBbewCQmUyNjzWZhk3pLQAA</XPD:REF> +<XPD:REF name="Views[1]">dgQAXdF4ZESvmtHR7mV1eAAA</XPD:REF> +<XPD:REF name="Views[2]">nl0ivvTPhk6+ZWGNY3Z7QQAA</XPD:REF> +<XPD:REF name="Views[3]">21Re8Yow20OMsCn0YuNvyQAA</XPD:REF> +<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="2RBODiwfOUCUVzGJ/32wAAAA"> +<XPD:REF name="Association">hXa1Ze5PcEWvFq3WssbumAAA</XPD:REF> +<XPD:REF name="Participant">jE6Hh4xWzk+ss1P1I88QbQAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">gJVKivaSkUOMWN8rIdDn4gAA</XPD:REF> +<XPD:REF name="Views[1]">xB9CaPtaBEGmmoo1GYSHmAAA</XPD:REF> +<XPD:REF name="Views[2]">bGKgfsVj9UqvRKTQT54jnwAA</XPD:REF> +<XPD:REF name="Views[3]">hx6u1xKLF028b6Yykl/JVwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="1h+kSCXpe0eWYNVJ4SXvTQAA"> +<XPD:REF name="Association">hXa1Ze5PcEWvFq3WssbumAAA</XPD:REF> +<XPD:REF name="Participant">nAsf5tia702zzSQAu6L6VwAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">g4iIuaL510KG496BLjSxFAAA</XPD:REF> +<XPD:REF name="Views[1]">TwLEoTMD10ehV8UPEkC8GAAA</XPD:REF> +<XPD:REF name="Views[2]">9JL65E1Ll0K/gBYTvW27ggAA</XPD:REF> +<XPD:REF name="Views[3]">W8FWavR8aUaHm9U8dXz4VgAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[6]" type="UMLAssociation" guid="GWeTbEaAQUO+r17c6TtqcAAA"> +<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">T2Ct5boioEq1zBkQPfP1uAAA</XPD:REF> +<XPD:REF name="Views[1]">itC6+9KIkUOoqvWzhIL9eAAA</XPD:REF> +<XPD:REF name="Views[2]">yn7EMIRfMUivZuavba1QKgAA</XPD:REF> +<XPD:REF name="Views[3]">qp8dQ4Cl50OUly+002LHkwAA</XPD:REF> +<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="LAvKrCSTOk+Idehr21cMIwAA"> +<XPD:REF name="Association">GWeTbEaAQUO+r17c6TtqcAAA</XPD:REF> +<XPD:REF name="Participant">jE6Hh4xWzk+ss1P1I88QbQAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">Cko4gh6CNESvzEaGX7xrTwAA</XPD:REF> +<XPD:REF name="Views[1]">YXCHfhVdWUSEN2ZT/RAgUwAA</XPD:REF> +<XPD:REF name="Views[2]">3/az9bmrj0OrABD1RgT7zgAA</XPD:REF> +<XPD:REF name="Views[3]">QhKdEmGlb021SYaW2m8l2AAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="7KhVXW2jsUGTY2YhCHULSAAA"> +<XPD:REF name="Association">GWeTbEaAQUO+r17c6TtqcAAA</XPD:REF> +<XPD:REF name="Participant">yCRgNkRB+EGAwzfBjdJbqwAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">K/CL0noaSEeVxfiH/AYdPQAA</XPD:REF> +<XPD:REF name="Views[1]">gJsX46E8OEivWSn9FKGyIgAA</XPD:REF> +<XPD:REF name="Views[2]">+sQ4dyQOwEyKXN3Siy8SeAAA</XPD:REF> +<XPD:REF name="Views[3]">g0gSj9MvXEy5XaeQkbjoOwAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[7]" type="UMLAssociation" guid="R+Mv7uh5kEuKr/Bia3KOhAAA"> +<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">AyvrWm4rVU2nEQ3SaHF+pwAA</XPD:REF> +<XPD:REF name="Views[1]">Ic1rMSlGuEiOmC74Gs5VPgAA</XPD:REF> +<XPD:REF name="Views[2]">LmeDzwQ4WE+N9ctpkvJC2QAA</XPD:REF> +<XPD:REF name="Views[3]">/4mMqWe3yUWrZLbs6l2tZwAA</XPD:REF> +<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="BPqYWvTNKEOfCOeMpPA44AAA"> +<XPD:REF name="Association">R+Mv7uh5kEuKr/Bia3KOhAAA</XPD:REF> +<XPD:REF name="Participant">jE6Hh4xWzk+ss1P1I88QbQAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">m94XoFukck+27/0mViZU2gAA</XPD:REF> +<XPD:REF name="Views[1]">rl15HxW7wUGsb4vRn7Al9wAA</XPD:REF> +<XPD:REF name="Views[2]">A1ODeRbq4kaOK4HMvaTeRQAA</XPD:REF> +<XPD:REF name="Views[3]">LFchLERMEE2qPO6m3DpPuQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="X1+FYBSOWkaYgLu2FjOTXwAA"> +<XPD:REF name="Association">R+Mv7uh5kEuKr/Bia3KOhAAA</XPD:REF> +<XPD:REF name="Participant">W59J2q05J0K29agobcVJpwAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">/DGBSl3cJ0S8W6nJJJGcfwAA</XPD:REF> +<XPD:REF name="Views[1]">QQK2e0FGJkigWh9ObCBDRgAA</XPD:REF> +<XPD:REF name="Views[2]">WxqNKB0NhUqZpADhZw+P3QAA</XPD:REF> +<XPD:REF name="Views[3]">Tj9w6ngJfUqetSitERQ8NQAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[8]" type="UMLAssociation" guid="WrC8vAeUYkO3tLCoOTTa7gAA"> +<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">QIXdxKII/kqOJOJMY5AcogAA</XPD:REF> +<XPD:REF name="Views[1]">Xq0mZflYI0KV42hvumdugQAA</XPD:REF> +<XPD:REF name="Views[2]">vwdwId1yNkaUtmkTI1YWuQAA</XPD:REF> +<XPD:REF name="Views[3]">1uoVEwi+dkyCZb5M7Pve2wAA</XPD:REF> +<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="uJNUdzUQLUu2aPlejTqjNwAA"> +<XPD:REF name="Association">WrC8vAeUYkO3tLCoOTTa7gAA</XPD:REF> +<XPD:REF name="Participant">jE6Hh4xWzk+ss1P1I88QbQAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">kbnyVybMKEKdAdKhGeseZgAA</XPD:REF> +<XPD:REF name="Views[1]">g5PdiNFseUGXOynpmdruGwAA</XPD:REF> +<XPD:REF name="Views[2]">71PEDgUjsU+2i57rKSIWiQAA</XPD:REF> +<XPD:REF name="Views[3]">WnuHsx6mVUGcSN3xCQss6QAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="pVT44Y4IlkCvW0rXC+dzRgAA"> +<XPD:REF name="Association">WrC8vAeUYkO3tLCoOTTa7gAA</XPD:REF> +<XPD:REF name="Participant">ExhZCRayVUq9VZBeXyOzSgAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">4paVVhhoOU2GUrsd9Xm/FwAA</XPD:REF> +<XPD:REF name="Views[1]">66pNRRmKjku3rnBmhfUBCgAA</XPD:REF> +<XPD:REF name="Views[2]">i3/GDxY4DU6ZMPvt2/tUdgAA</XPD:REF> +<XPD:REF name="Views[3]">Bn3vSuvCAEGkNyVyOiDjtAAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[9]" type="UMLUseCase" guid="5KAC2LjvX0qQF9lBa5DyCwAA"> +<XPD:ATTR name="Name" type="string">设置各种参数信息</XPD:ATTR> +<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">B39+MGxIAUu2bla4M15wGQAA</XPD:REF> +<XPD:REF name="Views[1]">kRxUjogV4k2YkluNvawsMAAA</XPD:REF> +<XPD:REF name="Views[2]">u8URrWr/hkiwdkqgLJdW+wAA</XPD:REF> +<XPD:REF name="Views[3]">KOSNG5KSM0CFIOZucCSmlwAA</XPD:REF> +<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR> +<XPD:REF name="Associations[0]">iK2QfBiThkWwoji6bSWtswAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[10]" type="UMLAssociation" guid="y+qwgLasMEm0UKrVQN8iJQAA"> +<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">xD4JWSKF3EOTqNmsPzbc5QAA</XPD:REF> +<XPD:REF name="Views[1]">Aug+XiD/L0C98F0lb8QKAgAA</XPD:REF> +<XPD:REF name="Views[2]">+HDBsjEDKEqWUJZ9hnAU4QAA</XPD:REF> +<XPD:REF name="Views[3]">8N0unm4hwUy3Q/ipJnkyXAAA</XPD:REF> +<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="jJgG/r4rjE2qAhy/U/lg2wAA"> +<XPD:REF name="Association">y+qwgLasMEm0UKrVQN8iJQAA</XPD:REF> +<XPD:REF name="Participant">jE6Hh4xWzk+ss1P1I88QbQAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">evKHrFVG9kazUYsWGKYoRQAA</XPD:REF> +<XPD:REF name="Views[1]">JgCUSElncUaW/Ryki1kRMQAA</XPD:REF> +<XPD:REF name="Views[2]">vquz6rX3pkKrylGBjx30IAAA</XPD:REF> +<XPD:REF name="Views[3]">CXIajd5ee06Zf7q4GbpG1QAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="iK2QfBiThkWwoji6bSWtswAA"> +<XPD:REF name="Association">y+qwgLasMEm0UKrVQN8iJQAA</XPD:REF> +<XPD:REF name="Participant">5KAC2LjvX0qQF9lBa5DyCwAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">0NmimauDo0yxCgPn4bFExgAA</XPD:REF> +<XPD:REF name="Views[1]">YPI7wcCBTUybTm1Spbgg8QAA</XPD:REF> +<XPD:REF name="Views[2]">ntmWchFV+UqAdPT3cz9/JQAA</XPD:REF> +<XPD:REF name="Views[3]">edAtn71weU2/fvAr2uihoQAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[11]" type="UMLUseCase" guid="eLOxpsSp0EC08r5lL9rsZAAA"> +<XPD:ATTR name="Name" type="string">预约</XPD:ATTR> +<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">grqGSNiheUuwFijgmxch+gAA</XPD:REF> +<XPD:REF name="Views[1]">54HAvDvDa06v58oCDBCKXwAA</XPD:REF> +<XPD:REF name="Views[2]">H5TD/VVzokWAABxo66dDiwAA</XPD:REF> +<XPD:REF name="Views[3]">qqfU97a8nUqfLL2CFuWnjQAA</XPD:REF> +<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR> +<XPD:REF name="Associations[0]">rXVVaNhetUi+zkmUpV2EJAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[12]" type="UMLAssociation" guid="0s9c8w+QxUaASZ+fMtRSqQAA"> +<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">kVRyhJmyWEyyp5wuc+OXngAA</XPD:REF> +<XPD:REF name="Views[1]">FypCN9NIE0C9ShWHmH/yxQAA</XPD:REF> +<XPD:REF name="Views[2]">UYBImTsT3kmMLO4UVo7iDgAA</XPD:REF> +<XPD:REF name="Views[3]">Dv0knjRPxEiA3FR76MzcQgAA</XPD:REF> +<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="HQZk+9nVI02CjFsZTEmJFgAA"> +<XPD:REF name="Association">0s9c8w+QxUaASZ+fMtRSqQAA</XPD:REF> +<XPD:REF name="Participant">jE6Hh4xWzk+ss1P1I88QbQAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">oRaZRwRR1E+ugfvMU7Mx7AAA</XPD:REF> +<XPD:REF name="Views[1]">Rf4Y2d2tx0eAEgaVNgix1gAA</XPD:REF> +<XPD:REF name="Views[2]">e0J/wN1wUUGY7r7RQqgfrQAA</XPD:REF> +<XPD:REF name="Views[3]">LK/960VLGUqFEI3dQB55GgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="rXVVaNhetUi+zkmUpV2EJAAA"> +<XPD:REF name="Association">0s9c8w+QxUaASZ+fMtRSqQAA</XPD:REF> +<XPD:REF name="Participant">eLOxpsSp0EC08r5lL9rsZAAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">qZ6wG2yUdUCrkCtj+ADq5gAA</XPD:REF> +<XPD:REF name="Views[1]">5xmhglHNPkebUvE0zYQ+1QAA</XPD:REF> +<XPD:REF name="Views[2]">TJu7E2BYn0e7KDkLvMy6zQAA</XPD:REF> +<XPD:REF name="Views[3]">HuuHMInFx0awxMfN0WO7nAAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[13]" type="UMLUseCase" guid="DfNIoYa4GU+CP71/W8SrWwAA"> +<XPD:ATTR name="Name" type="string">回放</XPD:ATTR> +<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">1rgOrFraekaSjgPeaxo6VQAA</XPD:REF> +<XPD:REF name="Views[1]">rgrH2S52KUirNQUR897hjAAA</XPD:REF> +<XPD:REF name="Views[2]">/Uw/TQZhfEa2XXCMAwNycQAA</XPD:REF> +<XPD:REF name="Views[3]">c8C4qOOrcUa+n6I+x3qsmwAA</XPD:REF> +<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR> +<XPD:REF name="Associations[0]">AeXEiqTUjkaieSlGxTKX+QAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[14]" type="UMLAssociation" guid="oYdSRRagC0OKiYHxCgS7CAAA"> +<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">FyWt2ux4n0C/jIWXlvGepAAA</XPD:REF> +<XPD:REF name="Views[1]">tzUYyPqymkyQTrpQ3ESfLQAA</XPD:REF> +<XPD:REF name="Views[2]">WsC4wpiLwESJvBADsJOD0QAA</XPD:REF> +<XPD:REF name="Views[3]">240EHYi+MUSGtsZ2MH9vbAAA</XPD:REF> +<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="teHN23xRpE6lugxstCxsawAA"> +<XPD:REF name="Association">oYdSRRagC0OKiYHxCgS7CAAA</XPD:REF> +<XPD:REF name="Participant">jE6Hh4xWzk+ss1P1I88QbQAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">jriPICawik+i/5uQ1tPPJQAA</XPD:REF> +<XPD:REF name="Views[1]">oHna4JnixU6x5HHrqy8Y0gAA</XPD:REF> +<XPD:REF name="Views[2]">CcjzfOb/A06oYHNBWwMyYAAA</XPD:REF> +<XPD:REF name="Views[3]">eJcfvTsAsUKZSOjduilFwAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="AeXEiqTUjkaieSlGxTKX+QAA"> +<XPD:REF name="Association">oYdSRRagC0OKiYHxCgS7CAAA</XPD:REF> +<XPD:REF name="Participant">DfNIoYa4GU+CP71/W8SrWwAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">HGprZSDtFUGe58XLDa/llAAA</XPD:REF> +<XPD:REF name="Views[1]">sgsEShSJaUa0m4iY/pH+kgAA</XPD:REF> +<XPD:REF name="Views[2]">zD5xP/cAIkyWZDkkr5ToygAA</XPD:REF> +<XPD:REF name="Views[3]">k/ixsOc3uECBJHIoPEzSCQAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[15]" type="UMLUseCase" guid="eVrNXR8NqEC5uMEFgGKQ1gAA"> +<XPD:ATTR name="Name" type="string">保存数据</XPD:ATTR> +<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">mlqnICP04kuE2DQduAxCnAAA</XPD:REF> +<XPD:REF name="Views[1]">ZBT2RXZyKE2KgZdND0TQCwAA</XPD:REF> +<XPD:REF name="Views[2]">ayKElX0k9EWwlzIjQHBReAAA</XPD:REF> +<XPD:REF name="Views[3]">TjYDD4DDi06is7FTfdSgGgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[16]" type="UMLActor" guid="EIFC2d0E6EScGB1xXji93AAA"> +<XPD:ATTR name="Name" type="string">开发人员</XPD:ATTR> +<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">3</XPD:ATTR> +<XPD:REF name="Views[0]">8+OH6W5lhU2orgFp9fejxAAA</XPD:REF> +<XPD:REF name="Views[1]">55svG5LVmEayI1yOLF/hYgAA</XPD:REF> +<XPD:REF name="Views[2]">qt7RVSofskyCOe4IXevE3gAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[1]" type="UMLModel" guid="GSh70Nz8XUWNmgnjTARh/gAA"> +<XPD:ATTR name="Name" type="string">Analysis Model</XPD:ATTR> +<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR> +<XPD:ATTR name="StereotypeName" type="string">analysisModel</XPD:ATTR> +<XPD:REF name="Namespace">CoZuu0bDp0eooW1pQg6aQwAA</XPD:REF> +<XPD:ATTR name="#OwnedElements" type="integer">2</XPD:ATTR> +<XPD:OBJ name="OwnedElements[0]" type="UMLAssociation" guid="rIQWVfPr7E24Tt4ljeTZ4wAA"> +<XPD:REF name="Namespace">GSh70Nz8XUWNmgnjTARh/gAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">G0kUvklDf0uhBeIUoV+srgAA</XPD:REF> +<XPD:REF name="Views[1]">6o6l7Ax4b0uvR1w70cdJiAAA</XPD:REF> +<XPD:REF name="Views[2]">3ZsGQfCQIk+ZPFC1FyyVeQAA</XPD:REF> +<XPD:REF name="Views[3]">BCGhRmtL7kmoY1iXaapJOwAA</XPD:REF> +<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="jLzV7XdHP0Ogmb7/6IPCtgAA"> +<XPD:REF name="Association">rIQWVfPr7E24Tt4ljeTZ4wAA</XPD:REF> +<XPD:REF name="Participant">7dRihysn8kefkb+6mJlwzgAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">zqmFgnNCJ0mU+9gnrH18SwAA</XPD:REF> +<XPD:REF name="Views[1]">QE0xM9HZIUK4iQSOifSKDQAA</XPD:REF> +<XPD:REF name="Views[2]">yt3drhX0N0aispBa+C83TAAA</XPD:REF> +<XPD:REF name="Views[3]">L3X2M2UWvECpCLZj42krJAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="XKFQZaAIH0SxD7YBXgkK0wAA"> +<XPD:REF name="Association">rIQWVfPr7E24Tt4ljeTZ4wAA</XPD:REF> +<XPD:REF name="Participant">ZRumjrTwgUamBDOstkagPgAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">SuRONY2jREyvBHGP7nheBQAA</XPD:REF> +<XPD:REF name="Views[1]">8rSGjmyTy0iar869slrlPgAA</XPD:REF> +<XPD:REF name="Views[2]">l9UCuL7VoEm7vFLWkobdoAAA</XPD:REF> +<XPD:REF name="Views[3]">NYMZ1wuIcUy7G5VODIYIDQAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[1]" type="UMLAssociation" guid="0hCZfIhV4EOpKXcVPwcUnAAA"> +<XPD:REF name="Namespace">GSh70Nz8XUWNmgnjTARh/gAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">+dr3aeLg8k2RQ8khsHmmqAAA</XPD:REF> +<XPD:REF name="Views[1]">eiIT0uNCpUywEWk7FrhutgAA</XPD:REF> +<XPD:REF name="Views[2]">m5vcHblPLUe9VZHiD1lPzgAA</XPD:REF> +<XPD:REF name="Views[3]">dHGIMYC9dUeyteDUvxEuNgAA</XPD:REF> +<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="DGWju3i/80ObxLedRPIIEwAA"> +<XPD:REF name="Association">0hCZfIhV4EOpKXcVPwcUnAAA</XPD:REF> +<XPD:REF name="Participant">7dRihysn8kefkb+6mJlwzgAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">DGGWcQw7xESguDo8y8c9JwAA</XPD:REF> +<XPD:REF name="Views[1]">RjfRt8utjEiWYhIQFBxLqgAA</XPD:REF> +<XPD:REF name="Views[2]">YyNOaiAWMU6urAt6uMo51wAA</XPD:REF> +<XPD:REF name="Views[3]">HRQ1wVKzDUe1hazbUuDnVwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="TolxJOTDCkO5nyLC6ipkAwAA"> +<XPD:REF name="Association">0hCZfIhV4EOpKXcVPwcUnAAA</XPD:REF> +<XPD:REF name="Participant">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">bVRmxC4LeEivBU8rO/l1IwAA</XPD:REF> +<XPD:REF name="Views[1]">/6WmiwEpmUGnLzBRc6lCzwAA</XPD:REF> +<XPD:REF name="Views[2]">Brf+/LZbFEamowtJ6zGOAgAA</XPD:REF> +<XPD:REF name="Views[3]">eme8PTCUYkiREXPCAN1ACgAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[2]" type="UMLModel" guid="dZ4UyetzSE+rDT9vQthF9wAA"> +<XPD:ATTR name="Name" type="string">Design Model</XPD:ATTR> +<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR> +<XPD:ATTR name="StereotypeName" type="string">designModel</XPD:ATTR> +<XPD:REF name="Namespace">CoZuu0bDp0eooW1pQg6aQwAA</XPD:REF> +<XPD:ATTR name="#OwnedDiagrams" type="integer">2</XPD:ATTR> +<XPD:OBJ name="OwnedDiagrams[0]" type="UMLClassDiagram" guid="qjYhNoiY1kqmGvfSf6HTOAAA"> +<XPD:ATTR name="Name" type="string">dtvclass</XPD:ATTR> +<XPD:ATTR name="DefaultDiagram" type="boolean">True</XPD:ATTR> +<XPD:REF name="DiagramOwner">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF> +<XPD:OBJ name="DiagramView" type="UMLClassDiagramView" guid="P51EDp27mEuFUgKS4BG9TgAA"> +<XPD:REF name="Diagram">qjYhNoiY1kqmGvfSf6HTOAAA</XPD:REF> +<XPD:ATTR name="#OwnedViews" type="integer">33</XPD:ATTR> +<XPD:OBJ name="OwnedViews[0]" type="UMLClassView" guid="a8FG7H9SzUelkRx52q1d5AAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">312</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">568</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">86</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">53</XPD:ATTR> +<XPD:REF name="Model">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF> +<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="JQh3Wiuct0GpOwtZi9ZTpgAA"> +<XPD:OBJ name="NameLabel" type="LabelView" guid="uNhK2xLegUaBu+NFKaBbSwAA"> +<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR> +<XPD:ATTR name="Text" type="string">CTvDatabase</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="hhHle2OI4Uu0405GJDfGVwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="LabelView" guid="jkWfDES3TkmlCIFIs5xizAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="k1LHywt4TEe6bHJwUzft/QAA"> +<XPD:REF name="Model">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="hc7Nc/x4iE+k/Ee76MBxMgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="Pwafosd7ik6mD1kxdwntngAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[1]" type="UMLClassView" guid="Y9zMsiXlQEuyiSGOmpswRwAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">780</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">528</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">102</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">43</XPD:ATTR> +<XPD:REF name="Model">5BXVsgqK1kanN/l0hNx/IQAA</XPD:REF> +<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="/mSRKoE2+U2BADYjjBN3tQAA"> +<XPD:OBJ name="NameLabel" type="LabelView" guid="IXnfaLgTKEGGdpX37KpTHgAA"> +<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR> +<XPD:ATTR name="Text" type="string">CTvSubtitle</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="+DeDbUnm+02usH1UojzZyQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="LabelView" guid="TObRQcYR6UWZmkjnkVEugwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="3kCRXwUbYEOaB2YVqs3CMQAA"> +<XPD:REF name="Model">5BXVsgqK1kanN/l0hNx/IQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="2pFBVEb3NUu3IhdJeNfBWAAA"> +<XPD:REF name="Model">5BXVsgqK1kanN/l0hNx/IQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="xx5BbdZ+6Eehp04cM6fnfwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">5BXVsgqK1kanN/l0hNx/IQAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[2]" type="UMLClassView" guid="9Ld1pTeBF0CZmoVdEfEBMQAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">324</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">228</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">83</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">45</XPD:ATTR> +<XPD:REF name="Model">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="KKCqrHWJXUyPtjvhGK6nTAAA"> +<XPD:OBJ name="NameLabel" type="LabelView" guid="VODhD4+mz0yMbBwwjb3fXAAA"> +<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR> +<XPD:ATTR name="Text" type="string">CDtv</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="0OuB7ZzwGEqA8drjlJeNBgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="LabelView" guid="Zc9FQRwP2Uuj8JJg74Jt3QAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="mxcpZDUEI0aTfXvfNUP8/QAA"> +<XPD:REF name="Model">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="0p/pTktl+kimPcmFJ4/wywAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="kWtX8dZWikSHi3kCydMHCAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[3]" type="UMLClassView" guid="BVNqLhbhP06y98++NgmxAwAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">284</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">388</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">147</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">33</XPD:ATTR> +<XPD:REF name="Model">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="juDswX7uL0W7bBJuRk06AgAA"> +<XPD:OBJ name="NameLabel" type="LabelView" guid="ICbKIhrn50Gwq1GIFxbJYAAA"> +<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR> +<XPD:ATTR name="Text" type="string">CTvProgram</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="YHcJ0obYSEWbDvvepjISuwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="LabelView" guid="27Jf3klYvE2MAvnGgH8YqAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="muUyRePjd0qlQqM/tvfrmQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="3aWGjpGXTkqRn+NbEzYu5QAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="ylciM87U9keZe9hSnVequAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[4]" type="UMLClassView" guid="iEgH+6H6kkG++neKuToTSgAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">100</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">420</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">97</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">46</XPD:ATTR> +<XPD:REF name="Model">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF> +<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="lnKxD1DyGEOj9cd46nB84QAA"> +<XPD:OBJ name="NameLabel" type="LabelView" guid="FHfQpxZydUGiBASqFcX2dAAA"> +<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR> +<XPD:ATTR name="Text" type="string">CTvChannel</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="fd0gByAKXkisiM6J7MwdtAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="LabelView" guid="9r4OqNYuVUegwaUPTkv1pgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="Yo0KShxzIk2FSTydUse5OQAA"> +<XPD:REF name="Model">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="rmKV7ZtcVEudbDw02LTB/wAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="+jiKzSIz/UuhSFnnJkuIEgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[5]" type="UMLClassView" guid="vYDCfUgYq0KaBSDnxbpYVgAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">704</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">244</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">80</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">43</XPD:ATTR> +<XPD:REF name="Model">UiYOh8D78E22qQeFeDZpLAAA</XPD:REF> +<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="+QL9bkNaPUyTOdUO4yAR6AAA"> +<XPD:OBJ name="NameLabel" type="LabelView" guid="eT33Wt7M8kiSrhmhuXGtCgAA"> +<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR> +<XPD:ATTR name="Text" type="string">CTvConfig</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="iBlTL0B9OEevQofD0ibRjwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="LabelView" guid="cFIMtDWroUOFGL0NgRigMAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="KTNQfnqIy0q3wV+ARVtV9gAA"> +<XPD:REF name="Model">UiYOh8D78E22qQeFeDZpLAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="7Pq+TJVLy06gA8T6r5wMawAA"> +<XPD:REF name="Model">UiYOh8D78E22qQeFeDZpLAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="Fn0oKpD7lUyNbDw59UyRygAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">UiYOh8D78E22qQeFeDZpLAAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[6]" type="UMLAssociationView" guid="12BWSnVhhUOUuox7tdL41gAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Points" type="Points">284,417;196,433</XPD:ATTR> +<XPD:REF name="Model">av0s6EXaYUKyooee2y6sdgAA</XPD:REF> +<XPD:REF name="Head">iEgH+6H6kkG++neKuToTSgAA</XPD:REF> +<XPD:REF name="Tail">BVNqLhbhP06y98++NgmxAwAA</XPD:REF> +<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="4F+C2zwwrEOjx/qCnLXWPAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">av0s6EXaYUKyooee2y6sdgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="lXf6uq0JtkK3YNXTxTyP7wAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:REF name="Model">av0s6EXaYUKyooee2y6sdgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="8jym3kotyE2sBWD5KjhUiQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">av0s6EXaYUKyooee2y6sdgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="ioK1huVib0u6ILv3kHAeeQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">GZcPUasbnkG3pyGKV6NFnAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="awNg1wfSGU22on1C+XpBlgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">IEnUwW74QkSkdRZGqdKvaAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="cwfxPIXUd06ShM9BEivzxQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">GZcPUasbnkG3pyGKV6NFnAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="cGTSA3bQb0S81NQzsTj+QQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">IEnUwW74QkSkdRZGqdKvaAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="DBsnRjqoj0W9eAN/Flu+jwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">GZcPUasbnkG3pyGKV6NFnAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="LWsKT6dOQUKXma9Eoh+sUwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">IEnUwW74QkSkdRZGqdKvaAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="DUu549wQM0qPn9dAjjrLZgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">GZcPUasbnkG3pyGKV6NFnAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="l9TSA+eftkCY2p6qZDMGKAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">IEnUwW74QkSkdRZGqdKvaAAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[7]" type="UMLAssociationView" guid="Qa1PhzSwWkyS1rm6eapfLwAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Points" type="Points">354,568;357,420</XPD:ATTR> +<XPD:REF name="Model">cNCsWS2hgkeaGhYJv9oONgAA</XPD:REF> +<XPD:REF name="Head">BVNqLhbhP06y98++NgmxAwAA</XPD:REF> +<XPD:REF name="Tail">a8FG7H9SzUelkRx52q1d5AAA</XPD:REF> +<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="QAoFSXFK+0S+5kDYAQ0LsgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">cNCsWS2hgkeaGhYJv9oONgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="rsOqshNVOkut6r+wW0Sp/wAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:REF name="Model">cNCsWS2hgkeaGhYJv9oONgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="0wZW9IH3y0OEPMfN5FyHQAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">cNCsWS2hgkeaGhYJv9oONgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="ySD9HMBWmEWoJg+/6boBZgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">2JZlFpDZPkGgaoWrrPAGXAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="TM3RNruxzEezNhF8XO/FmwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">PFZlUbzZu02nTTLsYZBoDgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="LXz8D2AdoE6ojzgkYCO0qAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">2JZlFpDZPkGgaoWrrPAGXAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="NpASusGGKU+/KwcKkTAMogAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">PFZlUbzZu02nTTLsYZBoDgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="ia8j06EduUmxgB5smbA9hQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">2JZlFpDZPkGgaoWrrPAGXAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="3dtXpNLbXka7wekzvAWsXQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">PFZlUbzZu02nTTLsYZBoDgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="/JYlnmhzTk66TicK0RjYaQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">2JZlFpDZPkGgaoWrrPAGXAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="Mvk2196ldk+5GLgct+OKuwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">PFZlUbzZu02nTTLsYZBoDgAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[8]" type="UMLAssociationView" guid="UmHHYiIr3k+gNNomjLpgwwAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Points" type="Points">319,568;179,465</XPD:ATTR> +<XPD:REF name="Model">CVx7QaOEd0iJQ6USdSCilwAA</XPD:REF> +<XPD:REF name="Head">iEgH+6H6kkG++neKuToTSgAA</XPD:REF> +<XPD:REF name="Tail">a8FG7H9SzUelkRx52q1d5AAA</XPD:REF> +<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="ZBlvBeIE2UGGPTML4sQ7SgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">CVx7QaOEd0iJQ6USdSCilwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="UDn5R84weEayOYl6QVFj1wAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:REF name="Model">CVx7QaOEd0iJQ6USdSCilwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="OApAa7HXz0aTiMZGZ/g2tAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">CVx7QaOEd0iJQ6USdSCilwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="W1YT5dqwMUSUI29zCC2LZQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">XvxorIQvl0aKnzyznjd1uwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="24RGLobteEil7cUdAcyUcAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">q5Ko0bXKcE6uj05NJPSddwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="X96IIfOZSE2FAliwKkCNYgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">XvxorIQvl0aKnzyznjd1uwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="6Uw1pdad6kC8N8S0Rf1HxwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">q5Ko0bXKcE6uj05NJPSddwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="tr7uiHRKz0e//ValH5GU+AAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">XvxorIQvl0aKnzyznjd1uwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="CuUsJAcsAUWwVZJzegOegAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">q5Ko0bXKcE6uj05NJPSddwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="zdcHIs6dNEmxQNtCK5uHIQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">XvxorIQvl0aKnzyznjd1uwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="AST9GWgDTEWR07o7yUcgIQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">q5Ko0bXKcE6uj05NJPSddwAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[9]" type="UMLAssociationView" guid="oYsj3yhzJkCKmOBcWIHNDwAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Points" type="Points">357,420;354,568</XPD:ATTR> +<XPD:REF name="Model">hBOTE33GDUO/X8s5oHlAmQAA</XPD:REF> +<XPD:REF name="Head">a8FG7H9SzUelkRx52q1d5AAA</XPD:REF> +<XPD:REF name="Tail">BVNqLhbhP06y98++NgmxAwAA</XPD:REF> +<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="GT6R2h3HkU6LThPKaghC1QAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">hBOTE33GDUO/X8s5oHlAmQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="eWMr3v5Qb0y/nXu2s/EP5wAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:REF name="Model">hBOTE33GDUO/X8s5oHlAmQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="GR9gxzUjNkKmujWHFobLtAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">hBOTE33GDUO/X8s5oHlAmQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="+SSR3TM1z0m5UkTLiuMrGwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">Yo1IoB0X3ka1C+a/6xk1/gAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="UuRRAQf+y0OdXTOvWu7nUAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">qOlPMeLYpUC4lTEl3Hsc8QAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="Uvo2ryiBg0Oa5GJF4TRyhQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">Yo1IoB0X3ka1C+a/6xk1/gAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="vI5c+acLSk6IfCcdqlaBggAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">qOlPMeLYpUC4lTEl3Hsc8QAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="QBI1NHwjWU2dkj+SLUFZ+AAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">Yo1IoB0X3ka1C+a/6xk1/gAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="w3rpxhxEsEu0y7myhFrrkQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">qOlPMeLYpUC4lTEl3Hsc8QAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="IYVJT/RjPUqjv8rl6ZIQiwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">Yo1IoB0X3ka1C+a/6xk1/gAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="8Ip2rQJRaEaPAOW0cJSd/wAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">qOlPMeLYpUC4lTEl3Hsc8QAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[10]" type="UMLAssociationView" guid="Vcgjd9eKakOjuUAjwzzhJgAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Points" type="Points">179,465;319,568</XPD:ATTR> +<XPD:REF name="Model">/X1BIuClXkywNV1vNa/LWwAA</XPD:REF> +<XPD:REF name="Head">a8FG7H9SzUelkRx52q1d5AAA</XPD:REF> +<XPD:REF name="Tail">iEgH+6H6kkG++neKuToTSgAA</XPD:REF> +<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="+iIIR1mEnUynEPEjuGAd7AAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">/X1BIuClXkywNV1vNa/LWwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="bZn71kXJQUOP3yAyCa5RvgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:REF name="Model">/X1BIuClXkywNV1vNa/LWwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="O36co7nFz0elpJnbKtsYMwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">/X1BIuClXkywNV1vNa/LWwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="yjjLYCXJjUqX0IHnpKwHwQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">RoKhf4Bw3kmRk2O2D4GlxQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="Hv4K+XlgIkqDgqEz3aQWNQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">BVpPYPY4V0KsTBJTRoLjyAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="k1XiyO9mlke/IAq5UuYI9gAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">RoKhf4Bw3kmRk2O2D4GlxQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="4o7M8jakfkixRwVgESrUnwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">BVpPYPY4V0KsTBJTRoLjyAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="Xtc7Jqe6N0+JAzLg1RxYLwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">RoKhf4Bw3kmRk2O2D4GlxQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="rCPaxzL0LEuk9Jjbqi+D2gAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">BVpPYPY4V0KsTBJTRoLjyAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="W0UPJtBpLU6Y5SjscWTiVAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">RoKhf4Bw3kmRk2O2D4GlxQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="HKXhPda/vUuVwv4sR9ZR9QAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">BVpPYPY4V0KsTBJTRoLjyAAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[11]" type="UMLClassView" guid="8HnvkQxPk0OLqQXLeJ5MUgAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">820</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">316</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">86</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">56</XPD:ATTR> +<XPD:REF name="Model">gx40XIC9FkOG3iX3Oyxw8wAA</XPD:REF> +<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="5gKeR33bd0K1R/QeIX+ZgQAA"> +<XPD:OBJ name="NameLabel" type="LabelView" guid="tQ3eg1803UmmapVr5/mMKgAA"> +<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR> +<XPD:ATTR name="Text" type="string">CTvGroup</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="qwHtvoH6qk6Aj/xMPfoprQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="LabelView" guid="txC1zWyhHUKgVTvu0N6VDwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="50xz0k8rgU+WfODoAi8aeQAA"> +<XPD:REF name="Model">gx40XIC9FkOG3iX3Oyxw8wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="TR1rTShyhEG7ngh596L0kgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">gx40XIC9FkOG3iX3Oyxw8wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="GPl78wz82UaLho5xwfMqrQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">gx40XIC9FkOG3iX3Oyxw8wAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[12]" type="UMLAssociationView" guid="VjZwKWmCoUO5wNRGJGVShAAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Points" type="Points">820,364;397,573</XPD:ATTR> +<XPD:REF name="Model">PudswW77eEShTMEdcK5BCAAA</XPD:REF> +<XPD:REF name="Head">a8FG7H9SzUelkRx52q1d5AAA</XPD:REF> +<XPD:REF name="Tail">8HnvkQxPk0OLqQXLeJ5MUgAA</XPD:REF> +<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="6e9pHkpPaUyLDCYYnUYAOAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">PudswW77eEShTMEdcK5BCAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="QA7tnAAMA0e3tCDRlkB/JwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:REF name="Model">PudswW77eEShTMEdcK5BCAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="gdUdn5u5x0KDsDKM41p2CQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">PudswW77eEShTMEdcK5BCAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="rqoTwNlD20Gou9xOLQ2RNgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">vyoQZGl3UECBMhf7+IDQUwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="d/3xrtQ+nU69mQYepo7NvQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">Io3cINfhiE23pmiSxpS6swAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="ox9r7npaB0in7/ygfG1ZMwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">vyoQZGl3UECBMhf7+IDQUwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="HcOo4bUmbUqLEjVUm2L2AQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">Io3cINfhiE23pmiSxpS6swAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="exLwGLRY306J0CEcqxlOrgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">vyoQZGl3UECBMhf7+IDQUwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="tQj+naSiJ0mB4W89ahH5ygAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">Io3cINfhiE23pmiSxpS6swAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="qxZgk8R36k2S3vGRfQegfwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">vyoQZGl3UECBMhf7+IDQUwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="LNFybtIVIkOXnQ/9QC5jEwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">Io3cINfhiE23pmiSxpS6swAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[13]" type="UMLClassView" guid="7aPHkO59WEubHbpM/Djq/AAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">456</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">396</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">89</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">41</XPD:ATTR> +<XPD:REF name="Model">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF> +<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="DSv+CNOMnUKyGF5bfoGDowAA"> +<XPD:OBJ name="NameLabel" type="LabelView" guid="Fy6x/w12H0K3LtAtk0/MuwAA"> +<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR> +<XPD:ATTR name="Text" type="string">CTvEvent</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="xy2kKdqewEerLbDFtu0jAwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="LabelView" guid="ZxuiiS0/6EiXhRO/StIWPgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="+EOWTA5PrUyAEwB/ZHVnPAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="f0xyghRma028ShVYc8tbfwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="qpXdkd1nJ0ajRru7gzDFJwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[14]" type="UMLAssociationView" guid="QHk4xsvJRUGhKn0p+sReaAAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Points" type="Points">484,436;375,568</XPD:ATTR> +<XPD:REF name="Model">q5PurOmOUUOX8hzj5CINYQAA</XPD:REF> +<XPD:REF name="Head">a8FG7H9SzUelkRx52q1d5AAA</XPD:REF> +<XPD:REF name="Tail">7aPHkO59WEubHbpM/Djq/AAA</XPD:REF> +<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="ezGCtUA0dUOn10D5pUOtoAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">q5PurOmOUUOX8hzj5CINYQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="QcGPzg741ki4yTGfoKvK9AAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:REF name="Model">q5PurOmOUUOX8hzj5CINYQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="ioZQYN39bEu/gy37UfkhmQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">q5PurOmOUUOX8hzj5CINYQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="mZFBakBXmE6Gj5qumz51gwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">iy8GVdK11EmKnmJ6LivVVQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="VrmcPyj2oUyEm5i/AG7/KgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">PhlKgbqPt0OClpwk2m9vswAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="KHpH30oHrEew1AGquvXiEQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">iy8GVdK11EmKnmJ6LivVVQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="odMtivppNUOccWtC85AVCQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">PhlKgbqPt0OClpwk2m9vswAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="W7KAnZMmjEKAxuaUXA4D6AAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">iy8GVdK11EmKnmJ6LivVVQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="2IiGGrbDkUiobp5CJnME1QAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">PhlKgbqPt0OClpwk2m9vswAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="jsiact/gpUS21gy1IeSlZQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">iy8GVdK11EmKnmJ6LivVVQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="+70t9Os6zUWhIAhufEQsBAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">PhlKgbqPt0OClpwk2m9vswAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[15]" type="UMLAssociationView" guid="l3oAx6sfA0ScCOouvAFKYwAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Points" type="Points">430,410;456,412</XPD:ATTR> +<XPD:REF name="Model">8zCqordbBESBaPJH8SIoOQAA</XPD:REF> +<XPD:REF name="Head">7aPHkO59WEubHbpM/Djq/AAA</XPD:REF> +<XPD:REF name="Tail">BVNqLhbhP06y98++NgmxAwAA</XPD:REF> +<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="pM/XXFo9Ikq+kK5++HoZ0QAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">8zCqordbBESBaPJH8SIoOQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="igklIYxpfka7OH5oAnRbPwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:REF name="Model">8zCqordbBESBaPJH8SIoOQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="RtZQfGM0uUqohb/WlARRpwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">8zCqordbBESBaPJH8SIoOQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="lDsB+MeNlUy+OEBCbfs0OAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">zefo1Bu+v0e4gn9nUL+bSQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="pr9mkVSNO0KasNMsFvgDuQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">72fG4kbiM0eyczFPq2MtVAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="EeUDIEWsnkO5HzTU6L6kZQAA"> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:ATTR name="Text" type="string">1</XPD:ATTR> +<XPD:REF name="Model">zefo1Bu+v0e4gn9nUL+bSQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="4fUHmnlcd0WplogWZWqPRQAA"> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:ATTR name="Text" type="string">1..*</XPD:ATTR> +<XPD:REF name="Model">72fG4kbiM0eyczFPq2MtVAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="TuyQdZk0H0+ai9Mg3ZtK3AAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">zefo1Bu+v0e4gn9nUL+bSQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="kKRq4K1cvEup70Oz2UFd8QAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">72fG4kbiM0eyczFPq2MtVAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="NKw56kYvx0W0KlwhXPYWMwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">zefo1Bu+v0e4gn9nUL+bSQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="DS2eOvXKXku93Y4x950QPgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">72fG4kbiM0eyczFPq2MtVAAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[16]" type="UMLClassView" guid="Th+ZwPCIw0CZjtawrnGPrQAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">756</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">440</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">88</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">41</XPD:ATTR> +<XPD:REF name="Model">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF> +<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="sEpK+JymS02lZlpXniSRjAAA"> +<XPD:OBJ name="NameLabel" type="LabelView" guid="Gfl9bfM73kq+EYU5hOwDUQAA"> +<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR> +<XPD:ATTR name="Text" type="string">CTvBooking</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="dWzJpyjDIE6y0Sx/YmBzlwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="LabelView" guid="Ak99xRpzJ0+K3Y8Z70NTWQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="LL3KL7SUuEyu4pY6NT57NAAA"> +<XPD:REF name="Model">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="dCkq+XCQgkaH1Q901KclHQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="+Bzptjmx3kWzAYT9fN/rxQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[17]" type="UMLClassView" guid="ybciiFK3jEO6SdfdRt6uAgAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">68</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">332</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">80</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">41</XPD:ATTR> +<XPD:REF name="Model">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF> +<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="VEgafHzMKkem+RzIfaWBnQAA"> +<XPD:OBJ name="NameLabel" type="LabelView" guid="605ap6gGgUGE85kGWYWaKgAA"> +<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR> +<XPD:ATTR name="Text" type="string">CTvRegion</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="6TZwhHYPs0mXP+dvmVvxnwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="LabelView" guid="eHeyWsrCgUeI8XUSaf0Y5QAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="AL2e0wMT+0K0AC6gZuuhdwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="zIfIWkZ3Lkiq2O9aOGiU/gAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="exyb4FNp+Ue9ROAGwoQFcwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[18]" type="UMLClassView" guid="tzICJ64LmUSx1fvEy4dHZQAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">580</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">396</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">80</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">43</XPD:ATTR> +<XPD:REF name="Model">iUy0YZgyREC+o54lTQptaAAA</XPD:REF> +<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="6w5B2Z+R1kG+mt3vZl3lVQAA"> +<XPD:OBJ name="NameLabel" type="LabelView" guid="Cl9ObgtVFEmfwYkvLw0YHwAA"> +<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR> +<XPD:ATTR name="Text" type="string">CTvSatellite</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="GhJezIVJAUO7cg/A/n5EdQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="LabelView" guid="JwksgiMMQ0GQ6xqrv6I4jgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="yCTnlkoiRkSszYJDHrqQuwAA"> +<XPD:REF name="Model">iUy0YZgyREC+o54lTQptaAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="phU5m2tyh0yMlhsYRPe6dwAA"> +<XPD:REF name="Model">iUy0YZgyREC+o54lTQptaAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="S8DZ5jxQq0+WFWPFnQy7iAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">iUy0YZgyREC+o54lTQptaAAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[19]" type="UMLAssociationView" guid="5vCGUSmlwUWKkjul/i5CoAAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Points" type="Points">588,438;393,568</XPD:ATTR> +<XPD:REF name="Model">3RrM1HB71kyHO0jB4JI4zgAA</XPD:REF> +<XPD:REF name="Head">a8FG7H9SzUelkRx52q1d5AAA</XPD:REF> +<XPD:REF name="Tail">tzICJ64LmUSx1fvEy4dHZQAA</XPD:REF> +<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="ihIaZz5p+0Cte+Zqg1wUKgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">3RrM1HB71kyHO0jB4JI4zgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="XyhhchGH70uYaM5UdGboKQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:REF name="Model">3RrM1HB71kyHO0jB4JI4zgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="+N+OW0LtoEyevYQ++bVO1gAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">3RrM1HB71kyHO0jB4JI4zgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="vLsrualWRkO0QI8PcBWGAAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">DkcX/fIec029p5Da5gYToAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="blnGfW4UCk6tS0veRc88xAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">ULQw0JNjPE2758pFWlo+MQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="vWndJmxhrkKfipX/zAAt4AAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">DkcX/fIec029p5Da5gYToAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="jGRa3FaTrUWVhYVG834fjwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">ULQw0JNjPE2758pFWlo+MQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="lKgJhvwP/Eygz7oPLvwsxwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">DkcX/fIec029p5Da5gYToAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="olvLmzjsfka5YmNEOntQDAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">ULQw0JNjPE2758pFWlo+MQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="AdMO10glEEWGGHqpzKNvewAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">DkcX/fIec029p5Da5gYToAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="H/do1s5Rh02ETrOyjtaoaAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">ULQw0JNjPE2758pFWlo+MQAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[20]" type="UMLClassView" guid="hzoiTuCQqEuArZEejfwdnQAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">684</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">344</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">102</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">43</XPD:ATTR> +<XPD:REF name="Model">/LI4+1GTjEagI/wLEFpVSQAA</XPD:REF> +<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="bGpo24CeZkuczyv74zkRtAAA"> +<XPD:OBJ name="NameLabel" type="LabelView" guid="M/nbdX/wf0SiKKXamCKy2gAA"> +<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR> +<XPD:ATTR name="Text" type="string">CTvDimension</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="mW7NW23ux06laiKhpkTD7wAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="LabelView" guid="gVAZHA+LzE+/vXDeqIkJrgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="PdTrEGRJOEiEJyD2I9IzJgAA"> +<XPD:REF name="Model">/LI4+1GTjEagI/wLEFpVSQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="VbdqX2NLOkK2DTLhOA91OwAA"> +<XPD:REF name="Model">/LI4+1GTjEagI/wLEFpVSQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="K00/VzyqZUmltiuaKWLgAQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">/LI4+1GTjEagI/wLEFpVSQAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[21]" type="UMLAssociationView" guid="EWnB2mjt6ke3pnsnQFRgJwAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Points" type="Points">699,386;397,568</XPD:ATTR> +<XPD:REF name="Model">GjMZbUwaMkGOkbxOXau26AAA</XPD:REF> +<XPD:REF name="Head">a8FG7H9SzUelkRx52q1d5AAA</XPD:REF> +<XPD:REF name="Tail">hzoiTuCQqEuArZEejfwdnQAA</XPD:REF> +<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="dM3yo1oYRUWNB1JawgFnywAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">GjMZbUwaMkGOkbxOXau26AAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="/IP55LSMZUCRoa77gkMh9gAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:REF name="Model">GjMZbUwaMkGOkbxOXau26AAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="Og4FQYOz9kOr8LF43j+ySwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">GjMZbUwaMkGOkbxOXau26AAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="zHiCXVqqgE6r2lDdnVDI1gAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">gc0GlJ6ewUOpiyya+XPqjQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="Ggu7vb3GMU2vn9mS8bGZpwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">aYL27tYOR02se3g//aEBeAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="19Ii9g15zUmLLURud9e9XAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">gc0GlJ6ewUOpiyya+XPqjQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="wMyvwGpZQUmJ2a2lXlkc/AAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">aYL27tYOR02se3g//aEBeAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="KLCf1m7tBkGvkM3iOxLhJgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">gc0GlJ6ewUOpiyya+XPqjQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="rn/sn4ErGkyYnwDUlnpmTAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">aYL27tYOR02se3g//aEBeAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="1+qZEhcpyk6RHirwjBjalgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">gc0GlJ6ewUOpiyya+XPqjQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="wElMDINXY0esqBl7AwoyfQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">aYL27tYOR02se3g//aEBeAAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[22]" type="UMLAssociationView" guid="DbUG5zy8r0yq6L/I1naVdQAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Points" type="Points">324,266;147,336</XPD:ATTR> +<XPD:REF name="Model">m6lnHtsBL02A4Oup+IzVEAAA</XPD:REF> +<XPD:REF name="Head">ybciiFK3jEO6SdfdRt6uAgAA</XPD:REF> +<XPD:REF name="Tail">9Ld1pTeBF0CZmoVdEfEBMQAA</XPD:REF> +<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="1qY9qbCT1ka5tmfuL9yaJgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">m6lnHtsBL02A4Oup+IzVEAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="bnG59/mNjk+fcthvMQG2VAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:REF name="Model">m6lnHtsBL02A4Oup+IzVEAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="wovrqiKgc0qw9BUyPaGuBQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">m6lnHtsBL02A4Oup+IzVEAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="hytVQ6VnmEaHnFV5o9fQ0AAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">l6Lg/NJG5UWu+7ALxaVP3gAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="JbJSjKTBikyT++rY1XVCtwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">kdbNMfgoG02cJO0UFJeeLwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="eYodfuyOKEK7WC9dBBlaigAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">l6Lg/NJG5UWu+7ALxaVP3gAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="wUtw7zNylEK+wDvPOsUtGwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">kdbNMfgoG02cJO0UFJeeLwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="BEEaANsP0UCbPpRjMWyndwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">l6Lg/NJG5UWu+7ALxaVP3gAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="/cBBOvztgE6Kd7yvemxXPwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">kdbNMfgoG02cJO0UFJeeLwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="JKx2O2r/H0y9NJ3+4rup1QAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">l6Lg/NJG5UWu+7ALxaVP3gAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="uj1vGzCGtkGielBw0Bxi4QAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">kdbNMfgoG02cJO0UFJeeLwAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[23]" type="UMLAssociationView" guid="l2Yo1ObIG0WVx7IS2a/B3QAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Points" type="Points">340,272;173,420</XPD:ATTR> +<XPD:REF name="Model">gmKjyBaRB0SfVd2p3FDOTwAA</XPD:REF> +<XPD:REF name="Head">iEgH+6H6kkG++neKuToTSgAA</XPD:REF> +<XPD:REF name="Tail">9Ld1pTeBF0CZmoVdEfEBMQAA</XPD:REF> +<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="Bt1whnZV8ke93vkLSyNq6wAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">gmKjyBaRB0SfVd2p3FDOTwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="fqRKs5ARzUGsdlKFgCFhWQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:REF name="Model">gmKjyBaRB0SfVd2p3FDOTwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="5M/QRFEaxUa0SktETbkRSwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">gmKjyBaRB0SfVd2p3FDOTwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="oOLw6a4XNk6oN6yvhlsf7QAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">QwwfXlN26EahMaF2XDAvLAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="51OtH+Gyy0+XZJVSgV/KuQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">X5VvOi2uGkGYzMMS5nWm2AAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="kMLAHkAn9EKw71vpw3PgHQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">QwwfXlN26EahMaF2XDAvLAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="V2pqj6nPg0SqB+TNOQI5PwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">X5VvOi2uGkGYzMMS5nWm2AAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="FYDexLT3eUK3X5xdW3Qq/gAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">QwwfXlN26EahMaF2XDAvLAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="1rWGuTeEqEm+RdcskXCo9gAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">X5VvOi2uGkGYzMMS5nWm2AAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="VJLq9UMlJE2EqLEbDm23HQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">QwwfXlN26EahMaF2XDAvLAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="90vol1uY7U27TcNYwOdZBQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">X5VvOi2uGkGYzMMS5nWm2AAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[24]" type="UMLAssociationView" guid="dSXCMAUeXkaVaOqAa4KDAQAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Points" type="Points">364,272;358,388</XPD:ATTR> +<XPD:REF name="Model">iBQV0DXX90uUjMTGr6FFjQAA</XPD:REF> +<XPD:REF name="Head">BVNqLhbhP06y98++NgmxAwAA</XPD:REF> +<XPD:REF name="Tail">9Ld1pTeBF0CZmoVdEfEBMQAA</XPD:REF> +<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="AXtWRmQ/j0G8KsAfZc/QeQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">iBQV0DXX90uUjMTGr6FFjQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="pxhqUzjCEkqTLYfXynALEwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:REF name="Model">iBQV0DXX90uUjMTGr6FFjQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="0nagXXOSFk+hHuMBpdFBLwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">iBQV0DXX90uUjMTGr6FFjQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="z3Q2FaOZNUa329RgqNTDpgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">IMPiiZPlxkaJkH8N2NGOggAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="+0LMOuMUukS68snSkLSsTwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">xf4XKZpxx0iF7C4H+oOABwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="bIZ0y/4MSEGDbNvxAP+XjAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">IMPiiZPlxkaJkH8N2NGOggAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="ow67AFPFhk2P92GHjX8x6gAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">xf4XKZpxx0iF7C4H+oOABwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="C8AG2Zjc9UCIEaei4/obTgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">IMPiiZPlxkaJkH8N2NGOggAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="cLLrD3Z3uUyN5TkuZIiYvQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">xf4XKZpxx0iF7C4H+oOABwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="q1TRTMmCmEuxq3mV3WwE9wAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">IMPiiZPlxkaJkH8N2NGOggAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="RpANS2KKQEiX7rWNn+sFQQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">xf4XKZpxx0iF7C4H+oOABwAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[25]" type="UMLAssociationView" guid="ALV9IpRzikWc38x/4t62CgAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Points" type="Points">383,272;484,396</XPD:ATTR> +<XPD:REF name="Model">9P0hz9Bq2U6gDVowATxiWAAA</XPD:REF> +<XPD:REF name="Head">7aPHkO59WEubHbpM/Djq/AAA</XPD:REF> +<XPD:REF name="Tail">9Ld1pTeBF0CZmoVdEfEBMQAA</XPD:REF> +<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="8t8bSCYvGkO28nJZE2y4nwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">9P0hz9Bq2U6gDVowATxiWAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="3EywKQmkOE2KjbjVh2NmDgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:REF name="Model">9P0hz9Bq2U6gDVowATxiWAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="BbqpqccVf0Wg7tVha614JAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">9P0hz9Bq2U6gDVowATxiWAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="YVFZpgGB/0O96quX2udZDwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">BSJLLgAd4kCusm/8BFZQMQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="TSgUJz4gCUSqn+dKKulHoAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">yVknRLQq7U2nj3bRfizyAgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="pIexnuTBiUiEhhq44l4rCwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">BSJLLgAd4kCusm/8BFZQMQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="bB0rInPRJES1Fi1mh9FCEAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">yVknRLQq7U2nj3bRfizyAgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="yT+paMjNpkaG1OKJL+sYCAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">BSJLLgAd4kCusm/8BFZQMQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="Te1GttqM50mrkMzGYceWLQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">yVknRLQq7U2nj3bRfizyAgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="znNxDO7m6E6nvS/FYUZ9OAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">BSJLLgAd4kCusm/8BFZQMQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="XUHdjv1boEaqvLcg553dbwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">yVknRLQq7U2nj3bRfizyAgAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[26]" type="UMLAssociationView" guid="hBsdq7HI/EWiSzAGC7VcegAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Points" type="Points">398,272;587,396</XPD:ATTR> +<XPD:REF name="Model">sBsUoQYdEkCsxRTpPtknYAAA</XPD:REF> +<XPD:REF name="Head">tzICJ64LmUSx1fvEy4dHZQAA</XPD:REF> +<XPD:REF name="Tail">9Ld1pTeBF0CZmoVdEfEBMQAA</XPD:REF> +<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="AW09hEar3Einy0/8DRC44wAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">sBsUoQYdEkCsxRTpPtknYAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="GL4o+Jwo9kafQcdPg1ZCtgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:REF name="Model">sBsUoQYdEkCsxRTpPtknYAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="kNZhsHL9skazmf+MM+oIKwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">sBsUoQYdEkCsxRTpPtknYAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="5T2cPS5X+UykejaXNX6mSAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">bObyymjPEkeQZSoHCKpP2QAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="VipQilP5w0axs39cx9OCsgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">6CsrL0wlVEKI657OoEev1gAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="P16FQXg1DEOld8DfGFfSxQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">bObyymjPEkeQZSoHCKpP2QAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="m6SZNVehm06iGtccsj43wAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">6CsrL0wlVEKI657OoEev1gAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="FcWiwQTsx02Ku0N5G3bjSgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">bObyymjPEkeQZSoHCKpP2QAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="x2e4QwAQ50Sn6Io3k6B2tAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">6CsrL0wlVEKI657OoEev1gAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="d3kqRYSWSUSKKTZ+56sZkwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">bObyymjPEkeQZSoHCKpP2QAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="4MO5fs8bNkahA1cEAQY9zAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">6CsrL0wlVEKI657OoEev1gAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[27]" type="UMLAssociationView" guid="Gfgt2UdXqE2QrN+Jzf+QvQAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Points" type="Points">406,263;684,349</XPD:ATTR> +<XPD:REF name="Model">5JmzC90ylki6klhVRRibGAAA</XPD:REF> +<XPD:REF name="Head">hzoiTuCQqEuArZEejfwdnQAA</XPD:REF> +<XPD:REF name="Tail">9Ld1pTeBF0CZmoVdEfEBMQAA</XPD:REF> +<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="/p9rmIUUo0mUctVF/yhY5AAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">5JmzC90ylki6klhVRRibGAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="P5QKAYFqikOaJu107L2QDwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:REF name="Model">5JmzC90ylki6klhVRRibGAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="y/WNtKBGo0q8OYbjC0evjgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">5JmzC90ylki6klhVRRibGAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="cGwksZvEz0aSTFoED5zuJQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">zCPl48BYx0CFRkp8Jj5mogAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="lELIUkkOg0a4b0G8373BcAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">be+eScBkV0Cn4n2XjSojvgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="pF9hWJbSZkCUq/C5qcS+7gAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">zCPl48BYx0CFRkp8Jj5mogAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="R1FSACG6EkWd7DK8ihYAQAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">be+eScBkV0Cn4n2XjSojvgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="/NvtextfvUyZKtMbQ1urHAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">zCPl48BYx0CFRkp8Jj5mogAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="WXg43X5+gEiu4atePea88gAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">be+eScBkV0Cn4n2XjSojvgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="4pUvTStSU0yU0BtcF8HyfQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">zCPl48BYx0CFRkp8Jj5mogAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="z+QrSf59lkSSqK+c5yKgcwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">be+eScBkV0Cn4n2XjSojvgAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[28]" type="UMLAssociationView" guid="Z3PDc4i/1UCiaxni9RpD2wAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Points" type="Points">756,473;397,581</XPD:ATTR> +<XPD:REF name="Model">1PikxOdVcU2P6grgcwgRvQAA</XPD:REF> +<XPD:REF name="Head">a8FG7H9SzUelkRx52q1d5AAA</XPD:REF> +<XPD:REF name="Tail">Th+ZwPCIw0CZjtawrnGPrQAA</XPD:REF> +<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="mhm++LaJkk6lJzcTz7hSFgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">1PikxOdVcU2P6grgcwgRvQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="IxT95vhnIEyr12fdRQskKQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:REF name="Model">1PikxOdVcU2P6grgcwgRvQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="d+KXspkLsEa/YezZSZ7YZAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">1PikxOdVcU2P6grgcwgRvQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="HxD2Y75aWkSp4d/0R6KiBgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">Fd/cvRV12USE+Vu6oJsMOgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="08HUrDXL5EahpEFi9GJ9yQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">AfVgLfyALEyP98guAbYHUAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="K5rMwb6Iyka5HDC+pxIZOwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">Fd/cvRV12USE+Vu6oJsMOgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="QRLcMMAOqES9/c4itcB3vAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">AfVgLfyALEyP98guAbYHUAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="GfMJbs1/nkShjuqnA/8BBAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">Fd/cvRV12USE+Vu6oJsMOgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="mQFH13/vQUucR5en5l/dUwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">AfVgLfyALEyP98guAbYHUAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="jXmYJVpZxkCkrM3yJ0eHmgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">Fd/cvRV12USE+Vu6oJsMOgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="m0oKw9kT5k2CSLEOl9tV+gAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">AfVgLfyALEyP98guAbYHUAAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[29]" type="UMLAssociationView" guid="JFsYjMcrU0GkgX8jFqUVZAAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Points" type="Points">406,252;704,263</XPD:ATTR> +<XPD:REF name="Model">3PUgTTrP3U+LofrDCso/eAAA</XPD:REF> +<XPD:REF name="Head">vYDCfUgYq0KaBSDnxbpYVgAA</XPD:REF> +<XPD:REF name="Tail">9Ld1pTeBF0CZmoVdEfEBMQAA</XPD:REF> +<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="R57gZgKnBkm8aQCFy90fiQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">3PUgTTrP3U+LofrDCso/eAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="GznyP+sffEKB3m9dw8jftQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:REF name="Model">3PUgTTrP3U+LofrDCso/eAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="NM8M6o1EGkWwEmKdXXKpPAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">3PUgTTrP3U+LofrDCso/eAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="AoZLFazfK0WqZzhHukFsAwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">usmo/t5V5UGA31IdVHUKyQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="vVViwylf/Ei9ld6xTj7WdQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">PP9nsgv4Vkmbk1zEfct4VAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="pDauXlrgH0KfuJt30X8zxgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">usmo/t5V5UGA31IdVHUKyQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="fhSnklGoSEqMAzQOJY57vwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">PP9nsgv4Vkmbk1zEfct4VAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="QGcntempZkeGNA54l7y1rAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">usmo/t5V5UGA31IdVHUKyQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="A5rd4V90HkCp3dmD7wYTbwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">PP9nsgv4Vkmbk1zEfct4VAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="NKRAWeqgBEKgb6cHnYpt9QAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">usmo/t5V5UGA31IdVHUKyQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="n4gqVjygvUK59/wDDHYNJgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">PP9nsgv4Vkmbk1zEfct4VAAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[30]" type="UMLClassView" guid="wu+9+Z2tqE2B3qchWKoWdQAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">20</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">500</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">119</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">63</XPD:ATTR> +<XPD:REF name="Model">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF> +<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="zRZpHvisoUiNkQtlLufy/AAA"> +<XPD:OBJ name="NameLabel" type="LabelView" guid="z/By7OpfokuCMZMimH2OSQAA"> +<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR> +<XPD:ATTR name="Text" type="string">CTvChannelParams</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="PKd1BAj8BkWUWLwbCv4oegAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="LabelView" guid="zu1bY/47U0eoDJhSjdTYNAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="KAuxxnmqhkmQ7MLBFq8lRgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="Ynggyopqt02II9Rzg7q1VQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="PmvllpBms0ifaPkwzqXvOAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:REF name="Model">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[31]" type="UMLAssociationView" guid="Q/k+TeR21UWA0JPwiSZAnwAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Points" type="Points">130,465;103,500</XPD:ATTR> +<XPD:REF name="Model">7aJQb5j/+kWV9Kb/0dqoJAAA</XPD:REF> +<XPD:REF name="Head">wu+9+Z2tqE2B3qchWKoWdQAA</XPD:REF> +<XPD:REF name="Tail">iEgH+6H6kkG++neKuToTSgAA</XPD:REF> +<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="C2jwipMyN0iMiEays2pVbQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">7aJQb5j/+kWV9Kb/0dqoJAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="MxF6R3nqrk+nOid9gUoepAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:REF name="Model">7aJQb5j/+kWV9Kb/0dqoJAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="5CzND/56UUuAy2C5OXPJGAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">7aJQb5j/+kWV9Kb/0dqoJAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="VSR1os7RckKbbg+wZ6UPWwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">Dzfwehs+P0e8CyC/holLewAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="2P5BNH8K/UKYeriBTZAbSgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">C7X0ILbZrkWDVQ5Vc+PT/wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="+gO4BIQphEShtlup7FhfcgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">Dzfwehs+P0e8CyC/holLewAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="nbxLBw93Oka1PVwDZftA2QAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">C7X0ILbZrkWDVQ5Vc+PT/wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="3yHNXWsgu0eaPzi0F9a3dgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">Dzfwehs+P0e8CyC/holLewAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="X0Z4arOj+EWceCda6Sj0vgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">C7X0ILbZrkWDVQ5Vc+PT/wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="laRXvwF4WE2wUODF6aCNSQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">Dzfwehs+P0e8CyC/holLewAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="lKhOSy40pUOJhnfmNzIx5AAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">C7X0ILbZrkWDVQ5Vc+PT/wAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[32]" type="UMLAssociationView" guid="2tALOFJiukSZiwAj9gBDIQAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Points" type="Points">138,545;312,584</XPD:ATTR> +<XPD:REF name="Model">6r7WWefo1kK4HXJ46+UuHwAA</XPD:REF> +<XPD:REF name="Head">a8FG7H9SzUelkRx52q1d5AAA</XPD:REF> +<XPD:REF name="Tail">wu+9+Z2tqE2B3qchWKoWdQAA</XPD:REF> +<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="BM0ZC/TOp0CzIS/dSFOgMQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">6r7WWefo1kK4HXJ46+UuHwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="911s2zFZYUCPtLOmXSDdDgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:REF name="Model">6r7WWefo1kK4HXJ46+UuHwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="bOeJui9AgkWX+he6KT6czQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">6r7WWefo1kK4HXJ46+UuHwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="lMa33WFxzU2ojAIXkT9IwAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">AM/xtV731kSTTZbv0mmefgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="2U407qHmXE+0VHF/y4trXwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">+M+2f65R0UCJH6UP90YGAQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="MAu3FLtcFkOt8a9+Yj8MBAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">AM/xtV731kSTTZbv0mmefgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="16BTtqnINEq6DZln/1Uc4AAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">+M+2f65R0UCJH6UP90YGAQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="Ehl7/9ciY0mjVGRlJGzTegAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">AM/xtV731kSTTZbv0mmefgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="dAD5Dd+Px0eU/Z7MNaXtWgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">+M+2f65R0UCJH6UP90YGAQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="FstmADGG7k2p8GVFXyT/GAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">AM/xtV731kSTTZbv0mmefgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="1RtPOXDsOEuSNTqKSxFAKAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">+M+2f65R0UCJH6UP90YGAQAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedDiagrams[1]" type="UMLClassDiagram" guid="KQsibHBE0E+iq5h5Fks0CQAA"> +<XPD:ATTR name="Name" type="string">tvpackage</XPD:ATTR> +<XPD:ATTR name="DefaultDiagram" type="boolean">True</XPD:ATTR> +<XPD:ATTR name="DiagramType" type="string">RobustnessDiagram</XPD:ATTR> +<XPD:REF name="DiagramOwner">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF> +<XPD:OBJ name="DiagramView" type="UMLClassDiagramView" guid="x/A73wV6JUGNNCNYoihDDgAA"> +<XPD:REF name="Diagram">KQsibHBE0E+iq5h5Fks0CQAA</XPD:REF> +<XPD:ATTR name="#OwnedViews" type="integer">10</XPD:ATTR> +<XPD:OBJ name="OwnedViews[0]" type="UMLPackageView" guid="R7RBkUeb+E+5S8gvJN8+QQAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">28</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">228</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">120</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">70</XPD:ATTR> +<XPD:REF name="Model">ZRumjrTwgUamBDOstkagPgAA</XPD:REF> +<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="Hex0jIlJWk2QTHp5TF36MwAA"> +<XPD:OBJ name="NameLabel" type="LabelView" guid="155YNS2IsE2b46plldDuZwAA"> +<XPD:ATTR name="Text" type="string">atv</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="gqZ/H0j6nkqKMGqx1OqzOgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="LabelView" guid="mK5kp4doeUC6dn5S5jvPHAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[1]" type="UMLPackageView" guid="fCE1/LJF8k+yzWx4bHj2WgAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">336</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">224</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">120</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">70</XPD:ATTR> +<XPD:REF name="Model">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF> +<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="N9Ut8OrmLU6VnX16D13WOwAA"> +<XPD:OBJ name="NameLabel" type="LabelView" guid="Yz9HR5DzxEuE9o9uHImtSQAA"> +<XPD:ATTR name="Text" type="string">dtv</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="LDxg9fdTakmhArzVxsd2GQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="LabelView" guid="L/ePjmLKwUeEeTrRhsEKMgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[2]" type="UMLPackageView" guid="H1zFqxbUzEqKqOJUsjP9UgAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">260</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">72</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">120</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">70</XPD:ATTR> +<XPD:REF name="Model">7dRihysn8kefkb+6mJlwzgAA</XPD:REF> +<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="f7UEhckiS0qQAoQ5jk3q5wAA"> +<XPD:OBJ name="NameLabel" type="LabelView" guid="J4t7wKCRQk6ZH6fs1Q9YrgAA"> +<XPD:ATTR name="Text" type="string">tvjava</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="9qa1Yi+fukyu0We9ci5u/AAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="LabelView" guid="+iZgsEiKfUmY0m8L9nAURwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[3]" type="UMLAssociationView" guid="G0kUvklDf0uhBeIUoV+srgAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Points" type="Points">267,141;138,228</XPD:ATTR> +<XPD:REF name="Model">rIQWVfPr7E24Tt4ljeTZ4wAA</XPD:REF> +<XPD:REF name="Head">R7RBkUeb+E+5S8gvJN8+QQAA</XPD:REF> +<XPD:REF name="Tail">H1zFqxbUzEqKqOJUsjP9UgAA</XPD:REF> +<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="6o6l7Ax4b0uvR1w70cdJiAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">rIQWVfPr7E24Tt4ljeTZ4wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="3ZsGQfCQIk+ZPFC1FyyVeQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:REF name="Model">rIQWVfPr7E24Tt4ljeTZ4wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="BCGhRmtL7kmoY1iXaapJOwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">rIQWVfPr7E24Tt4ljeTZ4wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="SuRONY2jREyvBHGP7nheBQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">XKFQZaAIH0SxD7YBXgkK0wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="zqmFgnNCJ0mU+9gnrH18SwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">jLzV7XdHP0Ogmb7/6IPCtgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="l9UCuL7VoEm7vFLWkobdoAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">XKFQZaAIH0SxD7YBXgkK0wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="yt3drhX0N0aispBa+C83TAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">jLzV7XdHP0Ogmb7/6IPCtgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="8rSGjmyTy0iar869slrlPgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">XKFQZaAIH0SxD7YBXgkK0wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="QE0xM9HZIUK4iQSOifSKDQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">jLzV7XdHP0Ogmb7/6IPCtgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="NYMZ1wuIcUy7G5VODIYIDQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1020</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">XKFQZaAIH0SxD7YBXgkK0wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="L3X2M2UWvECpCLZj42krJAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1020</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">jLzV7XdHP0Ogmb7/6IPCtgAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[4]" type="UMLAssociationView" guid="+dr3aeLg8k2RQ8khsHmmqAAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Points" type="Points">336,141;378,224</XPD:ATTR> +<XPD:REF name="Model">0hCZfIhV4EOpKXcVPwcUnAAA</XPD:REF> +<XPD:REF name="Head">fCE1/LJF8k+yzWx4bHj2WgAA</XPD:REF> +<XPD:REF name="Tail">H1zFqxbUzEqKqOJUsjP9UgAA</XPD:REF> +<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="eiIT0uNCpUywEWk7FrhutgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">0hCZfIhV4EOpKXcVPwcUnAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="m5vcHblPLUe9VZHiD1lPzgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:REF name="Model">0hCZfIhV4EOpKXcVPwcUnAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="dHGIMYC9dUeyteDUvxEuNgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">0hCZfIhV4EOpKXcVPwcUnAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="bVRmxC4LeEivBU8rO/l1IwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">TolxJOTDCkO5nyLC6ipkAwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="DGGWcQw7xESguDo8y8c9JwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">DGWju3i/80ObxLedRPIIEwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="Brf+/LZbFEamowtJ6zGOAgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">TolxJOTDCkO5nyLC6ipkAwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="YyNOaiAWMU6urAt6uMo51wAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">DGWju3i/80ObxLedRPIIEwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="/6WmiwEpmUGnLzBRc6lCzwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">TolxJOTDCkO5nyLC6ipkAwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="RjfRt8utjEiWYhIQFBxLqgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">DGWju3i/80ObxLedRPIIEwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="eme8PTCUYkiREXPCAN1ACgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1020</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">TolxJOTDCkO5nyLC6ipkAwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="HRQ1wVKzDUe1hazbUuDnVwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1020</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">DGWju3i/80ObxLedRPIIEwAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[5]" type="UMLPackageView" guid="HUFrn02Id0u4EHrKc4mxVgAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">528</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">308</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">120</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">70</XPD:ATTR> +<XPD:REF name="Model">CN6L5smMd0u/4SQDgGuxlAAA</XPD:REF> +<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="I7oFyXOyn0ap6db6aB27kQAA"> +<XPD:OBJ name="NameLabel" type="LabelView" guid="UZqAJSuU3kSCM+H7F0CJAwAA"> +<XPD:ATTR name="Text" type="string">am_mw</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="uBO1MGx+MkeMvQYhb1C2NQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="LabelView" guid="kl+qD1R9/USAxQT6CzXArgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[6]" type="UMLPackageView" guid="I+6GQQgDxUay2yh9EH63ugAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">296</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">428</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">120</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">70</XPD:ATTR> +<XPD:REF name="Model">y05IqzZQzU2XtiSPAXk7QgAA</XPD:REF> +<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="9hBSRpfEY02ywkAvNDqTXQAA"> +<XPD:OBJ name="NameLabel" type="LabelView" guid="h6PfAdCi8kytI+NLcAHmLAAA"> +<XPD:ATTR name="Text" type="string">am_adp</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="lQixSy3pSUqBMXv0rFJpcQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="LabelView" guid="GkA9EEwFZkyyC6WEJrJkMAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +</XPD:OBJ> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[7]" type="UMLAssociationView" guid="jyEOqiMx5kuOhl2RypG5igAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Points" type="Points">455,284;528,316</XPD:ATTR> +<XPD:REF name="Model">Yy1zZGFqjUCrfxwigF/GpgAA</XPD:REF> +<XPD:REF name="Head">HUFrn02Id0u4EHrKc4mxVgAA</XPD:REF> +<XPD:REF name="Tail">fCE1/LJF8k+yzWx4bHj2WgAA</XPD:REF> +<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="CPHJazCBZ06NtAVR2VK7OQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">Yy1zZGFqjUCrfxwigF/GpgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="APOmD3psFUyWhRAnwzCajwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:REF name="Model">Yy1zZGFqjUCrfxwigF/GpgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="QMsE3esBJk6sDRS6x5DJkQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">Yy1zZGFqjUCrfxwigF/GpgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="5/4cIerJAUmV49IBGwpo+AAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">MOhicSFw0kKsC3+R+Reo0AAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="Pet1Wl/5g0+pU9Kd2fc7SwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">KeKc5deyJkKjIbzodSAF8QAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="xdfe8bjolEChoIUMuakZ8gAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">MOhicSFw0kKsC3+R+Reo0AAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="Dx+9oTBsHEO70cjv4b2azAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">KeKc5deyJkKjIbzodSAF8QAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="BoU11LZqBk2U9D1Ai1YY2AAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">MOhicSFw0kKsC3+R+Reo0AAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="GAWp04mbX0+qBItsdvgjYwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">KeKc5deyJkKjIbzodSAF8QAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="fBqd46+r3kqJEpg8jQ4//wAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-984</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1076</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">MOhicSFw0kKsC3+R+Reo0AAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="EDyc+T9/p0uT65Az3US0YgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-984</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1076</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">KeKc5deyJkKjIbzodSAF8QAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[8]" type="UMLAssociationView" guid="YWFKeOxwm0mHujDlyTbolQAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Points" type="Points">388,293;362,428</XPD:ATTR> +<XPD:REF name="Model">+rFPRw7qR0aoTGBGytrjDAAA</XPD:REF> +<XPD:REF name="Head">I+6GQQgDxUay2yh9EH63ugAA</XPD:REF> +<XPD:REF name="Tail">fCE1/LJF8k+yzWx4bHj2WgAA</XPD:REF> +<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="zrsbj2XE/EayNVwoOloIDAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">+rFPRw7qR0aoTGBGytrjDAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="pIYrJ7JAAUSz3n/qiGAv0gAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:REF name="Model">+rFPRw7qR0aoTGBGytrjDAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="qoKs5KXOckiwAYzN24SMoQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">+rFPRw7qR0aoTGBGytrjDAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="5Y/PPNFnoUOKREH8OSaNBwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">n4pg4fd/GUuaJaSzXBirOAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="88cAHmNV00eS5otEvuUQZAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">osliKvkWrU6Jd0FLz/mZngAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="OURlWAjS10SUcdK4oeUXcwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">n4pg4fd/GUuaJaSzXBirOAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="+YTxAPro+k+Ev3Qa9Td+KAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">osliKvkWrU6Jd0FLz/mZngAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="NJe8vUJOvEixN2Md5vRGkgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">n4pg4fd/GUuaJaSzXBirOAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="BuekzgD4P0aqdOzNBAVkYAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">osliKvkWrU6Jd0FLz/mZngAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="5Y0Wg3PhS06h+5PmVU/QJAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-984</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1076</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">n4pg4fd/GUuaJaSzXBirOAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="zTwLHGMcZUaH/kCRcMqJlQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-984</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-1076</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">osliKvkWrU6Jd0FLz/mZngAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedViews[9]" type="UMLAssociationView" guid="G47JdG1ivEWpCS5+NGRUWQAA"> +<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR> +<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR> +<XPD:ATTR name="Points" type="Points">528,373;415,431</XPD:ATTR> +<XPD:REF name="Model">eNd3z1weKEWCnlfqPTDLIgAA</XPD:REF> +<XPD:REF name="Head">I+6GQQgDxUay2yh9EH63ugAA</XPD:REF> +<XPD:REF name="Tail">HUFrn02Id0u4EHrKc4mxVgAA</XPD:REF> +<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="u6LdVCjKbEaIGLn56/w1QQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">eNd3z1weKEWCnlfqPTDLIgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="ona2Ko0szEK+2FIv3L6R1wAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:REF name="Model">eNd3z1weKEWCnlfqPTDLIgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="fST4kYS4rkicfRLiq6BrYQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">15</XPD:ATTR> +<XPD:REF name="Model">eNd3z1weKEWCnlfqPTDLIgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="AnTjwQSX4UO3xjKGm9U1PAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">SVDzdW2e/kG2il66SgxQ1wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="GtS+L0c22kmmx+S6raeEAAAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">30</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">elujImCAXkaoOjRAKkuxUAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="Rx+SX1Ukc0WijFhZRJ2tbgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">SVDzdW2e/kG2il66SgxQ1wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="r48AH3NG+kGYdG2dItOtqwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">25</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">elujImCAXkaoOjRAKkuxUAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="OMlcQeewVkyEmkWpq768pgAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR> +<XPD:REF name="Model">SVDzdW2e/kG2il66SgxQ1wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="C6OdcHaGUEG0WccqDQbNoQAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR> +<XPD:ATTR name="Distance" type="real">40</XPD:ATTR> +<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR> +<XPD:REF name="Model">elujImCAXkaoOjRAKkuxUAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="61/4k03iIkWp5ZY6aFMm4AAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-912</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">SVDzdW2e/kG2il66SgxQ1wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="aRw7UJOi9kaUwJX2uJ1tDwAA"> +<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR> +<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR> +<XPD:ATTR name="Top" type="integer">-912</XPD:ATTR> +<XPD:ATTR name="Width" type="integer">50</XPD:ATTR> +<XPD:ATTR name="Height" type="integer">8</XPD:ATTR> +<XPD:REF name="Model">elujImCAXkaoOjRAKkuxUAAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +</XPD:OBJ> +</XPD:OBJ> +<XPD:ATTR name="#OwnedElements" type="integer">31</XPD:ATTR> +<XPD:OBJ name="OwnedElements[0]" type="UMLAssociation" guid="av0s6EXaYUKyooee2y6sdgAA"> +<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">12BWSnVhhUOUuox7tdL41gAA</XPD:REF> +<XPD:REF name="Views[1]">4F+C2zwwrEOjx/qCnLXWPAAA</XPD:REF> +<XPD:REF name="Views[2]">lXf6uq0JtkK3YNXTxTyP7wAA</XPD:REF> +<XPD:REF name="Views[3]">8jym3kotyE2sBWD5KjhUiQAA</XPD:REF> +<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="IEnUwW74QkSkdRZGqdKvaAAA"> +<XPD:REF name="Association">av0s6EXaYUKyooee2y6sdgAA</XPD:REF> +<XPD:REF name="Participant">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">awNg1wfSGU22on1C+XpBlgAA</XPD:REF> +<XPD:REF name="Views[1]">cGTSA3bQb0S81NQzsTj+QQAA</XPD:REF> +<XPD:REF name="Views[2]">LWsKT6dOQUKXma9Eoh+sUwAA</XPD:REF> +<XPD:REF name="Views[3]">l9TSA+eftkCY2p6qZDMGKAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="GZcPUasbnkG3pyGKV6NFnAAA"> +<XPD:REF name="Association">av0s6EXaYUKyooee2y6sdgAA</XPD:REF> +<XPD:REF name="Participant">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">ioK1huVib0u6ILv3kHAeeQAA</XPD:REF> +<XPD:REF name="Views[1]">cwfxPIXUd06ShM9BEivzxQAA</XPD:REF> +<XPD:REF name="Views[2]">DBsnRjqoj0W9eAN/Flu+jwAA</XPD:REF> +<XPD:REF name="Views[3]">DUu549wQM0qPn9dAjjrLZgAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[1]" type="UMLAssociation" guid="cNCsWS2hgkeaGhYJv9oONgAA"> +<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">Qa1PhzSwWkyS1rm6eapfLwAA</XPD:REF> +<XPD:REF name="Views[1]">QAoFSXFK+0S+5kDYAQ0LsgAA</XPD:REF> +<XPD:REF name="Views[2]">rsOqshNVOkut6r+wW0Sp/wAA</XPD:REF> +<XPD:REF name="Views[3]">0wZW9IH3y0OEPMfN5FyHQAAA</XPD:REF> +<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="PFZlUbzZu02nTTLsYZBoDgAA"> +<XPD:REF name="Association">cNCsWS2hgkeaGhYJv9oONgAA</XPD:REF> +<XPD:REF name="Participant">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">TM3RNruxzEezNhF8XO/FmwAA</XPD:REF> +<XPD:REF name="Views[1]">NpASusGGKU+/KwcKkTAMogAA</XPD:REF> +<XPD:REF name="Views[2]">3dtXpNLbXka7wekzvAWsXQAA</XPD:REF> +<XPD:REF name="Views[3]">Mvk2196ldk+5GLgct+OKuwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="2JZlFpDZPkGgaoWrrPAGXAAA"> +<XPD:REF name="Association">cNCsWS2hgkeaGhYJv9oONgAA</XPD:REF> +<XPD:REF name="Participant">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">ySD9HMBWmEWoJg+/6boBZgAA</XPD:REF> +<XPD:REF name="Views[1]">LXz8D2AdoE6ojzgkYCO0qAAA</XPD:REF> +<XPD:REF name="Views[2]">ia8j06EduUmxgB5smbA9hQAA</XPD:REF> +<XPD:REF name="Views[3]">/JYlnmhzTk66TicK0RjYaQAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[2]" type="UMLAssociation" guid="CVx7QaOEd0iJQ6USdSCilwAA"> +<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">UmHHYiIr3k+gNNomjLpgwwAA</XPD:REF> +<XPD:REF name="Views[1]">ZBlvBeIE2UGGPTML4sQ7SgAA</XPD:REF> +<XPD:REF name="Views[2]">UDn5R84weEayOYl6QVFj1wAA</XPD:REF> +<XPD:REF name="Views[3]">OApAa7HXz0aTiMZGZ/g2tAAA</XPD:REF> +<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="q5Ko0bXKcE6uj05NJPSddwAA"> +<XPD:REF name="Association">CVx7QaOEd0iJQ6USdSCilwAA</XPD:REF> +<XPD:REF name="Participant">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">24RGLobteEil7cUdAcyUcAAA</XPD:REF> +<XPD:REF name="Views[1]">6Uw1pdad6kC8N8S0Rf1HxwAA</XPD:REF> +<XPD:REF name="Views[2]">CuUsJAcsAUWwVZJzegOegAAA</XPD:REF> +<XPD:REF name="Views[3]">AST9GWgDTEWR07o7yUcgIQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="XvxorIQvl0aKnzyznjd1uwAA"> +<XPD:REF name="Association">CVx7QaOEd0iJQ6USdSCilwAA</XPD:REF> +<XPD:REF name="Participant">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">W1YT5dqwMUSUI29zCC2LZQAA</XPD:REF> +<XPD:REF name="Views[1]">X96IIfOZSE2FAliwKkCNYgAA</XPD:REF> +<XPD:REF name="Views[2]">tr7uiHRKz0e//ValH5GU+AAA</XPD:REF> +<XPD:REF name="Views[3]">zdcHIs6dNEmxQNtCK5uHIQAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[3]" type="UMLAssociation" guid="hBOTE33GDUO/X8s5oHlAmQAA"> +<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">oYsj3yhzJkCKmOBcWIHNDwAA</XPD:REF> +<XPD:REF name="Views[1]">GT6R2h3HkU6LThPKaghC1QAA</XPD:REF> +<XPD:REF name="Views[2]">eWMr3v5Qb0y/nXu2s/EP5wAA</XPD:REF> +<XPD:REF name="Views[3]">GR9gxzUjNkKmujWHFobLtAAA</XPD:REF> +<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="qOlPMeLYpUC4lTEl3Hsc8QAA"> +<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR> +<XPD:REF name="Association">hBOTE33GDUO/X8s5oHlAmQAA</XPD:REF> +<XPD:REF name="Participant">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">UuRRAQf+y0OdXTOvWu7nUAAA</XPD:REF> +<XPD:REF name="Views[1]">vI5c+acLSk6IfCcdqlaBggAA</XPD:REF> +<XPD:REF name="Views[2]">w3rpxhxEsEu0y7myhFrrkQAA</XPD:REF> +<XPD:REF name="Views[3]">8Ip2rQJRaEaPAOW0cJSd/wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="Yo1IoB0X3ka1C+a/6xk1/gAA"> +<XPD:REF name="Association">hBOTE33GDUO/X8s5oHlAmQAA</XPD:REF> +<XPD:REF name="Participant">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">+SSR3TM1z0m5UkTLiuMrGwAA</XPD:REF> +<XPD:REF name="Views[1]">Uvo2ryiBg0Oa5GJF4TRyhQAA</XPD:REF> +<XPD:REF name="Views[2]">QBI1NHwjWU2dkj+SLUFZ+AAA</XPD:REF> +<XPD:REF name="Views[3]">IYVJT/RjPUqjv8rl6ZIQiwAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[4]" type="UMLAssociation" guid="/X1BIuClXkywNV1vNa/LWwAA"> +<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">Vcgjd9eKakOjuUAjwzzhJgAA</XPD:REF> +<XPD:REF name="Views[1]">+iIIR1mEnUynEPEjuGAd7AAA</XPD:REF> +<XPD:REF name="Views[2]">bZn71kXJQUOP3yAyCa5RvgAA</XPD:REF> +<XPD:REF name="Views[3]">O36co7nFz0elpJnbKtsYMwAA</XPD:REF> +<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="BVpPYPY4V0KsTBJTRoLjyAAA"> +<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR> +<XPD:REF name="Association">/X1BIuClXkywNV1vNa/LWwAA</XPD:REF> +<XPD:REF name="Participant">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">Hv4K+XlgIkqDgqEz3aQWNQAA</XPD:REF> +<XPD:REF name="Views[1]">4o7M8jakfkixRwVgESrUnwAA</XPD:REF> +<XPD:REF name="Views[2]">rCPaxzL0LEuk9Jjbqi+D2gAA</XPD:REF> +<XPD:REF name="Views[3]">HKXhPda/vUuVwv4sR9ZR9QAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="RoKhf4Bw3kmRk2O2D4GlxQAA"> +<XPD:REF name="Association">/X1BIuClXkywNV1vNa/LWwAA</XPD:REF> +<XPD:REF name="Participant">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">yjjLYCXJjUqX0IHnpKwHwQAA</XPD:REF> +<XPD:REF name="Views[1]">k1XiyO9mlke/IAq5UuYI9gAA</XPD:REF> +<XPD:REF name="Views[2]">Xtc7Jqe6N0+JAzLg1RxYLwAA</XPD:REF> +<XPD:REF name="Views[3]">W0UPJtBpLU6Y5SjscWTiVAAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[5]" type="UMLAssociation" guid="PudswW77eEShTMEdcK5BCAAA"> +<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">VjZwKWmCoUO5wNRGJGVShAAA</XPD:REF> +<XPD:REF name="Views[1]">6e9pHkpPaUyLDCYYnUYAOAAA</XPD:REF> +<XPD:REF name="Views[2]">QA7tnAAMA0e3tCDRlkB/JwAA</XPD:REF> +<XPD:REF name="Views[3]">gdUdn5u5x0KDsDKM41p2CQAA</XPD:REF> +<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="Io3cINfhiE23pmiSxpS6swAA"> +<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR> +<XPD:REF name="Association">PudswW77eEShTMEdcK5BCAAA</XPD:REF> +<XPD:REF name="Participant">gx40XIC9FkOG3iX3Oyxw8wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">d/3xrtQ+nU69mQYepo7NvQAA</XPD:REF> +<XPD:REF name="Views[1]">HcOo4bUmbUqLEjVUm2L2AQAA</XPD:REF> +<XPD:REF name="Views[2]">tQj+naSiJ0mB4W89ahH5ygAA</XPD:REF> +<XPD:REF name="Views[3]">LNFybtIVIkOXnQ/9QC5jEwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="vyoQZGl3UECBMhf7+IDQUwAA"> +<XPD:REF name="Association">PudswW77eEShTMEdcK5BCAAA</XPD:REF> +<XPD:REF name="Participant">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">rqoTwNlD20Gou9xOLQ2RNgAA</XPD:REF> +<XPD:REF name="Views[1]">ox9r7npaB0in7/ygfG1ZMwAA</XPD:REF> +<XPD:REF name="Views[2]">exLwGLRY306J0CEcqxlOrgAA</XPD:REF> +<XPD:REF name="Views[3]">qxZgk8R36k2S3vGRfQegfwAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[6]" type="UMLAssociation" guid="q5PurOmOUUOX8hzj5CINYQAA"> +<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">QHk4xsvJRUGhKn0p+sReaAAA</XPD:REF> +<XPD:REF name="Views[1]">ezGCtUA0dUOn10D5pUOtoAAA</XPD:REF> +<XPD:REF name="Views[2]">QcGPzg741ki4yTGfoKvK9AAA</XPD:REF> +<XPD:REF name="Views[3]">ioZQYN39bEu/gy37UfkhmQAA</XPD:REF> +<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="PhlKgbqPt0OClpwk2m9vswAA"> +<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR> +<XPD:REF name="Association">q5PurOmOUUOX8hzj5CINYQAA</XPD:REF> +<XPD:REF name="Participant">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">VrmcPyj2oUyEm5i/AG7/KgAA</XPD:REF> +<XPD:REF name="Views[1]">odMtivppNUOccWtC85AVCQAA</XPD:REF> +<XPD:REF name="Views[2]">2IiGGrbDkUiobp5CJnME1QAA</XPD:REF> +<XPD:REF name="Views[3]">+70t9Os6zUWhIAhufEQsBAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="iy8GVdK11EmKnmJ6LivVVQAA"> +<XPD:REF name="Association">q5PurOmOUUOX8hzj5CINYQAA</XPD:REF> +<XPD:REF name="Participant">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">mZFBakBXmE6Gj5qumz51gwAA</XPD:REF> +<XPD:REF name="Views[1]">KHpH30oHrEew1AGquvXiEQAA</XPD:REF> +<XPD:REF name="Views[2]">W7KAnZMmjEKAxuaUXA4D6AAA</XPD:REF> +<XPD:REF name="Views[3]">jsiact/gpUS21gy1IeSlZQAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[7]" type="UMLAssociation" guid="8zCqordbBESBaPJH8SIoOQAA"> +<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">l3oAx6sfA0ScCOouvAFKYwAA</XPD:REF> +<XPD:REF name="Views[1]">pM/XXFo9Ikq+kK5++HoZ0QAA</XPD:REF> +<XPD:REF name="Views[2]">igklIYxpfka7OH5oAnRbPwAA</XPD:REF> +<XPD:REF name="Views[3]">RtZQfGM0uUqohb/WlARRpwAA</XPD:REF> +<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="72fG4kbiM0eyczFPq2MtVAAA"> +<XPD:ATTR name="Multiplicity" type="string">1..*</XPD:ATTR> +<XPD:REF name="Association">8zCqordbBESBaPJH8SIoOQAA</XPD:REF> +<XPD:REF name="Participant">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">pr9mkVSNO0KasNMsFvgDuQAA</XPD:REF> +<XPD:REF name="Views[1]">4fUHmnlcd0WplogWZWqPRQAA</XPD:REF> +<XPD:REF name="Views[2]">kKRq4K1cvEup70Oz2UFd8QAA</XPD:REF> +<XPD:REF name="Views[3]">DS2eOvXKXku93Y4x950QPgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="zefo1Bu+v0e4gn9nUL+bSQAA"> +<XPD:ATTR name="Multiplicity" type="string">1</XPD:ATTR> +<XPD:REF name="Association">8zCqordbBESBaPJH8SIoOQAA</XPD:REF> +<XPD:REF name="Participant">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">lDsB+MeNlUy+OEBCbfs0OAAA</XPD:REF> +<XPD:REF name="Views[1]">EeUDIEWsnkO5HzTU6L6kZQAA</XPD:REF> +<XPD:REF name="Views[2]">TuyQdZk0H0+ai9Mg3ZtK3AAA</XPD:REF> +<XPD:REF name="Views[3]">NKw56kYvx0W0KlwhXPYWMwAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[8]" type="UMLAssociation" guid="3RrM1HB71kyHO0jB4JI4zgAA"> +<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">5vCGUSmlwUWKkjul/i5CoAAA</XPD:REF> +<XPD:REF name="Views[1]">ihIaZz5p+0Cte+Zqg1wUKgAA</XPD:REF> +<XPD:REF name="Views[2]">XyhhchGH70uYaM5UdGboKQAA</XPD:REF> +<XPD:REF name="Views[3]">+N+OW0LtoEyevYQ++bVO1gAA</XPD:REF> +<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="ULQw0JNjPE2758pFWlo+MQAA"> +<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR> +<XPD:REF name="Association">3RrM1HB71kyHO0jB4JI4zgAA</XPD:REF> +<XPD:REF name="Participant">iUy0YZgyREC+o54lTQptaAAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">blnGfW4UCk6tS0veRc88xAAA</XPD:REF> +<XPD:REF name="Views[1]">jGRa3FaTrUWVhYVG834fjwAA</XPD:REF> +<XPD:REF name="Views[2]">olvLmzjsfka5YmNEOntQDAAA</XPD:REF> +<XPD:REF name="Views[3]">H/do1s5Rh02ETrOyjtaoaAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="DkcX/fIec029p5Da5gYToAAA"> +<XPD:REF name="Association">3RrM1HB71kyHO0jB4JI4zgAA</XPD:REF> +<XPD:REF name="Participant">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">vLsrualWRkO0QI8PcBWGAAAA</XPD:REF> +<XPD:REF name="Views[1]">vWndJmxhrkKfipX/zAAt4AAA</XPD:REF> +<XPD:REF name="Views[2]">lKgJhvwP/Eygz7oPLvwsxwAA</XPD:REF> +<XPD:REF name="Views[3]">AdMO10glEEWGGHqpzKNvewAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[9]" type="UMLAssociation" guid="GjMZbUwaMkGOkbxOXau26AAA"> +<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">EWnB2mjt6ke3pnsnQFRgJwAA</XPD:REF> +<XPD:REF name="Views[1]">dM3yo1oYRUWNB1JawgFnywAA</XPD:REF> +<XPD:REF name="Views[2]">/IP55LSMZUCRoa77gkMh9gAA</XPD:REF> +<XPD:REF name="Views[3]">Og4FQYOz9kOr8LF43j+ySwAA</XPD:REF> +<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="aYL27tYOR02se3g//aEBeAAA"> +<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR> +<XPD:REF name="Association">GjMZbUwaMkGOkbxOXau26AAA</XPD:REF> +<XPD:REF name="Participant">/LI4+1GTjEagI/wLEFpVSQAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">Ggu7vb3GMU2vn9mS8bGZpwAA</XPD:REF> +<XPD:REF name="Views[1]">wMyvwGpZQUmJ2a2lXlkc/AAA</XPD:REF> +<XPD:REF name="Views[2]">rn/sn4ErGkyYnwDUlnpmTAAA</XPD:REF> +<XPD:REF name="Views[3]">wElMDINXY0esqBl7AwoyfQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="gc0GlJ6ewUOpiyya+XPqjQAA"> +<XPD:REF name="Association">GjMZbUwaMkGOkbxOXau26AAA</XPD:REF> +<XPD:REF name="Participant">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">zHiCXVqqgE6r2lDdnVDI1gAA</XPD:REF> +<XPD:REF name="Views[1]">19Ii9g15zUmLLURud9e9XAAA</XPD:REF> +<XPD:REF name="Views[2]">KLCf1m7tBkGvkM3iOxLhJgAA</XPD:REF> +<XPD:REF name="Views[3]">1+qZEhcpyk6RHirwjBjalgAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[10]" type="UMLAssociation" guid="m6lnHtsBL02A4Oup+IzVEAAA"> +<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">DbUG5zy8r0yq6L/I1naVdQAA</XPD:REF> +<XPD:REF name="Views[1]">1qY9qbCT1ka5tmfuL9yaJgAA</XPD:REF> +<XPD:REF name="Views[2]">bnG59/mNjk+fcthvMQG2VAAA</XPD:REF> +<XPD:REF name="Views[3]">wovrqiKgc0qw9BUyPaGuBQAA</XPD:REF> +<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="kdbNMfgoG02cJO0UFJeeLwAA"> +<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR> +<XPD:REF name="Association">m6lnHtsBL02A4Oup+IzVEAAA</XPD:REF> +<XPD:REF name="Participant">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">JbJSjKTBikyT++rY1XVCtwAA</XPD:REF> +<XPD:REF name="Views[1]">wUtw7zNylEK+wDvPOsUtGwAA</XPD:REF> +<XPD:REF name="Views[2]">/cBBOvztgE6Kd7yvemxXPwAA</XPD:REF> +<XPD:REF name="Views[3]">uj1vGzCGtkGielBw0Bxi4QAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="l6Lg/NJG5UWu+7ALxaVP3gAA"> +<XPD:REF name="Association">m6lnHtsBL02A4Oup+IzVEAAA</XPD:REF> +<XPD:REF name="Participant">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">hytVQ6VnmEaHnFV5o9fQ0AAA</XPD:REF> +<XPD:REF name="Views[1]">eYodfuyOKEK7WC9dBBlaigAA</XPD:REF> +<XPD:REF name="Views[2]">BEEaANsP0UCbPpRjMWyndwAA</XPD:REF> +<XPD:REF name="Views[3]">JKx2O2r/H0y9NJ3+4rup1QAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[11]" type="UMLAssociation" guid="gmKjyBaRB0SfVd2p3FDOTwAA"> +<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">l2Yo1ObIG0WVx7IS2a/B3QAA</XPD:REF> +<XPD:REF name="Views[1]">Bt1whnZV8ke93vkLSyNq6wAA</XPD:REF> +<XPD:REF name="Views[2]">fqRKs5ARzUGsdlKFgCFhWQAA</XPD:REF> +<XPD:REF name="Views[3]">5M/QRFEaxUa0SktETbkRSwAA</XPD:REF> +<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="X5VvOi2uGkGYzMMS5nWm2AAA"> +<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR> +<XPD:REF name="Association">gmKjyBaRB0SfVd2p3FDOTwAA</XPD:REF> +<XPD:REF name="Participant">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">51OtH+Gyy0+XZJVSgV/KuQAA</XPD:REF> +<XPD:REF name="Views[1]">V2pqj6nPg0SqB+TNOQI5PwAA</XPD:REF> +<XPD:REF name="Views[2]">1rWGuTeEqEm+RdcskXCo9gAA</XPD:REF> +<XPD:REF name="Views[3]">90vol1uY7U27TcNYwOdZBQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="QwwfXlN26EahMaF2XDAvLAAA"> +<XPD:REF name="Association">gmKjyBaRB0SfVd2p3FDOTwAA</XPD:REF> +<XPD:REF name="Participant">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">oOLw6a4XNk6oN6yvhlsf7QAA</XPD:REF> +<XPD:REF name="Views[1]">kMLAHkAn9EKw71vpw3PgHQAA</XPD:REF> +<XPD:REF name="Views[2]">FYDexLT3eUK3X5xdW3Qq/gAA</XPD:REF> +<XPD:REF name="Views[3]">VJLq9UMlJE2EqLEbDm23HQAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[12]" type="UMLAssociation" guid="iBQV0DXX90uUjMTGr6FFjQAA"> +<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">dSXCMAUeXkaVaOqAa4KDAQAA</XPD:REF> +<XPD:REF name="Views[1]">AXtWRmQ/j0G8KsAfZc/QeQAA</XPD:REF> +<XPD:REF name="Views[2]">pxhqUzjCEkqTLYfXynALEwAA</XPD:REF> +<XPD:REF name="Views[3]">0nagXXOSFk+hHuMBpdFBLwAA</XPD:REF> +<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="xf4XKZpxx0iF7C4H+oOABwAA"> +<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR> +<XPD:REF name="Association">iBQV0DXX90uUjMTGr6FFjQAA</XPD:REF> +<XPD:REF name="Participant">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">+0LMOuMUukS68snSkLSsTwAA</XPD:REF> +<XPD:REF name="Views[1]">ow67AFPFhk2P92GHjX8x6gAA</XPD:REF> +<XPD:REF name="Views[2]">cLLrD3Z3uUyN5TkuZIiYvQAA</XPD:REF> +<XPD:REF name="Views[3]">RpANS2KKQEiX7rWNn+sFQQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="IMPiiZPlxkaJkH8N2NGOggAA"> +<XPD:REF name="Association">iBQV0DXX90uUjMTGr6FFjQAA</XPD:REF> +<XPD:REF name="Participant">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">z3Q2FaOZNUa329RgqNTDpgAA</XPD:REF> +<XPD:REF name="Views[1]">bIZ0y/4MSEGDbNvxAP+XjAAA</XPD:REF> +<XPD:REF name="Views[2]">C8AG2Zjc9UCIEaei4/obTgAA</XPD:REF> +<XPD:REF name="Views[3]">q1TRTMmCmEuxq3mV3WwE9wAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[13]" type="UMLAssociation" guid="9P0hz9Bq2U6gDVowATxiWAAA"> +<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">ALV9IpRzikWc38x/4t62CgAA</XPD:REF> +<XPD:REF name="Views[1]">8t8bSCYvGkO28nJZE2y4nwAA</XPD:REF> +<XPD:REF name="Views[2]">3EywKQmkOE2KjbjVh2NmDgAA</XPD:REF> +<XPD:REF name="Views[3]">BbqpqccVf0Wg7tVha614JAAA</XPD:REF> +<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="yVknRLQq7U2nj3bRfizyAgAA"> +<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR> +<XPD:REF name="Association">9P0hz9Bq2U6gDVowATxiWAAA</XPD:REF> +<XPD:REF name="Participant">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">TSgUJz4gCUSqn+dKKulHoAAA</XPD:REF> +<XPD:REF name="Views[1]">bB0rInPRJES1Fi1mh9FCEAAA</XPD:REF> +<XPD:REF name="Views[2]">Te1GttqM50mrkMzGYceWLQAA</XPD:REF> +<XPD:REF name="Views[3]">XUHdjv1boEaqvLcg553dbwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="BSJLLgAd4kCusm/8BFZQMQAA"> +<XPD:REF name="Association">9P0hz9Bq2U6gDVowATxiWAAA</XPD:REF> +<XPD:REF name="Participant">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">YVFZpgGB/0O96quX2udZDwAA</XPD:REF> +<XPD:REF name="Views[1]">pIexnuTBiUiEhhq44l4rCwAA</XPD:REF> +<XPD:REF name="Views[2]">yT+paMjNpkaG1OKJL+sYCAAA</XPD:REF> +<XPD:REF name="Views[3]">znNxDO7m6E6nvS/FYUZ9OAAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[14]" type="UMLAssociation" guid="sBsUoQYdEkCsxRTpPtknYAAA"> +<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">hBsdq7HI/EWiSzAGC7VcegAA</XPD:REF> +<XPD:REF name="Views[1]">AW09hEar3Einy0/8DRC44wAA</XPD:REF> +<XPD:REF name="Views[2]">GL4o+Jwo9kafQcdPg1ZCtgAA</XPD:REF> +<XPD:REF name="Views[3]">kNZhsHL9skazmf+MM+oIKwAA</XPD:REF> +<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="6CsrL0wlVEKI657OoEev1gAA"> +<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR> +<XPD:REF name="Association">sBsUoQYdEkCsxRTpPtknYAAA</XPD:REF> +<XPD:REF name="Participant">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">VipQilP5w0axs39cx9OCsgAA</XPD:REF> +<XPD:REF name="Views[1]">m6SZNVehm06iGtccsj43wAAA</XPD:REF> +<XPD:REF name="Views[2]">x2e4QwAQ50Sn6Io3k6B2tAAA</XPD:REF> +<XPD:REF name="Views[3]">4MO5fs8bNkahA1cEAQY9zAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="bObyymjPEkeQZSoHCKpP2QAA"> +<XPD:REF name="Association">sBsUoQYdEkCsxRTpPtknYAAA</XPD:REF> +<XPD:REF name="Participant">iUy0YZgyREC+o54lTQptaAAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">5T2cPS5X+UykejaXNX6mSAAA</XPD:REF> +<XPD:REF name="Views[1]">P16FQXg1DEOld8DfGFfSxQAA</XPD:REF> +<XPD:REF name="Views[2]">FcWiwQTsx02Ku0N5G3bjSgAA</XPD:REF> +<XPD:REF name="Views[3]">d3kqRYSWSUSKKTZ+56sZkwAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[15]" type="UMLAssociation" guid="5JmzC90ylki6klhVRRibGAAA"> +<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">Gfgt2UdXqE2QrN+Jzf+QvQAA</XPD:REF> +<XPD:REF name="Views[1]">/p9rmIUUo0mUctVF/yhY5AAA</XPD:REF> +<XPD:REF name="Views[2]">P5QKAYFqikOaJu107L2QDwAA</XPD:REF> +<XPD:REF name="Views[3]">y/WNtKBGo0q8OYbjC0evjgAA</XPD:REF> +<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="be+eScBkV0Cn4n2XjSojvgAA"> +<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR> +<XPD:REF name="Association">5JmzC90ylki6klhVRRibGAAA</XPD:REF> +<XPD:REF name="Participant">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">lELIUkkOg0a4b0G8373BcAAA</XPD:REF> +<XPD:REF name="Views[1]">R1FSACG6EkWd7DK8ihYAQAAA</XPD:REF> +<XPD:REF name="Views[2]">WXg43X5+gEiu4atePea88gAA</XPD:REF> +<XPD:REF name="Views[3]">z+QrSf59lkSSqK+c5yKgcwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="zCPl48BYx0CFRkp8Jj5mogAA"> +<XPD:REF name="Association">5JmzC90ylki6klhVRRibGAAA</XPD:REF> +<XPD:REF name="Participant">/LI4+1GTjEagI/wLEFpVSQAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">cGwksZvEz0aSTFoED5zuJQAA</XPD:REF> +<XPD:REF name="Views[1]">pF9hWJbSZkCUq/C5qcS+7gAA</XPD:REF> +<XPD:REF name="Views[2]">/NvtextfvUyZKtMbQ1urHAAA</XPD:REF> +<XPD:REF name="Views[3]">4pUvTStSU0yU0BtcF8HyfQAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[16]" type="UMLPackage" guid="7dRihysn8kefkb+6mJlwzgAA"> +<XPD:ATTR name="Name" type="string">tvjava</XPD:ATTR> +<XPD:ATTR name="Visibility" type="UMLVisibilityKind">vkPackage</XPD:ATTR> +<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">1</XPD:ATTR> +<XPD:REF name="Views[0]">H1zFqxbUzEqKqOJUsjP9UgAA</XPD:REF> +<XPD:ATTR name="#Associations" type="integer">3</XPD:ATTR> +<XPD:REF name="Associations[0]">jLzV7XdHP0Ogmb7/6IPCtgAA</XPD:REF> +<XPD:REF name="Associations[1]">DGWju3i/80ObxLedRPIIEwAA</XPD:REF> +<XPD:REF name="Associations[2]">frvBY5I3t0yZgEqYHUhfEQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[17]" type="UMLPackage" guid="CN6L5smMd0u/4SQDgGuxlAAA"> +<XPD:ATTR name="Name" type="string">am_mw</XPD:ATTR> +<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">1</XPD:ATTR> +<XPD:REF name="Views[0]">HUFrn02Id0u4EHrKc4mxVgAA</XPD:REF> +<XPD:ATTR name="#Associations" type="integer">3</XPD:ATTR> +<XPD:REF name="Associations[0]">MOhicSFw0kKsC3+R+Reo0AAA</XPD:REF> +<XPD:REF name="Associations[1]">elujImCAXkaoOjRAKkuxUAAA</XPD:REF> +<XPD:REF name="Associations[2]">0RZNIMepB0W9fkd6pMCEZwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[18]" type="UMLPackage" guid="y05IqzZQzU2XtiSPAXk7QgAA"> +<XPD:ATTR name="Name" type="string">am_adp</XPD:ATTR> +<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">1</XPD:ATTR> +<XPD:REF name="Views[0]">I+6GQQgDxUay2yh9EH63ugAA</XPD:REF> +<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR> +<XPD:REF name="Associations[0]">n4pg4fd/GUuaJaSzXBirOAAA</XPD:REF> +<XPD:REF name="Associations[1]">SVDzdW2e/kG2il66SgxQ1wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[19]" type="UMLAssociation" guid="Yy1zZGFqjUCrfxwigF/GpgAA"> +<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">jyEOqiMx5kuOhl2RypG5igAA</XPD:REF> +<XPD:REF name="Views[1]">CPHJazCBZ06NtAVR2VK7OQAA</XPD:REF> +<XPD:REF name="Views[2]">APOmD3psFUyWhRAnwzCajwAA</XPD:REF> +<XPD:REF name="Views[3]">QMsE3esBJk6sDRS6x5DJkQAA</XPD:REF> +<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="KeKc5deyJkKjIbzodSAF8QAA"> +<XPD:REF name="Association">Yy1zZGFqjUCrfxwigF/GpgAA</XPD:REF> +<XPD:REF name="Participant">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">Pet1Wl/5g0+pU9Kd2fc7SwAA</XPD:REF> +<XPD:REF name="Views[1]">Dx+9oTBsHEO70cjv4b2azAAA</XPD:REF> +<XPD:REF name="Views[2]">GAWp04mbX0+qBItsdvgjYwAA</XPD:REF> +<XPD:REF name="Views[3]">EDyc+T9/p0uT65Az3US0YgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="MOhicSFw0kKsC3+R+Reo0AAA"> +<XPD:REF name="Association">Yy1zZGFqjUCrfxwigF/GpgAA</XPD:REF> +<XPD:REF name="Participant">CN6L5smMd0u/4SQDgGuxlAAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">5/4cIerJAUmV49IBGwpo+AAA</XPD:REF> +<XPD:REF name="Views[1]">xdfe8bjolEChoIUMuakZ8gAA</XPD:REF> +<XPD:REF name="Views[2]">BoU11LZqBk2U9D1Ai1YY2AAA</XPD:REF> +<XPD:REF name="Views[3]">fBqd46+r3kqJEpg8jQ4//wAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[20]" type="UMLAssociation" guid="+rFPRw7qR0aoTGBGytrjDAAA"> +<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">YWFKeOxwm0mHujDlyTbolQAA</XPD:REF> +<XPD:REF name="Views[1]">zrsbj2XE/EayNVwoOloIDAAA</XPD:REF> +<XPD:REF name="Views[2]">pIYrJ7JAAUSz3n/qiGAv0gAA</XPD:REF> +<XPD:REF name="Views[3]">qoKs5KXOckiwAYzN24SMoQAA</XPD:REF> +<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="osliKvkWrU6Jd0FLz/mZngAA"> +<XPD:REF name="Association">+rFPRw7qR0aoTGBGytrjDAAA</XPD:REF> +<XPD:REF name="Participant">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">88cAHmNV00eS5otEvuUQZAAA</XPD:REF> +<XPD:REF name="Views[1]">+YTxAPro+k+Ev3Qa9Td+KAAA</XPD:REF> +<XPD:REF name="Views[2]">BuekzgD4P0aqdOzNBAVkYAAA</XPD:REF> +<XPD:REF name="Views[3]">zTwLHGMcZUaH/kCRcMqJlQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="n4pg4fd/GUuaJaSzXBirOAAA"> +<XPD:REF name="Association">+rFPRw7qR0aoTGBGytrjDAAA</XPD:REF> +<XPD:REF name="Participant">y05IqzZQzU2XtiSPAXk7QgAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">5Y/PPNFnoUOKREH8OSaNBwAA</XPD:REF> +<XPD:REF name="Views[1]">OURlWAjS10SUcdK4oeUXcwAA</XPD:REF> +<XPD:REF name="Views[2]">NJe8vUJOvEixN2Md5vRGkgAA</XPD:REF> +<XPD:REF name="Views[3]">5Y0Wg3PhS06h+5PmVU/QJAAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[21]" type="UMLAssociation" guid="eNd3z1weKEWCnlfqPTDLIgAA"> +<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">G47JdG1ivEWpCS5+NGRUWQAA</XPD:REF> +<XPD:REF name="Views[1]">u6LdVCjKbEaIGLn56/w1QQAA</XPD:REF> +<XPD:REF name="Views[2]">ona2Ko0szEK+2FIv3L6R1wAA</XPD:REF> +<XPD:REF name="Views[3]">fST4kYS4rkicfRLiq6BrYQAA</XPD:REF> +<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="elujImCAXkaoOjRAKkuxUAAA"> +<XPD:REF name="Association">eNd3z1weKEWCnlfqPTDLIgAA</XPD:REF> +<XPD:REF name="Participant">CN6L5smMd0u/4SQDgGuxlAAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">GtS+L0c22kmmx+S6raeEAAAA</XPD:REF> +<XPD:REF name="Views[1]">r48AH3NG+kGYdG2dItOtqwAA</XPD:REF> +<XPD:REF name="Views[2]">C6OdcHaGUEG0WccqDQbNoQAA</XPD:REF> +<XPD:REF name="Views[3]">aRw7UJOi9kaUwJX2uJ1tDwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="SVDzdW2e/kG2il66SgxQ1wAA"> +<XPD:REF name="Association">eNd3z1weKEWCnlfqPTDLIgAA</XPD:REF> +<XPD:REF name="Participant">y05IqzZQzU2XtiSPAXk7QgAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">AnTjwQSX4UO3xjKGm9U1PAAA</XPD:REF> +<XPD:REF name="Views[1]">Rx+SX1Ukc0WijFhZRJ2tbgAA</XPD:REF> +<XPD:REF name="Views[2]">OMlcQeewVkyEmkWpq768pgAA</XPD:REF> +<XPD:REF name="Views[3]">61/4k03iIkWp5ZY6aFMm4AAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[22]" type="UMLPackage" guid="bnJ8ggSchket3/t1l7Kx4wAA"> +<XPD:ATTR name="Name" type="string">tv</XPD:ATTR> +<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF> +<XPD:ATTR name="#OwnedElements" type="integer">2</XPD:ATTR> +<XPD:OBJ name="OwnedElements[0]" type="UMLPackage" guid="T1P4Xv7L+UuEzFqU+iyS5wAA"> +<XPD:ATTR name="Name" type="string">dtv</XPD:ATTR> +<XPD:REF name="Namespace">bnJ8ggSchket3/t1l7Kx4wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">1</XPD:ATTR> +<XPD:REF name="Views[0]">fCE1/LJF8k+yzWx4bHj2WgAA</XPD:REF> +<XPD:ATTR name="#OwnedElements" type="integer">14</XPD:ATTR> +<XPD:OBJ name="OwnedElements[0]" type="UMLClass" guid="xAj1pchzIEeSaRcR2+aFTwAA"> +<XPD:ATTR name="Name" type="string">CDtv</XPD:ATTR> +<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">9Ld1pTeBF0CZmoVdEfEBMQAA</XPD:REF> +<XPD:REF name="Views[1]">mxcpZDUEI0aTfXvfNUP8/QAA</XPD:REF> +<XPD:REF name="Views[2]">0p/pTktl+kimPcmFJ4/wywAA</XPD:REF> +<XPD:REF name="Views[3]">kWtX8dZWikSHi3kCydMHCAAA</XPD:REF> +<XPD:ATTR name="#Operations" type="integer">32</XPD:ATTR> +<XPD:OBJ name="Operations[0]" type="UMLOperation" guid="dmYYHpECE0G9dWsxqVRqVgAA"> +<XPD:ATTR name="Name" type="string">startScan</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">开始频道搜索</XPD:ATTR> +<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[1]" type="UMLOperation" guid="XpPbBfTfWU2kqA1mr/vbJgAA"> +<XPD:ATTR name="Name" type="string">stopScan</XPD:ATTR> +<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[2]" type="UMLOperation" guid="UkrKc9f59kSDyV/AaLMH+gAA"> +<XPD:ATTR name="Name" type="string">startBooking</XPD:ATTR> +<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[3]" type="UMLOperation" guid="JcvijNcflkmNK8+KOhdCggAA"> +<XPD:ATTR name="Name" type="string">pause</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">暂停播放(回放和时移播放时有效)</XPD:ATTR> +<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[4]" type="UMLOperation" guid="i8IvkFjbqUCCSXorAzUdRAAA"> +<XPD:ATTR name="Name" type="string">resume</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">恢复播放(回放和时移播放时有效)</XPD:ATTR> +<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[5]" type="UMLOperation" guid="dQd++JYYo0amx+JlLdJFWQAA"> +<XPD:ATTR name="Name" type="string">playProgram</XPD:ATTR> +<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR> +<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="zO9p84LeHUGvoLEQTCAS3QAA"> +<XPD:ATTR name="Name" type="string">num</XPD:ATTR> +<XPD:REF name="BehavioralFeature">dQd++JYYo0amx+JlLdJFWQAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="Operations[6]" type="UMLOperation" guid="eEq01zCgM0aZvokMO+SqkQAA"> +<XPD:ATTR name="Name" type="string">fastForward</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">快进播放(回放和时移播放时有效)</XPD:ATTR> +<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[7]" type="UMLOperation" guid="MU6Fk6s7TUi43t3TzPmDYAAA"> +<XPD:ATTR name="Name" type="string">fastBackward</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">快退播放(回放和时移播放时有效)</XPD:ATTR> +<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[8]" type="UMLOperation" guid="+JpQ6Kv+wUetg2ukud8xAAAA"> +<XPD:ATTR name="Name" type="string">setVideoWindow</XPD:ATTR> +<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[9]" type="UMLOperation" guid="Urh1T97yF0qVB2qrq91V/AAA"> +<XPD:ATTR name="Name" type="string">getTime</XPD:ATTR> +<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[10]" type="UMLOperation" guid="+OoQqX2+hEy7+IGpcoRO6wAA"> +<XPD:ATTR name="Name" type="string">stopPlaying</XPD:ATTR> +<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[11]" type="UMLOperation" guid="5AWp11enzE2zKYbJKwZ4SgAA"> +<XPD:ATTR name="Name" type="string">startTimeshifting</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">开始时移播放</XPD:ATTR> +<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[12]" type="UMLOperation" guid="Tt9RCFNm7USWaJVzeiQO4wAA"> +<XPD:ATTR name="Name" type="string">stopTimeshifting</XPD:ATTR> +<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[13]" type="UMLOperation" guid="9gabibFFh0+pG1jLLre65AAA"> +<XPD:ATTR name="Name" type="string">startRecording</XPD:ATTR> +<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[14]" type="UMLOperation" guid="3d/CswBBrEy2IUoFJUC4zAAA"> +<XPD:ATTR name="Name" type="string">switchAudioTrack</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">切换声道</XPD:ATTR> +<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[15]" type="UMLOperation" guid="IGijEoer5kSmMkA+Fo3ArwAA"> +<XPD:ATTR name="Name" type="string">stopRecording</XPD:ATTR> +<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[16]" type="UMLOperation" guid="Zb4VlxMHWkS/g4Mf01SYQAAA"> +<XPD:ATTR name="Name" type="string">startPlayback</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">开始录制节目回放</XPD:ATTR> +<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[17]" type="UMLOperation" guid="YMsIpjPwskyU47Z7OFZGswAA"> +<XPD:ATTR name="Name" type="string">stopPlayback</XPD:ATTR> +<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[18]" type="UMLOperation" guid="KYZZjRnW+E6fVbHlCQJHLgAA"> +<XPD:ATTR name="Name" type="string">startBooking</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">开始一个预约处理</XPD:ATTR> +<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[19]" type="UMLOperation" guid="+mKhDWf/OkWW6S8s1fQrdAAA"> +<XPD:ATTR name="Name" type="string">getFrontendStatus</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">取得前端锁定状态</XPD:ATTR> +<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[20]" type="UMLOperation" guid="4LuPht07CEyB+RsryYpq8wAA"> +<XPD:ATTR name="Name" type="string">getFrontendSignalStrength</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">取得前端信号强度</XPD:ATTR> +<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[21]" type="UMLOperation" guid="auftPPtm9ESAf8dNdwpO8wAA"> +<XPD:ATTR name="Name" type="string">getFrontendSNR</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">取得前端SNR值</XPD:ATTR> +<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[22]" type="UMLOperation" guid="SkFMqj2tAkCHB6YzXb25VAAA"> +<XPD:ATTR name="Name" type="string">getFrontendBER</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">取得前端BER值</XPD:ATTR> +<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[23]" type="UMLOperation" guid="1Kkg1e8Eq0yMsbrLqj30vAAA"> +<XPD:ATTR name="Name" type="string">restoreFactorySetting</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">恢复出厂设置</XPD:ATTR> +<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[24]" type="UMLOperation" guid="0F6QZhvGnEi9TAKhwr5gqAAA"> +<XPD:ATTR name="Name" type="string">setCvbsAmpOut</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">模拟CVBS AMP OUT</XPD:ATTR> +<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[25]" type="UMLOperation" guid="H0pDJxWBtUeDplA7FSzwhQAA"> +<XPD:ATTR name="Name" type="string">unblock</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">解锁并播放当前已加锁的频道,例如密码验证通过后,调用该方法进行解锁播放</XPD:ATTR> +<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[26]" type="UMLOperation" guid="UdoijIW/80yYKWWst/w35AAA"> +<XPD:ATTR name="Name" type="string">lock</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">锁频,用于信号测试等</XPD:ATTR> +<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[27]" type="UMLOperation" guid="7rGFPyAzzUe2jTVqsr5TPwAA"> +<XPD:ATTR name="Name" type="string">getChannelInfo</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">一些相关信息,一个节目的相关信息</XPD:ATTR> +<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[28]" type="UMLOperation" guid="Pa5rqUzWwEaNHn5Ws2ScXQAA"> +<XPD:ATTR name="Name" type="string">getChannelList</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">得到所有或者某一类的所以节目信息表,...include EPG?</XPD:ATTR> +<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[29]" type="UMLOperation" guid="UYN2BdmAh0OwWr6FMv/4+gAA"> +<XPD:ATTR name="Name" type="string">editChannelList</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">编辑节目信息</XPD:ATTR> +<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[30]" type="UMLOperation" guid="W+xUDLU830SOa/MaA8+q9gAA"> +<XPD:ATTR name="Name" type="string">getEvent</XPD:ATTR> +<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[31]" type="UMLOperation" guid="wX/iXD/If0yyRjn7rC8n9wAA"> +<XPD:ATTR name="Name" type="string">EpgScanner</XPD:ATTR> +<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +</XPD:OBJ> +<XPD:ATTR name="#Associations" type="integer">7</XPD:ATTR> +<XPD:REF name="Associations[0]">kdbNMfgoG02cJO0UFJeeLwAA</XPD:REF> +<XPD:REF name="Associations[1]">X5VvOi2uGkGYzMMS5nWm2AAA</XPD:REF> +<XPD:REF name="Associations[2]">xf4XKZpxx0iF7C4H+oOABwAA</XPD:REF> +<XPD:REF name="Associations[3]">yVknRLQq7U2nj3bRfizyAgAA</XPD:REF> +<XPD:REF name="Associations[4]">6CsrL0wlVEKI657OoEev1gAA</XPD:REF> +<XPD:REF name="Associations[5]">be+eScBkV0Cn4n2XjSojvgAA</XPD:REF> +<XPD:REF name="Associations[6]">PP9nsgv4Vkmbk1zEfct4VAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[1]" type="UMLClass" guid="SX+aNGg0j0WtdR26+LZ7OgAA"> +<XPD:ATTR name="Name" type="string">CTvDatabase</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">使用AM_DB +操作: +SELECT -- +INSERT -- +DELETE -- +UPDATE --</XPD:ATTR> +<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">a8FG7H9SzUelkRx52q1d5AAA</XPD:REF> +<XPD:REF name="Views[1]">k1LHywt4TEe6bHJwUzft/QAA</XPD:REF> +<XPD:REF name="Views[2]">hc7Nc/x4iE+k/Ee76MBxMgAA</XPD:REF> +<XPD:REF name="Views[3]">Pwafosd7ik6mD1kxdwntngAA</XPD:REF> +<XPD:ATTR name="#Operations" type="integer">5</XPD:ATTR> +<XPD:OBJ name="Operations[0]" type="UMLOperation" guid="eujhNjd7X0OXZG7TspyZqAAA"> +<XPD:ATTR name="Name" type="string">select</XPD:ATTR> +<XPD:REF name="Owner">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[1]" type="UMLOperation" guid="NHwUxL9yUkyP+nuyACBPRAAA"> +<XPD:ATTR name="Name" type="string">insert</XPD:ATTR> +<XPD:REF name="Owner">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[2]" type="UMLOperation" guid="cmY3ij4BnES+HvUtnuKW0wAA"> +<XPD:ATTR name="Name" type="string">del</XPD:ATTR> +<XPD:REF name="Owner">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[3]" type="UMLOperation" guid="UNsa63AKqU6E5RGSTo+clgAA"> +<XPD:ATTR name="Name" type="string">update</XPD:ATTR> +<XPD:REF name="Owner">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[4]" type="UMLOperation" guid="YwBo0pVRWEevayMrI8sH+AAA"> +<XPD:ATTR name="Name" type="string">xxtable</XPD:ATTR> +<XPD:REF name="Owner">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF> +</XPD:OBJ> +<XPD:ATTR name="#TypedParameters" type="integer">4</XPD:ATTR> +<XPD:REF name="TypedParameters[0]">J5mDMInaY0G18Fx0eB6MsAAA</XPD:REF> +<XPD:REF name="TypedParameters[1]">lSipwxb9AEu7dKbkvn8bCwAA</XPD:REF> +<XPD:REF name="TypedParameters[2]">eQIZ7HOvJESQdc0nGhqnrwAA</XPD:REF> +<XPD:REF name="TypedParameters[3]">lc6uST5/Mk6WfIuIfATlsgAA</XPD:REF> +<XPD:ATTR name="#Associations" type="integer">10</XPD:ATTR> +<XPD:REF name="Associations[0]">PFZlUbzZu02nTTLsYZBoDgAA</XPD:REF> +<XPD:REF name="Associations[1]">q5Ko0bXKcE6uj05NJPSddwAA</XPD:REF> +<XPD:REF name="Associations[2]">Yo1IoB0X3ka1C+a/6xk1/gAA</XPD:REF> +<XPD:REF name="Associations[3]">RoKhf4Bw3kmRk2O2D4GlxQAA</XPD:REF> +<XPD:REF name="Associations[4]">vyoQZGl3UECBMhf7+IDQUwAA</XPD:REF> +<XPD:REF name="Associations[5]">iy8GVdK11EmKnmJ6LivVVQAA</XPD:REF> +<XPD:REF name="Associations[6]">DkcX/fIec029p5Da5gYToAAA</XPD:REF> +<XPD:REF name="Associations[7]">gc0GlJ6ewUOpiyya+XPqjQAA</XPD:REF> +<XPD:REF name="Associations[8]">Fd/cvRV12USE+Vu6oJsMOgAA</XPD:REF> +<XPD:REF name="Associations[9]">AM/xtV731kSTTZbv0mmefgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[2]" type="UMLClass" guid="5BXVsgqK1kanN/l0hNx/IQAA"> +<XPD:ATTR name="Name" type="string">CTvSubtitle</XPD:ATTR> +<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">Y9zMsiXlQEuyiSGOmpswRwAA</XPD:REF> +<XPD:REF name="Views[1]">3kCRXwUbYEOaB2YVqs3CMQAA</XPD:REF> +<XPD:REF name="Views[2]">2pFBVEb3NUu3IhdJeNfBWAAA</XPD:REF> +<XPD:REF name="Views[3]">xx5BbdZ+6Eehp04cM6fnfwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[3]" type="UMLClass" guid="9naBHAA+hkmkNtZzyXP1/wAA"> +<XPD:ATTR name="Name" type="string">CTvProgram</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">Program对应ATV中的一个频道,DTV中的一个service</XPD:ATTR> +<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">BVNqLhbhP06y98++NgmxAwAA</XPD:REF> +<XPD:REF name="Views[1]">muUyRePjd0qlQqM/tvfrmQAA</XPD:REF> +<XPD:REF name="Views[2]">3aWGjpGXTkqRn+NbEzYu5QAA</XPD:REF> +<XPD:REF name="Views[3]">ylciM87U9keZe9hSnVequAAA</XPD:REF> +<XPD:ATTR name="#Operations" type="integer">29</XPD:ATTR> +<XPD:OBJ name="Operations[0]" type="UMLOperation" guid="YYAlKwYwAkum0/0/V8VSfAAA"> +<XPD:ATTR name="Name" type="string">TVProgram</XPD:ATTR> +<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR> +<XPD:ATTR name="StereotypeName" type="string">create</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR> +<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="J5mDMInaY0G18Fx0eB6MsAAA"> +<XPD:ATTR name="Name" type="string">db</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">CTvDatabase</XPD:ATTR> +<XPD:REF name="BehavioralFeature">YYAlKwYwAkum0/0/V8VSfAAA</XPD:REF> +<XPD:REF name="Type_">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="Operations[1]" type="UMLOperation" guid="MO9Z8u42Ck+RSnezotFx6gAA"> +<XPD:ATTR name="Name" type="string">TVProgram</XPD:ATTR> +<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR> +<XPD:ATTR name="StereotypeName" type="string">destroy</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[2]" type="UMLOperation" guid="I7Tahi7CMEWsF5E1eyHYIwAA"> +<XPD:ATTR name="Name" type="string">TVProgram</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">创建并向数据库添加一个Program</XPD:ATTR> +<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR> +<XPD:ATTR name="StereotypeName" type="string">create</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +<XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="uoElE3D4I0KE+CLUBhlBmAAA"> +<XPD:ATTR name="Name" type="string">channelID</XPD:ATTR> +<XPD:REF name="BehavioralFeature">I7Tahi7CMEWsF5E1eyHYIwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="R7F9l39IqkWdzSgaYK9tQAAA"> +<XPD:ATTR name="Name" type="string">type</XPD:ATTR> +<XPD:REF name="BehavioralFeature">I7Tahi7CMEWsF5E1eyHYIwAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="Operations[3]" type="UMLOperation" guid="c5Mq32YFGk6fa8RKqgPtRgAA"> +<XPD:ATTR name="Name" type="string">TVProgram</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">adding a Playback program</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[4]" type="UMLOperation" guid="JNEvi/3wp0OBIRiyz8YftgAA"> +<XPD:ATTR name="Name" type="string">selectByID</XPD:ATTR> +<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +<XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="AkhDSecO8E2/EoFulZe5iAAA"> +<XPD:ATTR name="Name" type="string">id</XPD:ATTR> +<XPD:REF name="BehavioralFeature">JNEvi/3wp0OBIRiyz8YftgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="lmgbU9AACUCXuVDuiBNNpwAA"> +<XPD:ATTR name="Name" type="string">ret</XPD:ATTR> +<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">CTvProgram</XPD:ATTR> +<XPD:REF name="BehavioralFeature">JNEvi/3wp0OBIRiyz8YftgAA</XPD:REF> +<XPD:REF name="Type_">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="Operations[5]" type="UMLOperation" guid="c4hDH4Wl4EC1nupSKD7ECQAA"> +<XPD:ATTR name="Name" type="string">selectByNumber</XPD:ATTR> +<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +<XPD:ATTR name="#Parameters" type="integer">3</XPD:ATTR> +<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="+naqez7eJ0Gt7lrOPAtRhwAA"> +<XPD:ATTR name="Name" type="string">num</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">代指一个节目号类</XPD:ATTR> +<XPD:REF name="BehavioralFeature">c4hDH4Wl4EC1nupSKD7ECQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="TGg03aSXFk6f/K55VhZZ4AAA"> +<XPD:ATTR name="Name" type="string">type</XPD:ATTR> +<XPD:REF name="BehavioralFeature">c4hDH4Wl4EC1nupSKD7ECQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Parameters[2]" type="UMLParameter" guid="JwSDsmXVS02yCU8rmbNT+gAA"> +<XPD:ATTR name="Name" type="string">ret</XPD:ATTR> +<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">CTvProgram</XPD:ATTR> +<XPD:REF name="BehavioralFeature">c4hDH4Wl4EC1nupSKD7ECQAA</XPD:REF> +<XPD:REF name="Type_">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="Operations[6]" type="UMLOperation" guid="yeJSdWpKskaFq49HK5+/4wAA"> +<XPD:ATTR name="Name" type="string">selectUp</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">根据节目号选择下一节目</XPD:ATTR> +<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +<XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="z7wJx+cu9U6OwVLUgjkczgAA"> +<XPD:ATTR name="Name" type="string">num</XPD:ATTR> +<XPD:REF name="BehavioralFeature">yeJSdWpKskaFq49HK5+/4wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="Qv4GcTZ/w0GgrJcc/XNMQAAA"> +<XPD:ATTR name="Name" type="string">ret</XPD:ATTR> +<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">CTvProgram</XPD:ATTR> +<XPD:REF name="BehavioralFeature">yeJSdWpKskaFq49HK5+/4wAA</XPD:REF> +<XPD:REF name="Type_">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="Operations[7]" type="UMLOperation" guid="LTDhnEPkWE6psd+d5WLFWwAA"> +<XPD:ATTR name="Name" type="string">selectDown</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">根据节目号选择上一节目</XPD:ATTR> +<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +<XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="JwS8/J1pU0ixPx2Gtv9PswAA"> +<XPD:ATTR name="Name" type="string">num</XPD:ATTR> +<XPD:REF name="BehavioralFeature">LTDhnEPkWE6psd+d5WLFWwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="p3gaswKAtEmlrHF0SJQaJQAA"> +<XPD:ATTR name="Name" type="string">ret</XPD:ATTR> +<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">CTvProgram</XPD:ATTR> +<XPD:REF name="BehavioralFeature">LTDhnEPkWE6psd+d5WLFWwAA</XPD:REF> +<XPD:REF name="Type_">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="Operations[8]" type="UMLOperation" guid="25tmOHxHGkmZu/nQh+mDnwAA"> +<XPD:ATTR name="Name" type="string">selectFirstValid</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">选择一个有效的节目,先查找频道号最小的电视节目,如果没有电视,再查找频道号最小的广播节目</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR> +<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="LRGUd6QwL02qGj2EBYZ86QAA"> +<XPD:ATTR name="Name" type="string">ret</XPD:ATTR> +<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">CTvProgram</XPD:ATTR> +<XPD:REF name="BehavioralFeature">25tmOHxHGkmZu/nQh+mDnwAA</XPD:REF> +<XPD:REF name="Type_">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="Operations[9]" type="UMLOperation" guid="9VZ9jSrONEOU5G5ov0HotwAA"> +<XPD:ATTR name="Name" type="string">selectAll</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">列出全部TVProgram</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR> +<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="75rhon2Jo0CUX2eeQJLflgAA"> +<XPD:ATTR name="Name" type="string">ret</XPD:ATTR> +<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">vector<CTvProgram></XPD:ATTR> +<XPD:REF name="BehavioralFeature">9VZ9jSrONEOU5G5ov0HotwAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="Operations[10]" type="UMLOperation" guid="bFQUubUtYkClhu6k44lX2wAA"> +<XPD:ATTR name="Name" type="string">selectByChannel</XPD:ATTR> +<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +<XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="ghACz+/RMk6PwXHevQHrKgAA"> +<XPD:ATTR name="Name" type="string">channelID</XPD:ATTR> +<XPD:REF name="BehavioralFeature">bFQUubUtYkClhu6k44lX2wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="3MSYvjBf4k+QHn22Q8eg7AAA"> +<XPD:ATTR name="Name" type="string">ret</XPD:ATTR> +<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">vector<CTvProgram></XPD:ATTR> +<XPD:REF name="BehavioralFeature">bFQUubUtYkClhu6k44lX2wAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="Operations[11]" type="UMLOperation" guid="+1TV2QUUtUKhshvxqFDzNAAA"> +<XPD:ATTR name="Name" type="string">selectByName</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">根据节目名称中的关键字查找指定TVProgram</XPD:ATTR> +<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +<XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="6l3x+N+XpkKTQss5baAQuwAA"> +<XPD:ATTR name="Name" type="string">name</XPD:ATTR> +<XPD:REF name="BehavioralFeature">+1TV2QUUtUKhshvxqFDzNAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="eG1miZaCQk6agFaTX6TwVAAA"> +<XPD:ATTR name="Name" type="string">ret</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">vector<CTvProgram></XPD:ATTR> +<XPD:REF name="BehavioralFeature">+1TV2QUUtUKhshvxqFDzNAAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="Operations[12]" type="UMLOperation" guid="ZYi+bCDmv0C3n5svMsg6OAAA"> +<XPD:ATTR name="Name" type="string">tvProgramDelByChannelID</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR> +<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="jqLk5a2Xh0mhzw9HIwhkTwAA"> +<XPD:ATTR name="Name" type="string">channelID</XPD:ATTR> +<XPD:REF name="BehavioralFeature">ZYi+bCDmv0C3n5svMsg6OAAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="Operations[13]" type="UMLOperation" guid="ACVxjvFDC0yCpTUl109bFwAA"> +<XPD:ATTR name="Name" type="string">getID</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[14]" type="UMLOperation" guid="HdyeyQ/bRESko2FrqkZbcgAA"> +<XPD:ATTR name="Name" type="string">getName</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR> +<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="p/P9yxCMgk+7553zQk/digAA"> +<XPD:ATTR name="Name" type="string">ret</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">String</XPD:ATTR> +<XPD:REF name="BehavioralFeature">HdyeyQ/bRESko2FrqkZbcgAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="Operations[15]" type="UMLOperation" guid="JwHR21A3wE+c3ID5+O7HqAAA"> +<XPD:ATTR name="Name" type="string">getCurrentSubtitle</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[16]" type="UMLOperation" guid="dwF0iyGWbU+EGkjX1GDTpAAA"> +<XPD:ATTR name="Name" type="string">getCurrentTeletext</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[17]" type="UMLOperation" guid="k/2NPLI6skm2+zWBikSQIgAA"> +<XPD:ATTR name="Name" type="string">getChannel</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR> +<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="A7QPUTtNz0O45ex/ZBEL3wAA"> +<XPD:ATTR name="Name" type="string">ret</XPD:ATTR> +<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">CTvChannel</XPD:ATTR> +<XPD:REF name="BehavioralFeature">k/2NPLI6skm2+zWBikSQIgAA</XPD:REF> +<XPD:REF name="Type_">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="Operations[18]" type="UMLOperation" guid="e28O5Ud6AkiFQ2Whw+g5PAAA"> +<XPD:ATTR name="Name" type="string">getPresentEvent</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">取得节目正在播放事件</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +<XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="JMu9kCbPeUOqYnb8+XprhgAA"> +<XPD:ATTR name="Name" type="string">now</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">long</XPD:ATTR> +<XPD:REF name="BehavioralFeature">e28O5Ud6AkiFQ2Whw+g5PAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="+v9VB9kIH02VZ9TgNHJJfQAA"> +<XPD:ATTR name="Name" type="string">ret</XPD:ATTR> +<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">CTvEvent</XPD:ATTR> +<XPD:REF name="BehavioralFeature">e28O5Ud6AkiFQ2Whw+g5PAAA</XPD:REF> +<XPD:REF name="Type_">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="Operations[19]" type="UMLOperation" guid="/N5EpSRqt0miI+sRfUySzQAA"> +<XPD:ATTR name="Name" type="string">getFollowingEvent</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[20]" type="UMLOperation" guid="dF2yMKnmeUmHMTQ3n59OfgAA"> +<XPD:ATTR name="Name" type="string">getScheduleEvents</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">取得节目在一个时间段内的事件</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[21]" type="UMLOperation" guid="unjofe5xCEG64AlRNpC6lAAA"> +<XPD:ATTR name="Name" type="string">selectByFavorite</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">列出喜爱节目组TVProgram</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[22]" type="UMLOperation" guid="Yf/ivoCbnU2TvnC8p98iwAAA"> +<XPD:ATTR name="Name" type="string">addProgramToGroup</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">添加节目到指定节目分组</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[23]" type="UMLOperation" guid="hrNkpY6nlU+EwIWtvCj7TwAA"> +<XPD:ATTR name="Name" type="string">deleteFromGroup</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">从指定节目分组删除当前节目</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[24]" type="UMLOperation" guid="t2BjZT6On0+sFvxzq4g8ggAA"> +<XPD:ATTR name="Name" type="string">checkIsGroup</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">检测当前节目是否属于分组</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[25]" type="UMLOperation" guid="P9TAD4y/o0KU9vLyJ9OV4AAA"> +<XPD:ATTR name="Name" type="string">modifyChanOrder</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">修改节目排序</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[26]" type="UMLOperation" guid="ajleTvMjZ0eZ0eAHzHaalwAA"> +<XPD:ATTR name="Name" type="string">setProgramName</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">修改节目名称</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[27]" type="UMLOperation" guid="elSJfx5P9Ui4sQvrJy9lsAAA"> +<XPD:ATTR name="Name" type="string">setProgramNumber</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">修改节目number</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[28]" type="UMLOperation" guid="SmcQMrAyCE+xl1JXzNgH/gAA"> +<XPD:ATTR name="Name" type="string">setProgramVolume</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +<XPD:ATTR name="#TypedFeatures" type="integer">1</XPD:ATTR> +<XPD:REF name="TypedFeatures[0]">xT0LK2eQ9EGzJfCHW9IJ9wAA</XPD:REF> +<XPD:ATTR name="#TypedParameters" type="integer">6</XPD:ATTR> +<XPD:REF name="TypedParameters[0]">lmgbU9AACUCXuVDuiBNNpwAA</XPD:REF> +<XPD:REF name="TypedParameters[1]">JwSDsmXVS02yCU8rmbNT+gAA</XPD:REF> +<XPD:REF name="TypedParameters[2]">Qv4GcTZ/w0GgrJcc/XNMQAAA</XPD:REF> +<XPD:REF name="TypedParameters[3]">p3gaswKAtEmlrHF0SJQaJQAA</XPD:REF> +<XPD:REF name="TypedParameters[4]">LRGUd6QwL02qGj2EBYZ86QAA</XPD:REF> +<XPD:REF name="TypedParameters[5]">w4A7LCg5RUitVRoJ8EF5DwAA</XPD:REF> +<XPD:ATTR name="#Associations" type="integer">5</XPD:ATTR> +<XPD:REF name="Associations[0]">IEnUwW74QkSkdRZGqdKvaAAA</XPD:REF> +<XPD:REF name="Associations[1]">2JZlFpDZPkGgaoWrrPAGXAAA</XPD:REF> +<XPD:REF name="Associations[2]">qOlPMeLYpUC4lTEl3Hsc8QAA</XPD:REF> +<XPD:REF name="Associations[3]">72fG4kbiM0eyczFPq2MtVAAA</XPD:REF> +<XPD:REF name="Associations[4]">IMPiiZPlxkaJkH8N2NGOggAA</XPD:REF> +<XPD:ATTR name="#Attributes" type="integer">15</XPD:ATTR> +<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="uXjsbosYkke28aZWg65AOwAA"> +<XPD:ATTR name="Name" type="string">id</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="+NxzFOFWPEqKmFfNqTdx8QAA"> +<XPD:ATTR name="Name" type="string">dvbServiceID</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Attributes[2]" type="UMLAttribute" guid="JIJ3w5q9AEq5pH8jxW/gOAAA"> +<XPD:ATTR name="Name" type="string">type</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Attributes[3]" type="UMLAttribute" guid="JOINtcM+u0qVqfxy1LsTdwAA"> +<XPD:ATTR name="Name" type="string">name</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">char</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Attributes[4]" type="UMLAttribute" guid="U6dOwxN6VkKvkKCowD7yxQAA"> +<XPD:ATTR name="Name" type="string">channelID</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Attributes[5]" type="UMLAttribute" guid="Zh90wWMTSUm6ew2qIiAjFAAA"> +<XPD:ATTR name="Name" type="string">channel</XPD:ATTR> +<XPD:ATTR name="Visibility" type="UMLVisibilityKind">vkPrivate</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">CTvChannel</XPD:ATTR> +<XPD:REF name="Type_">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Attributes[6]" type="UMLAttribute" guid="on0gPuAz4U686Sy93eQ2cgAA"> +<XPD:ATTR name="Name" type="string">skip</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Attributes[7]" type="UMLAttribute" guid="bIOnmWt5I0yApBHA5XFN+gAA"> +<XPD:ATTR name="Name" type="string">favorite</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Attributes[8]" type="UMLAttribute" guid="x9TcSSHftEmulDVv3sJK1wAA"> +<XPD:ATTR name="Name" type="string">volume</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Attributes[9]" type="UMLAttribute" guid="QeKA3IlVykyPEjmBPYFTpQAA"> +<XPD:ATTR name="Name" type="string">sourceID</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Attributes[10]" type="UMLAttribute" guid="kb0pZw6ZkE2OolX+iMKt8gAA"> +<XPD:ATTR name="Name" type="string">pmtPID</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Attributes[11]" type="UMLAttribute" guid="RZ6B0lWtR0m+vSVJBlDoigAA"> +<XPD:ATTR name="Name" type="string">video</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">video信息,类型不定</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Attributes[12]" type="UMLAttribute" guid="BihGmjGNQ0mzaFwgnsKAWQAA"> +<XPD:ATTR name="Name" type="string">audioes</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">audio信息,类型不定</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Attributes[13]" type="UMLAttribute" guid="/qxd9kIZyU+tZ4SClIWWmQAA"> +<XPD:ATTR name="Name" type="string">subtitles</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">subtitle信息类型不定</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Attributes[14]" type="UMLAttribute" guid="zvplUrX8lUGsjB9WCZ2PcAAA"> +<XPD:ATTR name="Name" type="string">teletexts</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">teletext信息,类型不定</XPD:ATTR> +<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[4]" type="UMLClass" guid="JCgv4vk16U6BbVcoQFmlVwAA"> +<XPD:ATTR name="Name" type="string">CTvChannel</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">对应模拟电视中的一个频点,数字电视中的一个频点调制的TS流</XPD:ATTR> +<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">iEgH+6H6kkG++neKuToTSgAA</XPD:REF> +<XPD:REF name="Views[1]">Yo0KShxzIk2FSTydUse5OQAA</XPD:REF> +<XPD:REF name="Views[2]">rmKV7ZtcVEudbDw02LTB/wAA</XPD:REF> +<XPD:REF name="Views[3]">+jiKzSIz/UuhSFnnJkuIEgAA</XPD:REF> +<XPD:ATTR name="#Operations" type="integer">23</XPD:ATTR> +<XPD:OBJ name="Operations[0]" type="UMLOperation" guid="+k2keRjKq0Kcp2LH8FqiVwAA"> +<XPD:ATTR name="Name" type="string">TvChannel</XPD:ATTR> +<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR> +<XPD:ATTR name="StereotypeName" type="string">create</XPD:ATTR> +<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[1]" type="UMLOperation" guid="bLasrnFvT0mJOlVtuIWeVwAA"> +<XPD:ATTR name="Name" type="string">TvChannel</XPD:ATTR> +<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR> +<XPD:ATTR name="StereotypeName" type="string">destroy</XPD:ATTR> +<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[2]" type="UMLOperation" guid="Uo205gWA4UyYN/g3FxOFmQAA"> +<XPD:ATTR name="Name" type="string">TvChannel</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">根据TVChannelParams,向数据库添加一个Channel</XPD:ATTR> +<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR> +<XPD:ATTR name="StereotypeName" type="string">create</XPD:ATTR> +<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF> +<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR> +<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="So08mUV3uUGzB96ampUmnQAA"> +<XPD:ATTR name="Name" type="string">Params</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">TvChannelParams</XPD:ATTR> +<XPD:REF name="BehavioralFeature">Uo205gWA4UyYN/g3FxOFmQAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="Operations[3]" type="UMLOperation" guid="RN5b/cypXUivfIl6CeiRrgAA"> +<XPD:ATTR name="Name" type="string">tvChannelList</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">*创建当前卫星所有通道 +*@param sat_id 卫星id +*@return 返回创建的通道</XPD:ATTR> +<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR> +<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF> +<XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="ATajQMblVE2J+9tPqnDGIQAA"> +<XPD:ATTR name="Name" type="string">sat_id</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">int</XPD:ATTR> +<XPD:REF name="BehavioralFeature">RN5b/cypXUivfIl6CeiRrgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="x7A2ohl0v0WHXUc8UDHW6AAA"> +<XPD:ATTR name="Name" type="string">ret</XPD:ATTR> +<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">vector<TvChannel></XPD:ATTR> +<XPD:REF name="BehavioralFeature">RN5b/cypXUivfIl6CeiRrgAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="Operations[4]" type="UMLOperation" guid="THncZsTd2EaQgMWP8ukavAAA"> +<XPD:ATTR name="Name" type="string">selectByID</XPD:ATTR> +<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR> +<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF> +<XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="7U3T/Mh9gEGdFQ58AaydXQAA"> +<XPD:ATTR name="Name" type="string">id</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">int</XPD:ATTR> +<XPD:REF name="BehavioralFeature">THncZsTd2EaQgMWP8ukavAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="ZpRrlyhz802QY2ObgoUqmwAA"> +<XPD:ATTR name="Name" type="string">ret</XPD:ATTR> +<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">TvChannel</XPD:ATTR> +<XPD:REF name="BehavioralFeature">THncZsTd2EaQgMWP8ukavAAA</XPD:REF> +<XPD:REF name="Type_">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="Operations[5]" type="UMLOperation" guid="FkLzL9wZQUqTW/xy345ifgAA"> +<XPD:ATTR name="Name" type="string">selectByParams</XPD:ATTR> +<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR> +<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF> +<XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="/9TUXJr3nkaE3sNOYEA7AwAA"> +<XPD:ATTR name="Name" type="string">param</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">TvChannelParams</XPD:ATTR> +<XPD:REF name="BehavioralFeature">FkLzL9wZQUqTW/xy345ifgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="NFnoGSrnCk6OIIsCI5hKAAAA"> +<XPD:ATTR name="Name" type="string">ret</XPD:ATTR> +<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">TvChannel</XPD:ATTR> +<XPD:REF name="BehavioralFeature">FkLzL9wZQUqTW/xy345ifgAA</XPD:REF> +<XPD:REF name="Type_">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="Operations[6]" type="UMLOperation" guid="2BWR7hLxq0qnCE/w/RGNJQAA"> +<XPD:ATTR name="Name" type="string">tvChannelDel</XPD:ATTR> +<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[7]" type="UMLOperation" guid="hLAGGAR0S02yy3pwOmM1YgAA"> +<XPD:ATTR name="Name" type="string">tvChannelDelBySatID</XPD:ATTR> +<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR> +<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF> +<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR> +<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="Se/I3L6vA0mlcLXlxgCKvAAA"> +<XPD:ATTR name="Name" type="string">id</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">int</XPD:ATTR> +<XPD:REF name="BehavioralFeature">hLAGGAR0S02yy3pwOmM1YgAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="Operations[8]" type="UMLOperation" guid="ZuqLn6kcZkCuwI1pleD9aAAA"> +<XPD:ATTR name="Name" type="string">getID</XPD:ATTR> +<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[9]" type="UMLOperation" guid="jTykhLmNTkeBOYQWw2ruYgAA"> +<XPD:ATTR name="Name" type="string">getDVBTSID</XPD:ATTR> +<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[10]" type="UMLOperation" guid="MatpiHkzdk2wjbBq+aAUWgAA"> +<XPD:ATTR name="Name" type="string">getDVBOrigNetID</XPD:ATTR> +<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[11]" type="UMLOperation" guid="FI7G+6zrRESU1oT9AJMPeQAA"> +<XPD:ATTR name="Name" type="string">getFrontendID</XPD:ATTR> +<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[12]" type="UMLOperation" guid="jjFnFzfEc02zGI29lwfBowAA"> +<XPD:ATTR name="Name" type="string">getTSSourceID</XPD:ATTR> +<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[13]" type="UMLOperation" guid="ZV2LPyYw8E6IN0sEDpXjmAAA"> +<XPD:ATTR name="Name" type="string">getParams</XPD:ATTR> +<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF> +<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR> +<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="79kvlpEjWUOei2KGS0rnzAAA"> +<XPD:ATTR name="Name" type="string">ret</XPD:ATTR> +<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">TvChannelParams</XPD:ATTR> +<XPD:REF name="BehavioralFeature">ZV2LPyYw8E6IN0sEDpXjmAAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="Operations[14]" type="UMLOperation" guid="J2ss0Osk0UKtERrsNkIiBAAA"> +<XPD:ATTR name="Name" type="string">isDVBCMode</XPD:ATTR> +<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[15]" type="UMLOperation" guid="1+Z8ijSmXUCS12XqcbMI8gAA"> +<XPD:ATTR name="Name" type="string">setFrequency</XPD:ATTR> +<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[16]" type="UMLOperation" guid="wvTcWulSY0Cufl7PzpJmGAAA"> +<XPD:ATTR name="Name" type="string">setSymbolRate</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">设置符号率(QPSK/QAM模式) +@param symbolRate 符号率</XPD:ATTR> +<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[17]" type="UMLOperation" guid="l/0TFp9Q8UKX15QErAbvMgAA"> +<XPD:ATTR name="Name" type="string">setPolarisation</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">设置极性(QPSK模式)</XPD:ATTR> +<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[18]" type="UMLOperation" guid="b9Wu1ldLi0S2Z8NKmKvesgAA"> +<XPD:ATTR name="Name" type="string">setATVAudio</XPD:ATTR> +<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[19]" type="UMLOperation" guid="GdCCR2raz0+G3e4/bN7OZQAA"> +<XPD:ATTR name="Name" type="string">setATVVideoFormat</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">修改模拟视频制式</XPD:ATTR> +<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[20]" type="UMLOperation" guid="dSQ9xkQnBECjeLi09iGfaQAA"> +<XPD:ATTR name="Name" type="string">setATVAudioFormat</XPD:ATTR> +<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[21]" type="UMLOperation" guid="9soE8Pso6EmGPUSAU1p4fgAA"> +<XPD:ATTR name="Name" type="string">setATVFreq</XPD:ATTR> +<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[22]" type="UMLOperation" guid="mlHUjain7UyPF/GHGuUEQgAA"> +<XPD:ATTR name="Name" type="string">setATVAfcData</XPD:ATTR> +<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF> +</XPD:OBJ> +<XPD:ATTR name="#TypedFeatures" type="integer">1</XPD:ATTR> +<XPD:REF name="TypedFeatures[0]">Zh90wWMTSUm6ew2qIiAjFAAA</XPD:REF> +<XPD:ATTR name="#TypedParameters" type="integer">3</XPD:ATTR> +<XPD:REF name="TypedParameters[0]">ZpRrlyhz802QY2ObgoUqmwAA</XPD:REF> +<XPD:REF name="TypedParameters[1]">NFnoGSrnCk6OIIsCI5hKAAAA</XPD:REF> +<XPD:REF name="TypedParameters[2]">A7QPUTtNz0O45ex/ZBEL3wAA</XPD:REF> +<XPD:ATTR name="#Associations" type="integer">5</XPD:ATTR> +<XPD:REF name="Associations[0]">GZcPUasbnkG3pyGKV6NFnAAA</XPD:REF> +<XPD:REF name="Associations[1]">XvxorIQvl0aKnzyznjd1uwAA</XPD:REF> +<XPD:REF name="Associations[2]">BVpPYPY4V0KsTBJTRoLjyAAA</XPD:REF> +<XPD:REF name="Associations[3]">QwwfXlN26EahMaF2XDAvLAAA</XPD:REF> +<XPD:REF name="Associations[4]">C7X0ILbZrkWDVQ5Vc+PT/wAA</XPD:REF> +<XPD:ATTR name="#Attributes" type="integer">1</XPD:ATTR> +<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="Z9Ui4868AE++l0of4VxduQAA"> +<XPD:ATTR name="Name" type="string">id</XPD:ATTR> +<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[5]" type="UMLClass" guid="gx40XIC9FkOG3iX3Oyxw8wAA"> +<XPD:ATTR name="Name" type="string">CTvGroup</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">Group对应DTV中的一个节目分组</XPD:ATTR> +<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">8HnvkQxPk0OLqQXLeJ5MUgAA</XPD:REF> +<XPD:REF name="Views[1]">50xz0k8rgU+WfODoAi8aeQAA</XPD:REF> +<XPD:REF name="Views[2]">TR1rTShyhEG7ngh596L0kgAA</XPD:REF> +<XPD:REF name="Views[3]">GPl78wz82UaLho5xwfMqrQAA</XPD:REF> +<XPD:ATTR name="#Operations" type="integer">4</XPD:ATTR> +<XPD:OBJ name="Operations[0]" type="UMLOperation" guid="fRgLJCGVDUK1RuJPwHSaGwAA"> +<XPD:ATTR name="Name" type="string">selectByGroup</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">取得所有节目分组信息</XPD:ATTR> +<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR> +<XPD:REF name="Owner">gx40XIC9FkOG3iX3Oyxw8wAA</XPD:REF> +<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR> +<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="A3kmDTyc/0aEXqkXlCeAFAAA"> +<XPD:ATTR name="Name" type="string">ret</XPD:ATTR> +<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">vector<TvGroup></XPD:ATTR> +<XPD:REF name="BehavioralFeature">fRgLJCGVDUK1RuJPwHSaGwAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="Operations[1]" type="UMLOperation" guid="DqeBCx0GukCwnvjLeUhcogAA"> +<XPD:ATTR name="Name" type="string">addGroup</XPD:ATTR> +<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR> +<XPD:REF name="Owner">gx40XIC9FkOG3iX3Oyxw8wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[2]" type="UMLOperation" guid="Hq5DfJkwqUmxLMkjmPj4qQAA"> +<XPD:ATTR name="Name" type="string">deleteGroup</XPD:ATTR> +<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR> +<XPD:REF name="Owner">gx40XIC9FkOG3iX3Oyxw8wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[3]" type="UMLOperation" guid="5xVs/C/ycES9RQlY9VAsCgAA"> +<XPD:ATTR name="Name" type="string">editGroup</XPD:ATTR> +<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR> +<XPD:REF name="Owner">gx40XIC9FkOG3iX3Oyxw8wAA</XPD:REF> +</XPD:OBJ> +<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR> +<XPD:REF name="Associations[0]">Io3cINfhiE23pmiSxpS6swAA</XPD:REF> +<XPD:ATTR name="#Attributes" type="integer">1</XPD:ATTR> +<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="e9OE1kuwcUuhtDW6AZvH1wAA"> +<XPD:REF name="Owner">gx40XIC9FkOG3iX3Oyxw8wAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[6]" type="UMLClass" guid="26RSzf3jmEWkDlRiFhl4OAAA"> +<XPD:ATTR name="Name" type="string">CTvEvent</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">对应每个Program一个时段的节目</XPD:ATTR> +<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">7aPHkO59WEubHbpM/Djq/AAA</XPD:REF> +<XPD:REF name="Views[1]">+EOWTA5PrUyAEwB/ZHVnPAAA</XPD:REF> +<XPD:REF name="Views[2]">f0xyghRma028ShVYc8tbfwAA</XPD:REF> +<XPD:REF name="Views[3]">qpXdkd1nJ0ajRru7gzDFJwAA</XPD:REF> +<XPD:ATTR name="#Operations" type="integer">6</XPD:ATTR> +<XPD:OBJ name="Operations[0]" type="UMLOperation" guid="0db/IAr++UOdZquo78fTbgAA"> +<XPD:ATTR name="Name" type="string">TVEvent</XPD:ATTR> +<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR> +<XPD:ATTR name="StereotypeName" type="string">create</XPD:ATTR> +<XPD:REF name="Owner">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF> +<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR> +<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="lSipwxb9AEu7dKbkvn8bCwAA"> +<XPD:ATTR name="Name" type="string">db</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">CTvDatabase</XPD:ATTR> +<XPD:REF name="BehavioralFeature">0db/IAr++UOdZquo78fTbgAA</XPD:REF> +<XPD:REF name="Type_">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="Operations[1]" type="UMLOperation" guid="IaJ2KyC/H0W4mE3T5XcaJQAA"> +<XPD:ATTR name="Name" type="string">TVEvent</XPD:ATTR> +<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR> +<XPD:ATTR name="StereotypeName" type="string">destroy</XPD:ATTR> +<XPD:REF name="Owner">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[2]" type="UMLOperation" guid="n6dU85krq0+Oca0Y2wayfAAA"> +<XPD:ATTR name="Name" type="string">selectByID</XPD:ATTR> +<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR> +<XPD:REF name="Owner">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF> +<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR> +<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="JOwE9Bjhf0229aBZv0thuwAA"> +<XPD:ATTR name="Name" type="string">ret</XPD:ATTR> +<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">CTvEvent</XPD:ATTR> +<XPD:REF name="BehavioralFeature">n6dU85krq0+Oca0Y2wayfAAA</XPD:REF> +<XPD:REF name="Type_">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="Operations[3]" type="UMLOperation" guid="E97BMkERRU2lIzjyqz++tAAA"> +<XPD:ATTR name="Name" type="string">getProgram</XPD:ATTR> +<XPD:REF name="Owner">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF> +<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR> +<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="w4A7LCg5RUitVRoJ8EF5DwAA"> +<XPD:ATTR name="Name" type="string">ret</XPD:ATTR> +<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">CTvProgram</XPD:ATTR> +<XPD:REF name="BehavioralFeature">E97BMkERRU2lIzjyqz++tAAA</XPD:REF> +<XPD:REF name="Type_">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="Operations[4]" type="UMLOperation" guid="R/cQwE4hs0yRPnKVjTffUQAA"> +<XPD:ATTR name="Name" type="string">getDVBViewAge</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">取得观看年龄(DVB) +@return 返回观看年龄,0表示无年龄限制</XPD:ATTR> +<XPD:REF name="Owner">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[5]" type="UMLOperation" guid="3SmucpKb9ESg9TT4SKAe3AAA"> +<XPD:ATTR name="Name" type="string">getVChipRatings</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">取得V-Chip级别信息</XPD:ATTR> +<XPD:REF name="Owner">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF> +</XPD:OBJ> +<XPD:ATTR name="#TypedParameters" type="integer">2</XPD:ATTR> +<XPD:REF name="TypedParameters[0]">+v9VB9kIH02VZ9TgNHJJfQAA</XPD:REF> +<XPD:REF name="TypedParameters[1]">JOwE9Bjhf0229aBZv0thuwAA</XPD:REF> +<XPD:ATTR name="#Associations" type="integer">3</XPD:ATTR> +<XPD:REF name="Associations[0]">PhlKgbqPt0OClpwk2m9vswAA</XPD:REF> +<XPD:REF name="Associations[1]">zefo1Bu+v0e4gn9nUL+bSQAA</XPD:REF> +<XPD:REF name="Associations[2]">BSJLLgAd4kCusm/8BFZQMQAA</XPD:REF> +<XPD:ATTR name="#Attributes" type="integer">3</XPD:ATTR> +<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="PMItdyz77UuIZwzHxmOd3AAA"> +<XPD:ATTR name="Name" type="string">id</XPD:ATTR> +<XPD:REF name="Owner">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="nCSrn+xVyUGe6iyd/E/GDwAA"> +<XPD:ATTR name="Name" type="string">name</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">String</XPD:ATTR> +<XPD:REF name="Owner">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Attributes[2]" type="UMLAttribute" guid="xT0LK2eQ9EGzJfCHW9IJ9wAA"> +<XPD:ATTR name="Name" type="string">program</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">CTvProgram</XPD:ATTR> +<XPD:REF name="Type_">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF> +<XPD:REF name="Owner">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[7]" type="UMLClass" guid="UiYOh8D78E22qQeFeDZpLAAA"> +<XPD:ATTR name="Name" type="string">CTvConfig</XPD:ATTR> +<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">vYDCfUgYq0KaBSDnxbpYVgAA</XPD:REF> +<XPD:REF name="Views[1]">KTNQfnqIy0q3wV+ARVtV9gAA</XPD:REF> +<XPD:REF name="Views[2]">7Pq+TJVLy06gA8T6r5wMawAA</XPD:REF> +<XPD:REF name="Views[3]">Fn0oKpD7lUyNbDw59UyRygAA</XPD:REF> +<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR> +<XPD:REF name="Associations[0]">usmo/t5V5UGA31IdVHUKyQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[8]" type="UMLClass" guid="b8JuO/0C0Eq0GnJ0Q/tEWQAA"> +<XPD:ATTR name="Name" type="string">CTvBooking</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">预约播放 +预约录像</XPD:ATTR> +<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">Th+ZwPCIw0CZjtawrnGPrQAA</XPD:REF> +<XPD:REF name="Views[1]">LL3KL7SUuEyu4pY6NT57NAAA</XPD:REF> +<XPD:REF name="Views[2]">dCkq+XCQgkaH1Q901KclHQAA</XPD:REF> +<XPD:REF name="Views[3]">+Bzptjmx3kWzAYT9fN/rxQAA</XPD:REF> +<XPD:ATTR name="#Operations" type="integer">8</XPD:ATTR> +<XPD:OBJ name="Operations[0]" type="UMLOperation" guid="m+gfn/ntpkybEdFBM5znlgAA"> +<XPD:ATTR name="Name" type="string">TVBooking</XPD:ATTR> +<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR> +<XPD:ATTR name="StereotypeName" type="string">create</XPD:ATTR> +<XPD:REF name="Owner">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF> +<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR> +<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="lc6uST5/Mk6WfIuIfATlsgAA"> +<XPD:ATTR name="Name" type="string">db</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">CTvDatabase</XPD:ATTR> +<XPD:REF name="BehavioralFeature">m+gfn/ntpkybEdFBM5znlgAA</XPD:REF> +<XPD:REF name="Type_">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="Operations[1]" type="UMLOperation" guid="QqLeWhZJc0CLub0IjxjyywAA"> +<XPD:ATTR name="Name" type="string">TVBooking</XPD:ATTR> +<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR> +<XPD:ATTR name="StereotypeName" type="string">destroy</XPD:ATTR> +<XPD:REF name="Owner">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[2]" type="UMLOperation" guid="Tn9evQiVdUWS5ClifY+LnwAA"> +<XPD:ATTR name="Name" type="string">selectByID</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">根据记录ID查找指定TVBooking</XPD:ATTR> +<XPD:REF name="Owner">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[3]" type="UMLOperation" guid="LZuyv0amBUa1JHWrCnDVeAAA"> +<XPD:ATTR name="Name" type="string">selectRecordBookingsByStatus</XPD:ATTR> +<XPD:REF name="Owner">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[4]" type="UMLOperation" guid="GmUmSDVcrEabb38Mr6otqQAA"> +<XPD:ATTR name="Name" type="string">selectPlayBookingsByStatus</XPD:ATTR> +<XPD:REF name="Owner">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[5]" type="UMLOperation" guid="/JwIOjuS30SKen+tINIeIQAA"> +<XPD:ATTR name="Name" type="string">bookProgram</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">预约一个Program</XPD:ATTR> +<XPD:REF name="Owner">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[6]" type="UMLOperation" guid="06m4LFRvq0WqF2UaQPilJwAA"> +<XPD:ATTR name="Name" type="string">bookEvent</XPD:ATTR> +<XPD:REF name="Owner">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[7]" type="UMLOperation" guid="5r22Uycz1E6G3LtVFBjRzQAA"> +<XPD:ATTR name="Name" type="string">delete</XPD:ATTR> +<XPD:REF name="Owner">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF> +</XPD:OBJ> +<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR> +<XPD:REF name="Associations[0]">AfVgLfyALEyP98guAbYHUAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[9]" type="UMLClass" guid="3uD8ZK44vEi6X3Yo5n4G3wAA"> +<XPD:ATTR name="Name" type="string">CTvRegion</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string"> TV 区域 + 可以获得每个区域的频率列表等信息</XPD:ATTR> +<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">ybciiFK3jEO6SdfdRt6uAgAA</XPD:REF> +<XPD:REF name="Views[1]">AL2e0wMT+0K0AC6gZuuhdwAA</XPD:REF> +<XPD:REF name="Views[2]">zIfIWkZ3Lkiq2O9aOGiU/gAA</XPD:REF> +<XPD:REF name="Views[3]">exyb4FNp+Ue9ROAGwoQFcwAA</XPD:REF> +<XPD:ATTR name="#Operations" type="integer">7</XPD:ATTR> +<XPD:OBJ name="Operations[0]" type="UMLOperation" guid="ujBTxs7XQU2sxrOeErOlLAAA"> +<XPD:ATTR name="Name" type="string">TVRegion</XPD:ATTR> +<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR> +<XPD:ATTR name="StereotypeName" type="string">create</XPD:ATTR> +<XPD:REF name="Owner">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF> +<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR> +<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="eQIZ7HOvJESQdc0nGhqnrwAA"> +<XPD:ATTR name="Name" type="string">db</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">CTvDatabase</XPD:ATTR> +<XPD:REF name="BehavioralFeature">ujBTxs7XQU2sxrOeErOlLAAA</XPD:REF> +<XPD:REF name="Type_">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="Operations[1]" type="UMLOperation" guid="AIgKz2rgMU2bWNgoO2rmngAA"> +<XPD:ATTR name="Name" type="string">TVRegion</XPD:ATTR> +<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR> +<XPD:ATTR name="StereotypeName" type="string">destroy</XPD:ATTR> +<XPD:REF name="Owner">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[2]" type="UMLOperation" guid="1mlb6r4cZkSv6mS9OhiHiAAA"> +<XPD:ATTR name="Name" type="string">selectByID</XPD:ATTR> +<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR> +<XPD:REF name="Owner">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF> +<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR> +<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="KaZtVGGTiEm4B9lL22FEtgAA"> +<XPD:ATTR name="Name" type="string">ret</XPD:ATTR> +<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">CTvRegion</XPD:ATTR> +<XPD:REF name="BehavioralFeature">1mlb6r4cZkSv6mS9OhiHiAAA</XPD:REF> +<XPD:REF name="Type_">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="Operations[3]" type="UMLOperation" guid="d7lFBHriY0e22/gy989mbgAA"> +<XPD:ATTR name="Name" type="string">selectByName</XPD:ATTR> +<XPD:REF name="Owner">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[4]" type="UMLOperation" guid="4bMFZq1Ayk+uxljdLs5nigAA"> +<XPD:ATTR name="Name" type="string">selectByCountry</XPD:ATTR> +<XPD:REF name="Owner">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[5]" type="UMLOperation" guid="gN4TbpRxGkS8N+OPpekKxQAA"> +<XPD:ATTR name="Name" type="string">getAllCountry</XPD:ATTR> +<XPD:REF name="Owner">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF> +<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR> +<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="owFuhgapFk+E9YYtCGoeqgAA"> +<XPD:ATTR name="Name" type="string">ret</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">vector<String></XPD:ATTR> +<XPD:REF name="BehavioralFeature">gN4TbpRxGkS8N+OPpekKxQAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="Operations[6]" type="UMLOperation" guid="jk0qAxv5u0yw7WgwL+rscQAA"> +<XPD:ATTR name="Name" type="string">getChannelParams</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">取得该Region的信号源频率参数列表 +@return 返回信号源频率参数列表</XPD:ATTR> +<XPD:REF name="Owner">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF> +<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR> +<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="cgdkfeW2SE21ZEOaHuLc7gAA"> +<XPD:ATTR name="Name" type="string">ret</XPD:ATTR> +<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">TVChannelParams</XPD:ATTR> +<XPD:REF name="BehavioralFeature">jk0qAxv5u0yw7WgwL+rscQAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:ATTR name="#TypedParameters" type="integer">1</XPD:ATTR> +<XPD:REF name="TypedParameters[0]">KaZtVGGTiEm4B9lL22FEtgAA</XPD:REF> +<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR> +<XPD:REF name="Associations[0]">l6Lg/NJG5UWu+7ALxaVP3gAA</XPD:REF> +<XPD:ATTR name="#Attributes" type="integer">3</XPD:ATTR> +<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="qz9HpzuB70u9CKoB8GAVTQAA"> +<XPD:ATTR name="Name" type="string">id</XPD:ATTR> +<XPD:REF name="Owner">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="20sWt8adtki4R3t6aKZcXQAA"> +<XPD:ATTR name="Name" type="string">name</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">String</XPD:ATTR> +<XPD:REF name="Owner">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Attributes[2]" type="UMLAttribute" guid="ubg2Td5H2E6xsn9yTlb4FgAA"> +<XPD:ATTR name="Name" type="string">country</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">String</XPD:ATTR> +<XPD:REF name="Owner">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[10]" type="UMLClass" guid="iUy0YZgyREC+o54lTQptaAAA"> +<XPD:ATTR name="Name" type="string">CTvSatellite</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">TV Satellite相关信息</XPD:ATTR> +<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">tzICJ64LmUSx1fvEy4dHZQAA</XPD:REF> +<XPD:REF name="Views[1]">yCTnlkoiRkSszYJDHrqQuwAA</XPD:REF> +<XPD:REF name="Views[2]">phU5m2tyh0yMlhsYRPe6dwAA</XPD:REF> +<XPD:REF name="Views[3]">S8DZ5jxQq0+WFWPFnQy7iAAA</XPD:REF> +<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR> +<XPD:REF name="Associations[0]">ULQw0JNjPE2758pFWlo+MQAA</XPD:REF> +<XPD:REF name="Associations[1]">bObyymjPEkeQZSoHCKpP2QAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[11]" type="UMLClass" guid="/LI4+1GTjEagI/wLEFpVSQAA"> +<XPD:ATTR name="Name" type="string">CTvDimension</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">TV ATSC rating dimension</XPD:ATTR> +<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">hzoiTuCQqEuArZEejfwdnQAA</XPD:REF> +<XPD:REF name="Views[1]">PdTrEGRJOEiEJyD2I9IzJgAA</XPD:REF> +<XPD:REF name="Views[2]">VbdqX2NLOkK2DTLhOA91OwAA</XPD:REF> +<XPD:REF name="Views[3]">K00/VzyqZUmltiuaKWLgAQAA</XPD:REF> +<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR> +<XPD:REF name="Associations[0]">aYL27tYOR02se3g//aEBeAAA</XPD:REF> +<XPD:REF name="Associations[1]">zCPl48BYx0CFRkp8Jj5mogAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[12]" type="UMLClass" guid="K+kTKNnFak+/Lo9L/RD0ugAA"> +<XPD:ATTR name="Name" type="string">CTvChannelParams</XPD:ATTR> +<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">wu+9+Z2tqE2B3qchWKoWdQAA</XPD:REF> +<XPD:REF name="Views[1]">KAuxxnmqhkmQ7MLBFq8lRgAA</XPD:REF> +<XPD:REF name="Views[2]">Ynggyopqt02II9Rzg7q1VQAA</XPD:REF> +<XPD:REF name="Views[3]">PmvllpBms0ifaPkwzqXvOAAA</XPD:REF> +<XPD:ATTR name="#Operations" type="integer">13</XPD:ATTR> +<XPD:OBJ name="Operations[0]" type="UMLOperation" guid="kX5mh2hT8UCWJLBSwRAVcgAA"> +<XPD:ATTR name="Name" type="string">TVChannelParams</XPD:ATTR> +<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR> +<XPD:ATTR name="StereotypeName" type="string">create</XPD:ATTR> +<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF> +<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR> +<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="Lv2eTshDS0qHu/TtzYTS/QAA"> +<XPD:ATTR name="Name" type="string">mode</XPD:ATTR> +<XPD:REF name="BehavioralFeature">kX5mh2hT8UCWJLBSwRAVcgAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="Operations[1]" type="UMLOperation" guid="bqibYQS6Yk2XKFVNjvPY/QAA"> +<XPD:ATTR name="Name" type="string">TVChannelParams</XPD:ATTR> +<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR> +<XPD:ATTR name="StereotypeName" type="string">destroy</XPD:ATTR> +<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[2]" type="UMLOperation" guid="g8684eMuVEODZq64tkbFKwAA"> +<XPD:ATTR name="Name" type="string">CreatedvbcParams</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">类似还有其它channel参数创建静态接口</XPD:ATTR> +<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR> +<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF> +<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR> +<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="dgzVycSB3EK9p7gNlVzXuAAA"> +<XPD:ATTR name="Name" type="string">ret</XPD:ATTR> +<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">CTvChannelParams</XPD:ATTR> +<XPD:REF name="BehavioralFeature">g8684eMuVEODZq64tkbFKwAA</XPD:REF> +<XPD:REF name="Type_">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="Operations[3]" type="UMLOperation" guid="qzQZnEnCj0edzMmQ9W+TUgAA"> +<XPD:ATTR name="Name" type="string">channelCurAllbandParams</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">创建当前所有通道参数 +@param region 区域 +@param mode 通道模式 +@return 返回新创建的参数</XPD:ATTR> +<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[4]" type="UMLOperation" guid="sUoQkkeSDUicDjvihzE17wAA"> +<XPD:ATTR name="Name" type="string">setATVAudio</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">修改模拟音频</XPD:ATTR> +<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[5]" type="UMLOperation" guid="Zp/uaKhNykq6I0DLIqMs6QAA"> +<XPD:ATTR name="Name" type="string">setATVVideoFormat</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">修改模拟视频制式</XPD:ATTR> +<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[6]" type="UMLOperation" guid="W6/Dh7vCMEOK5gCFWgvBuQAA"> +<XPD:ATTR name="Name" type="string">setATVAudioFormat</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string">修改模拟音频制式</XPD:ATTR> +<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[7]" type="UMLOperation" guid="q3e/rtfy+kSDpxAL+JLUAwAA"> +<XPD:ATTR name="Name" type="string">getMode</XPD:ATTR> +<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[8]" type="UMLOperation" guid="21JdwhpouEyYG3lZnsC7PQAA"> +<XPD:ATTR name="Name" type="string">isDVBMode</XPD:ATTR> +<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[9]" type="UMLOperation" guid="MCre8DdGnEO6NtacO4PxcwAA"> +<XPD:ATTR name="Name" type="string">getFrequency</XPD:ATTR> +<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[10]" type="UMLOperation" guid="kb+kpTCHVEKx7jv8aHBGTQAA"> +<XPD:ATTR name="Name" type="string">getAudioMode</XPD:ATTR> +<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[11]" type="UMLOperation" guid="tYagO7r1C0yRLvAhDROpOQAA"> +<XPD:ATTR name="Name" type="string">getBandwidth</XPD:ATTR> +<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Operations[12]" type="UMLOperation" guid="ugcb6A9/j02nfYGa/WNK2QAA"> +<XPD:ATTR name="Name" type="string">==</XPD:ATTR> +<XPD:ATTR name="StereotypeProfile" type="string">Cpp</XPD:ATTR> +<XPD:ATTR name="StereotypeName" type="string">CppOperator</XPD:ATTR> +<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF> +<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR> +<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="WRmMAQd1vkKgOwOy5hHXbwAA"> +<XPD:ATTR name="Name" type="string">param</XPD:ATTR> +<XPD:ATTR name="TypeExpression" type="string">CTvChannelParams</XPD:ATTR> +<XPD:REF name="BehavioralFeature">ugcb6A9/j02nfYGa/WNK2QAA</XPD:REF> +<XPD:REF name="Type_">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:ATTR name="#TypedParameters" type="integer">2</XPD:ATTR> +<XPD:REF name="TypedParameters[0]">dgzVycSB3EK9p7gNlVzXuAAA</XPD:REF> +<XPD:REF name="TypedParameters[1]">WRmMAQd1vkKgOwOy5hHXbwAA</XPD:REF> +<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR> +<XPD:REF name="Associations[0]">Dzfwehs+P0e8CyC/holLewAA</XPD:REF> +<XPD:REF name="Associations[1]">+M+2f65R0UCJH6UP90YGAQAA</XPD:REF> +<XPD:ATTR name="#Attributes" type="integer">11</XPD:ATTR> +<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="vd9GmSHi8kmIG7Uv183sQwAA"> +<XPD:ATTR name="Name" type="string">mode</XPD:ATTR> +<XPD:ATTR name="Visibility" type="UMLVisibilityKind">vkPrivate</XPD:ATTR> +<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="8PpQj0CQ8UaM6aUQTqHY+wAA"> +<XPD:ATTR name="Name" type="string">frequency</XPD:ATTR> +<XPD:ATTR name="Visibility" type="UMLVisibilityKind">vkPrivate</XPD:ATTR> +<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Attributes[2]" type="UMLAttribute" guid="mixkGHhILEOQrR9Hbe6XtwAA"> +<XPD:ATTR name="Name" type="string">symbolRate</XPD:ATTR> +<XPD:ATTR name="Visibility" type="UMLVisibilityKind">vkPrivate</XPD:ATTR> +<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Attributes[3]" type="UMLAttribute" guid="2yJw+lrLQE26CKqlL4qTawAA"> +<XPD:ATTR name="Name" type="string">modulation</XPD:ATTR> +<XPD:ATTR name="Visibility" type="UMLVisibilityKind">vkPrivate</XPD:ATTR> +<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Attributes[4]" type="UMLAttribute" guid="nFx/MMjsyEq2iVvWRpY1pwAA"> +<XPD:ATTR name="Name" type="string">bandwidth</XPD:ATTR> +<XPD:ATTR name="Visibility" type="UMLVisibilityKind">vkPrivate</XPD:ATTR> +<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Attributes[5]" type="UMLAttribute" guid="0Zj58ngjk0KvB5ZV2+v12gAA"> +<XPD:ATTR name="Name" type="string">audio</XPD:ATTR> +<XPD:ATTR name="Visibility" type="UMLVisibilityKind">vkPrivate</XPD:ATTR> +<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Attributes[6]" type="UMLAttribute" guid="1CdqUE68HkCKHC0wHU0OugAA"> +<XPD:ATTR name="Name" type="string">standard</XPD:ATTR> +<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Attributes[7]" type="UMLAttribute" guid="qCoIFqRZckuS8ETuBEJ63gAA"> +<XPD:ATTR name="Name" type="string">afc_data</XPD:ATTR> +<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Attributes[8]" type="UMLAttribute" guid="RXpFXMpRb0G050iBJ169CQAA"> +<XPD:ATTR name="Name" type="string">sat_id</XPD:ATTR> +<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Attributes[9]" type="UMLAttribute" guid="KbUJ3zQudkuMliodZgdwoAAA"> +<XPD:ATTR name="Name" type="string">sat_polarisation</XPD:ATTR> +<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Attributes[10]" type="UMLAttribute" guid="I6rm/D6pekmaDTzLw9FT/wAA"> +<XPD:ATTR name="Name" type="string">Attribute2</XPD:ATTR> +<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[13]" type="UMLSignal" guid="IK4ie4RbI0mW+299Nj4+3AAA"> +<XPD:ATTR name="Name" type="string">CListen</XPD:ATTR> +<XPD:ATTR name="Documentation" type="string"> /**正在播放的节目因收看等级不够被停止*/ + public static final int TYPE_PROGRAM_BLOCK = 1; + /**正在播放的节目从BLOCK状态恢复*/ + public static final int TYPE_PROGRAM_UNBLOCK = 2; + /**没有信号*/ + public static final int TYPE_SIGNAL_LOST = 3; + /**信号恢复*/ + public static final int TYPE_SIGNAL_RESUME = 4; + /**节目数据停止*/ + public static final int TYPE_DATA_LOST = 5; + /**节目数据恢复*/ + public static final int TYPE_DATA_RESUME = 6; + /**预约提醒*/ + public static final int TYPE_BOOKING_REMIND = 7; + /**预约开始*/ + public static final int TYPE_BOOKING_START = 8; + /**配置项被修改*/ + public static final int TYPE_CONFIG_CHANGED = 9; + /**频道搜索进度*/ + public static final int TYPE_SCAN_PROGRESS = 10; + /**频道搜索结束,开始存储 */ + public static final int TYPE_SCAN_STORE_BEGIN = 11; + /**频道搜索存储完毕*/ + public static final int TYPE_SCAN_STORE_END = 12; + /**频道搜索完成*/ + public static final int TYPE_SCAN_END = 13; + /**正在播放节目相关信息更新*/ + public static final int TYPE_PROGRAM_UPDATE = 14; + /**节目开始播放*/ + public static final int TYPE_PROGRAM_START = 15; + /**节目停止播放*/ + public static final int TYPE_PROGRAM_STOP = 16; + /**TV系统时间更新*/ + public static final int TYPE_TIME_UPDATE = 17; + /**事件信息更新*/ + public static final int TYPE_EVENT_UPDATE = 18; + /**输入源切换*/ + public static final int TYPE_INPUT_SOURCE_CHANGED = 19; + /**请求播放节目号*/ + public static final int TYPE_PROGRAM_NUMBER = 20; + /**录像列表更新*/ + public static final int TYPE_RECORDS_UPDATE = 21; + /**录像冲突*/ + public static final int TYPE_RECORD_CONFLICT = 22; + /**录像已结束*/ + public static final int TYPE_RECORD_END = 23; + /**VGA信号调整成功*/ + public static final int TYPE_VGA_ADJUST_OK = 24; + /**VGA信号调整失败*/ + public static final int TYPE_VGA_ADJUST_FAILED = 25; + /**VGA信号调整中*/ + public static final int TYPE_VGA_ADJUST_DOING = 26; + /**信号改变*/ + public static final int TYPE_SIG_CHANGE = 27; + /**盲扫进度*/ + public static final int TYPE_BLINDSCAN_PROGRESS = 28; + /**盲扫新Channel*/ + public static final int TYPE_BLINDSCAN_NEWCHANNEL = 29; + /**盲扫结束*/ + public static final int TYPE_BLINDSCAN_END = 30; + /**卫星设备LNB与Switch配置生效*/ + public static final int TYPE_SEC_LNBSSWITCHCFGVALID = 31; + /**diseqc马达停止转动*/ + public static final int TYPE_SEC_POSITIONERSTOP= 32; + /**diseqc马达禁止限制*/ + public static final int TYPE_SEC_POSITIONERDISABLELIMIT= 33; + /**diseqc马达东向限制设置*/ + public static final int TYPE_SEC_POSITIONEREASTLIMIT= 34; + /**diseqc马达西向限制设置*/ + public static final int TYPE_SEC_POSITIONERWESTLIMIT= 35; + /**diseqc马达东向转动*/ + public static final int TYPE_SEC_POSITIONEREAST= 36; + /**diseqc马达西向转动*/ + public static final int TYPE_SEC_POSITIONERWEST= 37; + /**diseqc马达存储位置*/ + public static final int TYPE_SEC_POSITIONERSTORE= 38; + /**diseqc马达转动到指定位置*/ + public static final int TYPE_SEC_POSITIONERGOTO= 39; + /**diseqc马达转动根据本地经纬度以及卫星经度*/ + public static final int TYPE_SEC_POSITIONERGOTOX= 40; + /**切换至新节目*/ + public static final int TYPE_PROGRAM_SWITCH = 41; + /**在当前频点搜索DTV频道*/ + public static final int TYPE_SCAN_DTV_CHANNEL = 42; + /**数据库导入/导出转换操作开始*/ + public static final int TYPE_TRANSFORM_DB_START = 43; + /**数据库导入/导出转换操作完成*/ + public static final int TYPE_TRANSFORM_DB_END = 44; + /**pvr/timeshifting回放开始*/ + public static final int TYPE_PLAYBACK_START = 45; + /**pvr/timeshifting回放结束*/ + public static final int TYPE_PLAYBACK_STOP = 46; + /**节目音视频因被加扰而无法正常播放*/ + public static final int TYPE_PROGRAM_SCRAMBLED = 47; + + + +流的变化 +</XPD:ATTR> +<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF> +</XPD:OBJ> +<XPD:ATTR name="#Associations" type="integer">4</XPD:ATTR> +<XPD:REF name="Associations[0]">TolxJOTDCkO5nyLC6ipkAwAA</XPD:REF> +<XPD:REF name="Associations[1]">KeKc5deyJkKjIbzodSAF8QAA</XPD:REF> +<XPD:REF name="Associations[2]">osliKvkWrU6Jd0FLz/mZngAA</XPD:REF> +<XPD:REF name="Associations[3]">0WvOUzDyAEKgjZCRSx5J8gAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[1]" type="UMLPackage" guid="ZRumjrTwgUamBDOstkagPgAA"> +<XPD:ATTR name="Name" type="string">atv</XPD:ATTR> +<XPD:REF name="Namespace">bnJ8ggSchket3/t1l7Kx4wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">1</XPD:ATTR> +<XPD:REF name="Views[0]">R7RBkUeb+E+5S8gvJN8+QQAA</XPD:REF> +<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR> +<XPD:REF name="Associations[0]">XKFQZaAIH0SxD7YBXgkK0wAA</XPD:REF> +<XPD:REF name="Associations[1]">nzRPyOcacU2J9Jf/0lCmawAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[23]" type="UMLAssociation" guid="1PikxOdVcU2P6grgcwgRvQAA"> +<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">Z3PDc4i/1UCiaxni9RpD2wAA</XPD:REF> +<XPD:REF name="Views[1]">mhm++LaJkk6lJzcTz7hSFgAA</XPD:REF> +<XPD:REF name="Views[2]">IxT95vhnIEyr12fdRQskKQAA</XPD:REF> +<XPD:REF name="Views[3]">d+KXspkLsEa/YezZSZ7YZAAA</XPD:REF> +<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="AfVgLfyALEyP98guAbYHUAAA"> +<XPD:REF name="Association">1PikxOdVcU2P6grgcwgRvQAA</XPD:REF> +<XPD:REF name="Participant">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">08HUrDXL5EahpEFi9GJ9yQAA</XPD:REF> +<XPD:REF name="Views[1]">QRLcMMAOqES9/c4itcB3vAAA</XPD:REF> +<XPD:REF name="Views[2]">mQFH13/vQUucR5en5l/dUwAA</XPD:REF> +<XPD:REF name="Views[3]">m0oKw9kT5k2CSLEOl9tV+gAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="Fd/cvRV12USE+Vu6oJsMOgAA"> +<XPD:REF name="Association">1PikxOdVcU2P6grgcwgRvQAA</XPD:REF> +<XPD:REF name="Participant">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">HxD2Y75aWkSp4d/0R6KiBgAA</XPD:REF> +<XPD:REF name="Views[1]">K5rMwb6Iyka5HDC+pxIZOwAA</XPD:REF> +<XPD:REF name="Views[2]">GfMJbs1/nkShjuqnA/8BBAAA</XPD:REF> +<XPD:REF name="Views[3]">jXmYJVpZxkCkrM3yJ0eHmgAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[24]" type="UMLAssociation" guid="6uW6VAT+jEG9Vy3cmRxPvgAA"> +<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF> +<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="0WvOUzDyAEKgjZCRSx5J8gAA"> +<XPD:REF name="Association">6uW6VAT+jEG9Vy3cmRxPvgAA</XPD:REF> +<XPD:REF name="Participant">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="nzRPyOcacU2J9Jf/0lCmawAA"> +<XPD:REF name="Association">6uW6VAT+jEG9Vy3cmRxPvgAA</XPD:REF> +<XPD:REF name="Participant">ZRumjrTwgUamBDOstkagPgAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[25]" type="UMLAssociation" guid="3PUgTTrP3U+LofrDCso/eAAA"> +<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">JFsYjMcrU0GkgX8jFqUVZAAA</XPD:REF> +<XPD:REF name="Views[1]">R57gZgKnBkm8aQCFy90fiQAA</XPD:REF> +<XPD:REF name="Views[2]">GznyP+sffEKB3m9dw8jftQAA</XPD:REF> +<XPD:REF name="Views[3]">NM8M6o1EGkWwEmKdXXKpPAAA</XPD:REF> +<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="PP9nsgv4Vkmbk1zEfct4VAAA"> +<XPD:REF name="Association">3PUgTTrP3U+LofrDCso/eAAA</XPD:REF> +<XPD:REF name="Participant">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">vVViwylf/Ei9ld6xTj7WdQAA</XPD:REF> +<XPD:REF name="Views[1]">A5rd4V90HkCp3dmD7wYTbwAA</XPD:REF> +<XPD:REF name="Views[2]">fhSnklGoSEqMAzQOJY57vwAA</XPD:REF> +<XPD:REF name="Views[3]">n4gqVjygvUK59/wDDHYNJgAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="usmo/t5V5UGA31IdVHUKyQAA"> +<XPD:REF name="Association">3PUgTTrP3U+LofrDCso/eAAA</XPD:REF> +<XPD:REF name="Participant">UiYOh8D78E22qQeFeDZpLAAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">AoZLFazfK0WqZzhHukFsAwAA</XPD:REF> +<XPD:REF name="Views[1]">QGcntempZkeGNA54l7y1rAAA</XPD:REF> +<XPD:REF name="Views[2]">pDauXlrgH0KfuJt30X8zxgAA</XPD:REF> +<XPD:REF name="Views[3]">NKRAWeqgBEKgb6cHnYpt9QAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[26]" type="UMLPackage" guid="YAejusdLDUikLT0VX+S31wAA"> +<XPD:ATTR name="Name" type="string">MW</XPD:ATTR> +<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF> +<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR> +<XPD:REF name="Associations[0]">OmNL/SOM7k6GhKEEqGF0RgAA</XPD:REF> +<XPD:REF name="Associations[1]">j/oong2hbUCcfqfb/9L1PwAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[27]" type="UMLAssociation" guid="vd4u72TMwkKCHYSmzMvXNQAA"> +<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF> +<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="OmNL/SOM7k6GhKEEqGF0RgAA"> +<XPD:REF name="Association">vd4u72TMwkKCHYSmzMvXNQAA</XPD:REF> +<XPD:REF name="Participant">YAejusdLDUikLT0VX+S31wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="0RZNIMepB0W9fkd6pMCEZwAA"> +<XPD:REF name="Association">vd4u72TMwkKCHYSmzMvXNQAA</XPD:REF> +<XPD:REF name="Participant">CN6L5smMd0u/4SQDgGuxlAAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[28]" type="UMLAssociation" guid="n5b/e2YQYka0DNd4RWbgbgAA"> +<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF> +<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="j/oong2hbUCcfqfb/9L1PwAA"> +<XPD:REF name="Association">n5b/e2YQYka0DNd4RWbgbgAA</XPD:REF> +<XPD:REF name="Participant">YAejusdLDUikLT0VX+S31wAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="frvBY5I3t0yZgEqYHUhfEQAA"> +<XPD:REF name="Association">n5b/e2YQYka0DNd4RWbgbgAA</XPD:REF> +<XPD:REF name="Participant">7dRihysn8kefkb+6mJlwzgAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[29]" type="UMLAssociation" guid="7aJQb5j/+kWV9Kb/0dqoJAAA"> +<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">Q/k+TeR21UWA0JPwiSZAnwAA</XPD:REF> +<XPD:REF name="Views[1]">C2jwipMyN0iMiEays2pVbQAA</XPD:REF> +<XPD:REF name="Views[2]">MxF6R3nqrk+nOid9gUoepAAA</XPD:REF> +<XPD:REF name="Views[3]">5CzND/56UUuAy2C5OXPJGAAA</XPD:REF> +<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="C7X0ILbZrkWDVQ5Vc+PT/wAA"> +<XPD:REF name="Association">7aJQb5j/+kWV9Kb/0dqoJAAA</XPD:REF> +<XPD:REF name="Participant">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">2P5BNH8K/UKYeriBTZAbSgAA</XPD:REF> +<XPD:REF name="Views[1]">X0Z4arOj+EWceCda6Sj0vgAA</XPD:REF> +<XPD:REF name="Views[2]">nbxLBw93Oka1PVwDZftA2QAA</XPD:REF> +<XPD:REF name="Views[3]">lKhOSy40pUOJhnfmNzIx5AAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="Dzfwehs+P0e8CyC/holLewAA"> +<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR> +<XPD:REF name="Association">7aJQb5j/+kWV9Kb/0dqoJAAA</XPD:REF> +<XPD:REF name="Participant">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">VSR1os7RckKbbg+wZ6UPWwAA</XPD:REF> +<XPD:REF name="Views[1]">3yHNXWsgu0eaPzi0F9a3dgAA</XPD:REF> +<XPD:REF name="Views[2]">+gO4BIQphEShtlup7FhfcgAA</XPD:REF> +<XPD:REF name="Views[3]">laRXvwF4WE2wUODF6aCNSQAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[30]" type="UMLAssociation" guid="6r7WWefo1kK4HXJ46+UuHwAA"> +<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">2tALOFJiukSZiwAj9gBDIQAA</XPD:REF> +<XPD:REF name="Views[1]">BM0ZC/TOp0CzIS/dSFOgMQAA</XPD:REF> +<XPD:REF name="Views[2]">911s2zFZYUCPtLOmXSDdDgAA</XPD:REF> +<XPD:REF name="Views[3]">bOeJui9AgkWX+he6KT6czQAA</XPD:REF> +<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR> +<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="+M+2f65R0UCJH6UP90YGAQAA"> +<XPD:REF name="Association">6r7WWefo1kK4HXJ46+UuHwAA</XPD:REF> +<XPD:REF name="Participant">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">2U407qHmXE+0VHF/y4trXwAA</XPD:REF> +<XPD:REF name="Views[1]">dAD5Dd+Px0eU/Z7MNaXtWgAA</XPD:REF> +<XPD:REF name="Views[2]">16BTtqnINEq6DZln/1Uc4AAA</XPD:REF> +<XPD:REF name="Views[3]">1RtPOXDsOEuSNTqKSxFAKAAA</XPD:REF> +</XPD:OBJ> +<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="AM/xtV731kSTTZbv0mmefgAA"> +<XPD:REF name="Association">6r7WWefo1kK4HXJ46+UuHwAA</XPD:REF> +<XPD:REF name="Participant">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF> +<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR> +<XPD:REF name="Views[0]">lMa33WFxzU2ojAIXkT9IwAAA</XPD:REF> +<XPD:REF name="Views[1]">Ehl7/9ciY0mjVGRlJGzTegAA</XPD:REF> +<XPD:REF name="Views[2]">MAu3FLtcFkOt8a9+Yj8MBAAA</XPD:REF> +<XPD:REF name="Views[3]">FstmADGG7k2p8GVFXyT/GAAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[3]" type="UMLModel" guid="PS0LMSpdO0O+FHz16P77KAAA"> +<XPD:ATTR name="Name" type="string">Implementation Model</XPD:ATTR> +<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR> +<XPD:ATTR name="StereotypeName" type="string">implementationModel</XPD:ATTR> +<XPD:REF name="Namespace">CoZuu0bDp0eooW1pQg6aQwAA</XPD:REF> +<XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR> +<XPD:OBJ name="OwnedDiagrams[0]" type="UMLComponentDiagram" guid="8lc98jz+106sHki62uo59wAA"> +<XPD:ATTR name="Name" type="string">Main</XPD:ATTR> +<XPD:REF name="DiagramOwner">PS0LMSpdO0O+FHz16P77KAAA</XPD:REF> +<XPD:OBJ name="DiagramView" type="UMLComponentDiagramView" guid="0wCA7NA3N0ei/8mtv/tB+gAA"> +<XPD:REF name="Diagram">8lc98jz+106sHki62uo59wAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +</XPD:OBJ> +<XPD:OBJ name="OwnedElements[4]" type="UMLModel" guid="Br3gILarcEaGGLO+RQTdrAAA"> +<XPD:ATTR name="Name" type="string">Deployment Model</XPD:ATTR> +<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR> +<XPD:ATTR name="StereotypeName" type="string">deploymentModel</XPD:ATTR> +<XPD:REF name="Namespace">CoZuu0bDp0eooW1pQg6aQwAA</XPD:REF> +<XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR> +<XPD:OBJ name="OwnedDiagrams[0]" type="UMLDeploymentDiagram" guid="etpVb7W50ECVJjSyvN9PGgAA"> +<XPD:ATTR name="Name" type="string">Main</XPD:ATTR> +<XPD:REF name="DiagramOwner">Br3gILarcEaGGLO+RQTdrAAA</XPD:REF> +<XPD:OBJ name="DiagramView" type="UMLDeploymentDiagramView" guid="I2wMY5Xl20qJVJcTZ7SuMgAA"> +<XPD:REF name="Diagram">etpVb7W50ECVJjSyvN9PGgAA</XPD:REF> +</XPD:OBJ> +</XPD:OBJ> +</XPD:OBJ> +</XPD:OBJ> +</XPD:BODY> +</XPD:PROJECT> diff --git a/tvapi/libtv/Android.mk b/tvapi/libtv/Android.mk new file mode 100644 index 0000000..c8e739f --- a/dev/null +++ b/tvapi/libtv/Android.mk @@ -0,0 +1,224 @@ +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + +DVB_PATH := $(wildcard external/dvb) + +ifeq ($(DVB_PATH), ) + DVB_PATH := $(wildcard vendor/amlogic/dvb) +endif + +AM_LIBPLAYER_PATH := $(wildcard vendor/amlogic/frameworks/av/LibPlayer) +LIB_ZVBI_PATH := $(wildcard external/libzvbi) +LIB_SQLITE_PATH := $(wildcard external/sqlite) + +#support android and amaudio +BOARD_TV_AUDIO_TYPE := amaudio + +#support builtin and external +BOARD_TV_AUDIO_AMAUDIO_LIB_TYPE := external + + +LOCAL_MODULE_TAGS := optional + +LOCAL_SRC_FILES := \ + tv/AutoBackLight.cpp \ + tv/CTvLog.cpp \ + tv/CTvEv.cpp \ + tv/CTvEpg.cpp \ + tv/CTvRecord.cpp \ + tv/CTvSubtitle.cpp \ + tv/CTvScanner.cpp \ + tv/CTvTime.cpp \ + tv/CTv.cpp \ + tv/CTvBooking.cpp \ + tv/CFrontEnd.cpp \ + tv/CTvVchipCheck.cpp \ + tv/CFbcCommunication.cpp \ + tv/CTvScreenCapture.cpp \ + tv/CUpgradeFBC.cpp \ + tv/CAv.cpp \ + tv/CTvDmx.cpp \ + tvin/CTvin.cpp \ + tvin/CSourceConnectDetect.cpp \ + tvin/CHDMIRxCEC.cpp \ + tvdb/CTvDimension.cpp \ + vpp/CVpp.cpp \ + vpp/pqdata.cpp \ + tvutils/tvutils.cpp \ + tvutils/CFile.cpp \ + tvutils/CThread.cpp \ + tvutils/CMsgQueue.cpp \ + tvutils/zepoll.cpp \ + tvutils/serial_base.cpp \ + tvutils/serial_operate.cpp \ + tvutils/CSerialCommunication.cpp \ + tvutils/CSerialPort.cpp \ + tvutils/CHdmiCecCmd.cpp \ + tvutils/CTvInput.cpp \ + tvutils/CSqlite.cpp \ + vpp/CPQdb.cpp \ + tvconfig/tvconfig.cpp \ + tvconfig/CIniFile.cpp \ + audio/audio_api.cpp \ + tvsetting/audio_cfg.cpp \ + audio/audio_effect.cpp \ + audio/audio_alsa.cpp \ + audio/audio_android_effect.cpp \ + tvsetting/CBlobDevice.cpp \ + tvsetting/CBlobDeviceE2prom.cpp \ + tvsetting/CBlobDeviceFile.cpp \ + tvsetting/CTvSetting.cpp \ + tvsetting/CTvSettingDeviceFactory.cpp \ + tvsetting/TvKeyData.cpp \ + version/version.cpp \ + tvdb/CTvChannel.cpp \ + tvdb/CTvDatabase.cpp \ + tvdb/CTvEvent.cpp \ + tvdb/CTvGroup.cpp \ + tvdb/CTvProgram.cpp \ + tvdb/CTvRegion.cpp + +LOCAL_SHARED_LIBRARIES := \ + libui \ + libutils \ + libcutils \ + libnetutils \ + libsqlite \ + libmedia \ + libtvbinder \ + libhardware_legacy \ + libdl \ + libskia \ + libtinyxml \ + libusbhost \ + libbinder \ + libstagefright + +LOCAL_SHARED_LIBRARIES += \ + libzvbi \ + libntsc_decode \ + libam_mw \ + libam_adp \ + libam_ver + +ifeq ($(strip $(BOARD_TV_AUDIO_AMAUDIO_LIB_TYPE)), external) + LOCAL_SHARED_LIBRARIES += libTVaudio +endif + +ifeq ($(strip $(BOARD_ALSA_AUDIO)),tiny) + LOCAL_SHARED_LIBRARIES += libtinyalsa +else + LOCAL_SHARED_LIBRARIES += libasound +endif + +LOCAL_STATIC_LIBRARIES += libz + +LOCAL_CFLAGS := \ + -fPIC -fsigned-char -D_POSIX_SOURCE \ + -DALSA_CONFIG_DIR=\"/system/usr/share/alsa\" \ + -DALSA_PLUGIN_DIR=\"/system/usr/lib/alsa-lib\" \ + -DALSA_DEVICE_DIRECTORY=\"/dev/snd/\" + +LOCAL_CFLAGS += -DANDROID_PLATFORM_SDK_VERSION=$(PLATFORM_SDK_VERSION) + +ifeq ($(SOURCE_DEDTECT_ON),true) + LOCAL_CFLAGS += -DSOURCE_DETECT_ENABLE +endif + +ifeq ($(TARGET_SIMULATOR),true) + LOCAL_CFLAGS += -DSINGLE_PROCESS +endif + +ifeq ($(strip $(BOARD_ALSA_AUDIO)),tiny) + LOCAL_CFLAGS += -DBOARD_ALSA_AUDIO_TINY +endif + +ifeq ($(strip $(BOARD_TV_AUDIO_TYPE)),amaudio) + LOCAL_CFLAGS += -DCC_TV_AUDIO_TYPE_AMAUDIO=1 +endif + +ifeq ($(strip $(BOARD_TV_AUDIO_TYPE)),android) + LOCAL_SRC_FILES += audio/audio_android.cpp + LOCAL_CFLAGS += -DCC_TV_AUDIO_TYPE_ANDROID=1 +endif + +LOCAL_C_INCLUDES += \ + bionic/libc/include \ + bionic/libc/private \ + system/extras/ext4_utils \ + $(LOCAL_PATH)/../ \ + $(LIB_SQLITE_PATH)/dist \ + system/media/audio_effects/include \ + external/tinyalsa/include \ + frameworks/av/include/media/stagefright \ + frameworks/native/include/media/openmax + +ifeq ($(strip $(BOARD_TV_AUDIO_AMAUDIO_LIB_TYPE)), external) + LOCAL_C_INCLUDES += hardware/amlogic/audio/libTVaudio +endif + +LOCAL_C_INCLUDES += external/libzvbi/src \ + bionic/libc/include \ + $(DVB_PATH)/android/ndk/include \ + external/tinyxml + +ifeq ($(strip $(BOARD_ALSA_AUDIO)),tiny) + LOCAL_C_INCLUDES += external/tinyalsa/include +else + LOCAL_C_INCLUDES += external/alsa-lib/include +endif + + +LOCAL_C_INCLUDES += \ + $(LOCAL_PATH)/dtv_play \ + $(LIB_ZVBI_PATH)/ntsc_decode/include \ + $(LIB_ZVBI_PATH)/ntsc_decode/include/ntsc_dmx \ + $(LIB_ZVBI_PATH)/src \ + $(DVB_PATH)/include/am_adp \ + $(DVB_PATH)/include/am_mw \ + $(DVB_PATH)/include/am_ver \ + $(DVB_PATH)/android/ndk/include \ + $(AM_LIBPLAYER_PATH)/amadec/include \ + $(AM_LIBPLAYER_PATH)/amcodec/include \ + $(AM_LIBPLAYER_PATH)/amffmpeg \ + $(AM_LIBPLAYER_PATH)/amplayer \ + $(LOCAL_PATH)/tvdb \ + $(LOCAL_PATH)/tv \ + $(LOCAL_PATH)/include \ + $(LOCAL_PATH)/../build/include \ + $(LOCAL_PATH)/projects + + + +LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog + +LOCAL_PRELINK_MODULE := false + +# version +ifeq ($(strip $(BOARD_TVAPI_NO_VERSION)),) + $(shell cd $(LOCAL_PATH);touch version/version.cpp) + LIBTVSERVICE_GIT_VERSION="$(shell cd $(LOCAL_PATH);git log | grep commit -m 1 | cut -d' ' -f 2)" + LIBTVSERVICE_GIT_UNCOMMIT_FILE_NUM=$(shell cd $(LOCAL_PATH);git diff | grep +++ -c) + LIBTVSERVICE_GIT_BRANCH="$(shell cd $(LOCAL_PATH);git branch | grep \* -m 1)" + LIBTVSERVICE_LAST_CHANGED="$(shell cd $(LOCAL_PATH);git log | grep Date -m 1)" + LIBTVSERVICE_BUILD_TIME=" $(shell date)" + LIBTVSERVICE_BUILD_NAME=" $(shell echo ${LOGNAME})" + + LOCAL_CFLAGS+=-DHAVE_VERSION_INFO + LOCAL_CFLAGS+=-DLIBTVSERVICE_GIT_VERSION=\"${LIBTVSERVICE_GIT_VERSION}${LIBTVSERVICE_GIT_DIRTY}\" + LOCAL_CFLAGS+=-DLIBTVSERVICE_GIT_UNCOMMIT_FILE_NUM=${LIBTVSERVICE_GIT_UNCOMMIT_FILE_NUM} + LOCAL_CFLAGS+=-DLIBTVSERVICE_GIT_BRANCH=\"${LIBTVSERVICE_GIT_BRANCH}\" + LOCAL_CFLAGS+=-DLIBTVSERVICE_LAST_CHANGED=\"${LIBTVSERVICE_LAST_CHANGED}\" + LOCAL_CFLAGS+=-DLIBTVSERVICE_BUILD_TIME=\"${LIBTVSERVICE_BUILD_TIME}\" + LOCAL_CFLAGS+=-DLIBTVSERVICE_BUILD_NAME=\"${LIBTVSERVICE_BUILD_NAME}\" + LOCAL_CFLAGS+=-DTVAPI_BOARD_VERSION=\"$(TVAPI_TARGET_BOARD_VERSION)\" +endif + + +LOCAL_CFLAGS += -DTARGET_BOARD_$(strip $(TVAPI_TARGET_BOARD_VERSION)) + + +LOCAL_MODULE:= libtv + +include $(BUILD_SHARED_LIBRARY) +include $(LOCAL_PATH)/projects/Android.mk diff --git a/tvapi/libtv/audio/audio_alsa.cpp b/tvapi/libtv/audio/audio_alsa.cpp new file mode 100644 index 0000000..551e3c6 --- a/dev/null +++ b/tvapi/libtv/audio/audio_alsa.cpp @@ -0,0 +1,1213 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <getopt.h> +#include <pthread.h> +#include <stdarg.h> +#include <ctype.h> +#include <math.h> +#include <errno.h> +#include <assert.h> +#include <fcntl.h> +#include <dlfcn.h> +#include <tinyalsa/asoundlib.h> +#include "CFbcCommunication.h" +#include <sys/poll.h> +#include <android/log.h> +#include "tvsetting/audio_cfg.h" +#include "audio_alsa.h" +#include <cutils/properties.h> +#define LOG_TAG "CAudioAlsa" +#include "CTvLog.h" +#include "audio_amaudio.h" + +static const int MainDigitLutBuf[CC_VOL_TRANS_LUT_BUF_SIZE] = { + // + 0, 40, 50, 60, 70, 87, 110, 120, 130, 140, // 0~9 + 150, 152, 155, 158, 161, 164, 167, 170, 173, 174, // 10~19 + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, // 20~29 + 191, 191, 192, 193, 194, 195, 196, 196, 197, 197, // 30~39 + 198, 198, 198, 199, 199, 200, 200, 201, 201, 201, // 40~49 + 202, 202, 202, 203, 203, 203, 203, 204, 204, 204, // 50~59 + 205, 205, 205, 205, 206, 206, 206, 206, 206, 207, // 60~69 + 207, 207, 207, 207, 207, 207, 207, 208, 208, 208, // 70~79 + 208, 208, 208, 208, 208, 208, 208, 208, 208, 209, // 80~89 + 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, // 90~99 + 209, // 100 +}; + +static const int SupperBassDigitLutBuf[CC_VOL_TRANS_LUT_BUF_SIZE] = { + // + 0, 122, 123, 124, 125, 126, 127, 128, 129, 130, // 0~9 + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, // 10~19 + 141, 142, 143, 144, 145, 147, 147, 148, 148, 149, // 20~29 + 149, 150, 150, 151, 151, 152, 152, 153, 153, 154, // 30~39 + 154, 155, 155, 156, 156, 157, 157, 158, 158, 159, // 40~49 + 160, 160, 160, 160, 161, 161, 161, 161, 162, 162, // 50~59 + 162, 163, 163, 163, 163, 164, 164, 164, 165, 165, // 60~69 + 165, 165, 166, 166, 166, 167, 168, 169, 170, 171, // 70~79 + 173, 174, 175, 176, 177, 179, 180, 181, 182, 183, // 80~89 + 185, 186, 187, 188, 189, 191, 192, 193, 194, 195, // 90~99 + 197 // 100 +}; + +CAudioAlsa::CAudioAlsa() +{ + int card_id; + card_id = get_aml_card(); + LOGD("[%s:%d] card_id:%d\n", __FUNCTION__, __LINE__, card_id); + mpMixer = mixer_open(card_id); + + card_id = get_USB_Audio_card(); + LOGD("[%s:%d] card_id:%d\n", __FUNCTION__, __LINE__, card_id); + mpUsbMixer = mixer_open(card_id); + mMainVolumeBalanceVal = 0; + mMainVolumeGainVal = 0; + mSupperBassVolumeGainVal = 0; + memcpy(mMainDigitLutBuf, MainDigitLutBuf, CC_VOL_TRANS_LUT_BUF_SIZE); + memcpy(mSupperBassDigitLutBuf, SupperBassDigitLutBuf, CC_VOL_TRANS_LUT_BUF_SIZE); +} + +CAudioAlsa::~CAudioAlsa() +{ + if (NULL != mpMixer) { + mixer_close(mpMixer); + } + + if (NULL != mpUsbMixer) { + mixer_close(mpUsbMixer); + } +} + +int CAudioAlsa::get_aml_card() +{ + int card = -1, err = 0; + int fd = -1; + char read_buf[512], *pd = NULL; + static const char *const SOUND_CARDS_PATH = "/proc/asound/cards"; + fd = open(SOUND_CARDS_PATH, O_RDONLY); + if (fd < 0) { + ALOGE("ERROR: failed to open config file %s error: %d\n", SOUND_CARDS_PATH, errno); + close(fd); + return -EINVAL; + } + memset(read_buf, 0x0, 512); + err = read(fd, read_buf, 512); + if (fd < 0) { + ALOGE("ERROR: failed to read config file %s error: %d\n", SOUND_CARDS_PATH, errno); + close(fd); + return -EINVAL; + } + pd = strstr(read_buf, "AML"); + card = *(pd - 3) - '0'; + close(fd); + return card; +} + +int CAudioAlsa::AudioControlSetValue(int val_count, int data_buf[], char *match_names) +{ + struct mixer_ctl *pctl; + unsigned int expected_val_count; + unsigned int value_index; + + if (NULL == mpMixer) { + LOGE("[%s:%d] Failed to open mixer\n", __FUNCTION__, __LINE__); + goto err_exit; + } + + pctl = mixer_get_ctl_by_name(mpMixer, match_names); + if (NULL == pctl) { + LOGE("[%s:%d] Failed to get mixer control for:%s\n", __FUNCTION__, __LINE__, match_names); + goto err_exit; + } + expected_val_count = mixer_ctl_get_num_values(pctl); + if (expected_val_count != (unsigned int)val_count) { + LOGE("[%s:%d] val_count != expected_val_count\n", __FUNCTION__, __LINE__); + goto err_exit; + } + for (value_index = 0; value_index < expected_val_count; value_index++) { + if (mixer_ctl_set_value(pctl, value_index, data_buf[value_index]) != 0) { + LOGE("[%s:%d] Failed to set value:%d\n", __FUNCTION__, __LINE__, value_index); + goto err_exit; + } + } + return 0; +err_exit: + return -1; +} + +int CAudioAlsa::AudioControlGetValue(int val_count, int ret_buf[], char *match_names) +{ + struct mixer_ctl *pctl; + unsigned int expected_val_count; + unsigned int value_index; + + if (NULL == mpMixer) { + LOGE("[%s:%d] Failed to open mixer\n", __FUNCTION__, __LINE__); + goto err_exit; + } + pctl = mixer_get_ctl_by_name(mpMixer, match_names); + if (NULL == pctl) { + LOGE("[%s:%d] Failed to get mixer control for:%s\n", __FUNCTION__, __LINE__, match_names); + goto err_exit; + } + expected_val_count = mixer_ctl_get_num_values(pctl); + if (expected_val_count != (unsigned int)val_count) { + LOGE("[%s:%d] val_count != expected_val_count\n", __FUNCTION__, __LINE__); + goto err_exit; + } + for (value_index = 0; value_index < expected_val_count; value_index++) { + ret_buf[value_index] = mixer_ctl_get_value(pctl, value_index); + } + return 0; +err_exit: + return -1; +} + +int CAudioAlsa::get_USB_Audio_card() +{ + int card = -1, err = 0; + int fd = -1; + char read_buf[512], *pd = NULL; + static const char *const SOUND_CARDS_PATH = "/proc/asound/cards"; + fd = open(SOUND_CARDS_PATH, O_RDONLY); + if (fd < 0) { + ALOGE("ERROR: failed to open config file %s error: %d\n", SOUND_CARDS_PATH, errno); + close(fd); + return -EINVAL; + } + memset(read_buf, 0x0, 512); + err = read(fd, read_buf, 512); + if (fd < 0) { + ALOGE("ERROR: failed to read config file %s error: %d\n", SOUND_CARDS_PATH, errno); + close(fd); + return -EINVAL; + } + pd = strstr(read_buf, "Receiver"); + if (pd == NULL) { + ALOGE("ERROR: failed to read config file %s error: %d\n", SOUND_CARDS_PATH, errno); + close(fd); + return -EINVAL; + } + + card = *(pd - 3) - '0'; + close(fd); + return card; +} + +int CAudioAlsa::HandleUSBAudioControlValue(int val_count, int data_buf[], int match_count, char **match_names) +{ + + struct mixer_ctl *pctl; + unsigned int expected_val_count; + unsigned int match_index; + unsigned int value_index; + char card_id_str[9] = {0}; + + if (NULL == mpUsbMixer) { + LOGE("[%s:%d] Failed to open mixer\n", __FUNCTION__, __LINE__); + goto err_exit; + } + + for (match_index = 0; match_index < match_count; match_index++) { + pctl = mixer_get_ctl_by_name(mpUsbMixer, match_names[match_index]); + if (NULL == pctl) { + LOGE("[%s:%d] Failed to get mixer control for:%s\n", __FUNCTION__, __LINE__, match_names[match_index]); + goto err_exit; + } + expected_val_count = mixer_ctl_get_num_values(pctl); + if (expected_val_count != (unsigned int)val_count) { + LOGE("[%s:%d] val_count != expected_val_count\n", __FUNCTION__, __LINE__); + goto err_exit; + } + for (value_index = 0; value_index < expected_val_count; value_index++) { + if (mixer_ctl_set_value(pctl, value_index, data_buf[value_index]) != 0) { + LOGE("[%s:%d] Failed to set value:%d\n", __FUNCTION__, __LINE__, value_index); + goto err_exit; + } + } + } + + return 0; +err_exit: + return -1; +} + +int CAudioAlsa::CheckVolume(int digit_vol, int digit_min, int digit_max, int hd_min, + int hd_max) +{ + int tmp_val = digit_vol; + + if (digit_vol < hd_min) { + return hd_min; + } else if (digit_vol > hd_max) { + return hd_max; + } + + return digit_vol; +} + +int CAudioAlsa::GetTwoChannelVolume(int vol_buf[], int l_min_vol, int l_max_vol, + int r_min_vol, int r_max_vol, char *match_names, int hd_min, + int hd_max) +{ + vol_buf[0] = 0; + vol_buf[1] = 0; + return AudioControlGetValue(2, vol_buf, match_names); +} + +int CAudioAlsa::GetLineInMaxVol() +{ + if (GetAudioArchitectureTypeCFG() == CC_DAC_M6C_EXTERNAL_DAC_ON_BOARD) { + return 84; + } + + return 127; +} + +int CAudioAlsa::GetLineOutMaxVol() +{ + if (GetAudioArchitectureTypeCFG() == CC_DAC_M6C_EXTERNAL_DAC_ON_BOARD) { + return 84; + } + + return 255; +} + +#define CC_GET_ALSA_CTL_AUDIO_IN_SOURCE_NAME (0) +#define CC_GET_ALSA_CTL_INTERNAL_DAC_LEFT_LINEIN_SEL_NAME (1) +#define CC_GET_ALSA_CTL_INTERNAL_DAC_RIGHT_LINEIN_SEL_NAME (2) +#define CC_GET_ALSA_CTL_INTERNAL_DAC_LINEIN_CAPTURE_VOLUME_NAME (3) +#define CC_GET_ALSA_CTL_INTERNAL_DAC_LINEOUT_PLAYBACK_VOLUME_NAME (4) +#define CC_GET_ALSA_CTL_I2S_MUTE_NAME (5) +#define CC_GET_ALSA_CTL_SPDIF_MUTE_NAME (6) +#define CC_GET_ALSA_CTL_HW_RESAMPLE_NAME (7) +#define CC_GET_ALSA_CTL_EXTERNAL_DAC_MASTER_VOLUME_NAME (8) +#define CC_GET_ALSA_CTL_EXTERNAL_DAC_CH1_VOLUME_NAME (9) +#define CC_GET_ALSA_CTL_EXTERNAL_DAC_CH2_VOLUME_NAME (10) +#define CC_GET_ALSA_CTL_EXTERNAL_DAC_CH3_VOLUME_NAME (11) +#define CC_GET_ALSA_CTL_EXTERNAL_DAC_CH1_SWITCH_NAME (12) +#define CC_GET_ALSA_CTL_EXTERNAL_DAC_CH2_SWITCH_NAME (13) +#define CC_GET_ALSA_CTL_EXTERNAL_DAC_CH3_SWITCH_NAME (14) +#define CC_GET_ALSA_CTL_EXTERNAL_DAC_EQ_MODE_NAME (15) +#define CC_GET_ALSA_CTL_PCM_PLAYBACK_VOLUME (16) +#define CC_GET_ALSA_CTL_PCM_PLAYBACK_SWITCH (17) +#define CC_GET_ALSA_CTL_SETOUTPUT_SWAP (18) +#define CC_GET_ALSA_CTL_AUDIO_IN_SWITCH (19) + +static char gG9AlsaNames[32][48] = { + {"Audio In Source"},//0 + {"Linein right switch"},//1 + {"Linein left switch"}, + {"ADC Digital Capture Volume"}, + {"DAC Digital Playback Volume"}, + {"Audio i2s mute"},//5 + {"Audio spdif mute"}, + {"Hardware resample enable"},//8 + {"AMP Master Volume"}, + {"AMP Ch1 Volume"},//10 + {"AMP Ch2 Volume"}, + {"AMP Ch3 Volume"}, + {"AMP Ch1 Switch"}, + {"AMP Ch2 Switch"}, + {"AMP Ch3 Switch"},//15 + {"AMP EQ Mode"}, + {"PCM Playback Volume"}, + {"PCM Playback Switch"}, + {"Output Swap"}, + {"AudioIn Switch"},//19 +}; + + +char *CAudioAlsa::GetAlsaControlName(int get_type) +{ + if (GetAudioArchitectureTypeCFG() == CC_DAC_M6C_EXTERNAL_DAC_ON_BOARD) { + /*if(get_type == CC_GET_ALSA_CTL_AUDIO_IN_SOURCE_NAME) { + return gAudioInSourceNameBuf; + } else if(get_type == CC_GET_ALSA_CTL_INTERNAL_DAC_LEFT_LINEIN_SEL_NAME) { + strcpy(gInternalDacLeftLineInSelNameBuf, "Left LINEIN Select"); + return gInternalDacLeftLineInSelNameBuf; + } else if(get_type == CC_GET_ALSA_CTL_INTERNAL_DAC_RIGHT_LINEIN_SEL_NAME) { + strcpy(gInternalDacRightLineInSelNameBuf, "Right LINEIN Select"); + return gInternalDacRightLineInSelNameBuf; + } else if (get_type == CC_GET_ALSA_CTL_INTERNAL_DAC_LINEIN_CAPTURE_VOLUME_NAME) { + strcpy(gInternalDacLineInCaptureVolumeNameBuf, "LINEIN Capture Volume"); + return gInternalDacLineInCaptureVolumeNameBuf; + } else if (get_type == CC_GET_ALSA_CTL_INTERNAL_DAC_LINEOUT_PLAYBACK_VOLUME_NAME) { + strcpy(gInternalDacLineOutCaptureVolumeNameBuf, "LINEOUT Playback Volume"); + return gInternalDacLineOutCaptureVolumeNameBuf; + } else if(get_type == CC_GET_ALSA_CTL_I2S_MUTE_NAME) { + strcpy(gI2SMuteNameBuf, "Audio i2s mute"); + return gI2SMuteNameBuf; + } else if(get_type == CC_GET_ALSA_CTL_SPDIF_MUTE_NAME) { + strcpy(gSpdifMuteNameBuf, "Audio spdif mute"); + return gSpdifMuteNameBuf; + } else if(get_type == CC_GET_ALSA_CTL_HW_RESAMPLE_NAME) { + strcpy(gHWResampleNameBuf, "Hardware resample enable"); + return gHWResampleNameBuf; + } else if(get_type == CC_GET_ALSA_CTL_EXTERNAL_DAC_MASTER_VOLUME_NAME) { + strcpy(gExternalDacMasterVolumeNameBuf, "AMP Master Volume"); + return gExternalDacMasterVolumeNameBuf; + } else if(get_type == CC_GET_ALSA_CTL_EXTERNAL_DAC_CH1_VOLUME_NAME) { + strcpy(gExternalDacCh1VolumeNameBuf, "AMP Ch1 Volume"); + return gExternalDacCh1VolumeNameBuf; + } else if(get_type == CC_GET_ALSA_CTL_EXTERNAL_DAC_CH2_VOLUME_NAME) { + strcpy(gExternalDacCh2VolumeNameBuf, "AMP Ch2 Volume"); + return gExternalDacCh2VolumeNameBuf; + } else if(get_type == CC_GET_ALSA_CTL_EXTERNAL_DAC_CH3_VOLUME_NAME) { + strcpy(gExternalDacCh3VolumeNameBuf, "AMP Ch3 Volume"); + return gExternalDacCh3VolumeNameBuf; + } else if(get_type == CC_GET_ALSA_CTL_EXTERNAL_DAC_CH1_SWITCH_NAME) { + strcpy(gExternalDacCh1SwitchNameBuf, "AMP Ch1 Switch"); + return gExternalDacCh1SwitchNameBuf; + } else if(get_type == CC_GET_ALSA_CTL_EXTERNAL_DAC_CH2_SWITCH_NAME) { + strcpy(gExternalDacCh2SwitchNameBuf, "AMP Ch2 Switch"); + return gExternalDacCh2SwitchNameBuf; + } else if(get_type == CC_GET_ALSA_CTL_EXTERNAL_DAC_CH3_SWITCH_NAME) { + strcpy(gExternalDacCh3SwitchNameBuf, "AMP Ch3 Switch"); + return gExternalDacCh3SwitchNameBuf; + } else if(get_type == CC_GET_ALSA_CTL_EXTERNAL_DAC_EQ_MODE_NAME) { + strcpy(gExternalDacEQModeNameBuf, "AMP EQ Mode"); + return gExternalDacEQModeNameBuf; + }*/ + } else { + return gG9AlsaNames[get_type]; + } + + return NULL; +} + +int gAudioInSource = -1; + +int CAudioAlsa::SetAudioInSource(int source_type) +{ + int set_val = 0; + char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_AUDIO_IN_SOURCE_NAME); + + if (GetAudioArchitectureTypeCFG() == CC_DAC_M6C_EXTERNAL_DAC_ON_BOARD) { + if (source_type != 0 && source_type != 1) { + return -1; + } + + if (source_type == CC_AUDIO_IN_SOURCE_LINEIN) { + set_val = 0; + } else if (source_type == CC_AUDIO_IN_SOURCE_HDMI) { + set_val = 1; + } + } else { + if (source_type != 0 && source_type != 1 && source_type != 2) { + return -1; + } + + set_val = source_type; + } + + gAudioInSource = set_val; + + return AudioControlSetValue(1, &set_val, match_names); +} + +int CAudioAlsa::GetAudioInSource(void) +{ + char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_AUDIO_IN_SOURCE_NAME); + int source_type = 0; + + source_type = gAudioInSource; + if (source_type == -1) { + AudioControlGetValue(1, &source_type, match_names); + } + + return source_type; +} + +int CAudioAlsa::SetInternalDacLineInSelectChannel(int line_in_number) +{ + int tmp_ret = 0; + char *match_names = NULL; + + if (line_in_number < 0 || line_in_number > 7) { + return -1; + } + + match_names = GetAlsaControlName(CC_GET_ALSA_CTL_INTERNAL_DAC_LEFT_LINEIN_SEL_NAME); + tmp_ret |= AudioControlSetValue(1, &line_in_number, match_names); + + match_names = GetAlsaControlName(CC_GET_ALSA_CTL_INTERNAL_DAC_RIGHT_LINEIN_SEL_NAME); + tmp_ret |= AudioControlSetValue(1, &line_in_number, match_names); + + return tmp_ret; +} + +int CAudioAlsa::SetInternalDacLineInCaptureVolume(int l_vol, int r_vol) +{ + int max_val = GetLineInMaxVol(); + char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_INTERNAL_DAC_LINEIN_CAPTURE_VOLUME_NAME); + int VolumeBuf[2]; + + VolumeBuf[0] = CheckVolume(l_vol, 0, max_val, 0, max_val); + VolumeBuf[1] = CheckVolume(r_vol, 0, max_val, 0, max_val); + + return AudioControlSetValue(2, VolumeBuf, match_names); +} + +int CAudioAlsa::GetInternalDacLineInCaptureVolume(int vol_buf[]) +{ + int max_val = GetLineInMaxVol(); + char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_INTERNAL_DAC_LINEIN_CAPTURE_VOLUME_NAME); + + return GetTwoChannelVolume(vol_buf, 0, max_val, 0, max_val, match_names, 0, max_val); +} + +int CAudioAlsa::SetInternalDacLineOutPlayBackVolume(int l_vol, int r_vol) +{ + int max_val = GetLineOutMaxVol(); + char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_INTERNAL_DAC_LINEOUT_PLAYBACK_VOLUME_NAME); + int VolumeBuf[2]; + + VolumeBuf[0] = CheckVolume(l_vol, 0, max_val, 0, max_val); + VolumeBuf[1] = CheckVolume(r_vol, 0, max_val, 0, max_val); + + return AudioControlSetValue(2, VolumeBuf, match_names); +} + +int CAudioAlsa::GetInternalDacLineOutPlayBackVolume(int vol_buf[]) +{ + int max_val = GetLineOutMaxVol(); + char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_INTERNAL_DAC_LINEOUT_PLAYBACK_VOLUME_NAME); + + return GetTwoChannelVolume(vol_buf, 0, max_val, 0, max_val, match_names, 0, max_val); +} + +int CAudioAlsa::SetAudioPcmPlaybackVolume(int vol) +{ + if (get_USB_Audio_card() == -EINVAL) return 0; + char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_PCM_PLAYBACK_VOLUME); + return HandleUSBAudioControlValue(1, &vol, 1, &match_names); +} + +int CAudioAlsa::SetAudioPcmPlaybackSwitch(int vol) +{ + if (get_USB_Audio_card() == -EINVAL) return 0; + char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_PCM_PLAYBACK_SWITCH); + return HandleUSBAudioControlValue(1, &vol, 1, &match_names); +} + +int CAudioAlsa::SetExternalDacChannelSwitch(int chan_ind, int switch_val) +{ + char *match_names = NULL; + + if (chan_ind == 1) { + match_names = GetAlsaControlName(CC_GET_ALSA_CTL_EXTERNAL_DAC_CH1_SWITCH_NAME); + } else if (chan_ind == 2) { + match_names = GetAlsaControlName(CC_GET_ALSA_CTL_EXTERNAL_DAC_CH2_SWITCH_NAME); + } else if (chan_ind == 3) { + match_names = GetAlsaControlName(CC_GET_ALSA_CTL_EXTERNAL_DAC_CH3_SWITCH_NAME); + } else { + return -1; + } + + return AudioControlSetValue(1, &switch_val, match_names); +} + +int CAudioAlsa::SetExternalDacChannelVolume(int chan_ind, int main_vol) +{ + int tmp_ret = 0; + char *match_names = NULL; + + if (chan_ind == 0) { + match_names = GetAlsaControlName(CC_GET_ALSA_CTL_EXTERNAL_DAC_MASTER_VOLUME_NAME); + } else if (chan_ind == 1) { + match_names = GetAlsaControlName(CC_GET_ALSA_CTL_EXTERNAL_DAC_CH1_VOLUME_NAME); + } else if (chan_ind == 2) { + match_names = GetAlsaControlName(CC_GET_ALSA_CTL_EXTERNAL_DAC_CH2_VOLUME_NAME); + } else if (chan_ind == 3) { + match_names = GetAlsaControlName(CC_GET_ALSA_CTL_EXTERNAL_DAC_CH3_VOLUME_NAME); + } else { + return -1; + } + + return AudioControlSetValue(1, &main_vol, match_names); +} +int CAudioAlsa::SetAudioSwitchIO(int value) +{ + char *match_names = gG9AlsaNames[CC_GET_ALSA_CTL_AUDIO_IN_SWITCH]; + + return AudioControlSetValue(1, &value, match_names); +} +int CAudioAlsa::SetOutput_Swap(int value) +{ + char *match_names = gG9AlsaNames[CC_GET_ALSA_CTL_SETOUTPUT_SWAP]; + + return AudioControlSetValue(1, &value, match_names); +} + +int CAudioAlsa::SetExternalDacEQMode(int mode_val) +{ + char *match_names = NULL; + + match_names = GetAlsaControlName(CC_GET_ALSA_CTL_EXTERNAL_DAC_EQ_MODE_NAME); + return AudioControlSetValue(1, &mode_val, match_names); +} + +int CAudioAlsa::SetI2SMute(int mute_status) +{ + char *match_names = NULL; + + if (mute_status != CC_I2S_MUTE_ON && mute_status != CC_I2S_MUTE_OFF) { + LOGE("%s, I2S mute value (%d) error!\n", __FUNCTION__, mute_status); + return -1; + } + + match_names = GetAlsaControlName(CC_GET_ALSA_CTL_I2S_MUTE_NAME); + return AudioControlSetValue(1, &mute_status, match_names); +} + +int CAudioAlsa::SetSPDIFMute(int mute_status) +{ + char *match_names = NULL; + + match_names = GetAlsaControlName(CC_GET_ALSA_CTL_SPDIF_MUTE_NAME); + return AudioControlSetValue(1, &mute_status, match_names); +} + +#define CC_SAMPLE_BUF_SIZE (32) + +enum CC_HW_RESAMPLE_TYPE { + CC_HW_RESAMPLE_DISABLE, + CC_HW_RESAMPLE_48K, + CC_HW_RESAMPLE_44K, + CC_HW_RESAMPLE_32K, +}; + +int CAudioAlsa::SetHardwareResample(int sr) +{ + int i = 0, set_val = 0, tmp_val = 0; + int diff_val = 0x7FFFFFFF, diff_ind = -1; + char *match_names = NULL; + int sample_buf[CC_SAMPLE_BUF_SIZE] = {48000, 44000, 32000, -1}; + + if (sr < 0) { + set_val = 0; + } else { + for (i = 0; i < CC_SAMPLE_BUF_SIZE; i++) { + if (sample_buf[i] < 0) { + break; + } + + if (sample_buf[i] >= sr) { + tmp_val = sample_buf[i] - sr; + } else { + tmp_val = sr - sample_buf[i]; + } + + if (tmp_val <= diff_val) { + diff_val = tmp_val; + diff_ind = i; + } + } + + if (diff_ind < 0) { + set_val = 0; + } else { + set_val = diff_ind + 1; + } + } + + LOGD("%s, set_val = %d.\n", __FUNCTION__, set_val); + match_names = GetAlsaControlName(CC_GET_ALSA_CTL_HW_RESAMPLE_NAME); + return AudioControlSetValue(1, &set_val, match_names); +} + +int CAudioAlsa::SetMixerBypassSwitch(int switch_val) +{ + char match_names[48] = "Output Mixer Bypass Switch" ; + int ctl_buf[2]; + + if (switch_val != 0 && switch_val != 1) { + return -1; + } + + ctl_buf[0] = switch_val; + ctl_buf[1] = switch_val; + + return AudioControlSetValue(2, ctl_buf, match_names); +} + +int CAudioAlsa::GetMixerBypassSwitch(void) +{ + char match_names[48] = "Output Mixer Bypass Switch" ; + int ctl_buf[2]; + + AudioControlSetValue(2, ctl_buf, match_names); + + return ctl_buf[0]; +} + +int CAudioAlsa::SetMixerDacSwitch(int switch_val) +{ + char match_names[48] = "Output Mixer DAC Switch" ; + int ctl_buf[2]; + + if (switch_val != 0 && switch_val != 1) { + return -1; + } + + ctl_buf[0] = switch_val; + ctl_buf[1] = switch_val; + + return AudioControlSetValue(2, ctl_buf, match_names); +} + +int CAudioAlsa::GetMixerDacSwitch(void) +{ + char *match_names = "Output Mixer DAC Switch" ; + int ctl_buf[2]; + + AudioControlGetValue(2, ctl_buf, match_names); + + return ctl_buf[0]; +} + +int CAudioAlsa::TransVolumeBarVolToDigitalVol(int digit_lut_buf[], int digit_vol, + int digit_min, int digit_max, int hd_min, int hd_max) +{ + if (digit_vol >= CC_VOL_TRANS_LUT_BUF_SIZE) { + return digit_lut_buf[CC_VOL_TRANS_LUT_BUF_SIZE - 1]; + } else if (digit_vol < 0) { + return digit_lut_buf[CC_VOL_TRANS_LUT_BUF_SIZE - 1]; + } + + return digit_lut_buf[digit_vol]; +} + +int CAudioAlsa::TransDigitalVolToVolumeBarVol(int digit_lut_buf[], int hd_vol, int hd_min, + int hd_max, int digit_min, int digit_max) +{ + int i; + + for (i = 0; i < CC_VOL_TRANS_LUT_BUF_SIZE; i++) { + if (digit_lut_buf[i] == hd_vol) + break; + } + + if (i < CC_VOL_TRANS_LUT_BUF_SIZE) + return i; + + for (i = 0; i < CC_VOL_TRANS_LUT_BUF_SIZE - 1; i++) { + if (digit_lut_buf[i] > hd_vol && digit_lut_buf[i + 1] < hd_vol) + break; + } + + if (i < CC_VOL_TRANS_LUT_BUF_SIZE - 1) + return i; + + return digit_max; +} + +void CAudioAlsa::SetMainVolDigitLutBuf(int digit_lut_buf[]) +{ + memcpy((void *) mMainDigitLutBuf, digit_lut_buf, + CC_VOL_TRANS_LUT_BUF_SIZE * sizeof(int)); +} + +void CAudioAlsa::SetSupperBassVolDigitLutBuf(int digit_lut_buf[]) +{ + memcpy((void *) mSupperBassDigitLutBuf, digit_lut_buf, + CC_VOL_TRANS_LUT_BUF_SIZE * sizeof(int)); +} + +int CAudioAlsa::SetDacMute(int mute_state, int mute_type) +{ + int tmp_ret = 0; + + if (mute_type & CC_DAC_MUTE_TYPE_INTERNAL) { + tmp_ret |= SetInternalDacMute(mute_state); + } + + if (mute_type & CC_DAC_MUTE_TYPE_EXTERNAL) { + tmp_ret |= SetExternalDacMute(mute_state); + setAudioPcmPlaybackMute(mute_state); + } + + return tmp_ret; +} + +int CAudioAlsa::SetDacMainVolume(int main_vol) +{ + int tmp_ret = 0; + int aud_arch_type = GetAudioArchitectureTypeCFG(); + + if (aud_arch_type == CC_DAC_T866_INTERNAL_DAC) { + tmp_ret = SetInternalDacMainVolume(main_vol); + } else { + tmp_ret = SetExternalDacMainVolume(main_vol); + } + + return tmp_ret; +} + +int CAudioAlsa::SetDacSupperBassVolume(int tmp_vol) +{ + int aud_arch_type = GetAudioArchitectureTypeCFG(); + + if (aud_arch_type == CC_DAC_T866_INTERNAL_DAC) { + return 0; + } + + return SetExternalDacSupperBassVolume(tmp_vol); +} + +int CAudioAlsa::SetDacEQMode(int mode_val) +{ + int aud_arch_type = GetAudioArchitectureTypeCFG(); + + if (aud_arch_type == CC_DAC_T866_INTERNAL_DAC) { + return 0; + } + + return SetExternalDacEQ(mode_val); +} + +int CAudioAlsa::SetBalanceValue(int balance_val) +{ + int tmp_val = 0; + int aud_arch_type = GetAudioArchitectureTypeCFG(); + + tmp_val = mMainVolumeBalanceVal; + mMainVolumeBalanceVal = balance_val; + + if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_FBC) { + SendCmdToOffBoardFBCExternalDac(AUDIO_CMD_SET_BALANCE, balance_val); + return 0; + } else if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_CUSTOMER_LIB) { + SendCmdToOffBoardCustomerLibExternalDac(AUDIO_CMD_SET_BALANCE, balance_val); + return 0; + } + + return -1; +} + +int CAudioAlsa::GetBalanceValue() +{ + int tmp_val = 0; + tmp_val = mMainVolumeBalanceVal; + return tmp_val; +} + +int CAudioAlsa::SetMainVolumeGain(int gain_val) +{ + int tmp_val = 0; + tmp_val = mMainVolumeGainVal; + mMainVolumeGainVal = gain_val; + return tmp_val; +} + +int CAudioAlsa::GetMainVolumeGain() +{ + int tmp_val = 0; + tmp_val = mMainVolumeGainVal; + return tmp_val; +} + +int CAudioAlsa::SetSupperBassVolumeGain(int gain_val) +{ + int tmp_val = 0; + tmp_val = mSupperBassVolumeGainVal; + mSupperBassVolumeGainVal = gain_val; + return tmp_val; +} + +int CAudioAlsa::GetSupperBassVolumeGain() +{ + int tmp_val = 0; + tmp_val = mSupperBassVolumeGainVal; + return tmp_val; +} + +int CAudioAlsa::SetDacAudioSourceType(int source_type) +{ + int aud_arch_type = GetAudioArchitectureTypeCFG(); + + if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_ON_BOARD || aud_arch_type == CC_DAC_M6C_EXTERNAL_DAC_ON_BOARD) { + } else if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_FBC) { + SendCmdToOffBoardFBCExternalDac(AUDIO_CMD_SET_SOURCE, source_type); + } else if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_CUSTOMER_LIB) { + SendCmdToOffBoardCustomerLibExternalDac(AUDIO_CMD_SET_SOURCE, source_type); + } else if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_DIGITAL) { + } + + return 0; +} + +int CAudioAlsa::CalculateBalanceVol(int max_vol, int balance_val, int vol_buf[]) +{ + int bal_mid_vol = 0, bal_cal_len = 0; + int tmp_val = 0; + + if (balance_val < CC_MIN_SOUND_BALANCE_VAL + || balance_val > CC_MAX_SOUND_BALANCE_VAL) { + return -1; + } + + vol_buf[0] = max_vol; + vol_buf[1] = max_vol; + + bal_mid_vol = (CC_MIN_SOUND_BALANCE_VAL + CC_MAX_SOUND_BALANCE_VAL) / 2; + bal_cal_len = (CC_MAX_SOUND_BALANCE_VAL - CC_MIN_SOUND_BALANCE_VAL) / 2; + + if (balance_val == bal_mid_vol) { + LOGD( + "%s, balance value = %d, bal_mid_vol = %d, vol_buf[0] = %d, vol_buf[1] = %d.\n", + __FUNCTION__, balance_val, bal_mid_vol, vol_buf[0], vol_buf[1]); + return 0; + } else if (balance_val < bal_mid_vol) { + vol_buf[1] = (bal_cal_len - (bal_mid_vol - balance_val)) * max_vol / bal_cal_len; + } else if (balance_val > bal_mid_vol) { + vol_buf[0] = (bal_cal_len - (balance_val - bal_mid_vol)) * max_vol / bal_cal_len; + } + + if (GetAudioAmplifierBalanceExchangeCFG() != 0) { + tmp_val = vol_buf[0]; + vol_buf[0] = vol_buf[1]; + vol_buf[1] = tmp_val; + } + + LOGD( + "%s, balance value = %d, bal_mid_vol = %d, vol_buf[0] = %d, vol_buf[1] = %d.\n", + __FUNCTION__, balance_val, bal_mid_vol, vol_buf[0], vol_buf[1]); + return 0; +} + +int CAudioAlsa::SetExternalDacMute(int mute_state) +{ + int tmp_ret = 0; + int aud_arch_type = GetAudioArchitectureTypeCFG(); + + if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_ON_BOARD || aud_arch_type == CC_DAC_M6C_EXTERNAL_DAC_ON_BOARD) { + SetExternalDacChannelSwitch(1, mute_state); + SetExternalDacChannelSwitch(2, mute_state); + + if (GetAudioSupperBassModuleDisableCFG() == 0) { + SetExternalDacChannelSwitch(3, mute_state); + } + } else if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_FBC) { + SendCmdToOffBoardFBCExternalDac(AUDIO_CMD_SET_MUTE, mute_state); + } else if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_CUSTOMER_LIB) { + SendCmdToOffBoardCustomerLibExternalDac(AUDIO_CMD_SET_MUTE, mute_state); + } else if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_DIGITAL) { + SetDigitalMute(mute_state); + } + + return tmp_ret; +} + +int CAudioAlsa::SetInternalDacMute(int mute_state) +{ + return 0; +} + +int CAudioAlsa::setAudioPcmPlaybackMute(int mute_state) +{ + const char *value; + char prop[256]; + value = config_get_str ( "TV", "tvin.2d4G.headset.en", "null" ); + property_get("audio.output.double_output", prop, "null"); + if ( strcmp ( value, "enable" ) == 0 && (strcmp(prop, "0") == 0 || strcmp(prop, "null") == 0)) { + SetAudioPcmPlaybackSwitch(mute_state); + } + return 0; +} + +int CAudioAlsa::SetExternalDacMainVolume(int main_vol) +{ + int tmp_ret = 0; + int aud_arch_type = GetAudioArchitectureTypeCFG(); + + if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_ON_BOARD || aud_arch_type == CC_DAC_M6C_EXTERNAL_DAC_ON_BOARD) { + int digit_vol = 0; + int vol_gain_val = 0; + int balance_val = 0, vol_buf[2] = {0, 0}; + + //handle l&r channel volume for balance + balance_val = GetBalanceValue(); + CalculateBalanceVol(255, balance_val, vol_buf); + + tmp_ret |= SetExternalDacChannelVolume(1, vol_buf[0]); + tmp_ret |= SetExternalDacChannelVolume(2, vol_buf[1]); + + //handle master channel volume + digit_vol = TransVolumeBarVolToDigitalVol(mMainDigitLutBuf, main_vol, + 0, 100, CC_MIN_DAC_VOLUME, CC_MAX_DAC_VOLUME); + + vol_gain_val = GetMainVolumeGain(); + digit_vol += vol_gain_val; + if (digit_vol < CC_MIN_DAC_VOLUME) { + digit_vol = CC_MIN_DAC_VOLUME; + } else if (digit_vol > CC_MAX_DAC_VOLUME) { + digit_vol = CC_MAX_DAC_VOLUME; + } + tmp_ret |= SetExternalDacChannelVolume(0, digit_vol); + } else if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_FBC) { + tmp_ret = SendCmdToOffBoardFBCExternalDac(AUDIO_CMD_SET_VOLUME_BAR, main_vol); + } else if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_CUSTOMER_LIB) { + tmp_ret = SendCmdToOffBoardCustomerLibExternalDac(AUDIO_CMD_SET_VOLUME_BAR, main_vol); + } else if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_DIGITAL) { + tmp_ret = SetDigitalMainVolume(main_vol); + } + + return tmp_ret; +} + +int CAudioAlsa::SetInternalDacMainVolume(int main_vol) +{ + int tmp_ret = 0, digit_vol = 0; + int aud_arch_type = GetAudioArchitectureTypeCFG(); + + if (aud_arch_type == CC_DAC_T866_INTERNAL_DAC) { + digit_vol = TransVolumeBarVolToDigitalVol(mMainDigitLutBuf, main_vol, + 0, 100, CC_MIN_DAC_VOLUME, CC_MAX_DAC_VOLUME); + + if (digit_vol < CC_MIN_DAC_VOLUME) { + digit_vol = CC_MIN_DAC_VOLUME; + } else if (digit_vol > CC_MAX_DAC_VOLUME) { + digit_vol = CC_MAX_DAC_VOLUME; + } + + return SetInternalDacLineOutPlayBackVolume(digit_vol, digit_vol); + } + + return 0; +} + +int CAudioAlsa::SetExternalDacSupperBassVolume(int tmp_vol) +{ + int tmp_ret = 0; + int aud_arch_type = GetAudioArchitectureTypeCFG(); + + if (GetAudioSupperBassModuleDisableCFG() != 0) { + return 0; + } + + if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_ON_BOARD || aud_arch_type == CC_DAC_M6C_EXTERNAL_DAC_ON_BOARD) { + int digit_vol = 0; + int vol_gain_val = 0; + + digit_vol = TransVolumeBarVolToDigitalVol(mMainDigitLutBuf, tmp_vol, + 0, 100, CC_MIN_DAC_SUB_WOOFER_VOLUME, + CC_MAX_DAC_SUB_WOOFER_VOLUME); + + vol_gain_val = GetSupperBassVolumeGain(); + digit_vol += vol_gain_val; + if (digit_vol < CC_MIN_DAC_SUB_WOOFER_VOLUME) { + digit_vol = CC_MIN_DAC_SUB_WOOFER_VOLUME; + } else if (digit_vol > CC_MAX_DAC_SUB_WOOFER_VOLUME) { + digit_vol = CC_MAX_DAC_SUB_WOOFER_VOLUME; + } + + tmp_ret = SetExternalDacChannelVolume(3, digit_vol); + } else if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_FBC) { + tmp_ret = SendCmdToOffBoardFBCExternalDac(AUDIO_CMD_SET_SUBCHANNEL_VOLUME, tmp_vol); + } else if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_CUSTOMER_LIB) { + tmp_ret = SendCmdToOffBoardCustomerLibExternalDac(AUDIO_CMD_SET_SUBCHANNEL_VOLUME, tmp_vol); + } + + return tmp_ret; +} + +int CAudioAlsa::SetExternalDacEQ(int mode_val) +{ + int tmp_ret = 0; + int aud_arch_type = GetAudioArchitectureTypeCFG(); + + if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_ON_BOARD || aud_arch_type == CC_DAC_M6C_EXTERNAL_DAC_ON_BOARD) { + SetExternalDacEQMode(mode_val); + } else if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_FBC) { + SendCmdToOffBoardFBCExternalDac(AUDIO_CMD_SET_EQ_MODE, mode_val); + } else if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_CUSTOMER_LIB) { + SendCmdToOffBoardCustomerLibExternalDac(AUDIO_CMD_SET_EQ_MODE, mode_val); + } + + return tmp_ret; +} + +int (*HandleDacMute)(int mute_state); +int (*HandleDacMainVolume)(int vol); +int (*HandleDacBalance)(int balance_val); +int (*HandleAudioSourceType)(int source_type); + +static void *gExternalDacLibHandler = NULL; +int CAudioAlsa::LoadExternalDacLib(void) +{ + char *error; + + ALOGD("%s, entering...\n", __FUNCTION__); + + if (gExternalDacLibHandler != NULL) { + return 0; + } + + const char *config_value = config_get_str("TV", "audio.external.dac.libpath", "/system/lib/libdac.so"); + gExternalDacLibHandler = dlopen(config_value, RTLD_NOW); + if (!gExternalDacLibHandler) { + ALOGE("%s, failed to load external dac lib (%s)\n", __FUNCTION__, config_value); + goto Error; + } + + + HandleDacMute = (int(*)(int))dlsym(gExternalDacLibHandler, "HandleDacMute"); + if (HandleDacMute == NULL) { + ALOGE("%s, fail find fun HandleDacMute()\n", __FUNCTION__); + goto Error; + } + HandleDacMainVolume = (int(*)(int))dlsym(gExternalDacLibHandler, "HandleDacMainVolume"); + if (HandleDacMainVolume == NULL) { + ALOGE("%s, fail find fun HandleDacMainVolume()\n", __FUNCTION__); + goto Error; + } + HandleDacBalance = (int(*)(int))dlsym(gExternalDacLibHandler, "HandleDacBalance"); + if (HandleDacBalance == NULL) { + ALOGE("%s, fail find fun HandleDacBalance()\n", __FUNCTION__); + goto Error; + } + HandleAudioSourceType = (int(*)(int))dlsym(gExternalDacLibHandler, "HandleAudioSourceType"); + if (HandleAudioSourceType == NULL) { + ALOGE("%s, fail find fun HandleAudioSourceType()\n", __FUNCTION__); + goto Error; + } + + return 0; + +Error: // + HandleDacMute = NULL; + HandleDacMainVolume = NULL; + HandleDacBalance = NULL; + HandleAudioSourceType = NULL; + + if (gExternalDacLibHandler != NULL) { + dlclose(gExternalDacLibHandler); + gExternalDacLibHandler = NULL; + } + return -1; +} + +int CAudioAlsa::SendCmdToOffBoardCustomerLibExternalDac(int cmd, int para) +{ + LoadExternalDacLib(); + if (gExternalDacLibHandler != NULL) { + if (cmd == AUDIO_CMD_SET_MUTE) { + if (HandleDacMute != NULL) { + LOGD("%s, call external dac lib HandleDacMute (para = %d).\n", __FUNCTION__, para); + return (*HandleDacMute)(para); + } + } else if (cmd == AUDIO_CMD_SET_VOLUME_BAR) { + if (HandleDacMainVolume != NULL) { + LOGD("%s, call external dac lib HandleDacMainVolume (para = %d).\n", __FUNCTION__, para); + return (*HandleDacMainVolume)(para); + } + } else if (cmd == AUDIO_CMD_SET_BALANCE) { + if (HandleDacBalance != NULL) { + LOGD("%s, call external dac lib HandleDacBalance (para = %d).\n", __FUNCTION__, para); + return (*HandleDacBalance)(para); + } + } else if (cmd == AUDIO_CMD_SET_SOURCE) { + if (HandleAudioSourceType != NULL) { + LOGD("%s, call external dac lib HandleAudioSourceType (para = %d).\n", __FUNCTION__, para); + return (*HandleAudioSourceType)(para); + } + } + } + + return 0; +} + +int CAudioAlsa::SendCmdToOffBoardFBCExternalDac(int cmd, int para) +{ + CFbcCommunication *pFBC = GetSingletonFBC(); + if (pFBC != NULL) { + if (cmd == AUDIO_CMD_SET_MUTE) { + int fbc_mute = 0;//0 is mute,1 is unmute + if (para == CC_AUDIO_MUTE) { + fbc_mute = 0; + } else { + fbc_mute = 1; + } + //int fbcIsBute; + //pFBC->cfbc_Get_Mute(COMM_DEV_SERIAL, &fbcIsBute); + //LOGD("fbc is mute = %d", fbcIsBute); + return pFBC->cfbc_Set_Mute(COMM_DEV_SERIAL, fbc_mute); + } else if (cmd == AUDIO_CMD_SET_VOLUME_BAR) { + LOGD("%s, send AUDIO_CMD_SET_VOLUME_BAR (para = %d) to fbc.\n", __FUNCTION__, para); + return pFBC->cfbc_Set_Volume_Bar(COMM_DEV_SERIAL, para); + } else if (cmd == AUDIO_CMD_SET_BALANCE) { + LOGD("%s, send AUDIO_CMD_SET_BALANCE (para = %d) to fbc.\n", __FUNCTION__, para); + return pFBC->cfbc_Set_Balance(COMM_DEV_SERIAL, para); + } else if (cmd == AUDIO_CMD_SET_SOURCE) { + LOGD("%s, send AUDIO_CMD_SET_SOURCE (para = %d) to fbc.\n", __FUNCTION__, para); + return pFBC->cfbc_Set_FBC_Audio_Source(COMM_DEV_SERIAL, para); + } + } + + return 0; +} + +static int gDigitalMuteStatus = CC_AUDIO_UNMUTE; +static int gDigitalLeftVol = 0; +static int gDigitalRightVol = 0; + +int CAudioAlsa::HandleDigitalVolume(int l_val, int r_val) +{ + amAudioSetLeftGain(l_val); + amAudioSetRightGain(r_val); + + amAudioSetAndroidVolumeEnable(1); + amAudioSetAndroidVolume(l_val, r_val); + + LOGD("%s, l_val = %d, r_val = %d.\n", __FUNCTION__, l_val, r_val); + return 0; +} + +int CAudioAlsa::HandleDigitalMute(int mute_status) +{ + if (mute_status == CC_AUDIO_MUTE) { + HandleDigitalVolume(0, 0); + } else if (mute_status == CC_AUDIO_UNMUTE) { + HandleDigitalVolume(gDigitalLeftVol, gDigitalRightVol); + } + + return 0; +} + +int CAudioAlsa::SetDigitalMainVolume(int main_vol) +{ + int tmp_ret = 0, l_val = 0, r_val = 0; + int balance_val = 0, vol_buf[2] = {0, 0}; + + //handle l&r channel volume for balance + balance_val = GetBalanceValue(); + CalculateBalanceVol(main_vol, balance_val, vol_buf); + + //handle master channel volume + l_val = TransVolumeBarVolToDigitalVol(mMainDigitLutBuf, vol_buf[0], + 0, 100, CC_MIN_DAC_VOLUME, CC_MAX_DAC_VOLUME); + r_val = TransVolumeBarVolToDigitalVol(mMainDigitLutBuf, vol_buf[1], + 0, 100, CC_MIN_DAC_VOLUME, CC_MAX_DAC_VOLUME); + + gDigitalLeftVol = l_val; + gDigitalRightVol = r_val; + if (gDigitalMuteStatus == CC_AUDIO_UNMUTE) { + HandleDigitalVolume(l_val, r_val); + } + + return tmp_ret; +} + +int CAudioAlsa::SetDigitalMute(int mute_status) +{ + if (mute_status == CC_AUDIO_MUTE || mute_status == CC_AUDIO_UNMUTE) { + gDigitalMuteStatus = mute_status; + return HandleDigitalMute(mute_status); + } + + return 0; +} + diff --git a/tvapi/libtv/audio/audio_alsa.h b/tvapi/libtv/audio/audio_alsa.h new file mode 100644 index 0000000..6d85645 --- a/dev/null +++ b/tvapi/libtv/audio/audio_alsa.h @@ -0,0 +1,131 @@ +#ifndef __TV_AUDIO_ALSA_H__ +#define __TV_AUDIO_ALSA_H__ + +enum CC_AUD_I2S_MUTE { + CC_I2S_MUTE_OFF, + CC_I2S_MUTE_ON, +}; + +enum CC_AUD_SPDIF_MUTE { + CC_SPDIF_MUTE_OFF, + CC_SPDIF_MUTE_ON, +}; + +enum CC_AUD_IN_TYPE { + CC_AUDIO_IN_SOURCE_LINEIN, + CC_AUDIO_IN_SOURCE_ATV, + CC_AUDIO_IN_SOURCE_HDMI, +}; + + +#define CC_MIN_DAC_VOLUME (0) +#define CC_MAX_DAC_VOLUME (255) +#define CC_MIN_DAC_SUB_WOOFER_VOLUME (0) +#define CC_MAX_DAC_SUB_WOOFER_VOLUME (255) + +#define CC_MIN_SOUND_BALANCE_VAL (0) +#define CC_MAX_SOUND_BALANCE_VAL (100) +#define CC_DEF_SOUND_BALANCE_VAL (50) + +#define CC_DAC_MUTE_TYPE_EXTERNAL (1) +#define CC_DAC_MUTE_TYPE_INTERNAL (2) + +#define CC_VOL_TRANS_LUT_BUF_SIZE (101) + +static const int CC_AUDIO_MUTE = 1; +static const int CC_AUDIO_UNMUTE = 0; + +enum CC_AUDIO_SOURCE_TYPE { + AUDIO_HDMI_SOURCE, + AUDIO_ATV_SOURCE, + AUDIO_AV_SOURCE, + AUDIO_MPEG_SOURCE, + AUDIO_MAX_SOURCE +}; + + +//use tinyalsa,is a like alsa-lib for android +class CAudioAlsa +{ +public: + CAudioAlsa(); + ~CAudioAlsa(); + int SetAudioInSource(int source_type); + int GetAudioInSource(void); + int SetInternalDacLineInSelectChannel(int line_in_number); + int SetInternalDacLineInCaptureVolume(int l_vol, int r_vol); + int GetInternalDacLineInCaptureVolume(int vol_buf[]); + int SetInternalDacLineOutPlayBackVolume(int l_vol, int r_vol); + int GetInternalDacLineOutPlayBackVolume(int vol_buf[]); + int SetExternalDacChannelSwitch(int chan_ind, int switch_val); + int SetExternalDacChannelVolume(int chan_ind, int main_vol); + int SetExternalDacEQMode(int mode_val); + int SetI2SMute(int mute_status); + int SetSPDIFMute(int mute_status); + int SetHardwareResample(int sr); + int SetAudioSwitchIO(int value); + int SetAudioPcmPlaybackVolume(int val); + int SetAudioPcmPlaybackSwitch(int vol); + + int SetOutput_Swap(int value); + + + int SetMixerBypassSwitch(int switch_val); + int GetMixerBypassSwitch(void); + int SetMixerDacSwitch(int switch_val); + int GetMixerDacSwitch(void); + //dac + void SetMainVolDigitLutBuf(int digit_lut_buf[]); + void SetSupperBassVolDigitLutBuf(int digit_lut_buf[]); + int SetDacMute(int mute_state, int mute_type); + int SetDacMainVolume(int main_vol); + int SetDacSupperBassVolume(int tmp_vol); + int SetDacEQMode(int mode_val); + int SetBalanceValue(int balance_val); + int GetBalanceValue(); + int SetMainVolumeGain(int gain_val); + int GetMainVolumeGain(); + int SetSupperBassVolumeGain(int gain_val); + int GetSupperBassVolumeGain(); + int SetDacAudioSourceType(int source_type); + //end dac +private: + int get_aml_card(); + int AudioControlSetValue(int val_count, int data_buf[], char *match_names); + int AudioControlGetValue(int val_count, int ret_buf[], char *match_names); + int get_USB_Audio_card(); + int HandleUSBAudioControlValue(int val_count, int data_buf[], int match_count, char **match_names); + int CheckVolume(int digit_vol, int digit_min, int digit_max, int hd_min, int hd_max); + int GetTwoChannelVolume(int vol_buf[], int l_min_vol, int l_max_vol, int r_min_vol, int r_max_vol, char *match_names, int hd_min, int hd_max); + int GetLineInMaxVol(); + int GetLineOutMaxVol(); + char *GetAlsaControlName(int get_type); + // + int TransVolumeBarVolToDigitalVol(int *, int, int, int, int, int); + int TransDigitalVolToVolumeBarVol(int *, int, int, int, int, int); + int CalculateBalanceVol(int, int, int *); + int SetExternalDacMute(int); + int SetInternalDacMute(int); + int setAudioPcmPlaybackMute(int); + int SetExternalDacMainVolume(int); + int SetInternalDacMainVolume(int); + int SetExternalDacSupperBassVolume(int); + int SetExternalDacEQ(int); + int LoadExternalDacLib(); + int SendCmdToOffBoardCustomerLibExternalDac(int, int); + int SendCmdToOffBoardFBCExternalDac(int, int); + int HandleDigitalVolume(int, int); + int HandleDigitalMute(int); + int SetDigitalMainVolume(int); + int SetDigitalMute(int); + // + //mem + struct mixer *mpMixer; + struct mixer *mpUsbMixer; + volatile int mMainVolumeBalanceVal; + volatile int mMainVolumeGainVal; + volatile int mSupperBassVolumeGainVal; + int mMainDigitLutBuf[CC_VOL_TRANS_LUT_BUF_SIZE]; + int mSupperBassDigitLutBuf[CC_VOL_TRANS_LUT_BUF_SIZE]; +}; +#endif //__TV_AUDIO_ALSA_H__ diff --git a/tvapi/libtv/audio/audio_android.cpp b/tvapi/libtv/audio/audio_android.cpp new file mode 100644 index 0000000..bdd118d --- a/dev/null +++ b/tvapi/libtv/audio/audio_android.cpp @@ -0,0 +1,1035 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <fcntl.h> +#include <malloc.h> +#include <unistd.h> +#include <pthread.h> +#include <sys/stat.h> +#include <media/mediarecorder.h> +#include <system/audio.h> +#include <android/log.h> +#include <cutils/properties.h> +#include <media/AudioSystem.h> +#include <sys/prctl.h> +#include <math.h> + +#include "audio_cfg.h" +#include "audio_api.h" +#include "audio_android.h" +#include "audio_android_effect.h" + +#define msleep(x) usleep(x*1000) + +#define LOG_TAG "AndroidAudio" +#include "CTvLog.h" + +#define SOFTWARE_RESAMPLE + +#define HDMI_PERIOD_SIZE 1024 +#define PERIOD_SIZE 512 + +#define debug 0 +//temp buffer between record thread and playback thread +#define temp_buffer_size 1024*14 +#define mid_buffer_size 1024*7 //reset distance for HDMI +#define reset_distance 1024*2 //reset distance for atv + + +#ifdef SOFTWARE_RESAMPLE +#define Upresample_distance 1024*10 +#define Downresample_distance 1024*4 + +#define period_size 2 //1024*periodsize +#define resample_ratio 16 // unit:one in a thousand +#define fraction_bit 16 //16.16 type +#define upsample_framecount (1024 + resample_ratio) +#define upsample_ratio (unsigned int)((float)downsample_framecount*65536.0f/(float)1024) +#define downsample_framecount (1024 - resample_ratio) +#define downsample_ratio (unsigned int)((float)upsample_framecount*65536.0f/(float)1024) +#define resample_counter (1024/resample_ratio) + +short *resample_temp_buffer = NULL; + +const unsigned int FractionStep_up = upsample_ratio; +const unsigned int FractionStep_down = downsample_ratio; +unsigned int Upsample_Fraction = 0; +unsigned int Downsample_Fraction = 0; +#endif + +#if debug == 1 +int record_counter = 0; +int playback_counter = 0; +#endif + + +#define HISTORY_BASE (12) +#define HISTORY_NUM (1<<12) +static signed history[2][HISTORY_NUM]; + +//showbo +static const int CC_AUDIO_SOURCE_IN_HDMI = 0;//just test,not true value + +CAndroidAudio::CAndroidAudio(CAudioAlsa *p): mpAudioAlsa(p) +{ + int mDumpDataFlag = 0; + int mDumpDataFd = -1; + mlpRecorder = NULL; + mlpTracker = NULL; + temp_buffer = NULL; + end_temp_buffer = NULL; + record_write_pointer = NULL; + playback_read_pointer = NULL; + gEnableNoiseGate = false; + gUserSetEnableNoiseGate = false; + zero_count_left = 2000; + zero_count_right = 2000; + NOISE_HIS = 48000 * 5; + gNoiseGateThresh = 0; +} +CAndroidAudio::~CAndroidAudio() +{ +} + +void CAndroidAudio::noise_filter_init() +{ + memset(history, 0, sizeof(history)); + zero_count_left = 2000; + zero_count_right = 2000; +} + +signed CAndroidAudio::noise_filter_left(signed sample) +{ + //if(!enable_noise_filter ||hdmi_src_in) + // return sample; + signed sum_left = 0; + signed sum_right = 0; + unsigned left_pos = 0; + unsigned right_pos = 0; + signed y = 0; + int i = 0; + signed sum = 0; + signed ret_sample; + signed zero = 0; + sample <<= 16; + sample >>= 16; +#if 0 + if (hdmi_src_in) { //for hdmi src,not use filter and -6db for prevent clip of SRS/other post process. + ret_sample = Mul28(sample, M3DB); + return ret_sample; + } else { + ret_sample = Mul28(sample, M3DB); + sample = ret_sample; + } +#endif + sum_left -= history[0][left_pos]; + sum_left += history[0][(left_pos + HISTORY_NUM - 1) + & ((1 << HISTORY_BASE) - 1)]; + sum = sum_left >> HISTORY_BASE; + left_pos = (left_pos + 1) & ((1 << HISTORY_BASE) - 1); + history[0][(left_pos + HISTORY_NUM - 1) & ((1 << HISTORY_BASE) - 1)] = + sample; + + zero = abs(sample - sum); + if (zero < gNoiseGateThresh) { + zero_count_left++; + if (zero_count_left > NOISE_HIS) { + zero_count_left = NOISE_HIS; + y = 0; + } else { + y = sample; + } + } else { + y = sample; + zero_count_left = 0; + } + return y; +} + +signed CAndroidAudio::noise_filter_right(signed sample) +{ + //if(!enable_noise_filter ||hdmi_src_in) + // return sample; + signed y = 0; + int i = 0; + signed ret_sample; + signed sum = 0; + sample <<= 16; + sample >>= 16; +#if 0 + if (hdmi_src_in) { //for hdmi src,not use filter and -6db for prevent clip of SRS/other post process. + ret_sample = Mul28(sample, M3DB); + return ret_sample; + } else { + ret_sample = Mul28(sample, M3DB); + sample = ret_sample; + } +#endif + sum_right -= history[1][right_pos]; + sum_right += history[1][(right_pos + HISTORY_NUM - 1) + & ((1 << HISTORY_BASE) - 1)]; + sum = sum_right >> HISTORY_BASE; + right_pos = (right_pos + 1) & ((1 << HISTORY_BASE) - 1); + history[1][(right_pos + HISTORY_NUM - 1) & ((1 << HISTORY_BASE) - 1)] = + sample; + + if (abs(sample - sum) < gNoiseGateThresh) { + zero_count_right++; + if (zero_count_right > NOISE_HIS) { + zero_count_right = NOISE_HIS; + y = 0; + } else { + y = sample; + } + } else { + y = sample; + zero_count_right = 0; + } + return y; +} + +void CAndroidAudio::DeleteAudioRecorder(void) +{ +#if ANDROID_PLATFORM_SDK_VERSION < 19 + if (mlpRecorder != NULL) { + delete mlpRecorder; + mlpRecorder = NULL; + } +#else + if (mlpRecorder != NULL ) { + mlpRecorder = NULL; + } + + if (mmpAudioRecorder != NULL ) { + mmpAudioRecorder.clear(); + } +#endif +} + +void CAndroidAudio::FreeAudioRecorder(void) +{ + if (mlpRecorder != NULL) { + mlpRecorder->stop(); + } + + DeleteAudioRecorder(); +} + +void CAndroidAudio::DeleteAudioTracker(void) +{ +#if ANDROID_PLATFORM_SDK_VERSION < 19 + if (mlpTracker != NULL) { + delete mlpTracker; + mlpTracker = NULL; + } +#else + if (mlpTracker != NULL ) { + mlpTracker = NULL; + } + + if (mmpAudioTracker != NULL ) { + mmpAudioTracker.clear(); + } +#endif +} + +void CAndroidAudio::FreeAudioTracker(void) +{ + if (mlpTracker != NULL) { + mlpTracker->stop(); + } + + DeleteAudioTracker(); +} + +int CAndroidAudio::InitTempBuffer() +{ + int tmp_size = 0; + + if (NULL == temp_buffer) { + tmp_size = temp_buffer_size; + temp_buffer = new short[tmp_size]; + if (NULL == temp_buffer) { + return -1; + } + memset(temp_buffer, 0, tmp_size * sizeof(short)); + end_temp_buffer = temp_buffer + tmp_size; + record_write_pointer = temp_buffer; + playback_read_pointer = temp_buffer; + } +#ifdef SOFTWARE_RESAMPLE + if (NULL == resample_temp_buffer) { + tmp_size = upsample_framecount * 2 * period_size + 10; + resample_temp_buffer = new short[tmp_size]; + if (NULL == resample_temp_buffer) { + return -1; + } + memset(temp_buffer, 0, tmp_size * sizeof(short)); + } +#endif + return 0; +} + +static void MuteTempBuffer() +{ + if ((NULL != temp_buffer) && (NULL != mlpTracker)) { + playback_read_pointer = record_write_pointer; + memset(temp_buffer, 0, temp_buffer_size * sizeof(short)); + for (int i = 0; i < 10; i++) { + mlpTracker->write(temp_buffer, temp_buffer_size); + } + } +} + +void CAndroidAudio::FreeTempBuffer() +{ + if (temp_buffer != NULL) { + delete[] temp_buffer; + temp_buffer = NULL; + end_temp_buffer = NULL; + record_write_pointer = NULL; + playback_read_pointer = NULL; + } +#ifdef SOFTWARE_RESAMPLE + if (resample_temp_buffer != NULL) { + delete[] resample_temp_buffer; + resample_temp_buffer = NULL; + } +#endif +} + +void CAndroidAudio::ResetRecordWritePointer() +{ + record_write_pointer = playback_read_pointer; +} + +void CAndroidAudio::ResetPlaybackReadPointer() +{ + record_write_pointer = playback_read_pointer; +} + +void CAndroidAudio::ResetPointer() +{ + if (mpAudioAlsa->GetAudioInSource() == CC_AUDIO_SOURCE_IN_HDMI) { + playback_read_pointer = record_write_pointer - mid_buffer_size; + if (playback_read_pointer < temp_buffer) { + playback_read_pointer += temp_buffer_size; + } + } else { + playback_read_pointer = record_write_pointer - reset_distance; + if (playback_read_pointer < temp_buffer) { + playback_read_pointer += temp_buffer_size; + } + } +} + +// 0: LINEIN 1: HDMI +void CAndroidAudio::reset_system_framesize(int input_sample_rate, int output_sample_rate) +{ + int frame_size = 0; + + audio_io_handle_t handle = -1; + + if (mpAudioAlsa->GetAudioInSource() == CC_AUDIO_SOURCE_IN_HDMI) { + frame_size = HDMI_PERIOD_SIZE * 4; + LOGE("Source In:HDMI, Android system audio out framecount: %d \n", + frame_size); + } else { + //msleep(500); + frame_size = PERIOD_SIZE * 4; + LOGE("Source In:LIENIN, Android system audio out framecount: %d \n", + frame_size); + } + + handle = AudioSystem::getInput(AUDIO_SOURCE_MIC, input_sample_rate, + AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_IN_STEREO, 0); + + if (handle > 0) { + char str[64]; + memset(str, 0, sizeof(str)); + sprintf(str, "frame_count=%d", frame_size); + LOGE("input handle number: %d \n", handle); + AudioSystem::setParameters(handle, String8(str)); + } else { + LOGE("Can't get input handle! \n"); + } + + handle = -1; + + handle = AudioSystem::getOutput(AUDIO_STREAM_MUSIC, output_sample_rate, + AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO, + AUDIO_OUTPUT_FLAG_NONE); + + if (handle > 0) { + char str[64]; + memset(str, 0, sizeof(str)); + sprintf(str, "frame_count=%d", frame_size); + LOGE("output handle number: %d \n", handle); + AudioSystem::setParameters(handle, String8(str)); + } else { + LOGE("Can't get output handle! \n"); + } +} + +inline short CAndroidAudio::clip(int x) //Clip from 16.16 fixed-point to 0.15 fixed-point. +{ + if (x < -32768) + return -32768; + else if (x > 32767) + return 32767; + else + return x; +} + +int CAndroidAudio::upsample(short *input, short *output, unsigned int FractionStep, + unsigned int input_frame_size, unsigned int frac) +{ + unsigned int inputIndex = 1; + unsigned int outputIndex = 0; + + while (inputIndex < input_frame_size) { + *output++ = clip( + input[2 * inputIndex - 2] + + (((input[2 * inputIndex] - input[2 * inputIndex - 2]) + * (int32_t) frac) >> 16)); + *output++ = clip( + input[2 * inputIndex - 1] + + (((input[2 * inputIndex + 1] + - input[2 * inputIndex - 1]) * (int32_t) frac) + >> 16)); + + frac += FractionStep; + inputIndex += (frac >> 16); + frac = (frac & 0xffff); + outputIndex++; + } + + return outputIndex; +} + +int CAndroidAudio::downsample(short *input, short *output, unsigned int FractionStep, + unsigned int input_frame_size, unsigned int frac) +{ + unsigned int inputIndex = 1; + unsigned int outputIndex = 0; + + while (inputIndex < input_frame_size) { + *output++ = clip( + input[2 * inputIndex - 2] + + (((input[2 * inputIndex] - input[2 * inputIndex - 2]) + * (int32_t) frac) >> 16)); + *output++ = clip( + input[2 * inputIndex - 1] + + (((input[2 * inputIndex + 1] + - input[2 * inputIndex - 1]) * (int32_t) frac) + >> 16)); + + frac += FractionStep; + inputIndex += (frac >> 16); + frac = (frac & 0xffff); + outputIndex++; + } + + return outputIndex; +} + +int CAndroidAudio::GetWriteSpace(short volatile *WritePoint, + short volatile *ReadPoint) +{ + unsigned int space; + + if (WritePoint >= ReadPoint) + space = temp_buffer_size - (WritePoint - ReadPoint); + else + space = ReadPoint - WritePoint; + + return space; +} +int CAndroidAudio::GetReadSpace(short volatile *WritePoint, short volatile *ReadPoint) +{ + unsigned int space; + + if (WritePoint >= ReadPoint) + space = WritePoint - ReadPoint; + else + space = temp_buffer_size - (ReadPoint - WritePoint); + + return space; +} + +void CAndroidAudio::recorderCallback(int event, void *user, void *info) +{ + if (AudioRecord::EVENT_MORE_DATA == event) { + AudioRecord::Buffer *pbuf = (AudioRecord::Buffer *) info; + + if (NULL == mlpRecorder) + return; + + unsigned int offset_bytes = 2 + * (end_temp_buffer - record_write_pointer); + unsigned int copy_bytes; + unsigned int output_bytes; + + int available_write_space; + available_write_space = GetWriteSpace(record_write_pointer, + playback_read_pointer); + + //LOGE("~~~~~available_write_space = %d \n", available_write_space); + + if (available_write_space < pbuf->size / 2) { + LOGE( + "[%s]: ***** FULL! *****\n\trd=0x%x, wr=0x%x, wr_lvl = 0x%x, wr_req = 0x%x\n", + __FUNCTION__, playback_read_pointer, record_write_pointer, + available_write_space, pbuf->size / 2); + + if (mpAudioAlsa->GetAudioInSource() == CC_AUDIO_SOURCE_IN_HDMI) { + playback_read_pointer += mid_buffer_size; + if (playback_read_pointer >= end_temp_buffer) { + playback_read_pointer -= temp_buffer_size; + } + } else { + playback_read_pointer += (temp_buffer_size - reset_distance); + if (playback_read_pointer >= end_temp_buffer) { + playback_read_pointer -= temp_buffer_size; + } + } + return; + } +#if debug == 1 + if (record_counter > 500) { + LOGE("~~~~~RecordCallback, pbuf->size:%d, pbuf->frameCount:%d", pbuf->size, pbuf->frameCount); + record_counter = 0; + } else { + record_counter++; + } +#endif + +#ifdef SOFTWARE_RESAMPLE + if (mpAudioAlsa->GetAudioInSource() == CC_AUDIO_SOURCE_IN_HDMI) { + if (available_write_space <= Downresample_distance) { + output_bytes = 4 + * downsample((short *) pbuf->raw, resample_temp_buffer, + FractionStep_down, pbuf->frameCount, + Downsample_Fraction); + + LOGE( + "downsample: output_framecount = %d, input_frameCount = %d\n", + output_bytes / 4, pbuf->frameCount); + + if (offset_bytes >= output_bytes) { + memcpy((short *) record_write_pointer, resample_temp_buffer, + output_bytes); + record_write_pointer += output_bytes / 2; + + if (record_write_pointer == end_temp_buffer) + record_write_pointer = temp_buffer; + } else { + memcpy((short *) record_write_pointer, resample_temp_buffer, + offset_bytes); + copy_bytes = offset_bytes; + offset_bytes = output_bytes - copy_bytes; + record_write_pointer = temp_buffer; + memcpy((short *) record_write_pointer, + resample_temp_buffer + (copy_bytes / 2), + offset_bytes); + record_write_pointer += offset_bytes / 2; + } + return; + } else if (available_write_space >= Upresample_distance) { + output_bytes = 4 + * upsample((short *) pbuf->raw, resample_temp_buffer, + FractionStep_up, pbuf->frameCount, + Upsample_Fraction); + + LOGE( + "upsample: output_framecount = %d, input_frameCount = %d\n", + output_bytes / 4, pbuf->frameCount); + + if (offset_bytes >= output_bytes) { + memcpy((short *) record_write_pointer, resample_temp_buffer, + output_bytes); + record_write_pointer += output_bytes / 2; + + if (record_write_pointer == end_temp_buffer) + record_write_pointer = temp_buffer; + } else { + memcpy((short *) record_write_pointer, resample_temp_buffer, + offset_bytes); + copy_bytes = offset_bytes; + offset_bytes = output_bytes - copy_bytes; + record_write_pointer = temp_buffer; + memcpy((short *) record_write_pointer, + resample_temp_buffer + (copy_bytes / 2), + offset_bytes); + record_write_pointer += offset_bytes / 2; + } + return; + } + + Upsample_Fraction = 0; + Downsample_Fraction = 0; + } +#endif + + if (offset_bytes >= pbuf->size) { + memcpy((short *) record_write_pointer, pbuf->raw, pbuf->size); + record_write_pointer += pbuf->size / 2; + + if (record_write_pointer == end_temp_buffer) + record_write_pointer = temp_buffer; + } else { + memcpy((short *) record_write_pointer, pbuf->raw, offset_bytes); + copy_bytes = offset_bytes; + offset_bytes = pbuf->size - copy_bytes; + record_write_pointer = temp_buffer; + memcpy((short *) record_write_pointer, + (short *) pbuf->raw + (copy_bytes / 2), offset_bytes); + record_write_pointer += offset_bytes / 2; + } + + //LOGD("--------RecordCallback, pbuf->size:%d, pbuf->frameCount:%d\n", pbuf->size, pbuf->frameCount); + //LOGD("--------Record----offset_bytes:%d\n", 2*(record_write_pointer-temp_buffer)); + + } else if (AudioRecord::EVENT_OVERRUN == event) { + LOGE("[%s]: AudioRecord::EVENT_OVERRUN\n", __FUNCTION__); + } else if (AudioRecord::EVENT_MARKER == event) { + LOGD("[%s]: AudioRecord::EVENT_MARKER\n", __FUNCTION__); + } else if (AudioRecord::EVENT_NEW_POS == event) { + LOGD("[%s]: AudioRecord::EVENT_NEW_POS\n", __FUNCTION__); + } +} + +void CAndroidAudio::trackerCallback(int event, void *user, void *info) +{ + if (AudioTrack::EVENT_MORE_DATA == event) { + AudioTrack::Buffer *pbuf = (AudioTrack::Buffer *) info; + + if (NULL == mlpTracker) + return; + + int available_read_space; + available_read_space = GetReadSpace(record_write_pointer, + playback_read_pointer); + + //LOGE("~~~~~available_read_space = %d input_bytes = %d \n", available_read_space,input_bytes); + + if (available_read_space < pbuf->size / 2) { + LOGE( + "[%s]: ***** EMPTY *****\n\trd=0x%x, wr=0x%x, rd_lvl=0x%x, rd_req=0x%x*****\n", + __FUNCTION__, playback_read_pointer, record_write_pointer, + available_read_space, pbuf->size / 2); + + if (mpAudioAlsa->GetAudioInSource() == CC_AUDIO_SOURCE_IN_HDMI) { + playback_read_pointer -= mid_buffer_size; + if (playback_read_pointer < temp_buffer) + playback_read_pointer += temp_buffer_size; + } else { + playback_read_pointer -= reset_distance; + if (playback_read_pointer < temp_buffer) + playback_read_pointer += temp_buffer_size; + } + + } else { + unsigned int offset_bytes = 2 + * (end_temp_buffer - playback_read_pointer); + unsigned int copy_bytes; + int sampNum; + + if (offset_bytes >= pbuf->size) { + if (gEnableNoiseGate) { + sampNum = pbuf->size / 2; + for (int i = 0; i < sampNum; i++) { + pbuf->i16[i] = (short) noise_filter_left( + (signed) (playback_read_pointer[i])); + i++; + pbuf->i16[i] = (short) noise_filter_left( + (signed) (playback_read_pointer[i])); + } + } else { + memcpy(pbuf->raw, (short *) playback_read_pointer, + pbuf->size); + } + + memset((void *) playback_read_pointer, 0, pbuf->size); + playback_read_pointer += pbuf->size / 2; + + if (playback_read_pointer == end_temp_buffer) + playback_read_pointer = temp_buffer; + } else { + if (gEnableNoiseGate) { + sampNum = offset_bytes / 2; + for (int i = 0; i < sampNum; i++) { + pbuf->i16[i] = (short) noise_filter_left( + (signed) (playback_read_pointer[i])); + i++; + pbuf->i16[i] = (short) noise_filter_left( + (signed) (playback_read_pointer[i])); + } + } else { + memcpy(pbuf->raw, (short *) playback_read_pointer, + offset_bytes); + } + + memset((void *) playback_read_pointer, 0, offset_bytes); + copy_bytes = offset_bytes; + offset_bytes = pbuf->size - copy_bytes; + playback_read_pointer = temp_buffer; + + if (gEnableNoiseGate) { + short *pSrcPtr = &(pbuf->i16[copy_bytes / 2]); + sampNum = offset_bytes / 2; + for (int i = 0; i < sampNum; i++) { + pSrcPtr[i] = (short) noise_filter_left( + (signed) (playback_read_pointer[i])); + i++; + pSrcPtr[i] = (short) noise_filter_left( + (signed) (playback_read_pointer[i])); + } + } else { + memcpy((short *) pbuf->raw + (copy_bytes / 2), + (short *) playback_read_pointer, offset_bytes); + } + memset((void *) playback_read_pointer, 0, offset_bytes); + playback_read_pointer += offset_bytes / 2; + } + DoDumpData(pbuf->raw, pbuf->size); + +#if debug == 1 + if (playback_counter > 500) { + LOGE("----PlaybackCallback, pbuf->size:%d, pbuf->frameCount:%d", pbuf->size, pbuf->frameCount); + playback_counter = 0; + } else { + playback_counter++; + } +#endif + + } + //LOGE("---Playback---offset_bytes:%d\n", 2*(playback_read_pointer-temp_buffer)); + } else if (AudioTrack::EVENT_UNDERRUN == event) { + LOGE("[%s]: AudioTrack::EVENT_UNDERRUN\n", __FUNCTION__); + } else if (AudioTrack::EVENT_LOOP_END == event) { + LOGD("[%s]: AudioTrack::EVENT_LOOP_END\n", __FUNCTION__); + } else if (AudioTrack::EVENT_MARKER == event) { + LOGD("[%s]: AudioTrack::EVENT_MARKER\n", __FUNCTION__); + } else if (AudioTrack::EVENT_NEW_POS == event) { + LOGD("[%s]: AudioTrack::EVENT_NEW_POS\n", __FUNCTION__); + } else if (AudioTrack::EVENT_BUFFER_END == event) { + LOGD("[%s]: AudioTrack::EVENT_BUFFER_END\n", __FUNCTION__); + } +} + +int CAndroidAudio::initAudioTracker(int sr) +{ + status_t ret; + int tmp_session_id = 0; + + if (NULL != mlpTracker) { + LOGE("[%s:%d] Trying to new AudioTrack while it's still not NULL.\n", + __FUNCTION__, __LINE__); + goto err_exit; + } + +#if ANDROID_PLATFORM_SDK_VERSION < 19 + mlpTracker = new AudioTrack(); + if (NULL == mlpTracker) { + LOGE("[%s:%d] Failed to new AudioTrack.\n", __FUNCTION__, __LINE__); + goto err_exit; + } +#else + mmpAudioTracker = new AudioTrack(); + mlpTracker = mmpAudioTracker.get(); +#endif + + tmp_session_id = amAndroidGetAudioSessionId(); + ret = mlpTracker->set(AUDIO_STREAM_DEFAULT, //inputSource + sr, //sampleRate + AUDIO_FORMAT_PCM_16_BIT, //format + AUDIO_CHANNEL_IN_STEREO, //channelMask + 0, //frameCount + AUDIO_OUTPUT_FLAG_NONE, //flags + trackerCallback, //trackerCallback, + NULL, //user when callback + 0, //notificationFrames + NULL, //shared buffer + false, //threadCanCallJava + tmp_session_id //sessionId + ); + + if (NO_ERROR != ret) { + LOGE("[%s:%d] Failed to set AudioTrack parameters. status=%d\n", + __FUNCTION__, __LINE__, ret); + goto err_exit; + } + + ret = mlpTracker->initCheck(); + if (NO_ERROR != ret) { + LOGE("[%s:%d] Failed to init AudioTrack. status=%d\n", __FUNCTION__, + __LINE__, ret); + goto err_exit; + } + + mlpTracker->start(); + ResetPointer(); + +#if debug == 1 + uint32_t frame_count; + frame_count = mlpTracker->frameCount(); + LOGE("~~~~~~[%s:%d] frame_count = %u\n", __FUNCTION__, __LINE__, frame_count); +#endif + + return 0; + +err_exit: // + DeleteAudioTracker(); + + return -1; +} + +int CAndroidAudio::initAudioRecorder(int sr) +{ + status_t ret; + + if (NULL != mlpRecorder) { + LOGE("[%s:%d] Trying to new AudioRecord while it's still not NULL.\n", + __FUNCTION__, __LINE__); + goto err_exit; + } + +#if ANDROID_PLATFORM_SDK_VERSION < 19 + mlpRecorder = new AudioRecord(); + if (NULL == mlpRecorder) { + LOGE("[%s:%d] Failed to new AudioRecord.\n", __FUNCTION__, __LINE__); + goto err_exit; + } +#else + mmpAudioRecorder = new AudioRecord(); + mlpRecorder = mmpAudioRecorder.get(); +#endif + + ret = mlpRecorder->set(AUDIO_SOURCE_DEFAULT, //inputSource + sr, //sampleRate + AUDIO_FORMAT_PCM_16_BIT, //format + AUDIO_CHANNEL_IN_STEREO, //channelMask + 0, //frameCount + recorderCallback, //callback_t + NULL, //void* user + 0, //notificationFrames, + false, //threadCanCallJava + 0 //sessionId + ); + + if (NO_ERROR != ret) { + LOGE("[%s:%d] Failed to set AudioRecord parameters. status=%d\n", + __FUNCTION__, __LINE__, ret); + goto err_exit; + } + + ret = mlpRecorder->initCheck(); + if (NO_ERROR != ret) { + LOGE("[%s:%d] Failed to init AudioRecord. status=%d\n", __FUNCTION__, + __LINE__, ret); + goto err_exit; + } + + ret = mlpRecorder->start(); + if (NO_ERROR != ret) { + LOGE("[%s:%d] Failed to start AudioRecord. status=%d\n", __FUNCTION__, + __LINE__, ret); + goto err_exit; + } +#if debug == 1 + uint32_t frame_count; + frame_count = mlpRecorder->frameCount(); + LOGE("~~~~~~[%s:%d] frame_count = %u\n", __FUNCTION__, __LINE__, frame_count); +#endif + + return 0; +err_exit: // + DeleteAudioRecorder(); + return -1; +} + +int CAndroidAudio::amAndroidInit(int tm_sleep, int init_flag, int recordSr, int trackSr, + bool enable_noise_gate) +{ + int tmp_ret; + LOGD("Enter amAndroidInit function.\n"); + + amAndroidUninit(0); + + // Init the noise gate filter + gUserSetEnableNoiseGate = enable_noise_gate; + if (enable_noise_gate && (gNoiseGateThresh > 0) + && GetAudioNoiseGateEnableCFG()) { + gEnableNoiseGate = true; + noise_filter_init(); + } else { + gEnableNoiseGate = false; + } + LOGE("[%s:%d] noise gate enabled:%d!\n", __FUNCTION__, __LINE__, + gEnableNoiseGate); + + if (InitTempBuffer() != 0) { + LOGE("[%s:%d] Failed to create temp_buffer!\n", __FUNCTION__, __LINE__); + return 0; + } + + if (init_flag & CC_FLAG_CREATE_RECORD) { + //LOGD("Start to create Recorder. RecordSr:%d\n", recordSr); + if (0 != initAudioRecorder(recordSr)) { + LOGE(" [%s:%d] Created AudioRecorder disable !\n", __FUNCTION__, + __LINE__); + return -1; + } + //LOGD("[%s:%d] End to create recorder.\n", __FUNCTION__, __LINE__); + } + + if (init_flag & CC_FLAG_CREATE_TRACK) { + //LOGD("Start to create Tracker. TrackSr:%d\n", trackSr); + if (0 != initAudioTracker(trackSr)) { + //FreeAudioRecorder(); + //FreeAudioTracker(); + LOGE(" [%s:%d] Created AudioTrack disable !\n", __FUNCTION__, + __LINE__); + return -1; + } + //LOGD("[%s:%d] End to create recorder.\n", __FUNCTION__, __LINE__); + } + + if (tm_sleep > 0) + sleep(tm_sleep); + + LOGD("Exit amAndroidInit function sucess.\n"); + + return 0; +} + +int CAndroidAudio::amAndroidUninit(int tm_sleep) +{ + LOGD("Enter amAndroidUninit function.\n"); + + FreeAudioRecorder(); + // MuteTempBuffer(); + FreeAudioTracker(); + FreeTempBuffer(); + + if (tm_sleep > 0) + sleep(tm_sleep); + + LOGD("Exit amAndroidUninit function sucess.\n"); + + return 0; +} + +int CAndroidAudio::amAndroidSetRecorderSr(int sr) +{ + int ret; + FreeAudioRecorder(); + ResetRecordWritePointer(); + return initAudioRecorder(sr); +} + +int CAndroidAudio::amAndroidSetTrackerSr(int sr) +{ + FreeAudioTracker(); + ResetPlaybackReadPointer(); + return initAudioTracker(sr); +} + +// +// Set the noise gate threshold. +// If it's set to 0, the noise gate filter is disabled. +// Theoretically, this variable should be protected by mutex. But this API +// is designed to be called once on system boot, or for debug purpose, and it's +// set only through this API. To improve the performance of the filters, we +// don't utilize any mutex here. +void CAndroidAudio::amAndroidSetNoiseGateThreshold(int thresh) +{ + int upperBound = GetAudioNoiseGateUpperBoundCFG(); + int forcedThresh = GetAudioNoiseGateThresholdCFG(); + if (forcedThresh >= 0) { + LOGE("Force noise gate threshold from %d to %d\n", thresh, + forcedThresh); + thresh = forcedThresh; + } + + if ((thresh >= 0) && (thresh <= upperBound)) { + gNoiseGateThresh = thresh; + } else { + gNoiseGateThresh = 0; + } + + if (gUserSetEnableNoiseGate && (gNoiseGateThresh > 0) + && GetAudioNoiseGateEnableCFG()) { + gEnableNoiseGate = true; + } else { + gEnableNoiseGate = false; + } + LOGE( + "[%s:%d] thresh:%d, upperBound:%d, gNoiseGateThresh:%d, gEnableNoiseGate:%d\n", + __FUNCTION__, __LINE__, thresh, upperBound, gNoiseGateThresh, + gEnableNoiseGate); +} + +int CAndroidAudio::amAndroidSetDumpDataFlag(int tmp_flag) +{ + mDumpDataFlag = tmp_flag; + return mDumpDataFlag; +} + +int CAndroidAudio::amAndroidGetDumpDataFlag() +{ + return mDumpDataFlag; +} + +void CAndroidAudio::DoDumpData(void *data_buf, int size) +{ + int tmp_flag = 0; + char prop_value[PROPERTY_VALUE_MAX]; + + if (amAndroidGetDumpDataFlag() == 0) { + return; + } + + memset(prop_value, '\0', PROPERTY_VALUE_MAX); + + property_get("audio.dumpdata.en", prop_value, "null"); + if (strcasecmp(prop_value, "null") == 0 + || strcasecmp(prop_value, "0") == 0) { + if (mDumpDataFd >= 0) { + close(mDumpDataFd); + mDumpDataFd = -1; + } + + return; + } + + memset(prop_value, '\0', PROPERTY_VALUE_MAX); + + property_get("audio.dumpdata.path", prop_value, "null"); + if (strcasecmp(prop_value, "null") == 0) { + return; + } + + if (mDumpDataFd < 0) { + if (access(prop_value, 0) == 0) { + mDumpDataFd = open(prop_value, O_RDWR | O_SYNC); + if (mDumpDataFd < 0) { + LOGE("%s, Open device file \"%s\" error: %s.\n", __FUNCTION__, + prop_value, strerror(errno)); + return; + } + } else { + mDumpDataFd = open(prop_value, O_WRONLY | O_CREAT | O_EXCL, + S_IRUSR | S_IWUSR); + if (mDumpDataFd < 0) { + LOGE("%s, Create device file \"%s\" error: %s.\n", __FUNCTION__, + prop_value, strerror(errno)); + return; + } + } + } + + write(mDumpDataFd, data_buf, size); +} + diff --git a/tvapi/libtv/audio/audio_android.h b/tvapi/libtv/audio/audio_android.h new file mode 100644 index 0000000..621fa1a --- a/dev/null +++ b/tvapi/libtv/audio/audio_android.h @@ -0,0 +1,79 @@ +#ifndef __TV_AUDIO_ANDROID_H__ +#define __TV_AUDIO_ANDROID_H__ + +#define CC_FLAG_CREATE_RECORD (0x0001) +#define CC_FLAG_CREATE_TRACK (0x0002) +#include "audio_alsa.h" +#include <media/AudioRecord.h> +#include <media/AudioTrack.h> + +using namespace android; + + +class CAndroidAudio +{ +public: + CAndroidAudio(CAudioAlsa *); + ~CAndroidAudio(); + int amAndroidInit(int tm_sleep, int init_flag, int recordSr, int trackSr, + bool enable_noise_gat); + int amAndroidUninit(int tm_sleep); + int amAndroidSetRecorderSr(int sr); + int amAndroidSetTrackerSr(int sr); + int amAndroidSetDumpDataFlag(int tmp_flag); + int amAndroidGetDumpDataFlag(); + void amAndroidSetNoiseGateThreshold(int thresh); + void reset_system_framesize(int input_sample_rate, int output_sample_rate); + +private: + void DoDumpData(void *data_buf, int size); + void noise_filter_init(); + int noise_filter_left(int); + int noise_filter_right(int); + void DeleteAudioRecorder(); + void FreeAudioRecorder(); + void DeleteAudioTracker(); + void FreeAudioTracker(); + int InitTempBuffer(); + void FreeTempBuffer(); + void ResetRecordWritePointer(); + void ResetPlaybackReadPointer(); + void ResetPointer(); + short int clip(int); + int upsample(short int *, short int *, unsigned int, unsigned int, unsigned int); + int downsample(short int *, short int *, unsigned int, unsigned int, unsigned int); + int GetWriteSpace(volatile short int *, volatile short int *); + int GetReadSpace(volatile short int *, volatile short int *); + void recorderCallback(int, void *, void *); + void trackerCallback(int, void *, void *); + int initAudioTracker(int); + int initAudioRecorder(int); + + CAudioAlsa *mpAudioAlsa; + int mDumpDataFlag; + int mDumpDataFd; + AudioRecord *mlpRecorder; + AudioTrack *mlpTracker; + +#if ANDROID_PLATFORM_SDK_VERSION >= 19 + sp<AudioTrack> mmpAudioTracker; + sp<AudioRecord> mmpAudioRecorder; +#endif + + short *temp_buffer; + short *end_temp_buffer; + short volatile *record_write_pointer; + short volatile *playback_read_pointer; + + /////////////////////////////////////////////////////////////////////////////// + // Helpers for the noise gate. + bool gEnableNoiseGate; + bool gUserSetEnableNoiseGate; + unsigned zero_count_left; + unsigned zero_count_right; + unsigned NOISE_HIS; + signed gNoiseGateThresh; +}; + + +#endif //__TV_AUDIO_ANDROID_H__ diff --git a/tvapi/libtv/audio/audio_android_effect.cpp b/tvapi/libtv/audio/audio_android_effect.cpp new file mode 100644 index 0000000..e29a711 --- a/dev/null +++ b/tvapi/libtv/audio/audio_android_effect.cpp @@ -0,0 +1,591 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <fcntl.h> +#include <malloc.h> +#include <unistd.h> +#include <pthread.h> +#include <sys/stat.h> +#include <android/log.h> +#include <sys/prctl.h> + +#include "audio_android_effect.h" + +#define msleep(x) usleep(x*1000) + +#define INVALID_EQ_FORCED_GAIN (0x7FFFFFFF) + +#define LOG_TAG "CAndroidEffect" +#include "CTvLog.h" + +using namespace android; + +// For some special cases, we want some band of the EQ to be forced to a specific +// gain. When the value in this array is not invalid, the gain of the corresponding +// band will be forced to this value. +CAndroidEffect::CAndroidEffect() +{ + mplpAudioEffectSrs = NULL; + mplpAudioEffectEq = NULL; + mTrackerSessionId = 0; +} + +CAndroidEffect::~CAndroidEffect() +{ +} + +static void audioEffectCallback(int32_t event, void *user, void *info) +{ + LOGD("[%s:%d]", __FUNCTION__, __LINE__); +} + +void CAndroidEffect::FreeAudioEffect(AudioEffect **pEffect) +{ + if ((*pEffect) != NULL) { + (*pEffect)->setEnabled(false); + delete (*pEffect); + (*pEffect) = NULL; + } +} + +void CAndroidEffect::initAudioEffect(AudioEffect **pEffect, + const effect_uuid_t *const pEffectType, + const effect_uuid_t *const pEffectUuid, int sessionId) +{ + if (NULL != (*pEffect)) { + LOGE("[%s:%d] AudioEffect is not NULL. Free it first.\n", __FUNCTION__, + __LINE__); + FreeAudioEffect(pEffect); + } + + status_t status; + + (*pEffect) = new AudioEffect(); + if (NULL == (*pEffect)) { + LOGE("[%s:%d] Failed to create audio effect.\n", __FUNCTION__, + __LINE__); + goto err_exit; + } + + status = (*pEffect)->set(pEffectType, //type + pEffectUuid, //uuid + 0, //priority + audioEffectCallback, //cbf + NULL, //user + sessionId, //sessionId + 0 // default output device + ); + + if (NO_ERROR != status) { + LOGE("[%s:%d] Failed to set audio effect parameters.\n", __FUNCTION__, + __LINE__); + goto err_exit; + } + + status = (*pEffect)->initCheck(); + if (NO_ERROR != status) { + LOGE("[%s:%d] Failed to init audio effect.\n", __FUNCTION__, __LINE__); + goto err_exit; + } + + status = (*pEffect)->setEnabled(true); + if (NO_ERROR != status) { + LOGE("[%s:%d] Failed to enable audio effect.\n", __FUNCTION__, + __LINE__); + goto err_exit; + } + + return; + +err_exit: + if (NULL != (*pEffect)) { + delete (*pEffect); + (*pEffect) = NULL; + } +} + +int CAndroidEffect::setSrsParameterInt(tshd_srs_param_t param, unsigned value) +{ + if (NULL == mplpAudioEffectSrs) { + return -1; + } + + status_t status; + effect_param_t *pParam = (effect_param_t *) malloc( + sizeof(effect_param_t) + sizeof(unsigned) + sizeof(unsigned)); + if (NULL == pParam) { + LOGE("[%s:%d]Failed to allocate memory!\n", __FUNCTION__, __LINE__); + return -1; + } + pParam->status = 0; + pParam->psize = sizeof(unsigned); + pParam->vsize = sizeof(unsigned); + *(unsigned *) (&pParam->data[0]) = (unsigned) param; + *(unsigned *) (&pParam->data[sizeof(unsigned)]) = value; + status = mplpAudioEffectSrs->setParameter(pParam); + if (NO_ERROR != status) { + LOGE("[%s:%d]Failed to set parameter:%d!\n", __FUNCTION__, __LINE__, + param); + free(pParam); + return -1; + } else { + free(pParam); + return 0; + } +} + +int CAndroidEffect::getSrsParameterInt(tshd_srs_param_t param, unsigned *value) +{ + if (NULL == mplpAudioEffectSrs) { + return -1; + } + + status_t status; + effect_param_t *pParam = (effect_param_t *) malloc( + sizeof(effect_param_t) + sizeof(unsigned) + sizeof(unsigned)); + if (NULL == pParam) { + LOGE("[%s:%d]Failed to allocate memory!\n", __FUNCTION__, __LINE__); + return -1; + } + pParam->status = 0; + pParam->psize = sizeof(unsigned); + pParam->vsize = sizeof(unsigned); + *(unsigned *) (&pParam->data[0]) = (unsigned) param; + status = mplpAudioEffectSrs->getParameter(pParam); + if (NO_ERROR != status) { + LOGE("[%s:%d]Failed to get parameter:%d!\n", __FUNCTION__, __LINE__, + param); + *value = 0; + free(pParam); + return -1; + } else { + *value = *(unsigned *) (&pParam->data[sizeof(unsigned)]); + free(pParam); + return 0; + } +} + +int CAndroidEffect::setSrsParameterFloat(tshd_srs_param_t param, float value) +{ + if (NULL == mplpAudioEffectSrs) { + return -1; + } + + status_t status; + effect_param_t *pParam = (effect_param_t *) malloc( + sizeof(effect_param_t) + sizeof(unsigned) + sizeof(float)); + if (NULL == pParam) { + LOGE("[%s:%d]Failed to allocate memory!\n", __FUNCTION__, __LINE__); + return -1; + } + pParam->status = 0; + pParam->psize = sizeof(unsigned); + pParam->vsize = sizeof(float); + *(unsigned *) (&pParam->data[0]) = (unsigned) param; + *(float *) (&pParam->data[sizeof(unsigned)]) = value; + status = mplpAudioEffectSrs->setParameter(pParam); + if (NO_ERROR != status) { + LOGE("[%s:%d]Failed to set parameter:%d!\n", __FUNCTION__, __LINE__, + param); + free(pParam); + return -1; + } else { + free(pParam); + return 0; + } +} + +int CAndroidEffect::getSrsParameterFloat(tshd_srs_param_t param, float *value) +{ + if (NULL == mplpAudioEffectSrs) { + return -1; + } + + status_t status; + effect_param_t *pParam = (effect_param_t *) malloc( + sizeof(effect_param_t) + sizeof(unsigned) + sizeof(float)); + if (NULL == pParam) { + LOGE("[%s:%d]Failed to allocate memory!\n", __FUNCTION__, __LINE__); + return -1; + } + pParam->status = 0; + pParam->psize = sizeof(unsigned); + pParam->vsize = sizeof(float); + *(unsigned *) (&pParam->data[0]) = (unsigned) param; + status = mplpAudioEffectSrs->getParameter(pParam); + if (NO_ERROR != status) { + LOGE("[%s:%d]Failed to set parameter:%d!\n", __FUNCTION__, __LINE__, + param); + *value = 0.0f; + free(pParam); + return -1; + } else { + *value = *(float *) (&pParam->data[sizeof(unsigned)]); + free(pParam); + return 0; + } +} + +int CAndroidEffect::amAndroidSetSrsParameterInt(tshd_srs_param_t param, unsigned value) +{ + return setSrsParameterInt(param, value); +} + +int CAndroidEffect::amAndroidGetSrsParameterInt(tshd_srs_param_t param, + unsigned *value) +{ + return getSrsParameterInt(param, value); +} + +int CAndroidEffect::amAndroidSetSrsParameterFloat(tshd_srs_param_t param, float value) +{ + return setSrsParameterFloat(param, value); +} + +int CAndroidEffect::amAndroidGetSrsParameterFloat(tshd_srs_param_t param, float *value) +{ + return getSrsParameterFloat(param, value); +} + +int CAndroidEffect::amAndroidNewSRSAudioEffect(void) +{ + if ((NULL == mplpAudioEffectSrs) && (GetAudioSRSModuleDisableCFG() == 0)) { + initAudioEffect(&mplpAudioEffectSrs, NULL, SL_IID_SRS, + mTrackerSessionId); + if (NULL == mplpAudioEffectSrs) { + LOGE("[%s:%d] Failed to create audio effect SRS!\n", __FUNCTION__, + __LINE__); + return -1; + } + } + + return 0; +} + +int CAndroidEffect::amAndroidNewEQAudioEffect(void) +{ + if ((NULL == mplpAudioEffectEq) && (GetAudioEqModuleDisableCFG() == 0)) { + if (GetAudioEqUsingAndroidCFG()) { + initAudioEffect(&mplpAudioEffectEq, SL_IID_EQUALIZER, NULL, + mTrackerSessionId); + } else { + initAudioEffect(&mplpAudioEffectEq, NULL, SL_IID_HPEQ, + mTrackerSessionId); + } + + if (NULL == mplpAudioEffectEq) { + LOGE("[%s:%d] Failed to create audio effect EQ(android:%d)!\n", + __FUNCTION__, __LINE__, GetAudioEqUsingAndroidCFG()); + return -1; + } else { + // Init all forced gains to be invalid. + for (int i = 0; i < EQ_BAND_COUNT; i++) { + gEqForcedGain[i] = INVALID_EQ_FORCED_GAIN; + } + getEqGain(gEqUserSetGain, EQ_BAND_COUNT); + LOGD( + "[%s:%d] Audio effect EQ(android:%d) was created successfully!\n", + __FUNCTION__, __LINE__, GetAudioEqUsingAndroidCFG()); + } + } + + return 0; +} + +int CAndroidEffect::amAndroidNewAudioEffects(void) +{ + int tmp_ret = 0; + + tmp_ret |= amAndroidNewSRSAudioEffect(); + tmp_ret |= amAndroidNewEQAudioEffect(); + + return tmp_ret; +} + +void CAndroidEffect::amAndroidFreeAudioEffects(void) +{ + { + FreeAudioEffect(&mplpAudioEffectEq); + FreeAudioEffect(&mplpAudioEffectSrs); + + if (mTrackerSessionId != 0) { + AudioSystem::releaseAudioSessionId(mTrackerSessionId, -1); + mTrackerSessionId = 0; + } + } +} + +int CAndroidEffect::amAndroidGetAudioSessionId(void) +{ + return mTrackerSessionId; +} + +int CAndroidEffect::amAndroidSetSRSSurroundSwitch(int switch_val) +{ + return amAndroidSetSrsParameterInt(SRS_PARAM_SURROUND_ENABLE, + (unsigned) switch_val); +} + +int CAndroidEffect::amAndroidSetSRSSurroundGain(int gain_val) +{ + return amAndroidSetSrsParameterFloat(SRS_PARAM_SURROUND_GAIN, + (float) gain_val / 100.0f); +} + +int CAndroidEffect::amAndroidSetSRSTrubassSwitch(int switch_val) +{ + return amAndroidSetSrsParameterInt(SRS_PARAM_TRUEBASS_ENABLE, + (unsigned) switch_val); +} + +int CAndroidEffect::amAndroidSetSRSTrubassGain(int gain_val) +{ + return amAndroidSetSrsParameterFloat(SRS_PARAM_TRUEBASS_GAIN, + (float) gain_val / 100.0f); +} + +int CAndroidEffect::amAndroidSetSRSDialogClaritySwitch(int switch_val) +{ + return amAndroidSetSrsParameterInt(SRS_PARAM_DIALOGCLARITY_ENABLE, + (unsigned) switch_val); +} + +int CAndroidEffect::amAndroidSetSRSDialogClarityGain(int gain_val) +{ + return amAndroidSetSrsParameterFloat(SRS_PARAM_DIALOGCLARTY_GAIN, + (float) gain_val / 100.0f); +} + +int CAndroidEffect::amAndroidSetSRSDefinitionGain(int gain_val) +{ + return amAndroidSetSrsParameterFloat(SRS_PARAM_DEFINITION_GAIN, + (float) gain_val / 100.0f); +} + +int CAndroidEffect::amAndroidSetSRSTrubassSpeakerSize(int tmp_val) +{ + int tmp_buf[8] = { 40, 60, 100, 150, 200, 250, 300, 400 }; + int set_val = 40; + + if (tmp_val >= 0 && tmp_val < sizeof(tmp_buf)) { + set_val = tmp_buf[tmp_val]; + } + + return amAndroidSetSrsParameterInt(SRS_PARAM_TRUEBASS_SPKER_SIZE, set_val); +} + +int CAndroidEffect::setEqGain(const int gain_val_buf[], int band_count) +{ + if (NULL == mplpAudioEffectEq) { + LOGE("[%s:%d]\n", __FUNCTION__, __LINE__); + return -1; + } + + status_t status; + int i; + int gain; + effect_param_t *pParam; + int bAndroidEq = GetAudioEqUsingAndroidCFG(); + + if (bAndroidEq) { + pParam = (effect_param_t *) malloc( + sizeof(effect_param_t) + sizeof(int) + sizeof(int) + + sizeof(short)); + } else { + pParam = (effect_param_t *) malloc( + sizeof(effect_param_t) + sizeof(int) + sizeof(int)); + } + + if (NULL == pParam) { + LOGE("[%s:%d]Failed to allocate memory!\n", __FUNCTION__, __LINE__); + return -1; + } + + for (i = 0; i < band_count; i++) { + if (gEqForcedGain[i] != INVALID_EQ_FORCED_GAIN) { + gain = gEqForcedGain[i]; + } else { + gain = gain_val_buf[i]; + } + + if (bAndroidEq) { + pParam->status = 0; + pParam->psize = sizeof(int) * 2; + pParam->vsize = sizeof(short); + *(int *) (&pParam->data[0]) = EQ_PARAM_BAND_LEVEL; + *(int *) (&pParam->data[sizeof(int)]) = i; + *(short *) (&pParam->data[sizeof(int) * 2]) = (short) gain; + } else { + pParam->status = 0; + pParam->psize = sizeof(int); + pParam->vsize = sizeof(int); + *(int *) (&pParam->data[0]) = i; + *(int *) (&pParam->data[sizeof(int)]) = gain; + } + + status = mplpAudioEffectEq->setParameter(pParam); + if (NO_ERROR != status) { + LOGE("[%s:%d]Failed to set parameter:%d!\n", __FUNCTION__, __LINE__, + i); + free(pParam); + return -1; + } + } + + free(pParam); + return 0; +} + +int CAndroidEffect::getEqGain(int gain_val_buf[], int band_count) +{ + if (NULL == mplpAudioEffectEq) { + return -1; + } + + status_t status; + effect_param_t *pParam; + int bAndroidEq = GetAudioEqUsingAndroidCFG(); + + if (bAndroidEq) { + pParam = (effect_param_t *) malloc( + sizeof(effect_param_t) + sizeof(int) + sizeof(int) + + sizeof(short)); + } else { + pParam = (effect_param_t *) malloc( + sizeof(effect_param_t) + sizeof(int) + sizeof(int)); + } + + if (NULL == pParam) { + LOGE("[%s:%d]Failed to allocate memory!\n", __FUNCTION__, __LINE__); + return -1; + } + + for (int i = 0; i < EQ_BAND_COUNT; i++) { + if (gEqForcedGain[i] != INVALID_EQ_FORCED_GAIN) { + gain_val_buf[i] = gEqUserSetGain[i]; + } else { + if (bAndroidEq) { + pParam->status = 0; + pParam->psize = sizeof(int) * 2; + pParam->vsize = sizeof(short); + *(int *) (&pParam->data[0]) = EQ_PARAM_BAND_LEVEL; + *(int *) (&pParam->data[sizeof(int)]) = i; + } else { + pParam->status = 0; + pParam->psize = sizeof(int); + pParam->vsize = sizeof(int); + *(int *) (&pParam->data[0]) = i; + } + status = mplpAudioEffectEq->getParameter(pParam); + if (NO_ERROR != status) { + LOGE("[%s:%d]Failed to set parameter:%d!\n", __FUNCTION__, + __LINE__, i); + free(pParam); + return -1; + } + + if (bAndroidEq) { + gain_val_buf[i] = *(short *) (&pParam->data[sizeof(int) * 2]); + } else { + gain_val_buf[i] = *(int *) (&pParam->data[sizeof(int)]); + } + } + } + + free(pParam); + return 0; +} + +int CAndroidEffect::amAndroidSetEQGain(const int gain_val_buf[], int band_count) +{ + int i; + int gain_factor = 1; + + if (band_count > EQ_BAND_COUNT) { + band_count = EQ_BAND_COUNT; + } + + // convert dB to 100th dB for android EQ + if (GetAudioEqUsingAndroidCFG()) { + gain_factor = 100; + } + + // store the gains set by the user, and convert it to the internal representation. + for (i = 0; i < band_count; i++) { + gEqUserSetGain[i] = gain_val_buf[i] * gain_factor; + } + + return setEqGain(gEqUserSetGain, band_count); +} + +int CAndroidEffect::amAndroidGetEQGain(int gain_val_buf[], int band_count) +{ + int i; + int ret; + + if (band_count > EQ_BAND_COUNT) { + band_count = EQ_BAND_COUNT; + } + + ret = getEqGain(gain_val_buf, band_count); + + // convert 100th dB to dB for android EQ + if (GetAudioEqUsingAndroidCFG()) { + for (i = 0; i < band_count; i++) { + gain_val_buf[i] /= 100; + } + } + + return ret; +} + +int CAndroidEffect::amAndroidSetEQEnable(int enabled) +{ + if (NULL == mplpAudioEffectEq) { + return -1; + } + + if (NO_ERROR != mplpAudioEffectEq->setEnabled(enabled)) { + return -1; + } else { + return 0; + } +} + +int CAndroidEffect::amAndroidGetEQEnabled() +{ + if (NULL == mplpAudioEffectEq) { + return 0; + } + + if (mplpAudioEffectEq->getEnabled()) { + return 1; + } else { + return 0; + } +} + +int CAndroidEffect::amAndroidForceEQGain(int band, int gain) +{ + if (band >= EQ_BAND_COUNT) { + LOGE("[%s:%d] band(%d) is out of bound!\n", __FUNCTION__, __LINE__, + band); + return -1; + } else { + if (GetAudioEqUsingAndroidCFG() && (gain != INVALID_EQ_FORCED_GAIN)) { + gEqForcedGain[band] = gain * 100; + } else { + gEqForcedGain[band] = gain; + } + + // reset the EQ bands to take effect of the forced one. + if (setEqGain(gEqUserSetGain, EQ_BAND_COUNT) != 0) { + LOGE("[%s:%d]Failed to reset EQ gain!\n", __FUNCTION__, __LINE__); + return -1; + } + + LOGD("[%s:%d] band(%d) is forced to %d!\n", __FUNCTION__, __LINE__, + band, gain); + return 0; + } +} diff --git a/tvapi/libtv/audio/audio_android_effect.h b/tvapi/libtv/audio/audio_android_effect.h new file mode 100644 index 0000000..fa8c9d6 --- a/dev/null +++ b/tvapi/libtv/audio/audio_android_effect.h @@ -0,0 +1,66 @@ +#ifndef __TV_AUDIO_ANDROID_EFFECT_H__ +#define __TV_AUDIO_ANDROID_EFFECT_H__ + + + +#include <media/AudioEffect.h> +#include <hardware/audio_effect.h> +#include <hardware/audio_effect_srs.h> +#include <hardware/audio_effect_hpeq.h> +#include <audio_effects/effect_equalizer.h> +#include "tvsetting/audio_cfg.h" + +#define EQ_BAND_COUNT (5) +using namespace android; + +class CAndroidEffect +{ +public: + CAndroidEffect(); + ~CAndroidEffect(); + int amAndroidNewAudioEffects(void); + void amAndroidFreeAudioEffects(void); + int amAndroidGetAudioSessionId(void); + + //EQ + int amAndroidSetEQGain(const int gain_val_buf[], int band_count); + int amAndroidGetEQGain(int gain_val_buf[], int band_count); + int amAndroidSetEQEnable(int enabled); + int amAndroidGetEQEnabled(); + + //SRS + int amAndroidSetSRSSurroundSwitch(int switch_val); + int amAndroidSetSRSSurroundGain(int gain_val); + int amAndroidSetSRSTrubassSwitch(int switch_val); + int amAndroidSetSRSTrubassGain(int gain_val); + int amAndroidSetSRSDialogClaritySwitch(int switch_val); + int amAndroidSetSRSDialogClarityGain(int gain_val); + int amAndroidSetSRSDefinitionGain(int gain_val); + int amAndroidSetSRSTrubassSpeakerSize(int tmp_val); + + +private: + int gEqForcedGain[EQ_BAND_COUNT]; + int gEqUserSetGain[EQ_BAND_COUNT]; + void FreeAudioEffect(AudioEffect **pEffect); + void initAudioEffect(AudioEffect **pEffect, const effect_uuid_t *const pEffectType, const effect_uuid_t *const pEffectUuid, int sessionId); + int setSrsParameterInt(tshd_srs_param_t param, unsigned value); + int getSrsParameterInt(tshd_srs_param_t param, unsigned *value); + int setSrsParameterFloat(tshd_srs_param_t param, float value); + int getSrsParameterFloat(tshd_srs_param_t param, float *value); + int amAndroidSetSrsParameterInt(tshd_srs_param_t param, unsigned value); + int amAndroidGetSrsParameterInt(tshd_srs_param_t param, unsigned *value); + int amAndroidSetSrsParameterFloat(tshd_srs_param_t param, float value); + int amAndroidGetSrsParameterFloat(tshd_srs_param_t param, float *value); + int getEqGain(int gain_val_buf[], int band_count); + int setEqGain(const int gain_val_buf[], int band_count); + int amAndroidNewSRSAudioEffect(void); + int amAndroidNewEQAudioEffect(void); + int amAndroidForceEQGain(int band, int gain); + + AudioEffect *mplpAudioEffectSrs; + AudioEffect *mplpAudioEffectEq; + int mTrackerSessionId; +}; + +#endif //__TV_AUDIO_ANDROID_EFFECT_H__ diff --git a/tvapi/libtv/audio/audio_api.cpp b/tvapi/libtv/audio/audio_api.cpp new file mode 100644 index 0000000..c856ba9 --- a/dev/null +++ b/tvapi/libtv/audio/audio_api.cpp @@ -0,0 +1,2470 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <pthread.h> +#include <fcntl.h> + +#include <android/log.h> +#include <cutils/properties.h> + +#include "../tvsetting/CTvSetting.h" +#include "../tvutils/tvutils.h" + +#include "audio_effect.h" +#include "audio_android.h" +#include "audio_android_effect.h" +#include "audio_amaudio.h" + +#include "audio_api.h" + +#define LOG_TAG "audio_api" +#include "CTvLog.h" + +static int mCustomEQGainBuf[] = { 0, 0, 0, 0, 0, 0 }; + +static int mCurEQGainBuf[] = { 0, 0, 0, 0, 0, 0 }; + +static int8_t mCurEQGainChBuf[] = { 0, 0, 0, 0, 0, 0 }; + +static int mWallEffectValueBuf[] = { 0, 0, 1, 2, 2, 0 }; + +static const int CC_MUTE_TYPE_KEY_MUTE = (0); +static const int CC_MUTE_TYPE_SYS_MUTE = (1); + + +//extern int audio_device_switch; +int audio_device_switch = 1;//showboz + +CTvAudio::CTvAudio() +{ + mAudioMuteStatusForSystem = CC_AUDIO_UNMUTE; + mAudioMuteStatusForTv = CC_AUDIO_UNMUTE; + mCurAudioMasterVolume = CC_DEF_SOUND_VOL; + mCurAudioBalance = CC_DEF_SOUND_BALANCE_VAL; + mCurAudioSupperBassVolume = CC_DEF_SUPPERBASS_VOL; + mCurAudioSupperBassSwitch = CC_SWITCH_OFF; + mCurAudioSRSSurround = CC_SWITCH_OFF; + mCurAudioSrsDialogClarity = CC_SWITCH_OFF; + mCurAudioSrsTruBass = CC_SWITCH_OFF; + mCurAudioSPDIFSwitch = CC_SWITCH_ON; + mCurAudioSPDIFMode = CC_SPDIF_MODE_PCM; + mCurAudioBassVolume = CC_DEF_BASS_TREBLE_VOL; + mCurAudioTrebleVolume = CC_DEF_BASS_TREBLE_VOL; + mCurAudioSoundMode = CC_SOUND_MODE_END; + mCurAudioWallEffect = CC_SWITCH_OFF; + mCurAudioEQMode = CC_EQ_MODE_START; + mCustomAudioMasterVolume = CC_DEF_SOUND_VOL; + mCustomAudioBalance = CC_DEF_SOUND_BALANCE_VAL; + mCustomAudioSupperBassVolume = CC_DEF_SUPPERBASS_VOL; + mCustomAudioSupperBassSwitch = CC_SWITCH_OFF; + mCustomAudioSRSSurround = CC_SWITCH_OFF; + mCustomAudioSrsDialogClarity = CC_SWITCH_OFF; + mCustomAudioSrsTruBass = CC_SWITCH_OFF; + mCustomAudioBassVolume = CC_DEF_BASS_TREBLE_VOL; + mCustomAudioTrebleVolume = CC_DEF_BASS_TREBLE_VOL; + mCustomAudioSoundMode = CC_SOUND_MODE_END; + mCustomAudioWallEffect = CC_SWITCH_OFF; + mCustomAudioEQMode = CC_EQ_MODE_START; + mCustomAudioSoundEnhancementSwitch = CC_SWITCH_OFF; + mVolumeCompensationVal = CC_VOLUME_COMPENSATION_DEF_VAL; +} + +CTvAudio::~CTvAudio() +{ + +} + +template<typename T1, typename T2> +int AudioArrayCopy(T1 dst_buf[], T2 src_buf[], int copy_size) +{ + int i = 0; + + for (i = 0; i < copy_size; i++) { + dst_buf[i] = src_buf[i]; + } + + return 0; +} + +//Audio Mute +int CTvAudio::SetAudioMuteForSystem(int muteOrUnmute) +{ + int ret = 0; + LOGD("SetAudioMuteForSystem sysMuteStats=%d, tvMuteStatus=%d, toMute=%d", mAudioMuteStatusForSystem, mAudioMuteStatusForTv, muteOrUnmute); + mAudioMuteStatusForSystem = muteOrUnmute; + ret |= mAudioAlsa.SetDacMute(mAudioMuteStatusForSystem | mAudioMuteStatusForTv, CC_DAC_MUTE_TYPE_EXTERNAL | CC_DAC_MUTE_TYPE_INTERNAL); + ret |= SetAudioSPDIFMute(mAudioMuteStatusForSystem | mAudioMuteStatusForTv); + return ret; +} + +int CTvAudio::GetAudioMuteForSystem() +{ + return mAudioMuteStatusForSystem; +} + +int CTvAudio::SetAudioMuteForTv(int Mute) +{ + int ret = 0; + mAudioMuteStatusForTv = Mute; + LOGD("SetAudioMuteForTv sysMuteStats=%d, tvMuteStatus=%d, toMute=%d", mAudioMuteStatusForSystem, mAudioMuteStatusForTv, Mute); + ret |= mAudioAlsa.SetDacMute(mAudioMuteStatusForSystem | mAudioMuteStatusForTv, CC_DAC_MUTE_TYPE_EXTERNAL | CC_DAC_MUTE_TYPE_INTERNAL); + ret |= SetAudioSPDIFMute(mAudioMuteStatusForSystem | mAudioMuteStatusForTv); + return ret; +} + +int CTvAudio::GetAudioMuteForTv() +{ + return mAudioMuteStatusForTv; +} + +int CTvAudio::SetAudioAVOutMute(int muteStatus) +{ + return mAudioAlsa.SetDacMute(muteStatus, CC_DAC_MUTE_TYPE_INTERNAL); +} + +int CTvAudio::GetAudioAVOutMute() +{ + return CC_AUDIO_UNMUTE; +} + +int CTvAudio::handleAudioSPDIFMute(int muteStatus) +{ + int set_val = 0; + + if (muteStatus == CC_AUDIO_MUTE) { + set_val = CC_SPDIF_MUTE_ON; + } else if (muteStatus == CC_AUDIO_UNMUTE) { + set_val = CC_SPDIF_MUTE_OFF; + } else { + return -1; + } + + return mAudioAlsa.SetSPDIFMute(set_val); +} + +int CTvAudio::SetAudioSPDIFMute(int muteStatus) +{ + if (GetCurAudioSPDIFSwitch() == CC_SWITCH_OFF) { + muteStatus = CC_AUDIO_MUTE; + } + + return handleAudioSPDIFMute(muteStatus); +} + +int CTvAudio::GetAudioSPDIFMute() +{ + return CC_AUDIO_UNMUTE; +} + +//Audio SPDIF switch +int CTvAudio::SetAudioSPDIFSwitch(int tmp_val) +{ + int muteStatus = CC_AUDIO_UNMUTE; + + mCurAudioSPDIFSwitch = tmp_val; + + if (tmp_val == CC_SWITCH_OFF || mAudioMuteStatusForSystem == CC_AUDIO_MUTE || mAudioMuteStatusForTv == CC_AUDIO_MUTE) { + muteStatus = CC_AUDIO_MUTE; + } else { + muteStatus = CC_AUDIO_UNMUTE; + } + + handleAudioSPDIFMute(muteStatus); + return 0; +} + +int CTvAudio::GetCurAudioSPDIFSwitch() +{ + return mCurAudioSPDIFSwitch; +} + +int CTvAudio::SaveCurAudioSPDIFSwitch(int tmp_val) +{ + int8_t tmp_ch = 0; + if (tmp_val != CC_SWITCH_ON && tmp_val != CC_SWITCH_OFF) { + tmp_val = CC_SWITCH_ON; + } + + mCurAudioSPDIFSwitch = tmp_val; + tmp_ch = tmp_val; + SSMSaveAudioSPDIFSwitchVal(tmp_ch); + + return mCurAudioSPDIFSwitch; +} + +int CTvAudio::LoadCurAudioSPDIFSwitch() +{ + int8_t tmp_ch = 0; + SSMReadAudioSPDIFSwitchVal(&tmp_ch); + mCurAudioSPDIFSwitch = tmp_ch; + if (mCurAudioSPDIFSwitch != CC_SWITCH_ON + && mCurAudioSPDIFSwitch != CC_SWITCH_OFF) { + SaveCurAudioSPDIFSwitch (CC_SWITCH_ON); + } + return mCurAudioSPDIFSwitch; +} + +//Audio SPDIF Mode +int CTvAudio::SetAudioSPDIFMode(int tmp_val) +{ + LOGD("%s : tmp_val = %d\n", __FUNCTION__, tmp_val); + mCurAudioSPDIFMode = tmp_val; + + SetSPDIFMode(mCurAudioSPDIFMode); + + return 0; +} + +int CTvAudio::GetCurAudioSPDIFMode() +{ + return mCurAudioSPDIFMode; +} + +int CTvAudio::SaveCurAudioSPDIFMode(int tmp_val) +{ + int8_t tmp_ch = 0; + if (tmp_val != CC_SPDIF_MODE_PCM && tmp_val != CC_SPDIF_MODE_RAW) { + tmp_val = CC_SPDIF_MODE_PCM; + } + + mCurAudioSPDIFMode = tmp_val; + tmp_ch = tmp_val; + SSMSaveAudioSPDIFModeVal(tmp_ch); + + return mCurAudioSPDIFMode; +} + +int CTvAudio::LoadCurAudioSPDIFMode() +{ + int8_t tmp_ch = 0; + SSMReadAudioSPDIFModeVal(&tmp_ch); + mCurAudioSPDIFMode = tmp_ch; + if (mCurAudioSPDIFMode != CC_SPDIF_MODE_PCM + && mCurAudioSPDIFMode != CC_SPDIF_MODE_RAW) { + SaveCurAudioSPDIFMode (CC_SPDIF_MODE_PCM); + } + return mCurAudioSPDIFMode; +} + +//Audio Master Volume +int CTvAudio::SetAudioMasterVolume(int tmp_vol) +{ + const char *value; + if (tmp_vol < CC_MIN_SOUND_VOL || tmp_vol > CC_MAX_SOUND_VOL) { + tmp_vol = CC_DEF_SOUND_VOL; + } + + mCustomAudioMasterVolume = tmp_vol; + + //Volume Compensation + if (tmp_vol != CC_MIN_SOUND_VOL) { + tmp_vol += GetAudioVolumeCompensationVal(); + } + + if (tmp_vol > CC_MAX_SOUND_VOL) { + tmp_vol = CC_MAX_SOUND_VOL; + } + + if (tmp_vol < CC_MIN_SOUND_VOL) { + tmp_vol = CC_MIN_SOUND_VOL; + } + + mAudioAlsa.SetDacMainVolume(tmp_vol); + value = config_get_str ( "TV", "tvin.2d4G.headset.en", "null" ); + if ( strcmp ( value, "enable" ) == 0 ) { + setAudioPcmPlaybackVolume(tmp_vol); + } + return 0; +} + +int CTvAudio::GetAudioMasterVolume() +{ + return mCustomAudioMasterVolume; +} + +int CTvAudio::GetCurAudioMasterVolume() +{ + return mCurAudioMasterVolume; +} + +int CTvAudio::SaveCurAudioMasterVolume(int tmp_vol) +{ + int8_t tmp_ch = 0; + + if (tmp_vol < CC_MIN_SOUND_VOL || tmp_vol > CC_MAX_SOUND_VOL) { + tmp_vol = CC_DEF_SOUND_VOL; + } + + mCurAudioMasterVolume = tmp_vol; + tmp_ch = tmp_vol; + SSMSaveAudioMasterVolume(tmp_ch); + + return mCurAudioMasterVolume; +} + +int CTvAudio::LoadCurAudioMasterVolume() +{ + int8_t tmp_ch = 0; + SSMReadAudioMasterVolume(&tmp_ch); + mCurAudioMasterVolume = tmp_ch; + if (mCurAudioMasterVolume < CC_MIN_SOUND_VOL + || mCurAudioMasterVolume > CC_MAX_SOUND_VOL) { + SaveCurAudioMasterVolume (CC_DEF_SOUND_VOL); + } + + mCustomAudioMasterVolume = mCurAudioMasterVolume; + + return mCurAudioMasterVolume; +} + +//Audio Balance +int CTvAudio::SetAudioBalance(int tmp_val) +{ + if (tmp_val < CC_MIN_SOUND_BALANCE_VAL + || tmp_val > CC_MAX_SOUND_BALANCE_VAL) { + tmp_val = CC_DEF_SOUND_BALANCE_VAL; + } + + mCustomAudioBalance = tmp_val; + + if (mAudioAlsa.SetBalanceValue(mCustomAudioBalance) < 0) { + return SetAudioMasterVolume(GetAudioMasterVolume()); + } + + return 0; +} + +int CTvAudio::GetAudioBalance() +{ + return mCustomAudioBalance; +} + +int CTvAudio::GetCurAudioBalance() +{ + return mCurAudioBalance; +} + +int CTvAudio::SaveCurAudioBalance(int tmp_val) +{ + int8_t tmp_ch = 0; + + if (tmp_val < CC_MIN_SOUND_BALANCE_VAL + || tmp_val > CC_MAX_SOUND_BALANCE_VAL) { + tmp_val = CC_DEF_SOUND_BALANCE_VAL; + } + + mCurAudioBalance = tmp_val; + tmp_ch = tmp_val; + SSMSaveAudioBalanceVal(tmp_ch); + + return mCurAudioBalance; +} + +int CTvAudio::LoadCurAudioBalance() +{ + int8_t tmp_ch = 0; + SSMReadAudioBalanceVal(&tmp_ch); + mCurAudioBalance = tmp_ch; + if (mCurAudioBalance < CC_MIN_SOUND_BALANCE_VAL + || mCurAudioBalance > CC_MAX_SOUND_BALANCE_VAL) { + SaveCurAudioBalance (CC_DEF_SOUND_BALANCE_VAL); + } + + mCustomAudioBalance = mCurAudioBalance; + + return mCurAudioBalance; +} + +int CTvAudio::SetAudioVolumeCompensationVal(int tmp_vol_comp_val) +{ + int tmp_val = 0; + tmp_val = mVolumeCompensationVal; + mVolumeCompensationVal = tmp_vol_comp_val; + LOGD("%s, old vol comp value = %d, new vol comp value = %d.\n", + __FUNCTION__, tmp_val, tmp_vol_comp_val); + return tmp_val; +} + +int CTvAudio::GetAudioVolumeCompensationVal() +{ + int tmp_vol_comp_val = 0; + tmp_vol_comp_val = mVolumeCompensationVal; + if (tmp_vol_comp_val < CC_VOLUME_COMPENSATION_MIN_VAL + || tmp_vol_comp_val > CC_VOLUME_COMPENSATION_MAX_VAL) { + tmp_vol_comp_val = CC_VOLUME_COMPENSATION_DEF_VAL; + } + LOGD("%s, vol comp value = %d, return value = %d.\n", __FUNCTION__, + mVolumeCompensationVal, tmp_vol_comp_val); + + return tmp_vol_comp_val; +} + +//Audio SupperBass Volume +int CTvAudio::SetAudioSupperBassVolume(int tmp_vol) +{ + if (tmp_vol < CC_MIN_SUPPERBASS_VOL || tmp_vol > CC_MAX_SUPPERBASS_VOL) { + tmp_vol = CC_DEF_SUPPERBASS_VOL; + } + + mCustomAudioSupperBassVolume = tmp_vol; + + return mAudioAlsa.SetDacSupperBassVolume(mCustomAudioSupperBassVolume); +} + +int CTvAudio::GetAudioSupperBassVolume() +{ + return mCustomAudioSupperBassVolume; +} + +int CTvAudio::GetCurAudioSupperBassVolume() +{ + return mCurAudioSupperBassVolume; +} + +int CTvAudio::SaveCurAudioSupperBassVolume(int tmp_vol) +{ + int8_t tmp_ch = 0; + if (tmp_vol < CC_MIN_SUPPERBASS_VOL || tmp_vol > CC_MAX_SUPPERBASS_VOL) { + tmp_vol = CC_DEF_SUPPERBASS_VOL; + } + + mCurAudioSupperBassVolume = tmp_vol; + tmp_ch = tmp_vol; + SSMSaveAudioSupperBassVolume(tmp_ch); + + return mCurAudioSupperBassVolume; +} + +int CTvAudio::LoadCurAudioSupperBassVolume() +{ + int8_t tmp_ch = 0; + SSMReadAudioSupperBassVolume(&tmp_ch); + mCurAudioSupperBassVolume = tmp_ch; + if (mCurAudioSupperBassVolume < CC_MIN_SUPPERBASS_VOL + || mCurAudioSupperBassVolume > CC_MAX_SUPPERBASS_VOL) { + SaveCurAudioSupperBassVolume (CC_DEF_SUPPERBASS_VOL); + } + + mCustomAudioSupperBassVolume = mCurAudioSupperBassVolume; + + return mCurAudioSupperBassVolume; +} + +//Audio SupperBass Switch +int CTvAudio::SetAudioSupperBassSwitch(int tmp_val) +{ + if (tmp_val != CC_SWITCH_ON && tmp_val != CC_SWITCH_OFF) { + tmp_val = CC_SWITCH_OFF; + } + + mCustomAudioSupperBassSwitch = tmp_val; + + if (GetAudioSupperBassSwitch() == CC_SWITCH_OFF) { + return mAudioAlsa.SetDacSupperBassVolume(CC_MIN_SUPPERBASS_VOL); + } + + return mAudioAlsa.SetDacSupperBassVolume(GetAudioSupperBassVolume()); +} + +int CTvAudio::GetAudioSupperBassSwitch() +{ + if (GetAudioSupperBassSwitchDisableCFG() != 0) { + return CC_SWITCH_ON; + } + + return mCustomAudioSupperBassSwitch; +} + +int CTvAudio::GetCurAudioSupperBassSwitch() +{ + if (GetAudioSupperBassSwitchDisableCFG() != 0) { + return CC_SWITCH_ON; + } + + return mCurAudioSupperBassSwitch; +} + +int CTvAudio::SaveCurAudioSupperBassSwitch(int tmp_val) +{ + int8_t tmp_ch = 0; + if (tmp_val != CC_SWITCH_ON && tmp_val != CC_SWITCH_OFF) { + tmp_val = CC_SWITCH_OFF; + } + + mCurAudioSupperBassSwitch = tmp_val; + tmp_ch = tmp_val; + SSMSaveAudioSupperBassSwitch(tmp_ch); + + HandleSupperBassSwicth(); + + return mCurAudioSupperBassSwitch; +} + +int CTvAudio::LoadCurAudioSupperBassSwitch() +{ + int8_t tmp_ch = 0; + SSMReadAudioSupperBassSwitch(&tmp_ch); + mCurAudioSupperBassSwitch = tmp_ch; + if (mCurAudioSupperBassSwitch != CC_SWITCH_ON + && mCurAudioSupperBassSwitch != CC_SWITCH_OFF) { + SaveCurAudioSupperBassSwitch (CC_SWITCH_OFF); + } + + mCustomAudioSupperBassSwitch = mCurAudioSupperBassSwitch; + + HandleSupperBassSwicth(); + + return mCurAudioSupperBassSwitch; +} + +void CTvAudio::HanldeSupperBassSRSSpeakerSize() +{ + int tmp_speakersize = -1; + + if (GetAudioSrsTruBass() == CC_SWITCH_ON) { + if (GetAudioSupperBassSwitch() == CC_SWITCH_ON) { + tmp_speakersize = GetAudioSRSSupperBassTrubassSpeakerSizeCfg(1); + } else { + tmp_speakersize = GetAudioSRSSupperBassTrubassSpeakerSizeCfg(0); + } + + if (tmp_speakersize >= 0) { + mAudioEffect.SetSrsTrubassSpeakerSize(tmp_speakersize); + } + } +} + +void CTvAudio::HandleSupperBassSwicth() +{ + if (GetAudioSupperBassModuleDisableCFG() != 0) { + return; + } + + HanldeSupperBassSRSSpeakerSize(); +} + +//Audio SRS Surround switch +int CTvAudio::SetAudioSRSSurround(int tmp_val) +{ + if (GetAudioSRSModuleDisableCFG() == 1) { + return 0; + } + + if (tmp_val != CC_SWITCH_ON && tmp_val != CC_SWITCH_OFF) { + tmp_val = CC_SWITCH_OFF; + } + + mCustomAudioSRSSurround = tmp_val; + + RealSetSRS(); + return 0; +} + +int CTvAudio::GetAudioSRSSurround() +{ + if (GetAudioSRSModuleDisableCFG() == 1) { + return CC_SWITCH_OFF; + } + + return mCustomAudioSRSSurround; +} + +int CTvAudio::GetCurAudioSRSSurround() +{ + if (GetAudioSRSModuleDisableCFG() == 1) { + return CC_SWITCH_OFF; + } + + return mCurAudioSRSSurround; +} + +int CTvAudio::SaveCurAudioSrsSurround(int tmp_val) +{ + int8_t tmp_ch = 0; + if (GetAudioSRSModuleDisableCFG() == 1) { + return 0; + } + + if (tmp_val != CC_SWITCH_ON && tmp_val != CC_SWITCH_OFF) { + tmp_val = CC_SWITCH_OFF; + } + + mCurAudioSRSSurround = tmp_val; + tmp_ch = tmp_val; + SSMSaveAudioSRSSurroundSwitch(tmp_ch); + + return mCurAudioSRSSurround; +} + +int CTvAudio::LoadCurAudioSrsSurround() +{ + int8_t tmp_ch = 0; + if (GetAudioSRSModuleDisableCFG() == 1) { + mCustomAudioSRSSurround = CC_SWITCH_OFF; + mCustomAudioSRSSurround = mCurAudioSRSSurround; + return mCurAudioSRSSurround; + } + + SSMReadAudioSRSSurroundSwitch(&tmp_ch); + mCurAudioSRSSurround = tmp_ch; + if (mCurAudioSRSSurround != CC_SWITCH_ON + && mCurAudioSRSSurround != CC_SWITCH_OFF) { + SaveCurAudioSrsSurround (CC_SWITCH_OFF); + } + + mCustomAudioSRSSurround = mCurAudioSRSSurround; + + return mCurAudioSRSSurround; +} + +//Audio SRS Dialog Clarity +int CTvAudio::SetAudioSrsDialogClarity(int tmp_val) +{ + if (GetAudioSRSModuleDisableCFG() == 1) { + return 0; + } + + if (tmp_val != CC_SWITCH_ON && tmp_val != CC_SWITCH_OFF) { + tmp_val = CC_SWITCH_OFF; + } + + mCustomAudioSrsDialogClarity = tmp_val; + RealSetSRS(); + + return 0; +} + +int CTvAudio::GetAudioSrsDialogClarity() +{ + if (GetAudioSRSModuleDisableCFG() == 1) { + return CC_SWITCH_OFF; + } + + return mCustomAudioSrsDialogClarity; +} + +int CTvAudio::GetCurAudioSrsDialogClarity() +{ + if (GetAudioSRSModuleDisableCFG() == 1) { + return CC_SWITCH_OFF; + } + + return mCurAudioSrsDialogClarity; +} + +int CTvAudio::SaveCurAudioSrsDialogClarity(int tmp_val) +{ + int8_t tmp_ch = 0; + if (GetAudioSRSModuleDisableCFG() == 1) { + return 0; + } + + if (tmp_val != CC_SWITCH_ON && tmp_val != CC_SWITCH_OFF) { + tmp_val = CC_SWITCH_OFF; + } + + mCurAudioSrsDialogClarity = tmp_val; + tmp_ch = tmp_val; + SSMSaveAudioSRSDialogClaritySwitch(tmp_ch); + + return mCurAudioSrsDialogClarity; +} + +int CTvAudio::LoadCurAudioSrsDialogClarity() +{ + int8_t tmp_ch = 0; + if (GetAudioSRSModuleDisableCFG() == 1) { + mCurAudioSrsDialogClarity = CC_SWITCH_OFF; + mCustomAudioSrsDialogClarity = mCurAudioSrsDialogClarity; + return mCurAudioSRSSurround; + } + + SSMReadAudioSRSDialogClaritySwitch(&tmp_ch); + mCurAudioSrsDialogClarity = tmp_ch; + if (mCurAudioSrsDialogClarity != CC_SWITCH_ON + && mCurAudioSrsDialogClarity != CC_SWITCH_OFF) { + SaveCurAudioSrsDialogClarity (CC_SWITCH_OFF); + } + + mCustomAudioSrsDialogClarity = mCurAudioSrsDialogClarity; + + return mCurAudioSrsDialogClarity; +} + +//Audio SRS Trubass +int CTvAudio::SetAudioSrsTruBass(int tmp_val) +{ + if (GetAudioSRSModuleDisableCFG() == 1) { + return 0; + } + + if (tmp_val != CC_SWITCH_ON && tmp_val != CC_SWITCH_OFF) { + tmp_val = CC_SWITCH_OFF; + } + + mCustomAudioSrsTruBass = tmp_val; + RealSetSRS(); + + return 0; +} + +int CTvAudio::GetAudioSrsTruBass() +{ + if (GetAudioSRSModuleDisableCFG() == 1) { + return CC_SWITCH_OFF; + } + + return mCustomAudioSrsTruBass; +} + +int CTvAudio::GetCurAudioSrsTruBass() +{ + if (GetAudioSRSModuleDisableCFG() == 1) { + return CC_SWITCH_OFF; + } + + return mCurAudioSrsTruBass; +} + +int CTvAudio::SaveCurAudioSrsTruBass(int tmp_val) +{ + int8_t tmp_ch = 0; + if (GetAudioSRSModuleDisableCFG() == 1) { + return 0; + } + + if (tmp_val != CC_SWITCH_ON && tmp_val != CC_SWITCH_OFF) { + tmp_val = CC_SWITCH_OFF; + } + + mCurAudioSrsTruBass = tmp_val; + tmp_ch = tmp_val; + SSMSaveAudioSRSTruBassSwitch(tmp_ch); + + return mCurAudioSrsTruBass; +} + +int CTvAudio::LoadCurAudioSrsTruBass() +{ + int8_t tmp_ch = 0; + if (GetAudioSRSModuleDisableCFG() == 1) { + mCurAudioSrsTruBass = CC_SWITCH_OFF; + mCustomAudioSrsTruBass = mCurAudioSrsTruBass; + return mCurAudioSRSSurround; + } + + SSMReadAudioSRSTruBassSwitch(&tmp_ch); + mCurAudioSrsTruBass = tmp_ch; + if (mCurAudioSrsTruBass != CC_SWITCH_ON + && mCurAudioSrsTruBass != CC_SWITCH_OFF) { + SaveCurAudioSrsTruBass (CC_SWITCH_OFF); + } + + mCustomAudioSrsTruBass = mCurAudioSrsTruBass; + + return mCurAudioSrsTruBass; +} + +void CTvAudio::RealSetSRS() +{ + int tmp_gain_val = 0; + int surround_switch = CC_SWITCH_OFF; + int trubass_switch = CC_SWITCH_OFF; + int dialogclarity_switch = CC_SWITCH_OFF; + + surround_switch = GetAudioSRSSurround(); + if (surround_switch == CC_SWITCH_ON) { + mAudioEffect.SetSrsSurroundSwitch(surround_switch); + tmp_gain_val = GetAudioSRSSourroundGainCfg(); + if (tmp_gain_val >= 0 && tmp_gain_val <= 100) { + mAudioEffect.SetSrsSurroundGain(tmp_gain_val); + } + + trubass_switch = GetAudioSrsTruBass(); + dialogclarity_switch = GetAudioSrsDialogClarity(); + if (trubass_switch == CC_SWITCH_ON + && dialogclarity_switch == CC_SWITCH_OFF) { + mAudioEffect.SetSrsTruBassSwitch (CC_SWITCH_ON); + + tmp_gain_val = GetAudioSRSTrubassOnlyGainCfg(); + if (tmp_gain_val >= 0 && tmp_gain_val <= 100) { + mAudioEffect.SetSrsTruBassGain(tmp_gain_val); + } + + mAudioEffect.SetSrsDialogClaritySwitch (CC_SWITCH_OFF); + } else if (trubass_switch == CC_SWITCH_OFF + && dialogclarity_switch == CC_SWITCH_ON) { + mAudioEffect.SetSrsTruBassSwitch (CC_SWITCH_OFF); + + mAudioEffect.SetSrsDialogClaritySwitch (CC_SWITCH_ON); + + tmp_gain_val = GetAudioSRSDialogClarityOnlyDefinitionGainCfg(); + if (tmp_gain_val >= 0 && tmp_gain_val <= 100) { + mAudioEffect.SetSrsDefinitionGain(tmp_gain_val); + } + + tmp_gain_val = GetAudioSRSDialogClarityOnlyGainCfg(); + if (tmp_gain_val >= 0 && tmp_gain_val <= 100) { + mAudioEffect.SetSrsDialogClarityGain(tmp_gain_val); + } + } else if (trubass_switch == CC_SWITCH_ON + && dialogclarity_switch == CC_SWITCH_ON) { + mAudioEffect.SetSrsTruBassSwitch (CC_SWITCH_ON); + + tmp_gain_val = GetAudioSRSTrubassAndDialogClarityTrubassGainCfg(); + if (tmp_gain_val >= 0 && tmp_gain_val <= 100) { + mAudioEffect.SetSrsTruBassGain(tmp_gain_val); + } + + mAudioEffect.SetSrsDialogClaritySwitch(CC_SWITCH_ON); + + tmp_gain_val = + GetAudioSRSTrubassAndDialogClarityDefinitionGainCfg(); + if (tmp_gain_val >= 0 && tmp_gain_val <= 100) { + mAudioEffect.SetSrsDefinitionGain(tmp_gain_val); + } + + tmp_gain_val = + GetAudioSRSTrubassAndDialogClarityDialogClarityGainCfg(); + if (tmp_gain_val >= 0 && tmp_gain_val <= 100) { + mAudioEffect.SetSrsDialogClarityGain(tmp_gain_val); + } + } else if (trubass_switch == CC_SWITCH_OFF + && dialogclarity_switch == CC_SWITCH_OFF) { + mAudioEffect.SetSrsTruBassSwitch (CC_SWITCH_OFF); + mAudioEffect.SetSrsDialogClaritySwitch(CC_SWITCH_OFF); + } + + HanldeSupperBassSRSSpeakerSize(); + } else { + mAudioEffect.SetSrsSurroundSwitch (CC_SWITCH_OFF); + mAudioEffect.SetSrsTruBassSwitch(CC_SWITCH_OFF); + mAudioEffect.SetSrsDialogClaritySwitch(CC_SWITCH_OFF); + } + + SetDacGain(); +} + +int CTvAudio::SetDacGain() +{ + int main_gain_val = 0, sb_gain_val = 0; + int sourround_switch, trubass_switch, dialogclarity_switch; + + sourround_switch = GetAudioSRSSurround(); + trubass_switch = GetAudioSrsTruBass(); + dialogclarity_switch = GetAudioSrsDialogClarity(); + + if (sourround_switch == CC_SWITCH_ON) { + main_gain_val = GetAudioSRSSourroundAmplifierMasterGainCfg(); + sb_gain_val = GetAudioSRSSourroundAmplifierSupperBassGainCfg(); + + if (dialogclarity_switch == CC_SWITCH_ON + && trubass_switch == CC_SWITCH_OFF) { + main_gain_val = GetAudioSRSDialogClarityOnlyAmplifierMasterGainCfg(); + sb_gain_val = GetAudioSRSDialogClarityOnlyAmplifierSupperBassGainCfg(); + } else if (dialogclarity_switch == CC_SWITCH_OFF + && trubass_switch == CC_SWITCH_ON) { + main_gain_val = GetAudioSRSTrubassOnlyAmplifierMasterGainCfg(); + sb_gain_val = GetAudioSRSTrubassOnlyAmplifierSupperBassGainCfg(); + } else if (dialogclarity_switch == CC_SWITCH_ON + && trubass_switch == CC_SWITCH_ON) { + main_gain_val = GetAudioSRSTrubassAndDialogClarityAmplifierMasterGainCfg(); + sb_gain_val = GetAudioSRSTrubassAndDialogClarityAmplifierSupperBassGainCfg(); + } + } + + mAudioAlsa.SetMainVolumeGain(main_gain_val); + mAudioAlsa.SetSupperBassVolumeGain(sb_gain_val); + + return 0; +} + +//Audio Bass +int CTvAudio::SetAudioBassVolume(int tmp_vol) +{ + int nMinBassVol = 0, nMaxBassVol = 0; + + nMinBassVol = GetBassUIMinGainVal(); + nMaxBassVol = GetBassUIMaxGainVal(); + + if (tmp_vol < nMinBassVol || tmp_vol > nMaxBassVol) { + tmp_vol = (nMaxBassVol + nMinBassVol) / 2; + } + + mCustomAudioBassVolume = tmp_vol; + + tmp_vol = MappingTrebleBassAndEqualizer(GetAudioBassVolume(), 0, + nMinBassVol, nMaxBassVol); + + return SetSpecialIndexEQGain(CC_EQ_BASS_IND, tmp_vol); +} + +int CTvAudio::GetAudioBassVolume() +{ + return mCustomAudioBassVolume; +} + +int CTvAudio::GetCurAudioBassVolume() +{ + return mCurAudioBassVolume; +} + +int CTvAudio::SaveCurAudioBassVolume(int tmp_vol) +{ + int nMinBassVol = 0, nMaxBassVol = 0; + + nMinBassVol = GetBassUIMinGainVal(); + nMaxBassVol = GetBassUIMaxGainVal(); + + if (tmp_vol < nMinBassVol || tmp_vol > nMaxBassVol) { + tmp_vol = (nMaxBassVol + nMinBassVol) / 2; + } + + RealSaveCurAudioBassVolume(tmp_vol, 1); + + tmp_vol = MappingTrebleBassAndEqualizer(GetCurAudioBassVolume(), 0, + nMinBassVol, nMaxBassVol); + + return SaveSpecialIndexEQGain(CC_EQ_BASS_IND, tmp_vol); +} + +int CTvAudio::RealSaveCurAudioBassVolume(int tmp_vol, int sound_mode_judge) +{ + int8_t tmp_ch = 0; + mCurAudioBassVolume = tmp_vol; + tmp_ch = tmp_vol; + SSMSaveAudioBassVolume(tmp_ch); + + if (sound_mode_judge == 1) { + if (GetAudioSoundMode() != CC_SOUND_MODE_USER) { + SaveCurAudioSoundMode (CC_SOUND_MODE_USER); + mCustomAudioSoundMode = mCurAudioSoundMode; + } + } + + return mCurAudioBassVolume; +} + +int CTvAudio::LoadCurAudioBassVolume() +{ + int nMinBassVol = 0, nMaxBassVol = 0; + int8_t tmp_ch = 0; + + nMinBassVol = GetBassUIMinGainVal(); + nMaxBassVol = GetBassUIMaxGainVal(); + + SSMReadAudioBassVolume(&tmp_ch); + mCurAudioBassVolume = tmp_ch; + if (mCurAudioBassVolume < nMinBassVol + || mCurAudioBassVolume > nMaxBassVol) { + RealSaveCurAudioBassVolume((nMaxBassVol + nMinBassVol) / 2, 0); + } + + mCustomAudioBassVolume = mCurAudioBassVolume; + + return mCurAudioBassVolume; +} + +//Audio Treble +int CTvAudio::SetAudioTrebleVolume(int tmp_vol) +{ + int nMinTrebleVol = 0, nMaxTrebleVol = 0; + + nMinTrebleVol = GetTrebleUIMinGainVal(); + nMaxTrebleVol = GetTrebleUIMaxGainVal(); + + if (tmp_vol < nMinTrebleVol || tmp_vol > nMaxTrebleVol) { + tmp_vol = (nMaxTrebleVol + nMinTrebleVol) / 2; + } + + mCustomAudioTrebleVolume = tmp_vol; + + tmp_vol = MappingTrebleBassAndEqualizer(GetAudioTrebleVolume(), 0, + nMinTrebleVol, nMaxTrebleVol); + + return SetSpecialIndexEQGain(CC_EQ_TREBLE_IND, tmp_vol); +} + +int CTvAudio::GetAudioTrebleVolume() +{ + return mCustomAudioTrebleVolume; +} + +int CTvAudio::GetCurAudioTrebleVolume() +{ + return mCurAudioTrebleVolume; +} + +int CTvAudio::SaveCurAudioTrebleVolume(int tmp_vol) +{ + int nMinTrebleVol = 0, nMaxTrebleVol = 0; + + nMinTrebleVol = GetTrebleUIMinGainVal(); + nMaxTrebleVol = GetTrebleUIMaxGainVal(); + + if (tmp_vol < nMinTrebleVol || tmp_vol > nMaxTrebleVol) { + tmp_vol = (nMaxTrebleVol + nMinTrebleVol) / 2; + } + + RealSaveCurAudioTrebleVolume(tmp_vol, 1); + + tmp_vol = MappingTrebleBassAndEqualizer(GetCurAudioTrebleVolume(), 0, + nMinTrebleVol, nMaxTrebleVol); + + return SaveSpecialIndexEQGain(CC_EQ_TREBLE_IND, tmp_vol); +} + +int CTvAudio::RealSaveCurAudioTrebleVolume(int tmp_vol, int sound_mode_judge) +{ + int8_t tmp_ch = 0; + mCurAudioTrebleVolume = tmp_vol; + tmp_ch = tmp_vol; + SSMSaveAudioTrebleVolume(tmp_ch); + + if (sound_mode_judge == 1) { + if (GetAudioSoundMode() != CC_SOUND_MODE_USER) { + SaveCurAudioSoundMode (CC_SOUND_MODE_USER); + mCustomAudioSoundMode = mCurAudioSoundMode; + } + } + + return mCurAudioTrebleVolume; +} + +int CTvAudio::LoadCurAudioTrebleVolume() +{ + int nMinTrebleVol = 0, nMaxTrebleVol = 0; + int8_t tmp_ch = 0; + + nMinTrebleVol = GetTrebleUIMinGainVal(); + nMaxTrebleVol = GetTrebleUIMaxGainVal(); + + SSMReadAudioTrebleVolume(&tmp_ch); + mCurAudioTrebleVolume = tmp_ch; + if (mCurAudioTrebleVolume < nMinTrebleVol + || mCurAudioTrebleVolume > nMaxTrebleVol) { + RealSaveCurAudioTrebleVolume((nMaxTrebleVol + nMinTrebleVol) / 2, 0); + } + + mCustomAudioTrebleVolume = mCurAudioTrebleVolume; + + return mCurAudioTrebleVolume; +} + +//Audio Sound Mode +int CTvAudio::SetAudioSoundMode(int tmp_val) +{ + if (tmp_val < CC_SOUND_MODE_START || tmp_val > CC_SOUND_MODE_END) { + tmp_val = CC_SOUND_MODE_STD; + } + + LOGD("%s : sound mode = %d\n", __FUNCTION__, tmp_val); + + mCustomAudioSoundMode = tmp_val; + SetSpecialModeEQGain(mCustomAudioSoundMode); + + HandleTrebleBassVolume(); + + return 0; +} + +int CTvAudio::GetAudioSoundMode() +{ + return mCustomAudioSoundMode; +} + +int CTvAudio::GetCurAudioSoundMode() +{ + return mCurAudioSoundMode; +} + +int CTvAudio::SaveCurAudioSoundMode(int tmp_val) +{ + int8_t tmp_ch = 0; + if (tmp_val < CC_SOUND_MODE_START || tmp_val > CC_SOUND_MODE_END) { + tmp_val = CC_SOUND_MODE_STD; + } + + mCurAudioSoundMode = tmp_val; + tmp_ch = tmp_val; + SSMSaveAudioSoundModeVal(tmp_ch); + + return mCurAudioSoundMode; +} + +int CTvAudio::LoadCurAudioSoundMode() +{ + int8_t tmp_ch = 0; + SSMReadAudioSoundModeVal(&tmp_ch); + mCurAudioSoundMode = tmp_ch; + if (mCurAudioSoundMode < CC_SOUND_MODE_START + || mCurAudioSoundMode > CC_SOUND_MODE_END) { + SaveCurAudioSoundMode (CC_SOUND_MODE_STD); + } + + mCustomAudioSoundMode = mCurAudioSoundMode; + + return mCurAudioSoundMode; +} + +int CTvAudio::HandleTrebleBassVolume() +{ + int tmp_vol = 0; + int tmpEQGainBuf[128] = { 0 }; + int8_t tmp_ch = 0; + + GetCustomEQGain(tmpEQGainBuf); + + tmp_vol = MappingTrebleBassAndEqualizer(tmpEQGainBuf[CC_EQ_TREBLE_IND], 1, + GetTrebleUIMinGainVal(), GetTrebleUIMaxGainVal()); + mCustomAudioTrebleVolume = tmp_vol; + mCurAudioTrebleVolume = mCustomAudioTrebleVolume; + tmp_ch = mCustomAudioTrebleVolume; + SSMSaveAudioTrebleVolume(tmp_ch); + + tmp_vol = MappingTrebleBassAndEqualizer(tmpEQGainBuf[CC_EQ_BASS_IND], 1, + GetBassUIMinGainVal(), GetBassUIMaxGainVal()); + mCustomAudioBassVolume = tmp_vol; + mCurAudioBassVolume = mCustomAudioBassVolume; + tmp_ch = mCustomAudioBassVolume; + SSMSaveAudioBassVolume(tmp_ch); + + return 0; +} + +//Audio Wall Effect +int CTvAudio::SetAudioWallEffect(int tmp_val) +{ + int tmp_treble_val; + int tmp_type = 0; + + if (tmp_val != CC_SWITCH_ON && tmp_val != CC_SWITCH_OFF) { + tmp_val = CC_SWITCH_OFF; + } + + mCustomAudioWallEffect = tmp_val; + + tmp_type = GetAudioWallEffectTypeCfg(); + if (tmp_type == 0) { + SetCustomEQGain(); + } else if (tmp_type == 1) { + mAudioAlsa.SetDacEQMode(tmp_val); + } + + return 0; +} + +int CTvAudio::GetAudioWallEffect() +{ + return mCustomAudioWallEffect; +} + +int CTvAudio::GetCurAudioWallEffect() +{ + return mCurAudioWallEffect; +} + +int CTvAudio::SaveCurAudioWallEffect(int tmp_val) +{ + int8_t tmp_ch = 0; + if (tmp_val != CC_SWITCH_ON && tmp_val != CC_SWITCH_OFF) { + tmp_val = CC_SWITCH_OFF; + } + + mCurAudioWallEffect = tmp_val; + tmp_ch = tmp_val; + SSMSaveAudioWallEffectSwitch(tmp_ch); + + return mCurAudioWallEffect; +} + +int CTvAudio::LoadCurAudioWallEffect() +{ + int8_t tmp_ch = 0; + SSMReadAudioWallEffectSwitch(&tmp_ch); + mCurAudioWallEffect = tmp_ch; + if (mCurAudioWallEffect != CC_SWITCH_ON + && mCurAudioWallEffect != CC_SWITCH_OFF) { + SaveCurAudioWallEffect (CC_SWITCH_OFF); + } + + mCustomAudioWallEffect = mCurAudioWallEffect; + + return mCurAudioWallEffect; +} + +//Audio EQ Mode +int CTvAudio::SetAudioEQMode(int tmp_val) +{ + if (tmp_val < CC_EQ_MODE_START || tmp_val > CC_EQ_MODE_END) { + tmp_val = CC_EQ_MODE_START; + } + + mCustomAudioEQMode = tmp_val; + + return 0; +} + +int CTvAudio::GetAudioEQMode() +{ + return mCustomAudioEQMode; +} + +int CTvAudio::GetCurAudioEQMode() +{ + return mCurAudioEQMode; +} + +int CTvAudio::SaveCurAudioEQMode(int tmp_val) +{ + int8_t tmp_ch = 0; + if (tmp_val < CC_EQ_MODE_START || tmp_val > CC_EQ_MODE_END) { + tmp_val = CC_EQ_MODE_START; + } + + mCurAudioEQMode = tmp_val; + tmp_ch = tmp_val; + SSMSaveAudioEQModeVal(tmp_ch); + + return tmp_val; +} + +int CTvAudio::LoadCurAudioEQMode() +{ + int8_t tmp_ch = 0; + SSMReadAudioEQModeVal(&tmp_ch); + mCurAudioEQMode = tmp_ch; + if (mCurAudioEQMode < CC_EQ_MODE_START + || mCurAudioEQMode > CC_EQ_MODE_END) { + SaveCurAudioEQMode (CC_EQ_MODE_START); + } + + mCustomAudioEQMode = mCurAudioEQMode; + + return mCurAudioEQMode; +} + +//Audio EQ Gain +int CTvAudio::GetAudioEQRange(int range_buf[]) +{ + range_buf[0] = GetEQMinGainVal(); + range_buf[1] = GetEQMaxGainVal(); + return 0; +} + +int CTvAudio::GetAudioEQBandCount() +{ + return mAudioEffect.GetEQBandCount(); +} + +int CTvAudio::SetAudioEQGain(int gain_buf[]) +{ + return AudioSetEQGain(gain_buf); +} + +int CTvAudio::GetAudioEQGain(int gain_buf[]) +{ + return GetCustomEQGain(gain_buf); +} + +int CTvAudio::GetCurAudioEQGain(int gain_buf[]) +{ + RealReadCurAudioEQGain(gain_buf); + return 0; +} + +int CTvAudio::SaveCurAudioEQGain(int gain_buf[]) +{ + return RealSaveCurAudioEQGain(gain_buf, 1); +} + +int CTvAudio::RealReadCurAudioEQGain(int gain_buf[]) +{ + if (CheckAudioEQGain(mCurEQGainBuf, 0) < 0) { + RestoreToAudioDefEQGain(mCurEQGainBuf); + } + + AudioArrayCopy(gain_buf, mCurEQGainBuf, GetAudioEQBandCount()); + + return 0; +} + +int CTvAudio::RealSaveCurAudioEQGain(int gain_buf[], int sound_mode_judge) +{ + if (CheckAudioEQGain(gain_buf, 0) < 0) { + RestoreToAudioDefEQGain(gain_buf); + SetAudioEQGain(gain_buf); + return -1; + } + + AudioArrayCopy(mCurEQGainBuf, gain_buf, GetAudioEQBandCount()); + AudioArrayCopy(mCurEQGainChBuf, gain_buf, GetAudioEQBandCount()); + SSMSaveAudioEQGain(0, GetAudioEQBandCount(), mCurEQGainChBuf); + + if (sound_mode_judge == 1) { + HandleTrebleBassVolume(); + SaveCurAudioSoundMode (CC_SOUND_MODE_USER); + mCustomAudioSoundMode = mCurAudioSoundMode; + } + + return 0; +} + +int CTvAudio::LoadCurAudioEQGain() +{ + int i = 0; + + SSMReadAudioEQGain(0, GetAudioEQBandCount(), mCurEQGainChBuf); + AudioArrayCopy(mCurEQGainBuf, mCurEQGainChBuf, GetAudioEQBandCount()); + + for (i = 0; i < GetAudioEQBandCount(); i++) { + if (mCurEQGainBuf[i] & 0x80) { + mCurEQGainBuf[i] = mCurEQGainBuf[i] - 256; + } + } + + if (CheckAudioEQGain(mCurEQGainBuf, 0) < 0) { + RestoreToAudioDefEQGain(mCurEQGainBuf); + SetAudioEQGain(mCurEQGainBuf); + return -1; + } + + return 0; +} + +int CTvAudio::SetAudioEQSwitch(int switch_val) +{ + return mAudioEffect.SetEQSwitch(switch_val); +} + +int CTvAudio::GetEQMinGainVal() +{ + int min_val = 0, max_val = 0; + + if (GetAudioEQGainRangeCFG(&min_val, &max_val) < 0) { + return mAudioEffect.GetEQMinGain(); + } + + return min_val; +} + +int CTvAudio::GetEQMaxGainVal() +{ + int min_val = 0, max_val = 0; + + if (GetAudioEQGainRangeCFG(&min_val, &max_val) < 0) { + return mAudioEffect.GetEQMaxGain(); + } + + return max_val; +} + +int CTvAudio::GetEQUIMinGainVal() +{ + int min_val = 0, max_val = 0; + + if (GetAudioEQUIGainRangeCFG(&min_val, &max_val) < 0) { + return CC_EQ_DEF_UI_MIN_GAIN; + } + + return min_val; +} + +int CTvAudio::GetEQUIMaxGainVal() +{ + int min_val = 0, max_val = 0; + + if (GetAudioEQUIGainRangeCFG(&min_val, &max_val) < 0) { + return CC_EQ_DEF_UI_MAX_GAIN; + } + + return max_val; +} + +int CTvAudio::GetBassUIMinGainVal() +{ + return 0; +} + +int CTvAudio::GetBassUIMaxGainVal() +{ + return 100; +} + +int CTvAudio::GetTrebleUIMinGainVal() +{ + return 0; +} + +int CTvAudio::GetTrebleUIMaxGainVal() +{ + return 100; +} + +int CTvAudio::MappingLine(int map_val, int src_min, int src_max, int dst_min, + int dst_max) +{ + if (dst_min < 0) { + return (map_val - (src_max + src_min) / 2) * (dst_max - dst_min) + / (src_max - src_min); + } else { + return (map_val - src_min) * (dst_max - dst_min) / (src_max - src_min); + } +} + +int CTvAudio::MappingTrebleBassAndEqualizer(int tmp_vol, int direct, int tb_min, + int tb_max) +{ + int tmp_ret = 0; + + if (direct == 0) { + tmp_ret = MappingLine(tmp_vol, tb_min, tb_max, GetEQUIMinGainVal(), + GetEQUIMaxGainVal()); + } else { + tmp_ret = MappingLine(tmp_vol, GetEQUIMinGainVal(), GetEQUIMaxGainVal(), + tb_min, tb_max); + } + + LOGD("%s, tmp_vol = %d, direct = %d, tmp_ret = %d\n", __FUNCTION__, tmp_vol, + direct, tmp_ret); + + return tmp_ret; +} + +int CTvAudio::MappingEQGain(int src_gain_buf[], int dst_gain_buf[], int direct) +{ + int i = 0; + int nMinUIVal = 0, nMaxUIVal = 0, nMinVal = 0, nMaxVal = 0; + + nMinUIVal = GetEQUIMinGainVal(); + nMaxUIVal = GetEQUIMaxGainVal(); + nMinVal = GetEQMinGainVal(); + nMaxVal = GetEQMaxGainVal(); + + if (CheckAudioEQGain(src_gain_buf, direct) < 0) { + return -1; + } + + if (nMinUIVal >= nMinVal && nMaxUIVal <= nMaxVal) { + for (i = 0; i < GetAudioEQBandCount(); i++) { + dst_gain_buf[i] = src_gain_buf[i]; + } + } else { + for (i = 0; i < GetAudioEQBandCount(); i++) { + if (direct == 0) { + dst_gain_buf[i] = MappingLine(src_gain_buf[i], nMinUIVal, + nMaxUIVal, nMinVal, nMaxVal); + } else { + dst_gain_buf[i] = MappingLine(src_gain_buf[i], nMinVal, nMaxVal, + nMinUIVal, nMaxUIVal); + } + } + } + + return 0; +} + +int CTvAudio::RestoreToAudioDefEQGain(int gain_buf[]) +{ + int i = 0; + int *tmpEQPresetBufPtr = GetAudioEQPresetBufferPtr(); + + for (i = 0; i < GetAudioEQBandCount(); i++) { + gain_buf[i] = (GetEQUIMaxGainVal() + GetEQUIMinGainVal()) / 2; + } + + AudioArrayCopy(mCurEQGainBuf, gain_buf, GetAudioEQBandCount()); + AudioArrayCopy(mCurEQGainChBuf, gain_buf, GetAudioEQBandCount()); + SSMSaveAudioEQGain(0, GetAudioEQBandCount(), mCurEQGainChBuf); + + HandleTrebleBassVolume(); + SaveCurAudioSoundMode (CC_SOUND_MODE_STD); + mCustomAudioSoundMode = mCurAudioSoundMode; + + return 0; +} + +int CTvAudio::CheckAudioEQGain(int gain_buf[], int direct) +{ + int i; + + if (direct == 0) { + for (i = 0; i < GetAudioEQBandCount(); i++) { + if (gain_buf[i] < GetEQUIMinGainVal() + || gain_buf[i] > GetEQUIMaxGainVal()) { + return -1; + } + } + } else { + for (i = 0; i < GetAudioEQBandCount(); i++) { + if (gain_buf[i] < GetEQMinGainVal() + || gain_buf[i] > GetEQMaxGainVal()) { + return -1; + } + } + } + + return 0; +} + +int CTvAudio::GetCustomEQGain(int gain_buf[]) +{ + AudioArrayCopy(gain_buf, mCustomEQGainBuf, GetAudioEQBandCount()); + return 0; +} + +int CTvAudio::SetCustomEQGain() +{ + int tmpEQGainBuf[128] = { 0 }; + + if (MappingEQGain(mCustomEQGainBuf, tmpEQGainBuf, 0) < 0) { + return -1; + } + + return RealSetEQGain(tmpEQGainBuf); +} + +int CTvAudio::AudioSetEQGain(int gain_buf[]) +{ + int tmpEQGainBuf[128] = { 0 }; + + AudioArrayCopy(mCustomEQGainBuf, gain_buf, GetAudioEQBandCount()); + + if (MappingEQGain(mCustomEQGainBuf, tmpEQGainBuf, 0) < 0) { + return -1; + } + + return RealSetEQGain(tmpEQGainBuf); +} + +int CTvAudio::handleEQGainBeforeSet(int src_buf[], int dst_buf[]) +{ + int i = 0, nMinGain, nMaxGain, handle_wall_effect_flag; + + nMinGain = GetEQMinGainVal(); + nMaxGain = GetEQMaxGainVal(); + + handle_wall_effect_flag = 0; + + if (GetAudioWallEffect() == CC_SWITCH_ON) { + if (GetAudioWallEffectTypeCfg() == 0) { + handle_wall_effect_flag = 1; + } + } + + if (handle_wall_effect_flag) { + for (i = 0; i < GetAudioEQBandCount(); i++) { + dst_buf[i] = mWallEffectValueBuf[i] + src_buf[i]; + } + } else { + for (i = 0; i < GetAudioEQBandCount(); i++) { + dst_buf[i] = src_buf[i]; + } + } + + for (i = 0; i < GetAudioEQBandCount(); i++) { + if (dst_buf[i] < nMinGain) { + dst_buf[i] = nMinGain; + } + + if (dst_buf[i] > nMaxGain) { + dst_buf[i] = nMaxGain; + } + + LOGD("%s, dst_buf[%d] = %d\n", __FUNCTION__, i, dst_buf[i]); + } + + return 0; +} + +int CTvAudio::RealSetEQGain(int gain_buf[]) +{ + int tmpEQGainBuf[128] = { 0 }; + + if (CheckAudioEQGain(gain_buf, 1) < 0) { + return -1; + } + + handleEQGainBeforeSet(gain_buf, tmpEQGainBuf); + + mAudioEffect.SetEQValue(tmpEQGainBuf); + + return 0; +} + +int CTvAudio::SetSpecialModeEQGain(int tmp_val) +{ + int i = 0; + int *tmpEQPresetBufPtr = GetAudioEQPresetBufferPtr(); + int tmpEQGainBuf[128] = { 0 }; + + if (tmp_val < CC_SOUND_MODE_START || tmp_val > CC_SOUND_MODE_END) { + tmp_val = CC_SOUND_MODE_STD; + } + + if (tmp_val == CC_SOUND_MODE_USER) { + RealReadCurAudioEQGain(tmpEQGainBuf); + } else { + AudioArrayCopy(tmpEQGainBuf, + tmpEQPresetBufPtr + tmp_val * GetAudioEQBandCount(), + GetAudioEQBandCount()); + + for (i = 0; i < GetAudioEQBandCount(); i++) { + if (GetEQUIMinGainVal() != CC_EQ_DEF_UI_MIN_GAIN + || GetEQUIMaxGainVal() != CC_EQ_DEF_UI_MAX_GAIN) { + tmpEQGainBuf[i] = MappingLine(tmpEQGainBuf[i], + CC_EQ_DEF_UI_MIN_GAIN, CC_EQ_DEF_UI_MAX_GAIN, + GetEQUIMinGainVal(), GetEQUIMaxGainVal()); + } + } + } + + AudioSetEQGain(tmpEQGainBuf); + + return tmp_val; +} + +int CTvAudio::SetSpecialIndexEQGain(int buf_index, int w_val) +{ + int tmpEQGainBuf[128] = { 0 }; + + if (buf_index >= 0 && buf_index < GetAudioEQBandCount()) { + RealReadCurAudioEQGain(tmpEQGainBuf); + tmpEQGainBuf[buf_index] = w_val; + + return AudioSetEQGain(tmpEQGainBuf); + } + + return -1; +} + +int CTvAudio::SaveSpecialIndexEQGain(int buf_index, int w_val) +{ + int tmpEQGainBuf[128] = { 0 }; + + if (buf_index >= 0 && buf_index < GetAudioEQBandCount()) { + RealReadCurAudioEQGain(tmpEQGainBuf); + tmpEQGainBuf[buf_index] = w_val; + + return RealSaveCurAudioEQGain(tmpEQGainBuf, 0); + } + + return 0; +} + +// amAudio +int CTvAudio::OpenAmAudio(unsigned int sr, int output_device) +{ + if (GetamAudioDisableFlagCFG() == 1) { + return 0; + } + + return amAudioOpen(sr, CC_IN_USE_I2S_DEVICE, output_device); +} + +int CTvAudio::CloseAmAudio(void) +{ + if (GetamAudioDisableFlagCFG() == 1) { + return 0; + } + + return amAudioClose(); +} + +int CTvAudio::SetAmAudioInputSr(unsigned int sr, int output_device) +{ + return amAudioSetInputSr(sr, CC_IN_USE_I2S_DEVICE, output_device); +} + +int CTvAudio::SetAmAudioOutputMode(int mode) +{ + if (mode != CC_AMAUDIO_OUT_MODE_MIX && mode != CC_AMAUDIO_OUT_MODE_DIRECT) { + LOGE("%s, mode error, it should be mix or direct!\n", __FUNCTION__); + return -1; + } + + return amAudioSetOutputMode(mode); +} + +int CTvAudio::SetAmAudioMusicGain(int gain) +{ + return amAudioSetMusicGain(gain); +} + +int CTvAudio::SetAmAudioLeftGain(int gain) +{ + return amAudioSetLeftGain(gain); +} + +int CTvAudio::SetAmAudioRightGain(int gain) +{ + return amAudioSetRightGain(gain); +} + +//dump data +int CTvAudio::SetAudioDumpDataFlag(int tmp_flag) +{ +#if CC_TV_AUDIO_TYPE_ANDROID == 1 + return amAndroidSetDumpDataFlag(tmp_flag); +#endif + +#ifdef CC_TV_AUDIO_TYPE_AMAUDIO == 1 + return amAudioSetDumpDataFlag(tmp_flag); +#endif +} + +int GetAudioDumpDataFlag() +{ +#if CC_TV_AUDIO_TYPE_ANDROID == 1 + return amAndroidGetDumpDataFlag(); +#endif + +#ifdef CC_TV_AUDIO_TYPE_AMAUDIO == 1 + return amAudioGetDumpDataFlag(); +#endif +} + +//LUT buffer +static int RealCalVolDigitLUTBuf(int start_ind, int end_ind, int start_val, + int end_val, int lut_buf[]) +{ + int i = 0; + float tmp_step = 0; + + if (end_ind < start_ind) { + return 0; + } + + tmp_step = (float) (end_val - start_val) / (float) (end_ind - start_ind); + + for (i = start_ind; i < end_ind; i++) { + lut_buf[i] = start_val + (int) (tmp_step * (i - start_ind)); + } + + lut_buf[end_ind] = end_val; + + return 1; +} + +static int CalVolumeDigitLUTBuf(int lut_buf_type, int lut_sel_flag, int lut_buf[]) +{ + int i = 0, point_cnt = 0; + int *tmpNoLinePointsDataBuffer = NULL; + int *tmpNoLinePointsIndexBuffer = NULL; + + if (lut_sel_flag == CC_LUT_SEL_TV) { + tmpNoLinePointsIndexBuffer = GetAudioAmplifierNoLinePointsIndexBuffer( + lut_buf_type, CC_GET_LUT_TV); + tmpNoLinePointsDataBuffer = GetAudioAmplifierNoLinePointsDataBuffer( + lut_buf_type, CC_GET_LUT_TV); + } else if (lut_sel_flag == CC_LUT_SEL_AV) { + tmpNoLinePointsIndexBuffer = GetAudioAmplifierNoLinePointsIndexBuffer( + lut_buf_type, CC_GET_LUT_AV); + tmpNoLinePointsDataBuffer = GetAudioAmplifierNoLinePointsDataBuffer( + lut_buf_type, CC_GET_LUT_AV); + } else if (lut_sel_flag == CC_LUT_SEL_COMP) { + tmpNoLinePointsIndexBuffer = GetAudioAmplifierNoLinePointsIndexBuffer( + lut_buf_type, CC_GET_LUT_COMP); + tmpNoLinePointsDataBuffer = GetAudioAmplifierNoLinePointsDataBuffer( + lut_buf_type, CC_GET_LUT_COMP); + } else if (lut_sel_flag == CC_LUT_SEL_HDMI) { + tmpNoLinePointsIndexBuffer = GetAudioAmplifierNoLinePointsIndexBuffer( + lut_buf_type, CC_GET_LUT_HDMI); + tmpNoLinePointsDataBuffer = GetAudioAmplifierNoLinePointsDataBuffer( + lut_buf_type, CC_GET_LUT_HDMI); + } else if (lut_sel_flag == CC_LUT_SEL_VGA) { + tmpNoLinePointsIndexBuffer = GetAudioAmplifierNoLinePointsIndexBuffer( + lut_buf_type, CC_GET_LUT_VGA); + tmpNoLinePointsDataBuffer = GetAudioAmplifierNoLinePointsDataBuffer( + lut_buf_type, CC_GET_LUT_VGA); + } else if (lut_sel_flag == CC_LUT_SEL_MPEG) { + tmpNoLinePointsIndexBuffer = GetAudioAmplifierNoLinePointsIndexBuffer( + lut_buf_type, CC_GET_LUT_MPEG); + tmpNoLinePointsDataBuffer = GetAudioAmplifierNoLinePointsDataBuffer( + lut_buf_type, CC_GET_LUT_MPEG); + } + + lut_buf[0] = CC_MIN_DAC_VOLUME; + point_cnt = GetAudioAmplifierMasterNoLinePointsCount(); + + if (tmpNoLinePointsIndexBuffer != NULL + && tmpNoLinePointsDataBuffer != NULL) { + for (i = 0; i < (point_cnt - 1); i++) { + RealCalVolDigitLUTBuf(tmpNoLinePointsIndexBuffer[i], + tmpNoLinePointsIndexBuffer[i + 1], + tmpNoLinePointsDataBuffer[i], + tmpNoLinePointsDataBuffer[i + 1], lut_buf); + } + } + + return 1; +} + +void CTvAudio::RealHandleVolumeDigitLUTBuf(int lut_buf_type, int lut_sel_flag, + int vol_buf[], int add_srs_gain_flag, int add_eq_gain_flag) +{ + int i; + int TempVolumeDigitLutBuf[CC_LUT_BUF_SIZE] = { 0 }; + + if (vol_buf == NULL) { + CalVolumeDigitLUTBuf(lut_buf_type, lut_sel_flag, TempVolumeDigitLutBuf); + } else { + for (i = 0; i < CC_LUT_BUF_SIZE; i++) { + TempVolumeDigitLutBuf[i] = vol_buf[i]; + } + } + + if (lut_buf_type == CC_LUT_BUF_MASTER) { + mAudioAlsa.SetMainVolDigitLutBuf(TempVolumeDigitLutBuf); + } else if (lut_buf_type == CC_LUT_BUF_SUPPERBASS) { + mAudioAlsa.SetSupperBassVolDigitLutBuf(TempVolumeDigitLutBuf); + } +} + +void CTvAudio::AudioSetVolumeDigitLUTBuf(int lut_sel_flag, int add_srs_gain_flag, + int add_eq_gain_flag, int audio_std) +{ + int cfg_get_index = CC_LUT_SEL_MPEG; + int *tmpDefDigitLutBuf = NULL; + + if (lut_sel_flag == CC_LUT_SEL_TV) { + cfg_get_index = CC_GET_LUT_TV; + } else if (lut_sel_flag == CC_LUT_SEL_AV) { + cfg_get_index = CC_GET_LUT_AV; + } else if (lut_sel_flag == CC_LUT_SEL_COMP) { + cfg_get_index = CC_GET_LUT_COMP; + } else if (lut_sel_flag == CC_LUT_SEL_HDMI) { + cfg_get_index = CC_GET_LUT_HDMI; + } else if (lut_sel_flag == CC_LUT_SEL_VGA) { + cfg_get_index = CC_GET_LUT_VGA; + } else if (lut_sel_flag == CC_LUT_SEL_MPEG) { + cfg_get_index = CC_GET_LUT_MPEG; + } + + if (GetAudioAmplifierMasterNoLineSwitchFlag() == 0) { + tmpDefDigitLutBuf = GetAudioAmplifierMasterVolumeLUTBufferPtr( + cfg_get_index, audio_std); + if (tmpDefDigitLutBuf != NULL) { + RealHandleVolumeDigitLUTBuf(CC_LUT_BUF_MASTER, lut_sel_flag, + tmpDefDigitLutBuf, add_srs_gain_flag, add_eq_gain_flag); + } + } else { + RealHandleVolumeDigitLUTBuf(CC_LUT_BUF_MASTER, lut_sel_flag, NULL, + add_srs_gain_flag, add_eq_gain_flag); + } + + if (GetAudioSupperBassModuleDisableCFG() == 0) { + if (GetAudioAmplifierSupperBassNoLineSwitchFlag() == 0) { + tmpDefDigitLutBuf = GetAudioAmplifierSupperBassVolumeLUTBufferPtr( + cfg_get_index, audio_std); + if (tmpDefDigitLutBuf != NULL) { + RealHandleVolumeDigitLUTBuf(CC_LUT_BUF_SUPPERBASS, lut_sel_flag, + tmpDefDigitLutBuf, add_srs_gain_flag, add_eq_gain_flag); + } + } else { + RealHandleVolumeDigitLUTBuf(CC_LUT_BUF_SUPPERBASS, lut_sel_flag, + NULL, add_srs_gain_flag, add_eq_gain_flag); + } + } +} + +int CTvAudio::openTvAudio(int sr) +{ + + char prop1[256]; + char prop2[256]; + property_get("audio.headset_plug.enable", prop1, "null"); + property_get("audio.output.double_output", prop2, "null"); + if (strcmp(prop1, "1") == 0) { + if (strcmp(prop2, "1") == 0) { + amAudioSetTvDoubleOutput(1, sr, CC_IN_USE_I2S_DEVICE, CC_OUT_USE_AMAUDIO); + audio_device_switch = 1; + } else { + amAudioSetTvDoubleOutput(0, sr, CC_IN_USE_I2S_DEVICE, CC_OUT_USE_ANDROID); + audio_device_switch = 0; + } + } else { + amAudioSetTvDoubleOutput(1, sr, CC_IN_USE_I2S_DEVICE, CC_OUT_USE_AMAUDIO); + audio_device_switch = 1; + } + return 0; +} + +// audio data init & uninit +int CTvAudio::AudioDataInitForDtv() +{ + RealSetSRS(); + SetCustomEQGain(); + + return 0; +} + +int CTvAudio::AudioDataInit(int sr, bool enableNoiseGate) +{ + const char *value; + sr = HanldeAudioInputSr(sr); +#if CC_TV_AUDIO_TYPE_ANDROID == 1 + if (GetDisableResetSystemFrameSize() == 0) { + if (GetDisableReset_System_framesizeCFG() != 0x55) + reset_system_framesize(48000, sr); + } + + amAndroidInit(0, CC_FLAG_CREATE_RECORD | CC_FLAG_CREATE_TRACK, 48000, sr, enableNoiseGate); +#endif + +#ifdef CC_TV_AUDIO_TYPE_AMAUDIO == 1 + value = config_get_str ( "TV", "tvin.2d4G.headset.en", "null" ); + if ( strcmp ( value, "enable" ) == 0 ) + openTvAudio(sr); + else + OpenAmAudio(sr, CC_OUT_USE_AMAUDIO); +#endif + + RealSetSRS(); + SetCustomEQGain(); + + return 0; +} + +int CTvAudio::AudioDataUnInit() +{ +#if CC_TV_AUDIO_TYPE_ANDROID == 1 + return amAndroidUninit(0); +#endif + +#ifdef CC_TV_AUDIO_TYPE_AMAUDIO == 1 + return CloseAmAudio(); +#endif +} + +int CTvAudio::AudioChangeSampleRate(int sr) +{ + sr = HanldeAudioInputSr(sr); + +#if CC_TV_AUDIO_TYPE_ANDROID == 1 + if (amAndroidSetTrackerSr(sr) != 0) { + return -1; + } +#endif + +#ifdef CC_TV_AUDIO_TYPE_AMAUDIO == 1 + if (SetAmAudioInputSr(sr, CC_OUT_USE_AMAUDIO) != 0) { + return -1; + } +#endif + + RealSetSRS(); + SetCustomEQGain(); + + return 0; +} + +int CTvAudio::AudioNewAudioEffects(void) +{ + return mAudioEffect.amAndroidNewAudioEffects(); +} + +void CTvAudio::AudioFreeAudioEffects(void) +{ + return mAudioEffect.amAndroidFreeAudioEffects(); +} + +int CTvAudio::AudioSetAudioInSource(int audio_src_in_type) +{ + return mAudioAlsa.SetAudioInSource(audio_src_in_type); +} + +int CTvAudio::AudioSetAudioSourceType(int source_type) +{ + return mAudioAlsa.SetDacAudioSourceType(source_type); +} + +int CTvAudio::AudioLineInSelectChannel(int audio_channel) +{ + LOGD ("%s, audio_channel = %d", __FUNCTION__, audio_channel); + mAudioAlsa.SetInternalDacLineInSelectChannel(audio_channel); + return 0; +} +int CTvAudio::SetKalaokIO(int level) +{ + LOGD ("%s, SetKalaokIO = %d", __FUNCTION__, level); + { + const char *config_value; + config_value = config_get_str("TV", "audio.switch.karaok.av.enable", "null"); + + if (strtoul(config_value, NULL, 10) == 1) { + mAudioAlsa.SetAudioSwitchIO(level); + } + } + return 0; +} + +int CTvAudio::AudioSetLineInCaptureVolume(int l_vol, int r_vol) +{ + mAudioAlsa.SetInternalDacLineInCaptureVolume(l_vol, r_vol); + return 0; +} + +// Audio Ctl Init +void CTvAudio::AudioCtlInitializeLoad() +{ + int tmp_val = 0; + int init_mute_type = 0; + + LOGD("%s, entering...\n", __FUNCTION__); + + createMonitorUsbHostBusThread(); + + init_mute_type = GetAudioAVOutInitMuteStatusCFG(); + + UnInitSetTvAudioCard(); + + if (init_mute_type == 1) { + SetAudioAVOutMute (CC_AUDIO_MUTE); + } else { + SetAudioAVOutMute (CC_AUDIO_UNMUTE); + } + + SetAudioSPDIFMute (CC_AUDIO_UNMUTE); + + tmp_val = GetAudioDumpDataEnableFlagCfg(); + SetAudioDumpDataFlag(tmp_val); + + mAudioAlsa.SetMixerBypassSwitch (CC_SWITCH_OFF); + mAudioAlsa.SetMixerDacSwitch (CC_SWITCH_ON); + + LoadAudioCtl(); + + AudioSetVolumeDigitLUTBuf(CC_LUT_SEL_MPEG, 1, 1, -1); + + AudioCtlInitializeSet(); +} + +void CTvAudio::LoadAudioCtl() +{ + // Get Current Audio Volume + LoadCurAudioMasterVolume(); + + // Get Current Audio Balance + LoadCurAudioBalance(); + + // Get Current Supper Bass Switch + LoadCurAudioSupperBassSwitch(); + + // Get Current Supper Bass Volume + LoadCurAudioSupperBassVolume(); + + // Get Current SRSSurround + LoadCurAudioSrsSurround(); + + // Get Current SRS DialogClarity + LoadCurAudioSrsDialogClarity(); + + // Get Current SRS TruBass + LoadCurAudioSrsTruBass(); + + // Get Current Audio Sound Mode + LoadCurAudioSoundMode(); + + // Get Current Audio Bass and Treble + LoadCurAudioBassVolume(); + LoadCurAudioTrebleVolume(); + + // Get Current Wall Effect + LoadCurAudioWallEffect(); + + // Get Current spdif switch + LoadCurAudioSPDIFSwitch(); + + // Get Current spdif mode + LoadCurAudioSPDIFMode(); + + // Get Current EQ mode + LoadCurAudioEQMode(); + + // Get Current EQ Gain + LoadCurAudioEQGain(); +} + +void CTvAudio::InitSetAudioCtl() +{ + // Set Current Audio balance value + SetAudioBalance(GetAudioBalance()); + + // Set Current Audio Volume + SetAudioMasterVolume(GetAudioMasterVolume()); + + // Set Current Supper Bass Volume + SetAudioSupperBassVolume(GetAudioSupperBassVolume()); + + // Set Current Audio Sound Mode + SetAudioSoundMode(GetAudioSoundMode()); + + // Set Current Audio SPDIF Switch + SetAudioSPDIFSwitch(GetCurAudioSPDIFSwitch()); + + // Set Current Audio SPDIF mode + SetAudioSPDIFMode(GetCurAudioSPDIFMode()); +} + +static int gAudioFirstInitSetFlag = 0; +static pthread_mutex_t first_init_set_flag_mutex = PTHREAD_MUTEX_INITIALIZER; + +int CTvAudio::GetAudioFirstInitSetFlag() +{ + int tmp_val = 0; + + pthread_mutex_lock(&first_init_set_flag_mutex); + tmp_val = gAudioFirstInitSetFlag; + pthread_mutex_unlock(&first_init_set_flag_mutex); + + return tmp_val; +} + +void *CTvAudio::AudioCtlInitSetMain(void *data) +{ + char prop_value[PROPERTY_VALUE_MAX]; + + LOGD("%s, entering...\n", __FUNCTION__); + pthread_mutex_lock(&first_init_set_flag_mutex); + + if (gAudioFirstInitSetFlag == 0) { + AudioNewAudioEffects(); + RealSetSRS(); + AudioSetVolumeDigitLUTBuf(CC_LUT_SEL_MPEG, 1, 1, -1); + InitSetAudioCtl(); + gAudioFirstInitSetFlag = 1; + } + + pthread_mutex_unlock(&first_init_set_flag_mutex); + + LOGD("%s, exiting...\n", __FUNCTION__); + + return NULL; +} + +void CTvAudio::AudioCtlInitializeSet() +{ + AudioCtlInitSetMain (NULL); + return; +} + +void CTvAudio::AudioCtlInit() +{ + InitSetTvAudioCard(); +} + +void CTvAudio::AudioCtlUninit() +{ + int l_vol = 0, r_vol = 0; + int audio_channel = -1; + int oldMuteStatus; + + oldMuteStatus = GetAudioMuteForTv(); + SetAudioMuteForTv (CC_AUDIO_MUTE); + + AudioSetAudioInSource (CC_AUDIO_IN_SOURCE_LINEIN); + AudioSetAudioSourceType (AUDIO_MPEG_SOURCE); + + AudioDataUnInit(); + + SetAudioVolumeCompensationVal(0); + + AudioSetVolumeDigitLUTBuf(CC_LUT_SEL_MPEG, 1, 1, -1); + SetAudioMasterVolume(GetAudioMasterVolume()); + + SetAudioMuteForTv(oldMuteStatus); + + UnInitSetTvAudioCard(); +} + +int CTvAudio::AudioSetRecordDataZero(bool flag) +{ + return 0; +} + +int CTvAudio::AudioHandleHeadsetPlugIn() +{ + return 0; +} + +int CTvAudio::AudioHandleHeadsetPullOut() +{ + return 0; +} + +int CTvAudio::amAudioSetDoubleOutputSwitch(int en_val) +{ + if (en_val == 1) { + property_set("audio.output.enable", "1"); + property_set("audio.output.double_output", "1"); + } + if (en_val == 0) { + property_set("audio.output.enable", "0"); + property_set("audio.output.double_output", "0"); + } + return 0; +} + +int CTvAudio::setAudioPcmPlaybackVolume(int val) +{ + int pcm_volume = 0; + pcm_volume = val / 2; + if (pcm_volume > 24) pcm_volume = 24; + //return SetAudioPcmPlaybackVolume(pcm_volume); + return 0; +} + +int CTvAudio::UsbAudioOuputModuleSwitch(int sw) +{ + if (sw == 1) + property_set("persist.tv.audio_output_enable", "1"); + if (sw == 0) + property_set("persist.tv.audio_output_enable", "0"); + return 0; +} + +int CTvAudio::GetAmAudioSetDoubleOutputSwitch() +{ + char prop2[256]; + property_get("audio.output.double_output", prop2, "null"); + if (strcmp(prop2, "0") == 0 || strcmp(prop2, "null") == 0) { + return 0; + } else if (strcmp(prop2, "1") == 0) { + return 1; + } + return 0; +} + +int CTvAudio::GetCurUsbAudioOuputModuleSwitch() +{ + char prop1[256]; + property_get("audio.output.enable", prop1, "null"); + if (strcmp(prop1, "0") == 0 || strcmp(prop1, "null") == 0) { + return 0; + } else if (strcmp(prop1, "1") == 0) { + return 1; + } + return 0; +} + +int CTvAudio::amAudioSetTvDoubleOutput(int en_val, unsigned int sr, int input_device, + int output_device) +{ + return amAudioSetDoubleOutput(en_val, sr, input_device, output_device); +} +int CTvAudio::HanldeAudioInputSr(unsigned int sr) +{ + int tmp_cfg = 0; + + tmp_cfg = GetAudioResampleTypeCFG(); + if (tmp_cfg & CC_AUD_RESAMPLE_TYPE_HW) { + mAudioAlsa.SetHardwareResample(sr); + } else { + mAudioAlsa.SetHardwareResample(-1); + } + + if (!(tmp_cfg & CC_AUD_RESAMPLE_TYPE_SW)) { + sr = 48000; + } + + return sr; +} + +void CTvAudio::AudioSetNoiseGateThreshold(int thresh) +{ +#if CC_TV_AUDIO_TYPE_ANDROID == 1 + amAndroidSetNoiseGateThreshold(thresh); +#endif + +#ifdef CC_TV_AUDIO_TYPE_AMAUDIO == 1 + return; +#endif +} + +int CTvAudio::AudioSSMRestoreDefaultSetting() +{ + int i = 0, tmp_val = 0; + int nMinUIVol = 0, nMaxUIVol = 0; + int *tmp_ptr = NULL; + int tmpEQGainBuf[128] = { 0 }; + unsigned char tmp_buf[CC_NO_LINE_POINTS_MAX_CNT] = { 0 }; + + // Save noline points + tmp_val = GetAudioAmplifierMasterNoLinePointsCount(); + + for (i = 0; i < CC_LUT_SEL_COUNT; i++) { + tmp_ptr = GetAudioAmplifierMasterNoLinePointsDefDataBuffer(i); + AudioArrayCopy(tmp_buf, tmp_ptr, CC_NO_LINE_POINTS_MAX_CNT); + SSMSaveAudioNoLinePoints(i * tmp_val, tmp_val, tmp_buf); + } + + // Save Current Audio Volume + SaveCurAudioMasterVolume (CC_DEF_SOUND_VOL); + + // Save Current Audio Balance + SaveCurAudioBalance (CC_DEF_SOUND_BALANCE_VAL); + + // Save Current Supper Bass Switch + SaveCurAudioSupperBassSwitch (CC_SWITCH_OFF); + + // Save Current Supper Bass Volume + SaveCurAudioSupperBassVolume (CC_DEF_SUPPERBASS_VOL); + + // Save Current SRSSurround + SaveCurAudioSrsSurround(CC_SWITCH_OFF); + + // Save Current SRS DialogClarity + SaveCurAudioSrsDialogClarity(CC_SWITCH_OFF); + + // Save Current SRS TruBass + SaveCurAudioSrsTruBass(CC_SWITCH_OFF); + + // Save Current Audio Sound Mode + SaveCurAudioSoundMode (CC_SOUND_MODE_STD); + + // Save Current Wall Effect + SaveCurAudioWallEffect(CC_SWITCH_OFF); + + // Save Current spdif switch + SaveCurAudioSPDIFSwitch (CC_SWITCH_ON); + + // Save Current spdif mode + SaveCurAudioSPDIFMode (CC_SPDIF_MODE_PCM); + + // Save Current EQ mode + SaveCurAudioEQMode (CC_EQ_MODE_NOMAL); + + // Save Current EQ Gain + RestoreToAudioDefEQGain(tmpEQGainBuf); + + // Save Current Audio Bass and Treble + nMinUIVol = GetBassUIMinGainVal(); + nMaxUIVol = GetBassUIMaxGainVal(); + RealSaveCurAudioBassVolume((nMinUIVol + nMaxUIVol) / 2, 0); + + nMinUIVol = GetTrebleUIMinGainVal(); + nMaxUIVol = GetTrebleUIMaxGainVal(); + RealSaveCurAudioTrebleVolume((nMinUIVol + nMaxUIVol) / 2, 0); + + return 0; +} + + +static const char *gDefCapturePropName = "snd.card.default.card.capture"; + +int CTvAudio::InitSetTvAudioCard() +{ + int i = 0, totle_num = 0, capture_ind = 0; + char tmp_buf[32] = { 0 }; + char tv_card_name[64] = { 0 }; + char prop_value[PROPERTY_VALUE_MAX]; + +#ifdef BOARD_ALSA_AUDIO_TINY +#else // legacy alsa lib + snd_card_refresh_info(); +#endif + + if (GetTvAudioCardNeedSet()) { + memset(prop_value, '\0', PROPERTY_VALUE_MAX); + property_get("snd.card.totle.num", prop_value, "0"); + + totle_num = strtoul(prop_value, NULL, 10); + LOGD("%s, totle number = %d\n", __FUNCTION__, totle_num); + totle_num = 8; + + GetTvAudioCardName(tv_card_name); + + for (i = 0; i < totle_num; i++) { + sprintf(tmp_buf, "snd.card.%d.name", i); + memset(prop_value, '\0', PROPERTY_VALUE_MAX); + property_get(tmp_buf, prop_value, "null"); + + LOGD("%s, key string \"%s\", value string \"%s\".\n", __FUNCTION__, + tmp_buf, prop_value); + + if (strcmp(prop_value, tv_card_name) == 0) { + break; + } + } + + capture_ind = i; + + if (capture_ind == totle_num) { + capture_ind = -1; + LOGE("%s, can't find tv card \"%s\".\n", __FUNCTION__, + tv_card_name); + } + } else { + capture_ind = -1; + } + + sprintf(tmp_buf, "%d", capture_ind); + property_set(gDefCapturePropName, tmp_buf); + LOGD("%s, set \"%s\" as \"%s\".\n", __FUNCTION__, gDefCapturePropName, + tmp_buf); + + return 0; +} + +int CTvAudio::UnInitSetTvAudioCard() +{ + char tmp_buf[32] = { 0 }; + +#ifdef BOARD_ALSA_AUDIO_TINY +#else // legacy alsa lib + snd_card_refresh_info(); +#endif // BOARD_ALSA_AUDIO_TINY + sprintf(tmp_buf, "%d", -1); + property_set(gDefCapturePropName, tmp_buf); + LOGD("%s, set \"%s\" as \"%s\".\n", __FUNCTION__, gDefCapturePropName, + tmp_buf); + + return 0; +} + +#define CS_SPDIF_MODE_DEV_PATH "/sys/class/audiodsp/digital_raw" + +int CTvAudio::SetSPDIFMode(int mode_val) +{ + FILE *spdif_mode_fp = NULL; + + spdif_mode_fp = fopen(CS_SPDIF_MODE_DEV_PATH, "w"); + if (spdif_mode_fp == NULL) { + LOGE("%s, Open file %s error(%s)!\n", __FUNCTION__, CS_SPDIF_MODE_DEV_PATH, strerror(errno)); + return -1; + } + + if (mode_val == CC_SPDIF_MODE_PCM) { + fprintf(spdif_mode_fp, "%d", 0); + } else if (mode_val == CC_SPDIF_MODE_RAW ) { + fprintf(spdif_mode_fp, "%d", 1); + } + + fclose(spdif_mode_fp); + spdif_mode_fp = NULL; + + return 0; +} +//0 is ??? 1 is ???????? +int CTvAudio::SwitchAVOutBypass(int sw) +{ + if (sw == 0 ) { + mAudioAlsa.SetMixerBypassSwitch ( CC_SWITCH_OFF ); + mAudioAlsa.SetMixerDacSwitch ( CC_SWITCH_ON ); + } else { + mAudioAlsa.SetMixerBypassSwitch ( CC_SWITCH_ON ); + mAudioAlsa.SetMixerDacSwitch ( CC_SWITCH_OFF ); + } + return 0; +} + +int CTvAudio::SetAudioSwitchIO(int value) +{ + return mAudioAlsa.SetAudioSwitchIO( value); +} +int CTvAudio::SetOutput_Swap(int value) +{ + return mAudioAlsa.SetOutput_Swap( value); +} diff --git a/tvapi/libtv/audio/audio_api.h b/tvapi/libtv/audio/audio_api.h new file mode 100644 index 0000000..89e7356 --- a/dev/null +++ b/tvapi/libtv/audio/audio_api.h @@ -0,0 +1,324 @@ +#ifndef __TV_AUDIO_API_H__ +#define __TV_AUDIO_API_H__ + +#include "tvsetting/audio_cfg.h" +#include "audio_alsa.h" +#include "audio_effect.h" + +enum CC_AUDIO_SWITCH_STATUS { + CC_SWITCH_OFF, + CC_SWITCH_ON, +}; + +enum CC_AMAUDIO_OUT_MODE { + CC_AMAUDIO_OUT_MODE_DIRECT, + CC_AMAUDIO_OUT_MODE_MIX, +}; + +static const int CC_SPDIF_MODE_PCM = 0; +static const int CC_SPDIF_MODE_RAW = 1; + +static const int CC_MIN_SOUND_VOL = 0; +static const int CC_MAX_SOUND_VOL = (100); +static const int CC_DEF_SOUND_VOL = (30); +static const int CC_MIN_SUPPERBASS_VOL = (0); +static const int CC_MAX_SUPPERBASS_VOL = (100); +static const int CC_DEF_SUPPERBASS_VOL = (50); + +static const int CC_VOLUME_COMPENSATION_MIN_VAL = (-20); +static const int CC_VOLUME_COMPENSATION_MAX_VAL = (20); +static const int CC_VOLUME_COMPENSATION_DEF_VAL = (0); + +static const int CC_DEF_BASS_TREBLE_VOL = 50; +static const int CC_EQ_BASS_IND = 1; +static const int CC_EQ_TREBLE_IND = 3; +static const int CC_EQ_DEF_UI_MIN_GAIN = 0; +static const int CC_EQ_DEF_UI_MAX_GAIN = 100; +static const int CC_LUT_SEL_TV = 0; +static const int CC_LUT_SEL_AV = 1; +static const int CC_LUT_SEL_COMP = 2; +static const int CC_LUT_SEL_HDMI = 3; +static const int CC_LUT_SEL_VGA = 4; +static const int CC_LUT_SEL_MPEG = 5; +static const int CC_LUT_SEL_COUNT = 6; + + +enum CC_AUD_SOUND_MODE { + CC_SOUND_MODE_START = 0, + CC_SOUND_MODE_STD = 0, + CC_SOUND_MODE_MUSIC, + CC_SOUND_MODE_NEWS, + CC_SOUND_MODE_THEATER, + CC_SOUND_MODE_USER, + CC_SOUND_MODE_END = CC_SOUND_MODE_USER +}; + +enum CC_AUD_EQ_MODE { + CC_EQ_MODE_START = 0, + CC_EQ_MODE_NOMAL = 0, + CC_EQ_MODE_POP, + CC_EQ_MODE_JAZZ, + CC_EQ_MODE_ROCK, + CC_EQ_MODE_CLASSIC, + CC_EQ_MODE_DANCE, + CC_EQ_MODE_PARTY, + CC_EQ_MODE_BASS, + CC_EQ_MODE_TREBLE, + CC_EQ_MODE_CUSTOM, + CC_EQ_MODE_END = CC_EQ_MODE_CUSTOM +}; +class CTvAudio +{ +public: + CTvAudio(); + ~CTvAudio(); + //Audio Mute + int SetAudioMuteForSystem(int); + int GetAudioMuteForSystem(); + int SetAudioMuteForTv(int ); + int GetAudioMuteForTv(); + int SetAudioAVOutMute(int muteStatus); + int GetAudioAVOutMute(); + int SetAudioSPDIFMute(int muteStatus); + int GetAudioSPDIFMute(); + + //Audio Master Volume + int SetAudioMasterVolume(int tmp_vol); + int GetAudioMasterVolume(); + int SaveCurAudioMasterVolume(int tmp_vol); + int GetCurAudioMasterVolume(); + + //Audio Balance + int SetAudioBalance(int tmp_val); + int GetAudioBalance(); + int SaveCurAudioBalance(int tmp_val); + int GetCurAudioBalance(); + + //Audio SupperBass Volume + int SetAudioSupperBassVolume(int tmp_vol); + int GetAudioSupperBassVolume(); + int SaveCurAudioSupperBassVolume(int tmp_vol); + int GetCurAudioSupperBassVolume(); + + //Audio SupperBass Switch + int SetAudioSupperBassSwitch(int tmp_val); + int GetAudioSupperBassSwitch(); + int SaveCurAudioSupperBassSwitch(int tmp_val); + int GetCurAudioSupperBassSwitch(); + + //Audio SRS Surround switch + int SetAudioSRSSurround(int tmp_val); + int GetAudioSRSSurround(); + int SaveCurAudioSrsSurround(int tmp_val); + int GetCurAudioSRSSurround(); + + //Audio SRS Dialog Clarity + int SetAudioSrsDialogClarity(int tmp_val); + int GetAudioSrsDialogClarity(); + int SaveCurAudioSrsDialogClarity(int tmp_val); + int GetCurAudioSrsDialogClarity(); + + //Audio SRS Trubass + int SetAudioSrsTruBass(int tmp_val); + int GetAudioSrsTruBass(); + int SaveCurAudioSrsTruBass(int tmp_val); + int GetCurAudioSrsTruBass(); + + //Audio SPDIF switch + int SetAudioSPDIFSwitch(int tmp_val); + int GetCurAudioSPDIFSwitch(); + int SaveCurAudioSPDIFSwitch(int tmp_val); + + //Audio SPDIF Mode + int SetAudioSPDIFMode(int tmp_val); + int GetCurAudioSPDIFMode(); + int SaveCurAudioSPDIFMode(int tmp_val); + + //Audio Bass + int SetAudioBassVolume(int tmp_vol); + int GetAudioBassVolume(); + int SaveCurAudioBassVolume(int tmp_vol); + int GetCurAudioBassVolume(); + + //Audio Treble + int SetAudioTrebleVolume(int tmp_vol); + int GetAudioTrebleVolume(); + int SaveCurAudioTrebleVolume(int tmp_vol); + int GetCurAudioTrebleVolume(); + + //Audio Sound Mode + int SetAudioSoundMode(int tmp_val); + int GetAudioSoundMode(); + int SaveCurAudioSoundMode(int tmp_val); + int GetCurAudioSoundMode(); + + //Audio Wall Effect + int SetAudioWallEffect(int tmp_val); + int GetAudioWallEffect(); + int SaveCurAudioWallEffect(int tmp_val); + int GetCurAudioWallEffect(); + + //Audio EQ Mode + int SetAudioEQMode(int tmp_val); + int GetAudioEQMode(); + int SaveCurAudioEQMode(int tmp_val); + int GetCurAudioEQMode(); + + //Audio EQ Gain + int GetAudioEQRange(int range_buf[]); + int GetAudioEQBandCount(); + int SetAudioEQGain(int gain_buf[]); + int GetAudioEQGain(int gain_buf[]); + int GetCurAudioEQGain(int gain_buf[]); + int SaveCurAudioEQGain(int gain_buf[]); + int SetAudioEQSwitch(int switch_val); + + // amAudio + int OpenAmAudio(unsigned int sr, int output_device); + int CloseAmAudio(void); + int SetAmAudioInputSr(unsigned int sr, int output_device); + int SetAmAudioOutputMode(int mode); + int SetAmAudioMusicGain(int gain); + int SetAmAudioLeftGain(int gain); + int SetAmAudioRightGain(int gain); + + int SetAudioVolumeCompensationVal(int tmp_vol_comp_val); + int GetAudioVolumeCompensationVal(); + + int AudioLineInSelectChannel(int audio_channel); + int AudioSetLineInCaptureVolume(int l_vol, int r_vol); + int SetKalaokIO(int level); + + int AudioHandleHeadsetPlugIn(); + int AudioHandleHeadsetPullOut(); + int amAudioSetDoubleOutputSwitch(int en_val); + int setAudioPcmPlaybackVolume(int val); + int UsbAudioOuputModuleSwitch(int sw); + int GetAmAudioSetDoubleOutputSwitch(); + int GetCurUsbAudioOuputModuleSwitch(); + int amAudioSetTvDoubleOutput(int en_val, unsigned int sr, int input_device, int output_device); + + void AudioCtlInitializeLoad(); + void AudioCtlInit(); + void AudioCtlUninit(); + void AudioSetVolumeDigitLUTBuf(int lut_sel_flag, int add_srs_gain_flag, int add_eq_gain_flag, int audio_std); + int openTvAudio(int sr); + + int AudioDataInitForDtv(); + int AudioDataInit(int sr, bool enableNoiseGate); + int AudioDataUnInit(); + int AudioChangeSampleRate(int sr); + int AudioSetAudioInSource(int audio_src_in_type); + int AudioSetAudioSourceType(int source_type); + int AudioSSMRestoreDefaultSetting(); + int AudioRegisterInterface(); + int AudioGetSessionId(); + int AudioNewAudioEffects(void); + void AudioFreeAudioEffects(void); + int SetAudioDumpDataFlag(int tmp_flag); + int GetAudioDumpDataFlag(); + int SetAudioLeftRightMode(unsigned int mode); + unsigned int GetAudioLeftRightMode(); + int AudioSetMicroPhoneSwitch(int switch_val); + void AudioSetNoiseGateThreshold(int thresh); + int AudioSetRecordDataZero(bool flag); + int SwitchAVOutBypass (int); + int SetAudioSwitchIO(int value); + int SetOutput_Swap(int value); + +private: + void RealHandleVolumeDigitLUTBuf(int lut_buf_type, int lut_sel_flag, + int vol_buf[], int add_srs_gain_flag, int add_eq_gain_flag); + int handleAudioSPDIFMute(int muteStatus); + int LoadCurAudioSPDIFMode(); + int LoadCurAudioMasterVolume(); + int LoadCurAudioBalance(); + int LoadCurAudioSupperBassVolume(); + int LoadCurAudioSupperBassSwitch(); + int LoadCurAudioSrsSurround(); + int LoadCurAudioSrsDialogClarity(); + void RealSetSRS(); + int LoadCurAudioSPDIFSwitch(); + void HanldeSupperBassSRSSpeakerSize(); + int LoadCurAudioSoundMode(); + int LoadCurAudioEQMode(); + int LoadCurAudioSrsTruBass(); + int SetDacGain(); + int RealSaveCurAudioBassVolume(int, int); + int LoadCurAudioBassVolume(); + int RealSaveCurAudioTrebleVolume(int, int); + int LoadCurAudioTrebleVolume(); + int HandleTrebleBassVolume(); + int LoadCurAudioWallEffect(); + int RealReadCurAudioEQGain(int *); + int RealSaveCurAudioEQGain(int *, int); + int LoadCurAudioEQGain(); + int MappingEQGain(int *, int *, int); + int RestoreToAudioDefEQGain(int *); + int CheckAudioEQGain(int *, int); + int GetCustomEQGain(int *); + int SetCustomEQGain(); + int AudioSetEQGain(int *); + int handleEQGainBeforeSet(int *, int *); + int RealSetEQGain(int *); + int SetSpecialModeEQGain(int); + int SetSpecialIndexEQGain(int, int); + int SaveSpecialIndexEQGain(int, int); + void LoadAudioCtl(); + void InitSetAudioCtl(); + int GetAudioFirstInitSetFlag(); + int HanldeAudioInputSr(unsigned int); + int waitServiceManager(); + void *AudioCtlInitSetMain(void *); + void AudioCtlInitializeSet(); + int GetEQMinGainVal(); + int GetEQMaxGainVal(); + int GetEQUIMinGainVal(); + int GetEQUIMaxGainVal(); + int GetBassUIMinGainVal(); + int GetBassUIMaxGainVal(); + int GetTrebleUIMinGainVal(); + int GetTrebleUIMaxGainVal(); + int MappingLine(int, int, int, int, int); + int MappingTrebleBassAndEqualizer(int, int, int, int); + void HandleSupperBassSwicth(); + int InitSetTvAudioCard(); + int UnInitSetTvAudioCard(); + int SetSPDIFMode(int mode_val); + + + CAudioAlsa mAudioAlsa; + CAudioEffect mAudioEffect; + int mAudioMuteStatusForSystem; + int mAudioMuteStatusForTv; + + int mCurAudioMasterVolume; + int mCurAudioBalance; + int mCurAudioSupperBassVolume; + int mCurAudioSupperBassSwitch; + int mCurAudioSRSSurround; + int mCurAudioSrsDialogClarity; + int mCurAudioSrsTruBass; + int mCurAudioSPDIFSwitch; + int mCurAudioSPDIFMode; + int mCurAudioBassVolume; + int mCurAudioTrebleVolume; + int mCurAudioSoundMode; + int mCurAudioWallEffect; + int mCurAudioEQMode; + int mCustomAudioMasterVolume; + int mCustomAudioBalance; + int mCustomAudioSupperBassVolume; + int mCustomAudioSupperBassSwitch; + int mCustomAudioSRSSurround; + int mCustomAudioSrsDialogClarity; + int mCustomAudioSrsTruBass; + int mCustomAudioBassVolume; + int mCustomAudioTrebleVolume; + int mCustomAudioSoundMode; + int mCustomAudioWallEffect; + int mCustomAudioEQMode; + int mCustomAudioSoundEnhancementSwitch; + volatile int mVolumeCompensationVal; +}; +#endif //__TV_AUDIO_API_H__ diff --git a/tvapi/libtv/audio/audio_effect.cpp b/tvapi/libtv/audio/audio_effect.cpp new file mode 100644 index 0000000..0171243 --- a/dev/null +++ b/tvapi/libtv/audio/audio_effect.cpp @@ -0,0 +1,228 @@ +#include <stdio.h> +#include <stdlib.h> +#include <malloc.h> +#include <unistd.h> +#include <pthread.h> + +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/poll.h> +#include <sys/ioctl.h> +#include <fcntl.h> + +#include "audio_amaudio.h" +#include "audio_effect.h" + +#define LOG_TAG "CAudioEffect" +#include "CTvLog.h" + +#define CC_BAND_ITEM_CNT ( 6 ) +#define CC_MIN_EQ_GAIN_VAL ( -10 ) +#define CC_MAX_EQ_GAIN_VAL ( 10 ) +CAudioEffect::CAudioEffect() +{ +} +CAudioEffect::~CAudioEffect() +{ +} + +int CAudioEffect::amAndroidNewAudioEffects() +{ + return mAndroidEffect.amAndroidNewAudioEffects(); +} + +void CAudioEffect::amAndroidFreeAudioEffects() +{ + return mAndroidEffect.amAndroidFreeAudioEffects(); +} + +int CAudioEffect::GetEQBandCount() +{ + return CC_BAND_ITEM_CNT; +} + +int CAudioEffect::GetEQMinGain() +{ + return CC_MIN_EQ_GAIN_VAL; +} + +int CAudioEffect::GetEQMaxGain() +{ + return CC_MAX_EQ_GAIN_VAL; +} + +int CAudioEffect::SetEQSwitch(int switch_val) +{ + int tmp_ret = 0; + +#if CC_TV_AUDIO_TYPE_ANDROID == 1 + return mAndroidEffect.amAndroidSetEQEnable(switch_val); +#endif + +#ifdef CC_TV_AUDIO_TYPE_AMAUDIO == 1 + tmp_ret |= amAudioSetEQEnable(switch_val); + tmp_ret |= mAndroidEffect.amAndroidSetEQEnable(switch_val); + return tmp_ret; +#endif +} + +int CAudioEffect::GetEQSwitch() +{ + int tmp_ret = 0; + +#if CC_TV_AUDIO_TYPE_ANDROID == 1 + return mAndroidEffect.amAndroidGetEQEnabled(); +#endif + +#if CC_TV_AUDIO_TYPE_AMAUDIO == 1 + return mAndroidEffect.amAndroidGetEQEnabled(); +#endif +} + +int CAudioEffect::SetEQValue(int gain_val_buf[]) +{ + int tmp_ret = 0; + +#if CC_TV_AUDIO_TYPE_ANDROID == 1 + return mAndroidEffect.amAndroidSetEQGain(gain_val_buf, CC_BAND_ITEM_CNT); +#endif + +#if CC_TV_AUDIO_TYPE_AMAUDIO == 1 + tmp_ret |= amAudioSetEQGain(gain_val_buf, CC_BAND_ITEM_CNT); + tmp_ret |= mAndroidEffect.amAndroidSetEQGain(gain_val_buf, CC_BAND_ITEM_CNT); + return tmp_ret; +#endif +} + +int CAudioEffect::GetEQValue(int gain_val_buf[]) +{ + int tmp_ret = 0; + +#if CC_TV_AUDIO_TYPE_ANDROID == 1 + return mAndroidEffect.amAndroidGetEQGain(gain_val_buf, CC_BAND_ITEM_CNT); +#endif + +#if CC_TV_AUDIO_TYPE_AMAUDIO == 1 + return mAndroidEffect.amAndroidGetEQGain(gain_val_buf, CC_BAND_ITEM_CNT); +#endif +} + +int CAudioEffect::SetSrsSurroundSwitch(int switch_val) +{ + int tmp_ret = 0; + +#if CC_TV_AUDIO_TYPE_ANDROID == 1 + return mAndroidEffect.amAndroidSetSRSSurroundSwitch(switch_val); +#endif + +#if CC_TV_AUDIO_TYPE_AMAUDIO == 1 + tmp_ret |= amAudioSetSRSSurroundSwitch(switch_val); + tmp_ret |= mAndroidEffect.amAndroidSetSRSSurroundSwitch(switch_val); + return tmp_ret; +#endif +} + +int CAudioEffect::SetSrsSurroundGain(int gain_val) +{ + int tmp_ret = 0; + +#if CC_TV_AUDIO_TYPE_ANDROID == 1 + return mAndroidEffect.amAndroidSetSRSSurroundGain(gain_val); +#endif + +#if CC_TV_AUDIO_TYPE_AMAUDIO == 1 + tmp_ret |= amAudioSetSRSSurroundGain(gain_val); + tmp_ret |= mAndroidEffect.amAndroidSetSRSSurroundGain(gain_val); + return tmp_ret; +#endif +} + +int CAudioEffect::SetSrsTruBassSwitch(int switch_val) +{ + int tmp_ret = 0; + +#if CC_TV_AUDIO_TYPE_ANDROID == 1 + return mAndroidEffect.amAndroidSetSRSTrubassSwitch(switch_val); +#endif + +#if CC_TV_AUDIO_TYPE_AMAUDIO == 1 + tmp_ret |= amAudioSetSRSTrubassSwitch(switch_val); + tmp_ret |= mAndroidEffect.amAndroidSetSRSTrubassSwitch(switch_val); + return tmp_ret; +#endif +} + +int CAudioEffect::SetSrsTruBassGain(int gain_val) +{ + int tmp_ret = 0; + +#if CC_TV_AUDIO_TYPE_ANDROID == 1 + return amAndroidSetSRSTrubassGain(gain_val); +#endif + +#if CC_TV_AUDIO_TYPE_AMAUDIO == 1 + tmp_ret |= amAudioSetSRSTrubassGain(gain_val); + tmp_ret |= mAndroidEffect.amAndroidSetSRSTrubassGain(gain_val); + return tmp_ret; +#endif +} + +int CAudioEffect::SetSrsDialogClaritySwitch(int switch_val) +{ + int tmp_ret = 0; + +#if CC_TV_AUDIO_TYPE_ANDROID == 1 + return mAndroidEffect.amAndroidSetSRSDialogClaritySwitch(switch_val); +#endif + +#if CC_TV_AUDIO_TYPE_AMAUDIO == 1 + tmp_ret |= amAudioSetSRSDialogClaritySwitch(switch_val); + tmp_ret |= mAndroidEffect.amAndroidSetSRSDialogClaritySwitch(switch_val); + return tmp_ret; +#endif +} + +int CAudioEffect::SetSrsDialogClarityGain(int gain_val) +{ + int tmp_ret = 0; + +#if CC_TV_AUDIO_TYPE_ANDROID == 1 + return mAndroidEffect.amAndroidSetSRSDialogClarityGain(gain_val); +#endif + +#if CC_TV_AUDIO_TYPE_AMAUDIO == 1 + tmp_ret |= amAudioSetSRSDialogClarityGain(gain_val); + tmp_ret |= mAndroidEffect.amAndroidSetSRSDialogClarityGain(gain_val); + return tmp_ret; +#endif +} + +int CAudioEffect::SetSrsDefinitionGain(int gain_val) +{ + int tmp_ret = 0; + +#if CC_TV_AUDIO_TYPE_ANDROID == 1 + return mAndroidEffect.amAndroidSetSRSDefinitionGain(gain_val); +#endif + +#if CC_TV_AUDIO_TYPE_AMAUDIO == 1 + tmp_ret |= amAudioSetSRSDefinitionGain(gain_val); + tmp_ret |= mAndroidEffect.amAndroidSetSRSDefinitionGain(gain_val); + return tmp_ret; +#endif +} + +int CAudioEffect::SetSrsTrubassSpeakerSize(int set_val) +{ + int tmp_ret = 0; + +#if CC_TV_AUDIO_TYPE_ANDROID == 1 + return mAndroidEffect.amAndroidSetSRSTrubassSpeakerSize(set_val); +#endif + +#if CC_TV_AUDIO_TYPE_AMAUDIO == 1 + tmp_ret |= amAudioSetSRSTrubassSpeakerSize(set_val); + tmp_ret |= mAndroidEffect.amAndroidSetSRSTrubassSpeakerSize(set_val); + return tmp_ret; +#endif +} diff --git a/tvapi/libtv/audio/audio_effect.h b/tvapi/libtv/audio/audio_effect.h new file mode 100644 index 0000000..d5b2789 --- a/dev/null +++ b/tvapi/libtv/audio/audio_effect.h @@ -0,0 +1,32 @@ +#ifndef __TV_AUDIO_EFFECT_H__ +#define __TV_AUDIO_EFFECT_H__ +#include "audio_android_effect.h" + +class CAudioEffect +{ +public: + CAudioEffect(); + virtual ~CAudioEffect(); + int amAndroidNewAudioEffects(); + void amAndroidFreeAudioEffects(); + virtual int GetEQBandCount(); + virtual int GetEQMinGain(); + virtual int GetEQMaxGain(); + virtual int SetEQSwitch(int switch_val); + virtual int GetEQSwitch(); + virtual int SetEQValue(int gain_val_buf[]); + virtual int GetEQValue(int gain_val_buf[]); + + virtual int SetSrsSurroundSwitch(int switch_val); + virtual int SetSrsSurroundGain(int gain_val); + virtual int SetSrsTruBassSwitch(int switch_val); + virtual int SetSrsTruBassGain(int gain_val); + virtual int SetSrsDialogClaritySwitch(int switch_val); + virtual int SetSrsDialogClarityGain(int gain_val); + virtual int SetSrsDefinitionGain(int gain_val); + virtual int SetSrsTrubassSpeakerSize(int tmp_val); + +private: + CAndroidEffect mAndroidEffect; +}; +#endif //__TV_AUDIO_EFFECT_H__ diff --git a/tvapi/libtv/include/amstream.h b/tvapi/libtv/include/amstream.h new file mode 100644 index 0000000..434c028 --- a/dev/null +++ b/tvapi/libtv/include/amstream.h @@ -0,0 +1,263 @@ +#ifndef __AMSTREAM_H__ +#define __AMSTREAM_H__ + +#include "ve.h" + +#define AMSTREAM_IOC_MAGIC 'S' + +#define AMSTREAM_IOC_VB_START _IOW(AMSTREAM_IOC_MAGIC, 0x00, int) +#define AMSTREAM_IOC_VB_SIZE _IOW(AMSTREAM_IOC_MAGIC, 0x01, int) +#define AMSTREAM_IOC_AB_START _IOW(AMSTREAM_IOC_MAGIC, 0x02, int) +#define AMSTREAM_IOC_AB_SIZE _IOW(AMSTREAM_IOC_MAGIC, 0x03, int) +#define AMSTREAM_IOC_VFORMAT _IOW(AMSTREAM_IOC_MAGIC, 0x04, int) +#define AMSTREAM_IOC_AFORMAT _IOW(AMSTREAM_IOC_MAGIC, 0x05, int) +#define AMSTREAM_IOC_VID _IOW(AMSTREAM_IOC_MAGIC, 0x06, int) +#define AMSTREAM_IOC_AID _IOW(AMSTREAM_IOC_MAGIC, 0x07, int) +#define AMSTREAM_IOC_VB_STATUS _IOR(AMSTREAM_IOC_MAGIC, 0x08, unsigned long) +#define AMSTREAM_IOC_AB_STATUS _IOR(AMSTREAM_IOC_MAGIC, 0x09, unsigned long) +#define AMSTREAM_IOC_SYSINFO _IOW(AMSTREAM_IOC_MAGIC, 0x0a, int) +#define AMSTREAM_IOC_ACHANNEL _IOW(AMSTREAM_IOC_MAGIC, 0x0b, int) +#define AMSTREAM_IOC_SAMPLERATE _IOW(AMSTREAM_IOC_MAGIC, 0x0c, int) +#define AMSTREAM_IOC_DATAWIDTH _IOW(AMSTREAM_IOC_MAGIC, 0x0d, int) +#define AMSTREAM_IOC_TSTAMP _IOW(AMSTREAM_IOC_MAGIC, 0x0e, unsigned long) +#define AMSTREAM_IOC_VDECSTAT _IOR(AMSTREAM_IOC_MAGIC, 0x0f, unsigned long) +#define AMSTREAM_IOC_ADECSTAT _IOR(AMSTREAM_IOC_MAGIC, 0x10, unsigned long) + +#define AMSTREAM_IOC_PORT_INIT _IO(AMSTREAM_IOC_MAGIC, 0x11) +#define AMSTREAM_IOC_TRICKMODE _IOW(AMSTREAM_IOC_MAGIC, 0x12, unsigned long) + +#define AMSTREAM_IOC_AUDIO_INFO _IOW(AMSTREAM_IOC_MAGIC, 0x13, unsigned long) +#define AMSTREAM_IOC_TRICK_STAT _IOR(AMSTREAM_IOC_MAGIC, 0x14, unsigned long) +#define AMSTREAM_IOC_AUDIO_RESET _IO(AMSTREAM_IOC_MAGIC, 0x15) +#define AMSTREAM_IOC_SID _IOW(AMSTREAM_IOC_MAGIC, 0x16, int) +#define AMSTREAM_IOC_VPAUSE _IOW(AMSTREAM_IOC_MAGIC, 0x17, int) +#define AMSTREAM_IOC_AVTHRESH _IOW(AMSTREAM_IOC_MAGIC, 0x18, int) +#define AMSTREAM_IOC_SYNCTHRESH _IOW(AMSTREAM_IOC_MAGIC, 0x19, int) +#define AMSTREAM_IOC_SUB_RESET _IOW(AMSTREAM_IOC_MAGIC, 0x1a, int) +#define AMSTREAM_IOC_SUB_LENGTH _IOR(AMSTREAM_IOC_MAGIC, 0x1b, unsigned long) +#define AMSTREAM_IOC_SET_DEC_RESET _IOW(AMSTREAM_IOC_MAGIC, 0x1c, int) +#define AMSTREAM_IOC_TS_SKIPBYTE _IOW(AMSTREAM_IOC_MAGIC, 0x1d, int) +#define AMSTREAM_IOC_SUB_TYPE _IOW(AMSTREAM_IOC_MAGIC, 0x1e, int) +#define AMSTREAM_IOC_CLEAR_VIDEO _IOW(AMSTREAM_IOC_MAGIC, 0x1f, int) + +#define AMSTREAM_IOC_APTS _IOR(AMSTREAM_IOC_MAGIC, 0x40, unsigned long) +#define AMSTREAM_IOC_VPTS _IOR(AMSTREAM_IOC_MAGIC, 0x41, unsigned long) +#define AMSTREAM_IOC_PCRSCR _IOR(AMSTREAM_IOC_MAGIC, 0x42, unsigned long) +#define AMSTREAM_IOC_SYNCENABLE _IOW(AMSTREAM_IOC_MAGIC, 0x43, unsigned long) +#define AMSTREAM_IOC_GET_SYNC_ADISCON _IOR(AMSTREAM_IOC_MAGIC, 0x44, unsigned long) +#define AMSTREAM_IOC_SET_SYNC_ADISCON _IOW(AMSTREAM_IOC_MAGIC, 0x45, unsigned long) +#define AMSTREAM_IOC_GET_SYNC_VDISCON _IOR(AMSTREAM_IOC_MAGIC, 0x46, unsigned long) +#define AMSTREAM_IOC_SET_SYNC_VDISCON _IOW(AMSTREAM_IOC_MAGIC, 0x47, unsigned long) +#define AMSTREAM_IOC_GET_VIDEO_DISABLE _IOR(AMSTREAM_IOC_MAGIC, 0x48, unsigned long) +#define AMSTREAM_IOC_SET_VIDEO_DISABLE _IOW(AMSTREAM_IOC_MAGIC, 0x49, unsigned long) +#define AMSTREAM_IOC_SET_PCRSCR _IOW(AMSTREAM_IOC_MAGIC, 0x4a, unsigned long) +#define AMSTREAM_IOC_GET_VIDEO_AXIS _IOR(AMSTREAM_IOC_MAGIC, 0x4b, unsigned long) +#define AMSTREAM_IOC_SET_VIDEO_AXIS _IOW(AMSTREAM_IOC_MAGIC, 0x4c, unsigned long) +#define AMSTREAM_IOC_GET_VIDEO_CROP _IOR(AMSTREAM_IOC_MAGIC, 0x4d, unsigned long) +#define AMSTREAM_IOC_SET_VIDEO_CROP _IOW(AMSTREAM_IOC_MAGIC, 0x4e, unsigned long) + +// VPP.VE IOCTL command list +#define AMSTREAM_IOC_VE_BEXT _IOW(AMSTREAM_IOC_MAGIC, 0x20, struct ve_bext_s ) +#define AMSTREAM_IOC_VE_DNLP _IOW(AMSTREAM_IOC_MAGIC, 0x21, struct ve_dnlp_s ) +#define AMSTREAM_IOC_VE_HSVS _IOW(AMSTREAM_IOC_MAGIC, 0x22, struct ve_hsvs_s ) +#define AMSTREAM_IOC_VE_CCOR _IOW(AMSTREAM_IOC_MAGIC, 0x23, struct ve_ccor_s ) +#define AMSTREAM_IOC_VE_BENH _IOW(AMSTREAM_IOC_MAGIC, 0x24, struct ve_benh_s ) +#define AMSTREAM_IOC_VE_DEMO _IOW(AMSTREAM_IOC_MAGIC, 0x25, struct ve_demo_s ) +#define AMSTREAM_IOC_VE_VDO_MEAS _IOW(AMSTREAM_IOC_MAGIC, 0x27, struct vdo_meas_s ) +#define AMSTREAM_IOC_VE_DEBUG _IOWR(AMSTREAM_IOC_MAGIC, 0x28, unsigned long long) +#define AMSTREAM_IOC_VE_REGMAP _IOW(AMSTREAM_IOC_MAGIC, 0x29, struct ve_regmap_s) + +// VPP.CM IOCTL command list +#define AMSTREAM_IOC_CM_REGION _IOW(AMSTREAM_IOC_MAGIC, 0x30, struct cm_region_s) +#define AMSTREAM_IOC_CM_TOP _IOW(AMSTREAM_IOC_MAGIC, 0x31, struct cm_top_s ) +#define AMSTREAM_IOC_CM_DEMO _IOW(AMSTREAM_IOC_MAGIC, 0x32, struct cm_demo_s ) +#define AMSTREAM_IOC_CM_DEBUG _IOWR(AMSTREAM_IOC_MAGIC, 0x33, unsigned long long) +#define AMSTREAM_IOC_CM_REGMAP _IOW(AMSTREAM_IOC_MAGIC, 0x34, struct cm_regmap_s) + +//VPP.3D IOCTL command list +#define AMSTREAM_IOC_SET_3D_TYPE _IOW(AMSTREAM_IOC_MAGIC, 0x3c, unsigned int) +#define AMSTREAM_IOC_GET_3D_TYPE _IOW(AMSTREAM_IOC_MAGIC, 0x3d, unsigned int) + +#define AMSTREAM_IOC_SUB_NUM _IOR(AMSTREAM_IOC_MAGIC, 0x50, unsigned long) +#define AMSTREAM_IOC_SUB_INFO _IOR(AMSTREAM_IOC_MAGIC, 0x51, unsigned long) +#define AMSTREAM_IOC_GET_BLACKOUT_POLICY _IOR(AMSTREAM_IOC_MAGIC, 0x52, unsigned long) +#define AMSTREAM_IOC_SET_BLACKOUT_POLICY _IOW(AMSTREAM_IOC_MAGIC, 0x53, unsigned long) +#define AMSTREAM_IOC_GET_SCREEN_MODE _IOR(AMSTREAM_IOC_MAGIC, 0x58, int) +#define AMSTREAM_IOC_SET_SCREEN_MODE _IOW(AMSTREAM_IOC_MAGIC, 0x59, int) +#define AMSTREAM_IOC_GET_VIDEO_DISCONTINUE_REPORT _IOR(AMSTREAM_IOC_MAGIC, 0x5a, int) +#define AMSTREAM_IOC_SET_VIDEO_DISCONTINUE_REPORT _IOW(AMSTREAM_IOC_MAGIC, 0x5b, int) +#define AMSTREAM_IOC_VF_STATUS _IOR(AMSTREAM_IOC_MAGIC, 0x60, unsigned long) +#define AMSTREAM_IOC_CLEAR_VBUF _IO(AMSTREAM_IOC_MAGIC, 0x80) + +#define AMSTREAM_IOC_APTS_LOOKUP _IOR(AMSTREAM_IOC_MAGIC, 0x81, unsigned long) +#define GET_FIRST_APTS_FLAG _IOR(AMSTREAM_IOC_MAGIC, 0x82, long) + +#define AMSTREAM_IOC_GET_SYNC_ADISCON_DIFF _IOR(AMSTREAM_IOC_MAGIC, 0x83, unsigned long) +#define AMSTREAM_IOC_GET_SYNC_VDISCON_DIFF _IOR(AMSTREAM_IOC_MAGIC, 0x84, unsigned long) +#define AMSTREAM_IOC_SET_SYNC_ADISCON_DIFF _IOW(AMSTREAM_IOC_MAGIC, 0x85, unsigned long) +#define AMSTREAM_IOC_SET_SYNC_VDISCON_DIFF _IOW(AMSTREAM_IOC_MAGIC, 0x86, unsigned long) +#define AMSTREAM_IOC_GET_FREERUN_MODE _IOR(AMSTREAM_IOC_MAGIC, 0x87, unsigned long) +#define AMSTREAM_IOC_SET_FREERUN_MODE _IOW(AMSTREAM_IOC_MAGIC, 0x88, unsigned long) +#define AMSTREAM_IOC_SET_DEMUX _IOW(AMSTREAM_IOC_MAGIC, 0x90, unsigned long) + +#define AMSTREAM_IOC_SET_VIDEO_DELAY_LIMIT_MS _IOW(AMSTREAM_IOC_MAGIC, 0xa0, unsigned long) +#define AMSTREAM_IOC_GET_VIDEO_DELAY_LIMIT_MS _IOR(AMSTREAM_IOC_MAGIC, 0xa1, unsigned long) +#define AMSTREAM_IOC_SET_AUDIO_DELAY_LIMIT_MS _IOW(AMSTREAM_IOC_MAGIC, 0xa2, unsigned long) +#define AMSTREAM_IOC_GET_AUDIO_DELAY_LIMIT_MS _IOR(AMSTREAM_IOC_MAGIC, 0xa3, unsigned long) +#define AMSTREAM_IOC_GET_AUDIO_CUR_DELAY_MS _IOR(AMSTREAM_IOC_MAGIC, 0xa4, unsigned long) +#define AMSTREAM_IOC_GET_VIDEO_CUR_DELAY_MS _IOR(AMSTREAM_IOC_MAGIC, 0xa5, unsigned long) +#define AMSTREAM_IOC_GET_AUDIO_AVG_BITRATE_BPS _IOR(AMSTREAM_IOC_MAGIC, 0xa6, unsigned long) +#define AMSTREAM_IOC_GET_VIDEO_AVG_BITRATE_BPS _IOR(AMSTREAM_IOC_MAGIC, 0xa7, unsigned long) + +#define TRICKMODE_NONE 0x00 +#define TRICKMODE_I 0x01 +#define TRICKMODE_FFFB 0x02 + +#define TRICK_STAT_DONE 0x01 +#define TRICK_STAT_WAIT 0x00 + +#define AUDIO_EXTRA_DATA_SIZE (4096) +#define MAX_SUB_NUM 32 +/* +enum VIDEO_DEC_TYPE +{ + VIDEO_DEC_FORMAT_UNKNOW, + VIDEO_DEC_FORMAT_MPEG4_3, + VIDEO_DEC_FORMAT_MPEG4_4, + VIDEO_DEC_FORMAT_MPEG4_5, + VIDEO_DEC_FORMAT_H264, + VIDEO_DEC_FORMAT_MJPEG, + VIDEO_DEC_FORMAT_MP4, + VIDEO_DEC_FORMAT_H263, + VIDEO_DEC_FORMAT_REAL_8, + VIDEO_DEC_FORMAT_REAL_9, + VIDEO_DEC_FORMAT_WMV3, + VIDEO_DEC_FORMAT_WVC1, + VIDEO_DEC_FORMAT_SW, + VIDEO_DEC_FORMAT_MAX +}; +*/ +struct buf_status { + int size; + int data_len; + int free_len; + unsigned int read_pointer; + unsigned int write_pointer; +}; + + +struct vdec_status { + unsigned int width; + unsigned int height; + unsigned int fps; + unsigned int error_count; + unsigned int status; +}; + +struct adec_status { + unsigned int channels; + unsigned int sample_rate; + unsigned int resolution; + unsigned int error_count; + unsigned int status; +}; + +struct am_io_param { + union { + int data; + int id;//get bufstatus? //or others + }; + + int len; //buffer size; + + union { + char buf[1]; + struct buf_status status; + struct vdec_status vstatus; + struct adec_status astatus; + }; +}; +struct audio_info { + int valid; + int sample_rate; + int channels; + int bitrate; + int codec_id; + int block_align; + int extradata_size; + char extradata[AUDIO_EXTRA_DATA_SIZE]; +}; + +struct dec_sysinfo { + unsigned int format; + unsigned int width; + unsigned int height; + unsigned int rate; + unsigned int extra; + unsigned int status; + unsigned int ratio; + void *param; + unsigned long long ratio64; +}; + +struct subtitle_info { + unsigned char id; + unsigned char width; + unsigned char height; + unsigned char type; +}; + +struct codec_profile_t { + char *name; // video codec short name + char *profile; // Attributes,seperated by commas +}; +#define SUPPORT_VDEC_NUM (8) + +int vcodec_profile_register(const struct codec_profile_t *vdec_profile); +int vcodec_profile_read(char *buf); + +#ifdef __KERNEL__ +#ifdef ENABLE_DEMUX_DRIVER +/*TS demux operation interface*/ +struct tsdemux_ops { + int (*reset)(void); + int (*set_reset_flag)(void); + int (*request_irq)(irq_handler_t handler, void *data); + int (*free_irq)(void); + int (*set_vid)(int vpid); + int (*set_aid)(int apid); + int (*set_sid)(int spid); + int (*set_skipbyte)(int skipbyte); + int (*set_demux)(int dev); +}; + +void tsdemux_set_ops(struct tsdemux_ops *ops); +int tsdemux_set_reset_flag(void); + +#endif /*ENABLE_DEMUX_DRIVER*/ +void set_vdec_func(int (*vdec_func)(struct vdec_status *)); +void set_adec_func(int (*adec_func)(struct adec_status *)); +void set_trickmode_func(int (*trickmode_func)(unsigned long trickmode)); +void wakeup_sub_poll(void); +int wakeup_userdata_poll(int wp, int start_phyaddr, int buf_size); +int get_sub_type(void); +#endif + +typedef struct tcon_gamma_table_s { + unsigned short data[256]; +} tcon_gamma_table_t; + +typedef struct tcon_rgb_ogo_s { + unsigned int en; + int r_pre_offset; // s11.0, range -1024~+1023, default is 0 + int g_pre_offset; // s11.0, range -1024~+1023, default is 0 + int b_pre_offset; // s11.0, range -1024~+1023, default is 0 + unsigned int r_gain; // u1.10, range 0~2047, default is 1024 (1.0x) + unsigned int g_gain; // u1.10, range 0~2047, default is 1024 (1.0x) + unsigned int b_gain; // u1.10, range 0~2047, default is 1024 (1.0x) + int r_post_offset; // s11.0, range -1024~+1023, default is 0 + int g_post_offset; // s11.0, range -1024~+1023, default is 0 + int b_post_offset; // s11.0, range -1024~+1023, default is 0 +} tcon_rgb_ogo_t; + +#endif //__AMSTREAM_H__ diff --git a/tvapi/libtv/include/amvecm.h b/tvapi/libtv/include/amvecm.h new file mode 100644 index 0000000..1b488f6 --- a/dev/null +++ b/tvapi/libtv/include/amvecm.h @@ -0,0 +1,68 @@ +#ifndef __AMVECM_H +#define __AMVECM_H + +#include "ve.h" +#include "cm.h" +#include "amstream.h" + + +//struct ve_dnlp_s video_ve_dnlp; + +#define FLAG_RSV31 (1 << 31) +#define FLAG_RSV30 (1 << 30) +#define FLAG_VE_DNLP (1 << 29) +#define FLAG_VE_NEW_DNLP (1 << 28) +#define FLAG_RSV27 (1 << 27) +#define FLAG_RSV26 (1 << 26) +#define FLAG_RSV25 (1 << 25) +#define FLAG_RSV24 (1 << 24) +#define FLAG_3D_SYNC_DIS (1 << 23) +#define FLAG_3D_SYNC_EN (1 << 22) +#define FLAG_VLOCK_PLL (1 << 21) +#define FLAG_VLOCK_ENC (1 << 20) +#define FLAG_VE_DNLP_EN (1 << 19) +#define FLAG_VE_DNLP_DIS (1 << 18) +#define FLAG_RSV17 (1 << 17) +#define FLAG_RSV16 (1 << 16) +#define FLAG_GAMMA_TABLE_EN (1 << 15) +#define FLAG_GAMMA_TABLE_DIS (1 << 14) +#define FLAG_GAMMA_TABLE_R (1 << 13) +#define FLAG_GAMMA_TABLE_G (1 << 12) +#define FLAG_GAMMA_TABLE_B (1 << 11) +#define FLAG_RGB_OGO (1 << 10) +#define FLAG_RSV9 (1 << 9) +#define FLAG_RSV8 (1 << 8) +#define FLAG_BRI_CON (1 << 7) +#define FLAG_LVDS_FREQ_SW (1 << 6) +#define FLAG_REG_MAP5 (1 << 5) +#define FLAG_REG_MAP4 (1 << 4) +#define FLAG_REG_MAP3 (1 << 3) +#define FLAG_REG_MAP2 (1 << 2) +#define FLAG_REG_MAP1 (1 << 1) +#define FLAG_REG_MAP0 (1 << 0) + + +#define AMVECM_IOC_MAGIC 'C' + +#define AMVECM_IOC_VE_DNLP _IOW(AMVECM_IOC_MAGIC, 0x21, struct ve_dnlp_s ) +#define AMVECM_IOC_G_HIST_AVG _IOW(AMVECM_IOC_MAGIC, 0x22, struct ve_hist_s ) +#define AMVECM_IOC_VE_DNLP_EN _IO(AMVECM_IOC_MAGIC, 0x23) +#define AMVECM_IOC_VE_DNLP_DIS _IO(AMVECM_IOC_MAGIC, 0x24) +#define AMVECM_IOC_VE_NEW_DNLP _IOW(AMVECM_IOC_MAGIC, 0x25, struct ve_dnlp_table_s ) + + +// VPP.CM IOCTL command list +#define AMVECM_IOC_LOAD_REG _IOW(AMVECM_IOC_MAGIC, 0x30, struct am_regs_s) + + +// VPP.GAMMA IOCTL command list +#define AMVECM_IOC_GAMMA_TABLE_EN _IO(AMVECM_IOC_MAGIC, 0x40) +#define AMVECM_IOC_GAMMA_TABLE_DIS _IO(AMVECM_IOC_MAGIC, 0x41) +#define AMVECM_IOC_GAMMA_TABLE_R _IOW(AMVECM_IOC_MAGIC, 0x42, struct tcon_gamma_table_s) +#define AMVECM_IOC_GAMMA_TABLE_G _IOW(AMVECM_IOC_MAGIC, 0x43, struct tcon_gamma_table_s) +#define AMVECM_IOC_GAMMA_TABLE_B _IOW(AMVECM_IOC_MAGIC, 0x44, struct tcon_gamma_table_s) +#define AMVECM_IOC_S_RGB_OGO _IOW(AMVECM_IOC_MAGIC, 0x45, struct tcon_rgb_ogo_s) +#define AMVECM_IOC_G_RGB_OGO _IOR(AMVECM_IOC_MAGIC, 0x46, struct tcon_rgb_ogo_s) + +#endif /* __AMVECM_H */ + diff --git a/tvapi/libtv/include/cm.h b/tvapi/libtv/include/cm.h new file mode 100644 index 0000000..c9e0cb1 --- a/dev/null +++ b/tvapi/libtv/include/cm.h @@ -0,0 +1,153 @@ +#ifndef _TVOUT_CM_H +#define _TVOUT_CM_H + +// *************************************************************************** +// *** enum definitions ********************************************* +// *************************************************************************** + +typedef enum cm_region_idx_e { + CM_REGION_IDX_0 = 0, + CM_REGION_IDX_1, + CM_REGION_IDX_2, + CM_REGION_IDX_3, + CM_REGION_IDX_4, + CM_REGION_IDX_5, + CM_REGION_IDX_6, + CM_REGION_IDX_7, +} cm_region_idx_t; + +typedef enum cm_sat_shape_e { + CM_SAT_SHAPE_RIGHT_BIGGEST = 0, + CM_SAT_SHAPE_LEFT_BIGGEST, +} cm_sat_shape_t; + +typedef enum cm_hue_shape_e { + CM_HUE_SHAPE_LEFT_MORE = 0, + CM_HUE_SHAPE_RIGHT_MORE, +} cm_hue_shape_t; + +typedef enum cm_demo_pos_e { + CM_DEMO_POS_TOP = 0, + CM_DEMO_POS_BOTTOM, + CM_DEMO_POS_LEFT, + CM_DEMO_POS_RIGHT, +} cm_demo_pos_t; + +typedef enum cm_sat_sel_e { + CM_SAT_SEL_U2_V2 = 0, + CM_SAT_SEL_UV_MAX, +} cm_sat_sel_t; + +typedef enum cm_csc_e { + CM_CSC_601 = 0, + CM_CSC_709, + CM_CSC_FULL_601, + CM_CSC_FULL_709, +} cm_csc_t; + +// *************************************************************************** +// *** struct definitions ********************************************* +// *************************************************************************** + +typedef struct cm_region_s { + enum cm_region_idx_e region_idx; + // sym + unsigned char sym_en; + // sat - top + unsigned char sat_en; + unsigned char sat_central_en; + enum cm_sat_shape_e sat_shape; + unsigned char sat_gain; + unsigned char sat_inc; + // sat - lum + unsigned char sat_lum_h_slope; + unsigned char sat_lum_l_slope; + unsigned char sat_lum_h; + unsigned char sat_lum_l; + // sat - sat + unsigned char sat_sat_h_slope; + unsigned char sat_sat_l_slope; + unsigned char sat_sat_h; + unsigned char sat_sat_l; + // hue - top + unsigned char hue_en; + unsigned char hue_central_en; + enum cm_hue_shape_e hue_shape; + unsigned char hue_gain; + unsigned char hue_clockwise; + unsigned char hue_shf_ran; + unsigned short hue_shf_sta; + // hue - lum + unsigned char hue_lum_h_slope; + unsigned char hue_lum_l_slope; + unsigned char hue_lum_h; + unsigned char hue_lum_l; + // hue - sat + unsigned char hue_sat_h_slope; + unsigned char hue_sat_l_slope; + unsigned char hue_sat_h; + unsigned char hue_sat_l; +} cm_region_t; + +typedef struct cm_top_s { + unsigned char chroma_en; + enum cm_sat_sel_e sat_sel; + unsigned char uv_adj_en; + unsigned char rgb_to_hue_en; + enum cm_csc_e csc_sel; +} cm_top_t; + +typedef struct cm_cbar_s { + unsigned char en; + unsigned char wid; + unsigned char cr; + unsigned char cb; + unsigned char y; +} cm_cbar_t; +typedef struct cm_demo_s { + unsigned char en; + enum cm_demo_pos_e pos; + unsigned char hlight_adj; + unsigned short wid; + struct cm_cbar_s cbar; +} cm_demo_t; + +typedef struct cm_regmap_s { + unsigned long reg[50]; +} cm_regmap_t; + +typedef enum reg_bus_type_e { + REG_TYPE_PHY = 0, + REG_TYPE_CBUS, + REG_TYPE_APB, + REG_TYPE_AXI, + REG_TYPE_AHB, + REG_TYPE_MPEG, + REG_TYPE_INDEX_VPPCHROMA, + REG_TYPE_INDEX_GAMMA, + VALUE_TYPE_CONTRAST_BRIGHTNESS, + REG_TYPE_INDEX_VPP_COEF, + REG_TYPE_MAX, +} reg_bus_type_t; + +/* Register table structure */ +typedef struct am_reg_s { + unsigned int type; //32-bits; 0: CBUS; 1: APB BUS... + unsigned int addr; //32-bits; Register address + unsigned int mask; //32-bits; Valid bits + unsigned int val; //32-bits; Register Value +} am_reg_t; + +#ifdef AMVIDEO_REG_TABLE_DYNAMIC +typedef struct am_regs_s { + unsigned int length; // Length of total am_reg + struct am_reg_s *am_reg; +} am_regs_t; +#else +typedef struct am_regs_s { + unsigned int length; // Length of total am_reg + struct am_reg_s am_reg[512]; +} am_regs_t; +#endif + +#endif // _TVOUT_CM_H diff --git a/tvapi/libtv/include/hdmirx_cec.h b/tvapi/libtv/include/hdmirx_cec.h new file mode 100644 index 0000000..e7bfd06 --- a/dev/null +++ b/tvapi/libtv/include/hdmirx_cec.h @@ -0,0 +1,331 @@ +/* + * hdmirx_drv.h for HDMI device driver, and declare IO function, + * structure, enum, used in TVIN AFE sub-module processing + * + * Copyright (C) 2013 AMLOGIC, INC. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the smems of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + */ + +#ifndef _HDMICEC_H +#define _HDMICEC_H + +#define CEC_MSG_QUEUE_SIZE 20 + +typedef enum _cec_logic_addr { + E_LA_TV = 0, + E_LA_RECORDER1 = 1, + E_LA_RECORDER2 = 2, + E_LA_TUNER1 = 3, + E_LA_PLAYBACK1 = 4, + E_LA_AUDIO_SYS = 5, + E_LA_TUNER2 = 6, + E_LA_TUNER3 = 7, + E_LA_PLAYBACK2 = 8, + E_LA_RECORER3 = 9, + E_LA_TUNER4 = 10, + E_LA_PLYBACK3 = 11, + RESERVED_1 = 12, + RESERVED_2 = 13, + E_LA_FREE_USE = 14, + E_LA_UNREGISTERED = 15, + E_LA_BROADCAST = 15, + E_LA_MAX = 15, +} _cec_logic_addr; + +typedef enum _cec_dev_type { + E_DEVICE_TYPE_TV = 0, + E_DEVICE_TYPE_RECORDING_DEVICE = 1, + E_DEVICE_TYPE_RESERVED = 2, + E_DEVICE_TYPE_TUNER = 3, + E_DEVICE_TYPE_PLAYBACK_DEVICE = 4, + E_DEVICE_TYPE_AUDIO_SYSTEM = 5, + E_DEVICE_TYPE_PURE_CEC_SWITCH = 6, + E_DEVICE_TYPE_VIDEO_PROCESSOR = 7 +} _cec_dev_type; + +typedef enum _cec_cmd { + //----- One Touch Play ---------------------------- + E_MSG_ACTIVE_SOURCE = 0x82, + E_MSG_IMAGE_VIEW_ON = 0x04, + E_MSG_TEXT_VIEW_ON = 0x0D, + //----- Routing Control --------------------------- + //E_MSG_RC_ACTIVE_SOURCE = 0x82, + E_MSG_INACTIVE_SOURCE = 0x9D, + E_MSG_REQUEST_ACTIVE_SOURCE = 0x85, + E_MSG_ROUTING_CHANGE = 0x80, + E_MSG_ROUTING_INFO = 0x81, + E_MSG_SET_STREM_PATH = 0x86, + //----- Standby Command --------------------------- + E_MSG_STANDBY = 0x36, + //----- One Touch Record--------------------------- + E_MSG_RECORD_ON = 0x09, + E_MSG_RECORD_OFF = 0x0B, + E_MSG_RECORD_STATUS = 0x0A, + E_MSG_RECORD_TV_SCREEN = 0x0F, + //----- Timer programmer -------------------------- CEC1.3a + E_MSG_CLEAR_ANALOG_TIMER = 0x33, + E_MSG_CLEAR_DIGITAL_TIMER = 0x99, + E_MSG_CLEAR_EXT_TIMER = 0xA1, + E_MSG_SET_ANALOG_TIMER = 0x34, + E_MSG_SET_DIGITAL_TIMER = 0x97, + E_MSG_SET_EXT_TIMER = 0xA2, + E_MSG_SET_TIMER_PROGRAM_TITLE = 0x67, + E_MSG_TIMER_CLEARD_STATUS = 0x43, + E_MSG_TIMER_STATUS = 0x35, + //----- System Information ------------------------ + E_MSG_CEC_VERSION = 0x9E, //1.3a + E_MSG_GET_CEC_VERSION = 0x9F, //1.3a + E_MSG_GIVE_PHYSICAL_ADDRESS = 0x83, + E_MSG_REPORT_PHYSICAL_ADDRESS = 0x84, + E_MSG_GET_MENU_LANGUAGE = 0x91, + E_MSG_SET_MENU_LANGUAGE = 0x32, + //E_MSG_POLLING_MESSAGE = ?, + //E_MSG_REC_TYPE_PRESET = 0x00, //parameter ? + //E_MSG_REC_TYPE_OWNSRC = 0x01, //parameter ? + //----- Deck Control Feature----------------------- + E_MSG_DECK_CTRL = 0x42, + E_MSG_DECK_STATUS = 0x1B, + E_MSG_GIVE_DECK_STATUS = 0x1A, + E_MSG_PLAY = 0x41, + //----- Tuner Control ------------------------------ + E_MSG_GIVE_TUNER_STATUS = 0x08, + E_MSG_SEL_ANALOG_SERVICE = 0x92, + E_MSG_SEL_DIGITAL_SERVICE = 0x93, + E_MSG_TUNER_DEVICE_STATUS = 0x07, + E_MSG_TUNER_STEP_DEC = 0x06, + E_MSG_TUNER_STEP_INC = 0x05, + //---------Vendor Specific ------------------------- + //E_MSG_CEC_VERSION = 0x9E, //1.3a + //E_MSG_GET_CEC_VERSION = 0x9F, //1.3a + E_MSG_DEVICE_VENDOR_ID = 0x87, + E_MSG_GIVE_DEVICE_VENDOR_ID = 0x8C, + E_MSG_VENDOR_COMMAND = 0x89, + E_MSG_VENDOR_COMMAND_WITH_ID = 0xA0, //1.3a + E_MSG_VENDOR_RC_BUT_DOWN = 0x8A, + E_MSG_VENDOR_RC_BUT_UP = 0x8B, + //----- OSD Display -------------------------------- + E_MSG_SET_OSD_STRING = 0x64, + //----- Device OSD Name Transfer ------------------------- + E_MSG_OSDNT_GIVE_OSD_NAME = 0x46, + E_MSG_OSDNT_SET_OSD_NAME = 0x47, + //----- Device Menu Control ------------------------ + E_MSG_DMC_MENU_REQUEST = 0x8D, + E_MSG_DMC_MENU_STATUS = 0x8E, + E_MSG_UI_PRESS = 0x44, + E_MSG_UI_RELEASE = 0x45, + //----- Remote Control Passthrough ---------------- + //E_MSG_UI_PRESS = 0x44, + //E_MSG_UI_RELEASE = 0x45, + //----- Power Status ------------------------------ + E_MSG_GIVE_DEVICE_POWER_STATUS = 0x8F, + E_MSG_REPORT_POWER_STATUS = 0x90, + //----- General Protocal Message ------------------ + E_MSG_ABORT_MESSAGE = 0xFF, //Abort msg + E_MSG_FEATURE_ABORT = 0x00, //Feature Abort + //----- System Audio Control ---------------------- + E_MSG_ARC_GIVE_AUDIO_STATUS = 0x71, + E_MSG_ARC_GIVE_SYSTEM_AUDIO_MODE_STATUS = 0x7D, + E_MSG_ARC_REPORT_AUDIO_STATUS = 0x7A, + E_MSG_ARC_SET_SYSTEM_AUDIO_MODE = 0x72, + E_MSG_ARC_SYSTEM_AUDIO_MODE_REQUEST = 0x70, + E_MSG_ARC_SYSTEM_AUDIO_MODE_STATUS = 0x7E, + E_MSG_ARC_SET_AUDIO_RATE = 0x9A, + //----- Audio Return Channel Control ------------- + E_MSG_ARC_INITIATE_ARC = 0xC0, + E_MSG_ARC_REPORT_ARC_INITIATED = 0xC1, + E_MSG_ARC_REPORT_ARC_TERMINATED = 0xC2, + E_MSG_ARC_REQUEST_ARC_INITATION = 0xC3, + E_MSG_ARC_REQUEST_ARC_TERMINATION = 0xC4, + E_MSG_ARC_TERMINATED_ARC = 0xC5, + + E_MSG_CDC_MESSAGE = 0xF8, + //amlogic cmd + //TCL + CMD_TCL_WIFI = 0x01, + CMD_TCL_ETHERNET = 0x02, + CMD_TCL_3D = 0x03, + CMD_TCL_PANEL_REVERSE = 0x04, + CMD_RESERVE1 = 0x05, + CMD_RESERVE2 = 0x06, + CMD_RESERVE3 = 0x07, + //VPU + CMD_VPU_INIT = 0x08, + CMD_VPU_ENABLE = 0x09, + CMD_VPU_BYPASS = 0x0a, + CMD_VPU_OUTPUT_MUX = 0x0b, + CMD_VPU_TIMING = 0x0c, + CMD_VPU_SOURCE = 0x0d, + CMD_RESERVE4 = 0x0e, + CMD_RESERVE5 = 0x0f, + //TCL || AML + CMD_TCL_BRIDGE_SW_VER = 0x10, + //CMD_G9_MAINCODE_VER = 0x10, + CMD_TCL_DEVICE_ID = 0x11, + //CMD_G9_BOOTCODE_VER = 0x11, + CMD_TCL_CLIENT_TYPE = 0x12, + //CMD_INFO_G9_TO_FBC = 0x12, + CMD_TCL_DEVICE_NUM = 0x13, + //CMD_INFO_FBC_TO_G9 = 0x13, + CMD_TCL_ACTIVE_KEY = 0x14, + //CMD_TIME_SYNC = 0x14, + CMD_TCL_ACTIVE_STATUS = 0x15, + //CMD_KEY_TRANSLATION = 0x15, + CMD_RESERVE6 = 0x16, + CMD_RESERVE7 = 0x17, + //DEBUG READ + CMD_DBG_RD_REGISTER_ACCESS = 0x18, + CMD_DBG_RD_MEMORY_ACCESS = 0x19, + CMD_DBG_RD_SPI_ACCESS = 0x1a, + CMD_DBG_RD_VPU_MEMORY_ACCESS = 0x1b, + CMD_DBG_RD_MEMORY_TRANSFER = 0x1c, + CMD_DBG_INPUT_KEY_DOWN = 0x1d, + CMD_DBG_INPUT_KEY_UP = 0x1e, + CMD_DBG_INPUT_REBOOT = 0x1f, + //DEBUG WRITE + CMD_DBG_WR_REGISTER_ACCESS = 0x98, + CMD_DBG_WR_MEMORY_ACCESS = 0x99, + CMD_DBG_WR_SPI_ACCESS = 0x9a, + CMD_DBG_WR_VPU_MEMORY_ACCESS = 0x9b, + CMD_DBG_WR_MEMORY_TRANSFER = 0x9c, + //USER + CMD_NATURE_LIGHT_ONOFF = 0x20, + CMD_USR_BACKLIGHT_ONOFF = 0x21, + CMD_USR_BRIGHTNESS = 0x22, + CMD_USR_CONTRAST = 0x23, + CMD_USR_BACKLIGHT = 0x24, + CMD_RESERVE25 = 0x25, + CMD_USR_SATURATION = 0x26, + CMD_USR_DYNAMIC_CONTRAST = 0x27, + CMD_USR_PICTURE_MODE = 0x28, + CMD_TEST_PATTERN_ONOFF = 0x29, + CMD_TEST_PATTERN_SELECT = 0x2a, + CMD_RESERVE8 = 0x2b, + CMD_RESERVE9 = 0x2c, + CMD_RESERVE10 = 0x2d, + CMD_RESERVE11 = 0x2e, + CMD_USR_GAMMA = 0x2f, + //FACTORY + CMD_DEF_SOUND_MODE = 0x30, + CMD_DEF_COLOR_TEMPERATURE = 0x31, + CMD_DEF_BRIGHTNESS = 0x32, + CMD_DEF_CONTRAST = 0x33, + CMD_DEF_COLOR = 0x34, + CMD_RESERVE12 = 0x35, + CMD_DEF_BACKLIGHT = 0x36, + CMD_RESERVE13 = 0x37, + CMD_AUTO_LUMA_ONOFF = 0x38, + CMD_HISTOGRAM = 0x39, + CMD_BLEND = 0x3a, + CMD_DEMULA = 0x3b, + CMD_COLORSPACE_CONVERSION = 0x3c, + CMD_CM2 = 0x3d, + CMD_RESERVE14 = 0x3e, + CMD_RESERVE15 = 0x3f, + // GAIN & OFFSET & WHITEBLANCE + CMD_DEF_RED_GAIN = 0x40, + CMD_DEF_GREEN_GAIN = 0x41, + CMD_DEF_BLUE_GAIN = 0x42, + CMD_DEF_RED_OFFSET = 0x43, + CMD_DEF_GREEN_OFFSET = 0x44, + CMD_DEF_BLUE_OFFSET = 0x45, + CMD_DEF_PRE_RED_OFFSET = 0x46, + CMD_DEF_PRE_GREEN_OFFSET = 0x47, + CMD_DEF_PRE_BLUE_OFFSET = 0x48, + CMD_RESERVE16 = 0x49, + CMD_WHITEBLANCE = 0x4a, + + CMD_SET_SW_VERSION = 0x57, + CMD_3D = 0xd0, + + CMD_MAX = 0xff +} _cec_cmd; + +typedef struct _cec_msg { + unsigned char addr; //refer as enum _cec_logic_addr + unsigned char cmd; //refer as enum _cec_cmd + unsigned char msg_data[14]; + unsigned char msg_len; +} _cec_msg; + +typedef union tagCECMsgStream { + unsigned char buf[17]; + struct _cec_msg msg; +} CECMsgStream; + +typedef struct _cec_dev_map { + enum _cec_logic_addr logic_addr; + unsigned int phy_addr; + int cec_dev_type; + char cec_dev_name[14]; +} _cec_dev_map; + +typedef struct _cec_msg_queue { + struct _cec_msg cec_msg[CEC_MSG_QUEUE_SIZE]; + int wr_index; + int rd_index; +} _cec_msg_queue; + + + +typedef enum _cec_status { + E_CEC_FEATURE_ABORT = 0x00, + E_CEC_RX_SUCCESS = 0x01, + E_CEC_TX_SUCCESS = 0x02, + E_CEC_RF = 0x04, + E_CEC_LOST_ABT = 0x08, + E_CEC_BIT_SHORT = 0x10, + E_CEC_BIT_LONG = 0x20, + E_CEC_NACK = 0x40, + E_CEC_SYSTEM_BUSY = 0x80, +} _cec_status; + + +typedef enum _cec_map_status { + E_CEC_MAP_UPDATE_START = 0, + E_CEC_MAP_POLLLING = 1, + E_CEC_MAP_GET_VENDOR_ID = 2, + E_CEC_MAP_GET_PHYSICAL_ADDR = 3, + E_CEC_MAP_GET_OSD_NAME = 4, + E_CEC_MAP_GET_CEC_VERSION = 5, + E_CEC_MAP_UPDATE_COMPLETED = 6, +} _cec_map_status; + +#define HDMI_IOC_MAGIC 'H' +#define HDMI_IOC_CEC_ON _IO(HDMI_IOC_MAGIC, 0x01) +#define HDMI_IOC_CEC_OFF _IO(HDMI_IOC_MAGIC, 0x02) +#define HDMI_IOC_CEC_ARC_ON _IO(HDMI_IOC_MAGIC, 0x03) +#define HDMI_IOC_CEC_ARC_OFF _IO(HDMI_IOC_MAGIC, 0x04) +#define HDMI_IOC_CEC_CLEAR_BUFFER _IO(HDMI_IOC_MAGIC, 0x05) +#define HDMI_IOC_CEC_GET_MSG_CNT _IOR(HDMI_IOC_MAGIC, 0x06, int) +#define HDMI_IOC_CEC_GET_MSG _IOR(HDMI_IOC_MAGIC, 0x07, struct _cec_msg) +#define HDMI_IOC_CEC_SENT_MSG _IOW(HDMI_IOC_MAGIC, 0x08, struct _cec_msg) + +//#include <linux/tvin/tvin.h> +//#include "../tvin_global.h" +//#include "../tvin_format_table.h" + +extern void dump_cec_message(int all); +extern void cec_dump_dev_map(void); +extern void clean_cec_message(void); +extern int cec_init(void); +extern void cec_state(bool cec_rx); +extern int cec_handler(bool get_msg, bool get_ack); +extern int hdmirx_cec_rx_monitor(void); +extern int hdmirx_cec_tx_monitor(void); +extern void cec_update_cec_map(void); +extern void cec_post_msg(_cec_logic_addr addr, _cec_cmd cmd, int *data, int length); + +//extern void cec_enable_eom_irq(void); +//tcl +extern void hdmirx_cec_fun_onoff(bool enable); +extern void hdmirx_cec_arc_onoff(bool enable); +extern void hdmirx_cec_clear_rx_buffer(void); +extern void cec_post_msg_to_buf(struct _cec_msg *msg); +extern int hdmirx_get_cec_msg_cnt(void); +extern void clean_cec_message(void); +struct _cec_msg *hdmirx_get_rx_msg(void); + +#endif diff --git a/tvapi/libtv/include/ve.h b/tvapi/libtv/include/ve.h new file mode 100644 index 0000000..ebc0816 --- a/dev/null +++ b/tvapi/libtv/include/ve.h @@ -0,0 +1,219 @@ +#ifndef __VE_H +#define __VE_H + +// *************************************************************************** +// *** enum definitions ********************************************* +// *************************************************************************** + +typedef enum ve_demo_pos_e { + VE_DEMO_POS_TOP = 0, + VE_DEMO_POS_BOTTOM, + VE_DEMO_POS_LEFT, + VE_DEMO_POS_RIGHT, +} ve_demo_pos_t; + +typedef enum ve_dnlp_rt_e { + VE_DNLP_RT_0S = 0, + VE_DNLP_RT_1S = 6, + VE_DNLP_RT_2S, + VE_DNLP_RT_4S, + VE_DNLP_RT_8S, + VE_DNLP_RT_16S, + VE_DNLP_RT_32S, + VE_DNLP_RT_64S, + VE_DNLP_RT_FREEZE, +} ve_dnlp_rt_t; + +// *************************************************************************** +// *** struct definitions ********************************************* +// *************************************************************************** + +typedef enum ve_dnlp_rl_e { + VE_DNLP_RL_01 = 1, // max_contrast = 1.0625x + VE_DNLP_RL_02, // max_contrast = 1.1250x + VE_DNLP_RL_03, // max_contrast = 1.1875x + VE_DNLP_RL_04, // max_contrast = 1.2500x + VE_DNLP_RL_05, // max_contrast = 1.3125x + VE_DNLP_RL_06, // max_contrast = 1.3750x + VE_DNLP_RL_07, // max_contrast = 1.4375x + VE_DNLP_RL_08, // max_contrast = 1.5000x + VE_DNLP_RL_09, // max_contrast = 1.5625x + VE_DNLP_RL_10, // max_contrast = 1.6250x + VE_DNLP_RL_11, // max_contrast = 1.6875x + VE_DNLP_RL_12, // max_contrast = 1.7500x + VE_DNLP_RL_13, // max_contrast = 1.8125x + VE_DNLP_RL_14, // max_contrast = 1.8750x + VE_DNLP_RL_15, // max_contrast = 1.9375x + VE_DNLP_RL_16, // max_contrast = 2.0000x +} ve_dnlp_rl_t; + +typedef enum ve_dnlp_ext_e { + VE_DNLP_EXT_00 = 0, // weak + VE_DNLP_EXT_01, + VE_DNLP_EXT_02, + VE_DNLP_EXT_03, + VE_DNLP_EXT_04, + VE_DNLP_EXT_05, + VE_DNLP_EXT_06, + VE_DNLP_EXT_07, + VE_DNLP_EXT_08, + VE_DNLP_EXT_09, + VE_DNLP_EXT_10, + VE_DNLP_EXT_11, + VE_DNLP_EXT_12, + VE_DNLP_EXT_13, + VE_DNLP_EXT_14, + VE_DNLP_EXT_15, + VE_DNLP_EXT_16, // strong +} ve_dnlp_ext_t; + +typedef struct ve_bext_s { + unsigned char en; + unsigned char start; + unsigned char slope1; + unsigned char midpt; + unsigned char slope2; +} ve_bext_t; + +typedef struct ve_dnlp_s { + unsigned int en; + enum ve_dnlp_rt_e rt; + enum ve_dnlp_rl_e rl; + enum ve_dnlp_ext_e black; + enum ve_dnlp_ext_e white; +} ve_dnlp_t; +typedef struct ve_hist_s { + unsigned long sum; + int width; + int height; + int ave; +} ve_hist_t; +typedef struct ve_dnlp_table_s { + unsigned int en; + unsigned int method; + unsigned int cliprate; + unsigned int lowrange; + unsigned int hghrange; + unsigned int lowalpha; + unsigned int midalpha; + unsigned int hghalpha; +} ve_dnlp_table_t; +typedef struct ve_hsvs_s { + unsigned char en; + unsigned char peak_gain_h1; + unsigned char peak_gain_h2; + unsigned char peak_gain_h3; + unsigned char peak_gain_h4; + unsigned char peak_gain_h5; + unsigned char peak_gain_v1; + unsigned char peak_gain_v2; + unsigned char peak_gain_v3; + unsigned char peak_gain_v4; + unsigned char peak_gain_v5; + unsigned char peak_gain_v6; + unsigned char hpeak_slope1; + unsigned char hpeak_slope2; + unsigned char hpeak_thr1; + unsigned char hpeak_thr2; + unsigned char hpeak_nlp_cor_thr; + unsigned char hpeak_nlp_gain_pos; + unsigned char hpeak_nlp_gain_neg; + unsigned char vpeak_slope1; + unsigned char vpeak_slope2; + unsigned char vpeak_thr1; + unsigned char vpeak_thr2; + unsigned char vpeak_nlp_cor_thr; + unsigned char vpeak_nlp_gain_pos; + unsigned char vpeak_nlp_gain_neg; + unsigned char speak_slope1; + unsigned char speak_slope2; + unsigned char speak_thr1; + unsigned char speak_thr2; + unsigned char speak_nlp_cor_thr; + unsigned char speak_nlp_gain_pos; + unsigned char speak_nlp_gain_neg; + unsigned char peak_cor_gain; + unsigned char peak_cor_thr_l; + unsigned char peak_cor_thr_h; + unsigned char vlti_step; + unsigned char vlti_step2; + unsigned char vlti_thr; + unsigned char vlti_gain_pos; + unsigned char vlti_gain_neg; + unsigned char vlti_blend_factor; + unsigned char hlti_step; + unsigned char hlti_thr; + unsigned char hlti_gain_pos; + unsigned char hlti_gain_neg; + unsigned char hlti_blend_factor; + unsigned char vlimit_coef_h; + unsigned char vlimit_coef_l; + unsigned char hlimit_coef_h; + unsigned char hlimit_coef_l; + unsigned char cti_444_422_en; + unsigned char cti_422_444_en; + unsigned char cti_blend_factor; + unsigned char vcti_buf_en; + unsigned char vcti_buf_mode_c5l; + unsigned char vcti_filter; + unsigned char hcti_step; + unsigned char hcti_step2; + unsigned char hcti_thr; + unsigned char hcti_gain; + unsigned char hcti_mode_median; +} ve_hsvs_t; + +typedef struct ve_ccor_s { + unsigned char en; + unsigned char slope; + unsigned char thr; +} ve_ccor_t; + +typedef struct ve_benh_s { + unsigned char en; + unsigned char cb_inc; + unsigned char cr_inc; + unsigned char gain_cr; + unsigned char gain_cb4cr; + unsigned char luma_h; + unsigned char err_crp; + unsigned char err_crn; + unsigned char err_cbp; + unsigned char err_cbn; +} ve_benh_t; + +typedef struct ve_cbar_s { + unsigned char en; + unsigned char wid; + unsigned char cr; + unsigned char cb; + unsigned char y; +} ve_cbar_t; +typedef struct ve_demo_s { + unsigned char bext; + unsigned char dnlp; + unsigned char hsvs; + unsigned char ccor; + unsigned char benh; + enum ve_demo_pos_e pos; + unsigned long wid; + struct ve_cbar_s cbar; +} ve_demo_t; + +typedef struct vdo_meas_s { + //... +} vdo_meas_t; + +typedef struct ve_regmap_s { + unsigned long reg[43]; +} ve_regmap_t; + +// *************************************************************************** +// *** MACRO definitions ********** +// *************************************************************************** + +// *************************************************************************** +// *** FUNCTION definitions ********** +// *************************************************************************** + +#endif // _VE_H diff --git a/tvapi/libtv/projects/Android.mk b/tvapi/libtv/projects/Android.mk new file mode 100644 index 0000000..5053e7d --- a/dev/null +++ b/tvapi/libtv/projects/Android.mk @@ -0,0 +1 @@ +include $(call all-subdir-makefiles) diff --git a/tvapi/libtv/projects/haier_360_v1/CTvHaierDtmb360.cpp b/tvapi/libtv/projects/haier_360_v1/CTvHaierDtmb360.cpp new file mode 100644 index 0000000..dc51590 --- a/dev/null +++ b/tvapi/libtv/projects/haier_360_v1/CTvHaierDtmb360.cpp @@ -0,0 +1,83 @@ +#include "CTvHaierDtmb360.h" +#include <cutils/properties.h> +int audio_device_switch = 1; +CTvHaierDtmb360::CTvHaierDtmb360() +{ + mHeadSet.setObserver(this); +} + +CTvHaierDtmb360::~CTvHaierDtmb360() +{ + +} + +int CTvHaierDtmb360::OpenTv ( void ) +{ + CTv::OpenTv(); + const char *value = config_get_str ( "TV", "tvin.set.N360backlight.en", "null" ); + //add only for haier + if ( strcmp ( value, "enable" ) == 0 ) { + Tv_FactorySet_FBC_Backlight_N360(Tv_FactoryGet_FBC_Backlight_N360()); + Tv_FactorySet_FBC_ELEC_MODE(Tv_FactoryGet_FBC_ELEC_MODE()); + Tv_FactorySet_FBC_ColorTemp_Mode_N360(Tv_FactoryGet_FBC_ColorTemp_Mode_N360()); + } + return 0; +} + +int CTvHaierDtmb360::StartTvLock () +{ + CTv::StartTvLock(); + const char *value; + value = config_get_str ( "TV", "tvin.2d4G.headset.en", "null" ); + if ( strcmp ( value, "enable" ) == 0 ) { + StartHeadSetDetect(); + property_set("audio.tv_open.flg", "1"); + } + return 0; +} + +int CTvHaierDtmb360::SetSourceSwitchInput (tv_source_input_t source_input ) +{ + CTv::SetSourceSwitchInput(source_input); + + const char *config_value; + config_value = config_get_str("TV", "audio.switch.karaok.av.enable", "null"); + if (strtoul(config_value, NULL, 10) == 1) { + if ( source_input == SOURCE_AV1 || source_input == SOURCE_AV2 ) { + mTvAudio.SetAudioSwitchIO(0); + } else { + mTvAudio.SetAudioSwitchIO(1); + } + } + return 0; +} + +void CTvHaierDtmb360::onHeadSetDetect(int state, int para) +{ + TvEvent::HeadSetOf2d4GEvent ev; + char prop[256]; + char prop1[256]; + ev.state = state; + ev.para = para; + if (state == 1) + property_set("audio.headset_plug.enable", "1"); + else + property_set("audio.headset_plug.enable", "0"); + LOGD ( "%s, %d", __FUNCTION__, __LINE__); + sendTvEvent(ev); + property_get("audio.tv_open.flg", prop, "null"); + property_get("audio.output.double_output", prop1, "null"); + if (audio_device_switch == state && (strcmp(prop, "1") == 0) + && (strcmp(prop1, "0") == 0 || strcmp(prop1, "null") == 0) + && (SOURCE_DTV != m_source_input)) { + mTvAudio.openTvAudio(audio_sr); + } +} + + +int CTvHaierDtmb360::StartHeadSetDetect() +{ + mHeadSet.startDetect(); + + return 0; +} diff --git a/tvapi/libtv/projects/haier_360_v1/CTvHaierDtmb360.h b/tvapi/libtv/projects/haier_360_v1/CTvHaierDtmb360.h new file mode 100644 index 0000000..9ba7e50 --- a/dev/null +++ b/tvapi/libtv/projects/haier_360_v1/CTvHaierDtmb360.h @@ -0,0 +1,18 @@ +/*** + * haier 360 project + * ***/ +#include "CTv.h" +class CTvHaierDtmb360: public CTv, public CTv2d4GHeadSetDetect::IHeadSetObserver +{ +public: + CTvHaierDtmb360(); + ~CTvHaierDtmb360(); + virtual int OpenTv ( void ); + virtual int StartTvLock (); + virtual int SetSourceSwitchInput (tv_source_input_t source_input ); + int StartHeadSetDetect(); + virtual void onHeadSetDetect(int state, int para); + +private: + CTv2d4GHeadSetDetect mHeadSet; +}; diff --git a/tvapi/libtv/projects/haier_360_v1/haier_360_v1.h b/tvapi/libtv/projects/haier_360_v1/haier_360_v1.h new file mode 100644 index 0000000..e69de29 --- a/dev/null +++ b/tvapi/libtv/projects/haier_360_v1/haier_360_v1.h diff --git a/tvapi/libtv/projects/ref_n300_v1/Android.mk b/tvapi/libtv/projects/ref_n300_v1/Android.mk new file mode 100644 index 0000000..4ed1ffe --- a/dev/null +++ b/tvapi/libtv/projects/ref_n300_v1/Android.mk @@ -0,0 +1,48 @@ +LOCAL_PATH:= $(call my-dir) + +LIB_TV_PATH:=$(LOCAL_PATH)/../../ +DVB_PATH := $(wildcard external/dvb) +ifeq ($(DVB_PATH), ) + DVB_PATH := $(wildcard vendor/amlogic/dvb) +endif + +AM_LIBPLAYER_PATH := $(wildcard vendor/amlogic/frameworks/av/LibPlayer) +LIB_SQLITE_PATH := $(wildcard external/sqlite) + +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := optional + +LOCAL_SRC_FILES := \ + CTvRefN300.cpp + +LOCAL_SHARED_LIBRARIES := \ + libtv + +LOCAL_C_INCLUDES += \ + bionic/libc/include \ + bionic/libc/private \ + system/extras/ext4_utils \ + $(LIB_TV_PATH) \ + $(LIB_TV_PATH)/tv \ + $(LIB_TV_PATH)/tvdb \ + $(LIB_TV_PATH)/tvutils \ + $(LIB_TV_PATH)/include \ + $(DVB_PATH)/include/am_adp \ + $(DVB_PATH)/include/am_mw \ + $(DVB_PATH)/include/am_ver \ + $(DVB_PATH)/android/ndk/include \ + $(AM_LIBPLAYER_PATH)/amadec/include \ + $(AM_LIBPLAYER_PATH)/amcodec/include \ + $(AM_LIBPLAYER_PATH)/amffmpeg \ + $(AM_LIBPLAYER_PATH)/amplayer \ + $(LIB_SQLITE_PATH)/dist \ + system/media/audio_effects/include + +LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog + +LOCAL_PRELINK_MODULE := false + +LOCAL_MODULE:= libREF_N300 + +include $(BUILD_STATIC_LIBRARY) diff --git a/tvapi/libtv/projects/ref_n300_v1/CTvRefN300.cpp b/tvapi/libtv/projects/ref_n300_v1/CTvRefN300.cpp new file mode 100644 index 0000000..53437e6 --- a/dev/null +++ b/tvapi/libtv/projects/ref_n300_v1/CTvRefN300.cpp @@ -0,0 +1,12 @@ +#include "CTvRefN300.h" +#include <cutils/properties.h> +CTvRefN300::CTvRefN300() +{ + LOGD("CTvRefN300"); +} + +CTvRefN300::~CTvRefN300() +{ + +} + diff --git a/tvapi/libtv/projects/ref_n300_v1/CTvRefN300.h b/tvapi/libtv/projects/ref_n300_v1/CTvRefN300.h new file mode 100644 index 0000000..6201589 --- a/dev/null +++ b/tvapi/libtv/projects/ref_n300_v1/CTvRefN300.h @@ -0,0 +1,8 @@ +#include "tv/CTv.h" +class CTvRefN300: public CTv +{ +public: + CTvRefN300(); + ~CTvRefN300(); +private: +}; diff --git a/tvapi/libtv/projects/ref_n300_v1/ref_n300_v1.h b/tvapi/libtv/projects/ref_n300_v1/ref_n300_v1.h new file mode 100644 index 0000000..8b13789 --- a/dev/null +++ b/tvapi/libtv/projects/ref_n300_v1/ref_n300_v1.h @@ -0,0 +1 @@ + diff --git a/tvapi/libtv/projects/skyworth_n310_v1/Android.mk b/tvapi/libtv/projects/skyworth_n310_v1/Android.mk new file mode 100644 index 0000000..9b69c2e --- a/dev/null +++ b/tvapi/libtv/projects/skyworth_n310_v1/Android.mk @@ -0,0 +1,48 @@ +LOCAL_PATH:= $(call my-dir) + +LIB_TV_PATH:=$(LOCAL_PATH)/../../ +DVB_PATH := $(wildcard external/dvb) +ifeq ($(DVB_PATH), ) + DVB_PATH := $(wildcard vendor/amlogic/dvb) +endif + +AM_LIBPLAYER_PATH := $(wildcard vendor/amlogic/frameworks/av/LibPlayer) +LIB_SQLITE_PATH := $(wildcard external/sqlite) + +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := optional + +LOCAL_SRC_FILES := \ + CTvSkyworthDtmbN310.cpp + +LOCAL_SHARED_LIBRARIES := \ + libtv + +LOCAL_C_INCLUDES += \ + bionic/libc/include \ + bionic/libc/private \ + system/extras/ext4_utils \ + $(LIB_TV_PATH) \ + $(LIB_TV_PATH)/tv \ + $(LIB_TV_PATH)/tvdb \ + $(LIB_TV_PATH)/tvutils \ + $(LIB_TV_PATH)/include \ + $(DVB_PATH)/include/am_adp \ + $(DVB_PATH)/include/am_mw \ + $(DVB_PATH)/include/am_ver \ + $(DVB_PATH)/android/ndk/include \ + $(AM_LIBPLAYER_PATH)/amadec/include \ + $(AM_LIBPLAYER_PATH)/amcodec/include \ + $(AM_LIBPLAYER_PATH)/amffmpeg \ + $(AM_LIBPLAYER_PATH)/amplayer \ + $(LIB_SQLITE_PATH)/dist \ + system/media/audio_effects/include + +LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog + +LOCAL_PRELINK_MODULE := false + +LOCAL_MODULE:= libSKYWORTH_N310 + +include $(BUILD_STATIC_LIBRARY) diff --git a/tvapi/libtv/projects/skyworth_n310_v1/CTvSkyworthDtmbN310.cpp b/tvapi/libtv/projects/skyworth_n310_v1/CTvSkyworthDtmbN310.cpp new file mode 100644 index 0000000..c89d169 --- a/dev/null +++ b/tvapi/libtv/projects/skyworth_n310_v1/CTvSkyworthDtmbN310.cpp @@ -0,0 +1,88 @@ +#include "CTvSkyworthDtmbN310.h" +#include <cutils/properties.h> + +CTvSkyworthDtmbN310::CTvSkyworthDtmbN310() +{ + LOGD("CTvSkyworthDtmbN310"); + if (CTvDatabase::GetTvDb()->isAtv256ProgInsertForSkyworth() == false) { + CTvDatabase::GetTvDb()->insert256AtvProgForSkyworth(); + LOGD("Atv has not 256 program,insert 256 blank program to db\n"); + } +} + +CTvSkyworthDtmbN310::~CTvSkyworthDtmbN310() +{ +} + +//searchType 0:not 256 1:is 256 Program +int CTvSkyworthDtmbN310::atvAutoScan(int videoStd, int audioStd, int searchType) +{ + int minScanFreq, maxScanFreq, vStd, aStd; + AutoMutex lock ( mLock ); + mAv.DisableVideoWithBlueColor(); + mTvAction = mTvAction | TV_ACTION_SCANNING; + mTvScanner.setObserver ( &mTvMsgQueue ); + mTvAudio.SetAudioMuteForTv ( CC_AUDIO_MUTE ); + getATVMinMaxFreq (&minScanFreq, &maxScanFreq ); + if ( minScanFreq == 0 || maxScanFreq == 0 || minScanFreq > maxScanFreq ) { + LOGE ( "%s, auto scan freq set is error min=%d, max=%d", __FUNCTION__, minScanFreq, maxScanFreq ); + return -1; + } + //if set std null AUTO, use default PAL/DK + //if(videoStd == CC_ATV_VIDEO_STD_AUTO) { + // vStd = CC_ATV_VIDEO_STD_PAL; + // aStd = CC_ATV_AUDIO_STD_DK; + //} else { + vStd = videoStd; + aStd = audioStd; + //} + tvin_port_t source_port = mTvin.Tvin_GetSourcePortBySourceInput(SOURCE_TV); + mTvin.VDIN_OpenPort ( source_port ); + LOGD("%s, atv auto scan vstd=%d, astd=%d ", __FUNCTION__, vStd, aStd); + v4l2_std_id stdAndColor = mFrontDev.enumToStdAndColor(vStd, aStd); + + int fmt = CFrontEnd::stdEnumToCvbsFmt (vStd, aStd); + mTvin.AFE_SetCVBSStd ( ( tvin_sig_fmt_t ) fmt ); + m_cur_set_info_fmt = ( tvin_sig_fmt_t )fmt; + + if (searchType == 0) { + CTvProgram::CleanAllProgramBySrvType ( CTvProgram::TYPE_ATV ); + } else if (searchType == 1) { //type for skyworth, and insert 256 prog, and just update ts table + Vector<sp <CTvChannel> > v_channel; + CTvChannel::getChannelListBySrc(CTvChannel::MODE_ANALOG, v_channel); + int size = v_channel.size(); + LOGD("showbo --size = %d", size); + CTvChannel::CleanAllChannelBySrc (CTvChannel::MODE_ANALOG); + CTvDatabase::GetTvDb()->beginTransaction(); + for (int i = 0; i < size; i++) { + CTvProgram::deleteChannelsProgram(*v_channel[i]); + } + CTvDatabase::GetTvDb()->commitTransaction(); + if (CTvDatabase::GetTvDb()->isAtv256ProgInsertForSkyworth() == false) { + CTvDatabase::GetTvDb()->insert256AtvProgForSkyworth(); + } + } + minScanFreq = mFrontDev.formatATVFreq ( minScanFreq ); + maxScanFreq = mFrontDev.formatATVFreq ( maxScanFreq ); + LOGD("%s, atv auto scan vstd=%d, astd=%d stdandcolor=%lld", __FUNCTION__, vStd, aStd, stdAndColor); + mSigDetectThread.setVdinNoSigCheckKeepTimes(1000, false); + mFrontDev.Open(FE_ANALOG); + mTvScanner.autoAtvScan ( minScanFreq, maxScanFreq, stdAndColor, searchType ); + return 0; +} + +int CTvSkyworthDtmbN310::OpenTv ( void ) +{ + CTv::OpenTv(); + StartTvLock(); + //fast start + setSourceSwitchAndPlay(); + return 0; +} + +int CTvSkyworthDtmbN310::StartTvLock () +{ + CTv::StartTvLock(); + return 0; +} + diff --git a/tvapi/libtv/projects/skyworth_n310_v1/CTvSkyworthDtmbN310.h b/tvapi/libtv/projects/skyworth_n310_v1/CTvSkyworthDtmbN310.h new file mode 100644 index 0000000..cf96ed2 --- a/dev/null +++ b/tvapi/libtv/projects/skyworth_n310_v1/CTvSkyworthDtmbN310.h @@ -0,0 +1,18 @@ +/*** + * for skyworth project n310 + * 1.atv is 256 programs ,default. + * 2.dtv can scan between start/end freq + * 3.more program info,example pid/vid + * 4. + * ***/ +#include "tv/CTv.h" +class CTvSkyworthDtmbN310: public CTv +{ +public: + CTvSkyworthDtmbN310(); + ~CTvSkyworthDtmbN310(); + virtual int OpenTv ( void ); + virtual int StartTvLock (); + virtual int atvAutoScan(int videoStd, int audioStd, int searchType); +private: +}; diff --git a/tvapi/libtv/projects/skyworth_n310_v1/skyworth_n310_v1.h b/tvapi/libtv/projects/skyworth_n310_v1/skyworth_n310_v1.h new file mode 100644 index 0000000..e029998 --- a/dev/null +++ b/tvapi/libtv/projects/skyworth_n310_v1/skyworth_n310_v1.h @@ -0,0 +1 @@ +#include "CTvSkyworthDtmbN310.h" diff --git a/tvapi/libtv/tv/AutoBackLight.cpp b/tvapi/libtv/tv/AutoBackLight.cpp new file mode 100644 index 0000000..8c659c6 --- a/dev/null +++ b/tvapi/libtv/tv/AutoBackLight.cpp @@ -0,0 +1,213 @@ +#include "AutoBackLight.h" +#include "../tvsetting/CTvSetting.h" +#include "../tvconfig/tvconfig.h" +#include "../tvutils/tvutils.h" +#include <stdio.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/ioctl.h> +#include <fcntl.h> +#include <string.h> +#include <errno.h> +#include <dlfcn.h> +#include <linux/fb.h> +#include <stdlib.h> +#include <cutils/properties.h> + +#ifdef LOG_TAG +#undef LOG_TAG +#define LOG_TAG "AutoBackLight" +#endif + +AutoBackLight::AutoBackLight( CVpp *mVpp, CTvin *pTvin ) +{ + mAutoBacklightSource = SOURCE_TYPE_TV; + myVpp = mVpp; + myTvin = pTvin; + mCur_source_default_backlight = 100; + mCur_sig_state == SIG_STATE_NOSIG; + mAutoBacklight_OnOff_Flag = false; + mCurrent_backlight = 100; + mCur_dest_backlight = 100; +} + +AutoBackLight::~AutoBackLight() +{ + mAutoBacklight_OnOff_Flag = false; +} + +bool AutoBackLight::isAutoBacklightOn() +{ + return mAutoBacklight_OnOff_Flag; +} + +void AutoBackLight::updateSigState(int state) +{ + mCur_sig_state = state; + LOGD("updateSigState = %d", mCur_sig_state); +} + +void AutoBackLight::startAutoBacklight( tv_source_input_type_t source_type ) +{ + mAutoBacklightSource = source_type; + mCur_source_default_backlight = myVpp->Tv_GetBacklight(source_type); + mCurrent_backlight = mCur_source_default_backlight; + myVpp->Tv_SetBacklight(mCur_source_default_backlight, source_type, 1); + + /* + mDefault_auto_bl_value = def_source_bl_value; + dynamicGamma = mDefault_auto_bl_value * mCur_source_default_backlight / 100; + // this if should not happen + if (dynamicGamma > mCur_source_default_backlight) { + dynamicGamma = mCur_source_default_backlight; + } + */ + + if (!mAutoBacklight_OnOff_Flag) { + mAutoBacklight_OnOff_Flag = true; + this->run(); + } +} + +void AutoBackLight::stopAutoBacklight() +{ + if (mAutoBacklight_OnOff_Flag) { + mAutoBacklight_OnOff_Flag = false; + myVpp->Tv_SetBacklight(mCur_source_default_backlight, mAutoBacklightSource, 1); + } +} + +/** + * @ description: tpv project + * @ return:value + * value <= 20: mCur_dest_backlight is 14 + * 20 < value <= 160: mCur_dest_backlight is 57 + *160 < value: mCur_dest_backlight is 100 + */ +void AutoBackLight::adjustDstBacklight() +{ + if (mCur_sig_state == SIG_STATE_STABLE) { + //the node is used to adjust current ts is static or dynamtic frame + char temp_str = 0; + int fd = open("/sys/module/di/parameters/frame_dynamic", O_RDWR); + if (fd <= 0) { + LOGE("open /sys/module/di/parameters/frame_dynamic ERROR!!\n"); + return; + } + + if (read(fd, &temp_str, 1) > 0) { + + if (temp_str == 'N') { + mCurrent_backlight = mCur_dest_backlight = mCur_source_default_backlight; + myVpp->Tv_SetBacklight(mCurrent_backlight, mAutoBacklightSource, 0); + } else if (temp_str == 'Y') { + int pwm = HistogramGet_AVE(); + if (pwm <= 20) { + mCur_dest_backlight = 14; + } else if (pwm > 20 && pwm <= 160) { + mCur_dest_backlight = 57; + } else { + mCur_dest_backlight = 100; + } + //LOGD("pwm = %d, mCur_dest_backlight = %d", pwm, mCur_dest_backlight); + } + } + close(fd); + } else { + mCurrent_backlight = mCur_dest_backlight = mCur_source_default_backlight; + myVpp->Tv_SetBacklight(mCurrent_backlight, mAutoBacklightSource, 0); + } + + /* + if (pwm > 0) + pwm_max = pwm; + else + pwm_min = pwm; + pwm = 255 - pwm; + int average = (pwm_min + pwm_max) / 2; + dynamicGammaOffset = (pwm - average) / 10; + dynamicGammaOffset = dynamicGammaOffset * mDefault_auto_bl_value / 100; + + //the node is used to adjust current ts is static or dynamtic frame + char temp_str = 0; + int fd = open("/sys/module/di/parameters/frame_dynamic", O_RDWR); + if (fd <= 0) { + LOGE("open /sys/module/di/parameters/frame_dynamic ERROR!!\n"); + return; + } + + if (read(fd, &temp_str, 1) > 0) { + if (temp_str== 'N') { + mCur_dest_backlight = mCur_source_default_backlight; + } + else if (temp_str == 'Y') { + mCur_dest_backlight = dynamicGamma + dynamicGammaOffset; + + if (mCur_dest_backlight > mCur_source_default_backlight) { + mCur_dest_backlight = mCur_source_default_backlight; + } + else if (mCur_dest_backlight < 0) { + mCur_dest_backlight = 0; + } + } + } + close(fd); + */ +} + +void AutoBackLight::adjustBacklight() +{ + if (mCurrent_backlight == mCur_dest_backlight) { + return; + } else if ((mCurrent_backlight - mCur_dest_backlight) > -2 && (mCurrent_backlight - mCur_dest_backlight) < 2) { + mCurrent_backlight = mCur_dest_backlight; + myVpp->Tv_SetBacklight(mCurrent_backlight, mAutoBacklightSource, 0); + } else if (mCurrent_backlight < mCur_dest_backlight) { + mCurrent_backlight = mCurrent_backlight + 2; + myVpp->Tv_SetBacklight(mCurrent_backlight, mAutoBacklightSource, 0); + } else if (mCurrent_backlight > mCur_dest_backlight) { + mCurrent_backlight = mCurrent_backlight - 2; + myVpp->Tv_SetBacklight(mCurrent_backlight, mAutoBacklightSource, 0); + } + + //LOGD("mCurrent_backlight = %d", mCurrent_backlight); +} + +/** + * @ description: get current picture's average brightness + * @ return: 0~255,0 is darkest,255 is brightest + */ +int AutoBackLight::HistogramGet_AVE() +{ + int hist_ave = 0; + tvin_parm_t vdinParam; + if (0 == myTvin->VDIN_GetVdinParam(&vdinParam)) { + if (vdinParam.pixel_sum != 0) { + hist_ave = vdinParam.luma_sum / vdinParam.pixel_sum; + LOGD("[hist_ave][%d].", hist_ave); + return hist_ave; + } + LOGE("vdinParam.pixel_sum is zero, so the value is infinity\n"); + return -1; + } + LOGE("VDIN_GetVdinParam get data error!!!\n"); + return -1; +} + +bool AutoBackLight::threadLoop() +{ + int sleeptime = 50;//ms + int adjustBacklightCount = 0; + while ( mAutoBacklight_OnOff_Flag ) { + usleep ( sleeptime * 1000 ); + adjustBacklightCount++; + if (adjustBacklightCount == 24) { + adjustBacklightCount = 0; + adjustDstBacklight(); + } + adjustBacklight(); + } + + return false;//return true, run again, return false,not run. +} diff --git a/tvapi/libtv/tv/AutoBackLight.h b/tvapi/libtv/tv/AutoBackLight.h new file mode 100644 index 0000000..0c860d9 --- a/dev/null +++ b/tvapi/libtv/tv/AutoBackLight.h @@ -0,0 +1,49 @@ +// +// +// amlogic 2015 +// +// @ Project : tv +// @ File Name : +// @ Date : 2015 -7 +// @ Author : hao.fu +// +// + + +#if !defined(_AUTOBACKLIGHT_H) +#define _AUTOBACKLIGHT_H +#include "../tvin/CTvin.h" +#include "../tvutils/CThread.h" +#include "../vpp/CVpp.h" + +class AutoBackLight: public CThread +{ +private: + tv_source_input_type_t mAutoBacklightSource; + int mCur_source_default_backlight; + int mCur_sig_state; + bool mAutoBacklight_OnOff_Flag; + int mCurrent_backlight; + int mCur_dest_backlight; + + void adjustDstBacklight(); + void adjustBacklight(); + int HistogramGet_AVE(); + bool threadLoop(); + +public: + enum SIG_STATE { + SIG_STATE_STABLE = 1, + SIG_STATE_NOSIG = 2, + }; + CVpp *myVpp; + CTvin *myTvin; + + AutoBackLight( CVpp *mVpp, CTvin *pTvin ); + ~AutoBackLight(); + void updateSigState(int state); + void startAutoBacklight( tv_source_input_type_t source_type ); + void stopAutoBacklight(); + bool isAutoBacklightOn(); +}; +#endif diff --git a/tvapi/libtv/tv/CAv.cpp b/tvapi/libtv/tv/CAv.cpp new file mode 100644 index 0000000..7f757ca --- a/dev/null +++ b/tvapi/libtv/tv/CAv.cpp @@ -0,0 +1,381 @@ +#include "CAv.h" +#define LOG_TAG "CAv" +#include "../tvutils/tvutils.h" +#include <stdio.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/ioctl.h> +#include <fcntl.h> +#include <amstream.h> +CAv::CAv() +{ + mpObserver = NULL; + mTvPlayDevId = 0; + mCurVideoLayerMuteState = -1; + mCurDisableVideoColor = -1; + mFdAmVideo = -1; +} +CAv::~CAv() +{ + +} +int CAv::SetVideoWindow(int x, int y, int w, int h) +{ + return AM_AV_SetVideoWindow (mTvPlayDevId, x, y, w, h ); +} + +int CAv::Open() +{ + AM_AV_OpenPara_t para_av; + memset ( ¶_av, 0, sizeof ( AM_AV_OpenPara_t ) ); + int rt = AM_AV_Open ( mTvPlayDevId, ¶_av ); + if ( rt != AM_SUCCESS ) { + LOGD ( "%s, dvbplayer_open fail %d %d\n!" , __FUNCTION__, mTvPlayDevId, rt ); + return -1; + } + + //open audio channle output + AM_AOUT_OpenPara_t aout_para; + memset ( &aout_para, 0, sizeof ( AM_AOUT_OpenPara_t ) ); + rt = AM_AOUT_Open ( 0, &aout_para ); + + if ( AM_SUCCESS != rt ) { + LOGD ( "%s, BUG: CANN'T OPEN AOUT\n", __FUNCTION__); + } + // + mFdAmVideo = open ( PATH_VIDEO_AMVIDEO, O_RDWR ); + if ( mFdAmVideo < 0 ) { + LOGE ( "mFdAmVideo < 0, error(%s)!\n", strerror ( errno ) ); + return -1; + } + /*Register events*/ + AM_EVT_Subscribe ( mTvPlayDevId, AM_AV_EVT_AV_NO_DATA, av_evt_callback, this ); + AM_EVT_Subscribe ( mTvPlayDevId, AM_AV_EVT_AV_DATA_RESUME, av_evt_callback, this ); + AM_EVT_Subscribe ( mTvPlayDevId, AM_AV_EVT_VIDEO_SCAMBLED, av_evt_callback, this ); + AM_EVT_Subscribe ( mTvPlayDevId, AM_AV_EVT_AUDIO_SCAMBLED, av_evt_callback, this ); + AM_EVT_Subscribe ( mTvPlayDevId, AM_AV_EVT_VIDEO_NOT_SUPPORT, av_evt_callback, this ); + + return rt; +} + +int CAv::Close() +{ + int iRet; + iRet = AM_AV_Close ( mTvPlayDevId ); + iRet = AM_AOUT_Close ( mTvPlayDevId ); + if (mFdAmVideo > 0) { + close(mFdAmVideo); + mFdAmVideo = -1; + } + return iRet; +} + + +int CAv::GetVideoStatus(AM_AV_VideoStatus_t *status) +{ + return AM_AV_GetVideoStatus(mTvPlayDevId, status); +} + +int CAv::SwitchTSAudio(int apid, AM_AV_AFormat_t afmt) +{ + return AM_AV_SwitchTSAudio (mTvPlayDevId, ( uint16_t ) apid, ( AM_AV_AFormat_t ) afmt ); +} + +int CAv::ResetAudioDecoder() +{ + return AM_AV_ResetAudioDecoder ( mTvPlayDevId ); +} + +int CAv::SetTSSource(AM_AV_TSSource_t ts_source) +{ + return AM_AV_SetTSSource ( mTvPlayDevId, ts_source ); +} + +int CAv::StartTS(uint16_t vpid, uint16_t apid, AM_AV_VFormat_t vfmt, AM_AV_AFormat_t afmt) +{ + return AM_AV_StartTS ( mTvPlayDevId, vpid, apid, ( AM_AV_VFormat_t ) vfmt, ( AM_AV_AFormat_t ) afmt ); +} + +int CAv::StopTS() +{ + return AM_AV_StopTS (mTvPlayDevId); +} + +int CAv::AudioGetOutputMode(AM_AOUT_OutputMode_t *mode) +{ + return AM_AOUT_GetOutputMode ( 0, mode ); +} + +int CAv::AudioSetOutputMode(AM_AOUT_OutputMode_t mode) +{ + return AM_AOUT_SetOutputMode ( 0, mode ); +} + +int CAv::EnableVideoBlackout() +{ + return AM_AV_EnableVideoBlackout(mTvPlayDevId); +} + +int CAv::DisableVideoBlackout() +{ + return AM_AV_DisableVideoBlackout(mTvPlayDevId); +} + +int CAv::DisableVideoWithBlueColor() +{ + LOGD("DisableVideoWithBlueColor"); + if (mCurVideoLayerMuteState == 1 && mCurDisableVideoColor == DISABLE_VIDEO_COLOR_BLUE) { + LOGD("video is disable with blue, return"); + return 0; + } + mCurVideoLayerMuteState = 1; + mCurDisableVideoColor = DISABLE_VIDEO_COLOR_BLUE; + SetVideoScreenColor ( 0, 41, 240, 110 ); // Show blue with vdin0, postblending disabled + return AM_AV_DisableVideo(mTvPlayDevId); +} + +int CAv::DisableVideoWithBlackColor() +{ + LOGD("DisableVideoWithBlackColor"); + if (mCurVideoLayerMuteState == 1 && mCurDisableVideoColor == DISABLE_VIDEO_COLOR_BLACK) { + LOGD("video is disable with black, return"); + return 0; + } + mCurDisableVideoColor = DISABLE_VIDEO_COLOR_BLACK; + mCurVideoLayerMuteState = 1; + SetVideoScreenColor ( 0, 16, 128, 128 ); // Show blue with vdin0, postblending disabled + return AM_AV_DisableVideo(mTvPlayDevId); +} +//auto enable, +int CAv::EnableVideoAuto() +{ + LOGD("EnableVideo"); + if (mCurVideoLayerMuteState == 0) { + LOGD("video is enable, return"); + return 0; + } + mCurVideoLayerMuteState = 0; + SetVideoScreenColor ( 0, 16, 128, 128 ); // Show black with vdin0, postblending disabled + return ClearVideoBuffer();//disable video 2 +} + +//just enable video +int CAv::EnableVideoNow() +{ + LOGD("EnableVideoNow"); + if (mCurVideoLayerMuteState == 0) { + LOGD("video is enable, return"); + return 0; + } + mCurVideoLayerMuteState = 0; + SetVideoScreenColor ( 3, 16, 128, 128 ); // Show blue with vdin0, postblending disabled + return AM_AV_EnableVideo(mTvPlayDevId); +} + +//call disable video 2 +int CAv::ClearVideoBuffer() +{ + LOGD("ClearVideoBuffer"); + return AM_AV_ClearVideoBuffer(mTvPlayDevId); +} +int CAv::SetVideoScreenColor ( int vdin_blending_mask, int y, int u, int v ) +{ + FILE *fp = NULL; + unsigned long value = 0; + + value = vdin_blending_mask << 24; + + value |= ( unsigned int ) ( y << 16 ) | ( unsigned int ) ( u << 8 ) | ( unsigned int ) ( v ); + + fp = fopen ( "/sys/class/video/test_screen", "w" ); + LOGD ( "~~~fopen~~~##VPP_SetVideoScreenColor##%s : vdin_blending_mask:%d,y:%d,u:%d,v:%d ##" , "/sys/class/video/test_screen", vdin_blending_mask, y, u, v); + + + if ( fp == NULL ) { + LOGE ( "Open /sys/class/video/test_screen error(%s)!\n", strerror ( errno ) ); + return -1; + } + + fprintf ( fp, "0x%lx", ( unsigned long ) value ); + + fclose ( fp ); + fp = NULL; + + return 0; +} + +int CAv::getVideoDisableValue() +{ + LOGD("this fun is empty!!!!!!!!"); + return 0; +} + +int CAv::SetVideoLayerDisable ( int value ) +{ + FILE *fp = NULL; + + fp = fopen ( "/sys/class/video/disable_video", "w" ); + LOGD ( "~~~fopen~~~##VPP_SetVideoLayerDisable##%s : %d ##" , "/sys/class/video/disable_video", value); + + if ( fp == NULL ) { + LOGE ( "Open /sys/class/video/disable_video error(%s)!\n", strerror ( errno ) ); + return -1; + } + + fprintf ( fp, "%d", value ); + + fclose ( fp ); + fp = NULL; + + return 0; +} + + +int CAv::setVideoScreenMode ( int value ) +{ + FILE *fp = fopen ( "/sys/class/video/screen_mode", "w" ); + LOGD ( "setVideoScreenMode %d ##" , value); + if ( fp == NULL ) { + LOGE ( "Open /sys/class/video/screen_mode error(%s)!\n", strerror ( errno ) ); + return -1; + } + fprintf ( fp, "%d", value ); + fclose ( fp ); + return 0; +} + +int CAv::setVideoAxis ( int h, int v, int width, int height ) +{ + FILE *fp = NULL; + fp = fopen ( "/sys/class/video/axis", "w" ); + LOGD ( "setVideoAxis##%s : %d %d %d %d ##" , "/sys/class/video/axis", h, v, width, height); + + if ( fp == NULL ) { + LOGE ( "Open /sys/class/video/axis ERROR(%s)!!\n", strerror ( errno ) ); + return -1; + } + fprintf ( fp, "%d %d %d %d", h, v, width, height ); + fclose ( fp ); + return 0; +} + +int CAv::getVideoScreenMode() +{ + int value; + FILE *fp = fopen ( "/sys/class/video/screen_mode", "r+" ); + + if ( fp == NULL ) { + LOGE ( "Open /sys/class/video/screen_mode error(%s)!\n", strerror ( errno ) ); + return -1; + } + fscanf ( fp, "%d", &value ); + fclose ( fp ); + return value; +} + +video_display_resolution_t CAv::getVideoDisplayResolution() +{ + char attrV[64]; + memset (attrV, 0x0, 64); + Tv_Utils_GetFileAttrStr ( "/sys/class/video/device_resolution", 64, attrV ); + video_display_resolution_t resolution; + if (strncasecmp(attrV, "1366x768", strlen ("1366x768")) == 0) { + resolution = VPP_DISPLAY_RESOLUTION_1366X768; + } else if (strncasecmp(attrV, "3840x2160", strlen ("3840x2160")) == 0) { + resolution = VPP_DISPLAY_RESOLUTION_3840X2160; + } else if (strncasecmp(attrV, "1920x1080", strlen ("1920x1080")) == 0) { + resolution = VPP_DISPLAY_RESOLUTION_1920X1080; + } else { + LOGW("video display resolution is = (%s) not define , default it", attrV); + resolution = VPP_DISPLAY_RESOLUTION_1920X1080; + } + + return resolution; +} + +void CAv::av_evt_callback ( int dev_no, int event_type, void *param, void *user_data ) +{ + CAv *pAv = ( CAv * ) user_data; + if (NULL == pAv ) { + LOGD ( "%s, ERROR : av_evt_callback NULL == pTv\n", __FUNCTION__ ); + return ; + } + if ( pAv->mpObserver == NULL ) { + LOGD ( "%s, ERROR : mpObserver NULL == mpObserver\n", __FUNCTION__ ); + return; + } + switch ( event_type ) { + case AM_AV_EVT_AV_NO_DATA: + pAv->mCurAvEvent.type = AVEvent::EVENT_AV_STOP; + pAv->mCurAvEvent.param = ( int )param; + pAv->mpObserver->onEvent(pAv->mCurAvEvent); + break; + case AM_AV_EVT_AV_DATA_RESUME: + pAv->mCurAvEvent.type = AVEvent::EVENT_AV_RESUEM; + pAv->mCurAvEvent.param = ( int )param; + pAv->mpObserver->onEvent(pAv->mCurAvEvent); + break; + case AM_AV_EVT_VIDEO_SCAMBLED: + case AM_AV_EVT_AUDIO_SCAMBLED: + pAv->mCurAvEvent.type = AVEvent::EVENT_AV_SCAMBLED; + pAv->mCurAvEvent.param = ( int )param; + pAv->mpObserver->onEvent(pAv->mCurAvEvent); + break; + case AM_AV_EVT_VIDEO_NOT_SUPPORT: { + pAv->mCurAvEvent.type = AVEvent::EVENT_AV_UNSUPPORT; + pAv->mCurAvEvent.param = ( int )param; + pAv->mpObserver->onEvent(pAv->mCurAvEvent); + break; + } + default: + break; + } + LOGD ( "%s, av_evt_callback : dev_no %d type %d param = %d\n", __FUNCTION__, dev_no, pAv->mCurAvEvent.type , (int)param); +} + +int CAv::set3DMode(VIDEO_3D_MODE_T mode, int LR_switch, int mode_3D_TO_2D) +{ + unsigned int cmd = MODE_3D_DISABLE; + switch (mode) { + case VIDEO_3D_MODE_DISABLE: + cmd = MODE_3D_DISABLE; + break; + case VIDEO_3D_MODE_AUTO: + cmd = MODE_3D_ENABLE | MODE_3D_AUTO; + break; + case VIDEO_3D_MODE_LR: + cmd = MODE_3D_ENABLE | MODE_3D_LR; + break; + case VIDEO_3D_MODE_TB: + cmd = MODE_3D_ENABLE | MODE_3D_TB; + break; + case VIDEO_3D_MODE_LA: + cmd = MODE_3D_ENABLE | MODE_3D_LA; + break; + case VIDEO_3D_MODE_FA: + cmd = MODE_3D_ENABLE | MODE_3D_FA; + break; + default: + cmd = MODE_3D_DISABLE; + break; + } + + if (LR_switch == 1) { + cmd = cmd | MODE_3D_LR_SWITCH; + } + + if (mode_3D_TO_2D == 1) { + cmd = cmd | MODE_3D_TO_2D_L; + } + + if (mode_3D_TO_2D == 2) { + cmd = cmd | MODE_3D_TO_2D_R; + } + LOGD("set 3d mode fd = %d cmd = 0x%x", mFdAmVideo, cmd); + int ret = ioctl(mFdAmVideo, AMSTREAM_IOC_SET_3D_TYPE , cmd); + if (ret < 0) { + LOGE("set3DMode error ( %s )", strerror ( errno )); + } + return 0; +} diff --git a/tvapi/libtv/tv/CAv.h b/tvapi/libtv/tv/CAv.h new file mode 100644 index 0000000..510e64e --- a/dev/null +++ b/tvapi/libtv/tv/CAv.h @@ -0,0 +1,148 @@ +#ifndef _C_AV_H +#define _C_AV_H +#include "am_av.h" +#include "am_aout.h" +#include "CTvEv.h" +#include "CTvLog.h" +static const char *PATH_FRAME_COUNT = "/sys/module/di/parameters/frame_count"; +//3D===================================================================== +static const char *PATH_SET_3D_TYPE = "/sys/class/video/threedim_mode"; +static const char *PATH_VIDEO_AMVIDEO = "/dev/amvideo"; +//3和1是做不同的3dsclaer 0是不做任何scaler +static const char *PATH_3D_SCALER = "/sys/module/amvideo/parameters/force_3d_scaler"; +//0是不做3dscaler 1是做3dscaler +static const char *PATH_VIDEO_SCALER = "/sys/class/video/stereo_scaler"; + +/*cmd use for 3d operation*/ +#define MODE_3D_DISABLE 0x00000000 +#define MODE_3D_ENABLE 0x00000001 +#define MODE_3D_AUTO 0x00000002 +#define MODE_3D_LR 0x00000004 +#define MODE_3D_TB 0x00000008 +#define MODE_3D_LA 0x00000010 +#define MODE_3D_FA 0x00000020 +#define MODE_3D_LR_SWITCH 0x00000100 +#define MODE_3D_TO_2D_L 0x00000200 +#define MODE_3D_TO_2D_R 0x00000400 +#define MODE_3D_MVC 0x00000800 +#define MODE_3D_OUT_TB 0x00010000 +#define MODE_3D_OUT_LR 0x00020000 + +/*when the output mode is field alterlative*/ +//LRLRLRLRL mode +#define MODE_3D_OUT_FA_L_FIRST 0x00001000 +#define MODE_3D_OUT_FA_R_FIRST 0x00002000 +//LBRBLBRB +#define MODE_3D_OUT_FA_LB_FIRST 0x00004000 +#define MODE_3D_OUT_FA_RB_FIRST 0x00008000 + + +typedef enum VIDEO_3D_MODE_E { + VIDEO_3D_MODE_DISABLE, + VIDEO_3D_MODE_AUTO, + VIDEO_3D_MODE_LR, + VIDEO_3D_MODE_TB, + VIDEO_3D_MODE_LA, + VIDEO_3D_MODE_FA +} VIDEO_3D_MODE_T; + +//end 3D=================================================================== +typedef enum video_display_resolution_e { + VPP_DISPLAY_RESOLUTION_1366X768, + VPP_DISPLAY_RESOLUTION_1920X1080, + VPP_DISPLAY_RESOLUTION_3840X2160, + VPP_DISPLAY_RESOLUTION_MAX, +} video_display_resolution_t; + + +class CAv +{ +public: + CAv(); + ~CAv(); + //video screen_mode + static const int VIDEO_WIDEOPTION_NORMAL = 0; + static const int VIDEO_WIDEOPTION_FULL_STRETCH = 1; + static const int VIDEO_WIDEOPTION_4_3 = 2; + static const int VIDEO_WIDEOPTION_16_9 = 3; + static const int VIDEO_WIDEOPTION_NONLINEAR = 4; + static const int VIDEO_WIDEOPTION_NORMAL_NOSCALEUP = 5; + static const int VIDEO_WIDEOPTION_CROP_FULL = 6; + static const int VIDEO_WIDEOPTION_CROP = 7; + // + static const int DISABLE_VIDEO_COLOR_BLUE = 1; + static const int DISABLE_VIDEO_COLOR_BLACK = 2; + class AVEvent : public CTvEv + { + public: + AVEvent(): CTvEv(CTvEv::TV_EVENT_AV) + { + + }; + ~AVEvent() + {}; + static const int EVENT_AV_STOP = 1; + static const int EVENT_AV_RESUEM = 2; + static const int EVENT_AV_SCAMBLED = 3; + static const int EVENT_AV_UNSUPPORT = 4; + int type; + int param; + }; + + class IObserver + { + public: + IObserver() {}; + virtual ~IObserver() {}; + virtual void onEvent(const AVEvent &ev) = 0; + }; + //1 VS n + //int addObserver(IObserver* ob); + //int removeObserver(IObserver* ob); + + //1 VS 1 + int setObserver(IObserver *ob) + { + mpObserver = ob; + return 0; + } + + int Open(); + int Close(); + int SetVideoWindow(int x, int y, int w, int h); + int GetVideoStatus(AM_AV_VideoStatus_t *status); + int SwitchTSAudio(int apid, AM_AV_AFormat_t afmt); + int ResetAudioDecoder(); + int SetTSSource(AM_AV_TSSource_t ts_source); + int StartTS(uint16_t vpid, uint16_t apid, AM_AV_VFormat_t vfmt, AM_AV_AFormat_t afmt); + int StopTS(); + int AudioGetOutputMode(AM_AOUT_OutputMode_t *mode); + int AudioSetOutputMode(AM_AOUT_OutputMode_t mode); + int SetVideoScreenColor (int vdin_blending_mask, int y, int u, int v); + int DisableVideoWithBlueColor(); + int DisableVideoWithBlackColor(); + int EnableVideoAuto(); + int EnableVideoNow(); + int EnableVideoBlackout(); + int DisableVideoBlackout(); + int getVideoDisableValue(); + int SetVideoLayerDisable ( int value ); + int ClearVideoBuffer(); + int setVideoScreenMode ( int value ); + int getVideoScreenMode(); + int setVideoAxis ( int h, int v, int width, int height ); + video_display_resolution_t getVideoDisplayResolution(); + //LR_switch: 1 is enable, 3D_TO_2D:1 is L , 2 is R + int set3DMode(VIDEO_3D_MODE_T mode, int LR_switch, int mode_3D_TO_2D); + // +private: + static void av_evt_callback ( int dev_no, int event_type, void *param, void *user_data ); + int mTvPlayDevId; + IObserver *mpObserver; + AVEvent mCurAvEvent; + int mCurVideoLayerMuteState; + int mCurDisableVideoColor; + + int mFdAmVideo; +}; +#endif diff --git a/tvapi/libtv/tv/CFbcCommunication.cpp b/tvapi/libtv/tv/CFbcCommunication.cpp new file mode 100644 index 0000000..48193d7 --- a/dev/null +++ b/tvapi/libtv/tv/CFbcCommunication.cpp @@ -0,0 +1,1700 @@ +#include <time.h> +#include "CFbcCommunication.h" +#include "CTvLog.h" +#include "../tvconfig/tvconfig.h" +#include "../tvutils/tvutils.h" +#define LOG_TAG "FBC" + +static CFbcCommunication *gSingletonFBC = NULL; +CFbcCommunication *GetSingletonFBC() +{ + if (GetPlatformHaveFBCFlag() == 1) { + if (gSingletonFBC == NULL) { + gSingletonFBC = new CFbcCommunication(); + gSingletonFBC->start(); + } + + return gSingletonFBC; + } + + LOGE("%s, the platform has no fbc!!!\n", __FUNCTION__); + return NULL; +} + +CFbcCommunication::CFbcCommunication() +{ + initCrc32Table(); + + m_event.data.fd = -1; + m_event.events = EPOLLIN | EPOLLET; + + mpRevDataBuf = new unsigned char[512]; + + mUpgradeFlag = 0; + mbDownHaveSend = 0;//false + //mFbcMsgQueue.startMsgQueue(); + mbFbcKeyEnterDown = 0;//false + mFbcEnterKeyDownTime = -1; +} + +CFbcCommunication::~CFbcCommunication() +{ + m_event.data.fd = mSerialPort.getFd(); + m_event.events = EPOLLIN | EPOLLET; + mEpoll.del(mSerialPort.getFd(), &m_event); + closeAll(); + delete[] mpRevDataBuf; +} + +int CFbcCommunication::start() +{ +#if 1 + //int serial_port = config_get_int("TV", "fbc.communication.serial", SERIAL_C); + if (mSerialPort.OpenDevice(SERIAL_C) < 0) { + } else { +#if 0 + LOGD("%s %d be called......\n", __FUNCTION__, __LINE__); + mSerialPort.set_opt(115200, 8, 1, 'N', 5000, 1); +#else + LOGD("%s %d be called......\n", __FUNCTION__, __LINE__); + mSerialPort.setup_serial(); +#endif + } + + if (mEpoll.create() < 0) { + return -1; + } + + m_event.data.fd = mSerialPort.getFd(); + m_event.events = EPOLLIN | EPOLLET; + mEpoll.add(mSerialPort.getFd(), &m_event); +#endif + +#if 0 + mHdmiCec.openFile(CEC_PATH); + m_event.data.fd = mHdmiCec.getFd(); + m_event.events = EPOLLIN | EPOLLET; + mEpoll.add(mHdmiCec.getFd(), &m_event); +#endif + + //timeout for long + mEpoll.setTimeout(3000); + + this->run(); + mTvInput.run(); + return 0; +} + +void CFbcCommunication::testUart() +{ + unsigned char write_buf[64], read_buf[64]; + int idx = 0; + memset(write_buf, 0, sizeof(write_buf)); + memset(read_buf, 0, sizeof(read_buf)); + + write_buf[0] = 0x5a; + write_buf[1] = 0x5a; + write_buf[2] = 0xb; + write_buf[3] = 0x0; + write_buf[4] = 0x0; + write_buf[5] = 0x40; + write_buf[6] = 0x0; + + write_buf[7] = 0x2; + write_buf[8] = 0x3c; + write_buf[9] = 0x75; + write_buf[10] = 0x30; + //LOGD("to write ..........\n"); + mSerialPort.writeFile(write_buf, 11); + sleep(1); + //LOGD("to read........\n"); + mSerialPort.readFile(read_buf, 12); + for (idx = 0; idx < 12; idx++) + LOGD("the data is:0x%x\n", read_buf[idx]); + LOGD("end....\n"); +} + +void CFbcCommunication::showTime(struct timeval *_time) +{ + struct timeval curTime; + + if (_time == NULL) { + gettimeofday(&curTime, NULL); + } else { + curTime.tv_sec = _time->tv_sec; + curTime.tv_usec = _time->tv_usec; + } + if (curTime.tv_usec > 100000) { + LOGD("[%d.%d]", curTime.tv_sec, curTime.tv_usec); + } else if (curTime.tv_usec > 10000) { + LOGD("[%d.0%d]", curTime.tv_sec, curTime.tv_usec); + } else if (curTime.tv_usec > 1000) { + LOGD("[%d.00%d]", curTime.tv_sec, curTime.tv_usec); + } else if (curTime.tv_usec > 100) { + LOGD("[%d.000%d]", curTime.tv_sec, curTime.tv_usec); + } else if (curTime.tv_usec > 10) { + LOGD("[%d.0000%d]", curTime.tv_sec, curTime.tv_usec); + } else if (curTime.tv_usec > 1) { + LOGD("[%d.00000%d]", curTime.tv_sec, curTime.tv_usec); + } +} +long CFbcCommunication::getTime(void) +{ + struct timeval tv; + gettimeofday(&tv, NULL); + return tv.tv_sec * 1000 + tv.tv_usec / 1000; +} +void CFbcCommunication::initCrc32Table() +{ + //生成Crc32的查询表 + int i, j; + unsigned int Crc; + for (i = 0; i < 256; i++) { + Crc = i; + for (j = 0; j < 8; j++) { + if (Crc & 1) + Crc = (Crc >> 1) ^ 0xEDB88320; + else + Crc >>= 1; + } + mCrc32Table[i] = Crc; + } +} + +void CFbcCommunication::sendAckCmd(bool isOk) +{ + int crc32value = 0; + unsigned char ackcmd[12]; + ackcmd[0] = 0x5A; + ackcmd[1] = 0x5A; + ackcmd[2] = 12;//little endian + ackcmd[3] = 0x00; + ackcmd[4] = 0x80;//ack flag + ackcmd[5] = 0xff;//cmd id + if (isOk) { + ackcmd[6] = 0xfe; + ackcmd[7] = 0x7f; + } else { + ackcmd[6] = 0x80; + ackcmd[7] = 0x01; + } + //*((unsigned int*) (ackcmd + 8)) = GetCrc32(ackcmd, 8); + crc32value = Calcrc32(0, ackcmd, 8); + ackcmd[8] = (crc32value >> 0) & 0xFF; + ackcmd[9] = (crc32value >> 8) & 0xFF; + ackcmd[10] = (crc32value >> 16) & 0xFF; + ackcmd[11] = (crc32value >> 24) & 0xFF; + LOGD("to send ack and crc is:0x%x\n", crc32value); + sendDataOneway(COMM_DEV_SERIAL, ackcmd, 12, 0x00000000); +} + +/* 函数名:GetCrc32 +* 函数原型:unsigned int GetCrc32(char* InStr,unsigned int len) +* 参数:InStr ---指向需要计算CRC32值的字符? * len ---为InStr的长帿 * 返回值为计算出来的CRC32结果? */ +unsigned int CFbcCommunication::GetCrc32(unsigned char *InStr, unsigned int len) +{ + //开始计算CRC32校验便 + unsigned int Crc = 0xffffffff; + for (int i = 0; i < len; i++) { + Crc = (Crc >> 8) ^ mCrc32Table[(Crc & 0xFF) ^ InStr[i]]; + } + + Crc ^= 0xFFFFFFFF; + return Crc; +} + +unsigned int CFbcCommunication::Calcrc32(unsigned int crc, const unsigned char *ptr, unsigned int buf_len) +{ + static const unsigned int s_crc32[16] = { 0, 0x1db71064, 0x3b6e20c8, 0x26d930ac, 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c, + 0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c + }; + unsigned int crcu32 = crc; + if (buf_len < 0) + return 0; + if (!ptr) return 0; + crcu32 = ~crcu32; + while (buf_len--) { + unsigned char b = *ptr++; + crcu32 = (crcu32 >> 4) ^ s_crc32[(crcu32 & 0xF) ^ (b & 0xF)]; + crcu32 = (crcu32 >> 4) ^ s_crc32[(crcu32 & 0xF) ^ (b >> 4)]; + } + return ~crcu32; +} + +int CFbcCommunication::sendDataOneway(int devno, unsigned char *pData, int dataLen, int flags) +{ + int ret = -1; + switch (devno) { + case COMM_DEV_CEC: { + ret = mHdmiCec.writeFile(pData, dataLen); + break; + } + case COMM_DEV_SERIAL: { + ret = mSerialPort.writeFile(pData, dataLen); + break; + } + default: + break; + } + return ret; +} + +int CFbcCommunication::rmFromRequestList() +{ + return 0; +} + +int CFbcCommunication::addToRequestList() +{ + return 0; +} +//timeout ms +int CFbcCommunication::sendDataAndWaitReply(int devno, int waitForDevno, int waitForCmd, unsigned char *pData, int dataLen, int timeout, unsigned char *pReData, int *reDataLen, int flags) +{ + int ret = sendDataOneway(devno, pData, dataLen, flags); + if (ret < 0) return ret; + + mReplyList.WaitDevNo = waitForDevno; + mReplyList.WaitCmd = waitForCmd; + mReplyList.WaitTimeOut = timeout; + mReplyList.reDataLen = 0; + mReplyList.replyData = mpRevDataBuf; + addToRequestList(); + LOGD("wait dev:%d, cmd:0x%x, timeout:%d", mReplyList.WaitDevNo, mReplyList.WaitCmd, mReplyList.WaitTimeOut); + + mLock.lock(); + ret = mReplyList.WaitReplyCondition.waitRelative(mLock, timeout);//wait reply + LOGD("wait reply return = %d", __FUNCTION__, __LINE__, ret); + mLock.unlock(); + + // + if (mReplyList.reDataLen > 0) { //data have come in + *reDataLen = mReplyList.reDataLen; + memcpy(pReData, mReplyList.replyData, mReplyList.reDataLen); + mReplyList.reDataLen = 0; + return *reDataLen; + } else { + //timeout,not to wait continue + mReplyList.WaitDevNo = -1; + mReplyList.WaitCmd = 0xff; + return -1;//timeout but data not come. + } + return 0; +} + +int CFbcCommunication::closeAll() +{ + mSerialPort.CloseDevice(); + return 0; +} + +int CFbcCommunication::SetUpgradeFlag(int flag) +{ + mUpgradeFlag = flag; + return 0; +} + +/* +** cmd[0] cmd_type; cmd[1] cmd length; cmd[2] para1 cmd[3] para2 ... +*/ +int CFbcCommunication::handleCmd(COMM_DEV_TYPE_E fromDev, int *pData, int *pRetValue) +{ + fbc_command_t cmd_type = VPU_CMD_NULL; + int ret_value = 0; + + if ((fromDev != COMM_DEV_SERIAL && fromDev != COMM_DEV_CEC) || pData == NULL || pRetValue == NULL) { + //LOGD("para error and returned!"); + return -1; + } + + cmd_type = (fbc_command_t)pData[0]; + LOGD("the cmd type is:0x%02x\n", cmd_type); + switch (cmd_type) { + case VPU_CMD_RED_GAIN_DEF: + cfbc_Set_Gain_Red(fromDev, pData[2]); + break; + + case VPU_CMD_RED_GAIN_DEF|0x80: + cfbc_Get_Gain_Red(fromDev, &ret_value); + pRetValue[0] = VPU_CMD_RED_GAIN_DEF | 0x80; + pRetValue[1] = 3; + pRetValue[2] = ret_value; + break; + + case VPU_CMD_PATTEN_SEL: + cfbc_Set_Test_Pattern(fromDev, pData[2]); + break; + + case VPU_CMD_BACKLIGHT_DEF: + cfbc_Set_Backlight(fromDev, pData[2]); + break; + + case VPU_CMD_PATTEN_SEL|0x80: + cfbc_Get_Test_Pattern(fromDev, &ret_value); + pRetValue[0] = VPU_CMD_RED_GAIN_DEF | 0x80; + pRetValue[1] = 3; + pRetValue[2] = ret_value; + break; + + default: + return -1; + } + + return 0; +} + +int CFbcCommunication::uartReadStream(unsigned char *retData, int rd_max_len, int timeout) +{ + int readLen = 0, bufIndex = 0, haveRead = 0; + clock_t start_tm = clock(); + + do { + readLen = mSerialPort.readFile(retData + bufIndex, rd_max_len - haveRead); + haveRead += readLen; + bufIndex += readLen; + if (haveRead == rd_max_len) { + return haveRead; + } + + LOGD("readLen = %d, haveRead = %d\n", readLen, haveRead); + + if (((clock() - start_tm) / (CLOCKS_PER_SEC / 1000)) > timeout) { + return haveRead; + } + } while (true); + + return haveRead; +} + +int CFbcCommunication::uartReadData(unsigned char *retData, int *retLen) +{ + unsigned char tempBuf[512]; + int cmdLen = 0; + int bufIndex = 0; + int readLen = 0; + + if (retData == NULL) { + LOGD("the retData is NULL\n"); + return 0; + } + + //leader codes 2 byte + memset(tempBuf, 0, sizeof(tempBuf)); + do { + readLen = mSerialPort.readFile(tempBuf + 0, 1); + if (tempBuf[0] == 0x5A) { + bufIndex = 1; + readLen = mSerialPort.readFile(tempBuf + 1, 1); + if (tempBuf[1] == 0x5A) { + bufIndex = 2; + LOGD("leading code coming...\n"); + break; + } else { + continue; + } + } else { + continue; + } + } while (true); + + //data len 2 byte + int needRead = 2, haveRead = 0; + do { + readLen = mSerialPort.readFile(tempBuf + bufIndex, needRead - haveRead); + haveRead += readLen; + bufIndex += readLen; + if (haveRead == needRead) { + break; + } + } while (true); + + //little endian + cmdLen = (tempBuf[3] << 8) + tempBuf[2]; + //cmd data cmdLen - 2 -2 + needRead = cmdLen - 4, haveRead = 0; + LOGD("cmdLen is:%d\n", cmdLen); + + do { + readLen = mSerialPort.readFile(tempBuf + bufIndex, needRead - haveRead); + haveRead += readLen; + bufIndex += readLen; + if (readLen > 0) { + LOGD("data readLen is:%d\n", readLen); + } + if (haveRead == needRead) { + break; + } + } while (true); + + unsigned int crc = 0; + if (cmdLen > 4) { + crc = Calcrc32(0, tempBuf, cmdLen - 4);//not include crc 4byte + } + unsigned int bufCrc = tempBuf[cmdLen - 4] | + tempBuf[cmdLen - 3] << 8 | + tempBuf[cmdLen - 2] << 16 | + tempBuf[cmdLen - 1] << 24; + int idx = 0; + + if (crc == bufCrc) { + memcpy(retData, tempBuf, cmdLen % 512); + *retLen = cmdLen; + return cmdLen; + } else { + return -1; + } +} + +int CFbcCommunication::processData(COMM_DEV_TYPE_E fromDev, unsigned char *pData, int dataLen) +{ + switch (fromDev) { + case COMM_DEV_CEC: { + if (mReplyList.WaitDevNo == fromDev && mReplyList.WaitCmd == pData[1]) { + mReplyList.reDataLen = dataLen; + memcpy(mReplyList.replyData, pData, dataLen); + mReplyList.WaitReplyCondition.signal(); + } else if (0) { + } + break; + } + case COMM_DEV_SERIAL: { + LOGD("to signal wait dataLen:0x%x, cmdId:0x%x\n", dataLen, pData[5]); + if (mReplyList.WaitDevNo == fromDev && mReplyList.WaitCmd == pData[5]) { + mReplyList.reDataLen = dataLen; + memcpy(mReplyList.replyData, pData, dataLen); + mReplyList.WaitReplyCondition.signal(); + } else { + unsigned char cmd = pData[5]; + //just test + const char *value; + if (!mbSendKeyCode) { + value = config_get_str("FBCUART", "fbc_key_event_handle", "null"); + if ( strcmp ( value, "true" ) == 0 ) + mbSendKeyCode = true; + else mbSendKeyCode = false; + } +#if(0) + switch (cmd) { + case 0x14: + if (mbSendKeyCode ) { + if (pData[6] >= 12 && pData[6] <= 16 ) { //left ---enter + unsigned char key = pData[6] ; + LOGD(" key:0x%x\n", key); + + //16 key 28 DPAD_CENTER + //12 key 103 DPAD_UP + //13 key 108 DPAD_DOWN + //14 key 105 DPAD_LEFT + //15 key 106 DPAD_RIGHT + int checkKey = 0; + if (key == 16) + checkKey = 28 ; + else if (key == 12) + checkKey = 103 ; + else if (key == 13) + checkKey = 108 ; + else if (key == 14) + checkKey = 105 ; + else if (key == 15) + checkKey = 106 ; + mTvInput.sendkeyCode(checkKey); + } + } + break; + + default: + break; + } +#else + static long curTime, lastTime; + int tmp; + static int st = 0, st_key_up = 0; + static int st_key_down = 0; + static int st_key_left = 0; + static int st_key_right = 0; + static int checkKey = 0, last_checkKey = 0; + + + switch (pData[6]) { //different key + case 12: //DPAD_UP + st_key_up = pData[5]; + if (st_key_up == 0x1D) { //CMD_INPUT_DOWN + last_checkKey = checkKey; + checkKey = 103; + mTvInput.sendkeyCode(checkKey); + } else if (st_key_up == 0x1E) { //CMD_INPUT_UP + //checkKey = 103; + //mTvInput.sendkeyCode_Up(checkKey); + } + break; + + case 13: //DPAD_DOWN + st_key_down = pData[5]; + if (st_key_down == 0x1D) { //CMD_INPUT_DOWN + last_checkKey = checkKey; + checkKey = 108; + mTvInput.sendkeyCode(checkKey); + } else if (st_key_down == 0x1E) { //CMD_INPUT_UP + //checkKey = 108; + //mTvInput.sendkeyCode_Up(checkKey); + } + break; + + case 14: //DPAD_LEFT + st_key_left = pData[5]; + if (st_key_left == 0x1D) { //CMD_INPUT_DOWN + last_checkKey = checkKey; + checkKey = 105; + mTvInput.sendkeyCode(checkKey); + } else if (st_key_left == 0x1E) { //CMD_INPUT_UP + //checkKey = 105; + //mTvInput.sendkeyCode_Up(checkKey); + } + break; + + case 15: //DPAD_RIGHT + st_key_right = pData[5]; + if (st_key_right == 0x1D) { //CMD_INPUT_DOWN + last_checkKey = checkKey; + checkKey = 106; + mTvInput.sendkeyCode(checkKey); + } else if (st_key_right == 0x1E) { //CMD_INPUT_UP + //checkKey = 106; + //mTvInput.sendkeyCode_Up(checkKey); + } + break; + + case 16: //DPAD_ENTER + st = pData[5]; + if (st == 0x1D) { //CMD_INPUT_DOWN + last_checkKey = checkKey; + checkKey = 28; + lastTime = 0; + mbFbcKeyEnterDown = 1;//true + mFbcEnterKeyDownTime = mTvInput.getNowMs(); + mTvInput.sendKeyRepeatStart(158, 1200, 1500);//code 4, dis 3, repeatTime 2 + } else if (st == 0x1E) { //CMD_INPUT_UP + checkKey = 28; + if (mbFbcKeyEnterDown == 1) { + mbFbcKeyEnterDown = 0;//false + mTvInput.sendKeyRepeatStop(); + int disFbcEnterKeyDown = mTvInput.getNowMs() - mFbcEnterKeyDownTime; + LOGD("disFbcEnterKeyDown = %d", disFbcEnterKeyDown); + if (disFbcEnterKeyDown > 1200) { //long down + } else { + mTvInput.sendkeyCode(28); + } + } + } + break; + + case 20: //7key power + st_key_right = pData[5]; + if (st_key_right == 0x1D) { //CMD_INPUT_DOWN + last_checkKey = checkKey; + checkKey = 116; + //mTvInput.sendIRkeyCode_Down(checkKey); + mTvInput.sendIRkeyCode(checkKey); + } else if (st_key_right == 0x1E) { //CMD_INPUT_UP + checkKey = 116; + //mTvInput.sendIRkeyCode_Up(checkKey); + } + break; + + case 26: //7key source + st_key_right = pData[5]; + if (st_key_right == 0x1D) { //CMD_INPUT_DOWN + last_checkKey = checkKey; + checkKey = 466; + mTvInput.sendIRkeyCode_Down(checkKey); + } else if (st_key_right == 0x1E) { //CMD_INPUT_UP + checkKey = 466; + mTvInput.sendIRkeyCode_Up(checkKey); + } + break; + + case 27: //7key menu + st_key_right = pData[5]; + if (st_key_right == 0x1D) { //CMD_INPUT_DOWN + last_checkKey = checkKey; + checkKey = 139; + mTvInput.sendkeyCode(checkKey); + } else if (st_key_right == 0x1E) { //CMD_INPUT_UP + //checkKey = 139; + //mTvInput.sendkeyCode_Up(checkKey); + } + break; + + case 40: //7key vol - + st_key_right = pData[5]; + if (st_key_right == 0x1D) { //CMD_INPUT_DOWN + last_checkKey = checkKey; + checkKey = 114; + mTvInput.sendIRkeyCode_Down(checkKey); + } else if (st_key_right == 0x1E) { //CMD_INPUT_UP + checkKey = 114; + mTvInput.sendIRkeyCode_Up(checkKey); + } + break; + + case 41: //7key vol + + st_key_right = pData[5]; + if (st_key_right == 0x1D) { //CMD_INPUT_DOWN + last_checkKey = checkKey; + checkKey = 115; + mTvInput.sendIRkeyCode_Down(checkKey); + } else if (st_key_right == 0x1E) { //CMD_INPUT_UP + checkKey = 115; + mTvInput.sendIRkeyCode_Up(checkKey); + } + break; + } +#endif + } + break; + } + default: { + break; + } + } + return 0; +} +bool CFbcCommunication::threadLoop() +{ + unsigned char readFrameBuf[512]; + while (!exitPending()) { //requietexit() or requietexitWait() not call + while (mUpgradeFlag == 1) { + usleep(1000 * 1000); + } + + int num = mEpoll.wait(); + + while (mUpgradeFlag == 1) { + usleep(1000 * 1000); + } + + for (int i = 0; i < num; ++i) { + int fd = (mEpoll)[i].data.fd; + /** + * EPOLLIN event + */ + if ((mEpoll)[i].events & EPOLLIN) { + if (fd == mHdmiCec.getFd()) { //ce-----------------------------c + int bufIndex = 0; + int needRead = 4; + int haveRead = 0; + int idx = 0, readLen = 0; + do { + readLen = mHdmiCec.readFile(readFrameBuf + bufIndex, needRead - haveRead); + haveRead += readLen; + bufIndex += readLen; + //if(haveRead == needRead) break; + } while (0); + + if (readLen > 0) { + processData(COMM_DEV_CEC, readFrameBuf, readLen); + } else { + } + } else if (fd == mSerialPort.getFd()) { + //seria---------------------------l + int cmdLen = 0, idx = 0; + LOGD("serial data come"); + memset(readFrameBuf, 0, 512); + int ret = uartReadData(readFrameBuf, &cmdLen); + + if (ret == -1) { //data error + sendAckCmd(false); + } else if (readFrameBuf[4] == 0x80) { //ack + LOGD("is ack come"); + } else { //not ack + sendAckCmd(true); + processData(COMM_DEV_SERIAL, readFrameBuf, cmdLen); + } + } + } + + /** + * EPOLLOUT event + */ + if ((mEpoll)[i].events & EPOLLOUT) { + + } + } + } + //exit + //return true, run again, return false,not run. + LOGD("thread exited..........\n"); + return false; +} + + + +int CFbcCommunication::Fbc_Set_Value_INT8(COMM_DEV_TYPE_E toDev, int cmd_type, int value) +{ + if (mUpgradeFlag == 1) { + return 0; + } + LOGD("%s cmd =0x%x, value=%d", __FUNCTION__, cmd_type, value); + if (toDev == COMM_DEV_CEC) { + unsigned char cmd[16], rxbuf[16]; + int rxlen = 0, idx = 0; + memset(cmd, 0, 16); + memset(rxbuf, 0, 16); + cmd[0] = 0x40; + cmd[1] = cmd_type; + cmd[2] = value; + sendDataOneway(COMM_DEV_CEC, cmd, 4, 0); + } else if (toDev == COMM_DEV_SERIAL) { + int crc32value = 0; + unsigned char write_buf[512]; + unsigned char rxbuf[512]; + int rxlen = 0, idx = 0; + + //leading code + write_buf[0] = 0x5a; + write_buf[1] = 0x5a; + //package length from begin to end + write_buf[2] = 0xb; + write_buf[3] = 0x0; + //Ack byte + write_buf[4] = 0x0; + //cmd ID + write_buf[5] = cmd_type; + //parameter + write_buf[6] = value; + //crc32 little Endian + crc32value = Calcrc32(0, write_buf, 7); + write_buf[7] = (crc32value >> 0) & 0xFF; + write_buf[8] = (crc32value >> 8) & 0xFF; + write_buf[9] = (crc32value >> 16) & 0xFF; + write_buf[10] = (crc32value >> 24) & 0xFF; + sendDataOneway(COMM_DEV_SERIAL, write_buf, write_buf[2], 0); + } + return 0; +} +int CFbcCommunication::Fbc_Set_Value_INT32(COMM_DEV_TYPE_E toDev, int cmd_type, int value) +{ + if (mUpgradeFlag == 1) { + return 0; + } + + if (toDev == COMM_DEV_SERIAL) { + int crc32value = 0; + unsigned char write_buf[512]; + unsigned char rxbuf[512]; + int rxlen = 0, idx = 0; + + //leading code + write_buf[0] = 0x5a; + write_buf[1] = 0x5a; + //package length from begin to end + write_buf[2] = 14; + write_buf[3] = 0x0; + //Ack byte + write_buf[4] = 0x0; + //cmd ID + write_buf[5] = cmd_type; + //parameter + write_buf[6] = (value >> 0) & 0xFF; + write_buf[7] = (value >> 8) & 0xFF; + write_buf[8] = (value >> 16) & 0xFF; + write_buf[9] = (value >> 24) & 0xFF; + //crc32 little Endian + crc32value = Calcrc32(0, write_buf, 10); + write_buf[10] = (crc32value >> 0) & 0xFF; + write_buf[11] = (crc32value >> 8) & 0xFF; + write_buf[12] = (crc32value >> 16) & 0xFF; + write_buf[13] = (crc32value >> 24) & 0xFF; + + return sendDataOneway(COMM_DEV_SERIAL, write_buf, write_buf[2], 0); + } + return -1; +} +int CFbcCommunication::Fbc_Get_Value_INT8(COMM_DEV_TYPE_E fromDev, int cmd_type, int *value) +{ + if (mUpgradeFlag == 1) { + return 0; + } + + LOGD("%s cmd =0x%x", __FUNCTION__, cmd_type); + + if (fromDev == COMM_DEV_CEC) { + unsigned char cmd[16], rxbuf[16]; + int rxlen = 0, idx = 0; + memset(cmd, 0, 16); + memset(rxbuf, 0, 16); + cmd[0] = 0x40; + cmd[1] = cmd_type; + sendDataAndWaitReply(COMM_DEV_CEC, COMM_DEV_CEC, cmd[1], cmd, 4, 0, rxbuf, &rxlen, 0); + *value = rxbuf[6]; + } else if (fromDev == COMM_DEV_SERIAL) { + int crc32value = 0, idx = 0, rxlen = 0; + unsigned char write_buf[16]; + unsigned char rxbuf[16]; + memset(rxbuf, 0, 16); + + //leading code + idx = 0; + write_buf[idx++] = 0x5a; + write_buf[idx++] = 0x5a; + //package length from begin to end + write_buf[idx++] = 0xa; + write_buf[idx++] = 0x0; + //Ack byte + write_buf[idx++] = 0x0; + //cmd ID + write_buf[idx++] = cmd_type; + //crc32 little Endian + crc32value = Calcrc32(0, write_buf, idx); + write_buf[idx++] = (crc32value >> 0) & 0xFF; + write_buf[idx++] = (crc32value >> 8) & 0xFF; + write_buf[idx++] = (crc32value >> 16) & 0xFF; + write_buf[idx++] = (crc32value >> 24) & 0xFF; + + sendDataAndWaitReply(COMM_DEV_SERIAL, COMM_DEV_SERIAL, write_buf[5], write_buf, write_buf[2], 2000, rxbuf, &rxlen, 0); + *value = rxbuf[6]; + } + return 0; +} + +int CFbcCommunication::Fbc_Set_BatchValue(COMM_DEV_TYPE_E toDev, unsigned char *cmd_buf, int count) +{ + if (mUpgradeFlag == 1) { + return 0; + } + + if ( 512 <= count) { + return -1; + } + + if (toDev == COMM_DEV_CEC) { + unsigned char cmd[512], rxbuf[512]; + int rxlen = 0, idx = 0; + memset(cmd, 0, 512); + memset(rxbuf, 0, 512); + cmd[0] = 0x40; + for (idx = 0; idx < count; idx++) { + cmd[idx + 1] = cmd_buf[idx]; + } + sendDataOneway(COMM_DEV_CEC, cmd, count + 1, 0); + } else if (toDev == COMM_DEV_SERIAL) { + int crc32value = 0; + unsigned char write_buf[512]; + unsigned char rxbuf[512]; + int rxlen = 0, idx = 0; + + //leading code + write_buf[0] = 0x5a; + write_buf[1] = 0x5a; + //package length from begin to end + write_buf[2] = (count + 9) & 0xFF; + write_buf[3] = ((count + 9) >> 8) & 0xFF; + //Ack byte : 0x80-> ack package;0x00->normal package; + write_buf[4] = 0x00; + + for (idx = 0; idx < count; idx++) { + write_buf[idx + 5] = cmd_buf[idx]; + } + //crc32 little Endian + crc32value = Calcrc32(0, write_buf, count + 5); + write_buf[count + 5] = (crc32value >> 0) & 0xFF; + write_buf[count + 6] = (crc32value >> 8) & 0xFF; + write_buf[count + 7] = (crc32value >> 16) & 0xFF; + write_buf[count + 8] = (crc32value >> 24) & 0xFF; + sendDataOneway(COMM_DEV_SERIAL, write_buf, count + 9, 0); + } + return 0; +} + +int CFbcCommunication::Fbc_Get_BatchValue(COMM_DEV_TYPE_E fromDev, unsigned char *cmd_buf, int count) +{ + if (mUpgradeFlag == 1) { + return 0; + } + + if ( 512 <= count) { + return -1; + } + int ret = 0; + // TODO: read value + if (fromDev == COMM_DEV_CEC) { + unsigned char cmd[512], rxbuf[512]; + int rxlen = 0, idx = 0; + memset(cmd, 0, 512); + memset(rxbuf, 0, 512); + cmd[0] = 0x40; + cmd[1] = cmd_buf[0]; + sendDataAndWaitReply(COMM_DEV_CEC, COMM_DEV_CEC, cmd[1], cmd, count + 1, 0, rxbuf, &rxlen, 0); + + if (rxlen > 2) { + for (idx = 0; idx < rxlen; idx++) { + cmd_buf[idx] = cmd[idx + 1]; + } + } + } else if (fromDev == COMM_DEV_SERIAL) { + int crc32value = 0, idx = 0, rxlen = 0; + unsigned char write_buf[512]; + unsigned char rxbuf[512]; + memset(write_buf, 0, 512); + memset(rxbuf, 0, 512); + + //leading code + write_buf[0] = 0x5a; + write_buf[1] = 0x5a; + //package length from begin to end + write_buf[2] = (count + 9) & 0xFF; + write_buf[3] = ((count + 9) >> 8) & 0xFF; + //Ack byte + write_buf[4] = 0x00; + //cmd ID + for (idx = 0; idx < count; idx++) { + write_buf[idx + 5] = cmd_buf[idx]; + } + //crc32 little Endian + crc32value = Calcrc32(0, write_buf, count + 5); + write_buf[count + 5] = (crc32value >> 0) & 0xFF; + write_buf[count + 6] = (crc32value >> 8) & 0xFF; + write_buf[count + 7] = (crc32value >> 16) & 0xFF; + write_buf[count + 8] = (crc32value >> 24) & 0xFF; + sendDataAndWaitReply(COMM_DEV_SERIAL, COMM_DEV_SERIAL, write_buf[5], write_buf, write_buf[2], 2000, rxbuf, &rxlen, 0); + + if (rxlen > 9) { + for (idx = 0; idx < (rxlen - 9); idx++) { + cmd_buf[idx] = rxbuf[idx + 5]; + } + } + ret = rxlen; + } + + return ret; +} + +int CFbcCommunication::cfbc_Set_Gain_Red(COMM_DEV_TYPE_E fromDev, int value) +{ + return Fbc_Set_Value_INT8(fromDev, VPU_CMD_RED_GAIN_DEF, value); +} + +int CFbcCommunication::cfbc_Get_Gain_Red(COMM_DEV_TYPE_E fromDev, int *value) +{ + return Fbc_Get_Value_INT8(fromDev, VPU_CMD_RED_GAIN_DEF | 0x80, value); +} + +int CFbcCommunication::cfbc_Set_Gain_Green(COMM_DEV_TYPE_E fromDev, int value) +{ + return Fbc_Set_Value_INT8(fromDev, VPU_CMD_GREEN_GAIN_DEF, value); +} + +int CFbcCommunication::cfbc_Get_Gain_Green(COMM_DEV_TYPE_E fromDev, int *value) +{ + return Fbc_Get_Value_INT8(fromDev, VPU_CMD_GREEN_GAIN_DEF | 0x80, value); +} + +int CFbcCommunication::cfbc_Set_Gain_Blue(COMM_DEV_TYPE_E fromDev, int value) +{ + return Fbc_Set_Value_INT8(fromDev, VPU_CMD_BLUE_GAIN_DEF, value); +} + +int CFbcCommunication::cfbc_Get_Gain_Blue(COMM_DEV_TYPE_E fromDev, int *value) +{ + return Fbc_Get_Value_INT8(fromDev, VPU_CMD_BLUE_GAIN_DEF | 0x80, value); +} + +int CFbcCommunication::cfbc_Set_Offset_Red(COMM_DEV_TYPE_E fromDev, int value) +{ + return Fbc_Set_Value_INT8(fromDev, VPU_CMD_PRE_RED_OFFSET_DEF, value); +} + +int CFbcCommunication::cfbc_Get_Offset_Red(COMM_DEV_TYPE_E fromDev, int *value) +{ + return Fbc_Get_Value_INT8(fromDev, VPU_CMD_PRE_RED_OFFSET_DEF | 0x80, value); +} + +int CFbcCommunication::cfbc_Set_Offset_Green(COMM_DEV_TYPE_E fromDev, int value) +{ + return Fbc_Set_Value_INT8(fromDev, VPU_CMD_PRE_GREEN_OFFSET_DEF, value); +} + +int CFbcCommunication::cfbc_Get_Offset_Green(COMM_DEV_TYPE_E fromDev, int *value) +{ + return Fbc_Get_Value_INT8(fromDev, VPU_CMD_PRE_GREEN_OFFSET_DEF | 0x80, value); +} + +int CFbcCommunication::cfbc_Set_Offset_Blue(COMM_DEV_TYPE_E fromDev, int value) +{ + return Fbc_Set_Value_INT8(fromDev, VPU_CMD_PRE_BLUE_OFFSET_DEF, value); +} + +int CFbcCommunication::cfbc_Get_Offset_Blue(COMM_DEV_TYPE_E fromDev, int *value) +{ + return Fbc_Get_Value_INT8(fromDev, VPU_CMD_PRE_BLUE_OFFSET_DEF | 0x80, value); +} + +int CFbcCommunication::cfbc_Set_WB_Initial(COMM_DEV_TYPE_E fromDev, int value) +{ + return Fbc_Set_Value_INT8(fromDev, VPU_CMD_WB, value); +} + +int CFbcCommunication::cfbc_Get_WB_Initial(COMM_DEV_TYPE_E fromDev, int *value) +{ + return Fbc_Get_Value_INT8(fromDev, VPU_CMD_WB | 0x80, value); +} + +int CFbcCommunication::cfbc_Set_ColorTemp_Mode(COMM_DEV_TYPE_E fromDev, int value) +{ + return Fbc_Set_Value_INT8(fromDev, VPU_CMD_COLOR_TEMPERATURE_DEF, value); +} + +int CFbcCommunication::cfbc_Get_ColorTemp_Mode(COMM_DEV_TYPE_E fromDev, int *value) +{ + return Fbc_Get_Value_INT8(fromDev, VPU_CMD_COLOR_TEMPERATURE_DEF | 0x80, value); +} + +int CFbcCommunication::cfbc_Set_Test_Pattern(COMM_DEV_TYPE_E fromDev, int value) +{ + return Fbc_Set_Value_INT8(fromDev, VPU_CMD_PATTEN_SEL, value); +} + +int CFbcCommunication::cfbc_Get_Test_Pattern(COMM_DEV_TYPE_E fromDev, int *value) +{ + return Fbc_Get_Value_INT8(fromDev, VPU_CMD_PATTEN_SEL | 0x80, value); +} + +int CFbcCommunication::cfbc_Set_Picture_Mode(COMM_DEV_TYPE_E fromDev, int value) +{ + return Fbc_Set_Value_INT8(fromDev, VPU_CMD_PICTURE_MODE, value); +} + +int CFbcCommunication::cfbc_Get_Picture_Mode(COMM_DEV_TYPE_E fromDev, int *value) +{ + return Fbc_Get_Value_INT8(fromDev, VPU_CMD_PICTURE_MODE | 0x80, value); +} + +int CFbcCommunication::cfbc_Set_Contrast(COMM_DEV_TYPE_E fromDev, int value) +{ + return Fbc_Set_Value_INT8(fromDev, VPU_CMD_CONTRAST_DEF, value); +} + +int CFbcCommunication::cfbc_Get_Contrast(COMM_DEV_TYPE_E fromDev, int *value) +{ + return Fbc_Get_Value_INT8(fromDev, VPU_CMD_CONTRAST_DEF | 0x80, value); +} + +int CFbcCommunication::cfbc_Set_Brightness(COMM_DEV_TYPE_E fromDev, int value) +{ + return Fbc_Set_Value_INT8(fromDev, VPU_CMD_BRIGHTNESS_DEF, value); +} + +int CFbcCommunication::cfbc_Get_Brightness(COMM_DEV_TYPE_E fromDev, int *value) +{ + return Fbc_Get_Value_INT8(fromDev, VPU_CMD_BRIGHTNESS_DEF | 0x80, value); +} + +int CFbcCommunication::cfbc_Set_Saturation(COMM_DEV_TYPE_E fromDev, int value) +{ + return Fbc_Set_Value_INT8(fromDev, VPU_CMD_COLOR_DEF, value); +} + +int CFbcCommunication::cfbc_Get_Saturation(COMM_DEV_TYPE_E fromDev, int *value) +{ + return Fbc_Get_Value_INT8(fromDev, VPU_CMD_COLOR_DEF | 0x80, value); +} + +int CFbcCommunication::cfbc_Set_HueColorTint(COMM_DEV_TYPE_E fromDev, int value) +{ + return Fbc_Set_Value_INT8(fromDev, VPU_CMD_HUE_DEF, value); +} + +int CFbcCommunication::cfbc_Get_HueColorTint(COMM_DEV_TYPE_E fromDev, int *value) +{ + return Fbc_Get_Value_INT8(fromDev, VPU_CMD_HUE_DEF | 0x80, value); +} + +int CFbcCommunication::cfbc_Set_Backlight(COMM_DEV_TYPE_E fromDev, int value) +{ + return Fbc_Set_Value_INT8(fromDev, VPU_CMD_BACKLIGHT_DEF, value); +} + +int CFbcCommunication::cfbc_Get_Backlight(COMM_DEV_TYPE_E fromDev, int *value) +{ + return Fbc_Get_Value_INT8(fromDev, VPU_CMD_BACKLIGHT_DEF | 0x80, value); +} + +int CFbcCommunication::cfbc_Set_Source(COMM_DEV_TYPE_E fromDev, int value) +{ + return Fbc_Set_Value_INT8(fromDev, VPU_CMD_SOURCE, value); +} + +int CFbcCommunication::cfbc_Get_Source(COMM_DEV_TYPE_E fromDev, int *value) +{ + return Fbc_Get_Value_INT8(fromDev, VPU_CMD_SOURCE | 0x80, value); +} + +int CFbcCommunication::cfbc_Set_Mute(COMM_DEV_TYPE_E fromDev, int value) +{ + LOGD("cfbc_Set_Mute = %d", value); + return Fbc_Set_Value_INT8(fromDev, AUDIO_CMD_SET_MUTE, value); +} +int CFbcCommunication::cfbc_Set_FBC_Audio_Source(COMM_DEV_TYPE_E fromDev, int value) +{ + return Fbc_Set_Value_INT8(fromDev, AUDIO_CMD_SET_SOURCE, value); +} + +int CFbcCommunication::cfbc_Get_Mute(COMM_DEV_TYPE_E fromDev, int *value) +{ + return Fbc_Get_Value_INT8(fromDev, AUDIO_CMD_GET_MUTE, value); +} + +int CFbcCommunication::cfbc_Set_Volume_Bar(COMM_DEV_TYPE_E fromDev, int value) +{ + return Fbc_Set_Value_INT8(fromDev, AUDIO_CMD_SET_VOLUME_BAR, value); +} + +int CFbcCommunication::cfbc_Get_Volume_Bar(COMM_DEV_TYPE_E fromDev, int *value) +{ + return Fbc_Get_Value_INT8(fromDev, AUDIO_CMD_GET_VOLUME_BAR, value); +} + +int CFbcCommunication::cfbc_Set_Balance(COMM_DEV_TYPE_E fromDev, int value) +{ + return Fbc_Set_Value_INT8(fromDev, AUDIO_CMD_SET_BALANCE, value); +} + +int CFbcCommunication::cfbc_Get_Balance(COMM_DEV_TYPE_E fromDev, int *value) +{ + return Fbc_Get_Value_INT8(fromDev, AUDIO_CMD_GET_BALANCE, value); +} + +int CFbcCommunication::cfbc_Set_Master_Volume(COMM_DEV_TYPE_E fromDev, int value) +{ + return Fbc_Set_Value_INT8(fromDev, AUDIO_CMD_SET_MASTER_VOLUME, value); +} + +int CFbcCommunication::cfbc_Get_Master_Volume(COMM_DEV_TYPE_E fromDev, int *value) +{ + return Fbc_Get_Value_INT8(fromDev, AUDIO_CMD_GET_MASTER_VOLUME, value); +} + +int CFbcCommunication::cfbc_Set_CM(COMM_DEV_TYPE_E fromDev, unsigned char value) +{ + unsigned char cmd[512]; + memset(cmd, 0, 512); + + cmd[0] = VPU_CMD_ENABLE; + cmd[1] = VPU_MODULE_CM2; + cmd[2] = value;//value:0~1 + return Fbc_Set_BatchValue(fromDev, cmd, 3); +} + +int CFbcCommunication::cfbc_Get_CM(COMM_DEV_TYPE_E fromDev, int *value) +{ + unsigned char cmd[512]; + memset(cmd, 0, 512); + + cmd[0] = VPU_CMD_ENABLE | 0x80; + cmd[1] = VPU_MODULE_CM2; + + Fbc_Get_BatchValue(fromDev, cmd, 2); + *value = cmd[2]; + + return 0; +} +int CFbcCommunication::cfbc_Set_DNLP(COMM_DEV_TYPE_E fromDev, unsigned char value) +{ + unsigned char cmd[512]; + memset(cmd, 0, 512); + + cmd[0] = VPU_CMD_ENABLE; + cmd[1] = VPU_MODULE_DNLP; + cmd[2] = value;//value:0~1 + + return Fbc_Set_BatchValue(fromDev, cmd, 3); +} + +int CFbcCommunication::cfbc_Get_DNLP(COMM_DEV_TYPE_E fromDev, int *value) +{ + unsigned char cmd[512]; + memset(cmd, 0, 512); + + cmd[0] = VPU_CMD_ENABLE | 0x80; + cmd[1] = VPU_MODULE_DNLP; + + Fbc_Get_BatchValue(fromDev, cmd, 2); + *value = cmd[2]; + + return 0; +} + +int CFbcCommunication::cfbc_Get_FBC_MAINCODE_Version(COMM_DEV_TYPE_E fromDev, char sw_ver[], char build_time[], char git_ver[], char git_branch[], char build_name[]) +{ + int rx_len = 0, tmp_ind = 0; + unsigned char cmd[512]; + + if (sw_ver == NULL || build_time == NULL || git_ver == NULL || git_branch == NULL || build_name == NULL) { + return -1; + } + + memset(cmd, 0, 512); + cmd[0] = CMD_FBC_MAIN_CODE_VERSION; + rx_len = Fbc_Get_BatchValue(fromDev, cmd, 1); + + sw_ver[0] = 0; + build_time[0] = 0; + git_ver[0] = 0; + git_branch[0] = 0; + build_name[0] = 0; + + if (rx_len <= 0) { + return -1; + } + + if (cmd[0] != CMD_FBC_MAIN_CODE_VERSION || cmd[1] != 0x88 || cmd[2] != 0x99) { + return -1; + } + + tmp_ind = 3; + + strcpy(sw_ver, (char *)(cmd + tmp_ind)); + tmp_ind += strlen(sw_ver); + tmp_ind += 1; + + strcpy(build_time, (char *)(cmd + tmp_ind)); + tmp_ind += strlen(build_time); + tmp_ind += 1; + + strcpy(git_ver, (char *)(cmd + tmp_ind)); + tmp_ind += strlen(git_ver); + tmp_ind += 1; + + strcpy(git_branch, (char *)(cmd + tmp_ind)); + tmp_ind += strlen(git_branch); + tmp_ind += 1; + + strcpy(build_name, (char *)(cmd + tmp_ind)); + tmp_ind += strlen(build_name); + tmp_ind += 1; + LOGD("sw_ver=%s, buildt=%s, gitv=%s, gitb=%s,bn=%s", sw_ver, build_time, git_ver, git_branch, build_name); + return 0; +} + +int CFbcCommunication::cfbc_Set_FBC_Factory_SN(COMM_DEV_TYPE_E fromDev, const char *pSNval) +{ + unsigned char cmd[512]; + int len = strlen(pSNval); + + memset(cmd, 0, 512); + + cmd[0] = CMD_SET_FACTORY_SN; + + memcpy(cmd + 1, pSNval, len); + + LOGD("cmd : %s\n", cmd); + + return Fbc_Set_BatchValue(fromDev, cmd, len + 1); +} + +int CFbcCommunication::cfbc_Get_FBC_Factory_SN(COMM_DEV_TYPE_E fromDev, char FactorySN[]) +{ + int rx_len = 0; + unsigned char cmd[512]; + memset(cmd, 0, 512); + cmd[0] = CMD_GET_FACTORY_SN; + rx_len = Fbc_Get_BatchValue(fromDev, cmd, 1); + if (rx_len <= 0) { + return -1; + } + strncpy(FactorySN, (char *)(cmd + 1), 17); + + LOGD("panelModel=%s", FactorySN); + return 0; +} + +int CFbcCommunication::cfbc_Get_FBC_Get_PANel_INFO(COMM_DEV_TYPE_E fromDev, char panel_model[]) +{ + int rx_len = 0; + unsigned char cmd[512]; + memset(cmd, 0, 512); + cmd[0] = CMD_DEVICE_ID; + rx_len = Fbc_Get_BatchValue(fromDev, cmd, 1); + if (rx_len <= 0) { + return -1; + } + strcpy(panel_model, (char *)(cmd + 1)); + + LOGD("panelModel=%s", panel_model); + return 0; +} + +int CFbcCommunication::cfbc_Set_FBC_panel_power_switch(COMM_DEV_TYPE_E fromDev, int switch_val) +{ + unsigned char cmd[512]; + + memset(cmd, 0, 512); + + cmd[0] = FBC_PANEL_POWER; + cmd[1] = switch_val; //0 is fbc panel power off, 1 is panel power on. + + return Fbc_Set_BatchValue(fromDev, cmd, 2); +} + +int CFbcCommunication::cfbc_Set_FBC_suspend(COMM_DEV_TYPE_E fromDev, int switch_val) +{ + unsigned char cmd[512]; + + memset(cmd, 0, 512); + + cmd[0] = FBC_SUSPEND_POWER; + cmd[1] = switch_val; //0 + + return Fbc_Set_BatchValue(fromDev, cmd, 2); +} +int CFbcCommunication::cfbc_Set_FBC_User_Setting_Default(COMM_DEV_TYPE_E fromDev, int param) +{ + unsigned char cmd[512]; + + memset(cmd, 0, 512); + + cmd[0] = FBC_USER_SETTING_DEFAULT; + cmd[1] = param; //0 + + return Fbc_Set_BatchValue(fromDev, cmd, 2); +} +int CFbcCommunication::cfbc_SendRebootToUpgradeCmd(COMM_DEV_TYPE_E fromDev, int value) +{ + return Fbc_Set_Value_INT32(fromDev, FBC_REBOOT_UPGRADE, value); +} +int CFbcCommunication::cfbc_FBC_Send_Key_To_Fbc(COMM_DEV_TYPE_E fromDev, int keycode, int param) +{ + unsigned char cmd[512]; + + memset(cmd, 0, 512); + + cmd[0] = CMD_ACTIVE_KEY; + cmd[1] = keycode; //0 + + return Fbc_Set_BatchValue(fromDev, cmd, 2); +} + +int CFbcCommunication::cfbc_Get_FBC_PANEL_REVERSE(COMM_DEV_TYPE_E fromDev, int *value) +{ + unsigned char cmd[512]; + memset(cmd, 0, 512); + + cmd[0] = CMD_PANEL_INFO; + //0://panel reverse + //1://panel output_mode + //2://panel byte num + cmd[1] = 0; + + Fbc_Get_BatchValue(fromDev, cmd, 2); + //cmd[0] cmdid-PANEL-INFO + //cmd[1] param[0] - panel reverse + *value = cmd[2]; + + return 0; +} + +int CFbcCommunication::cfbc_Get_FBC_PANEL_OUTPUT(COMM_DEV_TYPE_E fromDev, int *value) +{ + unsigned char cmd[512]; + memset(cmd, 0, 512); + + cmd[0] = CMD_PANEL_INFO; + //0://panel reverse + //1://panel output_mode + //2://panel byte num + cmd[1] = 1; + + Fbc_Get_BatchValue(fromDev, cmd, 2); + //cmd[0] cmdid-PANEL-INFO + //cmd[1] param[0] - panel reverse + *value = cmd[2]; + + return 0; +} + +int CFbcCommunication::cfbc_Set_FBC_project_id(COMM_DEV_TYPE_E fromDev, int prj_id) +{ + unsigned char cmd[512]; + + memset(cmd, 0, 512); + + cmd[0] = CMD_SET_PROJECT_SELECT; + cmd[1] = prj_id; + + return Fbc_Set_BatchValue(fromDev, cmd, 2); +} + +int CFbcCommunication::cfbc_Get_FBC_project_id(COMM_DEV_TYPE_E fromDev, int *prj_id) +{ + return Fbc_Get_Value_INT8(fromDev, CMD_GET_PROJECT_SELECT, prj_id); +} + +int CFbcCommunication::cfbc_Set_Gamma(COMM_DEV_TYPE_E fromDev, unsigned char value) +{ + unsigned char cmd[512]; + memset(cmd, 0, 512); + + cmd[0] = VPU_CMD_ENABLE; + cmd[1] = VPU_MODULE_GAMMA; + cmd[2] = value;//value:0~1 + + return Fbc_Set_BatchValue(fromDev, cmd, 3); +} + +int CFbcCommunication::cfbc_Get_Gamma(COMM_DEV_TYPE_E fromDev, int *value) +{ + unsigned char cmd[512]; + memset(cmd, 0, 512); + + cmd[0] = VPU_CMD_ENABLE | 0x80; + cmd[1] = VPU_MODULE_GAMMA; + + Fbc_Get_BatchValue(fromDev, cmd, 2); + *value = cmd[2]; + + return 0; +} + +int CFbcCommunication::cfbc_Set_WhiteBalance_OnOff(COMM_DEV_TYPE_E fromDev, unsigned char value) +{ + unsigned char cmd[512]; + memset(cmd, 0, 512); + + cmd[0] = VPU_CMD_ENABLE; + cmd[1] = VPU_MODULE_WB; + cmd[2] = value;//value:0~1 + + return Fbc_Set_BatchValue(fromDev, cmd, 3); +} + +int CFbcCommunication::cfbc_Get_WhiteBalance_OnOff(COMM_DEV_TYPE_E fromDev, int *value) +{ + unsigned char cmd[512]; + memset(cmd, 0, 512); + + cmd[0] = VPU_CMD_ENABLE | 0x80; + cmd[1] = VPU_MODULE_WB; + + Fbc_Get_BatchValue(fromDev, cmd, 2); + *value = cmd[2]; + + return 0; +} + +int CFbcCommunication::cfbc_Set_WB_Batch(COMM_DEV_TYPE_E fromDev, unsigned char mode, unsigned char r_gain, unsigned char g_gain, unsigned char b_gain, unsigned char r_offset, unsigned char g_offset, unsigned char b_offset) +{ + unsigned char cmd[512]; + memset(cmd, 0, 512); + + cmd[0] = VPU_CMD_WB_VALUE; + cmd[1] = mode; + cmd[2] = r_gain; + cmd[3] = g_gain; + cmd[4] = b_gain; + cmd[5] = r_offset; + cmd[6] = g_offset; + cmd[7] = b_offset; + + return Fbc_Set_BatchValue(fromDev, cmd, 8); +} + +int CFbcCommunication::cfbc_WhiteBalance_GrayPattern_OnOff(COMM_DEV_TYPE_E fromDev, int onOff) +{ + int ret = -1; + unsigned char cmd[512]; + memset(cmd, 0, 512); + if (onOff == 0) { //On + LOGD("Call vpp 63 2 1"); + cmd[0] = VPU_CMD_SRCIF; + cmd[1] = 2; + cmd[2] = 1; + ret = Fbc_Set_BatchValue(fromDev, cmd, 3);//close csc0 + if (ret == 0) { + LOGD("Call vpp 9 9 0"); + cmd[0] = VPU_CMD_ENABLE; + cmd[1] = 9; + cmd[2] = 0; + ret = Fbc_Set_BatchValue(fromDev, cmd, 3);//close csc1 + if (ret == 0) { + LOGD("Call vpp 9 10 0"); + cmd[0] = VPU_CMD_ENABLE; + cmd[1] = 10; + cmd[2] = 0; + ret = Fbc_Set_BatchValue(fromDev, cmd, 3);//close dnlp + if (ret == 0) { + LOGD("Call vpp 9 8 0"); + cmd[0] = VPU_CMD_ENABLE; + cmd[1] = 8; + cmd[2] = 0; + ret = Fbc_Set_BatchValue(fromDev, cmd, 3);//close cm + } + } + } + + } else { //Off + LOGD("Call vpp 63 2 2"); + cmd[0] = VPU_CMD_SRCIF; + cmd[1] = 2; + cmd[2] = 2; + ret = Fbc_Set_BatchValue(fromDev, cmd, 3); + if (ret == 0) { + LOGD("Call vpp 9 9 1"); + cmd[0] = VPU_CMD_ENABLE; + cmd[1] = 9; + cmd[2] = 1; + ret = Fbc_Set_BatchValue(fromDev, cmd, 3);//open csc1 + if (ret == 0) { + LOGD("Call vpp 9 10 1"); + cmd[0] = VPU_CMD_ENABLE; + cmd[1] = 10; + cmd[2] = 1; + ret = Fbc_Set_BatchValue(fromDev, cmd, 3);//open dnlp + if (ret == 0) { + LOGD("Call vpp 9 8 1"); + cmd[0] = VPU_CMD_ENABLE; + cmd[1] = 8; + cmd[2] = 1; + ret = Fbc_Set_BatchValue(fromDev, cmd, 3);//open cm + } + } + } + } + return ret; +} + +int CFbcCommunication::cfbc_WhiteBalance_SetGrayPattern(COMM_DEV_TYPE_E fromDev, unsigned char value) +{ + int ret = -1; + unsigned char cmd[512]; + memset(cmd, 0, 512); + cmd[0] = VPU_CMD_GRAY_PATTERN; + cmd[1] = value; + cmd[2] = value; + cmd[3] = value; + ret = Fbc_Set_BatchValue(fromDev, cmd, 4); + return ret; +} + +int CFbcCommunication::cfbc_Get_WB_Batch(COMM_DEV_TYPE_E fromDev, unsigned char mode, unsigned char *r_gain, unsigned char *g_gain, unsigned char *b_gain, unsigned char *r_offset, unsigned char *g_offset, unsigned char *b_offset) +{ + unsigned char cmd[512]; + memset(cmd, 0, 512); + + cmd[0] = VPU_CMD_WB_VALUE | 0x80; + cmd[1] = mode; + + Fbc_Get_BatchValue(fromDev, cmd, 2); + //*mode = cmd[1]; + *r_gain = cmd[2]; + *g_gain = cmd[3]; + *b_gain = cmd[4]; + *r_offset = cmd[5]; + *g_offset = cmd[6]; + *b_offset = cmd[7]; + + return 0; +} + +int CFbcCommunication::cfbc_Set_backlight_onoff(COMM_DEV_TYPE_E fromDev, int value) +{ + return Fbc_Set_Value_INT8(fromDev, VPU_CMD_BACKLIGHT_EN, value); +} + +int CFbcCommunication::cfbc_Get_backlight_onoff(COMM_DEV_TYPE_E fromDev, int *value) +{ + return Fbc_Get_Value_INT8(fromDev, VPU_CMD_BACKLIGHT_EN, value); +} + +int CFbcCommunication::cfbc_Set_LVDS_SSG_Set(COMM_DEV_TYPE_E fromDev, int value) +{ + return Fbc_Set_Value_INT8(fromDev, CMD_LVDS_SSG_SET, value); +} + +int CFbcCommunication::cfbc_Set_AUTO_ELEC_MODE(COMM_DEV_TYPE_E fromDev, int value) +{ + LOGD("%s cmd =0x%x, value=%d~~~~~~~~", __FUNCTION__, VPU_CMD_SET_ELEC_MODE, value); + return Fbc_Set_Value_INT8(fromDev, VPU_CMD_SET_ELEC_MODE, value); +} + +int CFbcCommunication::cfbc_Get_AUTO_ELEC_MODE(COMM_DEV_TYPE_E fromDev, int *value) +{ + LOGD("%s cmd =0x%x~~~~~~~~~", __FUNCTION__, VPU_CMD_SET_ELEC_MODE); + return Fbc_Get_Value_INT8(fromDev, VPU_CMD_GET_ELEC_MODE, value); +} + +int CFbcCommunication::cfbc_Set_Thermal_state(COMM_DEV_TYPE_E fromDev, int value) +{ + LOGD("%s cmd =0x%x, data%d ~~~~~~~~~\n", __FUNCTION__, CMD_HDMI_STAT, value); + //return Fbc_Set_Value_INT8(fromDev, CMD_HDMI_STAT, value); + return Fbc_Set_Value_INT32(fromDev, CMD_HDMI_STAT, value); +} + +int CFbcCommunication::cfbc_Set_LightSensor_N310(COMM_DEV_TYPE_E fromDev, int value) +{ + // return Fbc_Set_Value_INT8(fromDev, CMD_LIGHT_SENSOR, value); + return 0; +} + +int CFbcCommunication::cfbc_Get_LightSensor_N310(COMM_DEV_TYPE_E fromDev, int *value) +{ + // return Fbc_Get_Value_INT8(fromDev, CMD_LIGHT_SENSOR|0x80, value); + return 0; +} + +int CFbcCommunication::cfbc_Set_Dream_Panel_N310(COMM_DEV_TYPE_E fromDev, int value) +{ + // return Fbc_Set_Value_INT8(fromDev, CMD_DREAM_PANEL, value); + return 0; +} + +int CFbcCommunication::cfbc_Get_Dream_Panel_N310(COMM_DEV_TYPE_E fromDev, int *value) +{ + // return Fbc_Get_Value_INT8(fromDev, CMD_DREAM_PANEL|0x80, value); + return 0; +} + +int CFbcCommunication::cfbc_Set_MULT_PQ_N310(COMM_DEV_TYPE_E fromDev, int value) +{ + // return Fbc_Set_Value_INT8(fromDev, CMD_MUTI_PQ, value); + return 0; +} + +int CFbcCommunication::cfbc_Get_MULT_PQ_N310(COMM_DEV_TYPE_E fromDev, int *value) +{ + // return Fbc_Get_Value_INT8(fromDev, CMD_MUTI_PQ|0x80, value); + return 0; +} + +int CFbcCommunication::cfbc_Set_MEMC_N310(COMM_DEV_TYPE_E fromDev, int value) +{ + // return Fbc_Set_Value_INT8(fromDev, CMD_MEMC, value); + return 0; +} + +int CFbcCommunication::cfbc_Get_MEMC_N310(COMM_DEV_TYPE_E fromDev, int *value) +{ + // return Fbc_Get_Value_INT8(fromDev, CMD_MEMC|0x80, value); + return 0; +} + + +void CFbcCommunication::CFbcMsgQueue::handleMessage ( CMessage &msg ) +{ + LOGD ( "%s, CFbcCommunication::CFbcMsgQueue::handleMessage type = %d", __FUNCTION__, msg.mType ); + + switch ( msg.mType ) { + case TV_MSG_COMMON: + break; + + case TV_MSG_SEND_KEY: { + LOGD("CFbcMsgQueue msg type = %d", msg.mType); + //CFbcCommunication *pFbc = ( CFbcCommunication * ) ( msg.mpData ); + //pFbc->mTvInput.sendkeyCode_Down(4); + //pFbc->mbDownHaveSend = 1;//true + break; + } + + default: + break; + } +} diff --git a/tvapi/libtv/tv/CFbcCommunication.h b/tvapi/libtv/tv/CFbcCommunication.h new file mode 100644 index 0000000..40f5d3b --- a/dev/null +++ b/tvapi/libtv/tv/CFbcCommunication.h @@ -0,0 +1,382 @@ +#ifndef C_FBC_COMMUNICATION_H +#define C_FBC_COMMUNICATION_H +#include "tvutils/CHdmiCecCmd.h" +#include "tvutils/CSerialPort.h" +#include "tvutils/zepoll.h" +#include "tvutils/CThread.h" +#include <sys/time.h> +#include "tvutils//CTvInput.h" +#include "../tvutils/CMsgQueue.h" +typedef enum COMM_DEV_TYPE_NO { + COMM_DEV_CEC = 0, + COMM_DEV_SERIAL = 1, +} COMM_DEV_TYPE_E; +typedef enum vpu_modules_e { + VPU_MODULE_NULL = 0, + VPU_MODULE_VPU, //vpu uint + VPU_MODULE_TIMGEN, + VPU_MODULE_PATGEN, + VPU_MODULE_GAMMA, + VPU_MODULE_WB, //WhiteBalance + VPU_MODULE_BC, //Brightness&Contrast + VPU_MODULE_BCRGB, //RGB Brightness&Contrast + VPU_MODULE_CM2, + VPU_MODULE_CSC1, + VPU_MODULE_DNLP, + VPU_MODULE_CSC0, + VPU_MODULE_OSD, + VPU_MODULE_BLEND, + VPU_MODULE_DEMURE, //15 + VPU_MODULE_OUTPUT, //LVDS/VX1 output + VPU_MODULE_OSDDEC, //OSD decoder + VPU_MODULE_MAX, +} vpu_modules_t; + +typedef enum fbc_command_e { + VPU_CMD_NULL = 0, + FBC_REBOOT_UPGRADE = 0x1, + FBC_USER_SETTING_DEFAULT = 0x02, + FBC_USER_SETTING_SET, + FBC_GET_HDCP_KEY, + FBC_PANEL_POWER, + FBC_SUSPEND_POWER, + //TOP CMD num:6 + VPU_CMD_INIT = 0x8, //parameter num 0 + VPU_CMD_ENABLE, //parameter num 1;bit0~6:module;bit7:enable(1) or disable(0) + VPU_CMD_BYPASS, //parameter num 1;bit0~6:module;bit7:bypass(1) or not(0) + VPU_CMD_OUTPUT_MUX, //parameter num 1;1:lvds;2:vx1;3:minilvds + VPU_CMD_TIMING, //parameter num 1;reference vpu_timing_t + VPU_CMD_SOURCE, //parameter num 1;reference vpu_source_t + VPU_CMD_GAMMA_MOD, //parameter num 1;reference vpu_gammamod_t + VPU_CMD_D2D3 = 0xf, //0xf:D2D3 + // + + CMD_BRIDGE_SW_VER = 0x10, + CMD_DEVICE_ID, + CMD_CLIENT_TYPE, + CMD_DEVICE_NUM, + CMD_ACTIVE_KEY, + CMD_ACTIVE_STATUS, + CMD_PANEL_INFO, + CMD_LVDS_SSG_SET, + + CMD_DBG_REGISTER_ACCESS = 0x18, + CMD_DBG_MEMORY_ACCESS, + CMD_DBG_SPI_ACCESS, + CMD_DBG_VPU_MEMORY_ACCESS, + CMD_DBG_MEMORY_TRANSFER, + CMD_INPUT_DOWN, + CMD_INPUT_UP, + CMD_FBC_MAIN_CODE_VERSION, + + //0x1f reserved + //PQ+debug CMD num:32 + VPU_CMD_NATURE_LIGHT_EN = 0x20, //0 or 1;on or off ???? + VPU_CMD_BACKLIGHT_EN, //0 or 1;on or off + VPU_CMD_BRIGHTNESS, //parameter num 2;parameter1:distinguish two modules;parameter2:ui value + VPU_CMD_CONTRAST, //parameter num 2;parameter1:distinguish two modules;parameter2:ui value + VPU_CMD_BACKLIGHT, //parameter num 1; + VPU_CMD_RES1, //reserved + VPU_CMD_SATURATION, //parameter num 1; + VPU_CMD_DYNAMIC_CONTRAST, //0 or 1;?? + VPU_CMD_PICTURE_MODE, //?? + VPU_CMD_PATTERN_EN, //0 or 1;on or off + VPU_CMD_PATTEN_SEL, //0x2a parameter num 1;PATTEN SELECT + VPU_CMD_RES2, + VPU_CMD_RES3, + VPU_CMD_RES4, + VPU_CMD_RES5, + VPU_CMD_USER_GAMMA = 0x2f, + //0x30:sound_mode_def + VPU_CMD_COLOR_TEMPERATURE_DEF = 0x31, //def:factory setting + VPU_CMD_BRIGHTNESS_DEF, + VPU_CMD_CONTRAST_DEF, + VPU_CMD_COLOR_DEF, + VPU_CMD_HUE_DEF, + VPU_CMD_BACKLIGHT_DEF, + VPU_CMD_RES7, + VPU_CMD_AUTO_LUMA_EN = 0x38,//0 or 1;on or off;appoint to backlight? + VPU_CMD_HIST, //parameter num 0;read hist info + VPU_CMD_BLEND, //parameter num ?; + VPU_CMD_DEMURA, //parameter num ?; + VPU_CMD_CSC, //parameter num ?; + VPU_CMD_CM2, //parameter num 1;index + VPU_CMD_GAMMA, //parameter num 1;index + VPU_CMD_SRCIF, + //WB CMD num:10 + VPU_CMD_RED_GAIN_DEF = 0x40, + VPU_CMD_GREEN_GAIN_DEF, + VPU_CMD_BLUE_GAIN_DEF, + VPU_CMD_PRE_RED_OFFSET_DEF, + VPU_CMD_PRE_GREEN_OFFSET_DEF, + VPU_CMD_PRE_BLUE_OFFSET_DEF, + VPU_CMD_POST_RED_OFFSET_DEF, + VPU_CMD_POST_GREEN_OFFSET_DEF, + VPU_CMD_POST_BLUE_OFFSET_DEF, + VPU_CMD_RES9, + VPU_CMD_WB = 0x4a, + //DNLP PARM + VPU_CMD_DNLP_PARM, + VPU_CMD_WB_VALUE, + VPU_CMD_GRAY_PATTERN, + VPU_CMD_BURN, + CMD_HDMI_STAT, + VPU_CMD_READ = 0x80, + //VPU_CMD_HUE_ADJUST, //parameter num 1; + //VPU_CMD_WB, //parameter num 3;one parameter include two items so that six items can all be included + VPU_CMD_MAX = 50,//temp define 50 // + + //audio cmd + AUDIO_CMD_SET_SOURCE = 0x50, + AUDIO_CMD_SET_MASTER_VOLUME, + AUDIO_CMD_SET_CHANNEL_VOLUME, + AUDIO_CMD_SET_SUBCHANNEL_VOLUME, + AUDIO_CMD_SET_MASTER_VOLUME_GAIN, + AUDIO_CMD_SET_CHANNEL_VOLUME_INDEX, + AUDIO_CMD_SET_VOLUME_BAR, + AUDIO_CMD_SET_MUTE, + AUDIO_CMD_SET_EQ_MODE, + AUDIO_CMD_SET_BALANCE, + AUDIO_CMD_GET_SOURCE, + AUDIO_CMD_GET_MASTER_VOLUME, + AUDIO_CMD_GET_CHANNEL_VOLUME, + AUDIO_CMD_GET_SUBCHANNEL_VOLUME, + AUDIO_CMD_GET_MASTER_VOLUME_GAIN, + AUDIO_CMD_GET_CHANNEL_VOLUME_INDEX, + AUDIO_CMD_GET_VOLUME_BAR, + AUDIO_CMD_GET_MUTE, + AUDIO_CMD_GET_EQ_MODE, + AUDIO_CMD_GET_BALANCE, + + VPU_CMD_SET_ELEC_MODE = 0x64, + VPU_CMD_GET_ELEC_MODE, + + CMD_SET_FACTORY_SN = 0x66, + CMD_GET_FACTORY_SN, + CMD_COMMUNICATION_TEST, + CMD_CLR_SETTINGS_DEFAULT, + + CMD_HDMI_REG = 0x70, + CMD_SET_PROJECT_SELECT = 0x71, + CMD_GET_PROJECT_SELECT = 0x72, +} fbc_command_t; + +typedef struct REQUEST_REPLY_CMD { + CCondition WaitReplyCondition; + int WaitDevNo; + int WaitCmd; + int WaitTimeOut; + unsigned char *replyData; + int reDataLen; +} REQUEST_REPLY_S; +class CFbcCommunication: public CThread +{ +public: + static const unsigned char CEC_CMD_WIFI = 0x01; + static const unsigned char CEC_CMD_ETHERNET = 0x02; + static const unsigned char CEC_CMD_3D_TIMING = 0x03; + static const unsigned char CEC_CMD_PANEL_REVERSE = 0x04; + static const unsigned char CEC_CMD_VPU_INIT = 0x08; + static const unsigned char CEC_CMD_VPU_ENABLE = 0x09; + static const unsigned char CEC_CMD_VPU_BYPASS = 0x0a; + static const unsigned char CEC_CMD_VPU_OUTPUT_MUX = 0x0b; + static const unsigned char CEC_CMD_VPU_TIMING = 0x0c; + static const unsigned char CEC_CMD_VPU_SOURCE = 0x0d; + static const unsigned char CEC_CMD_BRIDGE_SW_VER = 0x10; + static const unsigned char CEC_CMD_DEVICE_ID = 0x11; + static const unsigned char CEC_CMD_CLIENT_TYPE = 0x12; + static const unsigned char CEC_CMD_DEVICE_NUM = 0x13; + static const unsigned char CEC_CMD_ACTIVE_KEY = 0x14; + static const unsigned char CEC_CMD_ACTIVE_STATUS = 0x15; + + + static const unsigned char CEC_CMD_DBG_REGISTER_ACCESS = 0x18; + static const unsigned char CEC_CMD_DBG_MEMORY_ACCESS = 0x19; + static const unsigned char CEC_CMD_DBG_SPI_ACCESS = 0x1a; + static const unsigned char CEC_CMD_DBG_VPU_MEMORY_ACCESS = 0x1b; + static const unsigned char CEC_CMD_DBG_MEMORY_TRANSFER = 0x1c; + static const unsigned char CEC_CMD_INPUT_KEY_DOWN = 0x1d; + static const unsigned char CEC_CMD_INPUT_KEY_UP = 0x1e; + static const unsigned char CEC_CMD_REBOOT = 0x1f; + static const unsigned char CEC_CMD_NATURE_LIGHT_ONOFF = 0x20; + static const unsigned char CEC_CMD_USR_BACKLIGHT_ONOFF = 0x21; + static const unsigned char CEC_CMD_USR_BRIGHTNESS = 0x22; + static const unsigned char CEC_CMD_USR_CONTRAST = 0x23; + static const unsigned char CEC_CMD_USR_BACKLIGHT = 0x24; + static const unsigned char CEC_CMD_USR_SATURATION = 0x26; + static const unsigned char CEC_CMD_USR_DYNAMIC_CONTRAST = 0x27; + static const unsigned char CEC_CMD_USR_PICTURE_MODE = 0x28; + static const unsigned char CEC_CMD_TEST_PATTERN_ONOFF = 0x29; + static const unsigned char CEC_CMD_TEST_PATTERN_SELECT = 0x2a; + static const unsigned char CEC_CMD_USER_GAMMA = 0x2f; + static const unsigned char CEC_CMD_DEF_SOUND_MODE = 0x30; + static const unsigned char CEC_CMD_DEF_COLOR_TEMPERATURE = 0x31; + static const unsigned char CEC_CMD_DEF_BRIGHTNESS = 0x32; + static const unsigned char CEC_CMD_DEF_CONTRAST = 0x33; + static const unsigned char CEC_CMD_DEF_COLOR = 0x34; + static const unsigned char CEC_CMD_DEF_BACKLIGHT = 0x36; + static const unsigned char CEC_CMD_AUTO_LUMA_ONOFF = 0x38; + static const unsigned char CEC_CMD_HISTOGRAM = 0x39; + static const unsigned char CEC_CMD_BLEND = 0x3a; + static const unsigned char CEC_CMD_DEMULA = 0x3b; + static const unsigned char CEC_CMD_COLOR_SPACE_CONVERSION = 0x3c; + static const unsigned char CEC_CMD_CM2 = 0x3d; + static const unsigned char CEC_CMD_DEF_RED_GAIN = 0x40; + static const unsigned char CEC_CMD_DEF_GREEN_GAIN = 0x41; + static const unsigned char CEC_CMD_DEF_BLUE_GAIN = 0x42; + static const unsigned char CEC_CMD_DEF_RED_OFFSET = 0x43; + static const unsigned char CEC_CMD_DEF_GREEN_OFFSET = 0x44; + static const unsigned char CEC_CMD_DEF_BLUE_OFFSET = 0x45; + static const unsigned char CEC_CMD_DEF_PRE_RED_OFFSET = 0x46; + static const unsigned char CEC_CMD_DEF_PRE_GREEN_OFFSET = 0x47; + static const unsigned char CEC_CMD_DEF_PRE_BLUE_OFFSET = 0x48; + static const unsigned char CEC_CMD_WHITEBALANCE = 0x4a; + static const unsigned char CEC_CMD_SET_SW_VERSION = 0x57; + static const unsigned char CEC_CMD_3D = 0xd0; + + friend class CTvMsgQueue; + class CFbcMsgQueue: public CMsgQueueThread + { + public: + static const int TV_MSG_COMMON = 0; + static const int TV_MSG_SEND_KEY = 1; + private: + virtual void handleMessage ( CMessage &msg ); + }; + CFbcCommunication(); + ~CFbcCommunication(); + int start(); + //--------------------------------------------- + + //--------------------------------------------- + void testUart(); + int handleCmd(COMM_DEV_TYPE_E fromDev, int cmd[], int *pRetValue); + int sendDataOneway(int devno, unsigned char *pData, int dataLen, int flags); + int sendDataAndWaitReply(int devno, int waitForDevno, int waitForCmd, unsigned char *pData, int dataLen, int timeout, unsigned char *pReData, int *reDataLen, int flags); + int closeAll(); + int SetUpgradeFlag(int flag); + int uartReadStream(unsigned char *retData, int rd_max_len, int timeout); + unsigned int Calcrc32(unsigned int crc, const unsigned char *ptr, unsigned int buf_len); + int cfbc_Set_Gain_Red(COMM_DEV_TYPE_E fromDev, int value); + int cfbc_Get_Gain_Red(COMM_DEV_TYPE_E fromDev, int *value); + int cfbc_Set_Gain_Green(COMM_DEV_TYPE_E fromDev, int value); + int cfbc_Get_Gain_Green(COMM_DEV_TYPE_E fromDev, int *value); + int cfbc_Set_Gain_Blue(COMM_DEV_TYPE_E fromDev, int value); + int cfbc_Get_Gain_Blue(COMM_DEV_TYPE_E fromDev, int *value); + int cfbc_Set_Offset_Red(COMM_DEV_TYPE_E fromDev, int value); + int cfbc_Get_Offset_Red(COMM_DEV_TYPE_E fromDev, int *value); + int cfbc_Set_Offset_Green(COMM_DEV_TYPE_E fromDev, int value); + int cfbc_Get_Offset_Green(COMM_DEV_TYPE_E fromDev, int *value); + int cfbc_Set_Offset_Blue(COMM_DEV_TYPE_E fromDev, int value); + int cfbc_Get_Offset_Blue(COMM_DEV_TYPE_E fromDev, int *value); + int cfbc_Set_WB_Initial(COMM_DEV_TYPE_E fromDev, int value); + int cfbc_Get_WB_Initial(COMM_DEV_TYPE_E fromDev, int *value); + int cfbc_Set_ColorTemp_Mode(COMM_DEV_TYPE_E fromDev, int value); + int cfbc_Get_ColorTemp_Mode(COMM_DEV_TYPE_E fromDev, int *value); + int cfbc_Set_Test_Pattern(COMM_DEV_TYPE_E fromDev, int value); + int cfbc_Get_Test_Pattern(COMM_DEV_TYPE_E fromDev, int *value); + int cfbc_Set_Picture_Mode(COMM_DEV_TYPE_E fromDev, int value); + int cfbc_Get_Picture_Mode(COMM_DEV_TYPE_E fromDev, int *value); + int cfbc_Set_Contrast(COMM_DEV_TYPE_E fromDev, int value); + int cfbc_Get_Contrast(COMM_DEV_TYPE_E fromDev, int *value); + int cfbc_Set_Brightness(COMM_DEV_TYPE_E fromDev, int value); + int cfbc_Get_Brightness(COMM_DEV_TYPE_E fromDev, int *value); + int cfbc_Set_Saturation(COMM_DEV_TYPE_E fromDev, int value); + int cfbc_Get_Saturation(COMM_DEV_TYPE_E fromDev, int *value); + int cfbc_Set_HueColorTint(COMM_DEV_TYPE_E fromDev, int value); + int cfbc_Get_HueColorTint(COMM_DEV_TYPE_E fromDev, int *value); + int cfbc_Set_Backlight(COMM_DEV_TYPE_E fromDev, int value); + int cfbc_Get_Backlight(COMM_DEV_TYPE_E fromDev, int *value); + int cfbc_Set_Source(COMM_DEV_TYPE_E fromDev, int value); + int cfbc_Get_Source(COMM_DEV_TYPE_E fromDev, int *value); + int cfbc_Set_Mute(COMM_DEV_TYPE_E fromDev, int value); + int cfbc_Get_Mute(COMM_DEV_TYPE_E fromDev, int *value); + int cfbc_Set_Volume_Bar(COMM_DEV_TYPE_E fromDev, int value); + int cfbc_Get_Volume_Bar(COMM_DEV_TYPE_E fromDev, int *value); + int cfbc_Set_Balance(COMM_DEV_TYPE_E fromDev, int value); + int cfbc_Get_Balance(COMM_DEV_TYPE_E fromDev, int *value); + int cfbc_Set_Master_Volume(COMM_DEV_TYPE_E fromDev, int value); + int cfbc_Get_Master_Volume(COMM_DEV_TYPE_E fromDev, int *value); + int cfbc_Set_CM(COMM_DEV_TYPE_E fromDev, unsigned char value); + int cfbc_Get_CM(COMM_DEV_TYPE_E fromDev, int *value); + int cfbc_Set_DNLP(COMM_DEV_TYPE_E fromDev, unsigned char value); + int cfbc_Get_DNLP(COMM_DEV_TYPE_E fromDev, int *value); + int cfbc_Set_Gamma(COMM_DEV_TYPE_E fromDev, unsigned char value); + int cfbc_Get_Gamma(COMM_DEV_TYPE_E fromDev, int *value); + int cfbc_Set_WhiteBalance_OnOff(COMM_DEV_TYPE_E fromDev, unsigned char value); + int cfbc_Get_WhiteBalance_OnOff(COMM_DEV_TYPE_E fromDev, int *value); + int cfbc_WhiteBalance_GrayPattern_OnOff(COMM_DEV_TYPE_E fromDev, int onOff); + int cfbc_WhiteBalance_SetGrayPattern(COMM_DEV_TYPE_E fromDev, unsigned char value); + int cfbc_Get_WB_Batch(COMM_DEV_TYPE_E fromDev, unsigned char mode, unsigned char *r_gain, unsigned char *g_gain, unsigned char *b_gain, unsigned char *r_offset, unsigned char *g_offset, unsigned char *b_offset); + int cfbc_Set_WB_Batch(COMM_DEV_TYPE_E fromDev, unsigned char mode, unsigned char r_gain, unsigned char g_gain, unsigned char b_gain, unsigned char r_offset, unsigned char g_offset, unsigned char b_offset); + int cfbc_Set_backlight_onoff(COMM_DEV_TYPE_E fromDev, int value); + int cfbc_Get_backlight_onoff(COMM_DEV_TYPE_E fromDev, int *value); + int cfbc_Set_LVDS_SSG_Set(COMM_DEV_TYPE_E fromDev, int value); + int cfbc_Set_AUTO_ELEC_MODE(COMM_DEV_TYPE_E fromDev, int value); + int cfbc_Get_AUTO_ELEC_MODE(COMM_DEV_TYPE_E fromDev, int *value); + int cfbc_Get_FBC_MAINCODE_Version(COMM_DEV_TYPE_E fromDev, char sw_ver[], char build_time[], char git_ver[], char git_branch[], char build_name[]); + int cfbc_Get_FBC_Get_PANel_INFO(COMM_DEV_TYPE_E fromDev, char panel_model[]); + int cfbc_Set_FBC_panel_power_switch(COMM_DEV_TYPE_E fromDev, int switch_val); + int cfbc_Set_FBC_suspend(COMM_DEV_TYPE_E fromDev, int switch_val); + int cfbc_FBC_Send_Key_To_Fbc(COMM_DEV_TYPE_E fromDev, int keycode, int param); + int cfbc_Get_FBC_PANEL_REVERSE(COMM_DEV_TYPE_E fromDev, int *value); + int cfbc_Get_FBC_PANEL_OUTPUT(COMM_DEV_TYPE_E fromDev, int *value); + int cfbc_Set_FBC_project_id(COMM_DEV_TYPE_E fromDev, int prj_id); + int cfbc_Get_FBC_project_id(COMM_DEV_TYPE_E fromDev, int *prj_id); + int cfbc_SendRebootToUpgradeCmd(COMM_DEV_TYPE_E fromDev, int value); + int cfbc_Set_FBC_User_Setting_Default(COMM_DEV_TYPE_E fromDev, int param); + int cfbc_Set_FBC_Factory_SN(COMM_DEV_TYPE_E fromDev, const char *pSNval) ; + int cfbc_Get_FBC_Factory_SN(COMM_DEV_TYPE_E fromDev, char FactorySN[]); + int cfbc_Set_FBC_Audio_Source(COMM_DEV_TYPE_E fromDev, int value); + + int cfbc_Set_Thermal_state(COMM_DEV_TYPE_E fromDev, int value); + int cfbc_Set_LightSensor_N310(COMM_DEV_TYPE_E fromDev, int value); + int cfbc_Get_LightSensor_N310(COMM_DEV_TYPE_E fromDev, int *value); + int cfbc_Set_Dream_Panel_N310(COMM_DEV_TYPE_E fromDev, int value); + int cfbc_Get_Dream_Panel_N310(COMM_DEV_TYPE_E fromDev, int *value); + int cfbc_Set_MULT_PQ_N310(COMM_DEV_TYPE_E fromDev, int value); + int cfbc_Get_MULT_PQ_N310(COMM_DEV_TYPE_E fromDev, int *value); + int cfbc_Set_MEMC_N310(COMM_DEV_TYPE_E fromDev, int value); + int cfbc_Get_MEMC_N310(COMM_DEV_TYPE_E fromDev, int *value); + +private: + //now,just one item in list,haha... + void showTime(struct timeval *_time); + long getTime(void); + int rmFromRequestList(); + int addToRequestList(); + void initCrc32Table(); + void sendAckCmd(bool isOk); + unsigned int GetCrc32(unsigned char *InStr, unsigned int len); + int processData(COMM_DEV_TYPE_E fromDev, unsigned char *PData, int dataLen); + int uartReadData(unsigned char *retData, int *retLen); + int Fbc_Set_Value_INT8(COMM_DEV_TYPE_E toDev, int cmd_type, int value); + int Fbc_Get_Value_INT8(COMM_DEV_TYPE_E fromDev, int cmd_type, int *value); + int Fbc_Set_Value_INT32(COMM_DEV_TYPE_E toDev, int cmd_type, int value); + int Fbc_Get_BatchValue(COMM_DEV_TYPE_E toDev, unsigned char *cmd_buf, int count); + int Fbc_Set_BatchValue(COMM_DEV_TYPE_E fromDev, unsigned char *cmd_buf, int count); + int cfbc_Set_Get_BatchValue(COMM_DEV_TYPE_E fromDev, unsigned char *cmd_buf, int count, int isSet); + bool threadLoop(); + + int mUpgradeFlag; + CHdmiCec mHdmiCec; + CSerialPort mSerialPort; + Epoll mEpoll; + mutable CMutex mLock; + REQUEST_REPLY_S mReplyList; + //list + epoll_event m_event; + unsigned char *mpRevDataBuf; + unsigned int mCrc32Table[256]; + bool mbSendKeyCode; + CTvInput mTvInput; + CFbcMsgQueue mFbcMsgQueue; + int mbDownHaveSend; + + int mbFbcKeyEnterDown; + nsecs_t mFbcEnterKeyDownTime; +}; + +extern CFbcCommunication *GetSingletonFBC(); + +#endif diff --git a/tvapi/libtv/tv/CFrontEnd.cpp b/tvapi/libtv/tv/CFrontEnd.cpp new file mode 100644 index 0000000..49935b0 --- a/dev/null +++ b/tvapi/libtv/tv/CFrontEnd.cpp @@ -0,0 +1,568 @@ +#include <stdio.h> +#include <unistd.h> +#include <string.h> +#include <fcntl.h> +#include <errno.h> +#include <sys/ioctl.h> +#include <stdlib.h> +#include <malloc.h> +#include <sys/types.h> +#include <dlfcn.h> +#include <time.h> +#include "am_misc.h" +#include "am_debug.h" +#include "CFrontEnd.h" +#include "util.h" +#include "tvin/CTvin.h" +extern "C" { +#include "am_av.h" +#include "am_dmx.h" +#include "linux/videodev2.h" +#include "am_fend_ctrl.h" +} +#define LOG_TAG "CFrontEnd" + +CFrontEnd::CFrontEnd() +{ + mFrontDevID = FE_DEV_ID; + mpObserver = NULL; + mCurFineFreq = 0; + mCurMode = FE_ANALOG; +} + +CFrontEnd::~CFrontEnd() +{ + AM_EVT_Unsubscribe(mFrontDevID, AM_FEND_EVT_STATUS_CHANGED, dmd_fend_callback, NULL); + if (mFrontDevID == FE_DEV_ID) + AM_FEND_Close(mFrontDevID); + mFrontDevID = -1; +} + +int CFrontEnd::Open(int mode) +{ + AM_FEND_OpenPara_t para; + int rc = 0; + + memset(¶, 0, sizeof(AM_FEND_OpenPara_t)); + para.mode = mode; + rc = AM_FEND_Open(mFrontDevID, ¶); + if ((rc == AM_FEND_ERR_BUSY) || (rc == 0)) { + AM_EVT_Subscribe(mFrontDevID, AM_FEND_EVT_STATUS_CHANGED, dmd_fend_callback, this); + LOGD("%s,frontend dev open success!\n", __FUNCTION__); + return 0; + } else { + LOGD("%s,frontend dev open failed! dvb error id is %d\n", __FUNCTION__, rc); + return -1; + } +} + +int CFrontEnd::Close() +{ + int rc = 0; + rc = AM_FEND_Close(mFrontDevID); + + if (rc != 0) { + LOGD("%s,frontend_close fail! dvb error id is %d\n", __FUNCTION__, rc); + return -1; + } else { + LOGD("%s,close frontend is ok\n", __FUNCTION__); + } + return 0; +} + +int CFrontEnd::setMode(int mode) +{ + int rc = 0; + if (mCurMode == mode) return 0; + rc = AM_FEND_SetMode(mFrontDevID, mode); + + if (rc != 0) { + LOGD("%s,front dev set mode failed! dvb error id is %d\n", __FUNCTION__, rc); + return -1; + } + return 0; +} + +int CFrontEnd::setPara(int mode, int freq, int para1, int para2) +{ + int ret = 0; + int buff_size = 32; + char VideoStdBuff[buff_size]; + char audioStdBuff[buff_size]; + + AM_FENDCTRL_DVBFrontendParameters_t dvbfepara; + memset(&dvbfepara, 0, sizeof(AM_FENDCTRL_DVBFrontendParameters_t)); + LOGD("%s,set fe para mode = %d freq=%d p1=%d p2=%d", __FUNCTION__, mode, freq, para1, para2); + dvbfepara.m_type = mode; + switch (mode) { + case FE_OFDM: + dvbfepara.terrestrial.para.frequency = freq; + dvbfepara.terrestrial.para.u.ofdm.bandwidth = (fe_bandwidth_t)para1; + break; + case FE_DTMB: + LOGD("%s,FE_DTMB is support\n", __FUNCTION__); + LOGD("%s,freq = %d, bandwidth = %d\n", __FUNCTION__, freq, para1); + dvbfepara.dtmb.para.frequency = freq; + dvbfepara.dtmb.para.u.ofdm.bandwidth = (fe_bandwidth_t)para1; + break; + case FE_ATSC: + dvbfepara.atsc.para.frequency = freq; + dvbfepara.atsc.para.u.vsb.modulation = (fe_modulation_t)para1; + break; + case FE_QAM: + dvbfepara.cable.para.frequency = freq; + dvbfepara.cable.para.u.qam.symbol_rate = para1; + dvbfepara.cable.para.u.qam.modulation = (fe_modulation_t)para2; + break; + case FE_ANALOG: + LOGD("%s,FE_ANALOG is support\n", __FUNCTION__); + /*para2 is finetune data */ + dvbfepara.analog.para.frequency = freq; + dvbfepara.analog.para.u.analog.std = para1; + dvbfepara.analog.para.u.analog.afc_range = AFC_RANGE; + if (para2 == 0) { + dvbfepara.analog.para.u.analog.flag |= ANALOG_FLAG_ENABLE_AFC; + } else { + dvbfepara.analog.para.u.analog.flag &= ~ANALOG_FLAG_ENABLE_AFC; + } + + printAudioStdStr(para1, audioStdBuff, buff_size); + printVideoStdStr(para1, VideoStdBuff, buff_size); + LOGD("%s,freq = %dHz, video_std = %s, audio_std = %s, fineFreqOffset = %dHz\n", __FUNCTION__, + freq, VideoStdBuff, audioStdBuff, para2); + + break; + } + + ret = AM_FENDCTRL_SetPara(mFrontDevID, &dvbfepara); + + if (ret != 0) { + LOGD("%s,fend set para failed! dvb error id is %d\n", __FUNCTION__, ret); + return -1; + } + return 0; +} + +int CFrontEnd::fineTune(int fineFreq) +{ + int ret = 0; + if (mCurFineFreq == fineFreq) return -1; + + mCurFineFreq = fineFreq; + ret = AM_FEND_FineTune(FE_DEV_ID, fineFreq); + + if (ret != 0) { + LOGD("%s, fail! dvb error id is %d", __FUNCTION__, ret); + return -1; + } + return 0; +} + +int CFrontEnd::GetTSSource(AM_DMX_Source_t *src) +{ + AM_FEND_GetTSSource(mFrontDevID, src); + return 0; +} + +void CFrontEnd::dmd_fend_callback(int dev_no, int event_type, void *param, void *user_data) +{ + CFrontEnd *pFront = (CFrontEnd *)user_data; + if (NULL == pFront) { + LOGD("%s,warnning : dmd_fend_callback NULL == pFront\n", __FUNCTION__); + return ; + } + if (pFront->mpObserver == NULL) { + LOGD("%s,warnning : mpObserver NULL == mpObserver\n", __FUNCTION__); + return; + } + struct dvb_frontend_event *evt = (struct dvb_frontend_event *) param; + if (!evt) + return; + + if (evt->status & FE_HAS_LOCK) { + pFront->mCurSigEv.mCurSigStaus = FEEvent::EVENT_FE_HAS_SIG; + pFront->mCurSigEv.mCurFreq = evt->parameters.frequency; + pFront->mpObserver->onEvent(pFront->mCurSigEv); + } else if (evt->status & FE_TIMEDOUT) { + pFront->mCurSigEv.mCurSigStaus = FEEvent::EVENT_FE_NO_SIG; + pFront->mCurSigEv.mCurFreq = evt->parameters.frequency; + pFront->mpObserver->onEvent(pFront->mCurSigEv); + } +} + +int CFrontEnd::stdAndColorToAudioEnum(int data) +{ + atv_audio_std_t std = CC_ATV_AUDIO_STD_DK; + if (((data & V4L2_STD_PAL_DK) == V4L2_STD_PAL_DK) || + ((data & V4L2_STD_SECAM_DK) == V4L2_STD_SECAM_DK)) { + std = CC_ATV_AUDIO_STD_DK; + } else if ((data & V4L2_STD_PAL_I) == V4L2_STD_PAL_I) { + std = CC_ATV_AUDIO_STD_I; + } else if (((data & V4L2_STD_PAL_BG) == V4L2_STD_PAL_BG) || + ((data & V4L2_STD_SECAM_B) == V4L2_STD_SECAM_B) || + ((data & V4L2_STD_SECAM_G) == V4L2_STD_SECAM_G )) { + std = CC_ATV_AUDIO_STD_BG; + } else if (((data & V4L2_STD_PAL_M) == V4L2_STD_PAL_M) || + ((data & V4L2_STD_NTSC_M) == V4L2_STD_NTSC_M)) { + std = CC_ATV_AUDIO_STD_M; + } else if ((data & V4L2_STD_SECAM_L) == V4L2_STD_SECAM_L) { + std = CC_ATV_AUDIO_STD_L; + } + return std ; +} + +int CFrontEnd::stdAndColorToVideoEnum(int std) +{ + atv_video_std_t video_standard = CC_ATV_VIDEO_STD_PAL; + if ((std & V4L2_COLOR_STD_PAL) == V4L2_COLOR_STD_PAL) { + video_standard = CC_ATV_VIDEO_STD_PAL; + } else if ((std & V4L2_COLOR_STD_NTSC) == V4L2_COLOR_STD_NTSC) { + video_standard = CC_ATV_VIDEO_STD_NTSC; + } else if ((std & V4L2_COLOR_STD_SECAM) == V4L2_COLOR_STD_SECAM) { + video_standard = CC_ATV_VIDEO_STD_SECAM; + } + return video_standard; +} + +v4l2_std_id CFrontEnd::enumToStdAndColor(int videoStd, int audioStd) +{ + v4l2_std_id tmpTunerStd = 0; + if (videoStd == CC_ATV_VIDEO_STD_PAL) { + tmpTunerStd |= V4L2_COLOR_STD_PAL; + if (audioStd == CC_ATV_AUDIO_STD_DK) { + tmpTunerStd |= V4L2_STD_PAL_DK; + } else if (audioStd == CC_ATV_AUDIO_STD_I) { + tmpTunerStd |= V4L2_STD_PAL_I; + } else if (audioStd == CC_ATV_AUDIO_STD_BG) { + tmpTunerStd |= V4L2_STD_PAL_BG; + } else if (audioStd == CC_ATV_AUDIO_STD_M) { + tmpTunerStd |= V4L2_STD_PAL_M; + } + } else if (videoStd == CC_ATV_VIDEO_STD_NTSC) { + tmpTunerStd |= V4L2_COLOR_STD_NTSC; + if (audioStd == CC_ATV_AUDIO_STD_DK) { + tmpTunerStd |= V4L2_STD_PAL_DK; + } else if (audioStd == CC_ATV_AUDIO_STD_I) { + tmpTunerStd |= V4L2_STD_PAL_I; + } else if (audioStd == CC_ATV_AUDIO_STD_BG) { + tmpTunerStd |= V4L2_STD_PAL_BG; + } else if (audioStd == CC_ATV_AUDIO_STD_M) { + tmpTunerStd |= V4L2_STD_NTSC_M; + } + } else if (videoStd == CC_ATV_VIDEO_STD_SECAM) { + tmpTunerStd |= V4L2_COLOR_STD_SECAM; + if (audioStd == CC_ATV_AUDIO_STD_DK) { + tmpTunerStd |= V4L2_STD_SECAM_DK; + } else if (audioStd == CC_ATV_AUDIO_STD_I) { + tmpTunerStd |= V4L2_STD_PAL_I; + } else if (audioStd == CC_ATV_AUDIO_STD_BG) { + tmpTunerStd |= (V4L2_STD_SECAM_B | V4L2_STD_SECAM_G); + } else if (audioStd == CC_ATV_AUDIO_STD_M) { + tmpTunerStd |= V4L2_STD_NTSC_M; + } else if (audioStd == CC_ATV_AUDIO_STD_L) { + tmpTunerStd |= V4L2_STD_SECAM_L; + } + } else if (videoStd == CC_ATV_VIDEO_STD_AUTO) { + tmpTunerStd |= V4L2_COLOR_STD_AUTO; + tmpTunerStd |= V4L2_STD_PAL_DK; + } + return tmpTunerStd; +} + +int CFrontEnd::getPara(frontend_para_set_t *fpara) +{ + int mode; + int ret1, ret2; + + struct dvb_frontend_parameters para; + memset(¶, 0, sizeof(struct dvb_frontend_parameters)); + if ((ret1 = AM_FEND_GetPara(mFrontDevID, ¶)) < 0) { + LOGD("%s,getPara faiture\n", __FUNCTION__ ); + return -1; + + //fpara->mode = fend_mode ; + + } + return 0; +} + +int CFrontEnd::getSNR() +{ + int snr = 0; + AM_FEND_GetSNR(mFrontDevID, &snr); + return snr; +} + +int CFrontEnd::getBER() +{ + int ber = 0; + AM_FEND_GetBER(mFrontDevID, &ber); + return ber; +} + +int CFrontEnd::getStrength() +{ + int Strength = 0; + AM_FEND_GetStrength(mFrontDevID, &Strength); + return Strength; +} + +int CFrontEnd::formatATVFreq(int tmp_freq) +{ + int tmp_val = 25; + int ATV_1MHZ = 1000000; + int ATV_10KHZ = 10000; + + tmp_freq = (tmp_freq / ATV_1MHZ) * ATV_1MHZ + tmp_val * ATV_10KHZ; + + return tmp_freq; +} + +int CFrontEnd::printVideoStdStr(int compStd, char strBuffer[], int buff_size) +{ + memset(strBuffer, 0, buff_size); + int videoStd = stdAndColorToVideoEnum(compStd); + switch (videoStd) { + case CC_ATV_VIDEO_STD_AUTO: + strcpy(strBuffer, "AUTO"); + break; + case CC_ATV_VIDEO_STD_PAL: + strcpy(strBuffer, "PAL"); + break; + case CC_ATV_VIDEO_STD_NTSC: + strcpy(strBuffer, "NTSC"); + break; + case CC_ATV_VIDEO_STD_SECAM: + strcpy(strBuffer, "SECAM"); + break; + default: + strcpy(strBuffer, "UnkownVideo"); + break; + } + + return 0; +} + +int CFrontEnd::printAudioStdStr(int compStd, char strBuffer[], int buff_size) +{ + memset(strBuffer, 0, buff_size); + int audioStd = stdAndColorToAudioEnum(compStd); + switch (audioStd) { + case CC_ATV_AUDIO_STD_DK: + strcpy(strBuffer, "DK"); + break; + case CC_ATV_AUDIO_STD_I: + strcpy(strBuffer, "I"); + break; + case CC_ATV_AUDIO_STD_BG: + strcpy(strBuffer, "BG"); + break; + case CC_ATV_AUDIO_STD_M: + strcpy(strBuffer, "M"); + break; + case CC_ATV_AUDIO_STD_L: + strcpy(strBuffer, "L"); + break; + case CC_ATV_AUDIO_STD_AUTO: + strcpy(strBuffer, "AUTO"); + break; + default: + strcpy(strBuffer, "UnkownAudio"); + break; + } + + return 0; +} + +int CFrontEnd::autoLoadFE() +{ + FILE *fp = NULL; + int ret = -1; + + fp = fopen ( "/sys/class/amlfe/setting", "w" ); + + if ( fp == NULL ) { + LOGW ( "Open /sys/class/amlfe/setting error(%s)!\n", strerror ( errno ) ); + return -1; + } + + ret = fprintf ( fp, "%s", "autoload" ); + + if ( ret < 0 ) { + LOGW ( "autoload FE error(%s)!\n", strerror ( errno ) ); + } + LOGD("autoLoadFE"); + fclose ( fp ); + fp = NULL; + + return ret; +} + +int CFrontEnd::setCvbsAmpOut(int tmp) +{ + int rc = AM_SUCCESS; + rc = AM_FEND_SetCvbsAmpOut(mFrontDevID, tmp); + if (rc == AM_SUCCESS) { + LOGD("%s, sucessful!", __FUNCTION__); + rc = 0; + } else { + LOGD("%s, fail!", __FUNCTION__); + rc = -1; + } + return rc; +} + +int CFrontEnd::setThreadDelay(int delay) +{ + int rc = AM_SUCCESS; + + rc = AM_FEND_SetThreadDelay(mFrontDevID, delay); + if (rc == AM_SUCCESS) { + LOGD("frontend_setThreadDelay sucessful!\n"); + return 0; + } else { + LOGD("frontend_setThreadDelay fail! %d\n\n", rc); + return -1; + } +} + +int CFrontEnd::lock(int frequency, int symbol_rate, int modulation, int bandwidth) +{ + int rt = -1; + struct dvb_frontend_parameters fparam; + struct dvb_frontend_info finfo; + + memset(&fparam, 0, sizeof(struct dvb_frontend_parameters)); + memset(&finfo, 0, sizeof(struct dvb_frontend_info)); + + AM_FEND_GetInfo(mFrontDevID, &finfo); + + if (frequency == 0) + return -1; + fparam.frequency = frequency; + + switch (finfo.type) { + + case FE_QAM: + default: + + if (symbol_rate == 0) + return -1; + fparam.u.qam.symbol_rate = symbol_rate; + + + if (modulation == 0) + return -1; + fparam.u.qam.modulation = (fe_modulation_t)modulation; + + LOGD("mFrontDevID = %d;fre=%d;sym=%d;qam=%d ", + mFrontDevID, fparam.frequency, fparam.u.qam.symbol_rate, fparam.u.qam.modulation); + break; + case FE_OFDM: + case FE_ATSC: + LOGD("mFrontDevID = %d;fre=%d;bw=%d\n ", + mFrontDevID, fparam.frequency, fparam.u.ofdm.bandwidth); + break; + case FE_QPSK: + LOGD("QPSK are not supported.\n "); + break; + case FE_ANALOG: + LOGD("ANALOG is supported.\n "); + fparam.u.analog.std = V4L2_STD_PAL_I; + break; + } + + fe_status_t status; + + rt = AM_FEND_Lock(FE_DEV_ID, &fparam, &status); + + if ((!rt) && (status & FE_HAS_LOCK)) { + LOGD("frontend_lock sucessful!\n"); + return true; + } else { + LOGD("frontend_lock fail %d!\n", rt); + return false; + } +} + +int CFrontEnd::getInfo() +{ + struct dvb_frontend_info finfo; + + AM_FEND_GetInfo(mFrontDevID, &finfo); + + //return fend_info; noitfy FrontEnd message + return 0; +} + + +int CFrontEnd::getStatus() +{ + fe_status_t status; + AM_FEND_GetStatus(mFrontDevID, &status); + + return status; +} +int CFrontEnd::checkStatusOnce() +{ + fe_status_t status; + AM_FEND_GetStatus(mFrontDevID, &status); + LOGD("%s,get status = %x", __FUNCTION__, status); + if (status & FE_HAS_LOCK) { + mCurSigEv.mCurSigStaus = FEEvent::EVENT_FE_HAS_SIG; + mCurSigEv.mCurFreq = 0; + mpObserver->onEvent(mCurSigEv); + } else if (status & FE_TIMEDOUT) { + mCurSigEv.mCurSigStaus = FEEvent::EVENT_FE_NO_SIG; + mCurSigEv.mCurFreq = 0; + mpObserver->onEvent(mCurSigEv); + } + return 0; +} + +int CFrontEnd::stdEnumToCvbsFmt (int videoStd, int audioStd) +{ + tvin_sig_fmt_e cvbs_fmt = TVIN_SIG_FMT_NULL; + + if ( videoStd == CC_ATV_VIDEO_STD_PAL ) { + if ( audioStd == CC_ATV_AUDIO_STD_DK ) { + cvbs_fmt = TVIN_SIG_FMT_CVBS_PAL_I; + } else if ( audioStd == CC_ATV_AUDIO_STD_I ) { + cvbs_fmt = TVIN_SIG_FMT_CVBS_PAL_I; + } else if ( audioStd == CC_ATV_AUDIO_STD_BG ) { + cvbs_fmt = TVIN_SIG_FMT_CVBS_PAL_I; + } else if ( audioStd == CC_ATV_AUDIO_STD_M ) { + cvbs_fmt = TVIN_SIG_FMT_CVBS_PAL_M; + } + } else if ( videoStd == CC_ATV_VIDEO_STD_NTSC ) { + if ( audioStd == CC_ATV_AUDIO_STD_DK ) { + cvbs_fmt = TVIN_SIG_FMT_CVBS_NTSC_M; + } else if ( audioStd == CC_ATV_AUDIO_STD_I ) { + cvbs_fmt = TVIN_SIG_FMT_CVBS_NTSC_M; + } else if ( audioStd == CC_ATV_AUDIO_STD_BG ) { + cvbs_fmt = TVIN_SIG_FMT_CVBS_NTSC_M; + } else if ( audioStd == CC_ATV_AUDIO_STD_M ) { + cvbs_fmt = TVIN_SIG_FMT_CVBS_NTSC_M; + } + } else if ( videoStd == CC_ATV_VIDEO_STD_SECAM ) { + if ( audioStd == CC_ATV_AUDIO_STD_DK ) { + cvbs_fmt = TVIN_SIG_FMT_CVBS_SECAM; + } else if ( audioStd == CC_ATV_AUDIO_STD_I ) { + cvbs_fmt = TVIN_SIG_FMT_CVBS_SECAM; + } else if ( audioStd == CC_ATV_AUDIO_STD_BG ) { + cvbs_fmt = TVIN_SIG_FMT_CVBS_SECAM; + } else if ( audioStd == CC_ATV_AUDIO_STD_M ) { + cvbs_fmt = TVIN_SIG_FMT_CVBS_SECAM; + } else if ( audioStd == CC_ATV_AUDIO_STD_L ) { + cvbs_fmt = TVIN_SIG_FMT_CVBS_SECAM; + } + } else if (CC_ATV_VIDEO_STD_AUTO == videoStd) { + cvbs_fmt = TVIN_SIG_FMT_NULL; + } + return cvbs_fmt; +} + +int CFrontEnd::ClearAnalogFrontEnd() +{ + return this->setPara ( FE_ANALOG, 44250000, V4L2_COLOR_STD_PAL | V4L2_STD_PAL_DK, 0 ); +} diff --git a/tvapi/libtv/tv/CFrontEnd.h b/tvapi/libtv/tv/CFrontEnd.h new file mode 100644 index 0000000..d562cfc --- a/dev/null +++ b/tvapi/libtv/tv/CFrontEnd.h @@ -0,0 +1,160 @@ +#ifndef ANDROID_FRONTEND_H +#define ANDROID_FRONTEND_H +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include "CTvLog.h" +#include "CTvEv.h" +extern "C" { +#include "am_fend.h" +#include "am_vout.h" +#include "linux/dvb/frontend.h" +} +//for app +typedef enum atv_audo_std_s { + CC_ATV_AUDIO_STD_START = 0, + CC_ATV_AUDIO_STD_DK = 0, + CC_ATV_AUDIO_STD_I, + CC_ATV_AUDIO_STD_BG, + CC_ATV_AUDIO_STD_M, + CC_ATV_AUDIO_STD_L, + CC_ATV_AUDIO_STD_AUTO, + CC_ATV_AUDIO_STD_END = CC_ATV_AUDIO_STD_AUTO, + CC_ATV_AUDIO_STD_MUTE, +} atv_audio_std_t; +//for app +typedef enum atv_video_std_s { + CC_ATV_VIDEO_STD_START = 0, + CC_ATV_VIDEO_STD_AUTO = 0, + CC_ATV_VIDEO_STD_PAL, + CC_ATV_VIDEO_STD_NTSC, + CC_ATV_VIDEO_STD_SECAM, + CC_ATV_VIDEO_STD_END = CC_ATV_VIDEO_STD_SECAM, +} atv_video_std_t; + + +//from kernel +/*COLOR MODULATION TYPE*/ +static const v4l2_std_id V4L2_COLOR_STD_PAL = ((v4l2_std_id)0x04000000); +static const v4l2_std_id V4L2_COLOR_STD_NTSC = ((v4l2_std_id)0x08000000); +static const v4l2_std_id V4L2_COLOR_STD_SECAM = ((v4l2_std_id)0x10000000); +//virtual +static const v4l2_std_id V4L2_COLOR_STD_AUTO = ((v4l2_std_id)0x02000000); + +typedef struct frontend_para_set_s { + fe_type_t mode; + int freq; + atv_video_std_t videoStd; + atv_audio_std_t audioStd; + int para1; + int para2; +} frontend_para_set_t; + +typedef struct atv_channel_info_s { + int finefreq; + atv_video_std_t videoStd; + atv_audio_std_t audioStd; + int isAutoStd; +} atv_channel_info_t; + +typedef struct dtv_channel_info_s { + int strength; + int quality; + int ber; +} dtv_channel_info_t; + +typedef struct channel_info_s { + int freq; + union { + atv_channel_info_t atvChanInfo; + dtv_channel_info_t dtvChanInfo; + } uInfo; +} channel_info_t; + +class CFrontEnd +{ +public: + + static const int FE_DEV_ID = 0; + static const int AFC_RANGE = 1000000; + + CFrontEnd(); + ~CFrontEnd(); + + int Open(int mode); + int Close(); + int setMode(int mode); + int fineTune(int freq); + int formatATVFreq(int freq); + int GetTSSource(AM_DMX_Source_t *src); + int setPara(int frequency, int symbol_rate, int modulation, int bandwidth); + int ClearAnalogFrontEnd(); + int autoLoadFE(); + + static int stdAndColorToAudioEnum(int std); + static int stdAndColorToVideoEnum(int std); + static int printVideoStdStr(int videoStd, char strBuffer[], int buff_size); + static int printAudioStdStr(int audioStd, char strBuffer[], int buff_size); + static v4l2_std_id enumToStdAndColor(int videoStd, int audioStd); + static int stdEnumToCvbsFmt (int videoStd, int audioStd); + class FEEvent: public CTvEv + { + public: + //static const int EVENT_FE_HAS_SIG = 0X01; /* found something above the noise level */ + //static const int EVENT_FE_HAS_CARRIER = 0x02; /* found a DVB signal */ + //static const int EVENT_FE_HAS_VITERBI = 0X04; /* FEC is stable */ + //static const int EVENT_FE_HAS_SYNC = 0X08; /* found sync bytes */ + // static const int EVENT_FE_HAS_LOCK = 0X10; /* everything's working... */ + //static const int EVENT_FE_HAS_TIMEOUT = 0X20; /* no lock within the last ~2 seconds */ + //static const int EVENT_FE_REINIT = 0X40; /* frontend was reinitialized, */ + static const int EVENT_FE_HAS_SIG = 0x01; + static const int EVENT_FE_NO_SIG = 0x02; + static const int EVENT_FE_INIT = 0x03; + + FEEvent(): CTvEv(CTvEv::TV_EVENT_SIGLE_DETECT) + { + } + ~FEEvent() + { + } + int mCurSigStaus; + int mCurFreq; + }; + + class IObserver + { + public: + IObserver() {}; + virtual ~IObserver() {}; + virtual void onEvent(const FEEvent &ev) = 0; + }; + + int setObserver(IObserver *ob) + { + mpObserver = ob; + return 0; + } + + int getSNR(); + int getBER(); + int getInfo(); + int getStatus(); + int checkStatusOnce(); + int getStrength(); + int setCvbsAmpOut(int amp); + int setThreadDelay(int delay) ; + int getPara(frontend_para_set_t *fpara); + int lock(int frequency, int symbol_rate, int modulation, int bandwidth); +private: + int mFrontDevID; + int mDemuxDevID; + int mTvPlayDevID; + int mCurFineFreq; + IObserver *mpObserver; + FEEvent mCurSigEv; + int mCurMode; + static void dmd_fend_callback(int dev_no, int event_type, void *param, void *user_data); +}; +#endif // ANDROID_FRONTEND_H + diff --git a/tvapi/libtv/tv/CTv.cpp b/tvapi/libtv/tv/CTv.cpp new file mode 100644 index 0000000..3c05df9 --- a/dev/null +++ b/tvapi/libtv/tv/CTv.cpp @@ -0,0 +1,5385 @@ +// +// +// amlogic 2013 +// +// @ Project : tv +// @ File Name : CTv.cpp +// @ Date : 2013-11 +// @ Author : +#include <stdio.h> +#include <unistd.h> +#include <fcntl.h> +#include <dirent.h> +#include <am_epg.h> +#include <am_mem.h> +#include "CTvDatabase.h" +#include <stdlib.h> +#include <string.h> +#include <malloc.h> +#include <pthread.h> +#include <sys/types.h> +#include <errno.h> +#include <dlfcn.h> +#include <cutils/properties.h> +#include <cutils/log.h> +#include <cutils/android_reboot.h> +#include <utils/threads.h> +#include <time.h> +#include <sys/prctl.h> +#include <getopt.h> +#include <errno.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <stdlib.h> +#ifdef ANDROID +#include <termios.h> +#endif +#include <string.h> +#include <signal.h> + +#include "../version/version.h" +#include "../tvsetting/CTvSetting.h" +#include "../tvutils/tvutils.h" +#include "../tvconfig/tvconfig.h" +#include "../tvutils/CFile.h" +#include <hardware_legacy/power.h> +#include "../tvutils/serial_operate.h" +#include <xxxconfig.h> + +extern "C" { +#include "am_ver.h" +#include "am_misc.h" +#include "am_debug.h" +#include "am_fend.h" +} + +#include <math.h> +#include <sys/ioctl.h> + +#include "CTv.h" + +#define LOG_TAG "CTv" + +using namespace android; + +// Called each time a message is logged. +static void sqliteLogCallback(void *data, int iErrCode, const char *zMsg) +{ + LOGD( "showbo sqlite (%d) %s\n", iErrCode, zMsg); +} + + + +CTv::CTv() : mSigDetectThread ( &mTvin ), mSourceConnectDetectThread(&mTvin), mHDMIRxCEC ( &mTvin ), mTvScanner ( &mTvin ), mTvMsgQueue(this), mAutoBackLight( &mVpp, &mTvin ) +{ + //mpClient = pClient; + //copy file to param + if ( Tv_Utils_IsFileExist ( TV_CONFIG_FILE_SYSTEM_PATH ) == 0 ) { + if ( Tv_Utils_IsFileExist ( TV_CONFIG_FILE_PARAM_PATH ) != 0 ) { + CFile file ( TV_CONFIG_FILE_SYSTEM_PATH ); + + if ( file.copyTo ( TV_CONFIG_FILE_PARAM_PATH ) != 0 ) { + LOGE ( "%s, copy file = %s , error", __FUNCTION__, TV_CONFIG_FILE_PARAM_PATH ); + } + } + } + + if ( Tv_Utils_IsFileExist ( TV_CHANNEL_LIST_SYSTEM_PATH ) == 0 ) { + if ( Tv_Utils_IsFileExist ( TV_CHANNEL_LIST_PARAM_PATH ) != 0 ) { + CFile file ( TV_CHANNEL_LIST_SYSTEM_PATH ); + + if ( file.copyTo ( TV_CHANNEL_LIST_PARAM_PATH ) != 0 ) { + LOGE ( "%s, copy file = %s , error", __FUNCTION__, TV_CHANNEL_LIST_PARAM_PATH ); + } + } + } + + //ssm + if ( Tv_Utils_IsFileExist ( TV_SSM_DATA_SYSTEM_PATH ) == 0 ) { + if ( Tv_Utils_IsFileExist ( TV_SSM_DATA_PARAM_PATH ) != 0 ) { + CFile file ( TV_SSM_DATA_SYSTEM_PATH ); + + if ( file.copyTo ( TV_SSM_DATA_PARAM_PATH ) != 0 ) { + LOGE ( "%s, copy file = %s , error", __FUNCTION__, TV_SSM_DATA_PARAM_PATH ); + } + } + } + + AM_EVT_Init(); + mTvEpg.setObserver ( &mTvMsgQueue ); + mpObserver = NULL; + audio_sr = 0; + mIsFbc = false; + dtv_auto_3d_flag = 0; + m_autoset_displayfreq = false; + m_cur_set_info_fmt = TVIN_SIG_FMT_CVBS_PAL_I; + + tv_config_load ( TV_CONFIG_FILE_PATH ); + sqlite3_config (SQLITE_CONFIG_SERIALIZED); + sqlite3_config(SQLITE_CONFIG_LOG, &sqliteLogCallback, (void *)1); + sqlite3_soft_heap_limit(8 * 1024 * 1024); + // Initialize SQLite. + sqlite3_initialize(); + CTvDatabase::GetTvDb()->InitTvDb ( TV_DB_PATH ); + if ( CTvDimension::isDimensionTblExist() == false ) { + CTvDimension::builtinAtscDimensions(); + } + + CTvSettingLoad(); + + mDtvScanRunningStatus = DTV_SCAN_RUNNING_NORMAL; + + m_sig_stable_nums = 0; + m_is_set_hdmi_edid = false; + m_cur_playing_prog_id = -1; + + mSigDetectThread.setObserver ( this ); + mSourceConnectDetectThread.setObserver ( this ); + mHDMIRxCEC.setObserver(this); + mFrontDev.setObserver ( &mTvMsgQueue ); + mpUpgradeFBC = NULL; + if (GetPlatformHaveFBCFlag() == 1) { + mIsFbc = true; + + mpUpgradeFBC = new CUpgradeFBC(); + mpUpgradeFBC->setObserver(this); + } + mSerialA.setObserver(this); + mSerialB.setObserver(this); + mSerialC.setObserver(this); + mAv.setObserver(&mTvMsgQueue); + mTvAction = mTvAction & TV_ACTION_NULL; + mTvStatus = TV_INIT_ED; + + print_version_info(); +}; + +CTv::~CTv() +{ + int iRet; + mpObserver = NULL; + CTvSettingunLoad(); + CTvDatabase::deleteTvDb(); + tv_config_unload(); + mAv.Close(); + mTvStatus = TV_INIT_ED; + mFrontDev.Close(); + + if (mpUpgradeFBC != NULL) { + delete mpUpgradeFBC; + mpUpgradeFBC = NULL; + } +} + +void CTv::onEvent ( const CTvScanner::ScannerEvent &ev ) +{ + LOGD ( "%s, CTv::onEvent lockStatus = %d type = %d\n", __FUNCTION__, ev.mLockedStatus, ev.mType ); + + if ( mDtvScanRunningStatus == DTV_SCAN_RUNNING_ANALYZE_CHANNEL ) { + if ( ev.mType == CTvScanner::ScannerEvent::EVENT_SCAN_END ) { + CMessage msg; + msg.mType = CTvMsgQueue::TV_MSG_STOP_ANALYZE_TS; + msg.mpData = this; + mTvMsgQueue.sendMsg ( msg ); + } else if ( ev.mType == CTvScanner::ScannerEvent::EVENT_STORE_END ) { + CTvEpg::EpgEvent epgev; + epgev.type = CTvEpg::EpgEvent::EVENT_CHANNEL_UPDATE_END; + mDtvScanRunningStatus = DTV_SCAN_RUNNING_NORMAL; + sendTvEvent ( epgev ); + } + } else { + sendTvEvent ( ev ); + } +} + +void CTv::onEvent ( const CFrontEnd::FEEvent &ev ) +{ + LOGD ( "%s, FE event type = %d tvaction=%x", __FUNCTION__, ev.mCurSigStaus, mTvAction); + if (mTvAction & TV_ACTION_SCANNING) return; + + //前端事件响应处理 + if ( ev.mCurSigStaus == CFrontEnd::FEEvent::EVENT_FE_HAS_SIG ) { //作为信号稳定 + if (/*m_source_input == SOURCE_TV || */m_source_input == SOURCE_DTV && (mTvAction & TV_ACTION_PLAYING)) { //atv and other tvin source not to use it, and if not playing, not use have sig + Vpp_SetDisplayMode ( mVpp.Tv_GetDisplayMode ( CTvin::Tvin_SourceInputToSourceInputType(m_source_input) ), CTvin::Tvin_SourceInputToSourceInputType(m_source_input), mSigDetectThread.getCurSigInfo().fmt); + if ( m_win_mode == PREVIEW_WONDOW ) { + mAv.setVideoAxis(m_win_pos.x1, m_win_pos.y1, m_win_pos.x2, m_win_pos.y2); + mAv.setVideoScreenMode ( CAv::VIDEO_WIDEOPTION_FULL_STRETCH ); + } + + if ( m_autoset_displayfreq) { + mTvin.VDIN_SetDisplayVFreq ( 50, mAv.getVideoDisplayResolution() , mIsFbc); + } + TvEvent::SignalInfoEvent ev; + ev.mStatus = TVIN_SIG_STATUS_STABLE; + ev.mTrans_fmt = TVIN_TFMT_2D; + ev.mFmt = TVIN_SIG_FMT_NULL; + ev.mReserved = 0; + sendTvEvent ( ev ); + mAv.EnableVideoAuto(); + mTvAudio.SetAudioMuteForTv ( CC_AUDIO_UNMUTE ); + } + } else if ( ev.mCurSigStaus == CFrontEnd::FEEvent::EVENT_FE_NO_SIG ) { //作为信号消失 + if (/*m_source_input == SOURCE_TV || */m_source_input == SOURCE_DTV && (mTvAction & TV_ACTION_PLAYING)) { //just playing + mAv.DisableVideoWithBlueColor(); + // + TvEvent::SignalInfoEvent ev; + ev.mStatus = TVIN_SIG_STATUS_NOSIG; + ev.mTrans_fmt = TVIN_TFMT_2D; + ev.mFmt = TVIN_SIG_FMT_NULL; + ev.mReserved = 0; + sendTvEvent ( ev ); + } + } + +} + +void CTv::onEvent ( const CTvEpg::EpgEvent &ev ) +{ + switch ( ev.type ) { + case CTvEpg::EpgEvent::EVENT_TDT_END: + LOGD ( "%s, CTv::onEvent epg time = %ld", __FUNCTION__, ev.time ); + mTvTime.setTime ( ev.time ); + break; + + case CTvEpg::EpgEvent::EVENT_CHANNEL_UPDATE: { + LOGD ( "%s, CTv:: onEvent channel update", __FUNCTION__ ); + CMessage msg; + msg.mType = CTvMsgQueue::TV_MSG_START_ANALYZE_TS; + msg.mpData = this; + mCurAnalyzeTsChannelID = ev.channelID; + mTvMsgQueue.sendMsg ( msg ); + break; + } + + default: + break; + } + + sendTvEvent ( ev ); +} + + +void CTv::onEvent(const CAv::AVEvent &ev) +{ + LOGD("AVEvent = %d", ev.type); + switch ( ev.type ) { + case CAv::AVEvent::EVENT_AV_STOP: { + break; + } + case CAv::AVEvent::EVENT_AV_RESUEM: { + mAv.EnableVideoAuto(); + TvEvent::AVPlaybackEvent AvPlayBackEvt; + AvPlayBackEvt.mMsgType = TvEvent::AVPlaybackEvent::EVENT_AV_PLAYBACK_RESUME; + AvPlayBackEvt.mProgramId = ( int ) ev.param; + sendTvEvent(AvPlayBackEvt ); + break; + } + case CAv::AVEvent::EVENT_AV_SCAMBLED: { + mAv.DisableVideoWithBlueColor(); + TvEvent::AVPlaybackEvent AvPlayBackEvt; + AvPlayBackEvt.mMsgType = TvEvent::AVPlaybackEvent::EVENT_AV_SCAMBLED; + AvPlayBackEvt.mProgramId = ( int ) ev.param; + sendTvEvent(AvPlayBackEvt ); + break; + } + case CAv::AVEvent::EVENT_AV_UNSUPPORT: { + LOGD("To AVS or AVS+ format");//just avs format, not unsupport, and avs avs+ + break; + } + default: + break; + } +} + +CTv::CTvMsgQueue::CTvMsgQueue(CTv *tv) +{ + mpTv = tv; +} + +CTv::CTvMsgQueue::~CTvMsgQueue() +{ +} + +void CTv::CTvMsgQueue::handleMessage ( CMessage &msg ) +{ + LOGD ( "%s, CTv::CTvMsgQueue::handleMessage type = %d", __FUNCTION__, msg.mType ); + + switch ( msg.mType ) { + case TV_MSG_COMMON: + break; + + case TV_MSG_STOP_ANALYZE_TS: { + //mpTv->Tv_Stop_Analyze_Ts(); + break; + } + + case TV_MSG_START_ANALYZE_TS: { + //mpTv->Tv_Start_Analyze_Ts ( pTv->mCurAnalyzeTsChannelID ); + break; + } + + case TV_MSG_CHECK_FE_DELAY: { + mpTv->mFrontDev.checkStatusOnce(); + break; + } + case TV_MSG_AV_EVENT: { + mpTv->onEvent(*((CAv::AVEvent *)(msg.mpPara))); + break; + } + case TV_MSG_FE_EVENT: { + mpTv->onEvent(*((CFrontEnd::FEEvent *)(msg.mpPara))); + break; + } + case TV_MSG_SCAN_EVENT: { + mpTv->onEvent(*((CTvScanner::ScannerEvent *)(msg.mpPara))); + break; + } + case TV_MSG_EPG_EVENT: { + mpTv->onEvent(*((CTvEpg::EpgEvent *)(msg.mpPara))); + break; + } + + default: + break; + } +} + + +void CTv::CTvMsgQueue::onEvent ( const CTvScanner::ScannerEvent &ev ) +{ + CMessage msg; + msg.mDelayMs = 0; + msg.mType = CTvMsgQueue::TV_MSG_SCAN_EVENT; + memcpy(msg.mpPara, &ev, sizeof(ev)); + this->sendMsg ( msg ); +} + +void CTv::CTvMsgQueue::onEvent ( const CFrontEnd::FEEvent &ev ) +{ + CMessage msg; + msg.mDelayMs = 0; + msg.mType = CTvMsgQueue::TV_MSG_FE_EVENT; + memcpy(msg.mpPara, &ev, sizeof(ev)); + this->sendMsg ( msg ); +} + +void CTv::CTvMsgQueue::onEvent ( const CTvEpg::EpgEvent &ev ) +{ + CMessage msg; + msg.mDelayMs = 0; + msg.mType = CTvMsgQueue::TV_MSG_EPG_EVENT; + memcpy(msg.mpPara, &ev, sizeof(ev)); + this->sendMsg ( msg ); +} + + +void CTv::CTvMsgQueue::onEvent(const CAv::AVEvent &ev) +{ + CMessage msg; + msg.mDelayMs = 0; + msg.mType = CTvMsgQueue::TV_MSG_AV_EVENT; + memcpy(msg.mpPara, &ev, sizeof(ev)); + this->sendMsg ( msg ); +} + +int CTv::setTvObserver ( TvIObserver *ob ) +{ + mpObserver = ob; + return 0; +} + +void CTv::sendTvEvent ( const CTvEv &ev ) +{ + //AutoMutex lock(mLock); + /* send sigstate to AutoBackLight */ + if (ev.getEvType() == CTvEv::TV_EVENT_SIGLE_DETECT) { + TvEvent::SignalInfoEvent *pEv = (TvEvent::SignalInfoEvent *)(&ev); + if (pEv->mStatus == TVIN_SIG_STATUS_STABLE) { + mAutoBackLight.updateSigState(mAutoBackLight.SIG_STATE_STABLE); + } else { + mAutoBackLight.updateSigState(mAutoBackLight.SIG_STATE_NOSIG); + } + } + + LOGD ( "%s, tvaction=%x", __FUNCTION__, mTvAction); + if ((mTvAction & TV_ACTION_SCANNING) && (ev.getEvType() == CTvEv::TV_EVENT_SIGLE_DETECT)) { + LOGD("%s, when scanning, not send sig detect event", __FUNCTION__); + return; + } + if ( mpObserver != NULL ) { + mpObserver->onTvEvent ( ev ); + } + + return; +} + +int CTv::ClearAnalogFrontEnd() +{ + return mFrontDev.ClearAnalogFrontEnd (); +} + +int CTv::dtvAutoScan() +{ + AutoMutex lock ( mLock ); + mTvAction = mTvAction | TV_ACTION_SCANNING; + mTvEpg.leaveChannel(); + mAv.StopTS (); + mAv.DisableVideoWithBlueColor(); + CTvProgram::CleanAllProgramBySrvType ( CTvProgram::TYPE_DTV ); + CTvProgram::CleanAllProgramBySrvType ( CTvProgram::TYPE_RADIO ); + CTvEvent::CleanAllEvent(); + mTvScanner.setObserver ( &mTvMsgQueue ); + mDtvScanRunningStatus = DTV_SCAN_RUNNING_NORMAL; + mFrontDev.Open(FE_DTMB); + mTvScanner.autoDtmbScan();//dtmb + return 0; +} + +int CTv::dtvCleanProgramByFreq ( int freq ) +{ + int iOutRet = 0; + CTvChannel channel; + iOutRet = CTvChannel::SelectByFreq ( freq, channel ); + if ( -1 == iOutRet ) { + LOGD ( "%s, Warnning: Current Freq not have program info in the ts_table\n", __FUNCTION__ ); + } + + iOutRet == CTvProgram::deleteChannelsProgram ( channel ); + return iOutRet; +} + +int CTv::dtvManualScan (int beginFreq, int endFreq, int modulation) +{ + AutoMutex lock ( mLock ); + mTvAction = mTvAction | TV_ACTION_SCANNING; + mTvEpg.leaveChannel(); + mAv.StopTS (); + mAv.DisableVideoWithBlueColor(); + CTvChannel::DeleteBetweenFreq(beginFreq, endFreq); + mTvScanner.setObserver ( &mTvMsgQueue ); + mDtvScanRunningStatus = DTV_SCAN_RUNNING_NORMAL; + mFrontDev.Open(FE_DTMB); + int iOutRet = mTvScanner.manualDtmbScan (beginFreq, endFreq, modulation); //dtmb + return iOutRet; +} + +int CTv::dtvAutoScanAtscLock(int attenna, int videoStd, int audioStd) +{ + //showboz + int minScanFreq, maxScanFreq, vStd, aStd; + vStd = CC_ATV_VIDEO_STD_PAL; + aStd = CC_ATV_AUDIO_STD_DK; + v4l2_std_id stdAndColor = mFrontDev.enumToStdAndColor(vStd, aStd); + + AutoMutex lock ( mLock ); + mTvAction = mTvAction | TV_ACTION_SCANNING; + mTvEpg.leaveChannel(); + mAv.StopTS (); + mAv.DisableVideoWithBlueColor(); + CTvProgram::CleanAllProgramBySrvType ( CTvProgram::TYPE_DTV ); + CTvProgram::CleanAllProgramBySrvType ( CTvProgram::TYPE_RADIO ); + CTvEvent::CleanAllEvent(); + mTvScanner.setObserver ( &mTvMsgQueue ); + mDtvScanRunningStatus = DTV_SCAN_RUNNING_NORMAL; + mFrontDev.Open(FE_ATSC); + mTvScanner.autoAtscScan(CTvScanner::AM_ATSC_ATTENNA_TYPE_AIR, stdAndColor);//dtmb + return 0; +} + +//searchType 0:not 256 1:is 256 Program +int CTv::atvAutoScan(int videoStd, int audioStd, int searchType) +{ + int minScanFreq, maxScanFreq, vStd, aStd; + AutoMutex lock ( mLock ); + mAv.DisableVideoWithBlueColor(); + mTvAction = mTvAction | TV_ACTION_SCANNING; + mTvScanner.setObserver ( &mTvMsgQueue ); + mTvAudio.SetAudioMuteForTv ( CC_AUDIO_MUTE ); + getATVMinMaxFreq (&minScanFreq, &maxScanFreq ); + if ( minScanFreq == 0 || maxScanFreq == 0 || minScanFreq > maxScanFreq ) { + LOGE ( "%s, auto scan freq set is error min=%d, max=%d", __FUNCTION__, minScanFreq, maxScanFreq ); + return -1; + } + //if set std null AUTO, use default PAL/DK + //if(videoStd == CC_ATV_VIDEO_STD_AUTO) { + // vStd = CC_ATV_VIDEO_STD_PAL; + // aStd = CC_ATV_AUDIO_STD_DK; + //} else { + vStd = videoStd; + aStd = audioStd; + //} + tvin_port_t source_port = mTvin.Tvin_GetSourcePortBySourceInput(SOURCE_TV); + mTvin.VDIN_OpenPort ( source_port ); + LOGD("%s, atv auto scan vstd=%d, astd=%d ", __FUNCTION__, vStd, aStd); + v4l2_std_id stdAndColor = mFrontDev.enumToStdAndColor(vStd, aStd); + + int fmt = CFrontEnd::stdEnumToCvbsFmt (vStd, aStd); + mTvin.AFE_SetCVBSStd ( ( tvin_sig_fmt_t ) fmt ); + m_cur_set_info_fmt = ( tvin_sig_fmt_t )fmt; + + if (searchType == 0) { + CTvProgram::CleanAllProgramBySrvType ( CTvProgram::TYPE_ATV ); + } else if (searchType == 1) { //type for skyworth, and insert 256 prog, and just update ts table + } + minScanFreq = mFrontDev.formatATVFreq ( minScanFreq ); + maxScanFreq = mFrontDev.formatATVFreq ( maxScanFreq ); + LOGD("%s, atv auto scan vstd=%d, astd=%d stdandcolor=%lld", __FUNCTION__, vStd, aStd, stdAndColor); + mSigDetectThread.setVdinNoSigCheckKeepTimes(1000, false); + mFrontDev.Open(FE_ANALOG); + mTvScanner.autoAtvScan ( minScanFreq, maxScanFreq, stdAndColor, searchType ); + return 0; +} + +int CTv::clearAllProgram(int arg0) +{ + CTvProgram::CleanAllProgramBySrvType ( CTvProgram::TYPE_ATV ); + CTvProgram::CleanAllProgramBySrvType ( CTvProgram::TYPE_TV ); + CTvProgram::CleanAllProgramBySrvType ( CTvProgram::TYPE_DTV ); + CTvProgram::CleanAllProgramBySrvType ( CTvProgram::TYPE_RADIO); + return 0; +} + +int CTv::atvMunualScan ( int startFreq, int endFreq, int videoStd, int audioStd, int store_Type , int channel_num ) +{ + int minScanFreq, maxScanFreq, vStd, aStd; + + minScanFreq = mFrontDev.formatATVFreq ( startFreq ); + maxScanFreq = mFrontDev.formatATVFreq ( endFreq ); + if ( minScanFreq == 0 || maxScanFreq == 0 ) { + LOGE ( "%s, munual scan freq set is error min=%d, max=%d", __FUNCTION__, minScanFreq, maxScanFreq ); + return -1; + } + + //if set std null AUTO, use default PAL/DK + //if(videoStd == CC_ATV_VIDEO_STD_AUTO) { + // vStd = CC_ATV_VIDEO_STD_PAL; + // aStd = CC_ATV_AUDIO_STD_DK; + // } else { + vStd = videoStd; + aStd = audioStd; + // } + + AutoMutex lock ( mLock ); + mAv.DisableVideoWithBlueColor(); + mTvAction = mTvAction | TV_ACTION_SCANNING; + mTvScanner.setObserver ( &mTvMsgQueue ); + + mTvAudio.SetAudioMuteForTv ( CC_AUDIO_MUTE ); + v4l2_std_id stdAndColor = mFrontDev.enumToStdAndColor(vStd, aStd); + + + tvin_port_t source_port = mTvin.Tvin_GetSourcePortBySourceInput(SOURCE_TV); + mTvin.VDIN_OpenPort ( source_port ); + + int fmt = CFrontEnd::stdEnumToCvbsFmt (vStd, aStd); + mTvin.AFE_SetCVBSStd ( ( tvin_sig_fmt_t ) fmt ); + m_cur_set_info_fmt = ( tvin_sig_fmt_t )fmt; + LOGD("%s, atv manual scan vstd=%d, astd=%d stdandcolor=%lld", __FUNCTION__, videoStd, audioStd, stdAndColor); + mFrontDev.Open(FE_ANALOG); + return mTvScanner.ATVManualScan ( minScanFreq, maxScanFreq, stdAndColor, store_Type, channel_num); +} + +int CTv::getVideoFormatInfo ( int *pWidth, int *pHeight, int *pFPS, int *pInterlace ) +{ + int iOutRet = -1; + AM_AV_VideoStatus_t video_status; + + do { + if ( NULL == pWidth || NULL == pHeight || NULL == pFPS || NULL == pInterlace ) { + break; + } + + iOutRet = mAv.GetVideoStatus (&video_status ); + + if ( AM_SUCCESS != iOutRet ) { + LOGD ( "%s, ERROR: Cann't Get video format info\n", __FUNCTION__); + break; + } + + *pWidth = video_status.src_w; + *pHeight = video_status.src_h; + *pFPS = video_status.fps; + *pInterlace = video_status.interlaced; + //LOGD("%s, w : %d h : %d fps : %d interlaced: %d\n", __FUNCTION__, video_status.src_w,video_status.src_h,video_status.fps,video_status.interlaced); + } while ( false ); + + return iOutRet; + +} + +int CTv::stopScanLock() +{ + AutoMutex lock ( mLock ); + return stopScan(); +} + +int CTv::stopScan() +{ + if (!(mTvAction & TV_ACTION_SCANNING)) { + LOGD("%s, tv not scanning ,return\n", __FUNCTION__); + return 0; + } + mSigDetectThread.requestAndWaitPauseDetect(); + mTvEpg.leaveChannel(); + mTvScanner.stopScan(); + mFrontDev.Close(); + mTvAction = mTvAction & ~TV_ACTION_SCANNING; + return 0; +} + +int CTv::playProgramLock ( int progId ) +{ + AutoMutex lock ( mLock ); + CTvProgram prog; + int ret = CTvProgram::selectByID ( progId, prog ); + + if ( ret != 0 ) { + return -1; + } + int type = prog.getProgType(); + LOGD ( "%s, blackout = %dprog type = %d id = %d name = %s\n", __FUNCTION__, m_blackout_enable, type, progId, prog.getName().string() ); + if (m_blackout_enable == 1) { + mAv.EnableVideoBlackout(); + } else if (m_blackout_enable == 0) { + mAv.DisableVideoBlackout(); + } + + mTvAction = mTvAction | TV_ACTION_PLAYING; + m_cur_playing_prog_id = progId; + mFrontDev.Open(FE_ANALOG); + if ( m_source_input == SOURCE_TV && type == CTvProgram::TYPE_ATV ) { + playAtvProgram ( progId ); + } else if ( m_source_input == SOURCE_DTV && ( type == CTvProgram::TYPE_DTV || type == CTvProgram::TYPE_RADIO ) ) { + playDtmbProgram ( progId ); + } else { + LOGD ( "%s, source(%d) != type(%d),not play\n", __FUNCTION__, m_source_input, type ); + } + //just for ui,left/right/stereo + setAudioChannel((int)AM_AOUT_OUTPUT_STEREO); + return 0; +} + +int CTv::playDvbcProgram ( int progId ) +{ + LOGD ( "%s, progId = %d\n", __FUNCTION__, progId ); + + CTvProgram prog; + int ret = CTvProgram::selectByID ( progId, prog ); + + if ( ret != 0 ) { + return -1; + } + + LOGD ( "%s, prog name = %s\n", __FUNCTION__, prog.getName().string() ); + CTvChannel channel; + prog.getChannel ( channel ); + + mFrontDev.setPara ( channel.getMode(), channel.getFrequency(), channel.getSymbolRate(), channel.getModulation() ); + + int vpid = 0x1fff, apid = 0x1fff, vfmt = -1, afmt = -1; + + CTvProgram::Video *pV = prog.getVideo(); + CTvProgram::Audio *pA; + + if ( pV != NULL ) { + vpid = pV->getPID(); + vfmt = pV->getFormat(); + } + + int aindex = prog.getCurrentAudio ( String8 ( "eng" ) ); + + if ( aindex >= 0 ) { + pA = prog.getAudio ( aindex ); + + if ( pA != NULL ) { + apid = pA->getPID(); + afmt = pA->getFormat(); + } + } + mTvEpg.leaveProgram(); + mTvEpg.leaveChannel(); + startPlayTv ( SOURCE_DTV, vpid, apid, vfmt, afmt ); + + mTvEpg.enterChannel ( channel.getID() ); + mTvEpg.enterProgram ( prog.getID() ); + return 0; +} + +int CTv::getAudioTrackNum ( int progId ) +{ + int iRet, iOutCnt = 0; + CTvProgram prog; + + do { + if ( 0 > progId ) { + break; + } + + iRet = CTvProgram::selectByID ( progId, prog ); + + if ( 0 != iRet ) { + break; + } + + iOutCnt = prog.getAudioTrackSize(); + + } while ( false ); + + return iOutCnt; +} + +int CTv::getAudioInfoByIndex ( int progId, int idx, int *pAFmt, String8 &lang ) +{ + int iRet, iOutRet = -1; + CTvProgram prog; + CTvProgram::Audio *pA = NULL; + + do { + if ( NULL == pAFmt || idx < 0 ) { + break; + } + + iRet = CTvProgram::selectByID ( progId, prog ); + + if ( 0 != iRet ) { + break; + } + + if ( idx >= prog.getAudioTrackSize() ) { + break; + } + + pA = prog.getAudio ( idx ); + + if ( NULL == pA ) { + break; + } + + *pAFmt = pA->getFormat(); + lang = pA->getLang(); + } while ( false ); + + return iOutRet; +} + +int CTv::switchAudioTrack ( int progId, int idx ) +{ + int iOutRet = 0; + CTvProgram prog; + CTvProgram::Audio *pAudio = NULL; + int aPid = -1; + int aFmt = -1; + + do { + if ( idx < 0 ) { + break; + } + + iOutRet = CTvProgram::selectByID ( progId, prog ); + + if ( 0 != iOutRet ) { + break; + } + if (prog.getAudioTrackSize() <= 1) { + LOGD("%s, just one audio track, not to switch", __FUNCTION__); + break; + } + if ( idx >= prog.getAudioTrackSize() ) { + break; + } + + pAudio = prog.getAudio ( idx ); + + if ( NULL == pAudio ) { + break; + } + + aPid = pAudio->getPID(); + aFmt = pAudio->getFormat(); + + if ( aPid < 0 || aFmt < 0 ) { + break; + } + + iOutRet = mAv.SwitchTSAudio (( uint16_t ) aPid, ( AM_AV_AFormat_t ) aFmt ); + + LOGD ( "%s, iOutRet = %d AM_AV_SwitchTSAudio\n", __FUNCTION__, iOutRet ); + } while ( false ); + + return iOutRet; +} + +int CTv::ResetAudioDecoderForPCMOutput() +{ + int iOutRet = 0; + + iOutRet = mAv.ResetAudioDecoder (); + LOGD ( "%s, iOutRet = %d AM_AV_ResetAudioDecoder\n", __FUNCTION__, iOutRet ); + return iOutRet; +} +int CTv::playDtmbProgram ( int progId ) +{ + CTvProgram prog; + CTvChannel channel; + int vpid = 0x1fff, apid = 0x1fff, vfmt = -1, afmt = -1; + int aindex; + CTvProgram::Audio *pA; + CTvProgram::Video *pV; + int ret = CTvProgram::selectByID ( progId, prog ); + + saveDTVProgramID ( progId ); + prog.getChannel ( channel ); + //音量补偿 + int chanVolCompValue = 0; + chanVolCompValue = GetAudioVolumeCompensationVal(progId); + SetCurProgramAudioVolumeCompensationVal ( chanVolCompValue ); + + mFrontDev.setPara ( channel.getMode(), channel.getFrequency(), channel.getBandwidth(), 0 ); + + pV = prog.getVideo(); + + if ( pV != NULL ) { + vpid = pV->getPID(); + vfmt = pV->getFormat(); + } + + aindex = prog.getCurrAudioTrackIndex(); + + if ( -1 == aindex ) { //db is default + aindex = prog.getCurrentAudio ( String8 ( "eng" ) ); + + if ( aindex >= 0 ) { + prog.setCurrAudioTrackIndex ( progId, aindex ); + } + } + + if ( aindex >= 0 ) { + pA = prog.getAudio ( aindex ); + + if ( pA != NULL ) { + apid = pA->getPID(); + afmt = pA->getFormat(); + } + } + + mTvEpg.leaveProgram(); + mTvEpg.leaveChannel(); + startPlayTv ( SOURCE_DTV, vpid, apid, vfmt, afmt ); + mTvEpg.enterChannel ( channel.getID() ); + mTvEpg.enterProgram ( prog.getID() ); + return 0; +} + +int CTv::playAtvProgram ( int progId ) +{ + LOGD ( "%s, progId = %d\n", __FUNCTION__, progId ); + + CTvProgram prog; + + if ( CTvProgram::selectByID ( progId, prog ) != 0 ) { + LOGE ( "%s, atv progID is not matching the db's\n", __FUNCTION__ ); + } + + saveATVProgramID ( progId ); + LOGD ( "%s, prog name = %s\n", __FUNCTION__, prog.getName().string() ); + CTvChannel channel; + prog.getChannel ( channel ); + + mTvAudio.SetAudioMuteForTv ( CC_AUDIO_MUTE ); + + int chanVolCompValue = 0; + chanVolCompValue = GetAudioVolumeCompensationVal(progId); + SetCurProgramAudioVolumeCompensationVal ( chanVolCompValue ); + + //image selecting channel + mSigDetectThread.requestAndWaitPauseDetect(); + mTvin.Tvin_StopDecoder(); + + //set CVBS + int audioEnum = CFrontEnd::stdAndColorToAudioEnum(channel.getStd()); + int videoEnum = CFrontEnd::stdAndColorToVideoEnum(channel.getStd()); + int fmt = CFrontEnd::stdEnumToCvbsFmt (videoEnum, audioEnum); + mTvin.AFE_SetCVBSStd ( ( tvin_sig_fmt_t ) fmt ); + m_cur_set_info_fmt = ( tvin_sig_fmt_t )fmt; + + //set TUNER + mFrontDev.setPara (FE_ANALOG, channel.getFrequency(), channel.getStd(), channel.getAfcData()); + + if ( channel.getAfcData() != 0 ) { + mFrontDev.fineTune ( channel.getAfcData() / 1000 ); + } + + mSigDetectThread.initSigState(); + mSigDetectThread.resumeDetect(); + return 0; +} + +int CTv::resetFrontEndPara ( frontend_para_set_t feParms ) +{ + if ( feParms.mode == FE_ANALOG ) { + int progID = -1; + int tmpFreq = feParms.freq; + int tmpfineFreq = feParms.para2; + int mode = feParms.mode; + + //get tunerStd from videoStd and audioStd + v4l2_std_id stdAndColor = mFrontDev.enumToStdAndColor (feParms.videoStd, feParms.audioStd); + + //get program dbID saved by last time,if dbID is -1, it shows program hasn't played + progID = getATVProgramID(); + + LOGD("%s, resetFrontEndPara- vstd=%d astd=%d stdandcolor=%lld", __FUNCTION__, feParms.videoStd, feParms.audioStd, stdAndColor); + + //judge progID matching db's or not + CTvProgram prog; + + if ( CTvProgram::selectByID ( progID, prog ) != 0 ) { + LOGE ( "%s, atv progID is not matching the db's\n", __FUNCTION__); + return 0; + } + + //channel fine tune and save freq, std, fineFreq into DB + CTvChannel channel; + prog.upDateChannel ( channel, stdAndColor, tmpFreq, tmpfineFreq ); + mFrontDev.fineTune ( tmpfineFreq / 1000 ); //driver fine tune freq khz + + + //set frontend parameters to tuner dev + mSigDetectThread.requestAndWaitPauseDetect(); + mTvin.Tvin_StopDecoder(); + + //set CVBS + int fmt = CFrontEnd::stdEnumToCvbsFmt (feParms.videoStd, feParms.audioStd ); + mTvin.AFE_SetCVBSStd ( ( tvin_sig_fmt_t ) fmt ); + m_cur_set_info_fmt = ( tvin_sig_fmt_t )fmt; + + //set TUNER + usleep(400 * 1000); + mFrontDev.setPara ( FE_ANALOG, tmpFreq, stdAndColor, tmpfineFreq ); + usleep(400 * 1000); + if ( tmpfineFreq != 0 ) { + mFrontDev.fineTune ( tmpfineFreq / 1000 ); + } + + mSigDetectThread.initSigState(); + mSigDetectThread.resumeDetect(); + } else if ( feParms.mode == FE_DTMB ) { + mFrontDev.setPara ( FE_DTMB, feParms.freq, feParms.para1, feParms.para2 ); + } + + return 0; +} + +int CTv::resetDmxAndAvSource() +{ + AM_DMX_Source_t curdmxSource; + mFrontDev.GetTSSource ( &curdmxSource ); + LOGD ( "%s, AM_FEND_GetTSSource %d", __FUNCTION__, curdmxSource ); + mTvDmx.Close(); + AM_DMX_OpenPara_t para; + memset ( ¶, 0, sizeof ( para ) ); + mTvDmx.Open (para); + mTvDmx.SetSource(curdmxSource ); + AM_AV_TSSource_t ts_source = ( AM_AV_TSSource_t ) curdmxSource; + mAv.SetTSSource (ts_source ); + return 0; +} + +int CTv::SetCurProgramAudioVolumeCompensationVal ( int tmpVal ) +{ + mTvAudio.SetAudioVolumeCompensationVal ( tmpVal ); + mTvAudio.SetAudioMasterVolume (mTvAudio.GetAudioMasterVolume() ); + + LOGD ( "%s, VolumeCompensationVal = %d, id = %d\n", __FUNCTION__, tmpVal, m_cur_playing_prog_id ); + CTvProgram prog; + if ( CTvProgram::selectByID ( m_cur_playing_prog_id, prog ) != 0 ) { + LOGE ( "%s, atv progID is not matching the db's ret = 0\n", __FUNCTION__ ); + return -1; + } + + if (prog.updateVolComp ( m_cur_playing_prog_id, tmpVal ) != 0 ) { + LOGE ( "%s, atv progID is not matching the db's\n", __FUNCTION__); + return -1; + } + return 0; +} + +int CTv::GetAudioVolumeCompensationVal(int progxxId) +{ + int tmpVolValue = 0; + CTvProgram prog; + if ( CTvProgram::selectByID ( m_cur_playing_prog_id, prog ) != 0 ) { + LOGE ( "%s, atv progID is not matching the db's ret = 0\n", __FUNCTION__ ); + return tmpVolValue; + } + tmpVolValue = prog.getChanVolume (); + LOGD ( "%s,progid = %d CompensationVal = %d\n", __FUNCTION__, m_cur_playing_prog_id, tmpVolValue ); + if (tmpVolValue > 20 || tmpVolValue < -20) tmpVolValue = 0; + return tmpVolValue; +} + +int CTv::startPlayTv ( int source, int vid, int aid, int vfat, int afat ) +{ + int ret = 0; + + if ( source == SOURCE_DTV ) { + AM_FileEcho ( DEVICE_CLASS_TSYNC_AV_THRESHOLD_MIN, AV_THRESHOLD_MIN_MS ); + LOGD ( "%s, startPlayTv", __FUNCTION__); + mAv.StartTS (vid, aid, ( AM_AV_VFormat_t ) vfat, ( AM_AV_AFormat_t ) afat ); + } else { + + } + return ret; +} + +int CTv::stopPlayingLock() +{ + AutoMutex lock ( mLock ); + return stopPlaying(); +} + +int CTv::stopPlaying() +{ + if (!(mTvAction & TV_ACTION_PLAYING)) { + LOGD("%s, stopplay cur action = %x not playing , return", __FUNCTION__, mTvAction); + return 0; + } + mAv.EnableVideoBlackout(); + if (m_source_input == SOURCE_TV) { + //first mute + mTvAudio.SetAudioMuteForTv(CC_AUDIO_MUTE); + ClearAnalogFrontEnd(); + } else if (m_source_input == SOURCE_DTV) { + //mFrontDev.setPara(FE_DTMB, 51000000, 0, 0); + mAv.StopTS (); + mTvEpg.leaveChannel(); + mTvEpg.leaveProgram(); + } + mAv.DisableVideoWithBlueColor(); + mTvAction = mTvAction & ~TV_ACTION_PLAYING; + return 0; +} + +int CTv::getAudioChannel() +{ + int iRet = -1; + AM_AOUT_OutputMode_t audioChanneleMod; + do { + iRet = mAv.AudioGetOutputMode (&audioChanneleMod ); + if ( AM_SUCCESS != iRet ) { + LOGD ( "%s, jianfei.lan GetOutputMode is FAILED %d\n", __FUNCTION__, iRet ); + break; + } + LOGD ( "%s, jianfei.lan getAudioChannel iRet : %d audioChanneleMod %d\n", __FUNCTION__, iRet, audioChanneleMod ); + } while ( 0 ); + return audioChanneleMod; +} + +int CTv::setAudioChannel ( int channelIdx ) +{ + int iOutRet = 0; + AM_AOUT_OutputMode_t audioChanneleMod; + LOGD ( "%s, channelIdx : %d\n", __FUNCTION__, channelIdx ); + audioChanneleMod = ( AM_AOUT_OutputMode_t ) channelIdx; + iOutRet = mAv.AudioSetOutputMode (audioChanneleMod ); + if ( AM_SUCCESS != iOutRet) { + LOGD ( "%s, jianfei.lan %s AM_AOUT_SetOutputMode device is FAILED %d\n", __FUNCTION__, "TV", iOutRet ); + } + return 0; +} + +int CTv::getFrontendSignalStrength() +{ + int Strength = 0; + Strength = mFrontDev.getStatus(); + return Strength; +} + +int CTv::getFrontendSNR() +{ + int snr = 0; + snr = mFrontDev.getSNR(); + return snr; +} + +int CTv::getFrontendBER() +{ + int ber = 0; + ber = mFrontDev.getBER(); + return ber; + +} + +int CTv::getChannelInfoBydbID ( int dbID, channel_info_t &chan_info ) +{ + CTvProgram prog; + CTvChannel channel; + Vector<sp<CTvProgram> > out; + memset ( &chan_info, sizeof ( chan_info ), 0 ); + chan_info.freq = 44250000; + chan_info.uInfo.atvChanInfo.videoStd = CC_ATV_VIDEO_STD_PAL; + chan_info.uInfo.atvChanInfo.audioStd = CC_ATV_AUDIO_STD_DK; + + int ret = CTvProgram::selectByID ( dbID, prog ); + if ( ret != 0 ) { + LOGD ( "getChannelinfo , select dbid=%d,is not exist", dbID); + return -1; + } + prog.getChannel ( channel ); + + if ( CTvProgram::TYPE_ATV == prog.getProgType() ) { + chan_info.freq = channel.getFrequency(); + chan_info.uInfo.atvChanInfo.finefreq = channel.getAfcData(); + LOGD("%s, get channel std = %lld", __FUNCTION__, channel.getStd()); + chan_info.uInfo.atvChanInfo.videoStd = + ( atv_video_std_t ) CFrontEnd::stdAndColorToVideoEnum ( channel.getStd() ); + chan_info.uInfo.atvChanInfo.audioStd = + ( atv_audio_std_t ) CFrontEnd::stdAndColorToAudioEnum ( channel.getStd() ); + chan_info.uInfo.atvChanInfo.isAutoStd = ((channel.getStd() & V4L2_COLOR_STD_AUTO) == V4L2_COLOR_STD_AUTO) ? 1 : 0; + } else if ( CTvProgram::TYPE_DTV == prog.getProgType() || CTvProgram::TYPE_RADIO == prog.getProgType()) { + chan_info.freq = channel.getFrequency(); + chan_info.uInfo.dtvChanInfo.strength = getFrontendSignalStrength(); + chan_info.uInfo.dtvChanInfo.quality = getFrontendSNR(); + chan_info.uInfo.dtvChanInfo.ber = getFrontendBER(); + } + + return 0; +} + +bool CTv::Tv_Start_Analyze_Ts ( int channelID ) +{ + int freq, ret; + CTvChannel channel; + + AutoMutex lock ( mLock ); + mAv.StopTS (); + mAv.DisableVideoWithBlueColor(); + ret = CTvChannel::selectByID ( channelID, channel ); + + if ( ret != 0 ) { + LOGD ( "%s, CTv tv_updatats can not get freq by channel ID", __FUNCTION__ ); + return false; + } + + mTvAction = mTvAction | TV_ACTION_SCANNING; + freq = channel.getFrequency(); + LOGD ( "%s, the freq = %d", __FUNCTION__, freq ); + mDtvScanRunningStatus = DTV_SCAN_RUNNING_ANALYZE_CHANNEL; + mTvScanner.setObserver ( &mTvMsgQueue ); + mTvScanner.manualDtmbScan ( freq, freq ); //dtmb + return true; +} + +bool CTv::Tv_Stop_Analyze_Ts() +{ + stopScanLock(); + return true; +} + + +int CTv::saveATVProgramID ( int dbID ) +{ + config_set_int ( "TV", "atv.get.program.id", dbID ); + return 0; +} + +int CTv::getATVProgramID ( void ) +{ + return config_get_int ( "TV", "atv.get.program.id", -1 ); +} + +int CTv::saveDTVProgramID ( int dbID ) +{ + config_set_int ( "TV", "dtv.get.program.id", dbID ); + return 0;; +} + +int CTv::getDTVProgramID ( void ) +{ + return config_get_int ( "TV", "dtv.get.program.id", -1 ); +} + +int CTv::getATVMinMaxFreq ( int *scanMinFreq, int *scanMaxFreq ) +{ + int tmpVal, i = 0; + const char *config_value; + const char *strDelimit = ","; + char *token = NULL; + + *scanMinFreq = 44250000; + *scanMaxFreq = 868250000; + + config_value = config_get_str ( "ATV", "atv.get.min.max.freq", "null" ); + + if ( strcmp ( config_value, "null" ) == 0 ) { + LOGD ( "%s, atv.get.min.max.freq not set config\n", __FUNCTION__ ); + return -1; + } + + char data_str[512]; + memset ( ( void * ) data_str, 0, sizeof ( data_str ) ); + strncpy ( data_str, config_value, sizeof ( data_str ) - 1 ); + + token = strtok ( data_str, strDelimit ); + sscanf ( token, "%d", scanMinFreq ); + token = strtok ( NULL, strDelimit ); + + if ( token != NULL ) { + sscanf ( token, "%d", scanMaxFreq ); + return 0; + } + return 0; +} + +int CTv::IsDVISignal() +{ + return ( ( TVIN_SIG_FMT_NULL != mSigDetectThread.getCurSigInfo().fmt ) && ( mSigDetectThread.getCurSigInfo().reserved & 0x1 ) ); +} + +int CTv::getHDMIFrameRate() +{ + int ConstRate[5] = {24, 25, 30, 50, 60}; + float ConstRateDiffHz[5] = {0.5, 0.5, 0.5, 2, 2}; //偏差值 + int fps = mSigDetectThread.getCurSigInfo().fps; + int i = 0; + for (; i < 5; i++) { + if (abs(ConstRate[i] - fps) < ConstRateDiffHz[i]) + fps = ConstRate[i]; + } + return fps; +} + +tv_source_input_t CTv::GetLastSourceInput ( void ) +{ + return m_last_source_input; +} + +int CTv::isVgaFmtInHdmi ( void ) +{ + tvin_sig_fmt_t fmt = mSigDetectThread.getCurSigInfo().fmt; + + if ( CTvin::Tvin_SourceInputToSourceInputType(m_source_input) != SOURCE_TYPE_HDMI ) { + return -1; + } + + return CTvin::isVgaFmtInHdmi ( fmt ); +} + +int CTv::SetBypassModulesFor3D ( VIDEO_3D_MODE_E mode ) +{ + LOGD ( "%s, ----> Set mode(%d) <----", __FUNCTION__, mode ); + const char *config_value = NULL; + + int DIBypassAllFlag = 0; + config_value = config_get_str ( "TV", "tvin.di.bypass_all", "null" );//bypass , if + if (strcasecmp(config_value, "true") == 0 || strcasecmp(config_value, "1") == 0) { + DIBypassAllFlag = 1; + } else { + DIBypassAllFlag = 0; + } + + + switch (mode) { + case VIDEO_3D_MODE_DISABLE: { + mTvin.VDIN_SetDIBypassAll ( 0 ); + mTvin.VDIN_SetDIBypassPost ( 0 ); + // mTvin.VDIN_SetDISip_Top_Bot ( 0 ); + } + break; + case VIDEO_3D_MODE_AUTO: { + mTvin.VDIN_SetDIBypassAll ( 0 ); + mTvin.VDIN_SetDIBypassPost ( 1 ); + // mTvin.VDIN_SetDISip_Top_Bot ( 0 ); + + + } + break; + case VIDEO_3D_MODE_LR: + case VIDEO_3D_MODE_TB: { + mTvin.VDIN_SetDIBypassPost ( 1 ); + usleep ( 20 * 1000 ); + mTvin.VDIN_SetDIBypassAll ( 1 | DIBypassAllFlag ); + //mTvin.VDIN_SetDISip_Top_Bot ( 1 ); + } + break; + case VIDEO_3D_MODE_LA: + case VIDEO_3D_MODE_FA: { + mTvin.VDIN_SetDIBypassPost ( 1 ); + usleep ( 20 * 1000 ); + mTvin.VDIN_SetDIBypassAll ( 0 ); + //mTvin.VDIN_SetDISip_Top_Bot ( 0 ); + } + break; + default: + break; + } + + if (CTvin::Tvin_SourceInputToSourceInputType(m_source_input) == SOURCE_TYPE_DTV ) { + if ( mode == VIDEO_3D_MODE_DISABLE ) { + mTvin.VDIN_SetVdinFlag ( MEMP_DCDR_WITHOUT_3D ); + } else { + mTvin.VDIN_SetVdinFlag ( MEMP_DCDR_WITH_3D ); + } + } else { + if ( mode == VIDEO_3D_MODE_DISABLE ) { + if ( m_source_input == SOURCE_TV ) { + mTvin.VDIN_SetVdinFlag ( MEMP_ATV_WITHOUT_3D ); + } else { + mTvin.VDIN_SetVdinFlag ( MEMP_VDIN_WITHOUT_3D ); + } + } else { + if ( m_source_input == SOURCE_TV ) { + mTvin.VDIN_SetVdinFlag ( MEMP_ATV_WITH_3D ); + } else { + mTvin.VDIN_SetVdinFlag ( MEMP_VDIN_WITH_3D ); + } + } + } + + return 0; +} + +void CTv::print_version_info ( void ) +{ + // print tvapi version info + LOGD ( "libtvservice git branch:%s\n", tvservice_get_git_branch_info() ); + LOGD ( "libtvservice git version:%s\n", tvservice_get_git_version_info() ); + LOGD ( "libtvservice Last Changed:%s\n", tvservice_get_last_chaned_time_info() ); + LOGD ( "libtvservice Last Build:%s\n", tvservice_get_build_time_info() ); + LOGD ( "libtvservice Builer Name:%s\n", tvservice_get_build_name_info() ); + LOGD ( "libtvservice board version:%s\n", tvservice_get_board_version_info() ); + LOGD ( "\n\n"); + // print dvb version info + LOGD ( "libdvb git branch:%s\n", dvb_get_git_branch_info() ); + LOGD ( "libdvb git version:%s\n", dvb_get_git_version_info() ); + LOGD ( "libdvb Last Changed:%s\n", dvb_get_last_chaned_time_info() ); + LOGD ( "libdvb Last Build:%s\n", dvb_get_build_time_info() ); + LOGD ( "libdvb Builer Name:%s\n", dvb_get_build_name_info() ); +} + +int CTv::Tvin_GetTvinConfig ( void ) +{ + const char *config_value; + int i = 0; + + config_value = config_get_str ( "TV", "tvin.overscan.3d", "null" ); + + if ( strcmp ( config_value, "enable" ) == 0 ) { + gTvinConfig.overscan_3d = 1; + } else { + gTvinConfig.overscan_3d = 0; + } + + config_value = config_get_str ( "TV", "tvin.tv.out.counter", "null" ); + gTvinConfig.tv_out_counter = ( unsigned int ) strtol ( config_value, NULL, 6 ); + + if ( gTvinConfig.tv_out_counter <= 0 || gTvinConfig.tv_out_counter > 8 ) { + gTvinConfig.tv_out_counter = 6; + } + + config_value = config_get_str ( "TV", "tvin.kernelpet_disable", "null" ); + + if ( strcmp ( config_value, "disable" ) == 0 ) { + gTvinConfig.kernelpet_disable = true; + } else { + gTvinConfig.kernelpet_disable = false; + } + + config_value = config_get_str ( "TV", "tvin.kernelpet.timeout", "null" ); + gTvinConfig.userpet_timeout = ( unsigned int ) strtol ( config_value, NULL, 10 ); + + if ( gTvinConfig.kernelpet_timeout <= 0 || gTvinConfig.kernelpet_timeout > 40 ) { + gTvinConfig.kernelpet_timeout = 10; + } + + + config_value = config_get_str ( "TV", "tvin.userpet", "null" ); + + if ( strcmp ( config_value, "enable" ) == 0 ) { + gTvinConfig.userpet = true; + } else { + gTvinConfig.userpet = false; + } + + config_value = config_get_str ( "TV", "tvin.userpet.timeout", "null" ); + gTvinConfig.userpet_timeout = ( unsigned int ) strtol ( config_value, NULL, 10 ); + + if ( gTvinConfig.userpet_timeout <= 0 || gTvinConfig.userpet_timeout > 100 ) { + gTvinConfig.userpet_timeout = 10; + } + + config_value = config_get_str ( "TV", "tvin.userpet.reset", "null" ); + + if ( strcmp ( config_value, "disable" ) == 0 ) { + gTvinConfig.userpet_reset = 0; + } else { + gTvinConfig.userpet_reset = 1; + } + + config_value = config_get_str ( "TV", "tvin.title_shake", "null" ); + + if ( strcmp ( config_value, "enable" ) == 0 ) { + gTvinConfig.title_shake = true; + } else { + gTvinConfig.title_shake = false; + } + + return 0; +} + +int CTv::SetAudioMainVolLutBufName() +{ + int i = 0; + const char *tmp_ptr = NULL; + int get_type_buf[6] = { CC_GET_LUT_TV, CC_GET_LUT_AV, CC_GET_LUT_COMP, CC_GET_LUT_HDMI, CC_GET_LUT_VGA, CC_GET_LUT_MPEG }; + const char *end_str_buf[6] = { ".tv", ".av", ".comp", ".hdmi", ".vga", ".mpeg", }; + project_info_t tmp_info; + char tmp_buf[128]; + char value_buf[128]; + char key_buf[128]; + + int name_en = GetAudioMainVolLutBufNameModifyEnableCFG(); + + if (name_en == 1) { + strcpy(tmp_buf, "null"); + if (GetProjectInfo(&tmp_info) == 0) { + strncpy(tmp_buf, tmp_info.amp_curve_name, CC_PROJECT_INFO_ITEM_MAX_LEN - 1); + } + + if (strcmp(tmp_buf, "null") != 0) { + for ( i = 0; i < 6; i++ ) { + memset(value_buf, '\0', sizeof(value_buf)); + memset(key_buf, '\0', sizeof(key_buf)); + + GetAudioMainVolLutBufNameCFG(get_type_buf[i], key_buf); + + strcpy(value_buf, tmp_buf); + strcat(value_buf, end_str_buf[i]); + + tmp_ptr = config_get_str("TV", key_buf, "null"); + if (strcmp(tmp_ptr, value_buf) != 0) { + config_set_str("TV", key_buf, value_buf); + LOGD("%s, config string now set as: %s \n", __FUNCTION__, value_buf); + } else { + LOGD("%s, config string has been set as: %s \n", __FUNCTION__, value_buf); + } + } + } + } + + return 0; +} + +int CTv::SetAudioSupperBassVolLutBufName() +{ + int i = 0; + const char *tmp_ptr = NULL; + int get_type_buf[6] = { CC_GET_LUT_TV, CC_GET_LUT_AV, CC_GET_LUT_COMP, CC_GET_LUT_HDMI, CC_GET_LUT_VGA, CC_GET_LUT_MPEG }; + const char *end_str_buf[6] = { ".tv", ".av", ".comp", ".hdmi", ".vga", ".mpeg", }; + project_info_t tmp_info; + char tmp_buf[128]; + char value_buf[128]; + char key_buf[128]; + + int name_en = GetAudioSupperBassVolLutBufNameModifyEnableCFG(); + + if (name_en == 1) { + strcpy(tmp_buf, "null"); + if (GetProjectInfo(&tmp_info) == 0) { + strncpy(tmp_buf, tmp_info.amp_curve_name, CC_PROJECT_INFO_ITEM_MAX_LEN - 1); + } + + if (strcmp(tmp_buf, "null") != 0) { + for ( i = 0; i < 6; i++ ) { + memset(value_buf, '\0', sizeof(value_buf)); + memset(key_buf, '\0', sizeof(key_buf)); + + GetAudioSupperBassVolLutBufNameCFG(get_type_buf[i], key_buf); + + strcpy(value_buf, tmp_buf); + strcat(value_buf, ".sup"); + strcat(value_buf, end_str_buf[i]); + + tmp_ptr = config_get_str("TV", key_buf, "null"); + if (strcmp(tmp_ptr, value_buf) != 0) { + config_set_str("TV", key_buf, value_buf); + LOGD("%s, config string now set as: %s \n", __FUNCTION__, value_buf); + } else { + LOGD("%s, config string has been set as: %s \n", __FUNCTION__, value_buf); + } + } + } + } + + return 0; +} + +TvRunStatus_t CTv::GetTvStatus() +{ + return mTvStatus; +} + +int CTv::OpenTv ( void ) +{ + int tmp_val = 0; + const char *value; + //reboot system by fbc setting. + value = config_get_str ( "TV", "fbc.get.panelinfo", "null" ); + LOGD("%s fbc-------------------\n", value); + if ( strcmp ( value, "edid" ) == 0 ) { + if (reboot_sys_by_fbc_edid_info() == 0) { + } + } else if ( strcmp ( value, "uart" ) == 0 ) { + if (reboot_sys_by_fbc_uart_panel_info() == 0) { + } + } + + LOGD ( "%s, tv open\n", __FUNCTION__); + char prop_value[PROPERTY_VALUE_MAX]; + memset ( prop_value, '\0', PROPERTY_VALUE_MAX ); + + mTvin.Tvin_LoadSourceInputToPortMap(); + + SSMSave3DLRSwitch ( 0 ); + SSMSave3DTO2D ( 0 ); + // + SSMHandlePreCopying(); + if ( SSMDeviceMarkCheck() < 0 ) { + SSMRestoreDeviceMarkValues(); + Tv_SSMRestoreDefaultSetting(); + } + mTvin.OpenTvin(); + mTvin.init_vdin(); + mTvin.Tv_init_afe(); + mVpp.Vpp_Init(); + SetAudioSupperBassVolLutBufName(); + SetAudioMainVolLutBufName(); + mTvAudio.AudioCtlInitializeLoad(); + + SSMSetHDCPKey(); + system ( "/system/bin/dec" ); + + //set color filter + // SetFileAttrValue ( "/sys/module/amvideo/parameters/filt_mode", "0x2100" ); + + if ( gTvinConfig.title_shake) { + SetFileAttrValue ( "/sys/module/di/parameters/di_new_mode_mask", "0x10000" ); + } + + value = config_get_str ( "TV", "tvin.autoset.displayfreq", "null" ); + + if ( strcmp ( value, "enable" ) == 0 ) { + m_autoset_displayfreq = true; + } else { + m_autoset_displayfreq = false; + } + + if (mTvin.VDIN_GetDisplayVFreq() == 30) { + m_autoset_displayfreq = false; + } + + if (GetPlatformHaveDDFlag() == 1) { + SetFileAttrValue ("/sys/module/tvin_hdmirx/parameters/edid_mode", "0x109"); + } + + value = config_get_str ( "TV", "ssm.handle.hdmi.edid.en", "null" ); + + if ( strtoul(value, NULL, 10) == 1 ) { + LOGD( "%s, get config \"%s\" is \"%s\".\n", + __FUNCTION__, "ssm.handle.hdmi.edid.en", value ); + //get hdmi edid use mode + char prop_value[256]; + memset( prop_value, '\0', 256 ); + property_get( "ubootenv.var.outputmode", prop_value, "null" ); + LOGD( "%s, get property \"%s\" is \"%s\".\n", + __FUNCTION__, "ubootenv.var.outputmode", prop_value ); + if ( strcmp ( prop_value, "null" ) != 0 ) { + config_set_str ( "TV", "ssm.handle.hdmi.edid.use", prop_value ); + int i; + char edid_path[256]; + char edid_path_cfg[256]; + //set file's path for hdmi edid of each port + for ( i = 1; i <= SSM_HDMI_PORT_MAX; i++ ) { + memset( edid_path, '\0', 256 ); + memset( edid_path_cfg, '\0', 256 ); + sprintf ( edid_path, "/system/etc/%s_port%d.bin", prop_value, i ); + sprintf ( edid_path_cfg, "ssm.handle.hdmi.port%d.edid.file.path", i ); + config_set_str ( "TV", edid_path_cfg, edid_path ); + } + } else { + //set default hdmi edid + config_set_str ( "TV", "ssm.handle.hdmi.edid.use", "hdmi_edid" ); + int i; + char edid_path[256]; + char edid_path_cfg[256]; + //set file's path for hdmi edid of each port + for ( i = 1; i <= SSM_HDMI_PORT_MAX; i++ ) { + memset( edid_path, '\0', 256 ); + memset( edid_path_cfg, '\0', 256 ); + sprintf ( edid_path, "/system/etc/%s_port%d.bin", "hdmi_edid", i ); + sprintf ( edid_path_cfg, "ssm.handle.hdmi.port%d.edid.file.path", i ); + config_set_str ( "TV", edid_path_cfg, edid_path ); + } + } + m_is_set_hdmi_edid = true; + } + // + unsigned char val = 0; + Tvin_GetTvinConfig(); + m_last_source_input = SOURCE_INVALID; + m_source_input = SOURCE_INVALID; + m_mode_3d = VIDEO_3D_MODE_DISABLE; + m_is_hdmi_sr_detect_start = false; + m_hdmi_sampling_rate = 0; + int8_t blackout_enable; + SSMReadBlackoutEnable(&blackout_enable); + m_blackout_enable = blackout_enable; + + + // + //dtv init + int rt = -1; + //opendemux(); + rt = mFrontDev.Open(FE_ANALOG); + mFrontDev.autoLoadFE(); + AM_DMX_OpenPara_t para_dmx; + memset ( ¶_dmx, 0, sizeof ( AM_DMX_OpenPara_t ) ); + mTvDmx.Open(para_dmx ); + mTvDmx.SetSource (AM_DMX_SRC_TS2); + mAv.Open(); + mTvEpg.Init ( 0, 0, 1, "eng zho chi", "GB2312" ); + resetDmxAndAvSource(); + mSourceConnectDetectThread.startDetect(); + + if (SSMReadSerialCMDSwitchValue() == 1) { + SetSerialSwitch(SERIAL_A, 1); + } + mTvin.VDIN_SetVdinFlag ( MEMP_DCDR_WITHOUT_3D ); + mTvin.VDIN_SetMVCViewMode(0);//for not 3d screen + ClearAnalogFrontEnd(); + + mTvStatus = TV_OPEN_ED; + + mHDMIRxCEC.start(); + + return 0; +} + +int CTv::CloseTv ( void ) +{ + LOGD ( "%s, tv close"); + mSigDetectThread.stopDetect(); + if (mpUpgradeFBC != NULL) { + mpUpgradeFBC->stop(); + } + mTvin.Tv_uninit_afe(); + mTvin.uninit_vdin(); + mVpp.Vpp_Uninit(); + TvMisc_DisableWDT ( gTvinConfig.userpet ); + mTvStatus = TV_CLOSE_ED; + return 0; +} + + +int CTv::StartTvLock () +{ + LOGD ( "%s, tv start status = %d", __FUNCTION__, mTvStatus); + if (mTvStatus == TV_START_ED) + return 0; + + Mutex::Autolock _l ( mLock ); + mTvAction = mTvAction | TV_ACTION_STARTING; + mTvAudio.SwitchAVOutBypass(0); + mTvAudio.AudioCtlInit(); + mFrontDev.Open(FE_ANALOG); + mSigDetectThread.startDetect(); + mSigDetectThread.pauseDetect(); + mSigDetectThread.initSigState(); + mTvMsgQueue.startMsgQueue(); + resetDmxAndAvSource(); + Vpp_SetDisplayMode ( mVpp.Tv_GetDisplayMode ( CTvin::Tvin_SourceInputToSourceInputType(m_source_input) ), CTvin::Tvin_SourceInputToSourceInputType(m_source_input), mSigDetectThread.getCurSigInfo().fmt); + TvMisc_EnableWDT ( gTvinConfig.kernelpet_disable, gTvinConfig.userpet, gTvinConfig.kernelpet_timeout, gTvinConfig.userpet_timeout, gTvinConfig.userpet_reset ); + am_phase_t am_phase; + if (mVpp.getPqData()->PQ_GetPhaseArray ( &am_phase ) == 0 ) { + mTvin.TvinApi_SetCompPhase(am_phase); + } + mTvin.TvinApi_SetCompPhaseEnable ( 1 ); + mTvin.VDIN_EnableRDMA ( 1 ); + mTvin.VDIN_SetDIBypasshd ( 0 ); + + SetBypassModulesFor3D ( VIDEO_3D_MODE_DISABLE ); + //win pos + tvin_window_pos_t win_pos; + Vpp_GetDisplayResolutionInfo(&win_pos); + SetPreviewWindow ( win_pos ); + + mTvin.Tvin_RemovePath ( TV_PATH_TYPE_TVIN ); + if ( mTvin.Tvin_RemovePath ( TV_PATH_TYPE_DEFAULT ) ) { + mTvin.Tvin_AddPath ( TV_PATH_DECODER_NEW3D_WITHOUTPPMGR_AMVIDEO ); + } + mTvin.VDIN_SetVdinFlag ( MEMP_DCDR_WITHOUT_3D ); + + mAv.SetVideoWindow (0, 0, 0, 0 ); + + mTvAction = mTvAction & ~TV_ACTION_STARTING; + mTvStatus = TV_START_ED; + return 0; +} +int CTv::StopTvLock ( void ) +{ + LOGD("%s, call Tv_Stop status = %d \n", __FUNCTION__, mTvStatus); + const char *value; + Mutex::Autolock _l ( mLock ); + //we should stop audio first for audio mute. + mTvAction = mTvAction | TV_ACTION_STOPING; + mSigDetectThread.requestAndWaitPauseDetect(); + mAv.EnableVideoBlackout(); + //stop scan if scanning + if (mTvAction & TV_ACTION_SCANNING) { + LOGD("%s, scanning first stop it\n", __FUNCTION__) + mTvEpg.leaveChannel(); + mTvScanner.stopScan(); + mTvAction = mTvAction & ~TV_ACTION_SCANNING; + } + //first stop play(if playing) + stopPlaying(); + // + mTvAudio.SwitchAVOutBypass(0); + tv_audio_channel_e audio_channel = mTvin.Tvin_GetInputSourceAudioChannelIndex (SOURCE_MPEG); + mTvAudio.AudioLineInSelectChannel( audio_channel ); + mTvAudio.AudioCtlUninit(); + mTvin.Tvin_StopDecoder(); + mTvin.Tvin_RemovePath ( TV_PATH_TYPE_TVIN ); + Tv_Set3DMode(VIDEO_3D_MODE_DISABLE); + mTvAudio.SetAudioMuteForTv ( CC_AUDIO_UNMUTE ); + tvin_window_pos_t win_pos; + Vpp_GetDisplayResolutionInfo(&win_pos); + SetPreviewWindow (win_pos ); + mVpp.Tv_LoadVppSettings ( SOURCE_TYPE_MPEG, TVIN_SIG_FMT_NULL, INDEX_2D, TVIN_TFMT_2D ); + Vpp_SetDisplayMode ( mVpp.Tv_GetDisplayMode ( CTvin::Tvin_SourceInputToSourceInputType(SOURCE_MPEG) ), CTvin::Tvin_SourceInputToSourceInputType(SOURCE_MPEG), mSigDetectThread.getCurSigInfo().fmt); + RefreshAudioMasterVolume ( SOURCE_MPEG ); + mVpp.VPP_SetVideoCrop ( 0, 0, 0, 0 ); + m_last_source_input = SOURCE_INVALID; + m_source_input = SOURCE_INVALID; + mAv.DisableVideoWithBlackColor(); + mAv.ClearVideoBuffer(); + mFrontDev.Close(); + mTvAction = mTvAction & ~TV_ACTION_STOPING; + mTvStatus = TV_STOP_ED; + value = config_get_str ( "TV", "tvin.2d4G.headset.en", "null" ); + if ( strcmp ( value, "enable" ) == 0 ) { + property_set("audio.tv_open.flg", "0"); + } + + Tv_SetDDDRCMode(SOURCE_MPEG); + return 0; +} + +int CTv::Tv_MiscSetBySource ( tv_source_input_t source_input ) +{ + int ret = -1; + + switch ( source_input ) { + case SOURCE_TV: + ret = SetFileAttrValue ( "/sys/module/am_vecm/parameters/dnlp_adj_level", "4" ); + break; + + case SOURCE_HDMI1: + case SOURCE_HDMI2: + case SOURCE_HDMI3: + //ret = mVpp.Tv_SavePanoramaMode ( VPP_PANORAMA_MODE_FULL, SOURCE_TYPE_HDMI ); + ret |= SetFileAttrValue ( "/sys/module/am_vecm/parameters/dnlp_adj_level", "5" ); + break; + + case SOURCE_DTV: + if ( m_autoset_displayfreq) { + ret = mTvin.VDIN_SetDisplayVFreq ( 50, mAv.getVideoDisplayResolution() , mIsFbc); + } + + case SOURCE_AV1: + case SOURCE_AV2: + case SOURCE_VGA: + ret |= SetFileAttrValue ( "/sys/module/am_vecm/parameters/dnlp_adj_level", "5" ); + break; + + case SOURCE_SVIDEO: + case SOURCE_IPTV: + default: + ret |= SetFileAttrValue ( "/sys/module/am_vecm/parameters/dnlp_adj_level", "5" ); + break; + } + + return ret; +} + +int CTv::SetSourceSwitchInput (tv_source_input_t source_input ) +{ + Mutex::Autolock _l ( mLock ); + LOGD ( "%s, source input = %d", __FUNCTION__, source_input ); + tv_source_input_t cur_source_input = m_source_input; + tvin_port_t cur_port; + + Tv_SetDDDRCMode(source_input); + + if (source_input == cur_source_input ) { + LOGW ( "%s,same input change display mode", __FUNCTION__ ); + return 0; + } + + //if HDMI, need to set EDID of each port + if (m_is_set_hdmi_edid) { + int tmp_ret = 0; + switch ( source_input ) { + case SOURCE_HDMI1: + tmp_ret = SSMSetHDMIEdid(1); + break; + case SOURCE_HDMI2: + tmp_ret = SSMSetHDMIEdid(2); + break; + case SOURCE_HDMI3: + tmp_ret = SSMSetHDMIEdid(3); + break; + default: + tmp_ret = -1; + break; + } + if (tmp_ret < 0) + LOGE ( "%s, do not set hdmi port%d edid.ret=%d", __FUNCTION__, source_input - 4, tmp_ret ); + } + mTvAction = mTvAction | TV_ACTION_SOURCE_SWITCHING; + m_cur_playing_prog_id = -1; + // + CMessage msg; + msg.mType = CTvMsgQueue::TV_MSG_CHECK_FE_DELAY; + msg.mpData = this; + msg.mDelayMs = 3500;//ms + mTvMsgQueue.removeMsg ( msg ); + //mute first + mTvAudio.SetAudioMuteForTv(CC_AUDIO_MUTE); + mSigDetectThread.requestAndWaitPauseDetect(); + mAv.DisableVideoWithBlueColor(); + //enable blackout, when play,disable it + mAv.EnableVideoBlackout(); + //set front dev mode + if ( source_input == SOURCE_TV ) { + mFrontDev.Close(); + mFrontDev.Open(FE_ANALOG); + //mFrontDev.setMode ( FE_ANALOG ); + } else if ( source_input == SOURCE_DTV ) { + mFrontDev.Close(); + mFrontDev.Open(FE_ANALOG); + //mFrontDev.setMode ( FE_DTMB); + } else { + mFrontDev.Close(); + } + + //ok + m_last_source_input = m_source_input; + m_source_input = source_input; + SSMSaveSourceInput ( source_input ); + + tv_source_input_t pre_source_input = cur_source_input;//change + cur_source_input = source_input; + + mTvAudio.SetAudioVolumeCompensationVal ( 0 ); + + if ( source_input == SOURCE_DTV ) { + //we should stop audio first for audio mute. + mTvAudio.SwitchAVOutBypass(0); + tv_audio_channel_e audio_channel = mTvin.Tvin_GetInputSourceAudioChannelIndex (SOURCE_MPEG); + mTvAudio.AudioLineInSelectChannel( audio_channel ); + mTvAudio.AudioCtlUninit(); + // + mTvin.Tvin_StopDecoder(); + mTvin.Tvin_RemovePath ( TV_PATH_TYPE_TVIN ); + Tv_Set3DMode(VIDEO_3D_MODE_DISABLE); + //double confirm we set the main volume lut buffer to mpeg + RefreshAudioMasterVolume ( SOURCE_MPEG ); + mTvAudio.AudioDataInitForDtv(); + mTvin.setMpeg2Vdin(1); + mVpp.Tv_LoadVppSettings ( SOURCE_TYPE_DTV, TVIN_SIG_FMT_NULL, INDEX_2D, TVIN_TFMT_2D ); + } else { + mTvin.setMpeg2Vdin(0); + mTvin.Tvin_AddPath ( TV_PATH_VDIN_NEW3D_WITHOUTPPMGR_AMVIDEO ); + mTvin.VDIN_SetVdinFlag ( MEMP_VDIN_WITHOUT_3D ); + } + cur_port = mTvin.Tvin_GetSourcePortBySourceInput ( cur_source_input ); + Tv_MiscSetBySource ( source_input ); + + //only DTV->TVIN or TVIN->DTV need start resource detect thread + if ( ( pre_source_input == SOURCE_DTV || cur_source_input == SOURCE_DTV ) && ( cur_source_input != pre_source_input ) ) { + LOGD ( "%s, dtv need resource detect\n", __FUNCTION__ ); + int isNeedCheckD2D3 = ( gTvinConfig.memory512m) ? 1 : 0; + static int sigchkcnt = 0; + while ( true ) { + if ( ( mTvin.Tvin_CheckPathActive ( TV_PATH_TYPE_DEFAULT, isNeedCheckD2D3 ) == TV_PATH_STATUS_INACTIVE ) + && ( mTvin.Tvin_CheckPathActive ( TV_PATH_TYPE_TVIN, isNeedCheckD2D3 ) == TV_PATH_STATUS_INACTIVE ) ) { + LOGD("%s, path check is ok, and break\n", __FUNCTION__) + break; + } else { + if (sigchkcnt++ > 20) { + sigchkcnt = 0; + break; + } + + LOGW ( "%s,resource is busy.", __FUNCTION__); + } + }//while + }//if need check,and check return + + if ( source_input != SOURCE_DTV ) { + // Uninit data + mTvAudio.AudioDataUnInit(); + if (source_input == SOURCE_HDMI1 || source_input == SOURCE_HDMI2 || source_input == SOURCE_HDMI3 || + source_input == SOURCE_MPEG || source_input == SOURCE_DTV ) { + mTvAudio.SwitchAVOutBypass(0); + } else { + mTvAudio.SwitchAVOutBypass(1); + } + + tv_audio_channel_e audio_channel = mTvin.Tvin_GetInputSourceAudioChannelIndex (source_input); + mTvAudio.AudioLineInSelectChannel( audio_channel ); + + Tv_SetAudioInSource ( source_input ); + if ( source_input == SOURCE_HDMI1 || source_input == SOURCE_HDMI2 || source_input == SOURCE_HDMI3 ) { + m_is_hdmi_sr_detect_start = true; + m_hdmi_sampling_rate = 0; + } else { + mTvAudio.AudioDataInit ( 48000, true ); + audio_sr = 48000; + } + //=========================================== + if ( mTvin.SwitchPort ( cur_port ) == 0 ) { //ok + //========================================== + SSMSave3DDepth ( 0 ); + mTvin.Tvin_SetDepthOf2Dto3D ( 0 ); // set default depth + Tv_Set3DMode(VIDEO_3D_MODE_DISABLE); + SSMSave3DLRSwitch ( 0 ); + SSMSave3DTO2D (0); + + //for HDMI source connect detect + mTvin.VDIN_OpenHDMIPinMuxOn(true); + mTvAudio.AudioSetRecordDataZero ( false ); //make AudioRecord data avaliable + mVpp.Vpp_ResetLastVppSettingsSourceType(); + //========================================== + m_sig_stable_nums = 0; + mSigDetectThread.initSigState(); + if (source_input == SOURCE_HDMI1 || source_input == SOURCE_HDMI2 || source_input == SOURCE_HDMI3) { + mSigDetectThread.setVdinNoSigCheckKeepTimes(5000, true); + } else { + mSigDetectThread.setVdinNoSigCheckKeepTimes(3000, true); + } + mSigDetectThread.resumeDetect(); + } else { + } + } + + Tv_SetAudioSourceType(source_input); + RefreshAudioMasterVolume(source_input); + Tv_SetAudioOutputSwap_Type(source_input); + + mTvAction = mTvAction & ~ TV_ACTION_SOURCE_SWITCHING; + return 0; +} + +void CTv::onSigToStable() +{ + if ( ( CTvin::Tvin_SourceInputToSourceInputType(m_source_input) == SOURCE_TYPE_TV ) ) { + mSigDetectThread.getCurSigInfo().fmt = m_cur_set_info_fmt; + } + if ( m_autoset_displayfreq) { + if ( CTvin::Tvin_is50HzFrameRateFmt ( mSigDetectThread.getCurSigInfo().fmt ) ) { + mTvin.VDIN_SetDisplayVFreq ( 50, mAv.getVideoDisplayResolution(), mIsFbc ); + LOGD ( "%s, SetDisplayVFreq 50HZ.", __FUNCTION__); + } else { + mTvin.VDIN_SetDisplayVFreq ( 60, mAv.getVideoDisplayResolution(), mIsFbc ); + LOGD ( "%s, SetDisplayVFreq 60HZ.", __FUNCTION__); + } + } + //showbo mark hdmi auto 3d, tran fmt is 3d, so switch to 3d + LOGD("hdmi trans_fmt = %d", mSigDetectThread.getCurSigInfo().trans_fmt); + if (mSigDetectThread.getCurSigInfo().trans_fmt != TVIN_TFMT_2D) { + Tv_Set3DMode(VIDEO_3D_MODE_AUTO); + } + + LOGD("onSigToStable --- trans_fmt = %d", mSigDetectThread.getCurSigInfo().trans_fmt); + //load pq parameters + mVpp.Tv_LoadVppSettings (CTvin::Tvin_SourceInputToSourceInputType(m_source_input), mSigDetectThread.getCurSigInfo().fmt, Check2Dor3D(m_mode_3d, mSigDetectThread.getCurSigInfo().trans_fmt ), mSigDetectThread.getCurSigInfo().trans_fmt ); + + if ( m_win_mode == PREVIEW_WONDOW ) { + mAv.setVideoAxis(m_win_pos.x1, m_win_pos.y1, m_win_pos.x2, m_win_pos.y2); + mAv.setVideoScreenMode ( CAv::VIDEO_WIDEOPTION_FULL_STRETCH ); + } else { + Vpp_SetDisplayMode ( mVpp.Tv_GetDisplayMode ( CTvin::Tvin_SourceInputToSourceInputType(m_source_input) ), CTvin::Tvin_SourceInputToSourceInputType(m_source_input), mSigDetectThread.getCurSigInfo().fmt); + } + m_sig_stable_nums = 0; + +} +void CTv::onSigStableToUnstable() +{ + LOGD ( "%s, stable to unstable\n", __FUNCTION__); + mTvAudio.SetAudioMuteForTv(CC_AUDIO_MUTE); + mAv.DisableVideoWithBlackColor(); + mTvin.Tvin_StopDecoder(); +} +void CTv::onSigStableToUnSupport() +{ + mTvAudio.SetAudioMuteForTv(CC_AUDIO_MUTE); + mAv.DisableVideoWithBlackColor(); + mTvin.Tvin_StopDecoder(); + + tvin_info_t info = mSigDetectThread.getCurSigInfo(); + TvEvent::SignalInfoEvent ev; + ev.mTrans_fmt = info.trans_fmt; + ev.mFmt = info.fmt; + ev.mStatus = info.status; + ev.mReserved = info.reserved; + sendTvEvent ( ev ); + LOGD ( "%s, Enable blackscreen for signal change in StableToUnSupport!", __FUNCTION__ ); +} +void CTv::onSigStableToNoSig() +{ + mTvAudio.SetAudioMuteForTv(CC_AUDIO_MUTE); + mAv.DisableVideoWithBlueColor(); + //SetAudioMuteForTv(CC_AUDIO_MUTE); + mTvin.Tvin_StopDecoder(); + + tvin_info_t info = mSigDetectThread.getCurSigInfo(); + TvEvent::SignalInfoEvent ev; + ev.mTrans_fmt = info.trans_fmt; + ev.mFmt = info.fmt; + ev.mStatus = info.status; + ev.mReserved = info.reserved; + sendTvEvent ( ev ); + LOGD ( "%s, Enable bluescreen for signal change in StableToNoSig!", __FUNCTION__); +} +void CTv::onSigUnStableToUnSupport() +{ + mAv.DisableVideoWithBlackColor(); + mTvin.Tvin_StopDecoder(); + tvin_info_t info = mSigDetectThread.getCurSigInfo(); + + + TvEvent::SignalInfoEvent ev; + ev.mTrans_fmt = info.trans_fmt; + ev.mFmt = info.fmt; + ev.mStatus = info.status; + ev.mReserved = info.reserved; + sendTvEvent ( ev ); + LOGD ( "%s, Enable blackscreen for signal change in UnStableToUnSupport!", __FUNCTION__); +} +void CTv::onSigUnStableToNoSig() +{ + mTvAudio.SetAudioMuteForTv(CC_AUDIO_MUTE); + mAv.DisableVideoWithBlueColor(); + //SetAudioMuteForTv(CC_AUDIO_MUTE); + mTvin.Tvin_StopDecoder(); + + tvin_info_t info = mSigDetectThread.getCurSigInfo(); + TvEvent::SignalInfoEvent ev; + ev.mTrans_fmt = info.trans_fmt; + ev.mFmt = info.fmt; + ev.mStatus = info.status; + ev.mReserved = info.reserved; + sendTvEvent ( ev ); + LOGD ( "%s, Enable bluescreen for signal change in UnStableToNoSig! status = %d", __FUNCTION__, ev.mStatus ); +} +void CTv::onSigNullToNoSig() +{ + mTvAudio.SetAudioMuteForTv(CC_AUDIO_MUTE); + mAv.DisableVideoWithBlueColor(); + //SetAudioMuteForTv(CC_AUDIO_MUTE); + mTvin.Tvin_StopDecoder(); + + tvin_info_t info = mSigDetectThread.getCurSigInfo(); + + + TvEvent::SignalInfoEvent ev; + ev.mTrans_fmt = info.trans_fmt; + ev.mFmt = info.fmt; + ev.mStatus = info.status; + ev.mReserved = info.reserved; + sendTvEvent ( ev ); + LOGD ( "%s, Enable bluescreen for signal change in NullToNoSig!", __FUNCTION__); +} + +void CTv::onSigNoSigToUnstable() +{ + mAv.DisableVideoWithBlueColor(); + LOGD("Enable bluescreen for signal change in NoSigToUnstable\n"); +} + +void CTv::onSigStillStable() +{ + if ( m_sig_stable_nums == 20) { + tvin_info_t info = mSigDetectThread.getCurSigInfo(); + TvEvent::SignalInfoEvent ev; + ev.mTrans_fmt = info.trans_fmt; + ev.mFmt = info.fmt; + ev.mStatus = info.status; + ev.mReserved = info.reserved; + sendTvEvent ( ev ); + } + if (m_sig_stable_nums == 2) { + int startdec_status = mTvin.Tvin_StartDecoder ( mSigDetectThread.getCurSigInfo() ); + if ( startdec_status == 0 ) { //showboz codes from start decode fun + const char *value; + value = config_get_str ( "TV", "tvin.db.reg.en", "null" ); + if ( strcmp ( value, "enable" ) == 0 ) { + usleep ( 20 * 1000 ); + Tvin_SetPLLValues (); + usleep ( 20 * 1000 ); + SetCVD2Values (); + } + } + } + if ( m_sig_stable_nums == 25 ) { + if (!(mTvAction & TV_ACTION_SCANNING)) + mTvAudio.SetAudioMuteForTv ( CC_AUDIO_UNMUTE ); + mAv.EnableVideoAuto(); + } + + m_sig_stable_nums++; +} +void CTv::onSigStillUnstable() +{ +} +void CTv::onSigStillNosig() +{ + +} +void CTv::onSigStillNoSupport() +{ + + tvin_info_t info = mSigDetectThread.getCurSigInfo(); + TvEvent::SignalInfoEvent SigEv; + SigEv.mTrans_fmt = info.trans_fmt; + SigEv.mFmt = info.fmt; + SigEv.mStatus = info.status; + SigEv.mReserved = info.reserved; + sendTvEvent ( SigEv ); + LOGD ( "%s, Unsupport signal", __FUNCTION__); +} +void CTv::onSigStillNull() +{ +} +void CTv::onStableSigFmtChange() +{ +} +void CTv::onStableTransFmtChange() +{ +} +void CTv::onSigDetectEnter() +{ + struct timeval time; + gettimeofday ( &time, NULL ); +} + +void CTv::onLoop() +{ + if ( ( m_is_hdmi_sr_detect_start == true ) + && ( CTvin::Tvin_SourceInputToSourceInputType(m_source_input) == SOURCE_TYPE_HDMI ) ) { + int sr = mTvin.get_hdmi_sampling_rate(); + + if ( ( sr > 0 ) && ( sr != m_hdmi_sampling_rate ) ) { + if ( 0 == m_hdmi_sampling_rate ) { + LOGD ( "%s, Init HDMI audio, sampling rate:%d", __FUNCTION__, sr ); + mTvAudio.AudioDataInit ( sr, false ); + audio_sr = sr; + } else { + LOGD ( "%s, Reset HDMI sampling rate to %d", __FUNCTION__, sr ); + mTvAudio.AudioChangeSampleRate ( sr ); + } + + m_hdmi_sampling_rate = sr; + } + } +} + +void CTv::onSourceConnect(int source_type, int connect_status) +{ + TvEvent::SourceConnectEvent ev; + ev.mSourceInput = source_type; + ev.connectionState = connect_status; + sendTvEvent(ev); +} + +int CTv::GetSourceConnectStatus(int source_input) +{ + return mSourceConnectDetectThread.GetSourceConnectStatus(source_input); +} + +tv_source_input_t CTv::GetCurrentSourceInputLock ( void ) +{ + Mutex::Autolock _l ( mLock ); + return m_source_input; +} + +//dtv and tvin +tvin_info_t CTv::GetCurrentSignalInfo ( void ) +{ + tvin_trans_fmt det_fmt = TVIN_TFMT_2D; + tvin_sig_status_t signalState = TVIN_SIG_STATUS_NULL; + tvin_info_t signal_info = mSigDetectThread.getCurSigInfo(); + + if ( (CTvin::Tvin_SourceInputToSourceInputType(m_source_input) == SOURCE_TYPE_DTV ) ) { + for ( int i = 0; i < 10; i++ ) { + det_fmt = mTvin.TvinApi_Get3DDectMode(); + signal_info.status = TVIN_SIG_STATUS_STABLE; + + if ( det_fmt != TVIN_TFMT_2D ) { + signal_info.trans_fmt = det_fmt; + break; + } + } + } + return signal_info; +} + +int CTv::Tv_Set3DMode ( VIDEO_3D_MODE_T mode ) +{ + if (mode == VIDEO_3D_MODE_AUTO) { + mTvin.VDIN_SetDI3DDetc (1); + } else { + mTvin.VDIN_SetDI3DDetc (0); + } + + mAv.set3DMode(mode, 0, 0); + m_mode_3d = mode; + SSMSave3DMode ( ( unsigned char ) mode ); + SetBypassModulesFor3D ( mode ); + return 0; +} + +VIDEO_3D_MODE_T CTv::Tv_Get3DMode ( void ) +{ + return m_mode_3d; +} + +int CTv::Tv_Set3DLRSwith ( int on_off) +{ + LOGW ( "%s,Set3D LRSwith on_off %d ,status %d !!! ", __FUNCTION__, on_off); + mAv.set3DMode(m_mode_3d, on_off, 0); + SSMSave3DLRSwitch(on_off); + return 0; +} + +int CTv::Tv_Get3DLRSwith ( void ) +{ + unsigned char val = 0; + SSMRead3DLRSwitch ( &val ); + return ( int ) val; +} + +int CTv::Tv_Set3DTo2DMode ( int mode) +{ + LOGW ( "%s,Set3D to 2D mode %d ,status %d !!! ", __FUNCTION__ , mode); + mAv.set3DMode(m_mode_3d, 0, mode); + SSMSave3DTO2D ( mode ); + return 0; +} + +int CTv::Tv_Get3DTo2DMode ( void ) +{ + unsigned char val = 0; + SSMRead3DTO2D ( &val ); + return val; +} + +int CTv::Tv_Set3DDepth ( int value ) +{ + mTvin.Tvin_SetDepthOf2Dto3D( value ); + SSMSave3DDepth ( value ); + return 0; +} + +int CTv::GetSave3DDepth ( void ) +{ + unsigned char val = 0; + SSMRead3DDepth ( &val ); + return val; +} + +is_3d_type_t CTv::Check2Dor3D ( VIDEO_3D_MODE_T mode3d, tvin_trans_fmt_t trans_fmt ) +{ + if ( mode3d == VIDEO_3D_MODE_DISABLE ) { + return INDEX_2D; + } else if ( mode3d == VIDEO_3D_MODE_AUTO ) { + if ( trans_fmt == TVIN_TFMT_2D ) { + return INDEX_2D; + } else { + return INDEX_3D; + } + } else { + return INDEX_3D; + } +} + + +int CTv::Tvin_SetPLLValues () +{ + tvin_sig_fmt_t sig_fmt = mSigDetectThread.getCurSigInfo().fmt; + tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceInput(m_source_input); + am_regs_t regs; + + if ( mVpp.getPqData()->PQ_GetPLLParams ( source_port, sig_fmt, ®s ) == 0 ) { + LOGD ("%s,PQ_GetPLLParams(source_port[%d], sig_fmt[%d],®s).\n", __FUNCTION__, source_port, sig_fmt ); + + if ( mTvin.TvinApi_LoadPLLValues ( regs ) < 0 ) { + LOGE ( "%s, TvinApi_LoadPLLValues failed!\n", __FUNCTION__ ); + return -1; + } + } else { + LOGE ( "%s, PQ_GetPLLParams failed!\n", __FUNCTION__ ); + return -1; + } + + return 0; +} +int CTv::SetCVD2Values () +{ + tvin_sig_fmt_t sig_fmt = mSigDetectThread.getCurSigInfo().fmt; + tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceInput(m_source_input); + am_regs_t regs; + + if (mVpp.getPqData()->PQ_GetCVD2Params ( source_port, sig_fmt, ®s ) == 0) { + LOGD ( "%s, PQ_GetCVD2Params(source_port[%d], sig_fmt[%d],®s).\n", __FUNCTION__, + source_port, sig_fmt ); + + if ( mTvin.TvinApi_LoadCVD2Values ( regs ) < 0 ) { + LOGE ( "%s, TvinApi_LoadCVD2Values failed!\n", __FUNCTION__); + return -1; + } + } else { + LOGE ( "%s, PQ_GetCVD2Params failed!\n", __FUNCTION__); + return -1; + } + + return 0; +} + +int CTv::SetPreviewWindow ( tvin_window_pos_t pos ) +{ + m_win_pos.x1 = pos.x1; + m_win_pos.y1 = pos.y1; + m_win_pos.x2 = pos.x2; + m_win_pos.y2 = pos.y2; + LOGD ( "%s, SetPreviewWindow x = %d y=%d", __FUNCTION__, pos.x2, pos.y2 ); + + tvin_window_pos_t def_pos; + Vpp_GetDisplayResolutionInfo(&def_pos); + + if (pos.x1 != 0 || pos.y1 != 0 || pos.x2 != def_pos.x2 || pos.y2 != def_pos.y2) { + m_win_mode = PREVIEW_WONDOW; + } else { + m_win_mode = NORMAL_WONDOW; + } + + return mAv.setVideoAxis(m_win_pos.x1, m_win_pos.y1, m_win_pos.x2, m_win_pos.y2);; +} + +/*********************** Audio start **********************/ +int CTv::SetAudioVolDigitLUTBuf ( tv_source_input_t source_input ) +{ + if (source_input == SOURCE_TV) { + mTvAudio.AudioSetVolumeDigitLUTBuf ( CC_LUT_SEL_TV, 1, 1, -1 ); + } else if (source_input == SOURCE_AV1 || source_input == SOURCE_AV2) { + mTvAudio.AudioSetVolumeDigitLUTBuf ( CC_LUT_SEL_AV, 1, 1, -1 ); + } else if (source_input == SOURCE_YPBPR1 || source_input == SOURCE_YPBPR2) { + mTvAudio.AudioSetVolumeDigitLUTBuf ( CC_LUT_SEL_COMP, 1, 1, -1 ); + } else if (source_input == SOURCE_VGA) { + mTvAudio.AudioSetVolumeDigitLUTBuf ( CC_LUT_SEL_VGA, 1, 1, -1 ); + } else if (source_input == SOURCE_HDMI1 || source_input == SOURCE_HDMI2 || source_input == SOURCE_HDMI3) { + mTvAudio.AudioSetVolumeDigitLUTBuf ( CC_LUT_SEL_HDMI, 1, 1, -1 ); + } else if ( source_input == SOURCE_MPEG ) { + mTvAudio.AudioSetVolumeDigitLUTBuf ( CC_LUT_SEL_MPEG, 1, 1, -1 ); + } else if ( source_input == SOURCE_DTV ) { + mTvAudio.AudioSetVolumeDigitLUTBuf ( CC_LUT_SEL_MPEG, 1, 1, -1 ); + } + return 0; +} + +void CTv::RefreshAudioMasterVolume ( tv_source_input_t source_input ) +{ + if (source_input == SOURCE_HDMI1 || source_input == SOURCE_HDMI2 || source_input == SOURCE_HDMI3) { + if ( GetAudioDVISupportEnable() == 1 ) { + if ( IsDVISignal() ) { + SetAudioVolDigitLUTBuf ( SOURCE_MPEG ); + mTvAudio.SetAudioMasterVolume ( mTvAudio.GetAudioMasterVolume() ); + return; + } + } + } + + SetAudioVolDigitLUTBuf ( source_input ); + mTvAudio.SetAudioMasterVolume ( mTvAudio.GetAudioMasterVolume() ); +} + +int CTv::Tv_SetAudioInSource (tv_source_input_t source_input) +{ + if (source_input == SOURCE_TV) { + if (mTvin.Tvin_GetAudioInSourceType(source_input) == TV_AUDIO_IN_SOURCE_TYPE_ATV) { + return mTvAudio.AudioSetAudioInSource(CC_AUDIO_IN_SOURCE_ATV); + } else { + return mTvAudio.AudioSetAudioInSource(CC_AUDIO_IN_SOURCE_LINEIN); + } + } else if (source_input == SOURCE_AV1 || source_input == SOURCE_AV2) { + return mTvAudio.AudioSetAudioInSource(CC_AUDIO_IN_SOURCE_LINEIN); + } else if (source_input == SOURCE_HDMI1 || source_input == SOURCE_HDMI2 || source_input == SOURCE_HDMI3) { + return mTvAudio.AudioSetAudioInSource(CC_AUDIO_IN_SOURCE_HDMI); + } else if (source_input == SOURCE_YPBPR1 || source_input == SOURCE_YPBPR2 || + source_input == SOURCE_TYPE_VGA) { + return mTvAudio.AudioSetAudioInSource(CC_AUDIO_IN_SOURCE_LINEIN); + } + + return 0; +} + +int CTv::Tv_SetAudioSourceType (tv_source_input_t source_input) +{ + int audio_source = -1; + + if (source_input == SOURCE_TV) { + audio_source = AUDIO_ATV_SOURCE; + } else if (source_input == SOURCE_AV1 || source_input == SOURCE_AV2) { + audio_source = AUDIO_AV_SOURCE; + } else if (source_input == SOURCE_HDMI1 || source_input == SOURCE_HDMI2 || source_input == SOURCE_HDMI3) { + audio_source = AUDIO_HDMI_SOURCE; + } else if (source_input == SOURCE_YPBPR1 || source_input == SOURCE_YPBPR2 || + source_input == SOURCE_TYPE_VGA) { + audio_source = AUDIO_AV_SOURCE; + } else if (source_input == SOURCE_DTV) { + audio_source = AUDIO_MPEG_SOURCE; + } else { + audio_source = AUDIO_MPEG_SOURCE; + } + + return mTvAudio.AudioSetAudioSourceType(audio_source); +} +void CTv::Tv_SetAudioOutputSwap_Type (tv_source_input_t source_input) +{ + const char *config_value; + config_value = config_get_str("TV", "audio.output.swap.enable", "null"); + if ( strcmp ( config_value, "enable" ) == 0 ) { + int sw_status = 0; + + LOGD("%s, audio.output.swap.enable\n", __FUNCTION__); + + switch (source_input) { + case SOURCE_AV1: + config_value = config_get_str("TV", "audio.output.swap.av1", "null"); + sw_status = atoi ( config_value ); + mTvAudio.SetOutput_Swap(sw_status); + LOGD("%s, av1 %d\n", __FUNCTION__, sw_status); + break; + case SOURCE_AV2: + config_value = config_get_str("TV", "audio.output.swap.av2", "null"); + sw_status = atoi ( config_value ); + mTvAudio.SetOutput_Swap(sw_status); + LOGD("%s, av2 %d\n", __FUNCTION__, sw_status); + break; + case SOURCE_HDMI1: + config_value = config_get_str("TV", "audio.output.swap.hdmi1", "null"); + sw_status = atoi ( config_value ); + mTvAudio.SetOutput_Swap(sw_status); + LOGD("%s, hdmi1 %d\n", __FUNCTION__, sw_status); + break; + case SOURCE_HDMI2: + config_value = config_get_str("TV", "audio.output.swap.hdmi2", "null"); + sw_status = atoi ( config_value ); + mTvAudio.SetOutput_Swap(sw_status); + LOGD("%s, hdmi2 %d\n", __FUNCTION__, sw_status); + break; + case SOURCE_HDMI3: + config_value = config_get_str("TV", "audio.output.swap.hdmi3", "null"); + sw_status = atoi ( config_value ); + mTvAudio.SetOutput_Swap(sw_status); + LOGD("%s, hdmi3 %d\n", __FUNCTION__, sw_status); + break; + case SOURCE_TV: + config_value = config_get_str("TV", "audio.output.swap.tv", "null"); + sw_status = atoi ( config_value ); + mTvAudio.SetOutput_Swap(sw_status); + LOGD("%s, tv %d\n", __FUNCTION__, sw_status); + break; + case SOURCE_DTV: + config_value = config_get_str("TV", "audio.output.swap.dtv", "null"); + sw_status = atoi ( config_value ); + mTvAudio.SetOutput_Swap(sw_status); + LOGD("%s, dtv %d\n", __FUNCTION__, sw_status); + break; + case SOURCE_MPEG: + config_value = config_get_str("TV", "audio.output.swap.mpeg", "null"); + sw_status = atoi ( config_value ); + mTvAudio.SetOutput_Swap(sw_status); + LOGD("%s, mpeg %d\n", __FUNCTION__, sw_status); + break; + default: + mTvAudio.SetOutput_Swap(sw_status); + LOGD("%s, default %d\n", __FUNCTION__, sw_status); + break; + } + } + +} + +/*********************** Audio end **********************/ + +unsigned int CTv::Vpp_GetDisplayResolutionInfo(tvin_window_pos_t *win_pos) +{ + int display_resolution = mAv.getVideoDisplayResolution(); + unsigned int tmp_ret = 0; + + switch (display_resolution) { + case VPP_DISPLAY_RESOLUTION_1366X768: + tmp_ret |= (CC_RESOLUTION_1366X768_W << 16); + tmp_ret |= (CC_RESOLUTION_1366X768_H << 0); + break; + case VPP_DISPLAY_RESOLUTION_1920X1080: + tmp_ret |= (CC_RESOLUTION_1920X1080_W << 16); + tmp_ret |= (CC_RESOLUTION_1920X1080_H << 0); + break; + case VPP_DISPLAY_RESOLUTION_3840X2160: + tmp_ret |= (CC_RESOLUTION_3840X2160_W << 16); + tmp_ret |= (CC_RESOLUTION_3840X2160_H << 0); + break; + default: + tmp_ret |= (CC_RESOLUTION_3840X2160_W << 16); + tmp_ret |= (CC_RESOLUTION_3840X2160_H << 0); + break; + } + + if (win_pos != NULL) { + win_pos->x1 = 0; + win_pos->y1 = 0; + win_pos->x2 = ((tmp_ret >> 16) & 0xFFFF) - 1; + win_pos->y2 = ((tmp_ret >> 0) & 0xFFFF) - 1; + } + + return 0; +} + + +int CTv::setBlackoutEnable(int enable) +{ + m_blackout_enable = enable; + return SSMSaveBlackoutEnable(enable); +} + +int CTv::getSaveBlackoutEnable() +{ + int8_t enable; + SSMReadBlackoutEnable(&enable); + return enable; +} +void CTv::startAutoBackLight() +{ + mAutoBackLight.startAutoBacklight(CTvin::Tvin_SourceInputToSourceInputType(m_source_input)); +} + +void CTv::stopAutoBackLight() +{ + mAutoBackLight.stopAutoBacklight(); +} + +int CTv::getAutoBackLight_on_off() +{ + return mAutoBackLight.isAutoBacklightOn() ? 1 : 0; +} +/*********************** SSM start **********************/ +int CTv::Tv_SSMRestoreDefaultSetting() +{ + SSMRestoreDeviceMarkValues(); + mTvAudio.AudioSSMRestoreDefaultSetting(); + mVpp.VPPSSMRestoreDefault(); + MiscSSMRestoreDefault(); + ReservedSSMRestoreDefault(); + SSMSaveCVBSStd ( 0 ); + SSMSaveLastSelectSourceInput ( SOURCE_TV ); + SSMSavePanelType ( 0 ); + //tvconfig default + saveDTVProgramID ( -1 ); + saveATVProgramID ( -1 ); + return 0; +} + +int CTv::clearDbAllProgramInfoTable() +{ + return CTvDatabase::GetTvDb()->clearDbAllProgramInfoTable(); +} + +int CTv::Tv_SSMFacRestoreDefaultSetting() +{ + mVpp.VPPSSMFacRestoreDefault(); + mTvAudio.AudioSSMRestoreDefaultSetting(); + MiscSSMFacRestoreDefault(); + + return 0; +} +/*********************** SSM End **********************/ +//not in CTv, not use lock +void CTv::setSourceSwitchAndPlay() +{ + int progID = 0; + LOGD ( "%s\n", __FUNCTION__ ); + static const int POWERON_SOURCE_TYPE_NONE = 0;//not play source + static const int POWERON_SOURCE_TYPE_LAST = 1;//play last save source + static const int POWERON_SOURCE_TYPE_SETTING = 2;//play ui set source + int to_play_source = -1; + int powerup_type = SSMReadPowerOnOffChannel(); + LOGD("read power on source type = %d", powerup_type); + if (powerup_type == POWERON_SOURCE_TYPE_NONE) { + return ; + } else if (powerup_type == POWERON_SOURCE_TYPE_LAST) { + to_play_source = SSMReadSourceInput(); + } else if (powerup_type == POWERON_SOURCE_TYPE_SETTING) { + to_play_source = SSMReadLastSelectSourceInput(); + } + SetSourceSwitchInput (( tv_source_input_t ) to_play_source ); + if ( to_play_source == SOURCE_TV ) { + progID = getATVProgramID(); + } else if ( to_play_source == SOURCE_DTV ) { + progID = getDTVProgramID(); + } + playProgramLock(progID); + return; +} + +int CTv::startCC(int country, int src, int channel, int service) +{ + //turn_on_cc = true; + return mTvSub.sub_start_atsc_cc((enum cc_param_country)country, (enum cc_param_source_type)src, channel, (enum cc_param_caption_type)service); +} + +int CTv::stopCC() +{ + return mTvSub.sub_stop_atsc_cc(); +} + +void CTv::printDebugInfo() +{ + print_version_info(); + LOGD("%s, TvAction = %x", __FUNCTION__, mTvAction); + LOGD("%s, TvRunStatus = %d", __FUNCTION__, mTvStatus); + LOGD("%s, TvCurSourceInput = %d", __FUNCTION__, m_source_input); + LOGD("%s, TvLastSourceInput = %d", __FUNCTION__, m_last_source_input); +} +//==============vchip end================================ +//----------------DVR API============================ +void CTv::SetRecordFileName ( char *name ) +{ + char tmp[256]; + strcpy ( tmp, name ); + mTvRec.SetRecordFileName ( tmp ); +} +void CTv::StartToRecord() +{ + int progID = getDTVProgramID(); + mTvRec.StartRecord ( progID ); +} +void CTv::StopRecording() +{ + mTvRec.StopRecord(); +} +void CTv::SetRecCurTsOrCurProgram ( int sel ) +{ + mTvRec.SetRecCurTsOrCurProgram ( sel ); +} + +int CTv::GetDisplayResolutionConfig() +{ + return mAv.getVideoDisplayResolution(); +} + +int CTv::GetDisplayResolutionInfo() +{ + return Vpp_GetDisplayResolutionInfo(NULL); +} + +void CTv::onHDMIRxCECMessage(int msg_len, unsigned char msg_buf[]) +{ + int i = 0; + TvEvent::HDMIRxCECEvent ev; + ev.mDataCount = msg_len; + for (i = 0; i < msg_len; i++) { + ev.mDataBuf[i] = msg_buf[i]; + } + sendTvEvent(ev); +} + +int CTv::SendHDMIRxCECCustomMessage(unsigned char data_buf[]) +{ + tv_source_input_t source_input = m_source_input; + + return mHDMIRxCEC.SendCustomMessage(source_input, data_buf); +} + +int CTv::SendHDMIRxCECCustomMessageAndWaitReply(unsigned char data_buf[], unsigned char reply_buf[], int WaitCmd, int timeout) +{ + tv_source_input_t source_input = m_source_input; + + return mHDMIRxCEC.SendCustomMessageAndWaitReply(source_input, data_buf, reply_buf, WaitCmd, timeout); +} + +int CTv::SendHDMIRxCECBoradcastStandbyMessage(void) +{ + tv_source_input_t source_input = m_source_input; + + return mHDMIRxCEC.SendBoradcastStandbyMessage(source_input); +} + +int CTv::SendHDMIRxCECGiveCECVersionMessage(tv_source_input_t source_input, unsigned char data_buf[]) +{ + if (mHDMIRxCEC.processRefreshSrcDevice(source_input) == 0) { + return mHDMIRxCEC.SendGiveCECVersionMessage(source_input, data_buf); + } + + return -1; +} + +int CTv::SendHDMIRxCECGiveDeviceVendorIDMessage(tv_source_input_t source_input, unsigned char data_buf[]) +{ + if (mHDMIRxCEC.processRefreshSrcDevice(source_input) == 0) { + return mHDMIRxCEC.SendGiveDeviceVendorIDMessage(source_input, data_buf); + } + + return -1; +} + +int CTv::SendHDMIRxCECGiveOSDNameMessage(tv_source_input_t source_input, unsigned char data_buf[]) +{ + if (mHDMIRxCEC.processRefreshSrcDevice(source_input) == 0) { + return mHDMIRxCEC.SendGiveOSDNameMessage(source_input, data_buf); + } + + return -1; +} + +int CTv::GetHdmiHdcpKeyKsvInfo(int data_buf[]) +{ + return mTvin.get_hdmi_ksv_info(m_source_input, data_buf); +} + +void CTv::onUpgradeStatus(int state, int param) +{ + TvEvent::UpgradeFBCEvent ev; + ev.mState = state; + ev.param = param; + sendTvEvent(ev); +} + +int CTv::StartUpgradeFBC(char *file_name, int mode, int upgrade_blk_size) +{ + if (mpUpgradeFBC != NULL) { + mpUpgradeFBC->SetUpgradeFileName(file_name); + mpUpgradeFBC->SetUpgradeMode(mode); + mpUpgradeFBC->SetUpgradeBlockSize(upgrade_blk_size); + mpUpgradeFBC->start(); + return 0; + } + + return -1; +} + +void CTv::onSerialCommunication(int dev_id, int rd_len, unsigned char data_buf[]) +{ + int i = 0; + TvEvent::SerialCommunicationEvent ev; + ev.mDevId = dev_id; + ev.mDataCount = rd_len; + for (i = 0; i < rd_len; i++) { + ev.mDataBuf[i] = data_buf[i]; + } + sendTvEvent(ev); +} + +void CTv::onThermalDetect(int state) +{ + const char *value; + const char *value_normal; + const char *value_cold; + int threshold = 0, val = 0; + static int pre_val = -1; + + value = config_get_str ( "TV", "tvin.thermal.threshold.enable", "null" ); + + if ( strcmp ( value, "enable" ) == 0 ) { + + value = config_get_str ( "TV", "tvin.thermal.threshold.value", "null" ); + + threshold = atoi(value); + LOGD ( "%s, threshold value: %d\n", __FUNCTION__, threshold); + + if (state > threshold) { + value_normal = config_get_str ( "TV", "tvin.thermal.fbc.normal.value", "null" ); + val = atoi(value_normal); + if (val == 0) { + val = 0x4210000; //normal default + } + LOGD ( "%s, current temp: %d set 1\n", __FUNCTION__, state); + } else { + value_cold = config_get_str ( "TV", "tvin.thermal.fbc.cold.value", "null" ); + val = atoi(value_cold); + if (val == 0) { + val = 0x8210000; //cold default + } + LOGD ( "%s, current temp: 0x%x set 0\n", __FUNCTION__, state); + } + + if (pre_val == val) { + LOGD ( "%s, pre_val == val : 0x%x,bypass\n", __FUNCTION__, val); + } else { + pre_val = val; + Tv_FactorySet_FBC_Thermal_State(val); + LOGD ( "%s, pre_val :0x%x,bypass\n", __FUNCTION__, pre_val); + } + } else { + LOGD ( "%s, tvin.thermal.threshold.enable == disable\n", __FUNCTION__); + } +} + +int CTv::SetSerialSwitch(int dev_id, int switch_val) +{ + int tmp_ret = 0; + + if (dev_id == SERIAL_A) { + if (switch_val == 0) { + tmp_ret |= mSerialA.stop(); + tmp_ret |= mSerialA.CloseModule(); + + tmp_ret |= system("start console"); + } else { + tmp_ret |= system("stop console"); + + mSerialA.OpenModule(dev_id); + tmp_ret |= mSerialA.start(); + } + } else if (dev_id == SERIAL_B) { + if (switch_val == 0) { + tmp_ret |= mSerialB.stop(); + tmp_ret |= mSerialB.CloseModule(); + } else { + mSerialB.OpenModule(dev_id); + tmp_ret = mSerialB.start(); + } + } else if (dev_id == SERIAL_C) { + if (switch_val == 0) { + tmp_ret |= mSerialC.stop(); + tmp_ret |= mSerialC.CloseModule(); + } else { + mSerialC.OpenModule(dev_id); + tmp_ret = mSerialC.start(); + } + } + + return tmp_ret; +} + +int CTv::SendSerialData(int dev_id, int data_len, unsigned char data_buf[]) +{ + int tmp_ret = 0; + + if (dev_id == SERIAL_A) { + tmp_ret = mSerialA.sendData(data_len, data_buf); + } else if (dev_id == SERIAL_B) { + tmp_ret = mSerialB.sendData(data_len, data_buf); + } else if (dev_id == SERIAL_C) { + tmp_ret = mSerialC.sendData(data_len, data_buf); + } + + return tmp_ret; +} + +int CTv::ChannelExport(const char *destPath) +{ + //DIR *dirptr = NULL; + //dirptr = opendir("/storage/external_storage/sda1/"); + //if(NULL == dirptr) { + // LOGD("%s, please insert the udisk !",__FUNCTION__); + // return -2; + // } else { + char tmp[256]; + FILE *fp = NULL; + if (destPath == NULL) { + destPath = "/storage/external_storage/sda1/"; + } + + //LOGD("%s, udisk exist !",__FUNCTION__); + sprintf(tmp, "cp /param/dtv.db %s", destPath); + if (system(tmp) >= 0) { + LOGD("%s, copy dtv.db from /param to udisk success !", __FUNCTION__); + system("sync"); + fp = fopen(destPath, "r"); + if (fp == NULL) { + return -1; + } else { + fclose(fp); + fp = NULL; + return 0; + } + } else { + return -1; + } + //} +} + +int CTv::ChannelImport(const char *srcPath) +{ + if (srcPath == NULL) { + srcPath = "/storage/external_storage/sda1/dvb.db"; + } + + if (Tv_Utils_IsFileExist(srcPath) == 0) { + char tmp[256]; + LOGD("%s, file exist !" , srcPath); + CTvDatabase::GetTvDb()->UnInitTvDb(); + sprintf(tmp, "rm /param/dtv.db"); + if (system(tmp) >= 0) { + LOGD("%s, rm /param/dtv.db success !", __FUNCTION__); + memset(tmp, 0, sizeof(tmp)); + sprintf(tmp, "cp %s /param/dtv.db", srcPath); + if (system(tmp) >= 0) { + LOGD("%s, copy to /param/dtv.db success !", srcPath); + system("sync"); + CTvDatabase::GetTvDb()->InitTvDb(TV_DB_PATH); + return 0; + } else { + LOGD("%s, copy dtv.db from udisk to /param failed !", __FUNCTION__); + return -1; + } + } else { + LOGD("%s, rm /param/dtv.db failed !", __FUNCTION__); + return -2; + } + } else { + LOGD("%s, dtv.db file does not exist in the udisk!" , srcPath); + return -2; + } + +} + +int CTv::Tv_GetProjectInfo(project_info_t *ptrInfo) +{ + return GetProjectInfo(ptrInfo); +} + +int CTv::Tv_GetPlatformType() +{ + return GetPlatformHaveFBCFlag(); +} + +int CTv::Tv_SetDDDRCMode(tv_source_input_t source_input) +{ + if (source_input == SOURCE_DTV) { + if (GetPlatformHaveDDFlag() == 1) { + Tv_Utils_SetFileAttrStr("/sys/class/audiodsp/ac3_drc_control", "drcmode 3"); + } + } else { + if (GetPlatformHaveDDFlag() == 1) { + Tv_Utils_SetFileAttrStr("/sys/class/audiodsp/ac3_drc_control", "drcmode 2"); + } + } + + return 0; +} + +//PQ +int CTv::Tv_SetBrightness ( int brightness, tv_source_input_type_t source_type, int is_save ) +{ + return mVpp.Tv_SetBrightness(brightness, (tv_source_input_type_t)source_type, mSigDetectThread.getCurSigInfo().fmt, mSigDetectThread.getCurSigInfo().trans_fmt, Check2Dor3D(m_mode_3d, mSigDetectThread.getCurSigInfo().trans_fmt ), is_save); +} + +int CTv::Tv_GetBrightness ( tv_source_input_type_t source_type ) +{ + return mVpp.Tv_GetBrightness((tv_source_input_type_t)source_type); +} + +int CTv::Tv_SetContrast ( int contrast, tv_source_input_type_t source_type, int is_save ) +{ + return mVpp.Tv_SetContrast(contrast, (tv_source_input_type_t)source_type, mSigDetectThread.getCurSigInfo().fmt, mSigDetectThread.getCurSigInfo().trans_fmt, Check2Dor3D(m_mode_3d, mSigDetectThread.getCurSigInfo().trans_fmt ), is_save); +} + +int CTv::Tv_GetContrast ( tv_source_input_type_t source_type ) +{ + return mVpp.Tv_GetContrast((tv_source_input_type_t)source_type); +} + +int CTv::Tv_SetSaturation ( int satuation, tv_source_input_type_t source_type, tvin_sig_fmt_t fmt, int is_save ) +{ + return mVpp.Tv_SetSaturation(satuation, (tv_source_input_type_t)source_type, (tvin_sig_fmt_t)fmt, mSigDetectThread.getCurSigInfo().trans_fmt, Check2Dor3D(m_mode_3d, mSigDetectThread.getCurSigInfo().trans_fmt ), is_save); +} + +int CTv::Tv_GetSaturation ( tv_source_input_type_t source_type ) +{ + return mVpp.Tv_GetSaturation((tv_source_input_type_t)source_type); +} + +int CTv::Tv_SetHue ( int hue, tv_source_input_type_t source_type, tvin_sig_fmt_t fmt, int is_save ) +{ + return mVpp.Tv_SetHue(hue, (tv_source_input_type_t)source_type, (tvin_sig_fmt_t)fmt, mSigDetectThread.getCurSigInfo().trans_fmt, Check2Dor3D(m_mode_3d, mSigDetectThread.getCurSigInfo().trans_fmt ), is_save); +} + +int CTv::Tv_GetHue ( tv_source_input_type_t source_type ) +{ + return mVpp.Tv_GetHue((tv_source_input_type_t)source_type); +} + +int CTv::Tv_SetPQMode ( vpp_picture_mode_t mode, tv_source_input_type_t source_type, int is_save ) +{ + return mVpp.Tv_SetPQMode((vpp_picture_mode_t)mode, (tv_source_input_type_t)source_type, mSigDetectThread.getCurSigInfo().fmt, mSigDetectThread.getCurSigInfo().trans_fmt, Check2Dor3D(m_mode_3d, mSigDetectThread.getCurSigInfo().trans_fmt ), is_save); +} + +vpp_picture_mode_t CTv::Tv_GetPQMode ( tv_source_input_type_t source_type ) +{ + return mVpp.Tv_GetPQMode((tv_source_input_type_t)source_type); +} + +int CTv::Tv_SetSharpness ( int value, tv_source_input_type_t source_type, int en, int is_save ) +{ + return mVpp.Tv_SetSharpness(value, (tv_source_input_type_t)source_type, en, Check2Dor3D(m_mode_3d, mSigDetectThread.getCurSigInfo().trans_fmt ), mSigDetectThread.getCurSigInfo().fmt, mSigDetectThread.getCurSigInfo().trans_fmt, is_save); +} + +int CTv::Tv_GetSharpness ( tv_source_input_type_t source_type ) +{ + return mVpp.Tv_GetSharpness((tv_source_input_type_t)source_type); +} + +int CTv::Tv_SaveSharpness ( int value, tv_source_input_type_t source_type, int en ) +{ + if ( en == 1 ) { + return SSMSaveSharpness( (tv_source_input_type_t)source_type, value ); + } else { + return 0; + } +} + +int CTv::Tv_SetBacklight ( int value, tv_source_input_type_t source_type, int is_save ) +{ + return mVpp.Tv_SetBacklight(value, (tv_source_input_type_t)source_type, is_save); +} + +int CTv::Tv_GetBacklight ( tv_source_input_type_t source_type ) +{ + return mVpp.Tv_GetBacklight((tv_source_input_type_t)source_type); +} + +int CTv::Tv_SetColorTemperature ( vpp_color_temperature_mode_t mode, tv_source_input_type_t source_type, int is_save ) +{ + return mVpp.Tv_SetColorTemperature((vpp_color_temperature_mode_t)mode, (tv_source_input_type_t)source_type, is_save); +} + +vpp_color_temperature_mode_t CTv::Tv_GetColorTemperature ( tv_source_input_type_t source_type ) +{ + return mVpp.Tv_GetColorTemperature((tv_source_input_type_t)source_type); +} + +int CTv::Tv_SaveColorTemp ( vpp_color_temperature_mode_t mode, tv_source_input_type_t source_type ) +{ + return mVpp.Tv_SaveColorTemp((vpp_color_temperature_mode_t)mode, (tv_source_input_type_t)source_type); +} + +int CTv::Tv_SetDisplayMode ( vpp_display_mode_t mode, tv_source_input_type_t source_type, tvin_sig_fmt_t fmt, int is_save ) +{ + int ret = Vpp_SetDisplayMode((vpp_display_mode_t)mode, (tv_source_input_type_t)source_type, (tvin_sig_fmt_t)fmt); + if (ret == 0) { + if (is_save == 1) { + ret = ret | SSMSaveDisplayMode ( source_type, (int)mode ); + } + } + return ret; +} + +int CTv::Vpp_SetDisplayMode ( vpp_display_mode_t display_mode, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt ) +{ + LOGD("%s, display_mode = %d, source_type = %d. \n", __FUNCTION__, display_mode, source_type); + + tvin_cutwin_t cutwin = mVpp.Tv_GetOverscan ( source_type, sig_fmt, Check2Dor3D(m_mode_3d, mSigDetectThread.getCurSigInfo().trans_fmt ), mSigDetectThread.getCurSigInfo().trans_fmt); + int video_screen_mode = CAv::VIDEO_WIDEOPTION_16_9; + tvin_window_pos_t win_pos; + int display_resolution = Vpp_GetDisplayResolutionInfo(&win_pos); + + + if ( source_type == SOURCE_TYPE_HDMI ) { + if ( sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_60HZ + || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080I_60HZ + || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_50HZ + || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080I_50HZ_A + || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080I_50HZ_B + || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_24HZ + || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_25HZ + || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_30HZ + || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080I_100HZ + || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080I_120HZ + || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_100HZ + || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_120HZ + || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080I_50HZ_FRAME_PACKING + || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_24HZ_FRAME_PACKING + || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_30HZ_FRAME_PACKING + || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080I_60HZ_ALTERNATIVE + || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080I_50HZ_ALTERNATIVE + || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_24HZ_ALTERNATIVE + || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_30HZ_ALTERNATIVE + || sig_fmt == TVIN_SIG_FMT_HDMI_3840_2160_00HZ + || sig_fmt == TVIN_SIG_FMT_HDMI_4096_2160_00HZ + + ) { + if ( display_mode == VPP_DISPLAY_MODE_NOSCALEUP ) { + cutwin.vs = 0; + cutwin.hs = 1; + cutwin.ve = 0; + cutwin.he = 1; + } + } + } + + switch ( display_mode ) { + case VPP_DISPLAY_MODE_169: + video_screen_mode = CAv::VIDEO_WIDEOPTION_16_9; + break; + case VPP_DISPLAY_MODE_MODE43: + video_screen_mode = CAv::VIDEO_WIDEOPTION_4_3; + break; + case VPP_DISPLAY_MODE_NORMAL: + video_screen_mode = CAv::VIDEO_WIDEOPTION_NORMAL; + break; + case VPP_DISPLAY_MODE_FULL: + break; + case VPP_DISPLAY_MODE_NOSCALEUP: { + if ( source_type == SOURCE_TYPE_HDMI ) { + int retValue = GetFileAttrIntValue ( "/sys/module/tvin_hdmirx/parameters/cur_colorspace" ); + switch ( retValue ) { + case RGB_FORMAT: + mVpp.Tv_SetColorSpaceMode ( VPP_COLOR_SPACE_RGB ); + cutwin.vs = 0; + cutwin.hs = 0; + cutwin.ve = 0; + cutwin.he = 0; + break; + + default: + mVpp.Tv_SetColorSpaceMode ( VPP_COLOR_SPACE_YUV ); + break; + } + } else { + video_screen_mode = CAv::VIDEO_WIDEOPTION_NORMAL_NOSCALEUP; + } + break; + } + case VPP_DISPLAY_MODE_FULL_REAL: + video_screen_mode = CAv::VIDEO_WIDEOPTION_16_9; //added for N360 by haifeng.liu + break; + case VPP_DISPLAY_MODE_PERSON: + if ( display_resolution == VPP_DISPLAY_RESOLUTION_1366X768 ) { + win_pos.y1 = -45; + win_pos.y2 = win_pos.y2 - win_pos.y1; + } else { + win_pos.y1 = -65; + win_pos.y2 = win_pos.y2 - win_pos.y1; + } + video_screen_mode = CAv::VIDEO_WIDEOPTION_FULL_STRETCH; + break; + case VPP_DISPLAY_MODE_MOVIE: + if ( display_resolution == VPP_DISPLAY_RESOLUTION_1366X768 ) { + win_pos.y1 = -61; + win_pos.y2 = win_pos.y2 - win_pos.y1; + } else { + win_pos.y1 = -86; + win_pos.y2 = win_pos.y2 - win_pos.y1; + } + video_screen_mode = CAv::VIDEO_WIDEOPTION_FULL_STRETCH; + break; + case VPP_DISPLAY_MODE_CAPTION: + if (display_resolution == VPP_DISPLAY_RESOLUTION_1366X768 ) { + win_pos.y1 = -61; + win_pos.y2 = win_pos.y2 + 2; + } else { + win_pos.y1 = -86; + win_pos.y2 = win_pos.y2 + 4; + } + video_screen_mode = CAv::VIDEO_WIDEOPTION_FULL_STRETCH; + break; + case VPP_DISPLAY_MODE_ZOOM: + if (display_resolution == VPP_DISPLAY_RESOLUTION_1366X768 ) { + win_pos.y1 = -128; + win_pos.y2 = win_pos.y2 - win_pos.y1; + } else { + win_pos.y1 = -180; + win_pos.y2 = win_pos.y2 - win_pos.y1; + } + video_screen_mode = CAv::VIDEO_WIDEOPTION_FULL_STRETCH; + break; + default: + break; + } + + if ( display_mode == VPP_DISPLAY_MODE_FULL ) { + if ( source_type == SOURCE_TYPE_HDMI ) { + if ( sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_60HZ + //|| sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080I_60HZ + || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_50HZ + //|| sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080I_50HZ_A + //|| sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080I_50HZ_B + || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_24HZ + || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_25HZ + || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_30HZ + //|| sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080I_100HZ + //|| sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080I_120HZ + || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_100HZ + || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_120HZ + //|| sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080I_50HZ_FRAME_PACKING + || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_24HZ_FRAME_PACKING + || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_30HZ_FRAME_PACKING + //|| sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080I_60HZ_ALTERNATIVE + //|| sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080I_50HZ_ALTERNATIVE + || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_24HZ_ALTERNATIVE + || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_30HZ_ALTERNATIVE + || sig_fmt == TVIN_SIG_FMT_HDMI_3840_2160_00HZ + || sig_fmt == TVIN_SIG_FMT_HDMI_4096_2160_00HZ ) { + const char *config_value = config_get_str ( "TV", "vpp.hdmi.nonlinear.scaling", "null" ); + if ( strcmp ( config_value, "enable" ) == 0 ) { + video_screen_mode = CAv::VIDEO_WIDEOPTION_NONLINEAR; + mVpp.VPP_SetNonLinearFactor ( 20 ); + } + } else { + video_screen_mode = CAv::VIDEO_WIDEOPTION_NONLINEAR; + mVpp.VPP_SetNonLinearFactor ( 20 ); + } + cutwin.vs = 0; + cutwin.hs = 1; + cutwin.ve = 0; + cutwin.he = 1; + } + } + + if ( m_mode_3d == VIDEO_3D_MODE_DISABLE ) { + if (display_mode == VPP_DISPLAY_MODE_FULL_REAL && source_type == SOURCE_TYPE_HDMI) { + //added for N360 by haifeng.liu + cutwin.vs = 0; + cutwin.hs = 0; + cutwin.ve = 0; + cutwin.he = 0; + } + } else { + cutwin.vs = 0; + cutwin.hs = 0; + cutwin.ve = 0; + cutwin.he = 0; + video_screen_mode = CAv::VIDEO_WIDEOPTION_FULL_STRETCH; + } + + mAv.setVideoAxis ( win_pos.x1, win_pos.y1, win_pos.x2, win_pos.y2 ); + mAv.setVideoScreenMode(video_screen_mode); + mVpp.VPP_SetVideoCrop(cutwin.vs, cutwin.hs, cutwin.ve, cutwin.he); + return 0; +} + +vpp_display_mode_t CTv::Tv_GetDisplayMode ( tv_source_input_type_t source_type ) +{ + return mVpp.Tv_GetDisplayMode((tv_source_input_type_t)source_type); +} + +int CTv::Tv_SaveDisplayMode ( vpp_display_mode_t mode, tv_source_input_type_t source_type ) +{ + return SSMSaveDisplayMode ( source_type, (int)mode ); +} + +int CTv::Tv_SetNoiseReductionMode ( vpp_noise_reduction_mode_t mode, tv_source_input_type_t source_type, int is_save ) +{ + return mVpp.Tv_SetNoiseReductionMode((vpp_noise_reduction_mode_t)mode, (tv_source_input_type_t)source_type, mSigDetectThread.getCurSigInfo().fmt, Check2Dor3D(m_mode_3d, mSigDetectThread.getCurSigInfo().trans_fmt ), mSigDetectThread.getCurSigInfo().trans_fmt, is_save); +} + +vpp_noise_reduction_mode_t CTv::Tv_GetNoiseReductionMode ( tv_source_input_type_t source_type ) +{ + return mVpp.Tv_GetNoiseReductionMode((tv_source_input_type_t)source_type); +} + +int CTv::Tv_SaveNoiseReductionMode ( vpp_noise_reduction_mode_t mode, tv_source_input_type_t source_type ) +{ + return mVpp.Tv_SaveNoiseReductionMode((vpp_noise_reduction_mode_t)mode, (tv_source_input_type_t)source_type); +} + +int CTv::Tv_SetRGBOGO_PostOffset(int type, int offset) +{ + return mVpp.Tv_SetRGBOGO_PostOffset(type, offset); +} + +int CTv::Tv_SetRGBOGO_Gain(int type, int mode) +{ + return mVpp.Tv_SetRGBOGO_Gain(type, mode); +} + +int CTv::Tv_GetRGBOGO_PostOffset ( int type ) +{ + return mVpp.Tv_GetRGBOGO_PostOffset(type); +} + +int CTv::Tv_GetRGBOGO_Gain ( int type ) +{ + return mVpp.Tv_GetRGBOGO_Gain(type); +} + +int CTv::Tv_FactorySetPQMode_Brightness ( int source_type, int pq_mode, int brightness ) +{ + return mVpp.Tv_FactorySetPQMode_Brightness(source_type, pq_mode, brightness); +} + +int CTv::Tv_FactoryGetPQMode_Brightness ( int source_type, int pq_mode ) +{ + return mVpp.Tv_FactoryGetPQMode_Brightness(source_type, pq_mode); +} + +int CTv::Tv_FactorySetPQMode_Contrast ( int source_type, int pq_mode, int contrast ) +{ + return mVpp.Tv_FactorySetPQMode_Contrast(source_type, pq_mode, contrast); +} + +int CTv::Tv_FactoryGetPQMode_Contrast ( int source_type, int pq_mode ) +{ + return mVpp.Tv_FactoryGetPQMode_Contrast(source_type, pq_mode); +} + +int CTv::Tv_FactorySetPQMode_Saturation ( int source_type, int pq_mode, int saturation ) +{ + return mVpp.Tv_FactorySetPQMode_Saturation(source_type, pq_mode, saturation); +} + +int CTv::Tv_FactoryGetPQMode_Saturation ( int source_type, int pq_mode ) +{ + return mVpp.Tv_FactoryGetPQMode_Saturation(source_type, pq_mode); +} + +int CTv::Tv_FactorySetPQMode_Hue ( int source_type, int pq_mode, int hue ) +{ + return mVpp.Tv_FactorySetPQMode_Hue(source_type, pq_mode, hue); +} + +int CTv::Tv_FactoryGetPQMode_Hue ( int source_type, int pq_mode ) +{ + return mVpp.Tv_FactoryGetPQMode_Hue(source_type, pq_mode); +} + +int CTv::Tv_FactorySetPQMode_Sharpness ( int source_type, int pq_mode, int sharpness ) +{ + return mVpp.Tv_FactorySetPQMode_Sharpness(source_type, pq_mode, sharpness); +} + +int CTv::Tv_FactoryGetPQMode_Sharpness ( int source_type, int pq_mode ) +{ + return mVpp.Tv_FactoryGetPQMode_Sharpness(source_type, pq_mode); +} + +int CTv::Tv_FactorySetColorTemp_Rgain ( int source_type, int colortemp_mode, int rgain ) +{ + return mVpp.Tv_FactorySetColorTemp_Rgain(source_type, colortemp_mode, rgain); +} + +int CTv::Tv_FactorySaveColorTemp_Rgain ( int source_type, int colortemp_mode, int rgain ) +{ + return mVpp.Tv_FactorySaveColorTemp_Rgain(source_type, colortemp_mode, rgain); +} + +int CTv::Tv_FactoryGetColorTemp_Rgain ( int source_type, int colortemp_mode ) +{ + return mVpp.Tv_FactoryGetColorTemp_Rgain(source_type, colortemp_mode); +} + +int CTv::Tv_FactorySetColorTemp_Ggain ( int source_type, int colortemp_mode, int ggain ) +{ + return mVpp.Tv_FactorySetColorTemp_Ggain(source_type, colortemp_mode, ggain); +} + +int CTv::Tv_FactorySaveColorTemp_Ggain ( int source_type, int colortemp_mode, int ggain ) +{ + return mVpp.Tv_FactorySaveColorTemp_Ggain(source_type, colortemp_mode, ggain); +} + +int CTv::Tv_FactoryGetColorTemp_Ggain ( int source_type, int colortemp_mode ) +{ + return mVpp.Tv_FactoryGetColorTemp_Ggain(source_type, colortemp_mode); +} + +int CTv::Tv_FactorySetColorTemp_Bgain ( int source_type, int colortemp_mode, int bgain ) +{ + return mVpp.Tv_FactorySetColorTemp_Bgain(source_type, colortemp_mode, bgain); +} + +int CTv::Tv_FactorySaveColorTemp_Bgain ( int source_type, int colortemp_mode, int bgain ) +{ + return mVpp.Tv_FactorySaveColorTemp_Bgain(source_type, colortemp_mode, bgain); +} + +int CTv::Tv_FactoryGetColorTemp_Bgain ( int source_type, int colortemp_mode ) +{ + return mVpp.Tv_FactoryGetColorTemp_Bgain(source_type, colortemp_mode); +} + +int CTv::Tv_FactorySetColorTemp_Roffset ( int source_type, int colortemp_mode, int roffset ) +{ + return mVpp.Tv_FactorySetColorTemp_Roffset(source_type, colortemp_mode, roffset); +} + +int CTv::Tv_FactorySaveColorTemp_Roffset ( int source_type, int colortemp_mode, int roffset ) +{ + return mVpp.Tv_FactorySaveColorTemp_Roffset(source_type, colortemp_mode, roffset); +} + +int CTv::Tv_FactoryGetColorTemp_Roffset ( int source_type, int colortemp_mode ) +{ + return mVpp.Tv_FactoryGetColorTemp_Roffset(source_type, colortemp_mode); +} + +int CTv::Tv_FactorySetColorTemp_Goffset ( int source_type, int colortemp_mode, int goffset ) +{ + return mVpp.Tv_FactorySetColorTemp_Goffset(source_type, colortemp_mode, goffset); +} + +int CTv::Tv_FactorySaveColorTemp_Goffset ( int source_type, int colortemp_mode, int goffset ) +{ + return mVpp.Tv_FactorySaveColorTemp_Goffset(source_type, colortemp_mode, goffset); +} + +int CTv::Tv_FactoryGetColorTemp_Goffset ( int source_type, int colortemp_mode ) +{ + return mVpp.Tv_FactoryGetColorTemp_Goffset(source_type, colortemp_mode); +} + +int CTv::Tv_FactorySetColorTemp_Boffset ( int source_type, int colortemp_mode, int boffset ) +{ + return mVpp.Tv_FactorySetColorTemp_Boffset(source_type, colortemp_mode, boffset); +} + +int CTv::Tv_FactorySaveColorTemp_Boffset ( int source_type, int colortemp_mode, int boffset ) +{ + return mVpp.Tv_FactorySaveColorTemp_Boffset(source_type, colortemp_mode, boffset); +} + +int CTv::Tv_FactoryGetColorTemp_Boffset ( int source_type, int colortemp_mode ) +{ + return mVpp.Tv_FactoryGetColorTemp_Boffset(source_type, colortemp_mode); +} + +int CTv::GetColorTemperatureParams ( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t *params ) +{ + return mVpp.GetColorTemperatureParams(Tempmode, params); +} + +int CTv::Tv_FactorySetTestPattern ( int pattern ) +{ + switch ( pattern ) { + case VPP_TEST_PATTERN_NONE: + mAv.SetVideoScreenColor ( 3, 16, 128, 128 ); + break; + + case VPP_TEST_PATTERN_RED: + mAv.SetVideoScreenColor ( 0, 81, 90, 240 ); + break; + + case VPP_TEST_PATTERN_GREEN: + mAv.SetVideoScreenColor ( 0, 145, 54, 34 ); + break; + + case VPP_TEST_PATTERN_BLUE: + mAv.SetVideoScreenColor ( 0, 41, 240, 110 ); + break; + + case VPP_TEST_PATTERN_WHITE: + mAv.SetVideoScreenColor ( 0, 235, 128, 128 ); + break; + + case VPP_TEST_PATTERN_BLACK: + mAv.SetVideoScreenColor ( 0, 16, 128, 128 ); + break; + + default: + return -1; + } + return SSMSaveTestPattern ( pattern ); +} + +int CTv::Tv_FactoryGetTestPattern ( void ) +{ + return mVpp.Tv_FactoryGetTestPattern(); +} + +int CTv::Tv_FactoryResetPQMode ( void ) +{ + return mVpp.Tv_FactoryResetPQMode(); +} + +int CTv::Tv_FactoryResetColorTemp ( void ) +{ + return mVpp.Tv_FactoryResetColorTemp(); +} + +int CTv::Tv_FactorySetParamsDefault ( void ) +{ + return mVpp.Tv_FactorySetParamsDefault(); +} + +int CTv::Tv_FactorySetDDRSSC ( int step ) +{ + return mVpp.Tv_FactorySetDDRSSC(step); +} + +int CTv::Tv_FactoryGetDDRSSC ( void ) +{ + return mVpp.Tv_FactoryGetDDRSSC(); +} + +int CTv::Tv_FactorySetLVDSSSC ( int step ) +{ + return mVpp.Tv_FactorySetLVDSSSC(step); +} + +int CTv::Tv_FactoryGetLVDSSSC ( void ) +{ + return mVpp.Tv_FactoryGetLVDSSSC(); +} + +int CTv::Tv_FactorySetNolineParams ( int noline_params_type, int source_type, noline_params_t noline_params ) +{ + return mVpp.Tv_FactorySetNolineParams(noline_params_type, source_type, noline_params); +} + +noline_params_t CTv::Tv_FactoryGetNolineParams ( int noline_params_type, int source_type ) +{ + return mVpp.Tv_FactoryGetNolineParams(noline_params_type, source_type); +} + +int CTv::Tv_FactorySetOverscan ( int source_type, int fmt, int status_3d, int trans_fmt, tvin_cutwin_t cutwin_t ) +{ + //tvin_cutwin_t cutwin_t = mVpp.Tv_FactoryGetOverscan(source_type, fmt, status_3d, trans_fmt); + return mVpp.VPP_SetVideoCrop ( ( int ) cutwin_t.vs, ( int ) cutwin_t.hs, ( int ) cutwin_t.ve, ( int ) cutwin_t.he ); +} + +tvin_cutwin_t CTv::Tv_FactoryGetOverscan ( int source_type, int fmt, int status_3d, int trans_fmt ) +{ + return mVpp.Tv_FactoryGetOverscan(source_type, fmt, Check2Dor3D(m_mode_3d, (tvin_trans_fmt_t)trans_fmt), trans_fmt); +} + +int CTv::Tv_FactorySet_FBC_Brightness ( int value ) +{ + //int temp_value = (255*value)/100; + int temp_value = value; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Set_Brightness(COMM_DEV_SERIAL, temp_value); + return 0; + } + + return -1; +} + +int CTv::Tv_FactoryGet_FBC_Brightness ( void ) +{ + int temp_value = 0; + int data = 0; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Get_Brightness(COMM_DEV_SERIAL, &temp_value); + //data = (temp_value*100)/255; + data = temp_value; + + return data; + } + + return 0; +} + +int CTv::Tv_FactorySet_FBC_Contrast ( int value ) +{ + //int temp_value = (255*value)/100; + int temp_value = value; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Set_Contrast(COMM_DEV_SERIAL, temp_value); + return 0; + } + + return -1; +} + +int CTv::Tv_FactoryGet_FBC_Contrast ( void ) +{ + int temp_value = 0; + int data = 0; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Get_Contrast(COMM_DEV_SERIAL, &temp_value); + //data = (temp_value*100)/255; + data = temp_value; + + return data; + } + + return 0; +} + +int CTv::Tv_FactorySet_FBC_Saturation ( int value ) +{ + //int temp_value = (255*value)/100; + int temp_value = value; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Set_Saturation(COMM_DEV_SERIAL, temp_value); + return 0; + } + + return -1; +} + +int CTv::Tv_FactoryGet_FBC_Saturation ( void ) +{ + int temp_value = 0; + int data = 0; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Get_Saturation(COMM_DEV_SERIAL, &temp_value); + //data = (temp_value*100)/255; + data = temp_value; + + return data; + } + + return 0; +} + +int CTv::Tv_FactorySet_FBC_HueColorTint ( int value ) +{ + //int temp_value = (255*value)/100; + int temp_value = value; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Set_HueColorTint(COMM_DEV_SERIAL, temp_value); + return 0; + } + + return -1; +} + +int CTv::Tv_FactoryGet_FBC_HueColorTint ( void ) +{ + int temp_value = 0; + int data = 0; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Get_HueColorTint(COMM_DEV_SERIAL, &temp_value); + //data = (temp_value*100)/255; + data = temp_value; + + return data; + } + + return 0; +} + +int CTv::Tv_FactorySet_FBC_Backlight ( int value ) +{ + int temp_value = value; + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Set_Backlight(COMM_DEV_SERIAL, temp_value); + return 0; + } + + return -1; +} + +int CTv::Tv_FactoryGet_FBC_Backlight ( void ) +{ + int temp_value = 0; + int data = 0; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Get_Backlight(COMM_DEV_SERIAL, &temp_value); + data = temp_value; + + return data; + } + + return 0; +} + +int CTv::Tv_FactorySet_FBC_Backlight_N360 ( int value ) +{ + int val = 0; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Set_AUTO_ELEC_MODE(COMM_DEV_SERIAL, value); + val = value; + SSMSaveFBCN360BackLightVal(val); + return 0; + } + + return -1; +} + +int CTv::Tv_FactoryGet_FBC_Backlight_N360 ( void ) +{ + int temp_value = 0; + int val = 0; + + SSMReadFBCN360BackLightVal(&val); + + return val; + +} + + +int CTv::Tv_FactorySet_FBC_ELEC_MODE( int value ) +{ + int val = 0; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Set_AUTO_ELEC_MODE(COMM_DEV_SERIAL, value); + val = value; + SSMSaveFBCELECmodeVal(val); + return 0; + } + + return -1; +} + +int CTv::Tv_FactoryGet_FBC_ELEC_MODE( void ) +{ + int val = 0; + + SSMReadFBCELECmodeVal(&val); + + return val; +} + +int CTv::Tv_FactorySet_FBC_Thermal_State( int value ) +{ + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Set_Thermal_state(COMM_DEV_SERIAL, value); + return 0; + } + + return -1; +} + +int CTv::Tv_FactorySet_FBC_Picture_Mode ( int mode ) +{ + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Set_Picture_Mode(COMM_DEV_SERIAL, mode); + return 0; + } + + return -1; +} + +int CTv::Tv_FactoryGet_FBC_Picture_Mode ( void ) +{ + int mode = 0; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Get_Picture_Mode(COMM_DEV_SERIAL, &mode); + return mode; + } + + return 0; +} + +int CTv::Tv_FactorySet_FBC_Set_Test_Pattern ( int mode ) +{ + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Set_Test_Pattern(COMM_DEV_SERIAL, mode); + return 0; + } + + return -1; +} + +int CTv::Tv_FactoryGet_FBC_Get_Test_Pattern ( void ) +{ + int mode = 0; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Get_Test_Pattern(COMM_DEV_SERIAL, &mode); + return mode; + } + + return 0; +} + + +int CTv::Tv_FactorySet_FBC_Gain_Red( int value ) +{ + int temp_value = 0; + + //temp_value = (value*255)/2047; + //value 0 ~ 2047 + temp_value = value; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Set_Gain_Red(COMM_DEV_SERIAL, temp_value); + return 0; + } + + return -1; +} + +int CTv::Tv_FactoryGet_FBC_Gain_Red ( void ) +{ + int temp_value = 0, value = 0; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Get_Gain_Red(COMM_DEV_SERIAL, &temp_value); + //value 0 ~ 2047 + //value = (temp_value*2047)/255; + value = temp_value; + + return value; + } + + return 0; +} + +int CTv::Tv_FactorySet_FBC_Gain_Green( int value ) +{ + int temp_value = 0; + + //temp_value = (value*255)/2047; + //value 0 ~ 2047 + temp_value = value; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Set_Gain_Green(COMM_DEV_SERIAL, temp_value); + return 0; + } + + return -1; +} + +int CTv::Tv_FactoryGet_FBC_Gain_Green ( void ) +{ + int temp_value = 0, value = 0; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Get_Gain_Green(COMM_DEV_SERIAL, &temp_value); + //value 0 ~ 2047 + //value = (temp_value*2047)/255; + value = temp_value; + + return value; + } + + return 0; +} + +int CTv::Tv_FactorySet_FBC_Gain_Blue( int value ) +{ + int temp_value = 0; + + //temp_value = (value*255)/2047; + //value 0 ~ 2047 + temp_value = value; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Set_Gain_Blue(COMM_DEV_SERIAL, temp_value); + return 0; + } + + return -1; +} + +int CTv::Tv_FactoryGet_FBC_Gain_Blue ( void ) +{ + int temp_value = 0, value = 0; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Get_Gain_Blue(COMM_DEV_SERIAL, &temp_value); + //value 0 ~ 2047 + //value = (temp_value*2047)/255; + value = temp_value; + + return value; + } + + return 0; +} + +int CTv::Tv_FactorySet_FBC_Offset_Red( int value ) +{ + //value -1024~+1023 + int temp_value = 0; + + //temp_value = (value+1024)*255/2047; + temp_value = value; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Set_Offset_Red(COMM_DEV_SERIAL, temp_value); + return 0; + } + + return -1; +} + +int CTv::Tv_FactoryGet_FBC_Offset_Red ( void ) +{ + int temp_value = 0, value = 0; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Get_Offset_Red(COMM_DEV_SERIAL, &temp_value); + //value -1024~+1023 + //value = (temp_value*2047)/255 - 1024; + value = temp_value; + + return value; + } + + return 0; +} + +int CTv::Tv_FactorySet_FBC_Offset_Green( int value ) +{ + //value -1024~+1023 + int temp_value = 0; + + //temp_value = (value+1024)*255/2047; + temp_value = value; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Set_Offset_Green(COMM_DEV_SERIAL, temp_value); + return 0; + } + + return -1; +} + +int CTv::Tv_FactoryGet_FBC_Offset_Green ( void ) +{ + int temp_value = 0, value = 0; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Get_Offset_Green(COMM_DEV_SERIAL, &temp_value); + //value -1024~+1023 + //value = (temp_value*2047)/255 - 1024; + value = temp_value; + + return value; + } + + return 0; +} + +int CTv::Tv_FactorySet_FBC_Offset_Blue( int value ) +{ + //value -1024~+1023 + int temp_value = 0; + + //temp_value = (value+1024)*255/2047; + temp_value = value; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Set_Offset_Blue(COMM_DEV_SERIAL, value); + return 0; + } + + return -1; +} + +int CTv::Tv_FactoryGet_FBC_Offset_Blue ( void ) +{ + int temp_value = 0, value = 0; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Get_Offset_Blue(COMM_DEV_SERIAL, &temp_value); + //value -1024~+1023 + //value = (temp_value*2047)/255 - 1024; + value = temp_value; + + return value; + } + + return 0; +} + +int CTv::Tv_FactoryGetWhiteBalanceRedGain(int source_type, int colortemp_mode) +{ + int useFbc = 0; + int ret = -1; + useFbc = GetPlatformHaveFBCFlag(); + if (useFbc == 0) { // not use fbc store the white balance params + LOGD("--------- call none fbc method ---------"); + ret = mVpp.Tv_FactoryGetColorTemp_Rgain(source_type, colortemp_mode); + } else { //use fbc store the white balance params + LOGD("--------- call fbc method ---------"); + colortemp_mode = Tv_FactoryWhiteBalanceColorTempMappingG92Fbc(colortemp_mode); + ret = Tv_FactoryGetItemFromBatch((vpp_color_temperature_mode_t)colortemp_mode, 0); + } + return ret; +} + +int CTv::Tv_FactoryGetWhiteBalanceGreenGain(int source_type, int colortemp_mode) +{ + int useFbc = 0; + int ret = -1; + useFbc = GetPlatformHaveFBCFlag(); + if (useFbc == 0) { // not use fbc store the white balance params + ret = mVpp.Tv_FactoryGetColorTemp_Ggain(source_type, colortemp_mode); + } else { //use fbc store the white balance params + colortemp_mode = Tv_FactoryWhiteBalanceColorTempMappingG92Fbc(colortemp_mode); + ret = Tv_FactoryGetItemFromBatch((vpp_color_temperature_mode_t)colortemp_mode, 1); + } + return ret; +} + +int CTv::Tv_FactoryGetWhiteBalanceBlueGain(int source_type, int colortemp_mode) +{ + int useFbc = 0; + int ret = -1; + useFbc = GetPlatformHaveFBCFlag(); + if (useFbc == 0) { // not use fbc store the white balance params + ret = mVpp.Tv_FactoryGetColorTemp_Bgain(source_type, colortemp_mode); + } else { //use fbc store the white balance params + colortemp_mode = Tv_FactoryWhiteBalanceColorTempMappingG92Fbc(colortemp_mode); + ret = Tv_FactoryGetItemFromBatch((vpp_color_temperature_mode_t)colortemp_mode, 2); + } + return ret; +} + +int CTv::Tv_FactoryGetWhiteBalanceRedOffset(int source_type, int colortemp_mode) +{ + int useFbc = 0; + int ret = -1; + useFbc = GetPlatformHaveFBCFlag(); + if (useFbc == 0) { // not use fbc store the white balance params + ret = mVpp.Tv_FactoryGetColorTemp_Roffset(source_type, colortemp_mode); + } else { //use fbc store the white balance params + colortemp_mode = Tv_FactoryWhiteBalanceColorTempMappingG92Fbc(colortemp_mode); + ret = Tv_FactoryGetItemFromBatch((vpp_color_temperature_mode_t)colortemp_mode, 3); + } + return ret; +} + +int CTv::Tv_FactoryGetWhiteBalanceGreenOffset(int source_type, int colortemp_mode) +{ + int useFbc = 0; + int ret = -1; + useFbc = GetPlatformHaveFBCFlag(); + if (useFbc == 0) { // not use fbc store the white balance params + ret = mVpp.Tv_FactoryGetColorTemp_Goffset(source_type, colortemp_mode); + } else { //use fbc store the white balance params + colortemp_mode = Tv_FactoryWhiteBalanceColorTempMappingG92Fbc(colortemp_mode); + ret = Tv_FactoryGetItemFromBatch((vpp_color_temperature_mode_t)colortemp_mode, 4); + } + return ret; +} + +int CTv::Tv_FactoryGetWhiteBalanceBlueOffset(int source_type, int colortemp_mode) +{ + int useFbc = 0; + int ret = -1; + useFbc = GetPlatformHaveFBCFlag(); + if (useFbc == 0) { // not use fbc store the white balance params + ret = mVpp.Tv_FactoryGetColorTemp_Boffset(source_type, colortemp_mode); + } else { //use fbc store the white balance params + colortemp_mode = Tv_FactoryWhiteBalanceColorTempMappingG92Fbc(colortemp_mode); + ret = Tv_FactoryGetItemFromBatch((vpp_color_temperature_mode_t)colortemp_mode, 5); + } + return ret; +} + +int CTv::Tv_FactorySetWhiteBalanceRedGain(int source_type, int colortemp_mode, int value) +{ + int useFbc = 0; + int ret = -1; + useFbc = GetPlatformHaveFBCFlag(); + if (value < 0) { + value = 0; + } else if (value > 2047) { + value = 2047; + } + if (useFbc == 0) { // not use fbc store the white balance params + ret = mVpp.Tv_FactorySetColorTemp_Rgain(source_type, colortemp_mode, value); + if (ret != -1) { + LOGD("save the red gain to flash") + ret = mVpp.Tv_FactorySaveColorTemp_Rgain(source_type, colortemp_mode, value); + } + } else { //use fbc store the white balance params + value = Tv_FactoryWhiteBalanceFormatInputFbcGainParams(value); + ret = Tv_FactorySet_FBC_Gain_Red(value); + } + return ret; +} + +int CTv::Tv_FactorySetWhiteBalanceGreenGain(int source_type, int colortemp_mode, int value) +{ + int useFbc = 0; + int ret = -1; + useFbc = GetPlatformHaveFBCFlag(); + if (value < 0) { + value = 0; + } else if (value > 2047) { + value = 2047; + } + if (useFbc == 0) { // not use fbc store the white balance params + ret = mVpp.Tv_FactorySetColorTemp_Ggain(source_type, colortemp_mode, value); + if (ret != -1) { + LOGD("save the green gain to flash") + ret = mVpp.Tv_FactorySaveColorTemp_Ggain(source_type, colortemp_mode, value); + } + } else { //use fbc store the white balance params + value = Tv_FactoryWhiteBalanceFormatInputFbcGainParams(value); + ret = Tv_FactorySet_FBC_Gain_Green(value); + } + return ret; +} + +int CTv::Tv_FactorySetWhiteBalanceBlueGain(int source_type, int colortemp_mode, int value) +{ + int useFbc = 0; + int ret = -1; + useFbc = GetPlatformHaveFBCFlag(); + if (value < 0) { + value = 0; + } else if (value > 2047) { + value = 2047; + } + if (useFbc == 0) { // not use fbc store the white balance params + ret = mVpp.Tv_FactorySetColorTemp_Bgain(source_type, colortemp_mode, value); + if (ret != -1) { + LOGD("save the blue gain to flash") + ret = mVpp.Tv_FactorySaveColorTemp_Bgain(source_type, colortemp_mode, value); + } + } else { //use fbc store the white balance params + value = Tv_FactoryWhiteBalanceFormatInputFbcGainParams(value); + ret = Tv_FactorySet_FBC_Gain_Blue(value); + } + return ret; +} + +int CTv::Tv_FactorySetWhiteBalanceRedOffset(int source_type, int colortemp_mode, int value) +{ + int useFbc = 0; + int ret = -1; + if (value < -1024) { + value = -1024; + } else if (value > 1023) { + value = 1023; + } + useFbc = GetPlatformHaveFBCFlag(); + if (useFbc == 0) { // not use fbc store the white balance params + ret = mVpp.Tv_FactorySetColorTemp_Roffset(source_type, colortemp_mode, value); + if (ret != -1) { + LOGD("save the red offset to flash") + ret = mVpp.Tv_FactorySaveColorTemp_Roffset(source_type, colortemp_mode, value); + } + } else { //use fbc store the white balance params + value = Tv_FactoryWhiteBalanceFormatInputFbcOffsetParams(value); + ret = Tv_FactorySet_FBC_Offset_Red(value); + } + return ret; +} + +int CTv::Tv_FactorySetWhiteBalanceGreenOffset(int source_type, int colortemp_mode, int value) +{ + int useFbc = 0; + int ret = -1; + if (value < -1024) { + value = -1024; + } else if (value > 1023) { + value = 1023; + } + useFbc = GetPlatformHaveFBCFlag(); + if (useFbc == 0) { // not use fbc store the white balance params + ret = mVpp.Tv_FactorySetColorTemp_Goffset(source_type, colortemp_mode, value); + if (ret != -1) { + LOGD("save the green offset to flash") + ret = mVpp.Tv_FactorySaveColorTemp_Goffset(source_type, colortemp_mode, value); + } + } else { //use fbc store the white balance params + value = Tv_FactoryWhiteBalanceFormatInputFbcOffsetParams(value); + ret = Tv_FactorySet_FBC_Offset_Green(value); + } + return ret; +} + +int CTv::Tv_FactorySetWhiteBalanceBlueOffset(int source_type, int colortemp_mode, int value) +{ + int useFbc = 0; + int ret = -1; + useFbc = GetPlatformHaveFBCFlag(); + if (value < -1024) { + value = -1024; + } else if (value > 1023) { + value = 1023; + } + if (useFbc == 0) { // not use fbc store the white balance params + ret = mVpp.Tv_FactorySetColorTemp_Boffset(source_type, colortemp_mode, value); + if (ret != -1) { + LOGD("save the blue offset to flash") + ret = mVpp.Tv_FactorySaveColorTemp_Boffset(source_type, colortemp_mode, value); + } + } else { //use fbc store the white balance params + value = Tv_FactoryWhiteBalanceFormatInputFbcOffsetParams(value); + ret = Tv_FactorySet_FBC_Offset_Blue(value); + } + return ret; +} + + +int CTv::Tv_FactorySetWhiteBalanceColorTempMode(int source_type, int colortemp_mode, int is_save) +{ + int useFbc = 0; + int ret = -1; + int colorTemp = 0; + useFbc = GetPlatformHaveFBCFlag(); + if (useFbc == 0) { // not use fbc store the white balance params + ret = mVpp.Tv_SetColorTemperature((vpp_color_temperature_mode_t)colortemp_mode, (tv_source_input_type_t)source_type, is_save); + } else { //use fbc store the white balance params + colorTemp = Tv_FactoryWhiteBalanceColorTempMappingG92Fbc(colortemp_mode); + ret = Tv_FactorySet_FBC_ColorTemp_Mode(colorTemp); + } + return ret; +} + +int CTv::Tv_FactoryGetWhiteBalanceColorTempMode(int source_type ) +{ + int useFbc = 0; + int ret = -1; + useFbc = GetPlatformHaveFBCFlag(); + if (useFbc == 0) { // not use fbc store the white balance params + ret = mVpp.Tv_GetColorTemperature((tv_source_input_type_t)source_type); + } else { //use fbc store the white balance params + ret = Tv_FactoryGet_FBC_ColorTemp_Mode(); + ret = Tv_FactoryWhiteBalanceColorTempMappingFbc2G9(ret); + } + return ret; +} + +int CTv::Tv_FactoryWhiteBalanceFormatInputFbcGainParams(int value) +{ + int ret = 1024; + if (value < 0) { + ret = 0; + } else if (value > 2047) { + ret = 2047; + } else { + ret = value; + } + ret = ret >> 3; + return ret; +} + +int CTv::Tv_FactoryWhiteBalanceFormatInputFbcOffsetParams(int value) +{ + int ret = 0; + if (value < -1024) { + ret = -1024; + } else if (value > 1023) { + ret = 1023; + } else { + ret = value; + } + ret += 1024; + ret = ret >> 3; + return ret; +} + +int CTv::Tv_FactoryWhiteBalanceFormatOutputFbcOffsetParams(int value) +{ + if (value == 255) { + value = 1023; + } else { + value = value << 3; + value -= 1024; + } + return value; +} + +int CTv::Tv_FactoryWhiteBalanceFormatOutputFbcGainParams(int value) +{ + value = value << 3; + if (value < 0) { + value = 0; + } else if (value > 2047) { + value = 2047; + } + return value; +} + + +int CTv::Tv_FactorySaveWhiteBalancePramas(int source_type, int tempmode, int r_gain, int g_gain, int b_gain, int r_offset, int g_offset, int b_offset) +{ + int useFbc = 0; + int ret = 0; + useFbc = GetPlatformHaveFBCFlag(); + if (useFbc == 0) { // not use fbc store the white balance params + mVpp.Tv_SaveColorTemp((vpp_color_temperature_mode_t) tempmode, (tv_source_input_type_t) source_type); + mVpp.Tv_FactorySaveColorTemp_Rgain(source_type, tempmode, r_gain); + mVpp.Tv_FactorySaveColorTemp_Ggain(source_type, tempmode, g_gain); + mVpp.Tv_FactorySaveColorTemp_Bgain(source_type, tempmode, b_gain); + mVpp.Tv_FactorySaveColorTemp_Roffset(source_type, tempmode, r_offset); + mVpp.Tv_FactorySaveColorTemp_Goffset(source_type, tempmode, g_offset); + mVpp.Tv_FactorySaveColorTemp_Boffset(source_type, tempmode, b_offset); + } else { //use fbc store the white balance params + tcon_rgb_ogo_t params; + + params.r_gain = Tv_FactoryWhiteBalanceFormatInputFbcGainParams(r_gain); + params.g_gain = Tv_FactoryWhiteBalanceFormatInputFbcGainParams(g_gain); + params.b_gain = Tv_FactoryWhiteBalanceFormatInputFbcGainParams(b_gain); + params.r_post_offset = Tv_FactoryWhiteBalanceFormatInputFbcOffsetParams(r_offset); + params.g_post_offset = Tv_FactoryWhiteBalanceFormatInputFbcOffsetParams(g_offset); + params.b_post_offset = Tv_FactoryWhiteBalanceFormatInputFbcOffsetParams(b_offset); + tempmode = Tv_FactoryWhiteBalanceColorTempMappingG92Fbc(tempmode); + ret = Tv_FactorySet_FBC_ColorTemp_Batch((vpp_color_temperature_mode_t)tempmode, params); + } + return ret; +} + + +int CTv::Tv_FactoryCloseWhiteBalanceGrayPattern() +{ + int useFbc = 0; + int ret = -1; + useFbc = GetPlatformHaveFBCFlag(); + if (useFbc == 0) { // not use fbc store the white balance params + ret = mVpp.VPP_SetGrayPattern(0); + } else { //use fbc store the white balance params + ret = Tv_FactoryClose_FBC_GrayPattern(); + } + return ret; +} + +int CTv::Tv_FactoryOpenWhiteBalanceGrayPattern() +{ + int useFbc = 0; + int ret = -1; + useFbc = GetPlatformHaveFBCFlag(); + if (useFbc == 0) { // not use fbc store the white balance params + ret = 0; + } else { //use fbc store the white balance params + ret = Tv_FactoryOpen_FBC_GrayPattern(); + } + return ret; +} + +int CTv::Tv_FactorySetWhiteBalanceGrayPattern(int value) +{ + int useFbc = 0; + int ret = -1; + useFbc = GetPlatformHaveFBCFlag(); + if (useFbc == 0) { + ret = mVpp.VPP_SetGrayPattern(value); + } else { + ret = Tv_FactorySet_FBC_GrayPattern(value); + } + return ret; +} + +int CTv:: Tv_FactoryGetWhiteBalanceGrayPattern() +{ + int useFbc = 0; + int ret = -1; + useFbc = GetPlatformHaveFBCFlag(); + if (useFbc == 0) { + ret = mVpp.VPP_GetGrayPattern(); + } else { + + } + return ret; +} + + +/** +* The color temperature enum order is diffrent bettewn G9 and Fbc, so we have to make a mapping +**/ +int CTv::Tv_FactoryWhiteBalanceColorTempMappingG92Fbc(int Tempmode) +{ + int ret = Tempmode; + switch (Tempmode) { + case 0: //standard + ret = 1; + break; + case 1: //warm + ret = 2; + break; + case 2: //cold + ret = 0; + break; + default: + break; + } + return ret; +} + +/** +* The color temperature enum order is diffrent bettewn G9 and Fbc, so we have to make a mapping +**/ +int CTv::Tv_FactoryWhiteBalanceColorTempMappingFbc2G9(int Tempmode) +{ + int ret = Tempmode; + switch (Tempmode) { + case 0: //cold + ret = 2; + break; + case 1: //standard + ret = 0; + break; + case 2: //warm + ret = 1; + break; + default: + break; + } + return ret; +} + +int CTv::Tv_FactoryWhiteBalanceGetAllParams(int Tempmode, tcon_rgb_ogo_t *params) +{ + int ret = -1; + Tempmode = Tv_FactoryWhiteBalanceColorTempMappingG92Fbc(Tempmode); + ret = Tv_FactoryGet_FBC_ColorTemp_Batch((vpp_color_temperature_mode_t)Tempmode, params); + params->r_gain = Tv_FactoryWhiteBalanceFormatOutputFbcGainParams(params->r_gain); + params->g_gain = Tv_FactoryWhiteBalanceFormatOutputFbcGainParams(params->g_gain); + params->b_gain = Tv_FactoryWhiteBalanceFormatOutputFbcGainParams(params->b_gain); + params->r_post_offset = Tv_FactoryWhiteBalanceFormatOutputFbcOffsetParams(params->r_post_offset); + params->g_post_offset = Tv_FactoryWhiteBalanceFormatOutputFbcOffsetParams(params->g_post_offset); + params->b_post_offset = Tv_FactoryWhiteBalanceFormatOutputFbcOffsetParams(params->b_post_offset); + return ret; +} + +int CTv::Tv_FactorySet_FBC_GrayPattern(int value) +{ + int ret = -1; + unsigned char grayValue = 0; + if (value > 255) { + grayValue = 255; + } else if (value < 0) { + grayValue = 0; + } else { + grayValue = (unsigned char)(0xFF & value); + } + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + ret = fbcIns->cfbc_WhiteBalance_SetGrayPattern(COMM_DEV_SERIAL, grayValue); + } + return ret; +} + +int CTv::Tv_FactoryOpen_FBC_GrayPattern() +{ + int ret = -1; + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + ret = fbcIns->cfbc_WhiteBalance_GrayPattern_OnOff(COMM_DEV_SERIAL, 0); + } + return ret; +} + +int CTv::Tv_FactoryClose_FBC_GrayPattern() +{ + int ret = -1; + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + ret = fbcIns->cfbc_WhiteBalance_GrayPattern_OnOff(COMM_DEV_SERIAL, 1); + } + return ret; +} + +int CTv::Tv_FactorySet_FBC_ColorTemp_Mode( int mode ) +{ + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Set_ColorTemp_Mode(COMM_DEV_SERIAL, mode); + return 0; + } + + return -1; +} + +int CTv::Tv_FactoryGet_FBC_ColorTemp_Mode ( void ) +{ + int temp_mode = 0; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Get_ColorTemp_Mode(COMM_DEV_SERIAL, &temp_mode); + return temp_mode; + } + + return 0; +} +int CTv::Tv_FactorySet_FBC_ColorTemp_Mode_N360( int mode ) +{ + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Set_ColorTemp_Mode(COMM_DEV_SERIAL, mode); + SSMSaveFBCN360ColorTempVal(mode); + return 0; + } + + return -1; +} + +int CTv::Tv_FactoryGet_FBC_ColorTemp_Mode_N360 ( void ) +{ + int temp_mode = 0; + + SSMReadFBCN360ColorTempVal(&temp_mode); + + return temp_mode; +} + +int CTv::Tv_FactorySet_FBC_WB_Initial( int status ) +{ + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Set_WB_Initial(COMM_DEV_SERIAL, status); + return 0; + } + + return -1; +} + +int CTv::Tv_FactoryGet_FBC_WB_Initial ( void ) +{ + int temp_status = 0; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Get_WB_Initial(COMM_DEV_SERIAL, &temp_status); + return temp_status; + } + + return 0; +} + +int CTv::Tv_FactorySet_FBC_ColorTemp_Batch(vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t params) +{ + unsigned char mode = 0, r_gain, g_gain, b_gain, r_offset, g_offset, b_offset; + switch (Tempmode) { + case VPP_COLOR_TEMPERATURE_MODE_STANDARD: + mode = 1; //COLOR_TEMP_STD + break; + case VPP_COLOR_TEMPERATURE_MODE_WARM: + mode = 2; //COLOR_TEMP_WARM + break; + case VPP_COLOR_TEMPERATURE_MODE_COLD: + mode = 3; //COLOR_TEMP_COLD + break; + case VPP_COLOR_TEMPERATURE_MODE_USER: + mode = 3; //COLOR_TEMP_USER + break; + } + r_gain = (params.r_gain * 255) / 2047; // u1.10, range 0~2047, default is 1024 (1.0x) + g_gain = (params.g_gain * 255) / 2047; + b_gain = (params.b_gain * 255) / 2047; + r_offset = (params.r_post_offset + 1024) * 255 / 2047; // s11.0, range -1024~+1023, default is 0 + g_offset = (params.g_post_offset + 1024) * 255 / 2047; + b_offset = (params.b_post_offset + 1024) * 255 / 2047; + LOGD ( "~Tv_FactorySet_FBC_ColorTemp_Batch##%d,%d,%d,%d,%d,%d,##", r_gain, g_gain, b_gain, r_offset, g_offset, b_offset ); + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Set_WB_Batch(COMM_DEV_SERIAL, mode, r_gain, g_gain, b_gain, r_offset, g_offset, b_offset); + return 0; + } + + return -1; +} + +int CTv::Tv_FactoryGet_FBC_ColorTemp_Batch ( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t *params ) +{ + unsigned char mode = 0, r_gain, g_gain, b_gain, r_offset, g_offset, b_offset; + switch (Tempmode) { + case VPP_COLOR_TEMPERATURE_MODE_STANDARD: + mode = 1; //COLOR_TEMP_STD + break; + case VPP_COLOR_TEMPERATURE_MODE_WARM: + mode = 2; //COLOR_TEMP_WARM + break; + case VPP_COLOR_TEMPERATURE_MODE_COLD: + mode = 3; //COLOR_TEMP_COLD + break; + case VPP_COLOR_TEMPERATURE_MODE_USER: + mode = 3; //COLOR_TEMP_USER + break; + } + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Get_WB_Batch(COMM_DEV_SERIAL, mode, &r_gain, &g_gain, &b_gain, &r_offset, &g_offset, &b_offset); + LOGD ( "~Tv_FactoryGet_FBC_ColorTemp_Batch##%d,%d,%d,%d,%d,%d,##", r_gain, g_gain, b_gain, r_offset, g_offset, b_offset ); + + params->r_gain = (r_gain * 2047) / 255; + params->g_gain = (g_gain * 2047) / 255; + params->b_gain = (b_gain * 2047) / 255; + params->r_post_offset = (r_offset * 2047) / 255 - 1024; + params->g_post_offset = (g_offset * 2047) / 255 - 1024; + params->b_post_offset = (b_offset * 2047) / 255 - 1024; + + return 0; + } + + return -1; +} + +int CTv::Tv_FactorySet_WB_G9_To_FBC( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t params ) +{ + Tv_FactorySet_FBC_ColorTemp_Batch(Tempmode, params); + + return 0; +} + +int CTv::Tv_FactoryGet_WB_G9_To_FBC ( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t *params ) +{ + int temp_status = 0; + + Tv_FactoryGet_FBC_ColorTemp_Batch(Tempmode, params); + + return temp_status; +} + +int CTv::Tv_FactoryGetItemFromBatch(vpp_color_temperature_mode_t colortemp_mode, int item) +{ + tcon_rgb_ogo_t params; + int ret = 0; + + Tv_FactoryGet_FBC_ColorTemp_Batch((vpp_color_temperature_mode_t)colortemp_mode, ¶ms); + switch (item) { + case 0: + ret = params.r_gain; + ret = Tv_FactoryWhiteBalanceFormatOutputFbcGainParams(ret); + break; + case 1: + ret = params.g_gain; + ret = Tv_FactoryWhiteBalanceFormatOutputFbcGainParams(ret); + break; + case 2: + ret = params.b_gain; + ret = Tv_FactoryWhiteBalanceFormatOutputFbcGainParams(ret); + break; + case 3: + ret = params.r_post_offset; + ret = Tv_FactoryWhiteBalanceFormatOutputFbcOffsetParams(ret); + break; + case 4: + ret = params.g_post_offset; + ret = Tv_FactoryWhiteBalanceFormatOutputFbcOffsetParams(ret); + break; + case 5: + ret = params.b_post_offset; + ret = Tv_FactoryWhiteBalanceFormatOutputFbcOffsetParams(ret); + break; + default: + ret = 0; + } + return ret; + +} + + +int CTv::Tv_FactorySet_FBC_CM_OnOff( unsigned char status ) +{ + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Set_CM(COMM_DEV_SERIAL, status); + return 0; + } + + return -1; +} + +int CTv::Tv_FactoryGet_FBC_CM_OnOff (void) +{ + int temp_status = 0; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Get_CM(COMM_DEV_SERIAL, &temp_status); + return temp_status; + } + + return 0; +} + +int CTv::Tv_FactorySet_FBC_DNLP_OnOff( unsigned char status ) +{ + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Set_DNLP(COMM_DEV_SERIAL, status); + return 0; + } + + return -1; +} + +int CTv::Tv_FactoryGet_FBC_DNLP_OnOff (void) +{ + int temp_status = 0; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Get_DNLP(COMM_DEV_SERIAL, &temp_status); + return temp_status; + } + + return 0; +} + +int CTv::Tv_FactorySet_FBC_Gamma_OnOff( unsigned char status ) +{ + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Set_Gamma(COMM_DEV_SERIAL, status); + return 0; + } + + return -1; +} + +int CTv::Tv_FactoryGet_FBC_Gamma_OnOff (void) +{ + int temp_status = 0; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Get_Gamma(COMM_DEV_SERIAL, &temp_status); + return temp_status; + } + + return 0; +} + +int CTv::Tv_FactorySet_FBC_WhiteBalance_OnOff( unsigned char status ) +{ + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Set_WhiteBalance_OnOff(COMM_DEV_SERIAL, status); + return 0; + } + + return -1; +} + +int CTv::Tv_FactoryGet_FBC_WhiteBalance_OnOff (void) +{ + int temp_status = 0; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Get_WhiteBalance_OnOff(COMM_DEV_SERIAL, &temp_status); + return temp_status; + } + + return 0; +} + + +int CTv::Tv_FactorySet_FBC_backlight_onoff ( int value ) +{ + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Set_backlight_onoff(COMM_DEV_SERIAL, value); + return 0; + } + + return -1; +} + +int CTv::Tv_FactoryGet_FBC_backlight_onoff ( void ) +{ + int temp_value = 0; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Get_backlight_onoff(COMM_DEV_SERIAL, &temp_value); + return temp_value; + } + + return 0; +} + +int CTv::Tv_FactorySet_FBC_LVDS_SSG_Set( int value ) +{ + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Set_LVDS_SSG_Set(COMM_DEV_SERIAL, value); + return 0; + } + + return -1; +} + +int CTv::Tv_FactorySet_FBC_LightSensor_Status_N310 ( int value ) +{ + int temp_value = value; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Set_LightSensor_N310(COMM_DEV_SERIAL, temp_value); + return 0; + } + + return -1; +} + +int CTv::Tv_FactoryGet_FBC_LightSensor_Status_N310 ( void ) +{ + int temp_value = 0; + int data = 0; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Get_LightSensor_N310(COMM_DEV_SERIAL, &temp_value); + + data = temp_value; + + return data; + } + + return 0; +} +int CTv::Tv_FactorySet_FBC_Dream_Panel_Status_N310 ( int value ) +{ + int temp_value = value; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Set_Dream_Panel_N310(COMM_DEV_SERIAL, temp_value); + return 0; + } + + return -1; +} + +int CTv::Tv_FactoryGet_FBC_Dream_Panel_Status_N310 ( void ) +{ + int temp_value = 0; + int data = 0; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Get_Dream_Panel_N310(COMM_DEV_SERIAL, &temp_value); + + data = temp_value; + + return data; + } + + return 0; +} + +int CTv::Tv_FactorySet_FBC_MULT_PQ_Status_N310 ( int value ) +{ + int temp_value = value; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Set_MULT_PQ_N310(COMM_DEV_SERIAL, temp_value); + return 0; + } + + return -1; +} + +int CTv::Tv_FactoryGet_FBC_MULT_PQ_Status_N310 ( void ) +{ + int temp_value = 0; + int data = 0; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Get_MULT_PQ_N310(COMM_DEV_SERIAL, &temp_value); + + data = temp_value; + + return data; + } + + return 0; +} +int CTv::Tv_FactorySet_FBC_MEMC_Status_N310 ( int value ) +{ + int temp_value = value; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Set_MEMC_N310(COMM_DEV_SERIAL, temp_value); + return 0; + } + + return -1; +} + +int CTv::Tv_FactoryGet_FBC_MEMC_Status_N310 ( void ) +{ + int temp_value = 0; + int data = 0; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + fbcIns->cfbc_Get_MEMC_N310(COMM_DEV_SERIAL, &temp_value); + + data = temp_value; + + return data; + } + + return 0; +} + + + +//audio +int CTv::SetAudioMuteForSystem(int muteOrUnmute) +{ + return mTvAudio.SetAudioMuteForSystem(muteOrUnmute); +} + +int CTv::GetAudioMuteForSystem() +{ + return mTvAudio.GetAudioMuteForSystem(); +} + +int CTv::SetAudioAVOutMute(int muteStatus) +{ + return mTvAudio.SetAudioAVOutMute(muteStatus); +} + +int CTv::GetAudioAVOutMute() +{ + return mTvAudio.GetAudioAVOutMute(); +} + +int CTv::SetAudioSPDIFMute(int muteStatus) +{ + return mTvAudio.SetAudioSPDIFMute(muteStatus); +} + +int CTv::GetAudioSPDIFMute() +{ + return mTvAudio.GetAudioSPDIFMute(); +} +int CTv::SetAudioMasterVolume(int tmp_vol) +{ + return mTvAudio.SetAudioMasterVolume(tmp_vol); +} + +int CTv::GetAudioMasterVolume() +{ + return mTvAudio.GetAudioMasterVolume(); +} + +int CTv::SaveCurAudioMasterVolume(int tmp_vol) +{ + return mTvAudio.SaveCurAudioMasterVolume(tmp_vol); +} + +int CTv::GetCurAudioMasterVolume() +{ + return mTvAudio.GetCurAudioMasterVolume(); +} + +int CTv::SetAudioBalance(int tmp_val) +{ + return mTvAudio.SetAudioBalance(tmp_val); +} + +int CTv::GetAudioBalance() +{ + return mTvAudio.GetAudioBalance(); +} + +int CTv::SaveCurAudioBalance(int tmp_val) +{ + return mTvAudio.SaveCurAudioBalance(tmp_val); +} + +int CTv::GetCurAudioBalance() +{ + return mTvAudio.GetCurAudioBalance(); +} + + +int CTv::SetAudioSupperBassVolume(int tmp_vol) +{ + return mTvAudio.SetAudioSupperBassVolume(tmp_vol); +} + +int CTv::GetAudioSupperBassVolume() +{ + return mTvAudio.GetAudioSupperBassVolume(); +} + +int CTv::SaveCurAudioSupperBassVolume(int tmp_vol) +{ + return mTvAudio.SaveCurAudioSupperBassVolume(tmp_vol); +} + +int CTv::GetCurAudioSupperBassVolume() +{ + return mTvAudio.GetCurAudioSupperBassVolume(); +} +int CTv::SetAudioSupperBassSwitch(int tmp_val) +{ + return mTvAudio.SetAudioSupperBassSwitch(tmp_val); +} + +int CTv::GetAudioSupperBassSwitch() +{ + return mTvAudio.GetAudioSupperBassSwitch(); +} + +int CTv::SaveCurAudioSupperBassSwitch(int tmp_val) +{ + return mTvAudio.SaveCurAudioSupperBassSwitch(tmp_val); +} + +int CTv::GetCurAudioSupperBassSwitch() +{ + return mTvAudio.GetCurAudioSupperBassSwitch(); +} + +int CTv::SetAudioSRSSurround(int tmp_val) +{ + return mTvAudio.SetAudioSRSSurround(tmp_val); +} + +int CTv::GetAudioSRSSurround() +{ + return mTvAudio.GetAudioSRSSurround(); +} + +int CTv::SaveCurAudioSrsSurround(int tmp_val) +{ + return mTvAudio.SaveCurAudioSrsSurround(tmp_val); +} + +int CTv::GetCurAudioSRSSurround() +{ + return mTvAudio.GetCurAudioSRSSurround(); +} + +int CTv::SetAudioSrsDialogClarity(int tmp_val) +{ + return mTvAudio.SetAudioSrsDialogClarity(tmp_val); +} + +int CTv::GetAudioSrsDialogClarity() +{ + return mTvAudio.GetAudioSrsDialogClarity(); +} + +int CTv::SaveCurAudioSrsDialogClarity(int tmp_val) +{ + return mTvAudio.SaveCurAudioSrsDialogClarity(tmp_val); +} + +int CTv::GetCurAudioSrsDialogClarity() +{ + return mTvAudio.GetCurAudioSrsDialogClarity(); +} + +int CTv::SetAudioSrsTruBass(int tmp_val) +{ + return mTvAudio.SetAudioSrsTruBass(tmp_val); +} + +int CTv::GetAudioSrsTruBass() +{ + return mTvAudio.GetAudioSrsTruBass(); +} + +int CTv::SaveCurAudioSrsTruBass(int tmp_val) +{ + return mTvAudio.SaveCurAudioSrsTruBass(tmp_val); +} + +int CTv::GetCurAudioSrsTruBass() +{ + return mTvAudio.GetCurAudioSrsTruBass(); +} + +int CTv::SetAudioBassVolume(int tmp_vol) +{ + return mTvAudio.SetAudioBassVolume(tmp_vol); +} + +int CTv::GetAudioBassVolume() +{ + return mTvAudio.GetAudioBassVolume(); +} + +int CTv::SaveCurAudioBassVolume(int tmp_vol) +{ + return mTvAudio.SaveCurAudioBassVolume(tmp_vol); +} + +int CTv::GetCurAudioBassVolume() +{ + return mTvAudio.GetCurAudioBassVolume(); +} + +int CTv::SetAudioTrebleVolume(int tmp_vol) +{ + return mTvAudio.SetAudioTrebleVolume(tmp_vol); +} + +int CTv::GetAudioTrebleVolume() +{ + return mTvAudio.GetAudioTrebleVolume(); +} + +int CTv::SaveCurAudioTrebleVolume(int tmp_vol) +{ + return mTvAudio.SaveCurAudioTrebleVolume(tmp_vol); +} + +int CTv::GetCurAudioTrebleVolume() +{ + return mTvAudio.GetCurAudioTrebleVolume(); +} + +int CTv::SetAudioSoundMode(int tmp_val) +{ + return mTvAudio.SetAudioSoundMode(tmp_val); +} + +int CTv::GetAudioSoundMode() +{ + return mTvAudio.GetAudioSoundMode(); +} + +int CTv::SaveCurAudioSoundMode(int tmp_val) +{ + return mTvAudio.SaveCurAudioSoundMode(tmp_val); +} + +int CTv::GetCurAudioSoundMode() +{ + return mTvAudio.GetCurAudioSoundMode(); +} + +int CTv::SetAudioWallEffect(int tmp_val) +{ + return mTvAudio.SetAudioWallEffect(tmp_val); +} + +int CTv::GetAudioWallEffect() +{ + return mTvAudio.GetAudioWallEffect(); +} + +int CTv::SaveCurAudioWallEffect(int tmp_val) +{ + return mTvAudio.SaveCurAudioWallEffect(tmp_val); +} + +int CTv::GetCurAudioWallEffect() +{ + return mTvAudio.GetCurAudioWallEffect(); +} + + +int CTv::SetAudioEQMode(int tmp_val) +{ + return mTvAudio.SetAudioEQMode(tmp_val); +} + +int CTv::GetAudioEQMode() +{ + return mTvAudio.GetAudioEQMode(); +} + +int CTv::SaveCurAudioEQMode(int tmp_val) +{ + return mTvAudio.SaveCurAudioEQMode(tmp_val); +} + +int CTv::GetCurAudioEQMode() +{ + return mTvAudio.GetCurAudioEQMode(); +} + +int CTv::GetAudioEQRange(int range_buf[]) +{ + return mTvAudio.GetAudioEQRange(range_buf); +} + +int CTv::SetAudioEQGain(int gain_buf[]) +{ + return mTvAudio.SetAudioEQGain(gain_buf); +} + +int CTv::GetAudioEQGain(int gain_buf[]) +{ + return mTvAudio.GetAudioEQGain(gain_buf); +} + +int CTv::SaveCurAudioEQGain(int gain_buf[]) +{ + return mTvAudio.SaveCurAudioEQGain(gain_buf); +} + +int CTv::GetCurAudioEQGain(int gain_buf[]) +{ + return mTvAudio.GetCurAudioEQGain(gain_buf); +} + +int CTv::GetAudioEQBandCount() +{ + return mTvAudio.GetAudioEQBandCount(); +} + + + +int CTv::SetAudioEQSwitch(int switch_val) +{ + return mTvAudio.SetAudioEQSwitch(switch_val); +} + +int CTv::SetAudioSPDIFSwitch(int tmp_val) +{ + return mTvAudio.SetAudioSPDIFSwitch(tmp_val); +} + +/*showboz public int GetAudioSPDIFSwitch() { + mTvAudio.GetAudioSPDIFSwitch(); +}*/ + +int CTv::amAudioSetDoubleOutputSwitch(int en_val) +{ + return mTvAudio.amAudioSetDoubleOutputSwitch(en_val); +} +int CTv::UsbAudioOuputModuleSwitch(int sw) +{ + return mTvAudio.UsbAudioOuputModuleSwitch(sw); +} + +int CTv::GetAmAudioSetDoubleOutputSwitch() +{ + return mTvAudio.GetAmAudioSetDoubleOutputSwitch(); +} + +int CTv::GetCurUsbAudioOuputModuleSwitch() +{ + return mTvAudio.GetCurUsbAudioOuputModuleSwitch(); +} + +int CTv::SaveCurAudioSPDIFSwitch(int tmp_val) +{ + return mTvAudio.SaveCurAudioSPDIFSwitch(tmp_val); +} + +int CTv::GetCurAudioSPDIFSwitch() +{ + return mTvAudio.GetCurAudioSPDIFSwitch(); +} +int CTv::SetAudioSPDIFMode(int tmp_val) +{ + return mTvAudio.SetAudioSPDIFMode(tmp_val); +} + +/* public int GetAudioSPDIFMode() { +mTvAudio.GetAudioSPDIFMode(); +showboz */ + + +int CTv::SaveCurAudioSPDIFMode(int tmp_val) +{ + return mTvAudio.SaveCurAudioSPDIFMode(tmp_val); +} + +int CTv::GetCurAudioSPDIFMode() +{ + return mTvAudio.GetCurAudioSPDIFMode(); +} + +int CTv::OpenAmAudio(unsigned int sr, int output_device) +{ + return mTvAudio.OpenAmAudio(sr, output_device); +} + +int CTv::CloseAmAudio(void) +{ + return mTvAudio.CloseAmAudio(); +} + +int CTv::SetAmAudioInputSr(unsigned int sr, int output_device) +{ + return mTvAudio.SetAmAudioInputSr(sr, output_device); +} + +int CTv::SetAmAudioOutputMode(int mode) +{ + return mTvAudio.SetAmAudioOutputMode(mode); +} + +int CTv::SetAmAudioMusicGain(int gain) +{ + return mTvAudio.SetAmAudioMusicGain(gain); +} + +int CTv::SetAmAudioLeftGain(int gain) +{ + return mTvAudio.SetAmAudioLeftGain(gain); +} + + +int CTv::SetAmAudioRightGain(int gain) +{ + return mTvAudio.SetAmAudioRightGain(gain); +} + +int CTv::AudioLineInSelectChannel(int audio_channel) +{ + return mTvAudio.AudioLineInSelectChannel(audio_channel); +} + +int CTv::SetKalaokIO(int level) +{ + return mTvAudio.SetKalaokIO(level); +} +int CTv::AudioSetAudioInSource(int audio_src_in_type) +{ + return mTvAudio.AudioSetAudioInSource(CC_AUDIO_IN_SOURCE_LINEIN); +} + +int CTv::AudioSetLineInCaptureVolume(int l_vol, int r_vol) +{ + return mTvAudio.AudioSetLineInCaptureVolume(l_vol, r_vol); +} + +int CTv::AudioHandleHeadsetPlugIn() +{ + return mTvAudio.AudioHandleHeadsetPlugIn(); +} + +int CTv::AudioHandleHeadsetPullOut() +{ + return mTvAudio.AudioHandleHeadsetPullOut(); +} diff --git a/tvapi/libtv/tv/CTv.h b/tvapi/libtv/tv/CTv.h new file mode 100644 index 0000000..4df1096 --- a/dev/null +++ b/tvapi/libtv/tv/CTv.h @@ -0,0 +1,636 @@ + +// amlogic 2013 +// +// @ Project : tv +// @ File Name : CDtv.h +// @ Date : 2013-11 +// @ Author : + +#if !defined(_CDTV_H) +#define _CDTV_H +#include <stdint.h> +#include <sys/time.h> +#include <am_epg.h> +#include <am_mem.h> +#include <utils/threads.h> +#include "CTvProgram.h" +#include "CTvEpg.h" +#include "CTvScanner.h" +#include "CTvLog.h" +#include "CTvTime.h" +#include "CTvEvent.h" +#include "CTvEv.h" +#include "CTvBooking.h" +#include "CFrontEnd.h" +#include "../vpp/CVpp.h" +#include "../vpp/CPQdb.h" +#include "../tvin/CTvin.h" +#include "../tvutils/CMsgQueue.h" +#include "../tvutils/CSerialCommunication.h" +#include "../tvutils/serial_operate.h" +#include "CTvRecord.h" +#include "CTvSubtitle.h" +#include "CUpgradeFBC.h" +#include "CAv.h" +#include "CTvDmx.h" +#include "../audio/audio_api.h" +#include "AutoBackLight.h" +using namespace android; + +static const char *TV_CONFIG_FILE_PATH = "/param/tvconfig.conf"; +static const char *TV_DB_PATH = "/param/dtv.db"; +static const char *TV_CONFIG_FILE_SYSTEM_PATH = "/system/etc/tvconfig.conf"; +static const char *TV_CONFIG_FILE_PARAM_PATH = "/param/tvconfig.conf"; +static const char *TV_CHANNEL_LIST_SYSTEM_PATH = "/system/etc/tv_default.xml"; +static const char *TV_CHANNEL_LIST_PARAM_PATH = "/param/tv_default.xml"; +static const char *TV_SSM_DATA_SYSTEM_PATH = "/system/etc/ssm_data"; +static const char *TV_SSM_DATA_PARAM_PATH = "/param/ssm_data"; + +#define DEVICE_CLASS_TSYNC_AV_THRESHOLD_MIN "/sys/class/tsync/av_threshold_min" +#define AV_THRESHOLD_MIN_MS "540000" //6S = 6*90000 + +#define DEFAULT_COMPENSATION_VALUE 0 + + +typedef enum tv_fmt_ratio_e { + RATIO_43, + RATIO_169, + RATIO_MAX, +} tv_fmt_ratio_t; + +typedef enum tv_color_fmt_e { + COLOR_RGB444, + COLOR_YUV422, + COLOR_YUV444, + COLOR_MAX, +} tv_color_fmt_t; + + + +typedef enum tv_window_mode_e { + NORMAL_WONDOW, + PREVIEW_WONDOW, +} tv_window_mode_t; + +typedef enum tv_dtv_scan_running_status_e { + DTV_SCAN_RUNNING_NORMAL, + DTV_SCAN_RUNNING_ANALYZE_CHANNEL, +} tv_dtv_scan_running_status_t; + +typedef struct tv_config_s { + unsigned int overscan_3d; + unsigned int tv_out_counter; + bool kernelpet_disable; + unsigned int kernelpet_timeout; + bool userpet; + unsigned int userpet_timeout; + unsigned int userpet_reset; + unsigned int dtv_videopath_switch; + bool title_shake; + bool memory512m; +} tv_config_t; + +typedef enum TvRunStatus_s { + TV_INIT_ED = -1, + TV_OPEN_ED = 0, + TV_START_ED , + TV_RESUME_ED, + TV_PAUSE_ED, + TV_STOP_ED, + TV_CLOSE_ED, +} TvRunStatus_t; + +class CTv : public CTvin::CTvinSigDetect::ISigDetectObserver, public CTvin::CSourceConnectDetect::ISourceConnectObserver, public CTvin::CHDMIRxCEC::IHDMIRxCECObserver, public CUpgradeFBC::IUpgradeFBCObserver, public CSerialCommunication::ISerialCommunicationObserver +{ +public: + static const int TV_ACTION_NULL = 0x0000; + static const int TV_ACTION_STARTING = 0x0001; + static const int TV_ACTION_STOPING = 0x0002; + static const int TV_ACTION_SCANNING = 0x0004; + static const int TV_ACTION_PLAYING = 0x0008; + static const int TV_ACTION_RECORDING = 0x0010; + static const int TV_ACTION_SOURCE_SWITCHING = 0x0020; +public: + class TvIObserver + { + public: + TvIObserver() {}; + virtual ~TvIObserver() {}; + virtual void onTvEvent ( const CTvEv &ev ) = 0; + }; + //main + CTv(); + virtual ~CTv(); + virtual int OpenTv ( void ); + virtual int CloseTv ( void ); + virtual int StartTvLock (); + virtual int StopTvLock ( void ); + virtual TvRunStatus_t GetTvStatus(); + virtual int ClearAnalogFrontEnd(); + virtual tv_source_input_t GetLastSourceInput (void); + virtual int SetSourceSwitchInput (tv_source_input_t source_input ); + virtual tv_source_input_t GetCurrentSourceInputLock ( void ); + virtual tvin_info_t GetCurrentSignalInfo ( void ); + virtual int SetPreviewWindow ( tvin_window_pos_t pos ); + virtual int dtvAutoScan(); + virtual int dtvManualScan (int beginFreq, int endFreq, int modulation = -1); + virtual int atvAutoScan(int videoStd, int audioStd, int searchType); + virtual int clearAllProgram(int arg0); + virtual int clearDbAllProgramInfoTable(); + virtual void setSourceSwitchAndPlay(); + virtual int GetDisplayResolutionConfig(); + virtual int GetDisplayResolutionInfo(); + virtual int atvMunualScan ( int startFreq, int endFreq, int videoStd, int audioStd, int store_Type = 0, int channel_num = 0 ); + virtual int stopScanLock(); + virtual int dtvAutoScanAtscLock(int attenna, int videoStd, int audioStd); + virtual void SetRecordFileName ( char *name ); + virtual void StartToRecord(); + virtual void StopRecording(); + virtual void SetRecCurTsOrCurProgram ( int sel ); + virtual int startCC(int country, int src, int channel, int service); + virtual int stopCC(); + virtual void printDebugInfo(); + virtual int playProgramLock ( int progId ); + virtual int playDvbcProgram ( int progId ); + virtual int playDtmbProgram ( int progId ); + virtual int playAtvProgram ( int progId ); + virtual int stopPlayingLock(); + virtual int resetFrontEndPara ( frontend_para_set_t feParms ); + int SetCurProgramAudioVolumeCompensationVal ( int tmpVal ); + int GetAudioVolumeCompensationVal(int progDbId); + //dtv audio track info + int getAudioTrackNum ( int progId ); + int getAudioInfoByIndex ( int progId, int idx, int *pAFmt, String8 &lang ); + int switchAudioTrack ( int progId, int idx ); + int getVideoFormatInfo ( int *pWidth, int *pHeight, int *pFPS, int *pInterlace ); + int ResetAudioDecoderForPCMOutput(); + int setAudioChannel ( int channelIdx ); + int getAudioChannel(); + int setTvObserver (TvIObserver *ob); + int getAtscAttenna(); + long getTvTime() + { + return mTvTime.getTime(); + }; + void getFrontendStatus(); + int getFrontendSignalStrength(); + int getFrontendSNR(); + int getFrontendBER(); + int getChannelInfoBydbID ( int dbID, channel_info_t &chan_info ); + int setBlackoutEnable(int enable); + int getSaveBlackoutEnable(); + void startAutoBackLight(); + void stopAutoBackLight(); + int getAutoBackLight_on_off(); + int saveATVProgramID ( int dbID ); + int getATVProgramID ( void ); + int saveDTVProgramID ( int dbID ); + int getDTVProgramID ( void ); + int getCurPlayProgId(); + int getATVMinMaxFreq ( int *scanMinFreq, int *scanMaxFreq ); + + int Tv_SSMRestoreDefaultSetting(); + + // + int GetSourceConnectStatus(int source_input); + int IsDVISignal(); + int isVgaFmtInHdmi(); + // + int getHDMIFrameRate ( void ); + void RefreshAudioMasterVolume ( tv_source_input_t source_input ); + + int Tv_Set3DMode ( VIDEO_3D_MODE_T mode ); + VIDEO_3D_MODE_T Tv_Get3DMode ( void ); + int Tv_Set3DLRSwith ( int on_off); + int Tv_Get3DLRSwith ( void ); + int Tv_Set3DTo2DMode ( int mode); + int Tv_Get3DTo2DMode ( void ); + int Tv_Set3DDepth ( int value ); + int GetSave3DDepth ( void ); + is_3d_type_t Check2Dor3D ( VIDEO_3D_MODE_T mode3d, tvin_trans_fmt_t trans_fmt ); + int Tvin_SetPLLValues (); + int SetCVD2Values (); + unsigned int Vpp_GetDisplayResolutionInfo(tvin_window_pos_t *win_pos); + int get_hdmi_sampling_rate(); + //SSM + int Tv_SSMFacRestoreDefaultSetting(); + + CTvin::CTvinSigDetect mSigDetectThread; + CTvin::CSourceConnectDetect mSourceConnectDetectThread; + CTvin::CHDMIRxCEC mHDMIRxCEC; + CUpgradeFBC *mpUpgradeFBC; + CSerialCommunication mSerialA; + CSerialCommunication mSerialB; + CSerialCommunication mSerialC; + + int SendHDMIRxCECCustomMessage(unsigned char data_buf[]); + int SendHDMIRxCECCustomMessageAndWaitReply(unsigned char data_buf[], unsigned char reply_buf[], int WaitCmd, int timeout); + int SendHDMIRxCECBoradcastStandbyMessage(); + int SendHDMIRxCECGiveCECVersionMessage(tv_source_input_t source_input, unsigned char data_buf[]); + int SendHDMIRxCECGiveDeviceVendorIDMessage(tv_source_input_t source_input, unsigned char data_buf[]); + int SendHDMIRxCECGiveOSDNameMessage(tv_source_input_t source_input, unsigned char data_buf[]); + + int GetHdmiHdcpKeyKsvInfo(int data_buf[]); + int StartUpgradeFBC(char *file_name, int mode, int upgrade_blk_size); + int SetSerialSwitch(int dev_id, int switch_val); + int SendSerialData(int dev_id, int data_len, unsigned char data_buf[]); + int ChannelExport(const char *destPath); + int ChannelImport(const char *srcPath); + int Tv_GetProjectInfo(project_info_t *ptrInfo); + int Tv_GetPlatformType(); + int Tv_SetDDDRCMode(tv_source_input_t source_input); + int Tv_SetAudioSourceType (tv_source_input_t source_input); + + //PQ + int Tv_SetBrightness ( int brightness, tv_source_input_type_t source_type, int is_save ); + int Tv_GetBrightness ( tv_source_input_type_t source_type ); + int Tv_SetContrast ( int contrast, tv_source_input_type_t source_type, int is_save ); + int Tv_GetContrast ( tv_source_input_type_t source_type ); + int Tv_SetSaturation ( int satuation, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, int is_save ); + int Tv_GetSaturation ( tv_source_input_type_t source_type ); + int Tv_SetHue ( int hue, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, int is_save ); + int Tv_GetHue ( tv_source_input_type_t source_type ); + int Tv_SetPQMode ( vpp_picture_mode_t mode, tv_source_input_type_t source_type, int is_save ); + vpp_picture_mode_t Tv_GetPQMode ( tv_source_input_type_t source_type ); + int Tv_SetSharpness ( int value, tv_source_input_type_t source_type, int en, int is_save ); + int Tv_GetSharpness ( tv_source_input_type_t source_type ); + int Tv_SaveSharpness ( int value, tv_source_input_type_t source_type, int is_enable ); + int Tv_SetBacklight ( int value, tv_source_input_type_t source_type, int is_save ); + int Tv_GetBacklight ( tv_source_input_type_t source_type ); + int Tv_SetColorTemperature ( vpp_color_temperature_mode_t mode, tv_source_input_type_t source_type, int is_save ); + vpp_color_temperature_mode_t Tv_GetColorTemperature ( tv_source_input_type_t source_type ); + int Tv_SaveColorTemp ( vpp_color_temperature_mode_t mode, tv_source_input_type_t source_type ); + int Tv_SetDisplayMode ( vpp_display_mode_t mode, tv_source_input_type_t source_type, tvin_sig_fmt_t fmt, int is_save ); + vpp_display_mode_t Tv_GetDisplayMode ( tv_source_input_type_t source_type ); + int Tv_SaveDisplayMode ( vpp_display_mode_t mode, tv_source_input_type_t source_type ); + int Tv_SetNoiseReductionMode ( vpp_noise_reduction_mode_t mode, tv_source_input_type_t source_type, int is_save ); + vpp_noise_reduction_mode_t Tv_GetNoiseReductionMode ( tv_source_input_type_t source_type ); + int Tv_SaveNoiseReductionMode ( vpp_noise_reduction_mode_t mode, tv_source_input_type_t source_type ); + int Tv_SetRGBOGO_PostOffset(int type, int offset); + int Tv_SetRGBOGO_Gain(int type, int gain); + int Tv_GetRGBOGO_PostOffset ( int type ); + int Tv_GetRGBOGO_Gain ( int type ); + // + int Tv_FactorySetPQMode_Brightness ( int source_type, int pq_mode, int brightness ); + int Tv_FactoryGetPQMode_Brightness ( int source_type, int pq_mode ); + int Tv_FactorySetPQMode_Contrast ( int source_type, int pq_mode, int contrast ); + int Tv_FactoryGetPQMode_Contrast ( int source_type, int pq_mode ); + int Tv_FactorySetPQMode_Saturation ( int source_type, int pq_mode, int saturation ); + int Tv_FactoryGetPQMode_Saturation ( int source_type, int pq_mode ); + int Tv_FactorySetPQMode_Hue ( int source_type, int pq_mode, int hue ); + int Tv_FactoryGetPQMode_Hue ( int source_type, int pq_mode ); + int Tv_FactorySetPQMode_Sharpness ( int source_type, int pq_mode, int sharpness ); + int Tv_FactoryGetPQMode_Sharpness ( int source_type, int pq_mode ); + int Tv_FactorySetColorTemp_Rgain ( int source_type, int colortemp_mode, int rgain ); + int Tv_FactorySaveColorTemp_Rgain ( int source_type, int colortemp_mode, int rgain ); + int Tv_FactoryGetColorTemp_Rgain ( int source_type, int colortemp_mode ); + int Tv_FactorySetColorTemp_Ggain ( int source_type, int colortemp_mode, int ggain ); + int Tv_FactorySaveColorTemp_Ggain ( int source_type, int colortemp_mode, int ggain ); + int Tv_FactoryGetColorTemp_Ggain ( int source_type, int colortemp_mode ); + int Tv_FactorySetColorTemp_Bgain ( int source_type, int colortemp_mode, int bgain ); + int Tv_FactorySaveColorTemp_Bgain ( int source_type, int colortemp_mode, int bgain ); + int Tv_FactoryGetColorTemp_Bgain ( int source_type, int colortemp_mode ); + int Tv_FactorySetColorTemp_Roffset ( int source_type, int colortemp_mode, int roffset ); + int Tv_FactorySaveColorTemp_Roffset ( int source_type, int colortemp_mode, int roffset ); + int Tv_FactoryGetColorTemp_Roffset ( int source_type, int colortemp_mode ); + int Tv_FactorySetColorTemp_Goffset ( int source_type, int colortemp_mode, int goffset ); + int Tv_FactorySaveColorTemp_Goffset ( int source_type, int colortemp_mode, int goffset ); + int Tv_FactoryGetColorTemp_Goffset ( int source_type, int colortemp_mode ); + int Tv_FactorySetColorTemp_Boffset ( int source_type, int colortemp_mode, int boffset ); + int Tv_FactorySaveColorTemp_Boffset ( int source_type, int colortemp_mode, int boffset ); + int Tv_FactoryGetColorTemp_Boffset ( int source_type, int colortemp_mode ); + int GetColorTemperatureParams ( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t *params ); + int Tv_FactorySetTestPattern ( int pattern ); + int Tv_FactoryGetTestPattern ( void ); + int Tv_FactoryResetPQMode ( void ); + int Tv_FactoryResetColorTemp ( void ); + int Tv_FactorySetParamsDefault ( void ); + int Tv_FactorySetDDRSSC ( int step ); + int Tv_FactoryGetDDRSSC ( void ); + int Tv_FactorySetLVDSSSC ( int step ); + int Tv_FactoryGetLVDSSSC ( void ); + int Tv_FactorySetNolineParams ( int noline_params_type, int source_type, noline_params_t noline_params ); + noline_params_t Tv_FactoryGetNolineParams ( int noline_params_type, int source_type ); + int Tv_FactorySetOverscan ( int source_type, int fmt, int status_3d, int trans_fmt, tvin_cutwin_t cutwin_t ); + tvin_cutwin_t Tv_FactoryGetOverscan ( int source_type, int fmt, int status_3d, int trans_fmt ); + //end PQ + + //TV TO FBC + int Tv_FactorySet_FBC_Brightness ( int value ); + int Tv_FactoryGet_FBC_Brightness ( void ); + int Tv_FactorySet_FBC_Contrast( int value ); + int Tv_FactoryGet_FBC_Contrast ( void ); + int Tv_FactorySet_FBC_Saturation( int value ); + int Tv_FactoryGet_FBC_Saturation ( void ); + int Tv_FactorySet_FBC_HueColorTint( int value ); + int Tv_FactoryGet_FBC_HueColorTint ( void ); + int Tv_FactorySet_FBC_Backlight ( int value ); + int Tv_FactoryGet_FBC_Backlight ( void ); + int Tv_FactorySet_FBC_Backlight_N360 ( int value ); + int Tv_FactoryGet_FBC_Backlight_N360 ( void ); + int Tv_FactorySet_FBC_ELEC_MODE( int value ); + int Tv_FactoryGet_FBC_ELEC_MODE( void ); + int Tv_FactorySet_FBC_Picture_Mode ( int mode ); + int Tv_FactoryGet_FBC_Picture_Mode ( void ); + int Tv_FactorySet_FBC_Set_Test_Pattern ( int mode ); + int Tv_FactoryGet_FBC_Get_Test_Pattern ( void ); + int Tv_FactorySet_FBC_Gain_Red( int value ); + int Tv_FactoryGet_FBC_Gain_Red ( void ); + int Tv_FactorySet_FBC_Gain_Green( int value ); + int Tv_FactoryGet_FBC_Gain_Green( void ); + int Tv_FactorySet_FBC_Gain_Blue( int value ); + int Tv_FactoryGet_FBC_Gain_Blue ( void ); + int Tv_FactorySet_FBC_Offset_Red( int value ); + int Tv_FactoryGet_FBC_Offset_Red ( void ); + int Tv_FactorySet_FBC_Offset_Green( int value ); + int Tv_FactoryGet_FBC_Offset_Green( void ); + int Tv_FactorySet_FBC_Offset_Blue( int value ); + int Tv_FactoryGet_FBC_Offset_Blue ( void ); + int Tv_FactoryGetWhiteBalanceRedGain(int source_type, int colortemp_mode); + int Tv_FactoryGetWhiteBalanceGreenGain(int source_type, int colortemp_mode); + int Tv_FactoryGetWhiteBalanceBlueGain(int source_type, int colortemp_mode); + int Tv_FactoryGetWhiteBalanceRedOffset(int source_type, int colortemp_mode); + int Tv_FactoryGetWhiteBalanceGreenOffset(int source_type, int colortemp_mode); + int Tv_FactoryGetWhiteBalanceBlueOffset(int source_type, int colortemp_mode); + int Tv_FactorySetWhiteBalanceRedGain(int source_type, int colortemp_mode, int value); + int Tv_FactorySetWhiteBalanceGreenGain(int source_type, int colortemp_mode, int value); + int Tv_FactorySetWhiteBalanceBlueGain(int source_type, int colortemp_mode, int value); + int Tv_FactorySetWhiteBalanceRedOffset(int source_type, int colortemp_mode, int value); + int Tv_FactorySetWhiteBalanceGreenOffset(int source_type, int colortemp_mode, int value); + int Tv_FactorySetWhiteBalanceBlueOffset(int source_type, int colortemp_mode, int value); + int Tv_FactorySetWhiteBalanceColorTempMode(int source_type, int colortemp_mode, int is_save); + int Tv_FactoryGetWhiteBalanceColorTempMode(int source_type ); + int Tv_FactoryWhiteBalanceFormatInputFbcGainParams(int value); + int Tv_FactoryWhiteBalanceFormatInputFbcOffsetParams(int value); + int Tv_FactoryWhiteBalanceFormatOutputFbcOffsetParams(int value); + int Tv_FactoryWhiteBalanceFormatOutputFbcGainParams(int value); + int Tv_FactorySaveWhiteBalancePramas(int source_type, int tempmode, int r_gain, int g_gain, int b_gain, int r_offset, int g_offset, int b_offset); + int Tv_FactoryCloseWhiteBalanceGrayPattern(); + int Tv_FactoryOpenWhiteBalanceGrayPattern(); + int Tv_FactorySetWhiteBalanceGrayPattern(int value); + int Tv_FactoryGetWhiteBalanceGrayPattern(); + int Tv_FactoryWhiteBalanceColorTempMappingG92Fbc(int Tempmode); + int Tv_FactoryWhiteBalanceColorTempMappingFbc2G9(int Tempmode); + int Tv_FactoryWhiteBalanceGetAllParams(int Tempmode, tcon_rgb_ogo_t *params); + int Tv_FactorySet_FBC_GrayPattern(int value); + int Tv_FactoryOpen_FBC_GrayPattern(); + int Tv_FactoryClose_FBC_GrayPattern(); + int Tv_FactorySet_FBC_ColorTemp_Mode( int mode ); + int Tv_FactoryGet_FBC_ColorTemp_Mode ( void ); + int Tv_FactorySet_FBC_ColorTemp_Mode_N360( int mode ); + int Tv_FactoryGet_FBC_ColorTemp_Mode_N360 ( void ); + int Tv_FactorySet_FBC_WB_Initial( int status ); + int Tv_FactoryGet_FBC_WB_Initial ( void ); + int Tv_FactorySet_FBC_ColorTemp_Batch(vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t params); + int Tv_FactoryGet_FBC_ColorTemp_Batch ( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t *params ); + int Tv_FactorySet_WB_G9_To_FBC( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t params ); + int Tv_FactoryGet_WB_G9_To_FBC ( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t *params ); + int Tv_FactoryGetItemFromBatch(vpp_color_temperature_mode_t colortemp_mode, int item); + int Tv_FactorySet_FBC_CM_OnOff( unsigned char status ); + int Tv_FactoryGet_FBC_CM_OnOff (void); + int Tv_FactorySet_FBC_DNLP_OnOff( unsigned char status ); + int Tv_FactoryGet_FBC_DNLP_OnOff (void); + int Tv_FactorySet_FBC_Gamma_OnOff( unsigned char status ); + int Tv_FactoryGet_FBC_Gamma_OnOff (void); + int Tv_FactorySet_FBC_WhiteBalance_OnOff( unsigned char status ); + int Tv_FactoryGet_FBC_WhiteBalance_OnOff (void); + int Tv_FactorySet_FBC_Thermal_State( int value ); + int Tv_FactorySet_FBC_backlight_onoff(int value); + int Tv_FactoryGet_FBC_backlight_onoff ( void ); + int Tv_FactorySet_FBC_LVDS_SSG_Set( int value ); + int Tv_FactorySet_FBC_LightSensor_Status_N310 ( int value ); + int Tv_FactoryGet_FBC_LightSensor_Status_N310 ( void ); + int Tv_FactorySet_FBC_Dream_Panel_Status_N310 ( int value ); + int Tv_FactoryGet_FBC_Dream_Panel_Status_N310 ( void ); + int Tv_FactorySet_FBC_MULT_PQ_Status_N310 ( int value ); + int Tv_FactoryGet_FBC_MULT_PQ_Status_N310 ( void ); + int Tv_FactorySet_FBC_MEMC_Status_N310 ( int value ); + int Tv_FactoryGet_FBC_MEMC_Status_N310 ( void ); + //end TV TO FBC + + //audio + int SetAudioMuteForSystem(int muteOrUnmute); + int GetAudioMuteForSystem(); + int SetAudioAVOutMute(int muteStatus); + int GetAudioAVOutMute(); + int SetAudioSPDIFMute(int muteStatus); + int GetAudioSPDIFMute(); + int SetAudioMasterVolume(int tmp_vol); + int GetAudioMasterVolume(); + int SaveCurAudioMasterVolume(int tmp_vol); + int GetCurAudioMasterVolume(); + int SetAudioBalance(int tmp_val); + int GetAudioBalance(); + int SaveCurAudioBalance(int tmp_val); + int GetCurAudioBalance(); + int SetAudioSupperBassVolume(int tmp_vol); + int GetAudioSupperBassVolume(); + int SaveCurAudioSupperBassVolume(int tmp_vol); + int GetCurAudioSupperBassVolume(); + int SetAudioSupperBassSwitch(int tmp_val); + int GetAudioSupperBassSwitch(); + int SaveCurAudioSupperBassSwitch(int tmp_val); + int GetCurAudioSupperBassSwitch(); + int SetAudioSRSSurround(int tmp_val); + int GetAudioSRSSurround(); + int SaveCurAudioSrsSurround(int tmp_val); + int GetCurAudioSRSSurround(); + int SetAudioSrsDialogClarity(int tmp_val); + int GetAudioSrsDialogClarity(); + int SaveCurAudioSrsDialogClarity(int tmp_val); + int GetCurAudioSrsDialogClarity(); + int SetAudioSrsTruBass(int tmp_val); + int GetAudioSrsTruBass(); + int SaveCurAudioSrsTruBass(int tmp_val); + int GetCurAudioSrsTruBass(); + int SetAudioBassVolume(int tmp_vol); + int GetAudioBassVolume(); + int SaveCurAudioBassVolume(int tmp_vol); + int GetCurAudioBassVolume(); + int SetAudioTrebleVolume(int tmp_vol); + int GetAudioTrebleVolume(); + int SaveCurAudioTrebleVolume(int tmp_vol); + int GetCurAudioTrebleVolume(); + int SetAudioSoundMode(int tmp_val); + int GetAudioSoundMode(); + int SaveCurAudioSoundMode(int tmp_val); + int GetCurAudioSoundMode(); + int SetAudioWallEffect(int tmp_val); + int GetAudioWallEffect(); + int SaveCurAudioWallEffect(int tmp_val); + int GetCurAudioWallEffect(); + int SetAudioEQMode(int tmp_val); + int GetAudioEQMode(); + int SaveCurAudioEQMode(int tmp_val); + int GetCurAudioEQMode(); + int GetAudioEQRange(int range_buf[]); + int SetAudioEQGain(int gain_buf[]); + int GetAudioEQGain(int gain_buf[]); + int SaveCurAudioEQGain(int gain_buf[]); + int GetCurAudioEQGain(int gain_buf[]); + int GetAudioEQBandCount(); + int SetAudioEQSwitch(int switch_val); + int SetAudioSPDIFSwitch(int tmp_val); + int amAudioSetDoubleOutputSwitch(int en_val); + int UsbAudioOuputModuleSwitch(int sw); + int GetAmAudioSetDoubleOutputSwitch(); + int GetCurUsbAudioOuputModuleSwitch(); + int SaveCurAudioSPDIFSwitch(int tmp_val); + int GetCurAudioSPDIFSwitch(); + int SetAudioSPDIFMode(int tmp_val); + int SaveCurAudioSPDIFMode(int tmp_val); + int GetCurAudioSPDIFMode(); + int OpenAmAudio(unsigned int sr, int output_device); + int CloseAmAudio(void); + int SetAmAudioInputSr(unsigned int sr, int output_device); + int SetAmAudioOutputMode(int mode); + int SetAmAudioMusicGain(int gain); + int SetAmAudioLeftGain(int gain); + int SetAmAudioRightGain(int gain); + int AudioLineInSelectChannel(int audio_channel); + int SetKalaokIO(int level); + int AudioSetAudioInSource(int audio_src_in_type); + int AudioSetLineInCaptureVolume(int l_vol, int r_vol); + int AudioHandleHeadsetPlugIn(); + int AudioHandleHeadsetPullOut(); + //end audio + +protected: + class CTvMsgQueue: public CMsgQueueThread, public CAv::IObserver, public CTvScanner::IObserver , public CTvEpg::IObserver, public CFrontEnd::IObserver + { + public: + static const int TV_MSG_COMMON = 0; + static const int TV_MSG_STOP_ANALYZE_TS = 1; + static const int TV_MSG_START_ANALYZE_TS = 2; + static const int TV_MSG_CHECK_FE_DELAY = 3; + static const int TV_MSG_AV_EVENT = 4; + static const int TV_MSG_FE_EVENT = 5; + static const int TV_MSG_SCAN_EVENT = 6; + static const int TV_MSG_EPG_EVENT = 7; + + CTvMsgQueue(CTv *tv); + ~CTvMsgQueue(); + //scan observer + void onEvent ( const CTvScanner::ScannerEvent &ev ); + //epg observer + void onEvent ( const CTvEpg::EpgEvent &ev ); + //FE observer + void onEvent ( const CFrontEnd::FEEvent &ev ); + //AV + void onEvent(const CAv::AVEvent &ev); + private: + virtual void handleMessage ( CMessage &msg ); + CTv *mpTv; + }; + + + int resetDmxAndAvSource(); + int stopScan(); + int stopPlaying(); + void sendTvEvent ( const CTvEv &ev ); + int startPlayTv ( int source, int vid, int aid, int vfat, int afat ); + //scan observer + void onEvent ( const CTvScanner::ScannerEvent &ev ); + //epg observer + void onEvent ( const CTvEpg::EpgEvent &ev ); + //FE observer + void onEvent ( const CFrontEnd::FEEvent &ev ); + //AV + void onEvent(const CAv::AVEvent &ev); + bool Tv_Start_Analyze_Ts ( int channelID ); + bool Tv_Stop_Analyze_Ts(); + int Tvin_Stop ( void ); + int SetBypassModulesFor3D ( VIDEO_3D_MODE_E ); + int Vpp_SetDisplayMode ( vpp_display_mode_t display_mode, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt ); + int Tvin_GetTvinConfig(); + int Tv_init_audio(); + int Tv_MiscSetBySource ( tv_source_input_t ); + void print_version_info ( void ); + int dtvCleanProgramByFreq ( int freq ); + /*********************** Audio start **********************/ + int SetAudioMainVolLutBufName(); + int SetAudioSupperBassVolLutBufName(); + int SetAudioVolDigitLUTBuf ( tv_source_input_t source_input ); + int Tv_SetAudioInSource (tv_source_input_t source_input); + void Tv_SetAudioOutputSwap_Type (tv_source_input_t source_input); + /*********************** Audio end **********************/ + + // + virtual void onSigToStable(); + virtual void onSigStableToUnstable(); + virtual void onSigStableToUnSupport(); + virtual void onSigStableToNoSig(); + virtual void onSigUnStableToUnSupport(); + virtual void onSigUnStableToNoSig(); + virtual void onSigNullToNoSig(); + virtual void onSigNoSigToUnstable(); + virtual void onSigStillStable(); + virtual void onSigStillUnstable(); + virtual void onSigStillNosig(); + virtual void onSigStillNoSupport(); + virtual void onSigStillNull(); + virtual void onStableSigFmtChange(); + virtual void onStableTransFmtChange(); + virtual void onSigDetectEnter(); + virtual void onLoop(); + + virtual void onSourceConnect(int source_type, int connect_status); + virtual void onHDMIRxCECMessage(int msg_len, unsigned char msg_buf[]); + virtual void onUpgradeStatus(int status, int progress); + virtual void onSerialCommunication(int dev_id, int rd_len, unsigned char data_buf[]); + virtual void onThermalDetect(int state); + + CTvEpg mTvEpg; + CTvScanner mTvScanner; + mutable Mutex mLock; + CTvTime mTvTime; + CVpp mVpp; + CTvin mTvin; + CTvRecord mTvRec; + CFrontEnd mFrontDev; + CTvDimension mTvVchip; + CTvSubtitle mTvSub; + CTvAudio mTvAudio; + CAv mAv; + CTvDmx mTvDmx; + CTvMsgQueue mTvMsgQueue; + AutoBackLight mAutoBackLight; + // + volatile int mTvAction; + volatile TvRunStatus_t mTvStatus; + volatile tv_source_input_t m_source_input; + volatile tv_source_input_t m_last_source_input; + /* for tvin window mode and pos*/ + tvin_window_pos_t m_win_pos; + tv_window_mode_t m_win_mode; + int m_blackout_enable;//1 enable 0 disable + int m_cur_playing_prog_id; + tvin_sig_fmt_t m_cur_set_info_fmt; + bool mIsFbc; + + + bool mlastlockstatus; + String8 mlastdm; + String8 mlastabbrev; + String8 mlastabbtext; + pthread_t vchipthread; + int mvchip_running; + friend class CTvMsgQueue; + int mCurAnalyzeTsChannelID; + int audio_sr; + TvIObserver *mpObserver; + tv_dtv_scan_running_status_t mDtvScanRunningStatus; + volatile tv_config_t gTvinConfig; + int dtv_auto_3d_flag; + bool m_autoset_displayfreq; + int m_sig_stable_nums; + bool m_is_set_hdmi_edid; + /** for L/R or B/T 3d mode overscan **/ + /** for 3D **/ + VIDEO_3D_MODE_T m_mode_3d; + /** for HDMI-in sampling detection. **/ + volatile bool m_is_hdmi_sr_detect_start; + int m_hdmi_sampling_rate; +}; + +#endif //_CDTV_H diff --git a/tvapi/libtv/tv/CTvBooking.cpp b/tvapi/libtv/tv/CTvBooking.cpp new file mode 100644 index 0000000..1ad45db --- a/dev/null +++ b/tvapi/libtv/tv/CTvBooking.cpp @@ -0,0 +1,162 @@ + +#include "CTvBooking.h" +#include "CTvDatabase.h" + +#ifdef LOG_TAG +#undef LOG_TAG +#define LOG_TAG "CTvBooking" +#endif +int CTvBooking::InitFromCursor(CTvDatabase::Cursor &c) +{ + int col; + + col = c.getColumnIndex("db_id"); + this->id = c.getInt(col); + + col = c.getColumnIndex("db_srv_id"); + this->programId = c.getInt(col); + + col = c.getColumnIndex("db_evt_id"); + this->eventId = c.getInt(col); + + col = c.getColumnIndex("flag"); + this->flag = c.getInt(col); + + col = c.getColumnIndex("status"); + this->status = c.getInt(col); + + col = c.getColumnIndex("repeat"); + this->repeat = c.getInt(col); + + col = c.getColumnIndex("start"); + this->start = (long)c.getInt(col); + + col = c.getColumnIndex("duration"); + this->duration = (long)c.getInt(col) ; + + col = c.getColumnIndex("srv_name"); + this->progName = c.getString(col); + + col = c.getColumnIndex("evt_name"); + this->evtName = c.getString(col); + + return 0; +} + +int CTvBooking::selectByID(int id, CTvBooking &CtvBook) +{ + CTvDatabase::Cursor c; + String8 sql; + + sql = String8("select * from booking_table where booking_table.db_evt_id = ") + String8::format("%d", id); + CTvDatabase::GetTvDb()->select(sql.string(), c); + if (c.moveToFirst()) { + CtvBook.InitFromCursor(c); + } else { + c.close(); + return -1; + } + + c.close(); + return 0; +} + +int CTvBooking::getBookedEventList(Vector<sp<CTvBooking> > &vBv) +{ + String8 cmd; + + cmd = String8("select * from booking_table order by start"); + + CTvDatabase::Cursor c; + int ret = CTvDatabase::GetTvDb()->select(cmd, c); + + if (c.moveToFirst()) { + do { + vBv.add(new CTvBooking(c)); + } while (c.moveToNext()); + + + } else { + c.close(); + return -1; + } + + c.close(); + return 0; + +} + +int CTvBooking::bookProgram(CTvProgram &prog, CTvEvent &evt) +{ + String8 cmd; + String8 progName = String8(prog.getName()); + String8 evtName = String8(evt.getName()); + + + /*book this program*/ + cmd = String8("insert into booking_table(db_srv_id, db_evt_id, srv_name, evt_name,") + + String8("start,duration,flag,status,file_name,vid_pid,vid_fmt,aud_pids,aud_fmts,aud_languages,") + + String8("sub_pids,sub_types,sub_composition_page_ids,sub_ancillary_page_ids,sub_languages,") + + String8("ttx_pids,ttx_types,ttx_magazine_numbers,ttx_page_numbers,ttx_languages, other_pids,from_storage,repeat)") + + String8("values(") + String8::format("%d,", prog.getID()) + String8::format("%d,", evt.getEventId()) + progName.string() + String8(",") + evtName.string() + + String8::format("%d,", evt.getStartTime()) + String8::format("%d,", evt.getEndTime() - evt.getStartTime()) + String8::format("%d,", flag) + + String8::format("%d,", status) + String8(",") + String8::format("%d,", prog.getVideo()->getPID()) + String8::format("%d,", prog.getVideo()->getFormat()) + + String8::format("%d,", prog.getAudio(0)->getPID()) + String8::format("%d,", prog.getAudio(0)->getFormat()) + prog.getAudio(0)->getLang().string() + + String8(" , , , , , , , , , , , , ,)"); + + CTvDatabase::GetTvDb()->exeSql(cmd.string()); + + return 0; +} + +int CTvBooking::deleteBook(int evtIdFlag) +{ + String8 cmd; + + cmd = String8("delete from booking_table where db_evt_id=") + + String8::format("%d", evtIdFlag); + + CTvDatabase::GetTvDb()->exeSql(cmd.string()); + + return 0; +} + +int CTvBooking::bookEvent(int evtId, bool bBookFlag) +{ + String8 cmd; + + cmd = String8("update evt_table set sub_flag=") + String8::format("%d", bBookFlag) + + String8(" where db_id=") + String8::format("%d", evtId); + + CTvDatabase::GetTvDb()->exeSql(cmd.string()); + + if (true == bBookFlag) { + CTvEvent evt; + CTvEvent::selectByID(evtId, evt); + + CTvProgram prog; + CTvProgram::selectByID(evt.getProgramId(), prog); + + bookProgram(prog, evt); + } else { + deleteBook(evtId); + } + + return 0; + +} + +CTvBooking::CTvBooking(CTvDatabase::Cursor &c) +{ + InitFromCursor(c); +} + +CTvBooking::CTvBooking() +{ +} + +CTvBooking::~CTvBooking() +{ +} + + diff --git a/tvapi/libtv/tv/CTvBooking.h b/tvapi/libtv/tv/CTvBooking.h new file mode 100644 index 0000000..c46e556 --- a/dev/null +++ b/tvapi/libtv/tv/CTvBooking.h @@ -0,0 +1,84 @@ +// +// +// amlogic 2013 +// +// @ Project : tv +// @ File Name : CTvBooking.h +// @ Date : 2013-11 +// @ Author : +// +// + + +#if !defined(_CTVBOOKING_H) +#define _CTVBOOKING_H + +#include "CTvDatabase.h" +#include "CTvProgram.h" +#include "CTvEvent.h" +#include <utils/String8.h> +#include <utils/RefBase.h> +#include <stdlib.h> +#include "CTvLog.h" +#define LOG_TAG "CTvBooking" + +// ??/ ? +class CTvBooking : public LightRefBase<CTvBooking> +{ +public: + CTvBooking(CTvDatabase::Cursor &c); + CTvBooking(); + ~CTvBooking(); + + static int selectByID(int id, CTvBooking &CtvBook); + + int bookEvent(int evtId, bool bBookFlag); + int getBookedEventList(Vector<sp<CTvBooking> > &vBv); + + int getBookId() + { + return id; + }; + int getProgramId() + { + return programId; + }; + int getEventId() + { + return eventId; + }; + int getStartTime() + { + return start; + }; + int getDurationTime() + { + return duration; + }; + String8 &getProgName() + { + return progName; + }; + String8 &getEvtName() + { + return evtName; + }; + +private: + int deleteBook(int evtIdFlag) ; + int bookProgram(CTvProgram &prog, CTvEvent &evt); + int InitFromCursor(CTvDatabase::Cursor &c); +private: + int id; + int programId; + int eventId; + int flag; + int status; + int repeat; + long start; + long duration; + String8 progName; + String8 evtName; +}; + +#endif //_CTVBOOKING_H diff --git a/tvapi/libtv/tv/CTvDmx.cpp b/tvapi/libtv/tv/CTvDmx.cpp new file mode 100644 index 0000000..ef6262e --- a/dev/null +++ b/tvapi/libtv/tv/CTvDmx.cpp @@ -0,0 +1,24 @@ +#include "CTvDmx.h" +CTvDmx::CTvDmx() +{ + mDmxDevId = 0; +} + +CTvDmx::~CTvDmx() +{ +} + +int CTvDmx::Open(AM_DMX_OpenPara_t ¶) +{ + return AM_DMX_Open ( mDmxDevId, ¶ ); +} + +int CTvDmx::Close() +{ + return AM_DMX_Close ( mDmxDevId ); +} + +int CTvDmx::SetSource(AM_DMX_Source_t source) +{ + return AM_DMX_SetSource ( mDmxDevId, source ); +} diff --git a/tvapi/libtv/tv/CTvDmx.h b/tvapi/libtv/tv/CTvDmx.h new file mode 100644 index 0000000..0649c13 --- a/dev/null +++ b/tvapi/libtv/tv/CTvDmx.h @@ -0,0 +1,18 @@ +#ifndef _C_TV_DMX_H +#define _C_TV_DMX_H +#include "CTvEv.h" +#include "CTvLog.h" +#include "am_dmx.h" + +class CTvDmx +{ +public: + CTvDmx(); + ~CTvDmx(); + int Open(AM_DMX_OpenPara_t ¶); + int Close(); + int SetSource(AM_DMX_Source_t source); +private: + int mDmxDevId; +}; +#endif diff --git a/tvapi/libtv/tv/CTvEpg.cpp b/tvapi/libtv/tv/CTvEpg.cpp new file mode 100644 index 0000000..9140eac --- a/dev/null +++ b/tvapi/libtv/tv/CTvEpg.cpp @@ -0,0 +1,216 @@ +/* + * amlogic 2013 + *@ Project : tv + *@ Date : 2013-12 + *@ Author : +*/ +#include "CTvEpg.h" +#include "CTvChannel.h" +#ifdef LOG_TAG +#undef LOG_TAG +#define LOG_TAG "CTvEpg" +#endif + +void CTvEpg::epg_evt_callback(int dev_no, int event_type, void *param, void *user_data) +{ + CTvEpg *pEpg; + + AM_EPG_GetUserData(dev_no, (void **)&pEpg); + + if (pEpg == NULL) return; + + if (pEpg->mpObserver == NULL) { + return; + } + switch (event_type) { + case AM_EPG_EVT_NEW_TDT: + case AM_EPG_EVT_NEW_STT: { + int utc_time; + AM_EPG_GetUTCTime(&utc_time); + pEpg->mCurEpgEv.type = EpgEvent::EVENT_TDT_END; + pEpg->mCurEpgEv.time = (long)utc_time; + pEpg->mpObserver->onEvent(pEpg->mCurEpgEv); + } + break; + case AM_EPG_EVT_UPDATE_EVENTS: + pEpg->mCurEpgEv.type = EpgEvent::EVENT_PROGRAM_EVENTS_UPDATE; + pEpg->mCurEpgEv.programID = (int)param; + pEpg->mpObserver->onEvent(pEpg->mCurEpgEv); + break; + case AM_EPG_EVT_UPDATE_PROGRAM_AV: + pEpg->mCurEpgEv.type = EpgEvent::EVENT_PROGRAM_AV_UPDATE; + pEpg->mCurEpgEv.programID = (int)param; + pEpg->mpObserver->onEvent(pEpg->mCurEpgEv); + break; + case AM_EPG_EVT_UPDATE_PROGRAM_NAME: + pEpg->mCurEpgEv.type = EpgEvent::EVENT_PROGRAM_NAME_UPDATE; + pEpg->mCurEpgEv.programID = (int)param; + pEpg->mpObserver->onEvent(pEpg->mCurEpgEv); + break; + case AM_EPG_EVT_UPDATE_TS: + pEpg->mCurEpgEv.type = EpgEvent::EVENT_CHANNEL_UPDATE; + pEpg->mCurEpgEv.channelID = (int)param; + pEpg->mpObserver->onEvent(pEpg->mCurEpgEv); + break; + default: + break; + } +} + +void CTvEpg::Init(int fend, int dmx, int fend_mod, char *textLanguages, char *dvb_text_coding) +{ + mFend_dev_id = fend; + mDmx_dev_id = dmx; + mFend_mod = fend_mod; + epg_create(fend, dmx, fend_mod, textLanguages); + epg_set_dvb_text_coding(dvb_text_coding); +} + +void CTvEpg::epg_create(int fend_id, int dmx_id, int src, char *textLangs) +{ + AM_EPG_CreatePara_t para; + AM_ErrorCode_t ret; + AM_FEND_OpenPara_t fend_para; + AM_DMX_OpenPara_t dmx_para; + + LOGD("Opening demux%d ...", dmx_id); + memset(&dmx_para, 0, sizeof(dmx_para)); + AM_DMX_Open(dmx_id, &dmx_para); + + para.fend_dev = fend_id; + para.dmx_dev = dmx_id; + para.source = src; + para.hdb = NULL; + + + snprintf(para.text_langs, sizeof(para.text_langs), "%s", textLangs); + + + ret = AM_EPG_Create(¶, &mEpgScanHandle); + if (ret != AM_SUCCESS) { + LOGD("AM_EPG_Create failed"); + return; + } + + /*注册EIT通知事件*/ + AM_EVT_Subscribe(mEpgScanHandle, AM_EPG_EVT_NEW_TDT, epg_evt_callback, NULL); + AM_EVT_Subscribe(mEpgScanHandle, AM_EPG_EVT_NEW_STT, epg_evt_callback, NULL); + AM_EVT_Subscribe(mEpgScanHandle, AM_EPG_EVT_UPDATE_EVENTS, epg_evt_callback, NULL); + AM_EVT_Subscribe(mEpgScanHandle, AM_EPG_EVT_UPDATE_PROGRAM_AV, epg_evt_callback, NULL); + AM_EVT_Subscribe(mEpgScanHandle, AM_EPG_EVT_UPDATE_PROGRAM_NAME, epg_evt_callback, NULL); + AM_EVT_Subscribe(mEpgScanHandle, AM_EPG_EVT_UPDATE_TS, epg_evt_callback, NULL); + AM_EPG_SetUserData(mEpgScanHandle, (void *)this); +} + + + +void CTvEpg::epg_destroy() +{ + /*反注册EIT通知事件*/ + AM_EVT_Unsubscribe(mEpgScanHandle, AM_EPG_EVT_NEW_TDT, epg_evt_callback, NULL); + AM_EVT_Unsubscribe(mEpgScanHandle, AM_EPG_EVT_NEW_STT, epg_evt_callback, NULL); + AM_EVT_Unsubscribe(mEpgScanHandle, AM_EPG_EVT_UPDATE_EVENTS, epg_evt_callback, NULL); + AM_EVT_Unsubscribe(mEpgScanHandle, AM_EPG_EVT_UPDATE_PROGRAM_AV, epg_evt_callback, NULL); + AM_EVT_Unsubscribe(mEpgScanHandle, AM_EPG_EVT_UPDATE_PROGRAM_NAME, epg_evt_callback, NULL); + AM_EVT_Unsubscribe(mEpgScanHandle, AM_EPG_EVT_UPDATE_TS, epg_evt_callback, NULL); + AM_EPG_Destroy(mEpgScanHandle); + AM_DMX_Close(mDmx_dev_id); +} + + +void CTvEpg::epg_change_mode(int op, int mode) +{ + AM_ErrorCode_t ret; + ret = AM_EPG_ChangeMode(mEpgScanHandle, op, mode); + if (ret != AM_SUCCESS) + LOGD("AM_EPG_ChangeMode failed"); +} + + + +void CTvEpg::epg_monitor_service(int srv_id) +{ + int ret = AM_EPG_MonitorService(mEpgScanHandle, srv_id); + if (ret != AM_SUCCESS) + LOGD("AM_EPG_MonitorService failed"); +} + + + +void CTvEpg::epg_set_dvb_text_coding(char *coding) +{ + if (!strcmp(coding, "standard")) { + AM_SI_SetDefaultDVBTextCoding(""); + } else { + AM_SI_SetDefaultDVBTextCoding(coding); + } +} + + + +/*Start scan the sections.*/ +void CTvEpg::startScan(int mode) +{ + epg_change_mode(MODE_ADD, mode); +} + +/*Stop scan the sections.*/ +void CTvEpg::stopScan(int mode) +{ + epg_change_mode(MODE_REMOVE, mode); +} + + +/*Enter a channel.*/ +void CTvEpg::enterChannel(int chan_id) +{ + + if (chan_id == mCurScanChannelId) + return; + //already enter,leave it + if (mCurScanChannelId != INVALID_ID) { + leaveChannel(); + } + + if (mFend_mod == CTvChannel::MODE_ATSC) { + startScan(SCAN_PSIP_ETT | SCAN_PSIP_EIT | SCAN_MGT | SCAN_VCT | SCAN_RRT | SCAN_STT); + } else { + startScan(SCAN_EIT_ALL | SCAN_SDT | SCAN_NIT | SCAN_TDT | SCAN_CAT); + } + + mCurScanChannelId = chan_id; +} + +/*Leave the channel.*/ +void CTvEpg::leaveChannel() +{ + + stopScan(SCAN_ALL); + mCurScanChannelId = INVALID_ID; +} + +/*Enter the program.*/ +void CTvEpg::enterProgram(int prog_id) +{ + if (prog_id == mCurScanProgramId) + return; + + if (mCurScanProgramId != INVALID_ID) { + leaveProgram(); + } + + mCurScanProgramId = prog_id; + epg_monitor_service(mCurScanProgramId);//---------db_id + startScan(SCAN_PAT | SCAN_PMT); +} + +/*Leave the program.*/ +void CTvEpg::leaveProgram() +{ + if (mCurScanProgramId == INVALID_ID) + return; + + stopScan(SCAN_PAT | SCAN_PMT); + epg_monitor_service(-1); + mCurScanProgramId = INVALID_ID; +} diff --git a/tvapi/libtv/tv/CTvEpg.h b/tvapi/libtv/tv/CTvEpg.h new file mode 100644 index 0000000..3973af4 --- a/dev/null +++ b/tvapi/libtv/tv/CTvEpg.h @@ -0,0 +1,160 @@ +/* + * amlogic 2013 + *@ Project : tv + *@ Date : 2013-12 + *@ Author : +*/ +#include <am_debug.h> +#include <am_scan.h> +#include <am_epg.h> +#include <am_mem.h> +#include <utils/Log.h> +#include "CTvEv.h" +#if !defined(_CDTVEPG_H) +#define _CDTVEPG_H +class CTvEpg +{ +public : + static const int MODE_ADD = 0; + static const int MODE_REMOVE = 1; + static const int MODE_SET = 2; + + static const int SCAN_PAT = 0x01; + static const int SCAN_PMT = 0x02; + static const int SCAN_CAT = 0x04; + static const int SCAN_SDT = 0x08; + static const int SCAN_NIT = 0x10; + static const int SCAN_TDT = 0x20; + static const int SCAN_EIT_PF_ACT = 0x40; + static const int SCAN_EIT_PF_OTH = 0x80; + static const int SCAN_EIT_SCHE_ACT = 0x100; + static const int SCAN_EIT_SCHE_OTH = 0x200; + static const int SCAN_MGT = 0x400; + static const int SCAN_VCT = 0x800; + static const int SCAN_STT = 0x1000; + static const int SCAN_RRT = 0x2000; + static const int SCAN_PSIP_EIT = 0x4000; + static const int SCAN_PSIP_ETT = 0x8000; + static const int SCAN_EIT_PF_ALL = SCAN_EIT_PF_ACT | SCAN_EIT_PF_OTH; + static const int SCAN_EIT_SCHE_ALL = SCAN_EIT_SCHE_ACT | SCAN_EIT_SCHE_OTH; + static const int SCAN_EIT_ALL = SCAN_EIT_PF_ALL | SCAN_EIT_SCHE_ALL; + static const int SCAN_ALL = SCAN_PAT | SCAN_PMT | SCAN_CAT | SCAN_SDT | SCAN_NIT | SCAN_TDT | SCAN_EIT_ALL | + SCAN_MGT | SCAN_VCT | SCAN_STT | SCAN_RRT | SCAN_PSIP_EIT | SCAN_PSIP_ETT; + + static const int INVALID_ID = -1; + + //egp notify + /*static const int EVENT_PF_EIT_END = 1; + static const int EVENT_SCH_EIT_END = 2; + static const int EVENT_PMT_END = 3; + static const int EVENT_SDT_END = 4; + static const int EVENT_TDT_END = 5; + static const int EVENT_NIT_END = 6; + static const int EVENT_PROGRAM_AV_UPDATE = 7; + static const int EVENT_PROGRAM_NAME_UPDATE = 8; + static const int EVENT_PROGRAM_EVENTS_UPDATE = 9; + static const int EVENT_CHANNEL_UPDATE = 10;*/ + // + class EpgEvent : public CTvEv + { + public: + EpgEvent(): CTvEv(CTvEv::TV_EVENT_EPG) + { + + }; + ~EpgEvent() + {}; + static const int EVENT_PF_EIT_END = 1; + static const int EVENT_SCH_EIT_END = 2; + static const int EVENT_PMT_END = 3; + static const int EVENT_SDT_END = 4; + static const int EVENT_TDT_END = 5; + static const int EVENT_NIT_END = 6; + static const int EVENT_PROGRAM_AV_UPDATE = 7; + static const int EVENT_PROGRAM_NAME_UPDATE = 8; + static const int EVENT_PROGRAM_EVENTS_UPDATE = 9; + static const int EVENT_CHANNEL_UPDATE = 10; + static const int EVENT_CHANNEL_UPDATE_END = 11; + + int type; + int channelID; + int programID; + int dvbOrigNetID; + int dvbTSID; + int dvbServiceID; + long time; + int dvbVersion; + }; + + class IObserver + { + public: + IObserver() {}; + virtual ~IObserver() {}; + virtual void onEvent(const EpgEvent &ev) = 0; + }; + //1 VS n + //int addObserver(IObserver* ob); + //int removeObserver(IObserver* ob); + + //1 VS 1 + int setObserver(IObserver *ob) + { + mpObserver = ob; + return 0; + } + + CTvEpg() + { + mCurScanChannelId = INVALID_ID; + mCurScanProgramId = INVALID_ID; + mEpgScanHandle = -1; + mpObserver = NULL; + } + void Init(int fend, int dmx, int fend_mod, char *textLanguages, char *dvb_text_coding); + + ~CTvEpg() + { + epg_destroy(); + } + + /*Enter a channel.*/ + void enterChannel(int chan_id); + /*Leave the channel.*/ + void leaveChannel(); + /*Enter the program.*/ + void enterProgram(int prog_id); + /*Leave the program.*/ + void leaveProgram(); + +private: + // + void epg_create(int fend_id, int dmx_id, int src, char *textLangs); + void epg_destroy(); + void epg_change_mode(int op, int mode); + void epg_monitor_service(int srv_id); + void epg_set_dvb_text_coding(char *coding); + + + /*Start scan the sections.*/ + void startScan(int mode); + /*Stop scan the sections.*/ + void stopScan(int mode); + + static void epg_evt_callback(int dev_no, int event_type, void *param, void *user_data); + + // + IObserver *mpObserver; + + // + int mEpgScanHandle; + int mFend_dev_id; + int mDmx_dev_id ; + int mFend_mod; + int mCurScanChannelId ; + int mCurScanProgramId ; + + // + EpgEvent mCurEpgEv; +}; +#endif //_CDTVEPG_H diff --git a/tvapi/libtv/tv/CTvEv.cpp b/tvapi/libtv/tv/CTvEv.cpp new file mode 100644 index 0000000..eb7129d --- a/dev/null +++ b/tvapi/libtv/tv/CTvEv.cpp @@ -0,0 +1,11 @@ +// amlogic 2014 +// +// @ Project : tv +// @ File Name : +// @ Date : 2014-02 +// @ Author : +#include "CTvEv.h" +CTvEv::CTvEv(int type) +{ + mEvType = type; +} diff --git a/tvapi/libtv/tv/CTvEv.h b/tvapi/libtv/tv/CTvEv.h new file mode 100644 index 0000000..54ec5fe --- a/dev/null +++ b/tvapi/libtv/tv/CTvEv.h @@ -0,0 +1,192 @@ +// amlogic 2014 +// +// @ Project : tv +// @ File Name : +// @ Date : 2014-02 +// @ Author : +//电视通知消息的基类 +#if !defined(_CTVEV_H) +#define _CTVEV_H +#include <utils/String8.h> +#define CC_MAX_SERIAL_RD_BUF_LEN (1200) +using namespace android; + +class CTvEv +{ +public: + static const int TV_EVENT_COMMOM = 0;//通用消息 + static const int TV_EVENT_SCANNER = 1;//搜索消息 + static const int TV_EVENT_EPG = 2;//EPG状态消息 + static const int TV_EVENT_SOURCE_SWITCH = 3;//信源切换 + static const int TV_EVENT_SIGLE_DETECT = 4;//信号检测 + static const int TV_EVENT_ADC_CALIBRATION = 5;//ADC校准 + static const int TV_EVENT_VGA = 6;//VGA + static const int TV_EVENT_3D_STATE = 7;//3D + static const int TV_EVENT_AV_PLAYBACK = 8;//PLAYBACK EVENT MSG + static const int TV_EVENT_SERIAL_COMMUNICATION = 9; + static const int TV_EVENT_SOURCE_CONNECT = 10; + static const int TV_EVENT_HDMIRX_CEC = 11; + static const int TV_EVENT_BLOCK = 12; + static const int TV_EVENT_CC = 13; //close caption + static const int TV_EVENT_VCHIP = 14; //VCHIP + static const int TV_EVENT_HDMI_IN_CAP = 15; + static const int TV_EVENT_UPGRADE_FBC = 16; + static const int TV_EVENT_2d4G_HEADSET = 17; + static const int TV_EVENT_AV = 18; + + CTvEv(int type); + virtual ~CTvEv() {}; + int getEvType() const + { + return mEvType; + }; +private: + int mEvType; +}; + +namespace TvEvent +{ + //events + class SignalInfoEvent: public CTvEv + { + public: + SignalInfoEvent() : CTvEv ( CTvEv::TV_EVENT_SIGLE_DETECT ) + { + } + ~SignalInfoEvent() + { + } + int mTrans_fmt; + int mFmt; + int mStatus; + int mReserved; + }; + + class VGAEvent: public CTvEv + { + public: + VGAEvent() : CTvEv ( CTvEv::TV_EVENT_VGA ) + { + } + ~VGAEvent() + { + } + int mState; + }; + + class ADCCalibrationEvent: public CTvEv + { + public: + ADCCalibrationEvent() : CTvEv ( CTvEv::TV_EVENT_ADC_CALIBRATION ) + { + } + ~ADCCalibrationEvent() + { + } + int mState; + }; + + class SerialCommunicationEvent: public CTvEv + { + public: + SerialCommunicationEvent(): CTvEv(CTvEv::TV_EVENT_SERIAL_COMMUNICATION) + { + } + ~SerialCommunicationEvent() + { + } + public: + int mDevId; + int mDataCount; + unsigned char mDataBuf[CC_MAX_SERIAL_RD_BUF_LEN]; + }; + + class SourceConnectEvent: public CTvEv + { + public: + SourceConnectEvent() : CTvEv ( CTvEv::TV_EVENT_SOURCE_CONNECT ) + { + } + ~SourceConnectEvent() + { + } + int mSourceInput; + int connectionState; + }; + + class HDMIRxCECEvent: public CTvEv + { + public: + HDMIRxCECEvent() : CTvEv ( CTvEv::TV_EVENT_HDMIRX_CEC ) + { + } + ~HDMIRxCECEvent() + { + } + int mDataCount; + int mDataBuf[32]; + }; + + class AVPlaybackEvent: public CTvEv + { + public: + AVPlaybackEvent() : CTvEv ( CTvEv::TV_EVENT_AV_PLAYBACK ) + { + } + ~AVPlaybackEvent() + { + } + static const int EVENT_AV_PLAYBACK_NODATA = 1; + static const int EVENT_AV_PLAYBACK_RESUME = 2; + static const int EVENT_AV_SCAMBLED = 3; + static const int EVENT_AV_UNSUPPORT = 4; + + public: + int mMsgType; + int mProgramId; + }; + class BlockEvent: public CTvEv + { + public: + BlockEvent() : CTvEv ( CTvEv::TV_EVENT_BLOCK ) + { + } + ~BlockEvent() + { + } + public: + bool block_status; + int programBlockType; + String8 vchipDimension; + String8 vchipAbbrev; + String8 vchipAbbtext; + }; + + class UpgradeFBCEvent: public CTvEv + { + public: + UpgradeFBCEvent() : CTvEv ( CTvEv::TV_EVENT_UPGRADE_FBC ) + { + } + ~UpgradeFBCEvent() + { + } + int mState; + int param; + }; + + class HeadSetOf2d4GEvent: public CTvEv + { + public: + HeadSetOf2d4GEvent(): CTvEv(CTvEv::TV_EVENT_2d4G_HEADSET) + { + } + ~HeadSetOf2d4GEvent() + { + } + public: + int state; + int para; + }; +}; +#endif diff --git a/tvapi/libtv/tv/CTvLog.cpp b/tvapi/libtv/tv/CTvLog.cpp new file mode 100644 index 0000000..9cdf19b --- a/dev/null +++ b/tvapi/libtv/tv/CTvLog.cpp @@ -0,0 +1,20 @@ +// +// +// amlogic 2013 +// +// @ Project : tv +// @ File Name : CTvDatabase.h +// @ Date : 2013-11 +// @ Author : +// +// +#include "CTvLog.h" +/*void CTvLog::LOGD() +{ +} +void CTvLog::LOGE() +{ +} +void CTvLog::LOGW() +{ +}*/ diff --git a/tvapi/libtv/tv/CTvLog.h b/tvapi/libtv/tv/CTvLog.h new file mode 100644 index 0000000..79c6fc7 --- a/dev/null +++ b/tvapi/libtv/tv/CTvLog.h @@ -0,0 +1,35 @@ +// +// +// amlogic 2013 +// +// @ Project : tv +// @ File Name : CTvDatabase.h +// @ Date : 2013-11 +// @ Author : +// +// +#include <utils/Log.h> +#if !defined(_CTVLOG_H) +#define _CTVLOG_H + +#define LOGD(...) \ +{ \ +__android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__); } + + +#define LOGE(...) \ +{ \ +__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__); } + +#define LOGW(...) \ +{ \ +__android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__); } + + +//class CTvLog{ +// public: +// inline static void LOGD(); +// inline static void LOGW(); +// inline static void LOGE(); +//}; +#endif // diff --git a/tvapi/libtv/tv/CTvRecord.cpp b/tvapi/libtv/tv/CTvRecord.cpp new file mode 100644 index 0000000..564f4f3 --- a/dev/null +++ b/tvapi/libtv/tv/CTvRecord.cpp @@ -0,0 +1,276 @@ +#include <string.h> +#include <fcntl.h> +#include <sys/ioctl.h> +#include <am_debug.h> +#include <am_dmx.h> +#include <am_av.h> + +#include <am_misc.h> + +#include <am_fend.h> +#include <am_dvr.h> +#include <errno.h> +#include "CTvProgram.h" +#include "../tvconfig/tvconfig.h" +#include "CTvRecord.h" + +#ifdef LOG_TAG +#undef LOG_TAG +#endif +#define LOG_TAG "CTvRecord" + +#define FEND_DEV_NO 0 +#define DVR_DEV_NO 0 +#define DVR_BUF_SIZE 1024*1024 +#define DVR_DEV_COUNT (2) + +typedef struct { + int id; + char file_name[256]; + pthread_t thread; + int running; + int fd; +} DVRData; + +static DVRData data_threads[DVR_DEV_COUNT]; +int pvr_init = 0; +CTvRecord::CTvRecord() +{ + AM_DVR_OpenPara_t dpara; + memset(&dpara, 0, sizeof(dpara)); + AM_DVR_Open(DVR_DEV_NO, &dpara); + data_threads[DVR_DEV_NO].id = 0; + data_threads[DVR_DEV_NO].fd = -1; + data_threads[DVR_DEV_NO].running = 0; + + AM_DVR_SetSource(DVR_DEV_NO, AM_DVR_SRC_ASYNC_FIFO0); + AM_DVR_SetBufferSize(DVR_DEV_NO, DVR_BUF_SIZE); + + memset(filename, 0, sizeof(filename)); + progid = 0xFFFF; + vpid = 0x1fff; + apid = 0x1fff; +} +CTvRecord::~CTvRecord() +{ + AM_DVR_Close(DVR_DEV_NO); + +} +void CTvRecord::dvr_init(void) +{ + AM_DVR_OpenPara_t para; + char buf[32]; + + if (pvr_init) + return; + + memset(¶, 0, sizeof(para)); + LOGD("%s,%d", "TV", __LINE__); + + AM_DVR_Open(DVR_DEV_NO, ¶); + AM_DVR_SetSource(DVR_DEV_NO, AM_DVR_SRC_ASYNC_FIFO0); + AM_DVR_SetBufferSize(DVR_DEV_NO, DVR_BUF_SIZE); + + snprintf(buf, sizeof(buf), "%d", (512 * 1024)); + AM_FileEcho("/sys/class/dmx/asyncfifo_len", buf); + + pvr_init = 1; +} + +char *CTvRecord::GetRecordFileName() +{ + return filename; +} +void CTvRecord::SetRecordFileName(char *name) +{ + strcpy(filename, name); +} +void CTvRecord::SetCurRecProgramId(int id) +{ + progid = id; +} + +int CTvRecord::dvr_data_write(int fd, uint8_t *buf, int size) +{ + int ret; + int left = size; + uint8_t *p = buf; + LOGD("%s,%d", "TV", __LINE__); + + while (left > 0) { + ret = write(fd, p, left); + if (ret == -1) { + if (errno != EINTR) { + LOGD("Write DVR data failed: %s", strerror(errno)); + break; + } + ret = 0; + } + + left -= ret; + p += ret; + } + + return (size - left); +} +void *CTvRecord::dvr_data_thread(void *arg) +{ + DVRData *dd = (DVRData *)arg; + int cnt; + uint8_t buf[256 * 1024]; + + LOGD("Data thread for DVR%d start ,record file will save to '%s'", dd->id, dd->file_name); + LOGD("%s,%d", "TV", __LINE__); + + while (dd->running) { + cnt = AM_DVR_Read(dd->id, buf, sizeof(buf), 1000); + if (cnt <= 0) { + LOGD("No data available from DVR%d", dd->id); + usleep(200 * 1000); + continue; + } + //AM_DEBUG(1, "read from DVR%d return %d bytes", dd->id, cnt); + if (dd->fd != -1) { + dvr_data_write(dd->fd, buf, cnt); + } + } + + if (dd->fd != -1) { + close(dd->fd); + dd->fd = -1; + } + LOGD("Data thread for DVR%d now exit", dd->id); + + return NULL; +} + +void CTvRecord::start_data_thread(int dev_no) +{ + DVRData *dd = &data_threads[dev_no]; + + if (dd->running) + return; + LOGD("%s,%d,dev=%d", "TV", __LINE__, dev_no); + dd->fd = open(dd->file_name, O_TRUNC | O_WRONLY | O_CREAT, 0666); + if (dd->fd == -1) { + LOGD("Cannot open record file '%s' for DVR%d, %s", dd->file_name, dd->id, strerror(errno)); + return; + } + dd->running = 1; + pthread_create(&dd->thread, NULL, dvr_data_thread, dd); +} +void CTvRecord::get_cur_program_pid(int progId) +{ + CTvProgram prog; + int aindex; + CTvProgram::Audio *pA; + CTvProgram::Video *pV; + int ret = CTvProgram::selectByID(progId, prog); + if (ret != 0) return; + + LOGD("%s,%d", "TV", __LINE__); + pV = prog.getVideo(); + if (pV != NULL) { + setvpid(pV->getPID()); + } + + aindex = prog.getCurrAudioTrackIndex(); + if (-1 == aindex) { //db is default + aindex = prog.getCurrentAudio(String8("eng")); + if (aindex >= 0) { + prog.setCurrAudioTrackIndex(progId, aindex); + } + } + + if (aindex >= 0) { + pA = prog.getAudio(aindex); + if (pA != NULL) { + setapid(pA->getPID()); + } + } + +} +int CTvRecord::start_dvr() +{ + AM_DVR_StartRecPara_t spara; + int pid_cnt; + int pids[2]; + + /**8PID*/ + get_cur_program_pid(progid); + pids[0] = getvpid(); + pids[1] = getapid(); + + strcpy(data_threads[DVR_DEV_NO].file_name, GetRecordFileName()); + LOGD("%s,%d", "TV", __LINE__); + //sprintf(data_threads[DVR_DEV_NO].file_name,"%s","/storage/external_storage/sda4/testdvr.ts"); + spara.pid_count = 2; + memcpy(&spara.pids, pids, sizeof(pids)); + + if (AM_DVR_StartRecord(DVR_DEV_NO, &spara) == AM_SUCCESS) { + start_data_thread(DVR_DEV_NO); + } + + return 0; +} +void CTvRecord::stop_data_thread(int dev_no) +{ + DVRData *dd = &data_threads[dev_no]; + LOGD("%s,%d", "TV", __LINE__); + + if (! dd->running) + return; + dd->running = 0; + pthread_join(dd->thread, NULL); + LOGD("Data thread for DVR%d has exit", dd->id); +} + + +void CTvRecord::StartRecord(int id) +{ + AM_DVR_OpenPara_t dpara; + fe_status_t status; + char buf[32]; + + AM_FEND_GetStatus(FEND_DEV_NO, &status); + + if (status & FE_HAS_LOCK) { + LOGD("locked\n"); + } else { + LOGD("unlocked\n"); + return ; + } + SetCurRecProgramId(id); + start_dvr(); + + return; +} +void CTvRecord::StopRecord() +{ + int i = 0; + LOGD("stop record for %d", DVR_DEV_NO); + AM_DVR_StopRecord(DVR_DEV_NO); + + //for (i=0; i< DVR_DEV_COUNT; i++) + { + if (data_threads[DVR_DEV_NO].running) + stop_data_thread(DVR_DEV_NO); + //LOGD("Closing DMX%d...", i); + } + + +} +void CTvRecord::SetRecCurTsOrCurProgram(int sel) +{ + int i = 0; + char buf[50]; + memset(buf, 0, sizeof(buf)); + for (; i < 3; i++) { + snprintf(buf, sizeof(buf), "/sys/class/stb/dvr%d_mode", i); + if (sel) + AM_FileEcho(buf, "ts"); + else + AM_FileEcho(buf, "pid"); + } +} + diff --git a/tvapi/libtv/tv/CTvRecord.h b/tvapi/libtv/tv/CTvRecord.h new file mode 100644 index 0000000..bd32880 --- a/dev/null +++ b/tvapi/libtv/tv/CTvRecord.h @@ -0,0 +1,47 @@ + + +class CTvRecord +{ +private : + char filename[256]; + int progid; + int vpid; + int apid; + static void dvr_init(void); + void setvpid(int vid) + { + this->vpid = vid; + } + int getvpid() + { + return vpid; + } + void setapid(int aid) + { + this->apid = aid; + } + int getapid() + { + return apid; + } + static int dvr_data_write(int fd, uint8_t *buf, int size); + static void *dvr_data_thread(void *arg); + char *GetRecordFileName(); + void SetCurRecProgramId(int id); + void start_data_thread(int dev_no); + void get_cur_program_pid(int progId); + int start_dvr(void); + void stop_data_thread(int dev_no); + + +public: + CTvRecord(); + ~CTvRecord(); + void SetRecordFileName(char *name); + void StartRecord(int id); + void StopRecord(); + void SetRecCurTsOrCurProgram(int sel); // 1: all program in the Ts; 0:current program + + + +}; diff --git a/tvapi/libtv/tv/CTvSatellite.h b/tvapi/libtv/tv/CTvSatellite.h new file mode 100644 index 0000000..4ac294f --- a/dev/null +++ b/tvapi/libtv/tv/CTvSatellite.h @@ -0,0 +1,22 @@ +// +// +// amlogic 2013 +// +// @ Project : tv +// @ File Name : CTvSatellite.h +// @ Date : 2013-11 +// @ Author : +// +// + + +#if !defined(_CTVSATELLITE_H) +#define _CTVSATELLITE_H + + +// TV SatelliteϢ +class CTvSatellite +{ +}; + +#endif //_CTVSATELLITE_H diff --git a/tvapi/libtv/tv/CTvScanner.cpp b/tvapi/libtv/tv/CTvScanner.cpp new file mode 100644 index 0000000..e66ae0b --- a/dev/null +++ b/tvapi/libtv/tv/CTvScanner.cpp @@ -0,0 +1,1146 @@ +// +// +// amlogic 2013 +// +// @ Project : tv +// @ File Name : +// @ Date : 2013-11 +// @ Author : +// +// +#include "CTvScanner.h" +#include "CTvProgram.h" +#include "CTvRegion.h" +#include "CFrontEnd.h" +#ifdef LOG_TAG +#undef LOG_TAG +#define LOG_TAG "CTvScanner" +#endif + + +//int CTvScanner::getStartPara() +//{ +// +//} +CTvScanner::CTvScanner(CTvin *pTvin) +{ + mbScanStart = false; + mpObserver = NULL; + mSource = 0xff; + mMinFreq = 1; + mMaxFreq = 100; + mCurScanStartFreq = 1; + mCurScanEndFreq = 100; + mpTvin = pTvin; +} + +CTvScanner::~CTvScanner() +{ + AM_EVT_Unsubscribe(mScanHandle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); + AM_EVT_Unsubscribe(mScanHandle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); +} + + +AM_Bool_t CTvScanner::atv_cvbs_lock_check(v4l2_std_id *colorStd) +{ + tvafe_cvbs_video_t cvbs_lock_status; + int ret, i = 0; + + *colorStd = 0; + while (i < 20) { + ret = mpTvin->AFE_GetCVBSLockStatus(&cvbs_lock_status); + + if (cvbs_lock_status == TVAFE_CVBS_VIDEO_HV_LOCKED) + //||cvbs_lock_status == TVAFE_CVBS_VIDEO_V_LOCKED + //||cvbs_lock_status == TVAFE_CVBS_VIDEO_H_LOCKED) + { + usleep(2000 * 1000); + tvin_info_t info; + mpTvin->VDIN_GetSignalInfo(&info); + *colorStd = CTvin::CvbsFtmToV4l2ColorStd(info.fmt); + LOGD("atv_cvbs_lock_check locked and cvbs fmt = 0x%x std = 0x%x", info.fmt, *colorStd); + return true; + } + usleep(50 * 1000); + i++; + } + return false; +} + +AM_Bool_t CTvScanner::s_atv_cvbs_lock_check(void *data) +{ + if (data == NULL) return false; + AM_SCAN_ATV_LOCK_PARA_t *pAtvPara = (AM_SCAN_ATV_LOCK_PARA_t *)data; + CTvScanner *pScan = (CTvScanner *)(pAtvPara->pData); + v4l2_std_id std; + AM_Bool_t isLock = pScan->atv_cvbs_lock_check(&std); + pAtvPara->pOutColorSTD = std; + return isLock; +} + +int CTvScanner::ATVManualScan(int min_freq, int max_freq, int std, int store_Type, int channel_num) +{ + stopScan(); + if (min_freq <= 0 || max_freq <= 0 || min_freq == max_freq) { + LOGD("atv manual scan freq error start = %d end = %d", min_freq, max_freq); + return -1; + } + int direction = (max_freq >= min_freq) ? 1 : 0; + + if (!mbScanStart) { //not start or stop + // + mCurScanStartFreq = min_freq; + mCurScanEndFreq = max_freq; + AM_SCAN_CreatePara_t para; + AM_DMX_OpenPara_t dmx_para; + int handle = 0, i; + LOGD("startScanThread"); + // Create the scan + memset(¶, 0, sizeof(para)); + para.fend_dev_id = 0;//default + para.mode = AM_SCAN_MODE_ATV_DTV;// + para.atv_para.mode = AM_SCAN_ATVMODE_MANUAL; + para.atv_para.storeMode = store_Type; + para.dtv_para.mode = AM_SCAN_DTVMODE_NONE; + + para.atv_para.am_scan_atv_cvbs_lock = s_atv_cvbs_lock_check; + + para.atv_para.fe_cnt = 3; + para.atv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t *>(calloc(3, sizeof(AM_FENDCTRL_DVBFrontendParameters_t))); + if (para.atv_para.fe_paras != NULL) { + memset(para.atv_para.fe_paras, 0, 3 * sizeof(AM_FENDCTRL_DVBFrontendParameters_t)); + para.atv_para.fe_paras[0].m_type = FE_ANALOG; + para.atv_para.fe_paras[0].analog.para.frequency = min_freq; + para.atv_para.fe_paras[1].m_type = FE_ANALOG; + para.atv_para.fe_paras[1].analog.para.frequency = max_freq; + para.atv_para.fe_paras[2].m_type = FE_ANALOG; + para.atv_para.fe_paras[2].analog.para.frequency = min_freq; + } + para.atv_para.direction = direction; + para.atv_para.default_std = std; + + para.atv_para.channel_id = -1; + para.atv_para.cvbs_unlocked_step = 1000000; + para.atv_para.cvbs_locked_step = 3000000; + para.atv_para.afc_range = 2000000; + + para.dtv_para.resort_all = AM_FALSE; + para.dtv_para.sort_method = AM_SCAN_SORT_BY_FREQ_SRV_ID; + para.store_cb = NULL; + para.atv_para.channel_num = channel_num; + + memset(&dmx_para, 0, sizeof(dmx_para)); + AM_DMX_Open(para.dtv_para.dmx_dev_id, &dmx_para); + + if ((para.dtv_para.mode & 0x07) != AM_SCAN_DTVMODE_NONE) { + AM_FEND_SetMode(para.fend_dev_id, para.dtv_para.source); + tv_scan_reconnect_dmx_to_fend(para.dtv_para.dmx_dev_id, para.fend_dev_id); + } + + LOGD("atv manual scan mode = %d", para.dtv_para.mode); + // Start Scan + if (AM_SCAN_Create(¶, &handle) != AM_SUCCESS) { + LOGD("SCAN CREATE fail"); + handle = 0; + } else { + mScanHandle = handle; + AM_SCAN_SetUserData(handle, (void *)this); + AM_EVT_Subscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); + AM_EVT_Subscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); + if (AM_SCAN_Start(handle) != AM_SUCCESS) { + AM_SCAN_Destroy(handle, AM_FALSE); + AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); + AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); + handle = 0; + } + } + if (para.atv_para.fe_paras != NULL) + free(para.atv_para.fe_paras); + if (para.dtv_para.fe_paras != NULL) + free(para.dtv_para.fe_paras); + + if (handle == 0) { + return -1; + } + mbScanStart = true;//start call ok + } else { + LOGD("scanning and not stop"); + } + + return 0; + +} +int CTvScanner::autoAtvScan(int min_freq, int max_freq, int std, int search_type) +{ + stopScan(); + if (min_freq <= 0 || max_freq <= 0 || min_freq > max_freq) + return -1; + if (!mbScanStart) { //not start or stop + mCurScanStartFreq = min_freq; + mCurScanEndFreq = max_freq; + + AM_SCAN_CreatePara_t para; + AM_DMX_OpenPara_t dmx_para; + int handle = 0, i; + // Create the scan + memset(¶, 0, sizeof(para)); + + para.fend_dev_id = 0;//default + para.mode = AM_SCAN_MODE_ATV_DTV;// + if (search_type == 1) + para.atv_para.storeMode = 1; + else + para.atv_para.storeMode = 0; + para.dtv_para.mode = AM_SCAN_DTVMODE_NONE; + + para.atv_para.am_scan_atv_cvbs_lock = s_atv_cvbs_lock_check; + + para.atv_para.fe_cnt = 3; + para.atv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t *>(calloc(3, sizeof(AM_FENDCTRL_DVBFrontendParameters_t))); + if (para.atv_para.fe_paras != NULL) { + memset(para.atv_para.fe_paras, 0, 3 * sizeof(AM_FENDCTRL_DVBFrontendParameters_t)); + para.atv_para.fe_paras[0].m_type = FE_ANALOG; + para.atv_para.fe_paras[0].analog.para.frequency = min_freq; + para.atv_para.fe_paras[1].m_type = FE_ANALOG; + para.atv_para.fe_paras[1].analog.para.frequency = max_freq; + para.atv_para.fe_paras[2].m_type = FE_ANALOG; + para.atv_para.fe_paras[2].analog.para.frequency = 0; + } + + para.atv_para.direction = 0; + para.atv_para.default_std = std; + + para.atv_para.channel_id = -1; + para.atv_para.afc_unlocked_step = 3000000; + para.atv_para.cvbs_unlocked_step = 1500000; + para.atv_para.cvbs_locked_step = 6000000; + para.atv_para.afc_range = 2000000; + + para.dtv_para.resort_all = AM_FALSE; + para.dtv_para.sort_method = AM_SCAN_SORT_BY_FREQ_SRV_ID; + para.store_cb = NULL; + + memset(&dmx_para, 0, sizeof(dmx_para)); + AM_DMX_Open(para.dtv_para.dmx_dev_id, &dmx_para); + + if ((para.dtv_para.mode & 0x07) != AM_SCAN_DTVMODE_NONE) { + AM_FEND_SetMode(para.fend_dev_id, para.dtv_para.source); + tv_scan_reconnect_dmx_to_fend(para.dtv_para.dmx_dev_id, para.fend_dev_id); + } + + // prog->dmx_id = para.dtv_para.dmx_dev_id; + // prog->fend_id = para.fend_dev_id; + // prog->mode = para.dtv_para.mode; + LOGD(" mode = %d", para.dtv_para.mode); + // Start Scan + if (AM_SCAN_Create(¶, &handle) != AM_SUCCESS) { + LOGD("SCAN CREATE fail"); + handle = 0; + } else { + mScanHandle = handle; + AM_SCAN_SetUserData(handle, (void *)this); + //注册搜索事件 + AM_EVT_Subscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); + //注册信号质量通知事件 + AM_EVT_Subscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); + if (AM_SCAN_Start(handle) != AM_SUCCESS) { + AM_SCAN_Destroy(handle, AM_FALSE); + AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); + AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); + handle = 0; + } + } + if (para.atv_para.fe_paras != NULL) + free(para.atv_para.fe_paras); + if (para.dtv_para.fe_paras != NULL) + free(para.dtv_para.fe_paras); + + if (handle == 0) { + return -1; + } + mbScanStart = true;//start call ok + } else { + LOGD("scanning and not stop"); + } + + return 0; +} + +int CTvScanner::manualAtscScan(int channelID, int attennaType, int std) +{ + stopScan(); + if (!mbScanStart) { //not start or stop + AM_SCAN_CreatePara_t para; + AM_DMX_OpenPara_t dmx_para; + int handle = 0, i; + // Create the scan + memset(¶, 0, sizeof(para)); + + //strcpy(para.default_text_lang,"eng");//config + //strcpy(para.text_langs, "local eng zho chi chs first");//config + para.fend_dev_id = 0;//default + para.mode = AM_SCAN_MODE_ADTV;//DTV + para.atv_para.mode = AM_SCAN_ATVMODE_NONE; + + + para.atv_para.default_std = std; + + + para.dtv_para.mode = AM_SCAN_DTVMODE_MANUAL;//DTV_MODE_ALLBAND + //para.dtv_para.mode |= (*env)->GetIntField(env, para, doptions);//忽略 + para.dtv_para.source = FE_ATSC;//fe_type + para.dtv_para.dmx_dev_id = 0;//default 0 + para.dtv_para.resort_all = AM_TRUE; + para.dtv_para.clear_source = AM_FALSE; + para.dtv_para.mix_tv_radio = AM_FALSE; + para.dtv_para.sort_method = AM_SCAN_SORT_BY_FREQ_SRV_ID; + para.store_cb = NULL; + //para.dtv_para.attenna = attennaType; + + para.dtv_para.standard = AM_SCAN_DTV_STD_ATSC; + + mSource = para.dtv_para.source; + + Vector<sp<CTvChannel> > vcp; + //CTvDatabase::getChannelParaList("/data/tv_default.xml", vcp);//channel list from xml or db + getAtscChannelPara(attennaType, vcp); + LOGD("ANDESEN test attenna type is %d", attennaType); + + int size = vcp.size(); + LOGD("channel list size = %d", size); + //showboz + if (size == 0) { + CTvDatabase::GetTvDb()->importXmlToDB("/etc/tv_default.xml"); + getAtscChannelPara(attennaType, vcp); + size = vcp.size(); + } + + if (!(para.dtv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t *>(calloc(1, sizeof(AM_FENDCTRL_DVBFrontendParameters_t))))) + return -1; + + //memset(pfp, 0, size * sizeof(AM_FENDCTRL_DVBFrontendParameters_t)); + + for (i = 0; i < size; i++) { + if (channelID == vcp[i]->getLogicalChannelNum()) { + para.dtv_para.fe_paras[0].m_type = 3;//MODE_ATSC + para.dtv_para.fe_paras[0].m_logicalChannelNum = vcp[i]->getLogicalChannelNum(); + para.dtv_para.fe_paras[0].atsc.para.frequency = vcp[i]->getFrequency(); + para.dtv_para.fe_paras[0].atsc.para.u.vsb.modulation = (fe_modulation_t)(vcp[i]->getModulation()); + LOGD("andesen test atsc manual type=%d,num=%d,freq=%d,modu=%d", + para.dtv_para.fe_paras[0].m_type, para.dtv_para.fe_paras[0].m_logicalChannelNum, + para.dtv_para.fe_paras[0].atsc.para.frequency, para.dtv_para.fe_paras[0].atsc.para.u.vsb.modulation); + } + } + //allband + para.dtv_para.fe_cnt = 1; + memset(&dmx_para, 0, sizeof(dmx_para)); + AM_DMX_Open(para.dtv_para.dmx_dev_id, &dmx_para); + + if ((para.dtv_para.mode & 0x07) != AM_SCAN_DTVMODE_NONE) { + AM_FEND_SetMode(para.fend_dev_id, para.dtv_para.source); + tv_scan_reconnect_dmx_to_fend(para.dtv_para.dmx_dev_id, para.fend_dev_id); + } + + // prog->dmx_id = para.dtv_para.dmx_dev_id; + // prog->fend_id = para.fend_dev_id; + // prog->mode = para.dtv_para.mode; + // Start Scan + if (AM_SCAN_Create(¶, &handle) != AM_SUCCESS) { + LOGD("SCAN CREATE fail"); + handle = 0; + } else { + mScanHandle = handle; + AM_SCAN_SetUserData(handle, (void *)this); + //注册搜索事件 + AM_EVT_Subscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); + //注册信号质量通知事件 + AM_EVT_Subscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); + if (AM_SCAN_Start(handle) != AM_SUCCESS) { + AM_SCAN_Destroy(handle, AM_FALSE); + AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); + AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); + handle = 0; + } + } + if (para.atv_para.fe_paras != NULL) + free(para.atv_para.fe_paras); + if (para.dtv_para.fe_paras != NULL) + free(para.dtv_para.fe_paras); + + if (handle == 0) { + return -1; + } + mbScanStart = true;//start call ok + } else { + LOGD("scanning and not stop"); + } + return 0; +} + +int CTvScanner::manualDtmbScan(int beginFreq, int endFreq, int modulation) +{ + stopScan(); + + if (!mbScanStart) { //not start or stop + AM_SCAN_CreatePara_t para; + AM_DMX_OpenPara_t dmx_para; + int handle = 0, i; + // Create the scan + memset(¶, 0, sizeof(para)); + + para.fend_dev_id = 0;//default + para.mode = AM_SCAN_MODE_DTV_ATV;//DTV + para.atv_para.mode = AM_SCAN_ATVMODE_NONE; + para.dtv_para.mode = AM_SCAN_DTVMODE_MANUAL; + para.dtv_para.source = FE_DTMB;//fe_type + para.dtv_para.dmx_dev_id = 0;//default 0 + + Vector<sp<CTvChannel> > vcp; + CTvRegion::getChannelListByNameAndFreqRange("CHINA,Default DTMB ALL", beginFreq, endFreq, vcp); + int size = vcp.size(); + + //@author:hao.fu + if (size == 0) { + return -1; + } + + if (!(para.dtv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t *>(calloc(size, sizeof(AM_FENDCTRL_DVBFrontendParameters_t))))) + return -1; + + for (i = 0; i < size; i++) { + para.dtv_para.fe_paras[i].m_type = 5;//MODE_DTMB + para.dtv_para.fe_paras[i].dtmb.para.frequency = vcp[i]->getFrequency(); + para.dtv_para.fe_paras[i].dtmb.para.inversion = INVERSION_OFF; + para.dtv_para.fe_paras[i].dtmb.para.u.ofdm.bandwidth = (fe_bandwidth_t)(vcp[i]->getBandwidth()); + if (modulation == -1) + para.dtv_para.fe_paras[i].cable.para.u.qam.modulation = (fe_modulation_t)(vcp[i]->getModulation()); + else + para.dtv_para.fe_paras[i].cable.para.u.qam.modulation = (fe_modulation_t)modulation; + } + + para.dtv_para.fe_cnt = size; + para.dtv_para.resort_all = AM_FALSE; + para.dtv_para.sort_method = AM_SCAN_SORT_BY_FREQ_SRV_ID; + para.store_cb = NULL; + + + memset(&dmx_para, 0, sizeof(dmx_para)); + AM_DMX_Open(para.dtv_para.dmx_dev_id, &dmx_para); + + if ((para.dtv_para.mode & 0x07) != AM_SCAN_DTVMODE_NONE) { + AM_FEND_SetMode(para.fend_dev_id, para.dtv_para.source); + tv_scan_reconnect_dmx_to_fend(para.dtv_para.dmx_dev_id, para.fend_dev_id); + } + + // Start Scan + if (AM_SCAN_Create(¶, &handle) != AM_SUCCESS) { + LOGD("SCAN CREATE fail"); + handle = 0; + } else { + mScanHandle = handle; + AM_SCAN_SetUserData(handle, (void *)this); + AM_EVT_Subscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); + AM_EVT_Subscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); + if (AM_SCAN_Start(handle) != AM_SUCCESS) { + AM_SCAN_Destroy(handle, AM_FALSE); + AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); + AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); + handle = 0; + } + } + if (para.atv_para.fe_paras != NULL) + free(para.atv_para.fe_paras); + if (para.dtv_para.fe_paras != NULL) + free(para.dtv_para.fe_paras); + + if (handle == 0) { + return -1; + } + mbScanStart = true;//start call ok + } else { + LOGD("scanning and not stop"); + } + return 0; +} + + +int CTvScanner::autoTvScan() +{ + stopScan(); + + if (!mbScanStart) { //not start or stop + AM_SCAN_CreatePara_t para; + AM_DMX_OpenPara_t dmx_para; + int handle = 0, i; + // Create the scan + memset(¶, 0, sizeof(para)); + + //strcpy(para.default_text_lang,"eng");//config + //strcpy(para.text_langs, "eng zho chi");//config + para.fend_dev_id = 0;//default + para.mode = AM_SCAN_MODE_DTV_ATV;//DTV + para.atv_para.mode = AM_SCAN_ATVMODE_NONE; + para.dtv_para.mode = AM_SCAN_DTVMODE_ALLBAND;//DTV_MODE_ALLBAND + //para.dtv_para.mode |= (*env)->GetIntField(env, para, doptions);//忽略 + para.dtv_para.source = 1;//QAM + para.dtv_para.dmx_dev_id = 0;//default 0 + Vector<sp<CTvChannel> > vcp; + //CTvDatabase::getChannelParaList("/data/tv_default.xml", vcp);//channel list from xml or db + CTvRegion::getChannelListByName("China,DVB-C allband", vcp); + + int size = vcp.size(); + LOGD("channel list size = %d", size); + if (!(para.dtv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t *>(calloc(size, sizeof(AM_FENDCTRL_DVBFrontendParameters_t))))) + return -1; + + //memset(pfp, 0, size * sizeof(AM_FENDCTRL_DVBFrontendParameters_t)); + + for (i = 0; i < size; i++) { + para.dtv_para.fe_paras[i].m_type = FE_QAM; + para.dtv_para.fe_paras[i].cable.para.frequency = vcp[i]->getFrequency(); + para.dtv_para.fe_paras[i].cable.para.inversion = INVERSION_OFF; + para.dtv_para.fe_paras[i].cable.para.u.qam.symbol_rate = vcp[i]->getSymbolRate(); + para.dtv_para.fe_paras[i].cable.para.u.qam.modulation = (fe_modulation_t)(vcp[i]->getModulation()); + } + //allband + para.dtv_para.fe_cnt = size; + + para.dtv_para.resort_all = AM_FALSE; + para.dtv_para.sort_method = AM_SCAN_SORT_BY_FREQ_SRV_ID; + para.store_cb = NULL; + memset(&dmx_para, 0, sizeof(dmx_para)); + AM_DMX_Open(para.dtv_para.dmx_dev_id, &dmx_para); + + if ((para.dtv_para.mode & 0x07) != AM_SCAN_DTVMODE_NONE) { + AM_FEND_SetMode(para.fend_dev_id, para.dtv_para.source); + tv_scan_reconnect_dmx_to_fend(para.dtv_para.dmx_dev_id, para.fend_dev_id); + } + + // prog->dmx_id = para.dtv_para.dmx_dev_id; + // prog->fend_id = para.fend_dev_id; + // prog->mode = para.dtv_para.mode; + // Start Scan + if (AM_SCAN_Create(¶, &handle) != AM_SUCCESS) { + LOGD("SCAN CREATE fail"); + handle = 0; + } else { + LOGD("SCAN CREATE handle = %d", handle); + mScanHandle = handle; + AM_SCAN_SetUserData(handle, (void *)this); + //注册搜索事件 + AM_EVT_Subscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); + //注册信号质量通知事件 + //AM_EVT_Subscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); + if (AM_SCAN_Start(handle) != AM_SUCCESS) { + AM_SCAN_Destroy(handle, AM_FALSE); + AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); + // AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); + handle = 0; + } + } + if (para.atv_para.fe_paras != NULL) + free(para.atv_para.fe_paras); + if (para.dtv_para.fe_paras != NULL) + free(para.dtv_para.fe_paras); + + if (handle == 0) { + return -1; + } + mbScanStart = true;//start call ok + } else { + LOGD("scanning and not stop"); + } + return 0; +} +//only test for dtv allbland auto +int CTvScanner::startScan() +{ + stopScan(); + + if (!mbScanStart) { //not start or stop + AM_SCAN_CreatePara_t para; + AM_DMX_OpenPara_t dmx_para; + int handle = 0, i; + // Create the scan + memset(¶, 0, sizeof(para)); + + //strcpy(para.default_text_lang,"eng");//config + //strcpy(para.text_langs, "eng zho chi");//config + para.fend_dev_id = 0;//default + para.mode = AM_SCAN_MODE_DTV_ATV;//DTV + para.atv_para.mode = AM_SCAN_ATVMODE_NONE; + para.dtv_para.mode = 3;//DTV_MODE_ALLBAND + //para.dtv_para.mode |= (*env)->GetIntField(env, para, doptions);//忽略 + para.dtv_para.source = 1;//QAM + para.dtv_para.dmx_dev_id = 0;//default 0 + Vector<sp<CTvChannel> > vcp; + //CTvDatabase::getChannelParaList("/data/tv_default.xml", vcp);//channel list from xml or db + CTvRegion::getChannelListByName("China,DVB-C allband", vcp); + + int size = vcp.size(); + LOGD("channel list size = %d", size); + if (!(para.dtv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t *>(calloc(size, sizeof(AM_FENDCTRL_DVBFrontendParameters_t))))) + return -1; + + //memset(pfp, 0, size * sizeof(AM_FENDCTRL_DVBFrontendParameters_t)); + + for (i = 0; i < size; i++) { + para.dtv_para.fe_paras[i].m_type = FE_QAM; + para.dtv_para.fe_paras[i].cable.para.frequency = vcp[i]->getFrequency(); + para.dtv_para.fe_paras[i].cable.para.inversion = INVERSION_OFF; + para.dtv_para.fe_paras[i].cable.para.u.qam.symbol_rate = vcp[i]->getSymbolRate(); + para.dtv_para.fe_paras[i].cable.para.u.qam.modulation = (fe_modulation_t)(vcp[i]->getModulation()); + } + //allband + para.dtv_para.fe_cnt = size; + + para.dtv_para.resort_all = AM_FALSE; + para.dtv_para.sort_method = AM_SCAN_SORT_BY_FREQ_SRV_ID; + para.store_cb = NULL; + + memset(&dmx_para, 0, sizeof(dmx_para)); + AM_DMX_Open(para.dtv_para.dmx_dev_id, &dmx_para); + + if ((para.dtv_para.mode & 0x07) != AM_SCAN_DTVMODE_NONE) { + AM_FEND_SetMode(para.fend_dev_id, para.dtv_para.source); + tv_scan_reconnect_dmx_to_fend(para.dtv_para.dmx_dev_id, para.fend_dev_id); + } + + // prog->dmx_id = para.dtv_para.dmx_dev_id; + // prog->fend_id = para.fend_dev_id; + // prog->mode = para.dtv_para.mode; + // Start Scan + if (AM_SCAN_Create(¶, &handle) != AM_SUCCESS) { + LOGD("SCAN CREATE fail"); + handle = 0; + } else { + mScanHandle = handle; + AM_SCAN_SetUserData(handle, (void *)this); + //注册搜索事件 + AM_EVT_Subscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); + //注册信号质量通知事件 + //AM_EVT_Subscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); + if (AM_SCAN_Start(handle) != AM_SUCCESS) { + AM_SCAN_Destroy(handle, AM_FALSE); + AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); + // AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); + handle = 0; + } + } + if (para.atv_para.fe_paras != NULL) + free(para.atv_para.fe_paras); + if (para.dtv_para.fe_paras != NULL) + free(para.dtv_para.fe_paras); + + if (handle == 0) { + return -1; + } + mbScanStart = true;//start call ok + } else { + LOGD("scanning and not stop"); + } + return 0; +} + + +//only test for dtv allbland auto +int CTvScanner::autoDtmbScan() +{ + stopScan(); + + if (!mbScanStart) { //not start or stop + AM_SCAN_CreatePara_t para; + AM_DMX_OpenPara_t dmx_para; + int handle = 0, i; + // Create the scan + memset(¶, 0, sizeof(para)); + + //strcpy(para.default_text_lang,"eng");//config + //strcpy(para.text_langs, "local eng zho chi chs first");//config + para.fend_dev_id = 0;//default + para.mode = AM_SCAN_MODE_DTV_ATV;//DTV + para.atv_para.mode = AM_SCAN_ATVMODE_NONE; + para.dtv_para.mode = AM_SCAN_DTVMODE_ALLBAND;//DTV_MODE_ALLBAND + //para.dtv_para.mode |= (*env)->GetIntField(env, para, doptions);//忽略 + para.dtv_para.source = FE_DTMB;//fe_type + para.dtv_para.dmx_dev_id = 0;//default 0 + Vector<sp<CTvChannel> > vcp; + //CTvDatabase::getChannelParaList("/data/tv_default.xml", vcp);//channel list from xml or db + CTvRegion::getChannelListByName("CHINA,Default DTMB ALL", vcp); + + int size = vcp.size(); + LOGD("channel list size = %d", size); + //showboz + if (size == 0) { + CTvDatabase::GetTvDb()->importXmlToDB("/etc/tv_default.xml"); + CTvRegion::getChannelListByName("CHINA,Default DTMB ALL", vcp); + size = vcp.size(); + } + + if (!(para.dtv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t *>(calloc(size, sizeof(AM_FENDCTRL_DVBFrontendParameters_t))))) + return -1; + + //memset(pfp, 0, size * sizeof(AM_FENDCTRL_DVBFrontendParameters_t)); + + for (i = 0; i < size; i++) { + para.dtv_para.fe_paras[i].m_type = 5;//MODE_DTMB + para.dtv_para.fe_paras[i].dtmb.para.frequency = vcp[i]->getFrequency(); + para.dtv_para.fe_paras[i].dtmb.para.inversion = INVERSION_OFF; + para.dtv_para.fe_paras[i].dtmb.para.u.ofdm.bandwidth = (fe_bandwidth_t)(vcp[i]->getBandwidth()); + } + //allband + para.dtv_para.fe_cnt = size; + + para.dtv_para.resort_all = AM_FALSE; + para.dtv_para.sort_method = AM_SCAN_SORT_BY_FREQ_SRV_ID; + para.store_cb = NULL; + + memset(&dmx_para, 0, sizeof(dmx_para)); + AM_DMX_Open(para.dtv_para.dmx_dev_id, &dmx_para); + + if ((para.dtv_para.mode & 0x07) != AM_SCAN_DTVMODE_NONE) { + AM_FEND_SetMode(para.fend_dev_id, para.dtv_para.source); + tv_scan_reconnect_dmx_to_fend(para.dtv_para.dmx_dev_id, para.fend_dev_id); + } + + // prog->dmx_id = para.dtv_para.dmx_dev_id; + // prog->fend_id = para.fend_dev_id; + // prog->mode = para.dtv_para.mode; + // Start Scan + if (AM_SCAN_Create(¶, &handle) != AM_SUCCESS) { + LOGD("SCAN CREATE fail"); + handle = 0; + } else { + mScanHandle = handle; + AM_SCAN_SetUserData(handle, (void *)this); + //注册搜索事件 + AM_EVT_Subscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); + //注册信号质量通知事件 + AM_EVT_Subscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); + if (AM_SCAN_Start(handle) != AM_SUCCESS) { + AM_SCAN_Destroy(handle, AM_FALSE); + AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); + AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); + handle = 0; + } + } + if (para.atv_para.fe_paras != NULL) + free(para.atv_para.fe_paras); + if (para.dtv_para.fe_paras != NULL) + free(para.dtv_para.fe_paras); + + if (handle == 0) { + return -1; + } + mbScanStart = true;//start call ok + } else { + LOGD("scanning and not stop"); + } + return 0; +} + +int CTvScanner::autoAtscScan(int attennaType, int std) +{ + stopScan(); + + if (!mbScanStart) { //not start or stop + AM_SCAN_CreatePara_t para; + AM_DMX_OpenPara_t dmx_para; + int handle = 0, i; + // Create the scan + memset(¶, 0, sizeof(para)); + + //strcpy(para.default_text_lang,"eng");//config + //strcpy(para.text_langs, "local eng zho chi chs first");//config + para.fend_dev_id = 0;//default + para.mode = AM_SCAN_MODE_ADTV;//DTV + para.atv_para.mode = AM_SCAN_ATVMODE_NONE; + + + para.atv_para.default_std = std; + + + para.dtv_para.mode = AM_SCAN_DTVMODE_ALLBAND;//DTV_MODE_ALLBAND + //para.dtv_para.mode |= (*env)->GetIntField(env, para, doptions);//忽略 + para.dtv_para.source = FE_ATSC;//fe_type + para.dtv_para.dmx_dev_id = 0;//default 0 + para.dtv_para.resort_all = AM_TRUE; + para.dtv_para.clear_source = AM_TRUE; + para.dtv_para.mix_tv_radio = AM_FALSE; + para.dtv_para.sort_method = AM_SCAN_SORT_BY_FREQ_SRV_ID; + para.store_cb = NULL; + //para.dtv_para.attenna = attennaType;//see dvb atsc-cnc + + para.dtv_para.standard = AM_SCAN_DTV_STD_ATSC; + + mSource = para.dtv_para.source; + + Vector<sp<CTvChannel> > vcp; + //CTvDatabase::getChannelParaList("/data/tv_default.xml", vcp);//channel list from xml or db + getAtscChannelPara(attennaType, vcp); + LOGD("ANDESEN test attenna type is %d", attennaType); + + int size = vcp.size(); + LOGD("channel list size = %d", size); + //showboz + if (size == 0) { + CTvDatabase::GetTvDb()->importXmlToDB("/etc/tv_default.xml"); + getAtscChannelPara(attennaType, vcp); + size = vcp.size(); + } + + if (!(para.dtv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t *>(calloc(size, sizeof(AM_FENDCTRL_DVBFrontendParameters_t))))) + return -1; + + //memset(pfp, 0, size * sizeof(AM_FENDCTRL_DVBFrontendParameters_t)); + + for (i = 0; i < size; i++) { + para.dtv_para.fe_paras[i].m_type = 3;//MODE_ATSC + para.dtv_para.fe_paras[i].m_logicalChannelNum = vcp[i]->getLogicalChannelNum(); + para.dtv_para.fe_paras[i].atsc.para.frequency = vcp[i]->getFrequency(); + para.dtv_para.fe_paras[i].atsc.para.u.vsb.modulation = (fe_modulation_t)(vcp[i]->getModulation()); + } + //allband + para.dtv_para.fe_cnt = size; + + memset(&dmx_para, 0, sizeof(dmx_para)); + AM_DMX_Open(para.dtv_para.dmx_dev_id, &dmx_para); + + if ((para.dtv_para.mode & 0x07) != AM_SCAN_DTVMODE_NONE) { + AM_FEND_SetMode(para.fend_dev_id, para.dtv_para.source); + tv_scan_reconnect_dmx_to_fend(para.dtv_para.dmx_dev_id, para.fend_dev_id); + } + + // prog->dmx_id = para.dtv_para.dmx_dev_id; + // prog->fend_id = para.fend_dev_id; + // prog->mode = para.dtv_para.mode; + // Start Scan + if (AM_SCAN_Create(¶, &handle) != AM_SUCCESS) { + LOGD("SCAN CREATE fail"); + handle = 0; + } else { + mScanHandle = handle; + AM_SCAN_SetUserData(handle, (void *)this); + //注册搜索事件 + AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); + AM_EVT_Subscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); + //注册信号质量通知事件 + AM_EVT_Subscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); + if (AM_SCAN_Start(handle) != AM_SUCCESS) { + AM_SCAN_Destroy(handle, AM_FALSE); + AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); + AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); + handle = 0; + } + } + if (para.atv_para.fe_paras != NULL) + free(para.atv_para.fe_paras); + if (para.dtv_para.fe_paras != NULL) + free(para.dtv_para.fe_paras); + + if (handle == 0) { + return -1; + } + mbScanStart = true;//start call ok + } else { + LOGD("scanning and not stop"); + } + return 0; +} + + +int CTvScanner::stopScan() +{ + LOGD("StopScan mScanHandle=%d", mScanHandle); + //requestExit(); + if (mbScanStart) { //if start ok and not stop + int ret = AM_SCAN_Destroy(mScanHandle, AM_TRUE); + AM_EVT_Unsubscribe(mScanHandle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); + AM_EVT_Unsubscribe(mScanHandle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); + AM_SEC_Cache_Reset(0); + //stop loop + LOGD("StopScan , ret=%d", ret); + mbScanStart = false;//stop ok + } else { + LOGD("not start scan or scan stoped"); + } + return 0; +} + +void CTvScanner::tv_scan_evt_callback(int dev_no, int event_type, void *param, void *data) +{ + CTvScanner *pT = NULL; + long long tmpFreq = 0; + AM_SCAN_GetUserData(dev_no, (void **)&pT); + if (pT == NULL) { + return; + } + memset(pT->mCurEv.mProgramName, '\0', sizeof(pT->mCurEv.mProgramName)); + memset(pT->mCurEv.mMSG, '\0', sizeof(pT->mCurEv.mMSG)); + if (event_type == AM_SCAN_EVT_PROGRESS) { + AM_SCAN_Progress_t *evt = (AM_SCAN_Progress_t *)param; + switch (evt->evt) { + case AM_SCAN_PROGRESS_SCAN_BEGIN: + pT->mCurEv.mPercent = 0; + break; + case AM_SCAN_PROGRESS_NIT_BEGIN: + + break; + case AM_SCAN_PROGRESS_NIT_END: + + break; + case AM_SCAN_PROGRESS_TS_BEGIN: { + AM_SCAN_TSProgress_t *tp = (AM_SCAN_TSProgress_t *)evt->data; + if (tp == NULL) + break; + pT->mCurEv.mChannelNumber = tp->index; + pT->mCurEv.mMode = tp->fend_para.m_type; + pT->mCurEv.mFrequency = ((struct dvb_frontend_parameters *)(&tp->fend_para))->frequency; + pT->mCurEv.mSymbolRate = tp->fend_para.cable.para.u.qam.symbol_rate; + pT->mCurEv.mModulation = tp->fend_para.cable.para.u.qam.modulation; + pT->mCurEv.mBandwidth = tp->fend_para.terrestrial.para.u.ofdm.bandwidth; + pT->mCurEv.mOfdm_mode = tp->fend_para.terrestrial.para.u.ofdm.ofdm_mode; + pT->mCurEv.mAudio = tp->fend_para.analog.para.u.analog.audmode; + pT->mCurEv.mStandard = tp->fend_para.analog.para.u.analog.std; + pT->mCurEv.mSat_polarisation = tp->fend_para.sat.polarisation; + if (pT->mCurEv.mMode == FE_ANALOG) { + if (pT->mSource == FE_ATSC) { + pT->mCurEv.mPercent = (tp->index * 100) / tp->total; + } else { + pT->mCurEv.mPercent = 0; + } + } else { + pT->mCurEv.mPercent = (tp->index * 100) / tp->total; + } + + if (pT->mCurEv.mTotalChannelCount == 0) + pT->mCurEv.mTotalChannelCount = tp->total; + if (pT->mCurEv.mPercent >= 100) + pT->mCurEv.mPercent = 99; + + pT->mCurEv.mLockedStatus = 0; + pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS; + + pT->mpObserver->onEvent(pT->mCurEv); + } + break; + case AM_SCAN_PROGRESS_TS_END: { + /*pT->mCurEv.mLockedStatus = 0; + pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS; + pT->mpObserver->onEvent(pT->mCurEv);*/ + } + break; + + case AM_SCAN_PROGRESS_PAT_DONE: /*{ + if (pT->mCurEv.mTotalChannelCount == 1) { + pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS; + pT->mpObserver->onEvent(pT->mCurEv); + } + }*/ + break; + case AM_SCAN_PROGRESS_SDT_DONE: /*{ + dvbpsi_sdt_t *sdts = (dvbpsi_sdt_t *)evt->data; + dvbpsi_sdt_t *sdt; + + if (pT->mCurEv.mTotalChannelCount == 1) { + pT->mCurEv.mPercent += 25; + if (pT->mCurEv.mPercent >= 100) + pT->mCurEv.mPercent = 99; + pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS; + + pT->mpObserver->onEvent(pT->mCurEv); + } + }*/ + break; + case AM_SCAN_PROGRESS_CAT_DONE: /*{ + dvbpsi_cat_t *cat = (dvbpsi_cat_t *)evt->data; + if (pT->mCurEv.mTotalChannelCount == 1) { + pT->mCurEv.mPercent += 25; + if (pT->mCurEv.mPercent >= 100) + pT->mCurEv.mPercent = 99; + + pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS; + + pT->mpObserver->onEvent(pT->mCurEv); + } + }*/ + break; + case AM_SCAN_PROGRESS_PMT_DONE: /*{ + dvbpsi_pmt_t *pmt = (dvbpsi_pmt_t *)evt->data; + if (pT->mCurEv.mTotalChannelCount == 1) { + pT->mCurEv.mPercent += 25; + if (pT->mCurEv.mPercent >= 100) + pT->mCurEv.mPercent = 99; + + pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS; + pT->mpObserver->onEvent(pT->mCurEv); + } + }*/ + break; + case AM_SCAN_PROGRESS_MGT_DONE: { + mgt_section_info_t *mgt = (mgt_section_info_t *)evt->data; + + if (pT->mCurEv.mTotalChannelCount == 1) { + pT->mCurEv.mPercent += 10; + if (pT->mCurEv.mPercent >= 100) + pT->mCurEv.mPercent = 99; + + pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS; + + pT->mpObserver->onEvent(pT->mCurEv); + } + } + break; + case AM_SCAN_PROGRESS_VCT_DONE: { + /*ATSC TVCT*/ + if (pT->mCurEv.mTotalChannelCount == 1) { + pT->mCurEv.mPercent += 30; + if (pT->mCurEv.mPercent >= 100) + pT->mCurEv.mPercent = 99; + pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS; + + pT->mpObserver->onEvent(pT->mCurEv); + } + } + break; + case AM_SCAN_PROGRESS_NEW_PROGRAM: { + /* Notify the new searched programs */ + AM_SCAN_ProgramProgress_t *pp = (AM_SCAN_ProgramProgress_t *)evt->data; + if (pp != NULL) { + pT->mCurEv.mprogramType = pp->service_type; + snprintf(pT->mCurEv.mProgramName, sizeof(pT->mCurEv.mProgramName), "%s", pp->name); + + pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS; + + pT->mpObserver->onEvent(pT->mCurEv); + } + } + break; + case AM_SCAN_PROGRESS_BLIND_SCAN: { + AM_SCAN_DTVBlindScanProgress_t *bs_prog = (AM_SCAN_DTVBlindScanProgress_t *)evt->data; + + if (bs_prog) { + pT->mCurEv.mPercent = bs_prog->progress; + + snprintf(pT->mCurEv.mMSG, sizeof(pT->mCurEv.mMSG), "%s/%s %dMHz", + bs_prog->polar == AM_FEND_POLARISATION_H ? "H" : "V", + bs_prog->lo == AM_FEND_LOCALOSCILLATORFREQ_L ? "L-LOF" : "H-LOF", + bs_prog->freq / 1000); + + pT->mCurEv.mType = ScannerEvent::EVENT_BLINDSCAN_PROGRESS; + + pT->mpObserver->onEvent(pT->mCurEv); + + if (bs_prog->new_tp_cnt > 0) { + int i = 0; + for (i = 0; i < bs_prog->new_tp_cnt; i++) { + LOGD("====New tp: %dkS/s %d====", bs_prog->new_tps[i].frequency, + bs_prog->new_tps[i].u.qpsk.symbol_rate); + + pT->mCurEv.mFrequency = bs_prog->new_tps[i].frequency; + pT->mCurEv.mSymbolRate = bs_prog->new_tps[i].u.qpsk.symbol_rate; + pT->mCurEv.mSat_polarisation = bs_prog->polar; + + pT->mCurEv.mType = ScannerEvent::EVENT_BLINDSCAN_NEWCHANNEL; + + pT->mpObserver->onEvent(pT->mCurEv); + } + } + if (bs_prog->progress >= 100) { + + pT->mCurEv.mType = ScannerEvent::EVENT_BLINDSCAN_END; + + pT->mpObserver->onEvent(pT->mCurEv); + + pT->mCurEv.mPercent = 0; + } + } + } + break; + case AM_SCAN_PROGRESS_STORE_BEGIN: { + pT->mCurEv.mType = ScannerEvent::EVENT_STORE_BEGIN; + pT->mCurEv.mLockedStatus = 0; + if (pT->mpObserver != NULL) + pT->mpObserver->onEvent(pT->mCurEv); + } + break; + case AM_SCAN_PROGRESS_STORE_END: { + pT->mCurEv.mLockedStatus = 0; + pT->mCurEv.mType = ScannerEvent::EVENT_STORE_END; + pT->mpObserver->onEvent(pT->mCurEv); + } + break; + case AM_SCAN_PROGRESS_SCAN_END: { + pT->mCurEv.mPercent = 100; + pT->mCurEv.mLockedStatus = 0; + pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_END; + pT->mpObserver->onEvent(pT->mCurEv); + } + break; + case AM_SCAN_PROGRESS_ATV_TUNING: { + pT->mCurEv.mFrequency = (int)evt->data; + pT->mCurEv.mLockedStatus = 0; + tmpFreq = (pT->mCurEv.mFrequency - pT->mCurScanStartFreq) / 1000000; + pT->mCurEv.mPercent = tmpFreq * 100UL / ((pT->mCurScanEndFreq - pT->mCurScanStartFreq) / 1000000); + pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS; + pT->mpObserver->onEvent(pT->mCurEv); + } + break; + + default: + break; + } + } else if (event_type == AM_SCAN_EVT_SIGNAL) { + AM_SCAN_DTVSignalInfo_t *evt = (AM_SCAN_DTVSignalInfo_t *)param; + pT->mCurEv.mprogramType = 0xff; + pT->mCurEv.mFrequency = (int)evt->frequency; + pT->mCurEv.mLockedStatus = (evt->locked ? 1 : 0); + + pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS; + if (pT->mCurEv.mMode != FE_ANALOG && evt->locked) { + pT->mCurEv.mStrength = evt->strength; + pT->mCurEv.mSnr = evt->snr; + } else { + pT->mCurEv.mStrength = 0; + pT->mCurEv.mSnr = 0; + } + + if (pT->mCurEv.mMode == FE_ANALOG) + pT->mpObserver->onEvent(pT->mCurEv); + } +} + +void CTvScanner::tv_scan_reconnect_dmx_to_fend(int dmx_no, int fend_no) +{ + AM_DMX_Source_t src; + + if (AM_FEND_GetTSSource(fend_no, &src) == AM_SUCCESS) { + LOGD("Set demux%d source to %d", dmx_no, src); + AM_DMX_SetSource(dmx_no, src); + } else { + LOGD("Cannot get frontend ts source!!"); + } +} + +int CTvScanner::getAtscChannelPara(int attennaType, Vector<sp<CTvChannel> > &vcp) +{ + switch (attennaType) { //region name should be remove to config file and read here + case 1: + CTvRegion::getChannelListByName("U.S.,ATSC Air", vcp); + break; + case 2: + CTvRegion::getChannelListByName("U.S.,ATSC Cable Standard", vcp); + break; + case 3: + CTvRegion::getChannelListByName("U.S.,ATSC Cable IRC", vcp); + break; + case 4: + CTvRegion::getChannelListByName("U.S.,ATSC Cable HRC", vcp); + break; + default: + return -1; + } + + return 0; +} + diff --git a/tvapi/libtv/tv/CTvScanner.h b/tvapi/libtv/tv/CTvScanner.h new file mode 100644 index 0000000..c743fae --- a/dev/null +++ b/tvapi/libtv/tv/CTvScanner.h @@ -0,0 +1,183 @@ +// +// +// amlogic 2013 +// +// @ Project : tv +// @ File Name : +// @ Date : 2013-11 +// @ Author : +// +// +#include <am_scan.h> +#include <am_epg.h> +#include <am_mem.h> +#include "CTvChannel.h" +#include "CTvLog.h" +#include "CTvEv.h" +#include "tvin/CTvin.h" + +#if !defined(_CTVSCANNER_H) +#define _CTVSCANNER_H +class CTvScanner +{ +public: + /** ATSC Attenna type */ + static const int AM_ATSC_ATTENNA_TYPE_AIR = 1; + static const int AM_ATSC_ATTENNA_TYPE_CABLE_STD = 2; + static const int AM_ATSC_ATTENNA_TYPE_CABLE_IRC = 3; + static const int AM_ATSC_ATTENNA_TYPE_CABLE_HRC = 4; + CTvScanner(CTvin *pTvin); + ~CTvScanner(); + int startScan(); + int stopScan(); + int ATVManualScan(int min_freq, int max_freq, int std, int store_Type = 0, int channel_num = 0); + int autoAtvScan(int min_freq, int max_freq, int std, int search_type); + int autoDtmbScan(); + int manualDtmbScan(int beginFreq, int endFreq, int modulation = -1); + int autoAtscScan(int attennaType, int std); + int manualDtmbScan(int freq); + int manualAtscScan(int freq, int attennaType, int std); + int autoTvScan(); + int unsubscribeEvent(); + + class ScannerEvent: public CTvEv + { + public: + static const int EVENT_SCAN_PROGRESS = 0; + static const int EVENT_STORE_BEGIN = 1; + static const int EVENT_STORE_END = 2; + static const int EVENT_SCAN_END = 3; + static const int EVENT_BLINDSCAN_PROGRESS = 4; + static const int EVENT_BLINDSCAN_NEWCHANNEL = 5; + static const int EVENT_BLINDSCAN_END = 6; + + ScannerEvent(): CTvEv(CTvEv::TV_EVENT_SCANNER) + { + } + ~ScannerEvent() + { + } + int mType; + int mPercent; + int mTotalChannelCount; + int mLockedStatus; + int mChannelNumber; + //CTvChannel mChannel; + int mMode; + int mFrequency; + int mSymbolRate; + int mModulation; + int mBandwidth; + int mOfdm_mode; + int mAudio; + int mStandard; + int mSat_polarisation; + // + int mStrength; + int mSnr; + char mProgramName[1024]; + int mprogramType; + char mMSG[128]; + + // ScannerEvent(int type){ + // this->mType = type; + // } + }; + + class IObserver + { + public: + IObserver() {}; + virtual ~IObserver() {}; + virtual void onEvent(const ScannerEvent &ev) = 0; + }; + //1 VS n + //int addObserver(IObserver* ob); + //int removeObserver(IObserver* ob); + + //1 VS 1 + int setObserver(IObserver *ob) + { + mpObserver = ob; + return 0; + } +private: + static AM_Bool_t s_atv_cvbs_lock_check(void *); + AM_Bool_t atv_cvbs_lock_check(v4l2_std_id *colorStd); + static void tv_scan_evt_callback(int dev_no, int event_type, void *param, void *data); + void tv_scan_reconnect_dmx_to_fend(int dmx_no, int fend_no); + int getAtscChannelPara(int attennaType, Vector<sp<CTvChannel> > &vcp); + // + int mScanHandle; + volatile bool mbScanStart; + + //scan para info + /** General TV Scan Mode */ + static const int TV_MODE_ATV = 0; // Only search ATV + static const int TV_MODE_DTV = 1; // Only search DTV + static const int TV_MODE_ADTV = 2; // A/DTV will share a same frequency list, like ATSC + /** DTV scan mode */ + static const int DTV_MODE_AUTO = 1; + static const int DTV_MODE_MANUAL = 2; + static const int DTV_MODE_ALLBAND = 3; + static const int DTV_MODE_BLIND = 4; + + /** DTV scan options, DONOT channge */ + static const int DTV_OPTION_UNICABLE = 0x10; //Satellite unicable mode + static const int DTV_OPTION_FTA = 0x20; //Only store free programs + static const int DTV_OPTION_NO_TV = 0x40; //Only store tv programs + static const int DTV_OPTION_NO_RADIO = 0x80; //Only store radio programs + + /** ATV scan mode */ + static const int ATV_MODE_AUTO = 1; + static const int ATV_MODE_MANUAL = 2; + + // +private: + + // + IObserver *mpObserver; + // + CTvin *mpTvin; + int mMode; + int mFendID; + /** DTV parameters */ + int mTvMode; + int mTvOptions; + int mSat_id; + int mSource; + //showboz + //TVSatelliteParams tv_satparams; + int mTsSourceID; + CTvChannel mStartChannel; + Vector<CTvChannel> mvChooseListChannels; + /** ATV parameters */ + int mAtvMode; + int mStartFreq; + int mDirection; + int mChannelID; + + + + //extern for scanner + //int channelID; //can be used for manual scan + /** Atv set */ + int mMinFreq; + int mMaxFreq; + long long mCurScanStartFreq; + long long mCurScanEndFreq; + int tunerStd; + /** Tv set */ + int demuxID;//default 0 + String8 defaultTextLang; + String8 orderedTextLangs; + //showboz + //Vector<CTvChannel> ChannelList;//VS mvChooseListChannels + + /** Dtv-Sx set Unicable settings*/ + int user_band; + int ub_freq;//!< kHz + + ScannerEvent mCurEv; +}; +#endif //CTVSCANNER_H diff --git a/tvapi/libtv/tv/CTvScreenCapture.cpp b/tvapi/libtv/tv/CTvScreenCapture.cpp new file mode 100644 index 0000000..76eed99 --- a/dev/null +++ b/tvapi/libtv/tv/CTvScreenCapture.cpp @@ -0,0 +1,530 @@ + +#include <stdlib.h> +#include <fcntl.h> +#include <strings.h> +#include <sys/ioctl.h> +#include <asm/types.h> +#include <fcntl.h> +#include <unistd.h> +#include <errno.h> +#include <malloc.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <time.h> +#include <sys/mman.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <assert.h> +#include <linux/videodev2.h> +#include <dirent.h> + +#include <binder/MemoryHeapBase.h> +#include <binder/MemoryBase.h> + +using namespace android; + + +#include "CTvScreenCapture.h" + +#define CLEAR(x) memset (&(x), 0, sizeof (x)) + +int CTvScreenCapture::xioctl(int fd, int request, void *arg) +{ + int r = 0; + + do { + r = ioctl(fd, request, arg); + } while (-1 == r && EINTR == errno); + + return r; +} + +int CTvScreenCapture::OpenCamera(struct camera *pCameraDev) +{ + int iOutRet = 0, iRet; + struct stat st; + + do { + if (-1 == stat(pCameraDev->device_name, &st)) { + LOGD( "Cannot identify '%s'\n", pCameraDev->device_name); + iOutRet = FAILED; + break; + } + + if (!S_ISCHR(st.st_mode)) { + LOGD("%s is no device\n", pCameraDev->device_name); + iOutRet = FAILED; + break; + } + + pCameraDev->fd = open(pCameraDev->device_name, O_RDWR | O_NONBLOCK, 0); // O_NONBLOCK + if (SUCCEED > pCameraDev->fd) { + LOGD("Cannot open '%s'\n", pCameraDev->device_name); + iOutRet = FAILED; + break; + } + } while (FALSE); + + return iOutRet; +} + + +int CTvScreenCapture::InitVCap(sp<IMemory> Mem) +{ + int iOutRet = FAILED; + + do { + m_pMem = Mem; + m_pData = (char *)m_pMem->pointer(); + LOGD("VVVVVVVVVVVVVVVVVVVVVVVVVVVVV %p\n", m_pData); + //default + m_capV4l2Cam.device_name = "/dev/video11"; + m_capV4l2Cam.buffers = NULL; + m_capV4l2Cam.width = 640; + m_capV4l2Cam.height = 480; + m_capV4l2Cam.display_depth = 16; //5; /* RGB24 */ + m_capV4l2Cam.frame_number = 25; //fps + iOutRet = OpenCamera(&m_capV4l2Cam) ; + if (SUCCEED != iOutRet) { + LOGD("ERROR:::Open Camera device failed\n"); + break; + } + } while (FALSE); + + return iOutRet; +} + +int CTvScreenCapture::InitMmap(struct camera *cam) +{ + int iOutRet = SUCCEED, iRet; + struct v4l2_requestbuffers req; + + do { + CLEAR(req); + + req.count = 4; + req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + req.memory = V4L2_MEMORY_MMAP; + + iRet = xioctl(cam->fd, VIDIOC_REQBUFS, &req); + if (FAILED == iRet) { + if (EINVAL == errno) { + LOGD("VIDIOC_REQBUFS %s does not support memory mapping\n", cam->device_name); + } + iOutRet = iRet; + break; + } + + if (req.count < 2) { + LOGD("Insufficient buffer memory on %s\n", cam->device_name); + iOutRet = FAILED; + break; + } + + cam->buffers = (struct buffer *)calloc(req.count, sizeof(*(cam->buffers))); + if (!cam->buffers) { + LOGD("Out of memory\n"); + iOutRet = FAILED; + break; + } + + for (m_capNumBuffers = 0; m_capNumBuffers < req.count; ++m_capNumBuffers) { + struct v4l2_buffer buf; + + CLEAR(buf); + + buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + buf.memory = V4L2_MEMORY_MMAP; + buf.index = m_capNumBuffers; + + if (FAILED == xioctl(cam->fd, VIDIOC_QUERYBUF, &buf)) { + LOGD("VIDIOC_QUERYBUF ERROR\n"); + iOutRet = FAILED; + goto IS_ERROR; + } + + cam->buffers[m_capNumBuffers].length = buf.length; + cam->buffers[m_capNumBuffers].start = mmap(NULL /* start anywhere */, + buf.length, PROT_READ | PROT_WRITE /* required */, + MAP_SHARED /* recommended */, cam->fd, buf.m.offset); + + if (MAP_FAILED == cam->buffers[m_capNumBuffers].start) { + iOutRet = FAILED; + break; + } + + + } + + LOGD("END m_capNumBuffers : %d\n", m_capNumBuffers); + } while (FALSE); +IS_ERROR: + return iOutRet; +} + +int CTvScreenCapture::InitCamera(struct camera *cam) +{ + int iOutRet = SUCCEED, iRet; + struct v4l2_capability *cap = &(cam->v4l2_cap); + struct v4l2_cropcap *cropcap = &(cam->v4l2_cropcap); + struct v4l2_crop *crop = &(cam->crop); + struct v4l2_format *fmt = &(cam->v4l2_fmt); + unsigned int min; + + do { + iRet = xioctl(cam->fd, VIDIOC_QUERYCAP, cap); + if (FAILED == iRet) { + if (EINVAL == errno) { + LOGD("%s is no V4L2 device\n", cam->device_name); + } + iOutRet = iRet; + break; + } + + if (!(cap->capabilities & V4L2_CAP_VIDEO_CAPTURE)) { + LOGD("%s is no video capture device\n", cam->device_name); + iOutRet = FAILED; + break; + } + + if (!(cap->capabilities & V4L2_CAP_STREAMING)) { + LOGD("%s does not support streaming i/o\n", cam->device_name); + iOutRet = FAILED; + break; + } + + LOGD("VIDOOC_QUERYCAP camera driver is [%s] card is [%s] businfo is [%s] version is [%d]\n", cap->driver, + cap->card, cap->bus_info, cap->version); + + /* Select video input, video standard and tune here. */ + + CLEAR(*cropcap); + cropcap->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + + crop->c.width = cam->width; + crop->c.height = cam->height; + crop->c.left = 0; + crop->c.top = 0; + crop->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + + CLEAR(*fmt); + fmt->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + fmt->fmt.pix.width = cam->width; + fmt->fmt.pix.height = cam->height; + fmt->fmt.pix.pixelformat = V4L2_PIX_FMT_NV21; + fmt->fmt.pix.field = V4L2_FIELD_INTERLACED; + iRet = xioctl(cam->fd, VIDIOC_S_FMT, fmt); + if (FAILED == iRet) { + iOutRet = iRet; + LOGD("VIDIOC_S_FMT is ERROR\n"); + break; + } + + /* Note VIDIOC_S_FMT may change width and height. */ + /* Buggy driver paranoia. */ + min = fmt->fmt.pix.width * 2; + if (fmt->fmt.pix.bytesperline < min) { + fmt->fmt.pix.bytesperline = min; + } + + min = fmt->fmt.pix.bytesperline * fmt->fmt.pix.height; + if (fmt->fmt.pix.sizeimage < min) { + fmt->fmt.pix.sizeimage = min; + } + + iRet = InitMmap(cam); + if (FAILED == iRet) { + LOGD("INIT MMAP FAILED\n"); + iOutRet = iRet; + break; + } + + } while (FALSE); + + return iOutRet; + +} + + +int CTvScreenCapture::SetVideoParameter(int width, int height, int frame) +{ + int iOutRet = SUCCEED, iRet; + + do { + m_capV4l2Cam.width = width; + m_capV4l2Cam.height = height; + m_capV4l2Cam.frame_number = frame; + + iRet = InitCamera(&m_capV4l2Cam); + if (SUCCEED != iRet) { + iOutRet = iRet; + break; + } + + } while (FALSE); + + return iOutRet ; +} + +int CTvScreenCapture::StartCapturing(struct camera *cam) +{ + unsigned int i; + int iOutRet = SUCCEED, iRet; + enum v4l2_buf_type type; + + do { + for (i = 0; i < m_capNumBuffers; ++i) { + struct v4l2_buffer buf; + + //CLEAR(buf); + + buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + buf.memory = V4L2_MEMORY_MMAP; + buf.index = i; + + iRet = xioctl(cam->fd, VIDIOC_QBUF, &buf); + if (FAILED == iRet) { + iOutRet = iRet; + goto IS_ERROR; + } + } + + + type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + iRet = xioctl(cam->fd, VIDIOC_STREAMON, &type); + if (FAILED == iRet) { + iOutRet = iRet; + break; + } + } while (FALSE); +IS_ERROR: + + return iOutRet; +} + +int CTvScreenCapture::VideoStart() +{ + int iOutRet = SUCCEED, iRet; + + do { + iRet = StartCapturing(&m_capV4l2Cam); + if (FAILED == iRet) { + iOutRet = iRet; + break; + } + + } while (FALSE); + + return iOutRet; +} + +void CTvScreenCapture::yuv_to_rgb32(unsigned char y, unsigned char u, unsigned char v, unsigned char *rgb) +{ + register int r, g, b; + int rgb24; + + r = (1192 * (y - 16) + 1634 * (v - 128) ) >> 10; + g = (1192 * (y - 16) - 833 * (v - 128) - 400 * (u - 128) ) >> 10; + b = (1192 * (y - 16) + 2066 * (u - 128) ) >> 10; + + r = r > 255 ? 255 : r < 0 ? 0 : r; + g = g > 255 ? 255 : g < 0 ? 0 : g; + b = b > 255 ? 255 : b < 0 ? 0 : b; + + rgb24 = (int)((r << 16) | (g << 8) | b); + + /*ARGB*/ + *rgb = (unsigned char)r; + rgb ++; + *rgb = (unsigned char)g; + rgb++; + *rgb = (unsigned char)b; + rgb++; + *rgb = 0xff; +} + + +void CTvScreenCapture::nv21_to_rgb32(unsigned char *buf, unsigned char *rgb, int width, int height, int *len) +{ + int x, y, z = 0; + int h, w; + int blocks; + unsigned char Y1, Y2, U, V; + + *len = 0; + + blocks = (width * height) * 2; + + for (h = 0, z = 0; h < height; h += 2) { + for (y = 0; y < width * 2; y += 2) { + + Y1 = buf[ h * width + y + 0]; + V = buf[ blocks / 2 + h * width / 2 + y % width + 0 ]; + Y2 = buf[ h * width + y + 1]; + U = buf[ blocks / 2 + h * width / 2 + y % width + 1 ]; + + yuv_to_rgb32(Y1, U, V, &rgb[z]); + yuv_to_rgb32(Y2, U, V, &rgb[z + 4]); + z += 8; + } + } + *len = z; + LOGD("z +++++++++++++++++++++++++++++++++ z %d\n", z); +} + + +int CTvScreenCapture::GetVideoData(int *length) +{ + int iOutRet = SUCCEED, iRet; + + *length = 0; + while (true) { + fd_set fds; + struct timeval tv; + FD_ZERO(&fds); + FD_SET(m_capV4l2Cam.fd, &fds); + /* Timeout. */ + tv.tv_sec = 0; + tv.tv_usec = 30000; + iRet = select(m_capV4l2Cam.fd + 1, &fds, NULL, NULL, &tv); + if (FAILED == iRet) { + LOGD("select FAILED\n"); + if (EINTR == errno) { + LOGD("select FAILED Continue\n"); + continue; + } + + } + + if (0 == iRet) { + LOGD("select timeout\n"); + continue ; + } + + struct v4l2_buffer buf; + CLEAR(buf); + + buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + buf.memory = V4L2_MEMORY_MMAP; + iRet = xioctl(m_capV4l2Cam.fd, VIDIOC_DQBUF, &buf); + if (FAILED == iRet) { + if (errno == EAGAIN) { + LOGD("GetVideoData EAGAIN \n"); + } + + continue; + } + + LOGD("DDDDDDDDDDAAAAAAAAAAAAAAAAAAAATTTTTTTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAAAAAAA %d %d\n", buf.length, iRet); + int tmpLen = 0; + nv21_to_rgb32((unsigned char *)m_capV4l2Cam.buffers[buf.index].start, (unsigned char *)m_pData, m_capV4l2Cam.width, m_capV4l2Cam.height, &tmpLen); + //memcpy(m_pData,m_capV4l2Cam.buffers[buf.index].start, buf.length +1); + *length = buf.length; + break; + + } + + if (*length > 0) { + mCapEvt.mFrameWide = m_capV4l2Cam.width; + mCapEvt.mFrameHeight = m_capV4l2Cam.height; + mCapEvt.mFrameNum = 1; + mCapEvt.mFrameSize = *length; + } else { + mCapEvt.mFrameWide = 0; + mCapEvt.mFrameHeight = 0; + mCapEvt.mFrameNum = 0; + mCapEvt.mFrameSize = 0; + } + + if (NULL != mpObserver) { + mpObserver->onTvEvent(mCapEvt); + } + + return iOutRet; +} + +int CTvScreenCapture::StopCapturing(struct camera *cam) +{ + int iOutRet = SUCCEED, iRet; + enum v4l2_buf_type type; + + do { + type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + + iRet = xioctl(cam->fd, VIDIOC_STREAMOFF, &type); + if (FAILED == iRet) { + iOutRet = iRet; + break; + } + } while (FALSE); + + return iOutRet; +} + +int CTvScreenCapture::VideoStop() +{ + StopCapturing(&m_capV4l2Cam); + return SUCCEED; +} + +int CTvScreenCapture::UninitCamera(struct camera *cam) +{ + unsigned int i; + + for (i = 0; i < m_capNumBuffers; ++i) { + if (cam->buffers[i].start == NULL) { + break; + } + + if (FAILED == munmap(cam->buffers[i].start, cam->buffers[i].length)) { + LOGD("ERROR::munmap cam buffer failed\n"); + break; + } + } + + if (NULL != cam->buffers) + free(cam->buffers); + + cam->buffers = NULL; + + return SUCCEED; +} + +int CTvScreenCapture::CloseCamera(struct camera *cam) +{ + int iOutRet = SUCCEED, iRet; + + do { + iRet = close(cam->fd); + if (FAILED == iRet) { + iOutRet = iRet; + break; + } + + cam->fd = -1; + } while (FALSE); + + return iOutRet; +} + +int CTvScreenCapture::DeinitVideoCap() +{ + UninitCamera(&m_capV4l2Cam); + CloseCamera(&m_capV4l2Cam); + return SUCCEED ; +} + + +CTvScreenCapture::CTvScreenCapture() +{ + m_capNumBuffers = 0; + memset(&m_capV4l2Cam, 0x00, sizeof(camera)); + mpObserver = NULL; +} +CTvScreenCapture::~CTvScreenCapture() +{ + memset(&m_capV4l2Cam, 0x00, sizeof(camera)); + m_pData = NULL; +} + diff --git a/tvapi/libtv/tv/CTvScreenCapture.h b/tvapi/libtv/tv/CTvScreenCapture.h new file mode 100644 index 0000000..90fa7e4 --- a/dev/null +++ b/tvapi/libtv/tv/CTvScreenCapture.h @@ -0,0 +1,177 @@ +#ifndef CTVSCREENCAPTURE_H__ +#define CTVSCREENCAPTURE_H__ + +#define VIDEOCAPDEV "/dev/amvideocap0" + +#define AMVIDEOCAP_IOC_MAGIC 'V' +#include <linux/videodev2.h> +#include <binder/MemoryHeapBase.h> +#include <binder/MemoryBase.h> +#include "CTvLog.h" +#include "CTvEv.h" + +#define CAP_FLAG_AT_CURRENT 0 +#define CAP_FLAG_AT_TIME_WINDOW 1 +#define CAP_FLAG_AT_END 2 + + +#define FALSE 0 +#define SUCCEED 0 +#define FAILED -1 + +using namespace android; + +struct buffer { + void *start; + size_t length; +}; + + +struct camera { + char *device_name; + int fd; + int width; + int height; + int display_depth; + int image_size; + int frame_number; //fps + int bitrate ; // bitrate + struct v4l2_capability v4l2_cap; + struct v4l2_cropcap v4l2_cropcap; + struct v4l2_format v4l2_fmt; + struct v4l2_crop crop; + struct buffer *buffers; +}; + +/* +format see linux/ge2d/ge2d.h +like: +GE2D_FORMAT_S24_RGB +*/ +#define ENDIAN_SHIFT 24 +#define LITTLE_ENDIAN (1 << ENDIAN_SHIFT) +#define FMT_S24_RGB (LITTLE_ENDIAN|0x00200) /* 10_00_0_00_0_00 */ +#define FMT_S16_RGB (LITTLE_ENDIAN|0x00100) /* 01_00_0_00_0_00 */ +#define FMT_S32_RGBA (LITTLE_ENDIAN|0x00300) /* 11_00_0_00_0_00 */ + +#define COLOR_MAP_SHIFT 20 +#define COLOR_MAP_MASK (0xf << COLOR_MAP_SHIFT) +/* 16 bit */ +#define COLOR_MAP_RGB565 (5 << COLOR_MAP_SHIFT) +/* 24 bit */ +#define COLOR_MAP_RGB888 (0 << COLOR_MAP_SHIFT) +#define COLOR_MAP_BGR888 (5 << COLOR_MAP_SHIFT) +/* 32 bit */ +#define COLOR_MAP_RGBA8888 (0 << COLOR_MAP_SHIFT) +#define COLOR_MAP_ARGB8888 (1 << COLOR_MAP_SHIFT) +#define COLOR_MAP_ABGR8888 (2 << COLOR_MAP_SHIFT) +#define COLOR_MAP_BGRA8888 (3 << COLOR_MAP_SHIFT) + +/*16 bit*/ +#define FORMAT_S16_RGB_565 (FMT_S16_RGB | COLOR_MAP_RGB565) +/*24 bit*/ +#define FORMAT_S24_BGR (FMT_S24_RGB | COLOR_MAP_BGR888) +#define FORMAT_S24_RGB (FMT_S24_RGB | COLOR_MAP_RGB888) +/*32 bit*/ +#define FORMAT_S32_ARGB (FMT_S32_RGBA | COLOR_MAP_ARGB8888) +#define FORMAT_S32_ABGR (FMT_S32_RGBA | COLOR_MAP_ABGR8888) +#define FORMAT_S32_BGRA (FMT_S32_RGBA | COLOR_MAP_BGRA8888) +#define FORMAT_S32_RGBA (FMT_S32_RGBA | COLOR_MAP_RGBA8888) + +#define AMVIDEOCAP_IOW_SET_WANTFRAME_FORMAT _IOW(AMVIDEOCAP_IOC_MAGIC, 0x01, int) +#define AMVIDEOCAP_IOW_SET_WANTFRAME_WIDTH _IOW(AMVIDEOCAP_IOC_MAGIC, 0x02, int) +#define AMVIDEOCAP_IOW_SET_WANTFRAME_HEIGHT _IOW(AMVIDEOCAP_IOC_MAGIC, 0x03, int) +#define AMVIDEOCAP_IOW_SET_WANTFRAME_TIMESTAMP_MS _IOW(AMVIDEOCAP_IOC_MAGIC, 0x04, u64) +#define AMVIDEOCAP_IOW_SET_WANTFRAME_WAIT_MAX_MS _IOW(AMVIDEOCAP_IOC_MAGIC, 0x05, u64) +#define AMVIDEOCAP_IOW_SET_WANTFRAME_AT_FLAGS _IOW(AMVIDEOCAP_IOC_MAGIC, 0x06, int) + + +#define AMVIDEOCAP_IOR_GET_FRAME_FORMAT _IOR(AMVIDEOCAP_IOC_MAGIC, 0x10, int) +#define AMVIDEOCAP_IOR_GET_FRAME_WIDTH _IOR(AMVIDEOCAP_IOC_MAGIC, 0x11, int) +#define AMVIDEOCAP_IOR_GET_FRAME_HEIGHT _IOR(AMVIDEOCAP_IOC_MAGIC, 0x12, int) +#define AMVIDEOCAP_IOR_GET_FRAME_TIMESTAMP_MS _IOR(AMVIDEOCAP_IOC_MAGIC, 0x13, int) + + +#define AMVIDEOCAP_IOR_GET_SRCFRAME_FORMAT _IOR(AMVIDEOCAP_IOC_MAGIC, 0x20, int) +#define AMVIDEOCAP_IOR_GET_SRCFRAME_WIDTH _IOR(AMVIDEOCAP_IOC_MAGIC, 0x21, int) +#define AMVIDEOCAP_IOR_GET_SRCFRAME_HEIGHT _IOR(AMVIDEOCAP_IOC_MAGIC, 0x22, int) + + +#define AMVIDEOCAP_IOR_GET_STATE _IOR(AMVIDEOCAP_IOC_MAGIC, 0x31, int) +#define AMVIDEOCAP_IOW_SET_START_CAPTURE _IOW(AMVIDEOCAP_IOC_MAGIC, 0x32, int) +#define AMVIDEOCAP_IOW_SET_CANCEL_CAPTURE _IOW(AMVIDEOCAP_IOC_MAGIC, 0x33, int) + +#define AMVIDEOCAP_IOR_SET_SRC_X _IOR(AMVIDEOCAP_IOC_MAGIC, 0x40, int) +#define AMVIDEOCAP_IOR_SET_SRC_Y _IOR(AMVIDEOCAP_IOC_MAGIC, 0x41, int) +#define AMVIDEOCAP_IOR_SET_SRC_WIDTH _IOR(AMVIDEOCAP_IOC_MAGIC, 0x42, int) +#define AMVIDEOCAP_IOR_SET_SRC_HEIGHT _IOR(AMVIDEOCAP_IOC_MAGIC, 0x43, int) + +enum amvideocap_state { + AMVIDEOCAP_STATE_INIT = 0, + AMVIDEOCAP_STATE_ON_CAPTURE = 200, + AMVIDEOCAP_STATE_FINISHED_CAPTURE = 300, + AMVIDEOCAP_STATE_ERROR = 0xffff, +}; + +class CTvScreenCapture +{ +public: + CTvScreenCapture(); + ~CTvScreenCapture(); + + int InitVCap(sp<IMemory> Mem); + int SetVideoParameter(int width, int height, int frame); + int VideoStart(); + int GetVideoData( int *length); + int VideoStop(); + int DeinitVideoCap(); + class CapEvent : public CTvEv + { + public: + CapEvent(): CTvEv(CTvEv::TV_EVENT_HDMI_IN_CAP) {}; + ~CapEvent() {}; + + int mFrameNum; + int mFrameWide; + int mFrameHeight; + int mFrameSize; + }; + + class TvIObserver + { + public: + TvIObserver() {}; + virtual ~TvIObserver() {}; + virtual void onTvEvent ( const CTvEv &ev ) = 0; + }; + + int setObserver(TvIObserver *ob) + { + mpObserver = ob; + return 0; + } + +private: + + int xioctl(int fd, int request, void *arg); + int OpenCamera(struct camera *pCameraDev); + int InitMmap(struct camera *cam) ; + //int SetFrameRate( struct camera *cam); + int InitCamera(struct camera *cam) ; + int StartCapturing(struct camera *cam); + int StopCapturing(struct camera *cam); + int UninitCamera(struct camera *cam); + int CloseCamera(struct camera *cam); + void yuv_to_rgb32(unsigned char y, unsigned char u, unsigned char v, unsigned char *rgb); + void nv21_to_rgb32(unsigned char *buf, unsigned char *rgb, int width, int height, int *len); +private: + sp<IMemory> m_pMem; + camera m_capV4l2Cam; + unsigned int m_capNumBuffers; + + char *m_pData; + TvIObserver *mpObserver; + CapEvent mCapEvt; +}; +#endif + diff --git a/tvapi/libtv/tv/CTvSubtitle.cpp b/tvapi/libtv/tv/CTvSubtitle.cpp new file mode 100644 index 0000000..fe24ea0 --- a/dev/null +++ b/tvapi/libtv/tv/CTvSubtitle.cpp @@ -0,0 +1,348 @@ +// +// +// amlogic 2013 +// +// @ Project : tv +// @ Date : 2013-11 +// @ Author : +// +// +#include "CTvSubtitle.h" +CTvSubtitle::CTvSubtitle() +{ + mpObser = NULL; +} +CTvSubtitle::~CTvSubtitle() +{ +} +void CTvSubtitle::setObser(IObserver *pObser) +{ + mpObser = pObser; +} +void CTvSubtitle::stopDecoder() +{ +} +/** + * 开始字幕信息解析showboz sync + */ +void CTvSubtitle::startSub() +{ +} + +/** + * 停止图文/字幕信息解析 + */ +void CTvSubtitle::stop() +{ +} + +/** + * 停止图文/字幕信息解析并清除缓存数据 + */ +void CTvSubtitle::clear() +{ + +} + +/** + * 在图文模式下进入下一页 + */ +void CTvSubtitle::nextPage() +{ + +} + +/** + * 在图文模式下进入上一页 + */ +void CTvSubtitle::previousPage() +{ + +} + +/** + * 在图文模式下跳转到指定页 + * @param page 要跳转到的页号 + */ +void CTvSubtitle::gotoPage(int page) +{ + +} + +/** + * 在图文模式下跳转到home页 + */ +void CTvSubtitle::goHome() +{ + +} + +/** + * 在图文模式下根据颜色跳转到指定链接 + * @param color 颜色,COLOR_RED/COLOR_GREEN/COLOR_YELLOW/COLOR_BLUE + */ +void CTvSubtitle::colorLink(int color) +{ + +} + +/** + * 在图文模式下设定搜索字符串 + * @param pattern 搜索匹配字符串 + * @param casefold 是否区分大小写 + */ +void CTvSubtitle::setSearchPattern(char *pattern, bool casefold) +{ + +} + +/** + * 搜索下一页 + */ +void CTvSubtitle::searchNext() +{ +} + +/** + * 搜索上一页 + */ +void CTvSubtitle::searchPrevious() +{ +} + +int CTvSubtitle::sub_init() +{ + return 0; +} + +int CTvSubtitle::sub_destroy() +{ + return 0; +} + +int CTvSubtitle::sub_lock() +{ + return 0; +} + +int CTvSubtitle::sub_unlock() +{ + return 0; +} + +int CTvSubtitle::sub_clear() +{ + return 0; +} + +int CTvSubtitle::sub_start_dvb_sub(int dmx_id, int pid, int page_id, int anc_page_id) +{ + return 0; +} + +int CTvSubtitle::sub_start_dtv_tt(int dmx_id, int region_id, int pid, int page, int sub_page, bool is_sub) +{ + return 0; +} + +int CTvSubtitle::sub_stop_dvb_sub() +{ + return 0; +} + +int CTvSubtitle::sub_stop_dtv_tt() +{ + return 0; +} + +int CTvSubtitle::sub_tt_goto(int page) +{ + return 0; +} + +int CTvSubtitle::sub_tt_color_link(int color) +{ + return 0; +} + +int CTvSubtitle::sub_tt_home_link() +{ + return 0; +} + +int CTvSubtitle::sub_tt_next(int dir) +{ + return 0; +} + +int CTvSubtitle::sub_tt_set_search_pattern(char *pattern, bool casefold) +{ + return 0; +} + +int CTvSubtitle::sub_tt_search(int dir) +{ + return 0; +} + +/* + * 1, Set the country first and parameters should be either USA or KOREA +#define CMD_SET_COUNTRY_USA 0x5001 +#define CMD_SET_COUNTRY_KOREA 0x5002 + +2, Set the source type which including + a)VBI data(for analog program only) + b)USER data(for AIR or Cable service) +CMD_CC_SET_VBIDATA = 0x7001, +CMD_CC_SET_USERDATA = 0x7002, +2.1 If the frontend type is Analog we must set the channel Index + with command 'CMD_CC_SET_CHAN_NUM' and the parameter is like 57M + we set 0x20000, this should according to USA standard frequency + table. + +3, Next is to set the CC service type + +#define CMD_CC_1 0x3001 +#define CMD_CC_2 0x3002 +#define CMD_CC_3 0x3003 +#define CMD_CC_4 0x3004 + +//this doesn't support currently +#define CMD_TT_1 0x3005 +#define CMD_TT_2 0x3006 +#define CMD_TT_3 0x3007 +#define CMD_TT_4 0x3008 + +#define CMD_SERVICE_1 0x4001 +#define CMD_SERVICE_2 0x4002 +#define CMD_SERVICE_3 0x4003 +#define CMD_SERVICE_4 0x4004 +#define CMD_SERVICE_5 0x4005 +#define CMD_SERVICE_6 0x4006 + +4, Then set CMD_CC_START to start the CC service, and you needn't to stop + +CC service while switching services + +5, CMD_CC_STOP should be called in some cases like switch source, change + +program, no signal, blocked...*/ + +//channel_num == 0 ,if frontend is dtv +//else != 0 +int CTvSubtitle::sub_start_atsc_cc(enum cc_param_country country, enum cc_param_source_type src_type, int channel_num, enum cc_param_caption_type caption_type) +{ + LOGD("----sub_start_atsc_cc-1--- country=%d,src=%d,ctype=%d", country, src_type, caption_type); + switch (country) { + case CC_PARAM_COUNTRY_USA: + AM_CC_Cmd(CMD_SET_COUNTRY_USA); + break; + case CC_PARAM_COUNTRY_KOREA: + AM_CC_Cmd(CMD_SET_COUNTRY_KOREA); + break; + default: + AM_CC_Cmd(CMD_SET_COUNTRY_USA); + break; + } + + switch (src_type) { + case CC_PARAM_SOURCE_VBIDATA: + AM_CC_Cmd(CMD_CC_SET_VBIDATA); + break; + case CC_PARAM_SOURCE_USERDATA: + AM_CC_Cmd(CMD_CC_SET_USERDATA); + break; + default: + AM_CC_Cmd(CMD_CC_SET_USERDATA); + break; + } + + //just for test + if (channel_num == 0) { + } else { + //AM_CC_Cmd(CMD_CC_SET_CHAN_NUM); + } + + AM_CLOSECAPTION_cmd_t cc_t_cmd; + switch (caption_type) { + case CC_PARAM_ANALOG_CAPTION_TYPE_CC1: + cc_t_cmd = CMD_CC_1; + break; + case CC_PARAM_ANALOG_CAPTION_TYPE_CC2: + cc_t_cmd = CMD_CC_2; + break; + case CC_PARAM_ANALOG_CAPTION_TYPE_CC3: + cc_t_cmd = CMD_CC_3; + break; + case CC_PARAM_ANALOG_CAPTION_TYPE_CC4: + cc_t_cmd = CMD_CC_4; + break; + case CC_PARAM_DIGITAL_CAPTION_TYPE_SERVICE1: + cc_t_cmd = CMD_SERVICE_1; + break; + case CC_PARAM_DIGITAL_CAPTION_TYPE_SERVICE2: + cc_t_cmd = CMD_SERVICE_2; + break; + case CC_PARAM_DIGITAL_CAPTION_TYPE_SERVICE3: + cc_t_cmd = CMD_SERVICE_3; + break; + case CC_PARAM_DIGITAL_CAPTION_TYPE_SERVICE4: + cc_t_cmd = CMD_SERVICE_4; + break; + default: + cc_t_cmd = CMD_SERVICE_1; + break; + } + AM_CC_Cmd(cc_t_cmd); + + AM_CC_Set_CallBack(close_caption_callback, this); + AM_VCHIP_Set_CallBack(atv_vchip_callback, this); + //start + AM_CC_Cmd(CMD_CC_START); + LOGD("----sub_start_atsc_cc-2--- country=%d,src=%d,ctype=%d", country, src_type, caption_type); + return 0; +} + +int CTvSubtitle::sub_stop_atsc_cc() +{ + LOGD("----sub_stop_atsc_cc----"); + AM_CC_Cmd(CMD_CC_STOP); + return 0; +} +int CTvSubtitle::ResetVchipChgStat() +{ + avchip_chg = 0; + AM_CC_Cmd(CMD_VCHIP_RST_CHGSTAT); + return 0; +} +int CTvSubtitle::IsVchipChange() +{ + return avchip_chg; +} +//cnt :data buf len +//databuf len is max 512 +//cmdbuf len is max 128 +void CTvSubtitle::close_caption_callback(char *str, int cnt, int data_buf[], int cmd_buf[], void *user_data) +{ + + CTvSubtitle *pSub = (CTvSubtitle *)user_data; + + if (pSub == NULL) { + LOGD("sub cc callback is null user data for this"); + return; + } + + if (pSub->mpObser == NULL) return; + + pSub->mCurCCEv.mDataBufSize = cnt; + pSub->mCurCCEv.mpDataBuffer = data_buf; + pSub->mCurCCEv.mCmdBufSize = 128;//max + pSub->mCurCCEv.mpCmdBuffer = cmd_buf; + + pSub->mpObser->onEvent(pSub->mCurCCEv); +} +void CTvSubtitle::atv_vchip_callback(int Is_chg, void *user_data) +{ + CTvSubtitle *pSub = (CTvSubtitle *)user_data; + pSub->avchip_chg = Is_chg; +} diff --git a/tvapi/libtv/tv/CTvSubtitle.h b/tvapi/libtv/tv/CTvSubtitle.h new file mode 100644 index 0000000..dcf2211 --- a/dev/null +++ b/tvapi/libtv/tv/CTvSubtitle.h @@ -0,0 +1,236 @@ +// +// +// amlogic 2013 +// +// @ Project : tv +// @ File Name : CTvSubtitle.h +// @ Date : 2013-11 +// @ Author : +// +// +#if !defined(_CTVSUBTITLE_H) +#define _CTVSUBTITLE_H +#include <stdlib.h> +#include "CTvLog.h" +using namespace android; +#include "am_cc.h" +#include "CTvEv.h" +#define LOG_TAG "CTvSubtitle" + + +typedef enum cc_param_country { + CC_PARAM_COUNTRY_USA = 0, + CC_PARAM_COUNTRY_KOREA, +}; + +typedef enum cc_param_source_type { + CC_PARAM_SOURCE_VBIDATA = 0, + CC_PARAM_SOURCE_USERDATA, +}; + +typedef enum cc_param_caption_type { + CC_PARAM_ANALOG_CAPTION_TYPE_CC1 = 0, + CC_PARAM_ANALOG_CAPTION_TYPE_CC2, + CC_PARAM_ANALOG_CAPTION_TYPE_CC3, + CC_PARAM_ANALOG_CAPTION_TYPE_CC4, + CC_PARAM_ANALOG_CAPTION_TYPE_TEXT1, + CC_PARAM_ANALOG_CAPTION_TYPE_TEXT2, + CC_PARAM_ANALOG_CAPTION_TYPE_TEXT3, + CC_PARAM_ANALOG_CAPTION_TYPE_TEXT4, + // + CC_PARAM_DIGITAL_CAPTION_TYPE_SERVICE1, + CC_PARAM_DIGITAL_CAPTION_TYPE_SERVICE2, + CC_PARAM_DIGITAL_CAPTION_TYPE_SERVICE3, + CC_PARAM_DIGITAL_CAPTION_TYPE_SERVICE4, + CC_PARAM_DIGITAL_CAPTION_TYPE_SERVICE5, + CC_PARAM_DIGITAL_CAPTION_TYPE_SERVICE6, +}; +class CTvSubtitle +{ +public: + CTvSubtitle(); + ~CTvSubtitle(); + + class CloseCaptionEvent: public CTvEv + { + public: + //static const int CC_CMD_LEN = 128; + //static const int CC_DATA_LEN = 512; + CloseCaptionEvent(): CTvEv(CTvEv::TV_EVENT_CC) + { + } + ~CloseCaptionEvent() + { + } + public: + int mCmdBufSize; + int *mpCmdBuffer; + int mDataBufSize; + int *mpDataBuffer; + }; + + class IObserver + { + public: + IObserver() {}; + virtual ~IObserver() {}; + virtual void onEvent(const CloseCaptionEvent &ev) = 0; + }; + + void setObser(IObserver *pObser); + void stopDecoder(); + /** + * 开始字幕信息解析showboz sync + */ + void startSub(); + /** + * 停止图文/字幕信息解析 + */ + void stop(); + + /** + * 停止图文/字幕信息解析并清除缓存数据 + */ + void clear(); + /** + * 在图文模式下进入下一页 + */ + void nextPage(); + /** + * 在图文模式下进入上一页 + */ + void previousPage(); + /** + * 在图文模式下跳转到指定页 + * @param page 要跳转到的页号 + */ + void gotoPage(int page); + + /** + * 在图文模式下跳转到home页 + */ + void goHome(); + /** + * 在图文模式下根据颜色跳转到指定链接 + * @param color 颜色,COLOR_RED/COLOR_GREEN/COLOR_YELLOW/COLOR_BLUE + */ + void colorLink(int color); + + /** + * 在图文模式下设定搜索字符串 + * @param pattern 搜索匹配字符串 + * @param casefold 是否区分大小写 + */ + void setSearchPattern(char *pattern, bool casefold); + /** + * 搜索下一页 + */ + void searchNext(); + /** + * 搜索上一页 + */ + void searchPrevious(); + + int sub_init(); + // + int sub_destroy(); + // + int sub_lock(); + // + int sub_unlock(); + // + int sub_clear(); + // + int sub_start_dvb_sub(int dmx_id, int pid, int page_id, int anc_page_id); + // + int sub_start_dtv_tt(int dmx_id, int region_id, int pid, int page, int sub_page, bool is_sub); + // + int sub_stop_dvb_sub(); + // + int sub_stop_dtv_tt(); + // + int sub_tt_goto(int page); + // + int sub_tt_color_link(int color); + // + int sub_tt_home_link(); + // + int sub_tt_next(int dir); + // + int sub_tt_set_search_pattern(char *pattern, bool casefold); + // + int sub_tt_search(int dir); + // + int sub_start_atsc_cc(enum cc_param_country country, enum cc_param_source_type src_type, int channel_num, enum cc_param_caption_type caption_type); + // + int sub_stop_atsc_cc(); + static void close_caption_callback(char *str, int cnt, int data_buf[], int cmd_buf[], void *user_data); + static void atv_vchip_callback(int Is_chg, void *user_data); + int IsVchipChange(); + int ResetVchipChgStat(); +private: + + /** + * DVB subtitle 参数 + */ + struct DVBSubParams { + int mDmx_id; + int mPid; + int mComposition_page_id; + int mAncillary_page_id; + + /** + * 创建DVB subtitle参数 + * @param dmx_id 接收使用demux设备的ID + * @param pid subtitle流的PID + * @param page_id 字幕的page_id + * @param anc_page_id 字幕的ancillary_page_id + */ + DVBSubParams() + { + } + DVBSubParams(int dmx_id, int pid, int page_id, int anc_page_id) + { + mDmx_id = dmx_id; + mPid = pid; + mComposition_page_id = page_id; + mAncillary_page_id = anc_page_id; + } + }; + + /** + * 数字电视teletext图文参数 + */ + struct DTVTTParams { + int mDmx_id; + int mPid; + int mPage_no; + int mSub_page_no; + int mRegion_id; + + DTVTTParams() + { + } + /** + * 创建数字电视teletext图文参数 + * @param dmx_id 接收使用demux设备的ID + * @param pid 图文信息流的PID + * @param page_no 要显示页号 + * @param sub_page_no 要显示的子页号 + */ + DTVTTParams(int dmx_id, int pid, int page_no, int sub_page_no, int region_id) + { + mDmx_id = dmx_id; + mPid = pid; + mPage_no = page_no; + mSub_page_no = sub_page_no; + mRegion_id = region_id; + } + }; + + int mSubType; + CloseCaptionEvent mCurCCEv; + IObserver *mpObser; + int avchip_chg; +}; +#endif //_CTVSUBTITLE_H diff --git a/tvapi/libtv/tv/CTvTime.cpp b/tvapi/libtv/tv/CTvTime.cpp new file mode 100644 index 0000000..e0ec5b4 --- a/dev/null +++ b/tvapi/libtv/tv/CTvTime.cpp @@ -0,0 +1,15 @@ +// +// +// amlogic 2013 +// +// @ Project : tv +// @ File Name : CTvChannel.h +// @ Date : 2013-11 +// @ Author : +// +// +#include "CTvTime.h" +#ifdef LOG_TAG +#undef LOG_TAG +#define LOG_TAG "CTvTime" +#endif diff --git a/tvapi/libtv/tv/CTvTime.h b/tvapi/libtv/tv/CTvTime.h new file mode 100644 index 0000000..d43bbd8 --- a/dev/null +++ b/tvapi/libtv/tv/CTvTime.h @@ -0,0 +1,102 @@ +// +// +// amlogic 2013 +// +// @ Project : tv +// @ File Name : CTvChannel.h +// @ Date : 2013-11 +// @ Author : +// +// +#include <utils/Timers.h> +#include "CTvLog.h" +#include <time.h> +//#include <cutils/tztime.h> +#include <sys/times.h> +#include <sys/sysinfo.h> + +#define LOG_TAG "CTVTIME" +/** + *TV时间管理 + */ +class CTvTime +{ +public: + CTvTime() + { + mDiff = 0; + mHZ = sysconf( _SC_CLK_TCK ); + } + + /** + *设定当前时间 + *@param time 当前时间(毫秒单位) + */ + long getSysUTCTime() + { + //struct tm tm; + //time_t t; + //int64_t r = mktime_tz(&(tm), NULL); + //time_t t = time(NULL); + //LOGD("---------utc t = %ld time t=%ld", r, t); + return 0; + } + void setTime(long t) + { + //long utcMS; + //time(&utcMS); + //nsecs_t ns = systemTime(CLOCK_REALTIME); + //nsecs_t tm = ns2s(ns); + //unsigned long ticks = times(NULL); + //long tm = ticks/mHZ; + struct sysinfo s_info; + int error; + error = sysinfo(&s_info); + + mDiff = t - s_info.uptime; + LOGD("--- mDiff=%ld", mDiff); + } + + /** + *取得当前时间 + *@return 返回当前时间 + */ + long getTime() + { + //long utcMS; + //time(&utcMS); + //nsecs_t ns = systemTime(CLOCK_REALTIME); + //nsecs_t sec = ns2s(ns); + + //unsigned long ticks = times(NULL); + //long sec = ticks/mHZ; + struct sysinfo s_info; + int error; + error = sysinfo(&s_info); + + + LOGD("--- mDiff=%ld, sec=%ld", mDiff, s_info.uptime); + return s_info.uptime + mDiff; + } + + /** + *取得TDT/STT与系统时间的差值 + *@return 返回差值时间 + */ + long getDiffTime() + { + return mDiff; + } + + /** + *设置TDT/STT与系统时间的差值 + */ + void setDiffTime(long diff) + { + this->mDiff = diff; + } + +private: + long mDiff; + unsigned long mHZ; +}; diff --git a/tvapi/libtv/tv/CTvVchipCheck.cpp b/tvapi/libtv/tv/CTvVchipCheck.cpp new file mode 100644 index 0000000..2eb81dd --- a/dev/null +++ b/tvapi/libtv/tv/CTvVchipCheck.cpp @@ -0,0 +1,161 @@ +#include "CTvVchipCheck.h" +CTvVchipCheck:: CTvVchipCheck() +{ +} +CTvVchipCheck:: ~CTvVchipCheck() +{ +} +bool CTvVchipCheck::CheckProgramBlock(int id) +{ + bool lock = false; + CTvProgram prog; + CTvEvent ev; + int ret = 0; + + ret = CTvProgram::selectByID(id, prog); + if (ret != 0) return false; + + int type = prog.getProgType(); + + if (type == CTvProgram::TYPE_ATV) { + ret = ev.getATVProgEvent(prog.getSrc(), prog.getID(), ev); + } else { + //long epgtime = mDmTime.getTime(); + //ret = ev.getProgPresentEvent(prog.getSrc(),prog.getSourceId(), epgtime, ev); + } + if (ret == 0) { + if (prog.isATSCMode()) { + // ATSC V-Chip + Vector<CTvDimension::VChipRating *> definedRatings = ev.getVChipRatings(); + for (int i = 0; i < definedRatings.size(); i++) { + CTvDimension dm; + if (dm.isBlocked(dm, definedRatings[i])) { + lock = true; + { + /*CurvchipDimension = dm.getName(); + CurvchipAbbrev = dm.getAbbrev(definedRatings[i]->getValue()); + CurvchipText= dm.getText(definedRatings[i]->getValue()); + LOGD("%s, %d Dimension:%s, Abbrev: %s, idx:%d","TV",__LINE__,CurvchipDimension.string(), + CurvchipAbbrev.string(),definedRatings[i]->getValue());*/ + } + break; + } + } + } + } else { + LOGD("Present event of playing program not received yet, will unblock this program."); + } + + return lock; +} + +void *CTvVchipCheck::VchipCheckingThread ( void *arg ) +{ + /*CTv *pt = static_cast<CTv *> ( arg ); + + if ( !pt->IsVchipEnable() ) { + return NULL; + } + + while ( pt->mvchip_running ) { + bool lock = 0; + String8 curdm; + String8 curabbrev; + tvin_info_t siginfo = pt->Tv_GetCurrentSignalInfo(); + + //if ( TVIN_SIG_STATUS_STABLE == siginfo.status ) { + lock = pt->mTvVchip.CheckProgramBlock ( pt->getDTVProgramID() ); + curdm = pt->mTvVchip.getCurdimension(); + curabbrev = pt->mTvVchip.getCurAbbr(); + + if ( ( lock != pt->mlastlockstatus ) || ( pt->mlastdm != curdm ) || ( pt->mlastabbrev != curabbrev ) ) { + pt->mlastlockstatus = lock; + pt->mlastdm = curdm; + pt->mlastabbrev = curabbrev; + BlockEvent evt; + + if ( lock ) { + evt.programBlockType = 0; + evt.block_status = 1; + evt.vchipDimension = curdm; + evt.vchipAbbrev = curdm; + LOGD ( "%s, %d block the program by type %s, %s", "TV", __LINE__, curdm.string(), curabbrev.string() ); + } else { + LOGD ( "unblock the program" ); + evt.programBlockType = 0; + evt.block_status = 0; + } + + pt->sendTvEvent ( evt ); + pt->Programblock ( lock ); + } + + usleep ( 1000 * 1000 ); + //} else { + //usleep ( 500 * 1000 ); + //} + }*/ + + return NULL; +} + +int CTvVchipCheck::stopVChipCheck() +{ + CMutex::Autolock _l ( mLock ); + LOGD ( "stopVChipCheck() and exit thread" ); + requestExit(); + return 0; +} + +int CTvVchipCheck::pauseVChipCheck() +{ + CMutex::Autolock _l ( mLock ); + LOGD ( "pauseVChipCheck() set request pause flag, when flag true, thread loop go pause on condition" ); + m_request_pause_detect = true; + return 0; +} + +int CTvVchipCheck::requestAndWaitPauseVChipCheck() +{ + CMutex::Autolock _l ( mLock ); + LOGD ( "requestAndWaitPauseVChipCheck(),first set pause flag to true, and wait when loop run to pause code segment" ); + m_request_pause_detect = true; + + if ( mDetectState == STATE_RUNNING ) { + mRequestPauseCondition.wait ( mLock ); + } + + return 0; +} + +int CTvVchipCheck::resumeVChipCheck() +{ + CMutex::Autolock _l ( mLock ); + LOGD ( "resumeVChipCheck() first set flag false, and signal to paused condition, let run loop" ); + m_request_pause_detect = false; + mDetectPauseCondition.signal(); + return 0; +} + +bool CTvVchipCheck::threadLoop() +{ + while ( !exitPending() ) { //requietexit() or requietexitWait() not call + while ( m_request_pause_detect ) { + mRequestPauseCondition.broadcast(); + mLock.lock(); + mDetectState = STATE_PAUSE; + mDetectPauseCondition.wait ( mLock ); //first unlock,when return,lock again,so need,call unlock + mDetectState = STATE_RUNNING; + mLock.unlock(); + } + //loop codes + + if ( !m_request_pause_detect ) { //not request pause, sleep 1s which loop + usleep ( 1000 * 1000 ); + } + } + //exit + mDetectState = STATE_STOPED; + //return true, run again, return false,not run. + return false; +} diff --git a/tvapi/libtv/tv/CTvVchipCheck.h b/tvapi/libtv/tv/CTvVchipCheck.h new file mode 100644 index 0000000..4ebc86a --- a/dev/null +++ b/tvapi/libtv/tv/CTvVchipCheck.h @@ -0,0 +1,50 @@ +// +// +// amlogic 2013 +// +// @ Project : tv +// @ File Name : CTvDimension.h +// @ Date : 2013-11 +// @ Author : +// +// + +#if !defined(_CTVVCHIPCHECK_H) +#define _CTVVCHIPCHECK_H +#include <utils/Vector.h> +#include "CTvDatabase.h" +#include <utils/String8.h> +#include <stdlib.h> +#include "CTvDimension.h" +#include "CTvProgram.h" +#include "CTvTime.h" +#include "CTvEvent.h" +#include "CTvLog.h" +#include "tvutils/CThread.h" +// TV ATSC rating dimension +class CTvVchipCheck: public CThread +{ +public: + CTvVchipCheck(); + ~CTvVchipCheck(); + bool CheckProgramBlock(int id); + static void *VchipCheckingThread ( void *arg ); + int startVChipCheck(); + int stopVChipCheck(); + int pauseVChipCheck(); + int resumeVChipCheck(); + int requestAndWaitPauseVChipCheck(); +private: + bool threadLoop(); + mutable CMutex mLock; + CCondition mDetectPauseCondition; + CCondition mRequestPauseCondition; + volatile bool m_request_pause_detect; + enum DetectState { + STATE_STOPED = 0, + STATE_RUNNING, + STATE_PAUSE + }; + int mDetectState; +}; +#endif //_CTVDIMENSION_H diff --git a/tvapi/libtv/tv/CUpgradeFBC.cpp b/tvapi/libtv/tv/CUpgradeFBC.cpp new file mode 100644 index 0000000..bf59abf --- a/dev/null +++ b/tvapi/libtv/tv/CUpgradeFBC.cpp @@ -0,0 +1,556 @@ +#include <CTvLog.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <sys/prctl.h> +#include <fcntl.h> +#include <errno.h> + +#include <cutils/log.h> + +#include "CUpgradeFBC.h" + +#ifdef LOG_TAG +#undef LOG_TAG +#define LOG_TAG "CUpgradeFBC" +#endif + +CUpgradeFBC::CUpgradeFBC() +{ + mUpgradeMode = CC_UPGRADE_MODE_MAIN; + mFileName[0] = 0; + + mOPTotalSize = 0; + mBinFileSize = 0; + mBinFileBuf = NULL; + mUpgradeBlockSize = 0x10000; + + mpObserver = NULL; + mState = STATE_STOPED; + mCfbcIns = GetSingletonFBC(); + mCfbcIns->SetUpgradeFlag(0); +} + +CUpgradeFBC::~CUpgradeFBC() +{ + if (mBinFileBuf != NULL) { + delete mBinFileBuf; + mBinFileBuf = NULL; + } +} + +int CUpgradeFBC::start() +{ + if (mState == STATE_STOPED || mState == STATE_ABORT || mState == STATE_FINISHED) { + mCfbcIns->SetUpgradeFlag(1); + + this->run(); + } + + return 0; +} + +int CUpgradeFBC::stop() +{ + requestExit(); + mState = STATE_STOPED; + + return 0; +} + +int CUpgradeFBC::GetUpgradeFBCProgress() +{ + return 0; +} + +int CUpgradeFBC::SetUpgradeFileName(char *file_name) +{ + if (file_name == NULL) { + return -1; + } + + strcpy(mFileName, file_name); + + return 0; +} + +int CUpgradeFBC::SetUpgradeFileSize(int file_size) +{ + mBinFileSize = file_size; + return 0; +} + +int CUpgradeFBC::SetUpgradeBlockSize(int block_size) +{ + mUpgradeBlockSize = block_size; + return 0; +} + +int CUpgradeFBC::SetUpgradeMode(int mode) +{ + int tmp_val = 0; + + tmp_val = mUpgradeMode; + mUpgradeMode = mode; + + return tmp_val; +} + +int CUpgradeFBC::AddCRCToDataBuf(unsigned char data_buf[], int data_len) +{ + unsigned int tmp_crc = 0; + + tmp_crc = mCfbcIns->Calcrc32(0, data_buf, data_len); + data_buf[data_len + 0] = (tmp_crc >> 0) & 0xFF; + data_buf[data_len + 1] = (tmp_crc >> 8) & 0xFF; + data_buf[data_len + 2] = (tmp_crc >> 16) & 0xFF; + data_buf[data_len + 3] = (tmp_crc >> 24) & 0xFF; + + return 0; +} + +bool CUpgradeFBC::threadLoop() +{ + int file_handle = -1; + int i = 0, tmp_flag = 0, cmd_len = 0, tmp_prog = 0, total_item = 0; + int start_off = 0, end_off = 0, cur_off = 0, old_off = 0, rw_size = 0; + int upgrade_version = 0, upgrade_flag = 0, upgrade_err_code = 0, upgrade_try_cnt = 0; + int upgrade_pq_wb_flag = 0; + unsigned char tmp_buf[128] = {0}; + + if (mpObserver == NULL) { + return false; + } + + LOGD("%s, entering...\n", "TV"); + + prctl(PR_SET_NAME, (unsigned long)"CUpgradeFBC thread loop"); + + mState = STATE_RUNNING; + + LOGD("%s, upgrade mode = %d\n", __FUNCTION__, mUpgradeMode); + if (mUpgradeMode != CC_UPGRADE_MODE_BOOT_MAIN && mUpgradeMode != CC_UPGRADE_MODE_BOOT && + mUpgradeMode != CC_UPGRADE_MODE_MAIN && mUpgradeMode != CC_UPGRADE_MODE_COMPACT_BOOT && + mUpgradeMode != CC_UPGRADE_MODE_ALL && mUpgradeMode != CC_UPGRADE_MODE_MAIN_PQ_WB && + mUpgradeMode != CC_UPGRADE_MODE_ALL_PQ_WB && mUpgradeMode != CC_UPGRADE_MODE_MAIN_WB && + mUpgradeMode != CC_UPGRADE_MODE_ALL_WB && mUpgradeMode != CC_UPGRADE_MODE_MAIN_PQ && + mUpgradeMode != CC_UPGRADE_MODE_ALL_PQ && mUpgradeMode != CC_UPGRADE_MODE_PQ_WB_ONLY && + mUpgradeMode != CC_UPGRADE_MODE_WB_ONLY && mUpgradeMode != CC_UPGRADE_MODE_PQ_ONLY && + mUpgradeMode != CC_UPGRADE_MODE_CUR_PQ_BIN && mUpgradeMode != CC_UPGRADE_MODE_BURN && + mUpgradeMode != CC_UPGRADE_MODE_DUMMY) { + mState = STATE_ABORT; + upgrade_err_code = ERR_NOT_SUPPORT_UPGRADE_MDOE; + mpObserver->onUpgradeStatus(mState, upgrade_err_code); + mCfbcIns->SetUpgradeFlag(0); + + return false; + } + + if (mUpgradeBlockSize % 0x1000 != 0) { + mState = STATE_ABORT; + upgrade_err_code = ERR_NOT_CORRECT_UPGRADE_BLKSIZE; + mpObserver->onUpgradeStatus(mState, upgrade_err_code); + mCfbcIns->SetUpgradeFlag(0); + + return false; + } + + struct stat tmp_st; + stat(mFileName, &tmp_st); + if (tmp_st.st_size == CC_FBC_V01_FILE_SIZE) { + upgrade_version = CC_FBC_V01_00_VAL; + mOPTotalSize = CC_UPGRADE_V01_ALL_LENGTH; + mBinFileSize = CC_FBC_V01_FILE_SIZE; + } else if (tmp_st.st_size == CC_FBC_V02_FILE_SIZE) { + upgrade_version = CC_FBC_V02_00_VAL; + mOPTotalSize = CC_UPGRADE_V02_ALL_LENGTH; + mBinFileSize = CC_FBC_V02_FILE_SIZE; + } else if (tmp_st.st_size == CC_FBC_V02_CUR_PQ_BIN_FILE_SIZE) { + upgrade_version = CC_FBC_V02_01_VAL; + mOPTotalSize = CC_UPGRADE_V02_ALL_LENGTH; + mBinFileSize = CC_FBC_V02_CUR_PQ_BIN_FILE_SIZE; + } else if (tmp_st.st_size == CC_FBC_V03_FILE_SIZE) { + upgrade_version = CC_FBC_V03_00_VAL; + mOPTotalSize = CC_UPGRADE_V03_ALL_LENGTH; + mBinFileSize = CC_FBC_V03_FILE_SIZE; + } else if (tmp_st.st_size == CC_FBC_V03_CUR_PQ_BIN_FILE_SIZE) { + upgrade_version = CC_FBC_V03_01_VAL; + mOPTotalSize = CC_UPGRADE_V03_ALL_LENGTH; + mBinFileSize = CC_FBC_V03_CUR_PQ_BIN_FILE_SIZE; + } else { + upgrade_version = 0; + mOPTotalSize = 0; + mBinFileSize = 0; + mState = STATE_ABORT; + upgrade_err_code = ERR_BIN_FILE_SIZE; + mpObserver->onUpgradeStatus(mState, upgrade_err_code); + mCfbcIns->SetUpgradeFlag(0); + return false; + } + + //open upgrade source file and read it to temp buffer. + file_handle = open(mFileName, O_RDONLY); + if (file_handle < 0) { + LOGE("%s, Can't Open file %s\n", __FUNCTION__, mFileName); + mState = STATE_ABORT; + upgrade_err_code = ERR_OPEN_BIN_FILE; + mpObserver->onUpgradeStatus(mState, upgrade_err_code); + mCfbcIns->SetUpgradeFlag(0); + return false; + } + + lseek(file_handle, 0, SEEK_SET); + + mBinFileBuf = new unsigned char[mOPTotalSize]; + + memset(mBinFileBuf, 0, mOPTotalSize); + rw_size = read(file_handle, mBinFileBuf, mBinFileSize); + if (rw_size != mBinFileSize || rw_size <= 0) { + LOGE("%s, read file %s error(%d, %d)\n", __FUNCTION__, mFileName, mBinFileSize, rw_size); + mState = STATE_ABORT; + upgrade_err_code = ERR_READ_BIN_FILE; + mpObserver->onUpgradeStatus(mState, upgrade_err_code); + mCfbcIns->SetUpgradeFlag(0); + + if (mBinFileBuf != NULL) { + delete mBinFileBuf; + mBinFileBuf = NULL; + } + return false; + } + + close(file_handle); + file_handle = -1; + + if (upgrade_version == CC_FBC_V02_00_VAL) { + memcpy((void *)(mBinFileBuf + CC_UPGRADE_V02_BOOT_BAK_OFFSET), (void *)(mBinFileBuf + CC_UPGRADE_V02_BOOT_OFFSET), CC_UPGRADE_V02_BOOT_LEN); + memcpy((void *)(mBinFileBuf + CC_UPGRADE_V02_MAIN_BAK_OFFSET), (void *)(mBinFileBuf + CC_UPGRADE_V02_MAIN_OFFSET), CC_UPGRADE_V02_MAIN_LEN); + } else if (upgrade_version == CC_FBC_V02_01_VAL) { + memcpy((void *)(mBinFileBuf + CC_UPGRADE_V02_CUR_PQ_OFFSET), (void *)(mBinFileBuf + 0), CC_FBC_V02_CUR_PQ_BIN_FILE_SIZE); + } else if (upgrade_version == CC_FBC_V03_01_VAL) { + memcpy((void *)(mBinFileBuf + CC_UPGRADE_V03_CUR_PQ_OFFSET), (void *)(mBinFileBuf + 0), CC_FBC_V03_CUR_PQ_BIN_FILE_SIZE); + } + + //calculate start addr + if (upgrade_version == CC_FBC_V01_00_VAL) { + start_off = CC_UPGRADE_V01_MAIN_OFFSET; + end_off = 0; + if (mUpgradeMode == CC_UPGRADE_MODE_ALL || mUpgradeMode == CC_UPGRADE_MODE_BOOT_MAIN) { + start_off = CC_UPGRADE_V01_BOOT_OFFSET; + end_off = CC_UPGRADE_V01_BOOT_OFFSET + CC_UPGRADE_V01_ALL_LENGTH; + total_item = (end_off - start_off) / mUpgradeBlockSize + 2; + } else if (mUpgradeMode == CC_UPGRADE_MODE_BOOT) { + start_off = CC_UPGRADE_V01_BOOT_OFFSET; + end_off = CC_UPGRADE_V01_BOOT_OFFSET + CC_UPGRADE_V01_BOOT_LEN; + total_item = (end_off - start_off) / mUpgradeBlockSize + 2; + } else if (mUpgradeMode == CC_UPGRADE_MODE_MAIN) { + start_off = CC_UPGRADE_V01_MAIN_OFFSET; + end_off = CC_UPGRADE_V01_MAIN_OFFSET + CC_UPGRADE_V01_MAIN_LEN; + total_item = (end_off - start_off) / mUpgradeBlockSize + 2; + } + } else if (upgrade_version == CC_FBC_V02_00_VAL) { + start_off = CC_UPGRADE_V02_MAIN_OFFSET; + end_off = 0; + if (mUpgradeMode == CC_UPGRADE_MODE_ALL || mUpgradeMode == CC_UPGRADE_MODE_ALL_PQ_WB || + mUpgradeMode == CC_UPGRADE_MODE_ALL_WB || mUpgradeMode == CC_UPGRADE_MODE_ALL_PQ) { + start_off = CC_UPGRADE_V02_COMPACT_BOOT_OFFSET; + end_off = CC_UPGRADE_V02_COMPACT_BOOT_OFFSET + CC_UPGRADE_V02_ALL_LENGTH; + total_item = (end_off - start_off) / mUpgradeBlockSize + 2; + } else if (mUpgradeMode == CC_UPGRADE_MODE_BOOT) { + start_off = CC_UPGRADE_V02_BOOT_OFFSET; + end_off = CC_UPGRADE_V02_BOOT_OFFSET + CC_UPGRADE_V02_BOOT_LEN; + total_item = (end_off - start_off) / mUpgradeBlockSize + 2; + } else if (mUpgradeMode == CC_UPGRADE_MODE_MAIN || mUpgradeMode == CC_UPGRADE_MODE_MAIN_PQ_WB || + mUpgradeMode == CC_UPGRADE_MODE_MAIN_WB || mUpgradeMode == CC_UPGRADE_MODE_MAIN_PQ ) { + start_off = CC_UPGRADE_V02_MAIN_OFFSET; + end_off = CC_UPGRADE_V02_MAIN_OFFSET + CC_UPGRADE_V02_MAIN_LEN; + total_item = (end_off - start_off) / mUpgradeBlockSize + 2; + } else if (mUpgradeMode == CC_UPGRADE_MODE_COMPACT_BOOT) { + start_off = CC_UPGRADE_V02_COMPACT_BOOT_OFFSET; + end_off = CC_UPGRADE_V02_COMPACT_BOOT_OFFSET + CC_UPGRADE_V02_COMPACT_BOOT_LEN; + total_item = (end_off - start_off) / mUpgradeBlockSize + 2; + } else if (mUpgradeMode == CC_UPGRADE_MODE_BOOT_MAIN) { + start_off = CC_UPGRADE_V02_BOOT_OFFSET; + end_off = CC_UPGRADE_V02_BOOT_OFFSET + CC_UPGRADE_V02_BOOT_LEN + CC_UPGRADE_V02_MAIN_LEN; + total_item = (end_off - start_off) / mUpgradeBlockSize + 2; + } + } else if (upgrade_version == CC_FBC_V02_01_VAL) { + start_off = CC_UPGRADE_V02_CUR_PQ_OFFSET; + end_off = 0; + if (mUpgradeMode == CC_UPGRADE_MODE_CUR_PQ_BIN) { + start_off = CC_UPGRADE_V02_CUR_PQ_OFFSET; + end_off = CC_UPGRADE_V02_CUR_PQ_OFFSET + CC_FBC_V02_CUR_PQ_BIN_FILE_SIZE; + total_item = (end_off - start_off) / mUpgradeBlockSize + 2; + } + } else if (upgrade_version == CC_FBC_V03_00_VAL) { + start_off = CC_UPGRADE_V03_MAIN_OFFSET; + end_off = 0; + if (mUpgradeMode == CC_UPGRADE_MODE_ALL || mUpgradeMode == CC_UPGRADE_MODE_ALL_PQ_WB || + mUpgradeMode == CC_UPGRADE_MODE_ALL_WB || mUpgradeMode == CC_UPGRADE_MODE_ALL_PQ) { + start_off = CC_UPGRADE_V03_COMPACT_BOOT_OFFSET; + end_off = CC_UPGRADE_V03_COMPACT_BOOT_OFFSET + CC_UPGRADE_V03_ALL_LENGTH; + total_item = (end_off - start_off) / mUpgradeBlockSize + 2; + } else if (mUpgradeMode == CC_UPGRADE_MODE_BOOT) { + start_off = CC_UPGRADE_V03_BOOT_OFFSET; + end_off = CC_UPGRADE_V03_BOOT_OFFSET + CC_UPGRADE_V03_BOOT_LEN; + total_item = (end_off - start_off) / mUpgradeBlockSize + 2; + } else if (mUpgradeMode == CC_UPGRADE_MODE_MAIN || mUpgradeMode == CC_UPGRADE_MODE_MAIN_PQ_WB || + mUpgradeMode == CC_UPGRADE_MODE_MAIN_WB || mUpgradeMode == CC_UPGRADE_MODE_MAIN_PQ ) { + start_off = CC_UPGRADE_V03_MAIN_OFFSET; + end_off = CC_UPGRADE_V03_MAIN_OFFSET + CC_UPGRADE_V03_MAIN_LEN; + total_item = (end_off - start_off) / mUpgradeBlockSize + 2; + } else if (mUpgradeMode == CC_UPGRADE_MODE_COMPACT_BOOT) { + start_off = CC_UPGRADE_V03_COMPACT_BOOT_OFFSET; + end_off = CC_UPGRADE_V03_COMPACT_BOOT_OFFSET + CC_UPGRADE_V03_COMPACT_BOOT_LEN; + total_item = (end_off - start_off) / mUpgradeBlockSize + 2; + } else if (mUpgradeMode == CC_UPGRADE_MODE_BOOT_MAIN) { + start_off = CC_UPGRADE_V03_BOOT_OFFSET; + end_off = CC_UPGRADE_V03_BOOT_OFFSET + CC_UPGRADE_V03_BOOT_LEN + CC_UPGRADE_V03_MAIN_LEN; + total_item = (end_off - start_off) / mUpgradeBlockSize + 2; + } else if (mUpgradeMode == CC_UPGRADE_MODE_BURN) { + start_off = CC_UPGRADE_V03_COMPACT_BOOT_OFFSET; + end_off = CC_UPGRADE_V03_COMPACT_BOOT_OFFSET + CC_FBC_V03_FILE_SIZE; + total_item = (end_off - start_off) / mUpgradeBlockSize + 2; + } + } else if (upgrade_version == CC_FBC_V03_01_VAL) { + start_off = CC_UPGRADE_V03_CUR_PQ_OFFSET; + end_off = 0; + if (mUpgradeMode == CC_UPGRADE_MODE_CUR_PQ_BIN) { + start_off = CC_UPGRADE_V03_CUR_PQ_OFFSET; + end_off = CC_UPGRADE_V03_CUR_PQ_OFFSET + CC_FBC_V03_CUR_PQ_BIN_FILE_SIZE; + total_item = (end_off - start_off) / mUpgradeBlockSize + 2; + } + } + + //let's try set default pq & wb + if (upgrade_version == CC_FBC_V02_00_VAL || upgrade_version == CC_FBC_V03_00_VAL) { + if (mUpgradeMode == CC_UPGRADE_MODE_ALL_PQ_WB || mUpgradeMode == CC_UPGRADE_MODE_MAIN_PQ_WB || + mUpgradeMode == CC_UPGRADE_MODE_PQ_WB_ONLY) { + mDataBuf[6] = 3; + upgrade_pq_wb_flag = 1; + } else if (mUpgradeMode == CC_UPGRADE_MODE_MAIN_WB || mUpgradeMode == CC_UPGRADE_MODE_ALL_WB || + mUpgradeMode == CC_UPGRADE_MODE_WB_ONLY) { + mDataBuf[6] = 2; + upgrade_pq_wb_flag = 1; + } else if (mUpgradeMode == CC_UPGRADE_MODE_MAIN_PQ || mUpgradeMode == CC_UPGRADE_MODE_ALL_PQ || + mUpgradeMode == CC_UPGRADE_MODE_PQ_ONLY) { + mDataBuf[6] = 1; + upgrade_pq_wb_flag = 1; + } else { + upgrade_pq_wb_flag = 0; + } + + if (upgrade_pq_wb_flag == 1) { + cmd_len = 7; + mDataBuf[0] = 0x5A; + mDataBuf[1] = 0x5A; + mDataBuf[2] = cmd_len + 4; + mDataBuf[3] = 0x00; + mDataBuf[4] = 0x00; + mDataBuf[5] = CMD_CLR_SETTINGS_DEFAULT; + + AddCRCToDataBuf(mDataBuf, cmd_len); + if (mCfbcIns->sendDataOneway(COMM_DEV_SERIAL, mDataBuf, cmd_len + 4, 0) <= 0) { + mState = STATE_ABORT; + upgrade_err_code = ERR_SERIAL_CONNECT; + mpObserver->onUpgradeStatus(mState, upgrade_err_code); + mCfbcIns->SetUpgradeFlag(0); + + if (mBinFileBuf != NULL) { + delete mBinFileBuf; + mBinFileBuf = NULL; + } + return false; + } + + usleep(3000 * 1000); + + if (mUpgradeMode == CC_UPGRADE_MODE_PQ_WB_ONLY || mUpgradeMode == CC_UPGRADE_MODE_WB_ONLY || + mUpgradeMode == CC_UPGRADE_MODE_PQ_ONLY) { + system("reboot"); + return false; + } + } + } + + //send upgrade command + cmd_len = 10; + mDataBuf[0] = 0x5A; + mDataBuf[1] = 0x5A; + mDataBuf[2] = cmd_len + 4; + mDataBuf[3] = 0x00; + mDataBuf[4] = 0x00; + mDataBuf[5] = 0x01; + mDataBuf[6] = 0x88; + mDataBuf[7] = 0x88; + mDataBuf[8] = 0x88; + mDataBuf[9] = 0x88; + AddCRCToDataBuf(mDataBuf, cmd_len); + if (mCfbcIns->sendDataOneway(COMM_DEV_SERIAL, mDataBuf, cmd_len + 4, 0) <= 0) { + mState = STATE_ABORT; + upgrade_err_code = ERR_SERIAL_CONNECT; + mpObserver->onUpgradeStatus(mState, upgrade_err_code); + mCfbcIns->SetUpgradeFlag(0); + + if (mBinFileBuf != NULL) { + delete mBinFileBuf; + mBinFileBuf = NULL; + } + return false; + } + + //waiting fbc restart + usleep(5000 * 1000); + + if (mUpgradeMode == CC_UPGRADE_MODE_DUMMY) { + //dummy test mode + + //wait 10 second + usleep(10000 * 1000); + + //send reboot command to reboot fbc + sprintf((char *)tmp_buf, "reboot\n"); + cmd_len = strlen((char *)tmp_buf); + mCfbcIns->sendDataOneway(COMM_DEV_SERIAL, tmp_buf, cmd_len, 0); + usleep(400 * 1000); + + mpObserver->onUpgradeStatus(mState, 100); + + usleep(100 * 1000); + mState = STATE_FINISHED; + mpObserver->onUpgradeStatus(mState, 0); + + if (mBinFileBuf != NULL) { + delete mBinFileBuf; + mBinFileBuf = NULL; + } + return false; + } + + tmp_prog += 1; + mpObserver->onUpgradeStatus(mState, tmp_prog * 100 / total_item); + + cur_off = start_off; + old_off = cur_off; + + upgrade_flag = 0; + while (!exitPending()) { //requietexit() or requietexitWait() not call + if (cur_off >= end_off) { + upgrade_flag = 1; + break; + } + + //copy data from file temp buffer + if (end_off - cur_off < mUpgradeBlockSize) { + rw_size = end_off - cur_off; + } else { + rw_size = mUpgradeBlockSize; + } + + memcpy(mDataBuf, mBinFileBuf + cur_off, rw_size); + + //send upgrade start addr and write size + sprintf((char *)tmp_buf, "upgrade 0x%x 0x%x\n", cur_off, rw_size); + LOGD("\n\n%s, %s\n", __FUNCTION__, tmp_buf); + cmd_len = strlen((char *)tmp_buf); + if (mCfbcIns->sendDataOneway(COMM_DEV_SERIAL, tmp_buf, cmd_len, 0) <= 0) { + mState = STATE_ABORT; + upgrade_err_code = ERR_SERIAL_CONNECT; + upgrade_flag = 0; + break; + } + usleep(500 * 1000); + + //send upgrade data + if (mCfbcIns->sendDataOneway(COMM_DEV_SERIAL, mDataBuf, rw_size, 0) <= 0) { + mState = STATE_ABORT; + upgrade_err_code = ERR_SERIAL_CONNECT; + upgrade_flag = 0; + break; + } + + //send upgrade data crc + AddCRCToDataBuf(mDataBuf, rw_size); + if (mCfbcIns->sendDataOneway(COMM_DEV_SERIAL, mDataBuf + rw_size, 4, 0) <= 0) { + mState = STATE_ABORT; + upgrade_err_code = ERR_SERIAL_CONNECT; + upgrade_flag = 0; + break; + } + + old_off = cur_off; + cur_off += rw_size; + + //deal with fbc response + tmp_flag = 0; + memset(mDataBuf, 0, CC_UPGRADE_DATA_BUF_SIZE); + rw_size = mCfbcIns->uartReadStream(mDataBuf, CC_UPGRADE_DATA_BUF_SIZE, 2000); + for (i = 0; i < rw_size - 3; i++) { + if ((0x5A == mDataBuf[i]) && (0x5A == mDataBuf[i + 1]) && (0x5A == mDataBuf[i + 2])) { + LOGD("%s, fbc write data at 0x%x ok!\n", __FUNCTION__, old_off); + tmp_flag = 1; + break; + } + } + + if (tmp_flag == 0) { + LOGE("%s, fbc write data at 0x%x error! rewrite!\n", __FUNCTION__, old_off); + if (upgrade_try_cnt < 6) { + cur_off = old_off; + upgrade_try_cnt += 1; + + mpObserver->onUpgradeStatus(mState, ERR_DATA_CRC_ERROR); + } else { + LOGE("%s, we have rewrite more than %d times, abort.\n", __FUNCTION__, upgrade_try_cnt); + mState = STATE_ABORT; + upgrade_err_code = ERR_SERIAL_CONNECT; + upgrade_flag = 0; + break; + } + } else { + tmp_prog += 1; + upgrade_try_cnt = 0; + } + + usleep(3000 * 1000); + + mpObserver->onUpgradeStatus(mState, tmp_prog * 100 / total_item); + } + + if (mState == STATE_ABORT) { + mpObserver->onUpgradeStatus(mState, upgrade_err_code); + } else if (mState == STATE_RUNNING) { + if (upgrade_flag == 1) { + sprintf((char *)tmp_buf, "reboot\n"); + cmd_len = strlen((char *)tmp_buf); + mCfbcIns->sendDataOneway(COMM_DEV_SERIAL, tmp_buf, cmd_len, 0); + usleep(400 * 1000); + + tmp_prog += 1; + mpObserver->onUpgradeStatus(mState, tmp_prog * 100 / total_item); + + usleep(100 * 1000); + mState = STATE_FINISHED; + mpObserver->onUpgradeStatus(mState, 0); + } + } else { + if (upgrade_flag == 1) { + tmp_prog += 1; + mpObserver->onUpgradeStatus(mState, tmp_prog * 100 / total_item); + } + } + + mState = STATE_STOPED; + + mCfbcIns->SetUpgradeFlag(0); + + if (mBinFileBuf != NULL) { + delete mBinFileBuf; + mBinFileBuf = NULL; + } + + LOGD("%s, exiting...\n", "TV"); + system("reboot"); + //return true, run again, return false,not run. + return false; +} diff --git a/tvapi/libtv/tv/CUpgradeFBC.h b/tvapi/libtv/tv/CUpgradeFBC.h new file mode 100644 index 0000000..7c85e07 --- a/dev/null +++ b/tvapi/libtv/tv/CUpgradeFBC.h @@ -0,0 +1,143 @@ +#ifndef __TV_UPGRADE_FBC_H__ +#define __TV_UPGRADE_FBC_H__ + +#include "CFbcCommunication.h" +#include "../tvutils/CThread.h" + +#define CC_FBC_V01_00_VAL (0x10000000) +#define CC_FBC_V02_00_VAL (0x20000000) +#define CC_FBC_V02_01_VAL (0x20000001) +#define CC_FBC_V03_00_VAL (0x30000000) +#define CC_FBC_V03_01_VAL (0x30000001) + +#define CC_FBC_V01_FILE_SIZE (655360) +#define CC_FBC_V02_FILE_SIZE (786432) +#define CC_FBC_V02_CUR_PQ_BIN_FILE_SIZE (0xB000) +#define CC_FBC_V03_FILE_SIZE (2097152) +#define CC_FBC_V03_CUR_PQ_BIN_FILE_SIZE (0xB000) + +#define CC_UPGRADE_MAX_BLOCK_LEN (0x10000) +#define CC_UPGRADE_DATA_BUF_SIZE (CC_UPGRADE_MAX_BLOCK_LEN + 4) + +#define CC_UPGRADE_MODE_BOOT_MAIN (0) +#define CC_UPGRADE_MODE_BOOT (1) +#define CC_UPGRADE_MODE_MAIN (2) +#define CC_UPGRADE_MODE_COMPACT_BOOT (3) +#define CC_UPGRADE_MODE_ALL (4) + +#define CC_UPGRADE_MODE_MAIN_PQ_WB (5) +#define CC_UPGRADE_MODE_ALL_PQ_WB (6) +#define CC_UPGRADE_MODE_MAIN_WB (7) +#define CC_UPGRADE_MODE_ALL_WB (8) +#define CC_UPGRADE_MODE_MAIN_PQ (9) +#define CC_UPGRADE_MODE_ALL_PQ (10) + +#define CC_UPGRADE_MODE_PQ_WB_ONLY (11) +#define CC_UPGRADE_MODE_WB_ONLY (12) +#define CC_UPGRADE_MODE_PQ_ONLY (13) + +#define CC_UPGRADE_MODE_CUR_PQ_BIN (14) +#define CC_UPGRADE_MODE_ALL_PQ_BIN (15) + +#define CC_UPGRADE_MODE_BURN (16) + +#define CC_UPGRADE_MODE_DUMMY (17) + +#define CC_UPGRADE_V01_BOOT_OFFSET (0x0) +#define CC_UPGRADE_V01_BOOT_LEN (0x20000) +#define CC_UPGRADE_V01_MAIN_OFFSET (0x20000) +#define CC_UPGRADE_V01_MAIN_LEN (CC_FBC_V01_FILE_SIZE - CC_UPGRADE_V01_MAIN_OFFSET) +#define CC_UPGRADE_V01_ALL_LENGTH (CC_FBC_V01_FILE_SIZE) + +#define CC_UPGRADE_V02_COMPACT_BOOT_OFFSET (0x0) +#define CC_UPGRADE_V02_COMPACT_BOOT_LEN (0x10000) +#define CC_UPGRADE_V02_BOOT_OFFSET (0x10000) +#define CC_UPGRADE_V02_BOOT_LEN (0x30000) +#define CC_UPGRADE_V02_MAIN_OFFSET (0x40000) +#define CC_UPGRADE_V02_MAIN_LEN (0x80000) +#define CC_UPGRADE_V02_BOOT_BAK_OFFSET (0xC0000) +#define CC_UPGRADE_V02_BOOT_BAK_LEN (0x30000) +#define CC_UPGRADE_V02_MAIN_BAK_OFFSET (0xF0000) +#define CC_UPGRADE_V02_MAIN_BAK_LEN (0x80000) +#define CC_UPGRADE_V02_ALL_LENGTH (0x170000) + +#define CC_UPGRADE_V02_CUR_PQ_OFFSET (0xAF000) + +#define CC_UPGRADE_V03_COMPACT_BOOT_OFFSET (CC_UPGRADE_V02_COMPACT_BOOT_OFFSET) +#define CC_UPGRADE_V03_COMPACT_BOOT_LEN (CC_UPGRADE_V02_COMPACT_BOOT_LEN) +#define CC_UPGRADE_V03_BOOT_OFFSET (CC_UPGRADE_V02_BOOT_OFFSET) +#define CC_UPGRADE_V03_BOOT_LEN (CC_UPGRADE_V02_BOOT_LEN) +#define CC_UPGRADE_V03_MAIN_OFFSET (CC_UPGRADE_V02_MAIN_OFFSET) +#define CC_UPGRADE_V03_MAIN_LEN (CC_UPGRADE_V02_MAIN_LEN) +#define CC_UPGRADE_V03_BOOT_BAK_OFFSET (CC_UPGRADE_V02_BOOT_BAK_OFFSET) +#define CC_UPGRADE_V03_BOOT_BAK_LEN (CC_UPGRADE_V02_BOOT_BAK_LEN) +#define CC_UPGRADE_V03_MAIN_BAK_OFFSET (CC_UPGRADE_V02_MAIN_BAK_OFFSET) +#define CC_UPGRADE_V03_MAIN_BAK_LEN (CC_UPGRADE_V02_MAIN_BAK_LEN) +#define CC_UPGRADE_V03_PROTECT_DATA_START (0x1FF000) +#define CC_UPGRADE_V03_PROTECT_DATA_LEN (0x1000) +#define CC_UPGRADE_V03_ALL_LENGTH (CC_UPGRADE_V03_PROTECT_DATA_START) + +#define CC_UPGRADE_V03_CUR_PQ_OFFSET (CC_UPGRADE_V02_CUR_PQ_OFFSET) + + +class CUpgradeFBC: public CThread +{ +public: + CUpgradeFBC(); + ~CUpgradeFBC(); + + int start(); + int stop(); + int GetUpgradeFBCProgress(); + int SetUpgradeFileName(char *file_name); + int SetUpgradeFileSize(int file_size); + int SetUpgradeBlockSize(int block_size); + int SetUpgradeMode(int mode); + + class IUpgradeFBCObserver + { + public: + IUpgradeFBCObserver() {}; + virtual ~IUpgradeFBCObserver() {}; + virtual void onUpgradeStatus(int state, int param) {}; + }; + void setObserver(IUpgradeFBCObserver *pOb) + { + mpObserver = pOb; + }; + +private: + bool threadLoop(); + + int AddCRCToDataBuf(unsigned char data_buf[], int data_len); + + int mState; + int mUpgradeMode; + int mOPTotalSize; + int mBinFileSize; + int mUpgradeBlockSize; + unsigned char *mBinFileBuf; + char mFileName[256]; + unsigned char mDataBuf[CC_UPGRADE_DATA_BUF_SIZE]; + IUpgradeFBCObserver *mpObserver; + CFbcCommunication *mCfbcIns; + + enum UpgradeState { + STATE_STOPED = 0, + STATE_RUNNING, + STATE_FINISHED, + STATE_ABORT, + }; + + enum FBCUpgradeErrorCode { + ERR_SERIAL_CONNECT = -1, + ERR_OPEN_BIN_FILE = -2, + ERR_BIN_FILE_SIZE = -3, + ERR_READ_BIN_FILE = -4, + ERR_NOT_SUPPORT_UPGRADE_MDOE = -5, + ERR_NOT_CORRECT_UPGRADE_BLKSIZE = -6, + ERR_DATA_CRC_ERROR = -7, + }; +}; + +#endif //__TV_UPGRADE_FBC_H__ diff --git a/tvapi/libtv/tvconfig/CIniFile.cpp b/tvapi/libtv/tvconfig/CIniFile.cpp new file mode 100644 index 0000000..da448a5 --- a/dev/null +++ b/tvapi/libtv/tvconfig/CIniFile.cpp @@ -0,0 +1,353 @@ +#include <stdio.h> +#include <stdlib.h> +#include <assert.h> +#include <string.h> +#include <ctype.h> + +#include "CIniFile.h" + +CIniFile::CIniFile() +{ + mpFirstSection = NULL; + mpFileName[0] = '\0'; + m_pIniFile = NULL; + mpFirstLine = NULL; +} + +CIniFile::~CIniFile() +{ + LOGD("CIniFile::~CIniFile()"); + FreeAllMem(); +} + +int CIniFile::LoadFromFile(const char *filename) +{ + char lineStr[MAX_INI_FILE_LINE_LEN]; + char *pStr; + LINE *pCurLINE = NULL; + SECTION *pCurSection = NULL; + + FreeAllMem(); + + int Len; + if (filename == NULL) { + return -1; + } + + strcpy(mpFileName, filename); + LOGD("LoadFromFile 2name = %s", mpFileName); + if ((m_pIniFile = fopen (mpFileName, "r")) == NULL) { + return -1; + } + + while (fgets (lineStr, MAX_INI_FILE_LINE_LEN, m_pIniFile) != NULL) { + //去掉多余字符 + allTrim(lineStr); + + LINE *pLINE = new LINE(); + pLINE->pKeyStart = pLINE->Text; + pLINE->pKeyEnd = pLINE->Text; + pLINE->pValueStart = pLINE->Text; + pLINE->pValueEnd = pLINE->Text; + pLINE->pNext = NULL; + pLINE->type = getLineType(lineStr); + //LOGD("getline=%s len=%d type=%d", lineStr, strlen(lineStr), pLINE->type); + strcpy(pLINE->Text, lineStr); + pLINE->LineLen = strlen(pLINE->Text); + + //head + if (mpFirstLine == NULL) { + mpFirstLine = pLINE; + } else { + pCurLINE->pNext = pLINE; + } + + pCurLINE = pLINE; + + switch (pCurLINE->type) { + case LINE_TYPE_SECTION: { + SECTION *pSec = new SECTION(); + pSec->pLine = pLINE; + pSec->pNext = NULL; + if (mpFirstSection == NULL) { //first section + mpFirstSection = pSec; + } else { + pCurSection->pNext = pSec; + } + pCurSection = pSec; + break; + } + case LINE_TYPE_KEY: { + char *pM = strchr(pCurLINE->Text, '='); + pCurLINE->pKeyStart = pCurLINE->Text; + pCurLINE->pKeyEnd = pM - 1; + pCurLINE->pValueStart = pM + 1; + pCurLINE->pValueEnd = pCurLINE->Text + pCurLINE->LineLen - 1; + break; + } + case LINE_TYPE_COMMENT: { + break; + } + default: { + break; + } + } + } + + fclose (m_pIniFile); + m_pIniFile = NULL; + + return 0; +} + +void CIniFile::printAll() +{ + //line + for (LINE *pline = mpFirstLine; pline != NULL; pline = pline->pNext) { + LOGD("line = %s type = %d", pline->Text, pline->type); + } + + //section + for (SECTION *psec = mpFirstSection; psec != NULL; psec = psec->pNext) { + LOGD("sec = %s", psec->pLine->Text); + } + return; +} + +int CIniFile::LoadFromString(const char *str) +{ + return 0; +} + +int CIniFile::SaveToFile(const char *filename) +{ + const char *file = NULL; + if (m_pIniFile != NULL) { + fclose (m_pIniFile); + } + + if (filename == NULL) { + if (strlen(mpFileName) == 0) { + LOGD("error save file is null"); + return -1; + } else { + file = mpFileName; + } + } else { + file = filename; + } + //LOGD("Save to file name = %s", file); + + if ((m_pIniFile = fopen (file, "wb")) == NULL) { + LOGD("Save to file open error = %s", file); + return -1; + } + + LINE *pCurLine = NULL; + for (pCurLine = mpFirstLine; pCurLine != NULL; pCurLine = pCurLine->pNext) { + fprintf (m_pIniFile, "%s\r\n", pCurLine->Text); + } + + fflush(m_pIniFile); + fsync(fileno(m_pIniFile)); + + fclose(m_pIniFile); + m_pIniFile = NULL; + return 0; +} + +//暂不插入操作 +int CIniFile::SetString(const char *section, const char *key, const char *value) +{ + SECTION *pNewSec = NULL; + LINE *pNewSecLine = NULL; + LINE *pNewKeyLine = NULL; + + SECTION *pSec = getSection(section); + if (pSec == NULL) { + pNewSec = new SECTION(); + pNewSecLine = new LINE(); + pNewKeyLine = new LINE(); + + pNewKeyLine->type = LINE_TYPE_KEY; + pNewSecLine->type = LINE_TYPE_SECTION; + + + sprintf(pNewSecLine->Text, "[%s]", section); + pNewSec->pLine = pNewSecLine; + + InsertSection(pNewSec); + + int keylen = strlen(key); + sprintf(pNewKeyLine->Text, "%s=%s", key, value); + pNewKeyLine->LineLen = strlen(pNewKeyLine->Text); + pNewKeyLine->pKeyStart = pNewKeyLine->Text; + pNewKeyLine->pKeyEnd = pNewKeyLine->pKeyStart + keylen - 1; + pNewKeyLine->pValueStart = pNewKeyLine->pKeyStart + keylen + 1; + pNewKeyLine->pValueEnd = pNewKeyLine->Text + pNewKeyLine->LineLen - 1; + + InsertKeyLine(pNewSec, pNewKeyLine); + + } else { //find section + LINE *pLine = getKeyLineAtSec(pSec, key); + if (pLine == NULL) { //, not find key + pNewKeyLine = new LINE(); + pNewKeyLine->type = LINE_TYPE_KEY; + + int keylen = strlen(key); + sprintf(pNewKeyLine->Text, "%s=%s", key, value); + pNewKeyLine->LineLen = strlen(pNewKeyLine->Text); + pNewKeyLine->pKeyStart = pNewKeyLine->Text; + pNewKeyLine->pKeyEnd = pNewKeyLine->pKeyStart + keylen - 1; + pNewKeyLine->pValueStart = pNewKeyLine->pKeyStart + keylen + 1; + pNewKeyLine->pValueEnd = pNewKeyLine->Text + pNewKeyLine->LineLen - 1; + + InsertKeyLine(pSec, pNewKeyLine); + } else { //all find, change it + sprintf(pLine->Text, "%s=%s", key, value); + pLine->LineLen = strlen(pLine->Text); + pLine->pValueEnd = pLine->Text + pLine->LineLen - 1; + } + } + + //save + SaveToFile(NULL); + return 0; +} +int CIniFile::SetInt(const char *section, const char *key, int value) +{ + char tmp[64]; + sprintf(tmp, "%d", value); + SetString(section, key, tmp); + return 0; +} +const char *CIniFile::GetString(const char *section, const char *key, const char *def_value) +{ + SECTION *pSec = getSection(section); + if (pSec == NULL) return def_value; + LINE *pLine = getKeyLineAtSec(pSec, key); + if (pLine == NULL) return def_value; + + return pLine->pValueStart; +} +int CIniFile::GetInt(const char *section, const char *key, int def_value) +{ + const char *num = GetString(section, key, NULL); + if (num != NULL) { + return atoi(num); + } + return def_value; +} + + +LINE_TYPE CIniFile::getLineType(char *Str) +{ + LINE_TYPE type = LINE_TYPE_COMMENT; + //只要有#,就是注释 + if (strchr(Str, '#') != NULL) { + type = LINE_TYPE_COMMENT; + } else if ( (strstr (Str, "[") != NULL) && (strstr (Str, "]") != NULL) ) { /* Is Section */ + type = LINE_TYPE_SECTION; + } else { + if (strstr (Str, "=") != NULL) { + type = LINE_TYPE_KEY; + } else { + type = LINE_TYPE_COMMENT; + } + } + return type; +} + +void CIniFile::FreeAllMem() +{ + //line + LINE *pCurLine = NULL; + LINE *pNextLine = NULL; + for (pCurLine = mpFirstLine; pCurLine != NULL;) { + pNextLine = pCurLine->pNext; + delete pCurLine; + pCurLine = pNextLine; + } + mpFirstLine = NULL; + //section + SECTION *pCurSec = NULL; + SECTION *pNextSec = NULL; + for (pCurSec = mpFirstSection; pCurSec != NULL;) { + pNextSec = pCurSec->pNext; + delete pCurSec; + pCurSec = pNextSec; + } + mpFirstSection = NULL; +} + +int CIniFile::InsertSection(SECTION *pSec) +{ + //insert it to sections list ,as first section + pSec->pNext = mpFirstSection; + mpFirstSection = pSec; + //insert it to lines list, at first + pSec->pLine->pNext = mpFirstLine; + mpFirstLine = pSec->pLine; + return 0; +} +int CIniFile::InsertKeyLine(SECTION *pSec, LINE *line) +{ + LINE *line1 = pSec->pLine; + LINE *line2 = line1->pNext; + line1->pNext = line; + line->pNext = line2; + return 0; +} +SECTION *CIniFile::getSection(const char *section) +{ + //section + for (SECTION *psec = mpFirstSection; psec != NULL; psec = psec->pNext) { + if (strncmp((psec->pLine->Text) + 1, section, strlen(section)) == 0) + return psec; + } + return NULL; +} +LINE *CIniFile::getKeyLineAtSec(SECTION *pSec, const char *key) +{ + //line + for (LINE *pline = pSec->pLine->pNext; (pline != NULL && pline->type != LINE_TYPE_SECTION); pline = pline->pNext) { + if (pline->type == LINE_TYPE_KEY) { + if (strncmp(pline->Text, key, strlen(key)) == 0) + return pline; + } + } + return NULL; +} +//去掉串里面的,空格,回车,换行,s指向转换处理后的串的开头 +void CIniFile::allTrim(char *Str) +{ + //去掉换行 + char *pStr; + pStr = strchr (Str, '\n'); + if (pStr != NULL) { + *pStr = 0; + } + //去掉尾部回车 + int Len = strlen(Str); + if ( Len > 0 ) { + if ( Str[Len - 1] == '\r' ) { + Str[Len - 1] = '\0'; + } + } + //去掉空格 + pStr = Str; + while (*pStr != '\0') { //没到尾部 + if (*pStr == ' ') { //遇到空格 + char *pTmp = pStr;//从空格处开始 + while (*pTmp != '\0') { + *pTmp = *(pTmp + 1);//前移,包括移最后结束符 + pTmp++; + } + } else { + pStr++; + } + } + return; +} + + diff --git a/tvapi/libtv/tvconfig/CIniFile.h b/tvapi/libtv/tvconfig/CIniFile.h new file mode 100644 index 0000000..95ffd65 --- a/dev/null +++ b/tvapi/libtv/tvconfig/CIniFile.h @@ -0,0 +1,73 @@ +#ifndef INI_FILE_H_ +#define INI_FILE_H_ +/* + *vertion 0.01, just linux 8bit byte string, write by showbo + */ +#include <CTvLog.h> + +static const int MAX_INI_FILE_LINE_LEN = 512; + +typedef enum _LINE_TYPE { + LINE_TYPE_SECTION = 0, + LINE_TYPE_KEY, + LINE_TYPE_COMMENT, +} LINE_TYPE; + +//基于链表结构 + +//行链表,去掉多余的空格和回车,换行后. +typedef struct _LINE { + LINE_TYPE type;//类型 + char Text[MAX_INI_FILE_LINE_LEN];//内容 + int LineLen; + char *pKeyStart; + char *pKeyEnd; + char *pValueStart; + char *pValueEnd; + struct _LINE *pNext; +} LINE; +//段链表 +typedef struct _SECTION { + LINE *pLine; + struct _SECTION *pNext; +} SECTION; + + +class CIniFile +{ +public: + //const int MAX_SECTION_NAME_LEN = 16; + //const int MAX_KEY_NAME_LEN = 64; + //const int MAX_VALUE_LEN = 512; + + CIniFile(); + ~CIniFile(); + int LoadFromFile(const char *filename); + int LoadFromString(const char *str); + + int SaveToFile(const char *filename = NULL); + + int SetString(const char *section, const char *key, const char *value); + int SetInt(const char *section, const char *key, int value); + + const char *GetString(const char *section, const char *key, const char *def_value); + int GetInt(const char *section, const char *key, int def_value); + + void printAll(); +private: + LINE_TYPE getLineType(char *Str); + //去掉串里面的,空格,回车,换行,s指向转换处理后的串的开头 + void allTrim(char *Str); + + SECTION *getSection(const char *section); + LINE *getKeyLineAtSec(SECTION *pSec, const char *key); + + void FreeAllMem(); + int InsertSection(SECTION *pSec); + int InsertKeyLine(SECTION *pSec, LINE *line); + char mpFileName[256]; + FILE *m_pIniFile; + LINE *mpFirstLine; + SECTION *mpFirstSection; +}; +#endif //end of INI_FILE_H_ diff --git a/tvapi/libtv/tvconfig/tvconfig.conf b/tvapi/libtv/tvconfig/tvconfig.conf new file mode 100644 index 0000000..d18fbca --- a/dev/null +++ b/tvapi/libtv/tvconfig/tvconfig.conf @@ -0,0 +1,30 @@ +#ssm configure +ro.tv.ssm.device_01_cfg = e2prom,/dev/i2c-0,0x1000,0,0xFFF,0x20,0x20,0x50,1,-1 +ssm.writeprotect.gpio = b,8,1 + +#audio config +audio.tv.card.id = hw:AMLM2 +audio.tv.card.name = AML-M2 +audio.amp.analog.mute.gpio = b,8,1 +audio.headset.mute.gpio = x,30,1 +audio.avout.mute.gpio = x,69,0 +audio.initaudio.gpioctl = b,8,1,x,30,0,b,5,1,x,69,1,x,68,0,x,67,1,x,66,0,x,65,1,x,64,0,x,63,1,x,62,0,x,61,1,x,60,0,x,59,1,x,58,0,x,57,1,x,56,0,x,55,1,x,54,0,x,53,1,x,52,0,x,51,1,x,50,0,x,49,1,x,48,0,x,47,1,x,46,0,x,45,1,x,44,0,x,43,1,x,42,0,x,41,1,x,40,0,x,39,0,x,38,0,x,37,1,x,36,0,x,35,1,x,34,0,x,33,1,x,32,0,x,31,1,x,30,0,x,29,1,x,28,0,x,27,1,x,26,0,x,25,1,x,24,0,x,23,1,x,22,0,x,21,1,x,20,0,x,19,1,x,18,0,x,17,1,x,16,0,x,15,1,x,14,0,x,13,1,x,12,0,x,11,1,x,10,0,x,9,1,x,8,0 +audio.amplifier.biquad00.data = 0x04, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,0x80, 0xC4, 0x96, 0x7F, 0x3B, 0x6A, 0x7F, 0x3A, 0xD3, 0x81, 0x87, 0xFD, 0x3F, 0x9D, 0xB5,0x8D, 0x18, 0x8C, 0x67, 0x10, 0x01, 0x72, 0xE7, 0x74, 0x96, 0x03, 0x40, 0x41, 0x76, 0x5F,0xAC, 0xE8, 0xCE, 0x32, 0x55, 0xB8, 0x53, 0x17, 0x32, 0xC1, 0xEA, 0x5F, 0x45, 0xDF, 0xF4, +audio.amplifier.biquad01.data = 0x04, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,0x8D, 0x18, 0x8C, 0x67, 0x10, 0x01, 0x72, 0xE7, 0x74, 0x96, 0x03, 0x40, 0x41, 0x76, 0x5F,0xAC, 0xE8, 0xCE, 0x32, 0x55, 0xB8, 0x53, 0x17, 0x32, 0xC1, 0xEA, 0x5F, 0x45, 0xDF, 0xF4, + +#tvin config +tvin.log.cfg = log_error,log_debug + +#vpp config +vpp.log.cfg = log_error,log_debug + +#misc config +misc.log.cfg = log_error,log_debug +misc.lastselsrc.show.cfg = TV,AV1,AV2,YPBPR1,YPBPR2,HDMI1,HDMI1,HDMI2,VGA,MPEG,DTV + +#tvservice config +tvservice.log.cfg = log_error + +#atv config +atv.fac.defchaninfo = 13,8,49750000,0,1,0,0,0,0,0,136250000,2,1,0,0,0,0,0,160250000,0,1,0,0,0,0,0,168250000,0,1,0,0,0,0,0,416250000,0,1,0,0,0,0,0,456250000,1,1,0,0,0,0,0,471250000,3,2,0,0,0,0,0,863250000,0,1,0,0,0,0,0,49750000,0,1,0,0,0,0,0,217250000,2,1,0,0,0,0,0,471250000,3,2,0,0,0,0,0,527250000,1,1,0,0,0,0,0,783250000,0,1,0,0,0,0,0, +atv.log.cfg = log_error,log_channelsearch_error,log_channelsearch_debug,log_channelselect_error,log_channelselect_debug
\ No newline at end of file diff --git a/tvapi/libtv/tvconfig/tvconfig.cpp b/tvapi/libtv/tvconfig/tvconfig.cpp new file mode 100644 index 0000000..4d45735 --- a/dev/null +++ b/tvapi/libtv/tvconfig/tvconfig.cpp @@ -0,0 +1,53 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include "tvconfig.h" + +#define LOG_TAG "TVCONFIG" +#include "CTvLog.h" +#include "CIniFile.h" +static const char *TV_SECTION = "TV"; +//INI_CONFIG* mpConfig = NULL; +static char mpFilePath[256] = {0}; + +static CIniFile *pIniFile = NULL; +int tv_config_load(const char *file_name) +{ + if (pIniFile != NULL) + delete pIniFile; + + pIniFile = new CIniFile(); + pIniFile->LoadFromFile(file_name); + strcpy(mpFilePath, file_name); + return 0; +} + +int tv_config_unload() +{ + if (pIniFile != NULL) + delete pIniFile; + return 0; +} + + +int config_set_str(const char *section, const char *key, const char *value) +{ + return pIniFile->SetString(section, key, value); +} + +const char *config_get_str(const char *section, const char *key, const char *def_value) +{ + return pIniFile->GetString(section, key, def_value); +} + +int config_get_int(const char *section, const char *key, const int def_value) +{ + return pIniFile->GetInt(section, key, def_value); +} + +int config_set_int(const char *section, const char *key, const int value) +{ + pIniFile->SetInt(section, key, value); + return 0; +} diff --git a/tvapi/libtv/tvconfig/tvconfig.h b/tvapi/libtv/tvconfig/tvconfig.h new file mode 100644 index 0000000..f2cf316 --- a/dev/null +++ b/tvapi/libtv/tvconfig/tvconfig.h @@ -0,0 +1,20 @@ +#ifndef __TVCONFIG_API_H__ +#define __TVCONFIG_API_H__ + +#define CC_CFG_KEY_STR_MAX_LEN (128) +#define CC_CFG_VALUE_STR_MAX_LEN (512) + + +extern int tv_config_load(const char *file_name); +extern int tv_config_unload(); +extern int tv_config_save(); + +//[TV] section + +extern int config_set_str(const char *section, const char *key, const char *value); +extern const char *config_get_str(const char *section, const char *key, const char *def_value); +extern int config_get_int(const char *section, const char *key, const int def_value); +extern int config_set_int(const char *section, const char *key, const int value); + + +#endif //__TVCONFIG_API_H__ diff --git a/tvapi/libtv/tvdb/CTvChannel.cpp b/tvapi/libtv/tvdb/CTvChannel.cpp new file mode 100644 index 0000000..d39d025 --- a/dev/null +++ b/tvapi/libtv/tvdb/CTvChannel.cpp @@ -0,0 +1,347 @@ +// +// +// amlogic 2013 +// +// @ Project : tv +// @ File Name : CTvChannel.cpp +// @ Date : 2013-11 +// @ Author : +// +// + + +#include "CTvChannel.h" + +#ifdef LOG_TAG +#undef LOG_TAG +#define LOG_TAG "CTvChannel" +#endif + +void CTvChannel::createFromCursor(CTvDatabase::Cursor &c) +{ + int col; + int src, freq, mod, symb, bw, satid, satpolar; + + col = c.getColumnIndex("db_id"); + this->id = c.getInt(col); + + col = c.getColumnIndex("ts_id"); + this->dvbTSID = c.getInt(col); + + col = c.getColumnIndex("src"); + src = c.getInt(col); + + col = c.getColumnIndex("freq"); + freq = c.getInt(col); + + if (src == MODE_QAM) { + col = c.getColumnIndex("mod"); + mod = c.getInt(col); + + col = c.getColumnIndex("symb"); + symb = c.getInt(col); + + frequency = freq; + modulation = mod; + symbolRate = symb; + mode = MODE_QAM; + + } else if (src == MODE_OFDM) { + col = c.getColumnIndex("bw"); + bw = c.getInt(col); + + frequency = freq; + bandwidth = bw; + mode = MODE_OFDM; + + } else if (src == MODE_ATSC) { + col = c.getColumnIndex("mod"); + mod = c.getInt(col); + + frequency = freq; + modulation = mod; + mode = MODE_ATSC; + } else if (src == MODE_ANALOG) { + col = c.getColumnIndex("std"); + int std = c.getInt(col); + col = c.getColumnIndex("aud_mode"); + int aud_mode = c.getInt(col); + col = c.getColumnIndex("flags"); + int afc_flag = c.getInt(col); + + frequency = freq; + audio = aud_mode; + standard = std; + afc_data = afc_flag; + mode = MODE_ANALOG; + } else if (src == MODE_QPSK) { + col = c.getColumnIndex("symb"); + symb = c.getInt(col); + + col = c.getColumnIndex("db_sat_para_id"); + satid = c.getInt(col); + + col = c.getColumnIndex("polar"); + satpolar = c.getInt(col); + + frequency = freq; + symbolRate = symb; + sat_id = satid; + sat_polarisation = satpolar; + mode = MODE_QPSK; + + /*new tv_satparams*/ + //showboz + //TVSatellite sat = TVSatellite.tvSatelliteSelect(sat_id); + //tv_satparams = sat.getParams(); + } else if (src == MODE_DTMB) { + col = c.getColumnIndex("bw"); + bw = c.getInt(col); + + frequency = freq; + bandwidth = bw; + mode = MODE_DTMB; + } + + this->fendID = 0; +} + + +CTvChannel::CTvChannel() +{ + +} + +CTvChannel::CTvChannel(int dbID, int mode, int freq, int bw, int mod, int symb, int ofdm, int channelNum) +{ + //other member not init,just a paras + if (mode == MODE_QAM) { + id = dbID; + frequency = freq; + modulation = mod; + symbolRate = symb; + mode = MODE_QAM; + } else if (mode == MODE_OFDM) { + id = dbID; + frequency = freq; + bandwidth = bw; + mode = MODE_OFDM; + } else if (mode == MODE_ATSC) { + id = dbID; + frequency = freq; + modulation = mod; + logicalChannelNum = channelNum; + mod = MODE_ATSC; + } else if (mode == MODE_ANALOG) { + id = dbID; + frequency = freq; + audio = 0; + standard = 0; + afc_data = 0; + mode = MODE_ANALOG; + } else if (mode == MODE_DTMB) { + id = dbID; + frequency = freq; + bandwidth = bw; + mode = MODE_DTMB; + } +} + +CTvChannel::~CTvChannel() +{ + +} + +Vector<CTvChannel> CTvChannel::tvChannelList(int sat_id) +{ + Vector<CTvChannel> v_channel; + return v_channel; +} + +int CTvChannel::selectByID(int cid, CTvChannel &channel) +{ + String8 cmd = String8("select * from ts_table where ts_table.db_id = ") + String8::format("%d", cid); + CTvDatabase::Cursor c; + CTvDatabase::GetTvDb()->select(cmd, c); + + if (c.moveToFirst()) { + channel.createFromCursor(c); + } else { + c.close(); + return -1; + } + c.close(); + + return 0; +} + +int CTvChannel::SelectByFreq(int freq, CTvChannel &channel) +{ + String8 cmd ; + CTvDatabase::Cursor c; + int iOutRet = 0; + + do { + cmd = String8("select * from ts_table where ts_table.freq = ") + String8::format("%d", freq); + CTvDatabase::GetTvDb()->select(cmd, c); + + if (c.moveToFirst()) { + channel.createFromCursor(c); + } else { + iOutRet = -1; + break; + } + + cmd = String8("delete from ts_table where ts_table.freq = ") + String8::format("%d", freq); + CTvDatabase::GetTvDb()->exeSql(cmd.string()); + } while (false); + + c.close(); + return iOutRet; +} + +int CTvChannel::DeleteBetweenFreq(int beginFreq, int endFreq) +{ + String8 cmd ; + CTvDatabase::Cursor c; + int iOutRet = 0; + CTvChannel channel; + + do { + cmd = String8("select * from ts_table where ts_table.freq >= ") + String8::format("%d", beginFreq) + + String8("and ts_table.freq <= ") + String8::format("%d", endFreq); + CTvDatabase::GetTvDb()->select(cmd, c); + if (c.moveToFirst()) { + do { + channel.createFromCursor(c); + cmd = String8("delete from ts_table where ts_table.freq = ") + String8::format("%d", channel.frequency); + CTvDatabase::GetTvDb()->exeSql(cmd.string()); + } while (c.moveToNext()); + } else { + iOutRet = -1; + break; + } + + } while (false); + + c.close(); + return iOutRet; +} + +int CTvChannel::CleanAllChannelBySrc(int src) +{ + String8 cmd = String8("delete from ts_table where src = ") + String8::format("%d", src); + CTvDatabase::GetTvDb()->exeSql(cmd.string()); + return 0; +} + +int CTvChannel::getChannelListBySrc(int src, Vector< sp<CTvChannel> > &v_channel) +{ + CTvDatabase::Cursor c; + CTvChannel *channel; + do { + String8 cmd = String8("select * from ts_table where src = ") + String8::format("%d", src); + CTvDatabase::GetTvDb()->select(cmd, c); + if (c.moveToFirst()) { + do { + channel = new CTvChannel(); + channel->createFromCursor(c); + v_channel.add(channel); + } while (c.moveToNext()); + } else { + break; + } + } while (false); + + return 0; +} +int CTvChannel::updateByID(int progID, int std, int freq, int fineFreq) +{ + + String8 cmd = String8("update ts_table set std = ") + String8::format("%d", std) + + String8(", freq = ") + String8::format("%d", freq) + + String8(", flags = ") + String8::format("%d", fineFreq) + + String8(" where ts_table.db_id = ") + String8::format("%d", progID); + LOGD("%s, cmd = %s\n", "TV", cmd.string()); + CTvDatabase::GetTvDb()->exeSql(cmd.string()); + + return 0; +} + + +void CTvChannel::tvChannelDel() +{ + +} + +void CTvChannel::tvChannelDelBySatID(int id) +{ + +} + +int CTvChannel::getDVBTSID() +{ + return dvbTSID; +} + +void CTvChannel::getDVBOrigNetID() +{ + +} + +void CTvChannel::getFrontendID() +{ + +} + +void CTvChannel::getTSSourceID() +{ + +} + + +void CTvChannel::isDVBCMode() +{ + +} + +void CTvChannel::setFrequency() +{ + +} + +void CTvChannel::setSymbolRate() +{ + +} + +void CTvChannel::setPolarisation() +{ + +} + +void CTvChannel::setATVAudio() +{ + +} + +void CTvChannel::setATVVideoFormat() +{ + +} + +void CTvChannel::setATVAudioFormat() +{ + +} + +void CTvChannel::setATVFreq() +{ + +} + +void CTvChannel::setATVAfcData() +{ + +} + diff --git a/tvapi/libtv/tvdb/CTvChannel.h b/tvapi/libtv/tvdb/CTvChannel.h new file mode 100644 index 0000000..2912203 --- a/dev/null +++ b/tvapi/libtv/tvdb/CTvChannel.h @@ -0,0 +1,288 @@ +// +// +// amlogic 2013 +// +// @ Project : tv +// @ File Name : CTvChannel.h +// @ Date : 2013-11 +// @ Author : +// +// + + +#if !defined(_CTVCHANNEL_H) +#define _CTVCHANNEL_H +#include <utils/Vector.h> +#include "CTvDatabase.h" +#include <utils/String8.h> +#include <utils/RefBase.h> +#include <stdlib.h> + +#include "CTvLog.h" +using namespace android; +// ӦģеһƵ㣬ֵеһƵƵTS +class CTvChannel: public LightRefBase<CTvChannel> +{ + +public : + static const int FE_HAS_SIGNAL = 0x01; + static const int FE_HAS_CARRIER = 0x02; + static const int FE_HAS_VITERBI = 0x04; + static const int FE_HAS_SYNC = 0x08; + /***/ + static const int FE_HAS_LOCK = 0x10; + /**ʱ*/ + static const int FE_TIMEDOUT = 0x20; + static const int FE_REINIT = 0x40; + + /**QPSKģʽ*/ + static const int MODE_QPSK = 0; + /**QAMģʽ*/ + static const int MODE_QAM = 1; + /**OFDMģʽ*/ + static const int MODE_OFDM = 2; + /**ATSCģʽ*/ + static const int MODE_ATSC = 3; + /**ģģʽ*/ + static const int MODE_ANALOG = 4; + /**DTMBģʽ*/ + static const int MODE_DTMB = 5; + + + /**8MHz*/ + static const int BANDWIDTH_8_MHZ = 0; + /**7MHz*/ + static const int BANDWIDTH_7_MHZ = 1; + /**6MHz*/ + static const int BANDWIDTH_6_MHZ = 2; + /**Զ*/ + static const int BANDWIDTH_AUTO = 3; + /**5MHZ*/ + static const int BANDWIDTH_5_MHZ = 4; + /**10MHZ*/ + static const int BANDWIDTH_10_MHZ = 5; + + /**QPSK*/ + static const int MODULATION_QPSK = 0; + /**QAM16*/ + static const int MODULATION_QAM_16 = 1; + /**QAM32*/ + static const int MODULATION_QAM_32 = 2; + /**QAM64*/ + static const int MODULATION_QAM_64 = 3; + /**QAM128*/ + static const int MODULATION_QAM_128 = 4; + /**QAM256*/ + static const int MODULATION_QAM_256 = 5; + /**QAM(Զ)*/ + static const int MODULATION_QAM_AUTO = 6; + /**VSB8*/ + static const int MODULATION_VSB_8 = 7; + /**VSB16*/ + static const int MODULATION_VSB_16 = 8; + /**PSK8*/ + static const int MODULATION_PSK_8 = 9; + /**APSK16*/ + static const int MODULATION_APSK_16 = 10; + /**APSK32*/ + static const int MODULATION_APSK_32 = 11; + /**DQPSK*/ + static const int MODULATION_DQPSK = 12; + + /***/ + static const int AUDIO_MONO = 0x0000; + /***/ + static const int AUDIO_STEREO = 0x0001; + /**2*/ + static const int AUDIO_LANG2 = 0x0002; + /**SAP*/ + static const int AUDIO_SAP = 0x0002; + /**1*/ + static const int AUDIO_LANG1 = 0x0003; + /**1/2*/ + static const int AUDIO_LANG1_LANG2 = 0x0004; + + /**PAL B*/ + static const int STD_PAL_B = 0x00000001; + /**PAL B1*/ + static const int STD_PAL_B1 = 0x00000002; + /**PAL G*/ + static const int STD_PAL_G = 0x00000004; + /**PAL H*/ + static const int STD_PAL_H = 0x00000008; + /**PAL I*/ + static const int STD_PAL_I = 0x00000010; + /**PAL D*/ + static const int STD_PAL_D = 0x00000020; + /**PAL D1*/ + static const int STD_PAL_D1 = 0x00000040; + /**PAL K*/ + static const int STD_PAL_K = 0x00000080; + /**PAL M*/ + static const int STD_PAL_M = 0x00000100; + /**PAL N*/ + static const int STD_PAL_N = 0x00000200; + /**PAL Nc*/ + static const int STD_PAL_Nc = 0x00000400; + /**PAL 60*/ + static const int STD_PAL_60 = 0x00000800; + /**NTSC M*/ + static const int STD_NTSC_M = 0x00001000; + /**NTSC M JP*/ + static const int STD_NTSC_M_JP = 0x00002000; + /**NTSC 443*/ + static const int STD_NTSC_443 = 0x00004000; + /**NTSC M KR*/ + static const int STD_NTSC_M_KR = 0x00008000; + /**SECAM B*/ + static const int STD_SECAM_B = 0x00010000; + /**SECAM D*/ + static const int STD_SECAM_D = 0x00020000; + /**SECAM G*/ + static const int STD_SECAM_G = 0x00040000; + /**SECAM H*/ + static const int STD_SECAM_H = 0x00080000; + /**SECAM K*/ + static const int STD_SECAM_K = 0x00100000; + /**SECAM K1*/ + static const int STD_SECAM_K1 = 0x00200000; + /**SECAM L*/ + static const int STD_SECAM_L = 0x00400000; + /**SECAM LC*/ + static const int STD_SECAM_LC = 0x00800000; + /**ATSC VSB8*/ + static const int STD_ATSC_8_VSB = 0x01000000; + /**ATSC VSB16*/ + static const int STD_ATSC_16_VSB = 0x02000000; + /**NTSC*/ + static const int STD_NTSC = STD_NTSC_M | STD_NTSC_M_JP | STD_NTSC_M_KR; + /**SECAM DK*/ + static const int STD_SECAM_DK = STD_SECAM_D | STD_SECAM_K | STD_SECAM_K1; + /**SECAM*/ + static const int STD_SECAM = STD_SECAM_B | STD_SECAM_G | STD_SECAM_H | STD_SECAM_DK | STD_SECAM_L | STD_SECAM_LC; + /**PAL BG*/ + static const int STD_PAL_BG = STD_PAL_B | STD_PAL_B1 | STD_PAL_G; + /**PAL DK*/ + static const int STD_PAL_DK = STD_PAL_D | STD_PAL_D1 | STD_PAL_K; + /**PAL*/ + static const int STD_PAL = STD_PAL_BG | STD_PAL_DK | STD_PAL_H | STD_PAL_I; + + //static const int TUNER_STD_MN = STD_PAL_M|STD_PAL_N|STD_PAL_Nc| STD_NTSC + static const int STD_B = STD_PAL_B | STD_PAL_B1 | STD_SECAM_B; + static const int STD_GH = STD_PAL_G | STD_PAL_H | STD_SECAM_G | STD_SECAM_H; + static const int STD_DK = STD_PAL_DK | STD_SECAM_DK; + static const int STD_M = STD_PAL_M | STD_NTSC_M; + static const int STD_BG = STD_PAL_BG | STD_SECAM_B | STD_SECAM_G ; + + static const int COLOR_AUTO = 0x02000000; + static const int COLOR_PAL = 0x04000000; + static const int COLOR_NTSC = 0x08000000; + static const int COLOR_SECAM = 0x10000000; + + /**ˮƽ*/ + static const int SAT_POLARISATION_H = 0; + /**ֱ*/ + static const int SAT_POLARISATION_V = 1; + +public: + CTvChannel(); + CTvChannel(int dbID, int mode, int freq, int bw, int mod, int sym, int ofdm, int channelNum); + ~CTvChannel(); + // TVChannelParams,ݿһChannel + + // *ǰͨ + // *@param sat_id id + // *@return شͨ + static Vector<CTvChannel> tvChannelList(int sat_id); + static int selectByID(int id, CTvChannel &c); + static int updateByID(int progID, int std, int freq, int fineFreq); + static int SelectByFreq(int freq, CTvChannel &channel); + static int DeleteBetweenFreq(int beginFreq, int endFreq); + static int CleanAllChannelBySrc(int src); + static int getChannelListBySrc(int src, Vector< sp<CTvChannel> > &v_channel); + void tvChannelDel(); + static void tvChannelDelBySatID(int id); + int getID() + { + return id; + }; + int getDVBTSID(); + void getDVBOrigNetID(); + void getFrontendID(); + void getTSSourceID(); + void isDVBCMode(); + void setFrequency(); + int getFrequency() + { + return frequency; + } + int getSymbolRate() + { + return symbolRate; + } + int getModulation() + { + return modulation; + } + int getBandwidth() + { + return bandwidth; + } + int getMode() + { + return mode; + } + + int getStd() + { + return standard; + }; + int getAfcData() + { + return afc_data; + }; + int getLogicalChannelNum() + { + return logicalChannelNum; + }; + // ÷(QPSK/QAMģʽ) + // @param symbolRate + void setSymbolRate(); + // ü(QPSKģʽ) + void setPolarisation(); + void setATVAudio(); + // ģƵʽ + void setATVVideoFormat(); + void setATVAudioFormat(); + void setATVFreq(); + void setATVAfcData(); + // +private: + + void createFromCursor(CTvDatabase::Cursor &c); + + // + int id; + int dvbTSID; + int dvbOrigNetID; + int fendID; + int tsSourceID; + + int mode; + int frequency; + int symbolRate; + int modulation; + int bandwidth; + int audio; + int standard; + int afc_data; + int sat_id; + int logicalChannelNum; + //showboz + //public TVSatelliteParams tv_satparams; + int sat_polarisation; + +}; + +#endif //_CTVCHANNEL_H + diff --git a/tvapi/libtv/tvdb/CTvDatabase.cpp b/tvapi/libtv/tvdb/CTvDatabase.cpp new file mode 100644 index 0000000..9b8698b --- a/dev/null +++ b/tvapi/libtv/tvdb/CTvDatabase.cpp @@ -0,0 +1,259 @@ +// +// +// amlogic 2013 +// +// @ Project : tv +// @ File Name : CTvDatabase.cpp +// @ Date : 2013-11 +// @ Author : +// +// +#include <assert.h> +#include <tinyxml.h> +#include "CTvDatabase.h" +#include "tvutils/tvutils.h" +#include "../tvconfig/tvconfig.h" + +#ifdef LOG_TAG +#undef LOG_TAG +#define LOG_TAG "CTvDatabase" +#endif + +const char *CTvDatabase::DEFAULT_DB_PATH = "/param/tv_default.xml"; + +const char *CTvDatabase::DB_VERSION_FIELD = "DATABASE_VERSION"; +using namespace android; + +CTvDatabase *CTvDatabase::mpDb = NULL; + +const char CTvDatabase::feTypes[][32] = {"dvbs", "dvbc", "dvbt", "atsc", "analog", "dtmb"}; +const char CTvDatabase::srvTypes[][32] = {"other", "dtv", "radio", "atv", "other"}; +const char CTvDatabase::vidFmts[][32] = {"mpeg12", "mpeg4", "h264", "mjpeg", "real", "jpeg", "vc1", "avs"}; +const char CTvDatabase::audFmts[][32] = {"mpeg", "pcm_s16le", "aac", "ac3", "alaw", "mulaw", "dts", "pcm_s16be", + "flac", "cook", "pcm_u8", "adpcm", "amr", "raac", "wma", "wma_pro", + "pcm_bluray", "alac", "vorbis", "aac_latm", "ape", "eac3", "pcm_wifidisplay" + }; +const char CTvDatabase::mods[][32] = {"qpsk", "qam16", "qam32", "qam64", "qam128", "qam256", "qamauto", "vsb8", "vsb16", "psk8", "apsk16", "apsk32", "dqpsk"}; +const char CTvDatabase::bandwidths[][32] = {"8", "7", "6", "auto", "5", "10", "1_712"}; +const char CTvDatabase::lnbPowers[][32] = {"13v", "18V", "off", "13/18v"}; +const char CTvDatabase::sig22K[][32] = {"on", "off", "auto"}; +const char CTvDatabase::tonebursts[][32] = {"none", "bursta", "burstb"}; +const char CTvDatabase::diseqc10s[][32] = {"lnb1", "lnb2", "lnb3", "lnb4", "none"}; +const char CTvDatabase::diseqc11s[][32] = {"lnb1", "lnb2", "lnb3", "lnb4", "lnb5", "lnb6", "lnb7", "lnb8", + "lnb9", "lnb10", "lnb11", "lnb12", "lnb13", "lnb14", "lnb15", "lnb16", "none" + }; +const char CTvDatabase::motors[][32] = {"none", "none", "none", "diseqc1.2", "diseqc1.3"}; +const char CTvDatabase::ofdmModes[][32] = {"dvbt", "dvbt2"}; +const char CTvDatabase::atvVideoStds[][32] = {"auto", "pal", "ntsc", "secam"}; +const char CTvDatabase::atvAudioStds[][32] = {"dk", "i", "bg", "m", "l", "auto"}; + +CTvDatabase::CTvDatabase() +{ +} + +int CTvDatabase::isFreqListExist() +{ + String8 cmd = String8("select * from region_table"); + CTvDatabase::Cursor c; + select(cmd, c); + return c.moveToFirst(); +} +int CTvDatabase::UnInitTvDb() +{ + AM_DB_UnSetup(); + return 0; +} +int CTvDatabase::InitTvDb(const char *path) +{ + if (path != NULL) { + if (Tv_Utils_IsFileExist(path) == 0 && config_get_int("TV", "tv_db_created", 0) == 1) { //exist or created + LOGD("tv db file(%s) exist and created, open it", path); + if (openDb(path) < 0 ) { + LOGD("db(%s) open fail", path); + return -1; + } + //setup and path set + AM_DB_Setup((char *)path, getHandle()); + if (isFreqListExist() == false) { + importXmlToDB("/etc/tv_default.xml"); + LOGD("scan region table is NULL, so import freq XML again\n"); + } + } else { + if (Tv_Utils_IsFileExist(path) == 0) { // if just exist, create flag not set, delete it + LOGD("tv db file (%s) exist, but delete it", path); + if (unlink(path) != 0) { + LOGD("delete tv db file(%s) err=%s", path, strerror(errno)); + } + } + LOGD("tv db file(%s) not exist, create it", path); + //setup and path set + sqlite3 *h = NULL; + AM_DB_Setup((char *)path, h); + //create db + AM_DB_GetHandle(&h); + //create table + AM_DB_CreateTables(h); + setHandle(h); + //clear db + ClearDbTable(); + //insert 256 ATV Program + //load init date + importXmlToDB("/etc/tv_default.xml"); + config_set_int("TV", "tv_db_created", 1); + } + + } + return 0; +} +//CTvDatabase::CTvDatabase(char* path, sqlite3 * h) +//{ +/*if(path != NULL && h != NULL) +{//setup and path set + AM_DB_Setup((char*)path, h); + mHandle = h; +}else +{ + mHandle = NULL; +}*/ +//} + +CTvDatabase::~CTvDatabase() +{ + AM_DB_UnSetup(); +} + +int CTvDatabase::getChannelParaList(char *path, Vector<sp<ChannelPara> > &vcp) +{ + //?????o?????aXML????????£?ˉ1è±???? + TiXmlDocument myDocument(path); + bool ret = myDocument.LoadFile(); + //è?·?????1????′? + TiXmlElement *RootElement = myDocument.RootElement(); + //dvbc + TiXmlElement *channel_list_element = RootElement->FirstChildElement("channel_list"); + for (TiXmlElement *channel_entry = channel_list_element->FirstChildElement("channel_entry") ; channel_entry != NULL; channel_entry = channel_entry->NextSiblingElement("channel_entry")) { + sp<ChannelPara> pCp = new ChannelPara(); + channel_entry->Attribute("frequency", &(pCp->freq)); + channel_entry->Attribute("modulation", &(pCp->modulation)); + channel_entry->Attribute("symbol_rate", &(pCp->symbol_rate)); + vcp.push_back(pCp); + } + return vcp.size(); +} + +int CTvDatabase::ClearDbTable() +{ + LOGD(LOG_TAG, "Clearing database ..."); + exeSql("delete from net_table"); + exeSql("delete from ts_table"); + exeSql("delete from srv_table"); + exeSql("delete from evt_table"); + exeSql("delete from booking_table"); + exeSql("delete from grp_table"); + exeSql("delete from grp_map_table"); + exeSql("delete from dimension_table"); + exeSql("delete from sat_para_table"); + exeSql("delete from region_table"); + return 0; +} + +int CTvDatabase::clearDbAllProgramInfoTable() +{ + LOGD(LOG_TAG, "Clearing clearDbAllProgramInfoTable ..."); + exeSql("delete from net_table"); + exeSql("delete from ts_table"); + exeSql("delete from srv_table"); + exeSql("delete from evt_table"); + exeSql("delete from booking_table"); + exeSql("delete from grp_table"); + exeSql("delete from grp_map_table"); + exeSql("delete from dimension_table"); + exeSql("delete from sat_para_table"); + return 0; +} + +//showboz now just channellist +int CTvDatabase::importXmlToDB(const char *xmlPath) +{ + //delete region table before importing xml + exeSql("delete from region_table"); + + //?????o?????aXML????????£?ˉ1è±???? + TiXmlDocument myDocument(xmlPath); + bool ret = myDocument.LoadFile(); + + //è?·?????1????′? + TiXmlElement *RootElement = myDocument.RootElement(); + beginTransaction();//----------------------------------------------- + //list-->entry + for (TiXmlElement *channel_list_element = RootElement->FirstChildElement("channel_list"); channel_list_element != NULL; channel_list_element = channel_list_element->NextSiblingElement("channel_list")) { + //LOGD("showboz-----channel_list =%d", channel_list_element); + const char *channel_name = channel_list_element->Attribute("name"); + const char *channel_fe_type = channel_list_element->Attribute("fe_type"); + //LOGD("showboz-----channel_list name = %s type=%s", channel_name, channel_fe_type); + + for (TiXmlElement *channel_entry = channel_list_element->FirstChildElement("channel_entry") ; channel_entry != NULL; channel_entry = channel_entry->NextSiblingElement("channel_entry")) { + int freq, symb, channelNum; + String8 cmd = String8("insert into region_table(name,fe_type,frequency,symbol_rate,modulation,bandwidth,ofdm_mode,logical_channel_num)"); + cmd += String8("values('") + channel_name + String8("',") + String8::format("%d", StringToIndex(feTypes, channel_fe_type)) + String8(","); + channel_entry->Attribute("frequency", &freq); + cmd += String8::format("%d", freq) + String8(","); + channel_entry->Attribute("symbol_rate", &symb); + cmd += String8::format("%d", symb) + String8(","); + //LOGD("showboz---------m=%s,b=%s,o=%s", channel_entry->Attribute("modulation"), channel_entry->Attribute("bandwidth"), channel_entry->Attribute("ofdm_mode")); + cmd += String8::format("%d", StringToIndex(mods, channel_entry->Attribute("modulation"))) + String8(","); + cmd += String8::format("%d", StringToIndex(bandwidths, channel_entry->Attribute("bandwidth"))) + String8(","); + cmd += String8::format("%d", StringToIndex(ofdmModes, channel_entry->Attribute("ofdm_mode"))) + String8(","); + channel_entry->Attribute("logical_channel_num", &channelNum); + cmd += String8::format("%d", channelNum) + String8(")"); + exeSql(cmd.string()); + } + } + + commitTransaction();//------------------------------------------------------ + return 0; +} + +bool CTvDatabase::isAtv256ProgInsertForSkyworth() +{ + String8 select_ts_atvcount = String8("select * from ts_table where src = 4"); + Cursor c; + select(select_ts_atvcount, c); + return c.getCount() < 256 ? false : true; +} + +int CTvDatabase::insert256AtvProgForSkyworth() +{ + beginTransaction(); + for (int i = 0; i < 256; i++) { + String8 insert_ts = String8("insert into ts_table(db_id, src, db_net_id, ts_id, freq, symb, mod, bw, snr, ber, strength, db_sat_para_id, polar, std, aud_mode, flags, dvbt_flag) values ("); + insert_ts += String8::format("'%d'", i); + insert_ts += String8(", '4', '-1', '-1', '44250000', '0', '0', '0', '0', '0', '0', '-1', '-1', '-1', '1', '0', '0')"); + exeSql(insert_ts.string()); + String8 insert_srv = String8("insert into srv_table(db_id, src, db_net_id, db_ts_id, name, service_id, service_type, eit_schedule_flag, eit_pf_flag, running_status, free_ca_mode, volume, aud_track, pmt_pid, vid_pid, vid_fmt, scrambled_flag, current_aud, aud_pids, aud_fmts, aud_langs, aud_types, current_sub, sub_pids, sub_types, sub_composition_page_ids, sub_ancillary_page_ids, sub_langs, current_ttx, ttx_pids, ttx_types, ttx_magazine_nos, ttx_page_nos, ttx_langs, chan_num, skip, lock, favor, lcn, sd_lcn, hd_lcn, default_chan_num, chan_order, lcn_order, service_id_order, hd_sd_order, db_sat_para_id, dvbt2_plp_id, major_chan_num, minor_chan_num, access_controlled, hidden, hide_guide, source_id, sdt_ver) values ("); + insert_srv += String8::format("'%d'", i); + insert_srv += String8(" , '4', '-1', "); + insert_srv += String8::format("'%d'", i); + insert_srv += String8(", 'xxxATV Program', '-1', '3', '-1', '-1', '-1', '-1', '50', '1', '-1', '-1', '-1', '0', '-1', '-1', '-1', 'Audio1', '0', '-1', ' ', ' ', ' ', ' ', ' ', '-1', ' ', ' ', ' ', ' ', ' ', '-1', '1', '0', '0', '-1', '-1', '-1', '1', "); + insert_srv += String8::format("'%d'", i); + insert_srv += String8(" , '0', '0', '0', '-1', '255', '0', '0', '0', '0', '0', '0', '255') "); + exeSql(insert_srv.string()); + } + commitTransaction(); + return 0; +} + +void CTvDatabase::deleteTvDb() +{ + if (mpDb != NULL) { + delete mpDb; + mpDb = NULL; + } +} +CTvDatabase *CTvDatabase::GetTvDb() +{ + if (mpDb == NULL) { + mpDb = new CTvDatabase(); + } + return mpDb; +} diff --git a/tvapi/libtv/tvdb/CTvDatabase.h b/tvapi/libtv/tvdb/CTvDatabase.h new file mode 100644 index 0000000..c5a4318 --- a/dev/null +++ b/tvapi/libtv/tvdb/CTvDatabase.h @@ -0,0 +1,96 @@ +// +// +// amlogic 2013 +// +// @ Project : tv +// @ File Name : CTvDatabase.h +// @ Date : 2013-11 +// @ Author : +// +// +#include <am_db.h> +#if !defined(_CTVDATABASE_H) +#define _CTVDATABASE_H +// ʹAM_DB +#include <unistd.h> +#include <stdlib.h> +#include <utils/String8.h> +#include <utils/Log.h> +#include <utils/Vector.h> +#include <utils/RefBase.h> +#include <tvutils/CSqlite.h> + +#include "CTvLog.h" + + +using namespace android; +//,ֻԵӹܰĵļݿ,AM_DBй +//Ĺ +class CTvDatabase: public CSqlite +{ +public: + static const char *DEFAULT_DB_PATH; + static const int DB_VERSION = 8; + static const char *DB_VERSION_FIELD; + + static const char feTypes[][32]; + static const char srvTypes[][32]; + static const char vidFmts[][32]; + static const char audFmts[][32]; + static const char mods[][32]; + static const char bandwidths[][32]; + static const char lnbPowers[][32]; + static const char sig22K[][32]; + static const char tonebursts[][32]; + static const char diseqc10s[][32]; + static const char diseqc11s[][32]; + static const char motors[][32]; + static const char ofdmModes[][32]; + static const char atvVideoStds[][32]; + static const char atvAudioStds[][32]; + template<typename T> + int StringToIndex(const T &t, const char *item) + { + if (item == NULL) return -1; + int size = sizeof(t) / sizeof(t[0]); + for (int i = 0; i < size; i++) { + if (strcmp(t[i], item) == 0) return i; + } + return -1; + } +public: + CTvDatabase(); + //ֱָݿӾ + //CTvDatabase(char* path, sqlite3 * h); + static CTvDatabase *GetTvDb(); + static void deleteTvDb(); + ~CTvDatabase(); + //ָ·TVݿ. + int UnInitTvDb(); + int InitTvDb(const char *path); + //showboz test + class ChannelPara : public LightRefBase<ChannelPara> + { + public: + int mode; + int freq; + int symbol_rate; + int modulation; + int bandwidth; + int polar; + }; + + static int getChannelParaList(char *path, Vector<sp<ChannelPara> > &vcp); + + int importDbToXml(); + int importXmlToDB(const char *xmlPath); + bool isAtv256ProgInsertForSkyworth(); + int insert256AtvProgForSkyworth(); + int ClearDbTable(); + int clearDbAllProgramInfoTable(); +private: + static CTvDatabase *mpDb; + int isFreqListExist(void); +}; + +#endif //_CTVDATABASE_H diff --git a/tvapi/libtv/tvdb/CTvDimension.cpp b/tvapi/libtv/tvdb/CTvDimension.cpp new file mode 100644 index 0000000..176dde8 --- a/dev/null +++ b/tvapi/libtv/tvdb/CTvDimension.cpp @@ -0,0 +1,644 @@ + +#include "CTvDimension.h" +#include "CTvProgram.h" +#include "CTvTime.h" +#include "CTvEvent.h" +#include "../tvconfig/tvconfig.h" + + +#ifdef LOG_TAG +#undef LOG_TAG +#endif +#define LOG_TAG "CTvDimension" + +/** + *TV ATSC rating dimension + */ + +void CTvDimension::createFromCursor(CTvDatabase::Cursor &c) +{ + int col; + + col = c.getColumnIndex("db_id"); + this->id = c.getInt(col); + + col = c.getColumnIndex("index_j"); + this->indexj = c.getInt(col); + + col = c.getColumnIndex("rating_region"); + this->ratingRegion = c.getInt(col); + + col = c.getColumnIndex("graduated_scale"); + this->graduatedScale = c.getInt(col); + + col = c.getColumnIndex("name"); + this->name = c.getString(col); + + col = c.getColumnIndex("rating_region_name"); + this->ratingRegionName = c.getString(col); + + col = c.getColumnIndex("values_defined"); + this->valuesDefined = c.getInt(col); + this->lockValues = new int[valuesDefined]; + this->abbrevValues = new String8[valuesDefined]; + this->textValues = new String8[valuesDefined]; + char temp[256]; + for (int i = 0; i < valuesDefined; i++) { + sprintf(temp, "abbrev%d", i); + col = c.getColumnIndex(temp); + this->abbrevValues[i] = c.getString(col); + sprintf(temp, "text%d", i); + col = c.getColumnIndex(temp); + this->textValues[i] = c.getString(col); + sprintf(temp, "locked%d", i); + col = c.getColumnIndex(temp); + this->lockValues[i] = c.getInt(col); + } + + if (ratingRegion == REGION_US && !strcmp(name, "All")) { + isPGAll = true; + } else { + isPGAll = false; + } +} + +CTvDimension::CTvDimension(CTvDatabase::Cursor &c) +{ + createFromCursor(c); +} +CTvDimension::CTvDimension() +{ + +} +CTvDimension::~CTvDimension() +{ + if (lockValues != NULL) { + delete []lockValues; + } + if (textValues != NULL) { + delete []textValues; + } + if (abbrevValues != NULL) { + delete []abbrevValues; + } +} + +/* 'All' is a very special case, it links to dimension0 & dimension5 */ +int CTvDimension::getUSPGAllLockStatus(String8 abbrev) +{ + int len = 0; + CTvDimension dm5; + int j = 0; + selectByIndex(dm5, CTvDimension::REGION_US, 5); + len = dm5.getDefinedValue(); + String8 dm5Abbrev[len - 1]; + dm5.getAbbrev(dm5Abbrev); + for (j = 0; j < len - 1; j++) { + if (dm5Abbrev[j] == abbrev) { + return dm5.getLockStatus(j + 1); + } + } + CTvDimension dm0; + selectByIndex(dm0, CTvDimension::REGION_US, 0); + len = dm0.getDefinedValue(); + String8 dm0Abbrev[len - 1]; + dm0.getAbbrev(dm0Abbrev); + for (j = 0; j < len - 1; j++) { + if (dm0Abbrev[j] == abbrev) { + return dm0.getLockStatus(j + 1); + } + } + return -1; +} + +void CTvDimension::setUSPGAllLockStatus(String8 abbrev, int lock) +{ + + int len = 0; + int j = 0; + + CTvDimension dm5; + + selectByIndex(dm5, REGION_US, 5); + len = dm5.getDefinedValue(); + String8 dm5Abbrev[len - 1]; + dm5.getAbbrev(dm5Abbrev); + + for (j = 0; j < len - 1; j++) { + if (abbrev == dm5Abbrev[j]) { + dm5.setLockStatus(j + 1, lock); + return; + } + } + + CTvDimension dm0; + selectByIndex(dm0, REGION_US, 0); + len = dm0.getDefinedValue(); + String8 dm0Abbrev[len - 1]; + dm0.getAbbrev(dm0Abbrev); + + for (j = 0; j < len - 1; j++) { + if (abbrev == dm0Abbrev[j]) { + dm0.setLockStatus(j + 1, lock); + return; + } + } + return; +} + + + +/** + *根据记录ID取得对应的TVDimension + *@param context 当前Context + *@param id 记录ID + *@return 返回ID对应的TVDimension对象 + */ +void CTvDimension::selectByID(CTvDimension &dm, int id) +{ + String8 cmd = String8("select * from dimension_table where evt_table.db_id = ") + String8::format("%d", id); + CTvDatabase::Cursor c; + int ret = CTvDatabase::GetTvDb()->select(cmd, c); + + if (c.moveToFirst()) { + dm.createFromCursor(c); + LOGD("%s, %d success", "TV", __LINE__); + } else { + LOGD("%s, %d fail", "TV", __LINE__); + c.close(); + return; + } + c.close(); + +} + +/** + *根据记录ID取得对应的TVDimension + *@param context 当前Context + *@param ratingRegionID rating region ID + *@return 返回ID对应的TVDimension对象 + */ +void CTvDimension::selectByRatingRegion(CTvDimension &dm, int ratingRegionID) +{ + String8 cmd = String8("select * from dimension_table where rating_region = ") + String8::format("%d", ratingRegionID); + CTvDatabase::Cursor c; + int ret = CTvDatabase::GetTvDb()->select(cmd, c); + + if (c.moveToFirst()) { + dm.createFromCursor(c); + LOGD("%s, %d success", "TV", __LINE__); + } else { + LOGD("%s, %d fail", "TV", __LINE__); + c.close(); + return; + } + c.close(); +} + +/** + *根据记录ID取得对应的TVDimension + *@param context 当前Context + *@param ratingRegionID rating region ID + *@param index RRT中对应的index_j + *@return 返回对应的TVDimension对象 + */ +int CTvDimension::selectByIndex(CTvDimension &dm, int ratingRegionID, int index) +{ + String8 cmd = String8("select * from dimension_table where rating_region = ") + String8::format("%d", ratingRegionID); + cmd += String8(" and index_j=") + String8::format("%d", index); + CTvDatabase::Cursor c; + int ret = CTvDatabase::GetTvDb()->select(cmd, c); + + if (c.moveToFirst()) { + dm.createFromCursor(c); + LOGD("%s, %d success", "TV", __LINE__); + } else { + LOGD("%s, %d fail", "TV", __LINE__); + c.close(); + return -1; + } + c.close(); + + return 0; +} + +/** + *根据ID和名字取得对应的TVDimension + *@param context 当前Context + *@param ratingRegionID rating region ID + *@param dimensionName dimension的名称 + *@return 返回对应的TVDimension对象 + */ +void CTvDimension::selectByName(CTvDimension &dm, int ratingRegionID, String8 dimensionName) +{ + String8 cmd = String8("select * from dimension_table where rating_region = ") + String8::format("%d", ratingRegionID); + cmd += String8(" and name='") + dimensionName + String8("'"); + CTvDatabase::Cursor c; + CTvDatabase::GetTvDb()->select(cmd, c); + + if (c.moveToFirst()) { + LOGD("%s, %d success", "TV", __LINE__); + dm.createFromCursor(c); + } else { + LOGD("%s, %d fail", "TV", __LINE__); + c.close(); + return; + } + c.close(); + + return; +} + + +/** + *判断指定rating_value是否需要block + *@param context 当前Context + *@param definedRating content_advisory_descr中定义的级别信息 + *@return 是否block + */ +bool CTvDimension::isBlocked(CTvDimension &dm, VChipRating *definedRating) +{ + int ret = 0; + ret = selectByIndex(dm, definedRating->getRegion(), definedRating->getDimension()); + if (ret != -1) { + LOGD("%s, %d, index=%d", "TV", __LINE__, definedRating->getValue()); + return (dm.getLockStatus(definedRating->getValue()) == 1); + } + + return false; +} + +/** + *取得事件的ID + *@return 返回事件的ID + */ +int CTvDimension::getID() +{ + return id; +} + +/** + *取得 rating region ID + *@return 返回 rating region ID + */ +int CTvDimension::getRatingRegion() +{ + return ratingRegion; +} + +int CTvDimension::getDefinedValue() +{ + return valuesDefined; +} +/** + *取得 rating region 名称 + *@return 返回 rating region 名称 + */ +String8 CTvDimension::getRatingRegionName() +{ + return ratingRegionName; +} + +/** + *取得Dimension名称 + *@return 返回Dimension名称 + */ +String8 CTvDimension::getName() +{ + return name; +} + +/** + *取得graduated scale标志 + *@return 返回graduated scale标志 + */ +int CTvDimension::getGraduatedScale() +{ + return graduatedScale; +} + +/** + *取得该dimension的所有values的加锁状态 + *@return 返回所有values的加锁状态,0-未加锁,-1-无效值,即不能对该项进行设置,其他-已加锁 + */ +#if 0 +int *CTvDimension::getLockStatus() +{ + int len = getDefinedValue(); + if (len > 1) { + if (isPGAll) { + return getUSPGAllLockStatus(abbrevValues); + } else { + int *lock = new int[len - 1]; + //System.arraycopy(lockValues, 1, l, 0, l.length); + for (int i = 0; i < len - 1; i++) + lock[i] = lockValues[1 + i]; + return lock; + } + } else { + return NULL; + } +} +#endif +/** + *取得该dimension的指定value的加锁状态 + *@param valueIndex value索引 + *@return 返回指定value的加锁状态,0-未加锁,-1-无效值,即不能对该项进行设置,其他-已加锁 + */ +int CTvDimension::getLockStatus(int valueIndex) +{ + int len = getDefinedValue(); + if (valueIndex >= len) { + return -1; + } else { + return lockValues[valueIndex]; + } +} + +/** + *取得该dimension的指定几个values的加锁状态 + *@param abbrevs 需要获取的value的abbrev集合 + *@return 返回指定values的加锁状态,0-未加锁,-1-无效值,即不能对该项进行设置,其他-已加锁 + */ +void CTvDimension::getLockStatus(String8 abbrevs[], int lock[], int *array_len) +{ + int i = 0; + int len = getDefinedValue(); + + if (abbrevs != NULL && lock != NULL) { + for (int i = 0; i < *array_len; i++) { + *(lock + i) = -1; + for (int j = 0; j < len; j++) { + if (abbrevs[i] == abbrevValues[j]) { + *(lock + i) = lockValues[j]; + break; + } + } + } + } + *array_len = len; +} + +/** + *取得该dimension的所有values的abbrev text + *@return 返回所有values的abbrev text + */ +int CTvDimension::getAbbrev(String8 abb[]) +{ + /* the first rating_value must be not visible to user */ + int len = getDefinedValue(); + if (len > 1) { + for (int i = 0; i < len - 1; i++) + abb[i] = abbrevValues[i + 1]; + return 0; + } else { + return -1; + } +} + +/** + *取得该dimension指定value的abbrev text + *@return 返回abbrev text + */ +String8 CTvDimension::getAbbrev(int valueIndex) +{ + int len = getDefinedValue(); + if (valueIndex >= len) + return String8(""); + else + return abbrevValues[valueIndex]; +} + +/** + *取得该dimension的所有values的value text + *@return 返回所有values的value text + */ +int CTvDimension::getText(String8 tx[]) +{ + int len = getDefinedValue(); + if (len > 1) { + for (int i = 0; i < len - 1; i++) + tx[i] = textValues[i + 1]; + return 0; + } else { + return -1; + } +} + +/** + *取得该dimension指定value的value text + *@return 返回value text + */ +String8 CTvDimension::getText(int valueIndex) +{ + int len = getDefinedValue(); + if (valueIndex >= len) + return String8(""); + else + return textValues[valueIndex]; +} + +/** + *设置指定value的加锁状态 + *@param valueIndex value索引 + *@param status 加锁状态 + */ +void CTvDimension::setLockStatus(int valueIndex, int status) +{ + int len = getDefinedValue(); + if (valueIndex >= len) + return; + + if (lockValues[valueIndex] != -1 && lockValues[valueIndex] != status) { + lockValues[valueIndex] = status; + String8 cmd = String8("update dimension_table set locked") + String8::format("%d", valueIndex); + cmd += String8("=") + String8::format("%d", status) + String8(" where db_id = ") + String8::format("%d", id); + + CTvDatabase::GetTvDb()->exeSql(cmd.string()); + } +} + +/** + *设置该dimension所有values的加锁状态 + *@param status 加锁状态 + */ +void CTvDimension::setLockStatus(int status[]) +{ + int len = getDefinedValue(); + if (status == NULL) { + LOGD("Cannot set lock status, invalid param"); + return; + } + for (int i = 0; i < len; i++) { + setLockStatus(i + 1, status[i]); + } +} + +/** + *设置指定values的加锁状态 + *@param abbrevs abbrev集合 + *@param locks 需要修改的与abbrev对应的加锁状态集合 + */ +void CTvDimension::setLockStatus(String8 abbrevs[], int locks[], int abb_size) +{ + int len = getDefinedValue(); + if (abbrevs == NULL || locks == NULL) + return; + + for (int i = 0; i < abb_size; i++) { + for (int j = 0; j < len; j++) { + if (abbrevs[i] == abbrevValues[j]) { + setLockStatus(j, locks[i]); + break; + } + } + } +} + +CTvDimension::VChipRating::VChipRating(int region, int dimension, int value) +{ + this->region = region; + this->dimension = dimension; + this->value = value; +} +CTvDimension::VChipRating::VChipRating() +{ +} + +CTvDimension::VChipRating::~VChipRating() +{ +} +int CTvDimension::VChipRating::getRegion() +{ + return region; +} + +int CTvDimension::VChipRating::getDimension() +{ + return dimension; +} + +int CTvDimension::VChipRating::getValue()const +{ + return value; +} + +String8 CTvDimension::getCurdimension() +{ + return CurvchipDimension; +} +String8 CTvDimension::getCurAbbr() +{ + return CurvchipAbbrev; + +} +String8 CTvDimension::getCurText() +{ + return CurvchipText; +} + +void CTvDimension::insertNewDimension(const int region, String8 regionName, String8 name, + int indexj, int *lock, const char **abbrev, const char **text, int size) +{ + String8 cmd = String8("insert into dimension_table(rating_region,rating_region_name,name,graduated_scale,"); + cmd += String8("values_defined,index_j,version,abbrev0,text0,locked0,abbrev1,text1,locked1,abbrev2,text2,locked2,"); + cmd += String8("abbrev3,text3,locked3,abbrev4,text4,locked4,abbrev5,text5,locked5,abbrev6,text6,locked6,"); + cmd += String8("abbrev7,text7,locked7,abbrev8,text8,locked8,abbrev9,text9,locked9,abbrev10,text10,locked10,"); + cmd += String8("abbrev11,text11,locked11,abbrev12,text12,locked12,abbrev13,text13,locked13,abbrev14,text14,locked14,"); + cmd += String8("abbrev15,text15,locked15) values(") + String8::format("%d", region) + String8(",'") + regionName.string(); + cmd += String8("','") + name.string() + String8("',0,") + String8::format("%d", size) + String8(",") + String8::format("%d", indexj) + String8(",0"); + for (int i = 0; i < 16; i++) { + if (i < size) { + cmd += String8(",'") + String8::format("%s", abbrev[i]) + String8("'"); + cmd += String8(",'") + String8::format("%s", text[i]) + String8("'"); + cmd += String8(",'") + String8::format("%d", lock[i]) + String8("'"); + } else { + cmd += String8(",''"); + cmd += String8(",''"); + cmd += String8(",-1"); + } + } + cmd += String8(")"); + CTvDatabase::GetTvDb()->exeSql(cmd.string()); +} +/** + * ??????Standard ATSC V-Chip Dimensions + */ +void CTvDimension::builtinAtscDimensions() +{ + CTvDatabase::GetTvDb()->exeSql("delete from dimension_table"); + + /* Add U.S. Rating region 0x1 */ + const char *abbrev0[] = {"", "None", "TV-G", "TV-PG", "TV-14", "TV-MA"}; + const char *text0[] = {"", "None", "TV-G", "TV-PG", "TV-14", "TV-MA"}; + int lock0[] = { -1, -1, 0, 0, 0, 0}; + const char *abbrev1[] = {"", "D", "TV-G", "TV-PG", "TV-14", "TV-MA"}; + const char *text1[] = {"", "D", "TV-G", "TV-PG", "TV-14", "TV-MA"}; + int lock1[] = { -1, -1, -1, 0, 0, -1}; + const char *abbrev2[] = {"", "L", "TV-G", "TV-PG", "TV-14", "TV-MA"}; + const char *text2[] = {"", "L", "TV-G", "TV-PG", "TV-14", "TV-MA"}; + int lock2[] = { -1, -1, -1, 0, 0, 0}; + const char *abbrev3[] = {"", "S", "TV-G", "TV-PG", "TV-14", "TV-MA"}; + const char *text3[] = {"", "S", "TV-G", "TV-PG", "TV-14", "TV-MA"}; + int lock3[] = { -1, -1, -1, 0, 0, 0}; + const char *abbrev4[] = {"", "V", "TV-G", "TV-PG", "TV-14", "TV-MA"}; + const char *text4[] = {"", "V", "TV-G", "TV-PG", "TV-14", "TV-MA"}; + int lock4[] = { -1, -1, -1, 0, 0, 0}; + const char *abbrev5[] = {"", "TV-Y", "TV-Y7"}; + const char *text5[] = {"", "TV-Y", "TV-Y7"}; + int lock5[] = { -1, 0, 0}; + const char *abbrev6[] = {"", "FV", "TV-Y7"}; + const char *text6[] = {"", "FV", "TV-Y7"}; + int lock6[] = { -1, -1, 0}; + const char *abbrev7[] = {"", "N/A", "G", "PG", "PG-13", "R", "NC-17", "X", "NR"}; + const char *text7[] = {"", "MPAA Rating Not Applicable", "Suitable for AllAges", + "Parental GuidanceSuggested", "Parents Strongly Cautioned", + "Restricted, under 17 must be accompanied by adult", + "No One 17 and Under Admitted", "No One 17 and Under Admitted", + "no Rated by MPAA" + }; + int lock7[] = { -1, -1, 0, 0, 0, 0, 0, 0, 0}; + /*Extra for 'All' */ + const char *abbrevall[] = {"TV-Y", "TV-Y7", "TV-G", "TV-PG", "TV-14", "TV-MA"}; + const char *textall[] = {"TV-Y", "TV-Y7", "TV-G", "TV-PG", "TV-14", "TV-MA"}; + int lockall[] = {0, 0, 0, 0, 0, 0}; + + insertNewDimension(CTvDimension::REGION_US, String8("US (50 states + possessions)"), + String8("Entire Audience"), 0, lock0, abbrev0, text0, sizeof(lock0) / sizeof(int)); + insertNewDimension(CTvDimension::REGION_US, String8("US (50 states + possessions)"), + String8("Dialogue"), 1, lock1, abbrev1, text1, sizeof(lock1) / sizeof(int)); + insertNewDimension(CTvDimension::REGION_US, String8("US (50 states + possessions)"), + String8("Language"), 2, lock2, abbrev2, text2, sizeof(lock2) / sizeof(int)); + insertNewDimension(CTvDimension::REGION_US, String8("US (50 states + possessions)"), + String8("Sex"), 3, lock3, abbrev3, text3, sizeof(lock3) / sizeof(int)); + insertNewDimension(CTvDimension::REGION_US, String8("US (50 states + possessions)"), + String8("Violence"), 4, lock4, abbrev4, text4, sizeof(lock4) / sizeof(int)); + insertNewDimension(CTvDimension::REGION_US, String8("US (50 states + possessions)"), + String8("Children"), 5, lock5, abbrev5, text5, sizeof(lock5) / sizeof(int)); + insertNewDimension(CTvDimension::REGION_US, String8("US (50 states + possessions)"), + String8("Fantasy violence"), 6, lock6, abbrev6, text6, sizeof(lock6) / sizeof(int)); + insertNewDimension(CTvDimension::REGION_US, String8("US (50 states + possessions)"), + String8("MPAA"), 7, lock7, abbrev7, text7, sizeof(lock7) / sizeof(int)); + insertNewDimension(CTvDimension::REGION_US, String8("US (50 states + possessions)"), + String8("All"), -1, lockall, abbrevall, textall, sizeof(lockall) / sizeof(int)); + /* Add Canadian Rating region 0x2 */ + const char *cabbrev0[] = {"E", "C", "C8+", "G", "PG", "14+", "18+"}; + const char *ctext0[] = {"Exempt", "Children", "8+", "General", "PG", "14+", "18+"}; + int clock0[] = {0, 0, 0, 0, 0, 0, 0}; + const char *cabbrev1[] = {"E", "G", "8 ans+", "13 ans+", "16 ans+", "18 ans+"}; + const char *ctext1[] = {"Exempt??es", "Pour tous", "8+", "13+", "16+", "18+"}; + int clock1[] = {0, 0, 0, 0, 0, 0}; + + insertNewDimension(CTvDimension::REGION_CANADA, String8("Canada"), + String8("Canadian English Language Rating"), 0, clock0, cabbrev0, ctext0, sizeof(clock0) / sizeof(int)); + insertNewDimension(CTvDimension::REGION_CANADA, String8("Canada"), + String8("Codes francais du Canada"), 1, clock1, cabbrev1, ctext1, sizeof(clock1) / sizeof(int)); +} + +int CTvDimension::isDimensionTblExist() +{ + String8 cmd = String8("select * from dimension_table"); + CTvDatabase::Cursor c; + CTvDatabase::GetTvDb()->select(cmd, c); + return c.moveToFirst(); +} diff --git a/tvapi/libtv/tvdb/CTvDimension.h b/tvapi/libtv/tvdb/CTvDimension.h new file mode 100644 index 0000000..6415871 --- a/dev/null +++ b/tvapi/libtv/tvdb/CTvDimension.h @@ -0,0 +1,99 @@ +// +// +// amlogic 2013 +// +// @ Project : tv +// @ File Name : CTvDimension.h +// @ Date : 2013-11 +// @ Author : +// +// + +#if !defined(_CTVDIMENSION_H) +#define _CTVDIMENSION_H +#include <utils/Vector.h> +#include "CTvDatabase.h" +#include <utils/String8.h> +#include <stdlib.h> + +#include "CTvLog.h" + +// TV ATSC rating dimension +class CTvDimension +{ +public: + class VChipRating + { + private: + int region; + int dimension; + int value; + + public: + VChipRating(int region, int dimension, int value); + VChipRating(); + ~VChipRating(); + int getRegion(); + int getDimension(); + int getValue()const; + }; + /* 'All' is a very special case, it links to dimension0 & dimension5 */ + void createFromCursor(CTvDatabase::Cursor &c); + static int getUSPGAllLockStatus(String8 abbrev); + static void setUSPGAllLockStatus(String8 abbrev, int lock); + static void selectByID(CTvDimension &dm, int id); + static int selectByIndex(CTvDimension &dm, int ratingRegionID, int index); + static void selectByName(CTvDimension &dm, int ratingRegionID, String8 dimensionName); + static void selectByRatingRegion(CTvDimension &dm, int ratingRegionID); + bool isBlocked(CTvDimension &dm, VChipRating *definedRating); + int getID(); + int getRatingRegion(); + String8 getRatingRegionName(); + String8 getName(); + int getGraduatedScale(); + int getDefinedValue(); + //int* getLockStatus(); + int getLockStatus(int valueIndex); + void getLockStatus(String8 abbrevs[], int lock[], int *array_len); + int getAbbrev(String8 abb[]); + String8 getAbbrev(int valueIndex); + int getText(String8 tx[]); + String8 getText(int valueIndex); + void setLockStatus(int valueIndex, int status); + void setLockStatus(int status[]); + void setLockStatus(String8 abbrevs[], int locks[], int abb_size); + /**Rating regions*/ +public: + static const int REGION_US = 0x1; + static const int REGION_CANADA = 0x2; + static const int REGION_TAIWAN = 0x3; + static const int REGION_SOUTHKOREA = 0x4; + + CTvDimension(CTvDatabase::Cursor &c); + CTvDimension(); + ~CTvDimension(); + + static void insertNewDimension(const int region, String8 regionName, String8 name, + int indexj, int *lock, const char **abbrev, const char **text, int size); + static void builtinAtscDimensions(); + static int isDimensionTblExist(); + String8 getCurdimension(); + String8 getCurAbbr(); + String8 getCurText(); +private: + int id; + int indexj; + int ratingRegion; + int graduatedScale; + int valuesDefined; + int *lockValues; + String8 name; + String8 ratingRegionName; + String8 *abbrevValues; + String8 *textValues; + bool isPGAll; + String8 CurvchipDimension; + String8 CurvchipAbbrev; + String8 CurvchipText; +}; +#endif //_CTVDIMENSION_H diff --git a/tvapi/libtv/tvdb/CTvEvent.cpp b/tvapi/libtv/tvdb/CTvEvent.cpp new file mode 100644 index 0000000..f26bc57 --- a/dev/null +++ b/tvapi/libtv/tvdb/CTvEvent.cpp @@ -0,0 +1,241 @@ +// +// +// amlogic 2013 +// +// @ Project : tv +// @ File Name : CTvEvent.cpp +// @ Date : 2013-11 +// @ Author : +// +// + +#include "CTvEvent.h" +#include "CTvDatabase.h" +#include "CTvProgram.h" +#include <stdlib.h> + +#ifdef LOG_TAG +#undef LOG_TAG +#define LOG_TAG "CTvEvent" +#endif + +void CTvEvent::InitFromCursor(CTvDatabase::Cursor &c) +{ + int col; + + col = c.getColumnIndex("db_id"); + this->id = c.getInt(col); + + col = c.getColumnIndex("event_id"); + this->dvbEventID = c.getInt(col); + + col = c.getColumnIndex("name"); + this->name = c.getString(col); + + col = c.getColumnIndex("start"); + this->start = (long)c.getInt(col); + + col = c.getColumnIndex("end"); + this->end = (long)c.getInt(col) ; + + col = c.getColumnIndex("nibble_level"); + this->dvbContent = c.getInt(col); + + col = c.getColumnIndex("parental_rating"); + this->dvbViewAge = c.getInt(col); + + col = c.getColumnIndex("sub_flag"); + this->sub_flag = c.getInt(col); + + col = c.getColumnIndex("db_srv_id"); + this->programID = c.getInt(col); + + col = c.getColumnIndex("rrt_ratings"); + String8 rrtRatings = c.getString(col); + char *tmp; + Vector<String8> ratings; + int l = 0; + tmp = strtok(rrtRatings.lockBuffer(rrtRatings.size()), ","); + LOGD("%s, %d, %s", "TV", __LINE__, tmp); + while (tmp != NULL) { + ratings.push_back(String8(tmp)); + tmp = strtok(NULL, ","); + } + rrtRatings.unlockBuffer(); + rating_len = ratings.size(); + if (!ratings.isEmpty()) { + for (int i = 0; i < ratings.size(); i++) { + Vector<String8> rating; + tmp = strtok(ratings.editItemAt(i).lockBuffer(ratings.editItemAt(i).length()), " "); + while (tmp != NULL) { + rating.push_back(String8(tmp)); + tmp = strtok(NULL, " "); + } + ratings.editItemAt(i).unlockBuffer(); + if (rating.size() >= 3) { + int re = atoi(rating[0]); + int dm = atoi(rating[1]); + int vl = atoi(rating[2]); + vchipRatings.add( new CTvDimension::VChipRating(re, dm, vl)); + } else + vchipRatings.add(NULL); + } + } + + col = c.getColumnIndex("descr"); + this->description = c.getString(col); + + col = c.getColumnIndex("ext_descr"); + this->extDescription = c.getString(col); +} + +//id; CTvChannel.MODE_ATSC sourceid , other id +int CTvEvent::getProgPresentEvent(int progSrc, int progID, long nowTime, CTvEvent &ev) +{ + String8 cmd; + CTvDatabase::Cursor c; + + cmd = String8("select * from evt_table where evt_table."); + + if (progSrc == CTvChannel::MODE_ATSC) { + cmd += String8("source_id = ") + String8::format("%d", progID); + } else { + cmd += String8("db_srv_id = ") + String8::format("%d", progID); + } + + cmd += String8(" and evt_table.start <= ") + String8::format("%ld", nowTime) + String8(" and evt_table.end > ") + String8::format("%ld", nowTime); + + int ret = CTvDatabase::GetTvDb()->select(cmd, c); + + if (c.moveToFirst()) { + ev.InitFromCursor(c); + } else { + c.close(); + return -1; + } + + c.close(); + + return 0; +} + +int CTvEvent::getProgScheduleEvents(int progSrc, int progID, long start, long duration, Vector<sp<CTvEvent> > &vEv) +{ + String8 cmd; + long begin = start; + long end = start + duration; + + cmd = String8("select * from evt_table where evt_table."); + if (progSrc == CTvChannel::MODE_ATSC) { + cmd += String8("source_id = ") + String8::format("%d", progID); + } else { + cmd += String8("db_srv_id = ") + String8::format("%d", progID); + } + cmd += String8(" and "); + cmd += String8(" ((start < ") + String8::format("%ld", begin) + String8(" and end > ") + String8::format("%ld", begin) + String8(") ||"); + cmd += String8(" (start >= ") + String8::format("%ld", begin) + String8(" and start < ") + String8::format("%ld", end) + String8("))"); + cmd += String8(" order by evt_table.start"); + + CTvDatabase::Cursor c; + int ret = CTvDatabase::GetTvDb()->select(cmd, c); + + if (c.moveToFirst()) { + do { + vEv.add(new CTvEvent(c)); + } while (c.moveToNext()); + + } else { + c.close(); + return -1; + } + + c.close(); + return 0; +} +int CTvEvent::getATVProgEvent(int progSrc, int progID, CTvEvent &ev) +{ + String8 cmd; + CTvDatabase::Cursor c; + + cmd = String8("select * from evt_table where evt_table."); + + if (progSrc == CTvChannel::MODE_ATSC) { + LOGD("%s, %d MODE_ATSC", "TV", __LINE__); + cmd += String8("source_id = ") + String8::format("%d", progID); + } else { + LOGD("%s, %d MODE_ANALOG", "TV", __LINE__); + cmd += String8("db_srv_id = ") + String8::format("%d", progID); + } + + //cmd += String8(" and evt_table.start <= ") + String8::format("%ld", nowTime) + String8(" and evt_table.end > ") + String8::format("%ld", nowTime); + + int ret = CTvDatabase::GetTvDb()->select(cmd, c); + + if (c.moveToFirst()) { + ev.InitFromCursor(c); + } else { + c.close(); + return -1; + } + + c.close(); + + return 0; +} + +int CTvEvent::CleanAllEvent() +{ + CTvDatabase::GetTvDb()->exeSql("delete from evt_table"); + return 0; +} + +int CTvEvent::selectByID(int id, CTvEvent &evt) +{ + CTvDatabase::Cursor c; + String8 sql; + + sql = String8("select * from evt_table where evt_table.db_id = ") + String8::format("%d", id); + CTvDatabase::GetTvDb()->select(sql.string(), c); + if (c.moveToFirst()) { + evt.InitFromCursor(c); + } else { + c.close(); + return -1; + } + + c.close(); + return 0; +} + +int CTvEvent::bookEvent(int evtId, bool bBookFlag) +{ + String8 cmd; + + cmd = String8("update evt_table set sub_flag=") + String8::format("%d", bBookFlag) + + String8(" where event_id=") + String8::format("%d", evtId); + + CTvDatabase::GetTvDb()->exeSql(cmd.string()); + + return 0; +} + +CTvEvent::CTvEvent(CTvDatabase::Cursor &c) +{ + InitFromCursor(c); +} + +CTvEvent::CTvEvent() +{ +} + +CTvEvent::~CTvEvent() +{ + int size = vchipRatings.size(); + for (int i = 0; i < size; i++) + delete vchipRatings[i]; +} +Vector<CTvDimension::VChipRating *> CTvEvent::getVChipRatings() +{ + return vchipRatings; +} + diff --git a/tvapi/libtv/tvdb/CTvEvent.h b/tvapi/libtv/tvdb/CTvEvent.h new file mode 100644 index 0000000..d13b575 --- a/dev/null +++ b/tvapi/libtv/tvdb/CTvEvent.h @@ -0,0 +1,86 @@ +// +// +// amlogic 2013 +// +// @ Project : tv +// @ File Name : CTvEvent.h +// @ Date : 2013-11 +// @ Author : +// +// + + +#if !defined(_CTVEVENT_H) +#define _CTVEVENT_H + +#include <utils/Vector.h> +#include "CTvProgram.h" +#include "CTvDatabase.h" +#include "CTvDimension.h" + +class CTvEvent : public LightRefBase<CTvEvent> +{ +public: + CTvEvent(CTvDatabase::Cursor &c); + CTvEvent(); + ~CTvEvent(); + + int getProgPresentEvent(int progSrc, int progID, long nowTime, CTvEvent &ev); + int getProgScheduleEvents(int progSrc, int progID, long start, long duration, Vector<sp<CTvEvent> > &vEv); + int getATVProgEvent(int progSrc, int progID, CTvEvent &ev); + int bookEvent(int evtId, bool bBookFlag); + static int selectByID(int id, CTvEvent &p); + static int CleanAllEvent(); + String8 &getName() + { + return name; + }; + String8 &getDescription() + { + return description; + }; + String8 &getExtDescription() + { + return extDescription; + }; + long getStartTime() + { + return start; + }; + long getEndTime() + { + return end; + }; + int getSubFlag() + { + return sub_flag; + }; + int getProgramId() + { + return programID; + }; + int getEventId() + { + return dvbEventID; + }; + Vector<CTvDimension::VChipRating *> getVChipRatings(); + +private: + void InitFromCursor(CTvDatabase::Cursor &c); + + int id; + int dvbEventID; + String8 name; + String8 description; + String8 extDescription; + int programID; + long start; + long end; + int dvbContent; + int dvbViewAge; + int sub_flag; + int rating_len; + Vector<CTvDimension::VChipRating *> vchipRatings; +}; + +#endif //_CTVEVENT_H diff --git a/tvapi/libtv/tvdb/CTvGroup.cpp b/tvapi/libtv/tvdb/CTvGroup.cpp new file mode 100644 index 0000000..c5b6249 --- a/dev/null +++ b/tvapi/libtv/tvdb/CTvGroup.cpp @@ -0,0 +1,44 @@ +// +// +// amlogic 2013 +// +// @ Project : tv +// @ File Name : CTvGroup.cpp +// @ Date : 2013-11 +// @ Author : +// +// + + +#include "CTvGroup.h" + +Vector<CTvGroup> CTvGroup::selectByGroup() +{ + Vector<CTvGroup> vGroup; + return vGroup; +} + +void CTvGroup::addGroup() +{ + +} + +CTvGroup::CTvGroup() +{ + +} +CTvGroup::~CTvGroup() +{ + +} + +void CTvGroup::deleteGroup() +{ + +} + +void CTvGroup::editGroup() +{ + +} + diff --git a/tvapi/libtv/tvdb/CTvGroup.h b/tvapi/libtv/tvdb/CTvGroup.h new file mode 100644 index 0000000..d765f26 --- a/dev/null +++ b/tvapi/libtv/tvdb/CTvGroup.h @@ -0,0 +1,31 @@ +// +// +// amlogic 2013 +// +// @ Project : tv +// @ File Name : CTvGroup.h +// @ Date : 2013-11 +// @ Author : +// +// + + +#if !defined(_CTVGROUP_H) +#define _CTVGROUP_H + +#include <utils/Vector.h> +using namespace android; +// GroupӦDTVеһĿ +class CTvGroup +{ +public: + CTvGroup(); + ~CTvGroup(); + // ȡнĿϢ + static Vector<CTvGroup> selectByGroup(); + static void addGroup(); + static void deleteGroup(); + static void editGroup(); +}; + +#endif //_CTVGROUP_H diff --git a/tvapi/libtv/tvdb/CTvProgram.cpp b/tvapi/libtv/tvdb/CTvProgram.cpp new file mode 100644 index 0000000..921d67a --- a/dev/null +++ b/tvapi/libtv/tvdb/CTvProgram.cpp @@ -0,0 +1,883 @@ +// +// +// amlogic 2013 +// +// @ Project : tv +// @ File Name : CTvProgram.cpp +// @ Date : 2013-11 +// @ Author : +// +// + + +#include "CTvProgram.h" +#include "CTvDatabase.h" +#include "CTvChannel.h" +#include "CTvEvent.h" + +#ifdef LOG_TAG +#undef LOG_TAG +#define LOG_TAG "CTvProgram" +#endif + +CTvProgram::CTvProgram(CTvDatabase::Cursor &c) +{ + CreateFromCursor(c); +} + +CTvProgram::~CTvProgram() +{ + //free mem + // video + if (mpVideo != NULL) delete mpVideo; + // audios + int size = mvAudios.size(); + for (int i = 0; i < size; i++) + delete mvAudios[i]; + // subtitles + size = mvSubtitles.size(); + for (int i = 0; i < size; i++) + delete mvSubtitles[i]; + // teletexts + size = mvTeletexts.size(); + for (int i = 0; i < size; i++) + delete mvTeletexts[i]; +} + +CTvProgram::CTvProgram(int channelID, int type) +{ + mpVideo = NULL; +} + +CTvProgram::CTvProgram() +{ + mpVideo = NULL; +} +int CTvProgram::CreateFromCursor(CTvDatabase::Cursor &c) +{ + int i = 0; + int col; + int num, type; + int major, minor; + char tmp_buf[256]; + //LOGD("CTvProgram::CreateFromCursor"); + col = c.getColumnIndex("db_id"); + this->id = c.getInt(col); + + col = c.getColumnIndex("source_id"); + this->sourceID = c.getInt(col); + + col = c.getColumnIndex("src"); + this->src = c.getInt(col); + + col = c.getColumnIndex("service_id"); + this->dvbServiceID = c.getInt(col); + + col = c.getColumnIndex("db_ts_id"); + this->channelID = c.getInt(col); + + col = c.getColumnIndex("name"); + this->name = c.getString(col); + + col = c.getColumnIndex("chan_num"); + num = c.getInt(col); + + col = c.getColumnIndex("chan_order"); + this->chanOrderNum = c.getInt(col); + + col = c.getColumnIndex("major_chan_num"); + major = c.getInt(col); + + col = c.getColumnIndex("minor_chan_num"); + minor = c.getInt(col); + + col = c.getColumnIndex("aud_track"); + this->audioTrack = c.getInt(col); + + //节目号信息初? + if (src == CTvChannel::MODE_ATSC || (src == CTvChannel::MODE_ANALOG && major > 0)) { + this->major = major; + this->minor = minor; + this->atscMode = true; + this->minorCheck = MINOR_CHECK_NONE; + } else { + this->major = num; + this->minor = 0; + this->atscMode = false; + this->minorCheck = MINOR_CHECK_NONE; + } + + col = c.getColumnIndex("service_type"); + this->type = c.getInt(col); + + col = c.getColumnIndex("pmt_pid"); + pmtPID = c.getInt(col); + + //LOGD("CTvProgram::CreateFromCursor type = %d", this->type); + col = c.getColumnIndex("skip"); + this->skip = c.getInt(col); + + col = c.getColumnIndex("lock"); + this->lock = (c.getInt(col) != 0); + + col = c.getColumnIndex("scrambled_flag"); + this->scrambled = (c.getInt(col) != 0); + + col = c.getColumnIndex("favor"); + this->favorite = (c.getInt(col) != 0); + + col = c.getColumnIndex("volume"); + this->volume = c.getInt(col); + + //Video + int pid, fmt; + col = c.getColumnIndex("vid_pid"); + pid = c.getInt(col); + + col = c.getColumnIndex("vid_fmt"); + fmt = c.getInt(col); + + //LOGD("----------vpid = %d", pid); + this->mpVideo = new Video(pid, fmt); + //LOGD("----------vpid = %d", this->mpVideo->getPID()); + + + //Audio + String8 strPids; + String8 strFmts; + String8 strLangs; + int count = 0; + col = c.getColumnIndex("aud_pids"); + strPids = c.getString(col); + + col = c.getColumnIndex("aud_fmts"); + strFmts = c.getString(col); + + col = c.getColumnIndex("aud_langs"); + strLangs = c.getString(col); + col = c.getColumnIndex("current_aud"); + this->currAudTrackIndex = c.getInt(col); + + char *tmp; + Vector<String8> vpid ; + Vector<String8> vfmt ; + Vector<String8> vlang; + + tmp = strtok(strPids.lockBuffer(strPids.length()), " "); + while (tmp != NULL) { + vpid.push_back(String8(tmp)); + tmp = strtok(NULL, " "); + } + strPids.unlockBuffer(); + + tmp = strtok(strFmts.lockBuffer(strFmts.length()), " "); + while (tmp != NULL) { + vfmt.push_back(String8(tmp)); + tmp = strtok(NULL, " "); + } + strFmts.unlockBuffer(); + + tmp = strtok(strLangs.lockBuffer(strLangs.length()), " "); + + while (tmp != NULL) { + vlang.push_back(String8(tmp)); + tmp = strtok(NULL, " "); + } + strLangs.unlockBuffer(); + + //check empty aud_langs + for (i = vlang.size(); i < vpid.size(); i++) { + sprintf(tmp_buf, "Audio%d", i + 1); + vlang.push_back(String8(tmp_buf)); + LOGE("%s, aud_langs is empty, add dummy data (%s).\n", "TV", tmp_buf); + } + + //String8 l(vlang[i]); + for (i = 0; i < vpid.size(); i++) { + int i_pid = atoi(vpid[i]); + int i_fmt = atoi(vfmt[i]); + mvAudios.push_back(new Audio(i_pid, vlang[i], i_fmt)); + } + + + + /* parse subtitles */ + vpid.clear(); + vlang.clear(); + Vector<String8> vcid; + Vector<String8> vaid; + String8 strCids; + String8 strAids; + + col = c.getColumnIndex("sub_pids"); + strPids = c.getString(col); + + col = c.getColumnIndex("sub_composition_page_ids"); + strCids = c.getString(col); + + col = c.getColumnIndex("sub_ancillary_page_ids"); + strAids = c.getString(col); + + + col = c.getColumnIndex("sub_langs"); + strLangs = c.getString(col); + + tmp = strtok(strPids.lockBuffer(strPids.length()), " "); + while (tmp != NULL) { + vpid.push_back(String8(tmp)); + tmp = strtok(NULL, " "); + } + strPids.unlockBuffer(); + + tmp = strtok(strCids.lockBuffer(strCids.length()), " "); + while (tmp != NULL) { + vcid.push_back(String8(tmp)); + tmp = strtok(NULL, " "); + } + strCids.unlockBuffer(); + + tmp = strtok(strAids.lockBuffer(strAids.length()), " "); + while (tmp != NULL) { + vaid.push_back(String8(tmp)); + tmp = strtok(NULL, " "); + } + strAids.unlockBuffer(); + + tmp = strtok(strLangs.lockBuffer(strLangs.length()), " "); + while (tmp != NULL) { + vlang.push_back(String8(tmp)); + tmp = strtok(NULL, " "); + } + strLangs.unlockBuffer(); + + //Subtitle + for (int i = 0; i < vpid.size(); i++) { + this->mvSubtitles.push_back(new Subtitle( + atoi(vpid[i]), + String8(vlang[i]), Subtitle::TYPE_DVB_SUBTITLE, + atoi(vcid[i]), + atoi(vaid[i]))); + } + + /* parse teletexts */ + int ttx_count = 0, ttx_sub_count = 0; + String8 str_ttx_pids, str_ttx_types, str_mag_nos, str_page_nos, str_ttx_langs; + Vector<String8> v_ttx_pids, v_ttx_types, v_mag_nos, v_page_nos, v_ttx_langs; + col = c.getColumnIndex("ttx_pids"); + str_ttx_pids = c.getString(col); + + col = c.getColumnIndex("ttx_types"); + str_ttx_types = c.getString(col); + + col = c.getColumnIndex("ttx_magazine_nos"); + str_mag_nos = c.getString(col); + + col = c.getColumnIndex("ttx_page_nos"); + str_page_nos = c.getString(col); + + col = c.getColumnIndex("ttx_langs"); + str_ttx_langs = c.getString(col); + + tmp = strtok(str_ttx_pids.lockBuffer(str_ttx_pids.length()), " "); + while (tmp != NULL) { + v_ttx_pids.push_back(String8(tmp)); + tmp = strtok(NULL, " "); + } + str_ttx_pids.unlockBuffer(); + + tmp = strtok(str_ttx_types.lockBuffer(str_ttx_types.length()), " "); + while (tmp != NULL) { + v_ttx_types.push_back(String8(tmp)); + tmp = strtok(NULL, " "); + } + str_ttx_types.unlockBuffer(); + + tmp = strtok(str_mag_nos.lockBuffer(str_mag_nos.length()), " "); + while (tmp != NULL) { + v_mag_nos.push_back(String8(tmp)); + tmp = strtok(NULL, " "); + } + str_mag_nos.unlockBuffer(); + + tmp = strtok(str_page_nos.lockBuffer(str_page_nos.length()), " "); + while (tmp != NULL) { + v_page_nos.push_back(String8(tmp)); + tmp = strtok(NULL, " "); + } + str_page_nos.unlockBuffer(); + + tmp = strtok(str_ttx_langs.lockBuffer(str_ttx_langs.length()), " "); + while (tmp != NULL) { + v_ttx_langs.push_back(String8(tmp)); + tmp = strtok(NULL, " "); + } + str_ttx_langs.unlockBuffer(); + + + for (int i = 0; i < v_ttx_pids.size(); i++) { + int ttype = atoi(v_ttx_types[i]); + if (ttype == 0x2 || ttype == 0x5) { + this->mvSubtitles.push_back(new Subtitle( + atoi(v_ttx_pids[i].string()), + String8(v_ttx_langs[i]), Subtitle::TYPE_DTV_TELETEXT, + atoi(v_mag_nos[i]), + atoi(v_page_nos[i]))); + } else { + this->mvTeletexts.push_back(new Teletext( + atoi(v_ttx_pids[i]), + String8(v_ttx_langs[i]), + atoi(v_mag_nos[i]), + atoi(v_page_nos[i]))); + } + } + return 0; +} + +int CTvProgram::selectProgramInChannelByNumber(int channelID, int num, CTvDatabase::Cursor &c) +{ + String8 cmd = String8("select * from srv_table where db_ts_id = ") + String8::format("%d", channelID) + String8(" and "); + cmd += String8("chan_num = ") + String8::format("%d", num); + return CTvDatabase::GetTvDb()->select(cmd, c); +} + + +int CTvProgram::selectProgramInChannelByNumber(int channelID, int major, int minor, CTvDatabase::Cursor &c) +{ + String8 cmd = String8("select * from srv_table where db_ts_id = ") + String8::format("%d", channelID) + String8(" and "); + cmd += String8("major_chan_num = ") + String8::format("%d", major) + String8(" and minor_chan_num = ") + String8::format("%d", minor); + + return CTvDatabase::GetTvDb()->select(cmd, c); +} + +/** + *向数据库添加一个Program,not atscMode + */ +CTvProgram::CTvProgram(int channelID, int type, int num, int skipFlag) +{ + CTvChannel channel; + int ret = CTvChannel::selectByID(channelID, channel); + if (ret != 0) { + //Log.d(TAG, "Cannot add new program, invalid channel id "+channelID); + this->id = -1; + } else { + CTvDatabase::Cursor c ; + selectProgramInChannelByNumber(channelID, num, c); + + if (c.moveToFirst()) { + /*Construct*/ + CreateFromCursor(c); + } else { + String8 tpids = String8(""), ttypes = String8(""), tmagnums = String8(""), tpgnums = String8(""), tlangs = String8(""); + String8 spids = String8(""), stypes = String8(""), scpgids = String8(""), sapgids = String8(""), slangs = String8(""); + + /*add a new atv program to database*/ + String8 cmd = String8("insert into srv_table(db_net_id,db_ts_id,service_id,src,name,service_type,"); + cmd += String8("eit_schedule_flag,eit_pf_flag,running_status,free_ca_mode,volume,aud_track,vid_pid,"); + cmd += String8("vid_fmt,aud_pids,aud_fmts,aud_langs,skip,lock,chan_num,major_chan_num,"); + cmd += String8("minor_chan_num,access_controlled,hidden,hide_guide,source_id,favor,current_aud,"); + cmd += String8("current_sub,sub_pids,sub_types,sub_composition_page_ids,sub_ancillary_page_ids,sub_langs,"); + cmd += String8("current_ttx,ttx_pids,ttx_types,ttx_magazine_nos,ttx_page_nos,ttx_langs,"); + cmd += String8("db_sat_para_id,scrambled_flag,lcn,hd_lcn,sd_lcn,default_chan_num,chan_order) "); + cmd += String8("values(-1,") + String8::format("%d", channelID) + String8(",65535,") + String8::format("%d", channel.getMode()) + String8(",'',") + String8::format("%d", type) + String8(","); + cmd += String8("0,0,0,0,0,0,8191,"); + int chanNum = num; + int majorNum = 0; + cmd += String8("-1,'','','',") + String8::format("%d", skipFlag) + String8(",0,") + String8::format("%d", chanNum) + String8(",") + String8::format("%d", majorNum) + String8(","); + cmd += String8("") + /*num.getMinor()*/String8("0") + String8(",0,0,0,-1,0,-1,"); + cmd += String8("-1,'") + spids + String8("','") + stypes + String8("','") + scpgids + String8("','") + sapgids + String8("','") + slangs + String8("',"); + cmd += String8("-1,'") + tpids + String8("','") + ttypes + String8("','") + tmagnums + String8("','") + tpgnums + String8("','") + tlangs + String8("',"); + cmd += String8("-1,0,-1,-1,-1,-1,0)"); + CTvDatabase::GetTvDb()->exeSql(cmd.string()); + + CTvDatabase::Cursor cr; + selectProgramInChannelByNumber(channelID, num, cr); + if (cr.moveToFirst()) { + /*Construct*/ + CreateFromCursor(cr); + } else { + /*A critical error*/ + //Log.d(TAG, "Cannot add new program, sqlite error"); + this->id = -1; + } + cr.close(); + } + c.close(); + } + +} + + +/** + *向数据库添加一个Program,atscMode + */ +CTvProgram::CTvProgram(int channelID, int type, int major, int minor, int skipFlag) +{ + CTvChannel channel; + int ret = CTvChannel::selectByID(channelID, channel); + if (ret != 0) { + //Log.d(TAG, "Cannot add new program, invalid channel id "+channelID); + this->id = -1; + } else { + CTvDatabase::Cursor c ; + selectProgramInChannelByNumber(channelID, major, minor, c); + + if (c.moveToFirst()) { + /*Construct*/ + CreateFromCursor(c); + } else { + String8 tpids = String8(""), ttypes = String8(""), tmagnums = String8(""), tpgnums = String8(""), tlangs = String8(""); + String8 spids = String8(""), stypes = String8(""), scpgids = String8(""), sapgids = String8(""), slangs = String8(""); + + /*add a new atv program to database*/ + String8 cmd = String8("insert into srv_table(db_net_id,db_ts_id,service_id,src,name,service_type,"); + cmd += String8("eit_schedule_flag,eit_pf_flag,running_status,free_ca_mode,volume,aud_track,vid_pid,"); + cmd += String8("vid_fmt,aud_pids,aud_fmts,aud_langs,skip,lock,chan_num,major_chan_num,"); + cmd += String8("minor_chan_num,access_controlled,hidden,hide_guide,source_id,favor,current_aud,"); + cmd += String8("current_sub,sub_pids,sub_types,sub_composition_page_ids,sub_ancillary_page_ids,sub_langs,"); + cmd += String8("current_ttx,ttx_pids,ttx_types,ttx_magazine_nos,ttx_page_nos,ttx_langs,"); + cmd += String8("db_sat_para_id,scrambled_flag,lcn,hd_lcn,sd_lcn,default_chan_num,chan_order) "); + cmd += String8("values(-1,") + String8::format("%d", channelID) + String8(",65535,") + String8::format("%d", channel.getMode()) + String8(",'',") + String8::format("%d", type) + String8(","); + cmd += String8("0,0,0,0,0,0,8191,"); + int chanNum = major << 16 | minor; + int majorNum = major; + cmd += String8("-1,'','','',") + String8::format("%d", skipFlag) + String8(",0,") + String8::format("%d", chanNum) + String8(",") + String8::format("%d", majorNum) + String8(","); + cmd += String8("") + String8::format("%d", minor) + String8(",0,0,0,-1,0,-1,"); + cmd += String8("-1,'") + spids + String8("','") + stypes + String8("','") + scpgids + String8("','") + sapgids + String8("','") + slangs + String8("',"); + cmd += String8("-1,'") + tpids + String8("','") + ttypes + String8("','") + tmagnums + String8("','") + tpgnums + String8("','") + tlangs + String8("',"); + cmd += String8("-1,0,-1,-1,-1,-1,0)"); + CTvDatabase::GetTvDb()->exeSql(cmd.string()); + + CTvDatabase::Cursor cr; + selectProgramInChannelByNumber(channelID, major, minor, cr); + if (cr.moveToFirst()) { + /*Construct*/ + CreateFromCursor(cr); + } else { + /*A critical error*/ + //Log.d(TAG, "Cannot add new program, sqlite error"); + this->id = -1; + } + cr.close(); + } + c.close(); + } + +} +/** + *根据记录ID查找指定TVProgram +*/ + +int CTvProgram::selectByID(int id, CTvProgram &prog) +{ + + CTvDatabase::Cursor c; + String8 sql; + sql = String8("select * from srv_table where srv_table.db_id = ") + String8::format("%d", id); + CTvDatabase::GetTvDb()->select(sql.string(), c) ; + if (c.moveToFirst()) { + prog.CreateFromCursor(c); + } else { + c.close(); + return -1; + } + c.close(); + return 0; +} + +int CTvProgram::updateVolComp(int progID, int volValue) +{ + String8 cmd = String8("update srv_table set volume = ") + String8::format("%d", volValue) + + String8(" where srv_table.db_id = ") + String8::format("%d", progID); + LOGD("%s, cmd = %s\n", "TV", cmd.string()); + CTvDatabase::GetTvDb()->exeSql(cmd.string()); + + return 0; +} + +int CTvProgram::getChannel(CTvChannel &c) +{ + return CTvChannel::selectByID(channelID, c); +} + +int CTvProgram::upDateChannel(CTvChannel &c, int std, int Freq, int fineFreq) +{ + return CTvChannel::updateByID(channelID, std, Freq, fineFreq); +} + +int CTvProgram::deleteChannelsProgram(CTvChannel &c) +{ + String8 cmd; + cmd = String8("delete from srv_table where srv_table.db_ts_id = ") + String8::format("%d", c.getID()); + CTvDatabase::GetTvDb()->exeSql(cmd.string()); + return 0; +} + + +/** + *根据节目类型和节目号查找指定TVProgram +*/ +int CTvProgram::selectByNumber(int type, int num, CTvProgram &prog) +{ + String8 cmd; + + cmd = String8("select * from srv_table where "); + if (type != TYPE_UNKNOWN) { + if (type == TYPE_DTV) { + cmd += String8("(service_type = ") + String8::format("%d", TYPE_TV) + String8(" or service_type = ") + String8::format("%d", TYPE_RADIO) + String8(") and "); + } else { + cmd += String8("service_type = ") + String8::format("%d", type) + String8(" and "); + } + } + + cmd += String8("chan_num = ") + String8::format("%d", num); + + CTvDatabase::Cursor c; + CTvDatabase::GetTvDb()->select(cmd, c); + + if (c.moveToFirst()) { + prog.CreateFromCursor(c); + } else { + c.close(); + return -1; + } + c.close(); + + return 0; +} + +/** + *根据节目类型和节目号查找指定TVProgram +*/ +int CTvProgram::selectByNumber(int type, int major, int minor, CTvProgram &prog, int minor_check) +{ + String8 cmd; + + cmd = String8("select * from srv_table where "); + if (type != TYPE_UNKNOWN) { + if (type == TYPE_DTV) { + cmd += String8("(service_type = ") + String8::format("%d", TYPE_TV) + String8(" or service_type = ") + String8::format("%d", TYPE_RADIO) + String8(") and "); + } else { + cmd += String8("service_type = ") + String8::format("%d", type) + String8(" and "); + } + } + + if (minor < 0) { + /*recursive call*/ + /*select dtv program first*/ + //showbo + int ret = selectByNumber(TYPE_DTV, major, 1, prog, MINOR_CHECK_NEAREST_UP); + if (ret != 0) { + /*then try atv program*/ + selectByNumber(TYPE_ATV, major, 0 , prog, MINOR_CHECK_NONE); + } + return 0; + } else if (minor >= 1) { + if (minor_check == MINOR_CHECK_UP) { + cmd += String8("major_chan_num = ") + String8::format("%d", major) + String8(" and minor_chan_num >= ") + String8::format("%d", minor) + String8(" "); + cmd += String8("order by minor_chan_num DESC limit 1"); + } else if (minor_check == MINOR_CHECK_DOWN) { + cmd += String8("major_chan_num = ") + String8::format("%d", major) + String8(" and minor_chan_num <= ") + String8::format("%d", minor) + String8(" "); + cmd += String8("order by minor_chan_num limit 1"); + } else if (minor_check == MINOR_CHECK_NEAREST_UP) { + cmd += String8("major_chan_num = ") + String8::format("%d", major) + String8(" and minor_chan_num >= ") + String8::format("%d", minor) + String8(" "); + cmd += String8("order by minor_chan_num limit 1"); + } else if (minor_check == MINOR_CHECK_NEAREST_DOWN) { + cmd += String8("major_chan_num = ") + String8::format("%d", major) + String8(" and minor_chan_num <= ") + String8::format("%d", minor) + String8(" "); + cmd += String8("order by minor_chan_num DESC limit 1"); + } else { + cmd += String8("major_chan_num = ") + String8::format("%d", major) + String8(" and minor_chan_num = ") + String8::format("%d", minor); + } + } else { + cmd += String8("major_chan_num = ") + String8::format("%d", major) + String8(" and minor_chan_num = ") + String8::format("%d", minor); + } + + + CTvDatabase::Cursor c; + CTvDatabase::GetTvDb()->select(cmd, c); + + if (c.moveToFirst()) { + prog.CreateFromCursor(c); + } else { + c.close(); + return -1; + } + c.close(); + + return 0; +} + + +/** + *列出一个channel的全部TVProgram + *@param channelID channel id + *@param type 节目类型 + */ +int CTvProgram::selectByChannel(int channelID, int type, Vector<sp<CTvProgram> > &out) +{ + + //Vector<CTvProgram*> vp; + String8 cmd = String8("select * from srv_table "); + + + if (type == TYPE_DTV) { + cmd += String8("where (service_type = ") + String8::format("%d", TYPE_TV) + String8(" or service_type = ") + String8::format("%d", TYPE_RADIO) + String8(") "); + } else if (type != TYPE_UNKNOWN) { + cmd += String8("where service_type = ") + String8::format("%d", type) + String8(" "); + } + + cmd += String8(" and db_ts_id = ") + String8::format("%d", channelID) + String8(" order by chan_order"); + + CTvDatabase::Cursor c; + int ret = CTvDatabase::GetTvDb()->select(cmd, c); + + LOGD("selectByChannel select ret = %d", ret); + + if (c.moveToFirst()) { + do { + out.add(new CTvProgram(c)); + } while (c.moveToNext()); + } + c.close(); + + return 0; +} + +void CTvProgram::deleteProgram(int progId) +{ + String8 cmd; + + cmd = String8("delete from srv_table where srv_table.db_id = ") + String8::format("%d", progId); + CTvDatabase::GetTvDb()->exeSql(cmd.string()); +} + +int CTvProgram::CleanAllProgramBySrvType(int srvType) +{ + String8 cmd = String8("delete from srv_table where service_type = ") + String8::format("%d", srvType); + CTvDatabase::GetTvDb()->exeSql(cmd.string()); + return 0; +} + +int CTvProgram::selectByType(int type, int skip, Vector<sp<CTvProgram> > &out) +{ + String8 cmd = String8("select * from srv_table "); + LOGD("%s, type= %d\n", "TV", (int)type); + + if (type == TYPE_UNKNOWN) { + cmd += String8("where (service_type = ") + String8::format("%d", TYPE_ATV) + + String8(" or service_type = ") + String8::format("%d", TYPE_DTV) + + String8(" or service_type = ") + String8::format("%d", TYPE_RADIO) + + String8(") "); + } else { + cmd += String8("where service_type = ") + String8::format("%d", type) + String8(" "); + } + + if (skip == PROGRAM_SKIP_NO || skip == PROGRAM_SKIP_YES) + cmd += String8(" and skip = ") + String8::format("%d", skip) + String8(" "); + + cmd += String8(" order by chan_order"); + + CTvDatabase::Cursor c; + int ret = CTvDatabase::GetTvDb()->select(cmd, c); + + LOGD("selectByChannel select ret = %d", ret); + + if (c.moveToFirst()) { + do { + out.add(new CTvProgram(c)); + } while (c.moveToNext()); + } + c.close(); + + return 0; +} + +int CTvProgram::selectByChanID(int type, int skip, Vector < sp < CTvProgram > > &out) +{ + String8 cmd = String8("select * from srv_table "); + + if (type == TYPE_UNKNOWN) { + cmd += String8("where (service_type = ") + String8::format("%d", TYPE_ATV) + + String8(" or service_type = ") + String8::format("%d", TYPE_DTV) + + String8(") "); + } else { + cmd += String8("where service_type = ") + String8::format("%d", type) + String8(" "); + } + + if (skip == PROGRAM_SKIP_NO || skip == PROGRAM_SKIP_YES) + cmd += String8(" and skip = ") + String8::format("%d", PROGRAM_SKIP_NO) + + String8(" or skip = ") + String8::format("%d", PROGRAM_SKIP_YES) + String8(" "); + + cmd += String8(" order by db_id"); + + CTvDatabase::Cursor c; + int ret = CTvDatabase::GetTvDb()->select(cmd, c); + + if (c.moveToFirst()) { + do { + out.add(new CTvProgram(c)); + } while (c.moveToNext()); + } + c.close(); + + return 0; + +} + +int CTvProgram::selectAll(bool no_skip, Vector<sp<CTvProgram> > &out) +{ + return selectByType(TYPE_UNKNOWN, no_skip, out); +} + +Vector<CTvProgram> CTvProgram::selectByChannel(int channelID) +{ + Vector<CTvProgram> vProg; + return vProg; +} + +Vector<CTvProgram> CTvProgram::selectByName(int name) +{ + Vector<CTvProgram> vProg; + return vProg; +} + +void CTvProgram::tvProgramDelByChannelID(int channelID) +{ + +} + + +String8 CTvProgram::getName() +{ + return name; +} +int CTvProgram::getProgSkipFlag() +{ + return skip; +} + +/** + *取得当前的audio索引 + *@param defaultLang 用户未选择语言时,默认的全局语言 + *@return 当前的Audio索引 + */ +int CTvProgram::getCurrentAudio(String8 defaultLang) +{ + CTvDatabase::Cursor c; + String8 cmd; + cmd = String8("select current_aud from srv_table where db_id = ") + String8::format("%d", this->id); + int ret = CTvDatabase::GetTvDb()->select(cmd, c); + LOGD("getCurrentAudio a size = %d", mvAudios.size()); + int id = 0; + if (c.moveToFirst()) { + id = c.getInt(0); + LOGD("getCurrentAudio a id = %d", id); + if (id < 0 && mvAudios.size() > 0) { + LOGD("getCurrentAudio defaultLang.isEmpty() =%s= %d", defaultLang.string(), defaultLang.isEmpty()); + if (!defaultLang.isEmpty()) { + for (int i = 0; i < mvAudios.size(); i++) { + LOGD("getCurrentAudio a mvAudios[i] = %d", mvAudios[i]); + if (mvAudios[i]->getLang() == defaultLang) { + id = i; + break; + } + } + } + + if (id < 0) { + /* still not found, using the first */ + id = 0; + } + } + } + LOGD("getCurrentAudio a idsss = %d", id); + c.close(); + + return id; +} + +int CTvProgram::getCurrAudioTrackIndex() +{ + int audTrackIdx = -1; + + if (-1 == currAudTrackIndex) { // no set field "current_aud" + audTrackIdx = getCurrentAudio(String8("eng")); + setCurrAudioTrackIndex(this->id, audTrackIdx); + } else { + audTrackIdx = currAudTrackIndex; + } + + return audTrackIdx; +} + + +void CTvProgram::setCurrAudioTrackIndex(int programId, int audioIndex) +{ + String8 cmd; + + cmd = String8("update srv_table set current_aud = ") + + String8::format("%d", audioIndex) + String8(" where srv_table.db_id = ") + String8::format("%d", programId); + + CTvDatabase::GetTvDb()->exeSql(cmd.string()); +} + +void CTvProgram::setFavoriteFlag(int progId, bool bFavor) +{ + String8 cmd; + + cmd = String8("update srv_table set favor = ") + + String8::format("%d", bFavor ? 1 : 0) + String8(" where srv_table.db_id = ") + String8::format("%d", progId); + + CTvDatabase::GetTvDb()->exeSql(cmd.string()); + +} + +void CTvProgram::setSkipFlag(int progId, bool bSkipFlag) +{ + String8 cmd; + + cmd = String8("update srv_table set skip = ") + String8::format("%d", bSkipFlag ? 1 : 0) + + String8(" where srv_table.db_id = ") + String8::format("%d", progId); + + CTvDatabase::GetTvDb()->exeSql(cmd.string()); +} + +void CTvProgram::updateProgramName(int progId, String8 strName) +{ + String8 newName = String8("xxx") + strName; + String8 cmd; + + cmd = String8("update srv_table set name =") + "\'" + String8::format("%s", newName.string()) + "\'" + + String8(" where srv_table.db_id = ") + String8::format("%d", progId); + + CTvDatabase::GetTvDb()->exeSql(cmd.string()); +} + +void CTvProgram::swapChanOrder(int ProgId1, int chanOrderNum1, int ProgId2, int chanOrderNum2) +{ + String8 cmd; + + cmd = String8("update srv_table set chan_order = ") + String8::format("%d", chanOrderNum2) + + String8(" where db_id = ") + String8::format("%d", ProgId1); + CTvDatabase::GetTvDb()->exeSql(cmd.string()); + + String8 cmd2; + cmd2 = String8("update srv_table set chan_order = ") + String8::format("%d", chanOrderNum1) + + String8(" where db_id = ") + String8::format("%d", ProgId2); + CTvDatabase::GetTvDb()->exeSql(cmd2.string()); +} + + +void CTvProgram::setLockFlag(int progId, bool bLockFlag) +{ + String8 cmd; + + cmd = String8("update srv_table set lock = ") + String8::format("%d", bLockFlag ? 1 : 0) + + String8(" where srv_table.db_id = ") + String8::format("%d", progId); + + CTvDatabase::GetTvDb()->exeSql(cmd.string()); +} +bool CTvProgram::getLockFlag() +{ + return lock; +} + diff --git a/tvapi/libtv/tvdb/CTvProgram.h b/tvapi/libtv/tvdb/CTvProgram.h new file mode 100644 index 0000000..8abf94f --- a/dev/null +++ b/tvapi/libtv/tvdb/CTvProgram.h @@ -0,0 +1,536 @@ +// +// +// amlogic 2013 +// +// @ Project : tv +// @ File Name : CTvProgram.h +// @ Date : 2013-11 +// @ Author : +// +// + + +#if !defined(_CTVPROGRAM_H) +#define _CTVPROGRAM_H + +#include "CTvDatabase.h" +#include "CTvChannel.h" +#include <utils/String8.h> +#include <utils/RefBase.h> +#include <stdlib.h> +#include "CTvLog.h" +using namespace android; +// ProgramӦATVеһƵDTVеһservice +class CTvEvent; +class CTvProgram : public LightRefBase<CTvProgram> +{ +public: + /*this type value is link to enum AM_SCAN_ServiceType in am_scan.h + * enum AM_SCAN_ServiceType + { + AM_SCAN_SRV_UNKNOWN = 0, < δ֪ + AM_SCAN_SRV_DTV = 1, < ֵ + AM_SCAN_SRV_DRADIO = 2, < ֹ㲥 + AM_SCAN_SRV_ATV = 3, < ģ + }; + * / + /**δ*/ + static const int TYPE_UNKNOWN = 0; + /**ӽĿ*/ + static const int TYPE_TV = 4; + /**㲥Ŀ*/ + static const int TYPE_RADIO = 2; + /**ģĿ*/ + static const int TYPE_ATV = 3; + /**ݽĿ*/ + static const int TYPE_DATA = 5; + /**ֽĿ*/ + static const int TYPE_DTV = 1 ; + /** PVR/Timeshifting playback program*/ + static const int TYPE_PLAYBACK = 6; + + static const int PROGRAM_SKIP_NO = 0; + static const int PROGRAM_SKIP_YES = 1; + static const int PROGRAM_SKIP_UNKOWN = 2; + + /** + *ServiceеĻԪϢ + */ +public: + class Element + { + private : + int mpid; + + public : + Element(int pid) + { + this->mpid = pid; + } + /** + *ȡûԪصPID + *@return PID + */ + int getPID() + { + return mpid; + } + }; + + + + /** + *ԻԪϢ + */ +public: + class MultiLangElement : public Element + { + private : + String8 mlang; + + public : + MultiLangElement(int pid, String8 lang): Element(pid) + { + this->mlang = lang; + } + + /** + *ȡԪضӦ + *@return 3ַַ + */ + String8 getLang() + { + return mlang; + } + }; + + + + /** + *ƵϢ + */ +public : + class Video : public Element + { + public: + /**MPEG1/2*/ + static const int FORMAT_MPEG12 = 0; + /**MPEG4*/ + static const int FORMAT_MPEG4 = 1; + /**H.264*/ + static const int FORMAT_H264 = 2; + /**MJPEG*/ + static const int FORMAT_MJPEG = 3; + /**Real video*/ + static const int FORMAT_REAL = 4; + /**JPEG*/ + static const int FORMAT_JPEG = 5; + /**Microsoft VC1*/ + static const int FORMAT_VC1 = 6; + /**AVS*/ + static const int FORMAT_AVS = 7; + /**YUV*/ + static const int FORMAT_YUV = 8; + /**H.264 MVC*/ + static const int FORMAT_H264MVC = 9; + /**QJPEG*/ + static const int FORMAT_QJPEG = 10; + + Video(int pid, int fmt): Element(pid) + { + this->mformat = fmt; + } + + /** + *ȡƵʽ + *@return Ƶʽ + */ + int getFormat() + { + return mformat; + } + private : + int mformat; + }; + + /** + *ƵϢ + */ +public : + class Audio : public MultiLangElement + { + public : + /**MPEG*/ + static const int FORMAT_MPEG = 0; + /**PCM 16λС*/ + static const int FORMAT_PCM_S16LE = 1; + /**AAC*/ + static const int FORMAT_AAC = 2; + /**AC3*/ + static const int FORMAT_AC3 = 3; + /**ALAW*/ + static const int FORMAT_ALAW = 4; + /**MULAW*/ + static const int FORMAT_MULAW = 5; + /**DTS*/ + static const int FORMAT_DTS = 6; + /**PCM 16λ*/ + static const int FORMAT_PCM_S16BE = 7; + /**FLAC*/ + static const int FORMAT_FLAC = 8; + /**COOK*/ + static const int FORMAT_COOK = 9; + /**PCM 8λ*/ + static const int FORMAT_PCM_U8 = 10; + /**ADPCM*/ + static const int FORMAT_ADPCM = 11; + /**AMR*/ + static const int FORMAT_AMR = 12; + /**RAAC*/ + static const int FORMAT_RAAC = 13; + /**WMA*/ + static const int FORMAT_WMA = 14; + /**WMA Pro*/ + static const int FORMAT_WMAPRO = 15; + /**PCM*/ + static const int FORMAT_PCM_BLURAY = 16; + /**ALAC*/ + static const int FORMAT_ALAC = 17; + /**Vorbis*/ + static const int FORMAT_VORBIS = 18; + /**AAC latmʽ*/ + static const int FORMAT_AAC_LATM = 19; + /**APE*/ + static const int FORMAT_APE = 20; + + + Audio(int pid, String8 lang, int fmt): MultiLangElement(pid, lang) + { + this->mformat = fmt; + } + + /** + *ȡƵʽ + *@return Ƶʽ + */ + int getFormat() + { + return mformat; + } + private : + int mformat; + }; + + /** + *ĻϢ + */ +public : + class Subtitle : public MultiLangElement + { + public : + /**DVB subtitle*/ + static const int TYPE_DVB_SUBTITLE = 1; + /**ֵTeletext*/ + static const int TYPE_DTV_TELETEXT = 2; + /**ģTeletext*/ + static const int TYPE_ATV_TELETEXT = 3; + /**ֵClosed caption*/ + static const int TYPE_DTV_CC = 4; + /**ģClosed caption*/ + static const int TYPE_ATV_CC = 5; + + + + Subtitle(int pid, String8 lang, int type, int num1, int num2): MultiLangElement(pid, lang) + { + + this->type = type; + if (type == TYPE_DVB_SUBTITLE) { + compositionPage = num1; + ancillaryPage = num2; + } else if (type == TYPE_DTV_TELETEXT) { + magazineNo = num1; + pageNo = num2; + } + } + + /** + *ȡĻ + *@return Ļ + */ + int getType() + { + return type; + } + + /** + *ȡDVB subtitlecomposition page ID + *@return composition page ID + */ + int getCompositionPageID() + { + return compositionPage; + } + + /** + *ȡDVB subtitleancillary page ID + *@return ancillary page ID + */ + int getAncillaryPageID() + { + return ancillaryPage; + } + + /** + *ȡteletextmagazine number + *@return magazine number + */ + int getMagazineNumber() + { + return magazineNo; + } + + /** + *ȡteletextpage number + *@return page number + */ + int getPageNumber() + { + return pageNo; + } + + private : + int compositionPage; + int ancillaryPage; + int magazineNo; + int pageNo; + int type; + }; + + /** + *TeletextϢ + */ +public : + class Teletext : public MultiLangElement + { + public: + Teletext(int pid, String8 lang, int mag, int page): MultiLangElement(pid, lang) + { + magazineNo = mag; + pageNo = page; + } + + /** + *ȡteletextmagazine number + *@return magazine number + */ + int getMagazineNumber() + { + return magazineNo; + } + + /** + *ȡteletextpage number + *@return page number + */ + int getPageNumber() + { + return pageNo; + } + + private : + int magazineNo; + int pageNo; + }; + + //ĿϢ +public: + /**ûзƵû*/ + static const int MINOR_CHECK_NONE = 0; + /**ûзƵѰңƵӣ,ҵƵ*/ + static const int MINOR_CHECK_UP = 1; + /**ûзƵѰңƵּС,ҵƵС*/ + static const int MINOR_CHECK_DOWN = 2; + /*ûзƵѰңȻҵ.*/ + static const int MINOR_CHECK_NEAREST_UP = 3; + /*ûзƵѰңȻҵ.*/ + static const int MINOR_CHECK_NEAREST_DOWN = 4; + + /** + *ȡýĿ + *@return ؽĿ + */ + int getNumber() + { + return major; + } + + /** + *ȡĿ(ATSC) + *@return ؽĿĿ + */ + int getMajor() + { + return major; + } + + /** + *ȡôνĿ(ATSC) + *@return ؽĿĴνĿ + */ + int getMinor() + { + return minor; + } + + /** + *ǷΪATSCģʽ + *@return ATSCģʽtrue + */ + bool isATSCMode() + { + return atscMode; + } + + /** + *ȡƵԶҲ(ATSC) + *@return ƵԶҲ + */ + int getMinorCheck() + { + return minorCheck; + } + +private: + int major; + int minor; + int minorCheck; + bool atscMode; + + +public: + CTvProgram(CTvDatabase::Cursor &c); + CTvProgram(int channelID, int type, int num, int skipFlag); + /** + *ݿһProgram,atscMode + */ + CTvProgram(int channelID, int type, int major, int minor, int skipFlag); + ~CTvProgram(); + // ݿһProgram + CTvProgram(int channelID, int type); + + CTvProgram(); + + + int getCurrentAudio(String8 defaultLang); + Video *getVideo() + { + return mpVideo; + } + Audio *getAudio(int id) + { + if (mvAudios.size() <= 0) return NULL; + return mvAudios[id]; + } + + int getAudioTrackSize() + { + return mvAudios.size(); + } + static int selectByID(int id, CTvProgram &p); + static CTvProgram selectByNumber(int num, int type); + int selectByNumber(int type, int major, int minor, CTvProgram &prog, int minor_check = MINOR_CHECK_NONE); + int selectByNumber(int type, int num, CTvProgram &prog); + static int selectByChannel(int channelID, int type, Vector<sp<CTvProgram> > &out); + // гȫTVProgram + static int selectAll(bool no_skip, Vector<sp<CTvProgram> > &out); + static int selectByType(int type, int skip, Vector<sp<CTvProgram> > &out); + static int selectByChanID(int type, int skip, Vector<sp<CTvProgram> > &out); + static Vector<CTvProgram> selectByChannel(int channelID); + // ݽĿеĹؼֲָTVProgram + static Vector<CTvProgram> selectByName(int name); + void tvProgramDelByChannelID(int channelID); + int getID() + { + return id; + }; + int getSrc() + { + return src; + }; + int getProgType() + { + return type; + }; + int getChanOrderNum() + { + return chanOrderNum; + }; + int getChanVolume() + { + return volume; + }; + int getSourceId() + { + return sourceID; + }; + int getServiceId() + { + return dvbServiceID; + }; + int getProgSkipFlag(); + void setCurrAudioTrackIndex(int programId, int audioIndex); + int getCurrAudioTrackIndex(); + + String8 getName(); + void getCurrentSubtitle(); + void getCurrentTeletext(); + int getChannel(CTvChannel &c); + int upDateChannel(CTvChannel &c, int std, int freq, int fineFreq); + int updateVolComp(int progID, int volValue); + void updateProgramName(int progId, String8 strName); + void setSkipFlag(int progId, bool bSkipFlag); + void setFavoriteFlag(int progId, bool bFavor); + int getFavoriteFlag() + { + return favorite; + }; + void deleteProgram(int progId); + static int CleanAllProgramBySrvType(int srvType); + void setLockFlag(int progId, bool bLockFlag); + bool getLockFlag(); + void swapChanOrder(int ProgId1, int chanOrderNum1, int ProgId2, int chanOrderNum2); + static int deleteChannelsProgram(CTvChannel &c); +private: + int CreateFromCursor(CTvDatabase::Cursor &c); + int selectProgramInChannelByNumber(int channelID, int num, CTvDatabase::Cursor &c); + int selectProgramInChannelByNumber(int channelID, int major, int minor, CTvDatabase::Cursor &c); + CTvChannel channel; + int id; + int dvbServiceID; + int type; + String8 name; + int channelID; + int skip; + int favorite; + int volume; + int sourceID; + int pmtPID; + int src; + int audioTrack; + int chanOrderNum; + int currAudTrackIndex; + bool lock; + bool scrambled; + // videoϢ,Ͳ + Video *mpVideo; + // audioϢ,Ͳ + Vector<Audio *> mvAudios; + // subtitleϢͲ + Vector<Subtitle *> mvSubtitles; + // teletextϢ,Ͳ + Vector<Teletext *> mvTeletexts; + +}; + +#endif //_CTVPROGRAM_H diff --git a/tvapi/libtv/tvdb/CTvRegion.cpp b/tvapi/libtv/tvdb/CTvRegion.cpp new file mode 100644 index 0000000..7f87549 --- a/dev/null +++ b/tvapi/libtv/tvdb/CTvRegion.cpp @@ -0,0 +1,183 @@ +// +// +// amlogic 2013 +// +// @ Project : tv +// @ File Name : CTvRegion.cpp +// @ Date : 2013-11 +// @ Author : +// +// + + +#include "CTvRegion.h" +#include "CTvDatabase.h" + + +#ifdef LOG_TAG +#undef LOG_TAG +#define LOG_TAG "CTvRegion" +#endif + +CTvRegion::CTvRegion(CTvDatabase db) +{ + +} + +CTvRegion::CTvRegion() +{ + +} +CTvRegion::~CTvRegion() +{ + +} + +CTvRegion CTvRegion::selectByID() +{ + CTvRegion r; + return r; +} + +int CTvRegion::getChannelListByName(char *name, Vector<sp<CTvChannel> > &vcp) +{ + + if (name == NULL) + return -1; + + String8 cmd; + cmd = String8("select * from region_table where name = ") + String8("\'") + name + String8("\'"); + + CTvDatabase::Cursor c; + CTvDatabase::GetTvDb()->select(cmd, c); + int col, size = 0; + int id; + int mode; + int frequency = 0; + int bandwidth; + int modulation; + int symbolRate; + int ofdmMode; + int channelNum = 0; + + if (c.moveToFirst()) { + do { + col = c.getColumnIndex("db_id"); + id = c.getInt(col); + col = c.getColumnIndex("fe_type"); + mode = c.getInt(col); + col = c.getColumnIndex("frequency"); + frequency = c.getInt(col); + col = c.getColumnIndex("modulation"); + modulation = c.getInt(col); + col = c.getColumnIndex("bandwidth"); + bandwidth = c.getInt(col); + col = c.getColumnIndex("symbol_rate"); + symbolRate = c.getInt(col); + col = c.getColumnIndex("ofdm_mode"); + ofdmMode = c.getInt(col); + col = c.getColumnIndex("logical_channel_num"); + channelNum = c.getInt(col); + vcp.add(new CTvChannel(id, mode, frequency, bandwidth, modulation, symbolRate, ofdmMode, channelNum)); + size++; + } while (c.moveToNext()); + } + c.close(); + + return size; +} + +int CTvRegion::getChannelListByNameAndFreqRange(char *name, int beginFreq, int endFreq, Vector<sp<CTvChannel> > &vcp) +{ + if (name == NULL) + return -1; + int ret = 0; + String8 cmd; + cmd = String8("select * from region_table where name = ") + String8("\'") + name + String8("\'") + + String8(" and frequency >= ") + String8::format("%d", beginFreq) + String8(" and frequency <= ") + + String8::format("%d", endFreq); + + CTvDatabase::Cursor c; + CTvDatabase::GetTvDb()->select(cmd, c); + int col, size = 0; + int id; + int mode; + int frequency = 0; + int bandwidth; + int modulation; + int symbolRate; + int ofdmMode; + int channelNum = 0; + + do { + if (c.moveToFirst()) { + do { + col = c.getColumnIndex("db_id"); + id = c.getInt(col); + col = c.getColumnIndex("fe_type"); + mode = c.getInt(col); + col = c.getColumnIndex("frequency"); + frequency = c.getInt(col); + col = c.getColumnIndex("modulation"); + modulation = c.getInt(col); + col = c.getColumnIndex("bandwidth"); + bandwidth = c.getInt(col); + col = c.getColumnIndex("symbol_rate"); + symbolRate = c.getInt(col); + col = c.getColumnIndex("ofdm_mode"); + ofdmMode = c.getInt(col); + col = c.getColumnIndex("logical_channel_num"); + channelNum = c.getInt(col); + vcp.add(new CTvChannel(id, mode, frequency, bandwidth, modulation, symbolRate, ofdmMode, channelNum)); + size++; + } while (c.moveToNext()); + } else { + ret = -1; + break; + } + } while (false); + + c.close(); + return ret; +} +void CTvRegion::selectByCountry() +{ + +} + +Vector<String8> CTvRegion::getAllCountry() +{ + Vector<String8> vStr; + return vStr; +} + +CTvChannel CTvRegion::getChannels() +{ + CTvChannel p; + return p; +} + +int CTvRegion::getLogicNumByNameAndfreq(char *name, int freq) +{ + int ret = 0; + int col = 0; + + if (name == NULL) + return -1; + + String8 cmd; + cmd = String8("select * from region_table where name = ") + String8("\'") + name + String8("\'"); + cmd += String8(" and frequency = ") + String8::format("%d", freq); + + + CTvDatabase::Cursor c; + CTvDatabase::GetTvDb()->select(cmd, c); + if (c.moveToFirst()) { + col = c.getColumnIndex("logical_channel_num"); + ret = c.getInt(col); + } + c.close(); + + return ret; +} + diff --git a/tvapi/libtv/tvdb/CTvRegion.h b/tvapi/libtv/tvdb/CTvRegion.h new file mode 100644 index 0000000..e7ccdcd --- a/dev/null +++ b/tvapi/libtv/tvdb/CTvRegion.h @@ -0,0 +1,43 @@ +// +// +// amlogic 2013 +// +// @ Project : tv +// @ File Name : CTvRegion.h +// @ Date : 2013-11 +// @ Author : +// +// + + +#if !defined(_CTVREGION_H) +#define _CTVREGION_H + +#include "CTvDatabase.h" +#include "CTvChannel.h" +#include <utils/String8.h> +#include <utils/Vector.h> +// TV +// ԻÿƵбϢ +using namespace android; +class CTvRegion +{ +public: + int id; + String8 name; + String8 country; + CTvRegion(CTvDatabase db); + CTvRegion(); + ~CTvRegion(); + static CTvRegion selectByID(); + static int getChannelListByName(char *name, Vector<sp<CTvChannel> > &vcp); + static int getChannelListByNameAndFreqRange(char *name, int beginFreq, int endFreq, Vector<sp<CTvChannel> > &vcp); + static int getLogicNumByNameAndfreq(char *name, int freq); + void selectByCountry(); + Vector<String8> getAllCountry(); + // ȡøRegionźԴƵʲб + // @return źԴƵʲб + CTvChannel getChannels(); +}; + +#endif //_CTVREGION_H diff --git a/tvapi/libtv/tvin/CHDMIRxCEC.cpp b/tvapi/libtv/tvin/CHDMIRxCEC.cpp new file mode 100644 index 0000000..96ddb0b --- a/dev/null +++ b/tvapi/libtv/tvin/CHDMIRxCEC.cpp @@ -0,0 +1,654 @@ +#include "CTvin.h" + +#include <fcntl.h> +#include <sys/ioctl.h> +#include <errno.h> +#include <CTvLog.h> + +#include "../tvconfig/tvconfig.h" + +#define CC_ENABLE_PRINT_MESSAGE (0) + +#define CS_HDMIRX_CEC_PATH "/dev/hdmirx0" + +CTvin::CHDMIRxCEC::CHDMIRxCEC(CTvin *pTvin) +{ + int i = 0; + + for (i = 0; i < CC_REQUEST_LIST_SIZE; i++) { + ClrReplyListItem(&mReplyList[i]); + memset((void *) &mMsgBuf[i], 0, sizeof(struct _cec_msg)); + } + + mModuleEnableFlag = -1; + mRequestPause = false; + mState = STATE_STOPED; + + mpObserver = NULL; + mpTvin = pTvin; + + for (i = 0; i < CC_SOURCE_DEV_REFRESH_CNT; i++) { + mSourceDevLogicAddrBuf[i] = -1; + mSourceDevRefreshBuf[i] = -1; + } + + mSourceDevLogicAddrBuf[0] = E_LA_TV; + mSourceDevLogicAddrBuf[1] = E_LA_TV; + mSourceDevLogicAddrBuf[2] = E_LA_TV; + + mSourceDevRefreshBuf[0] = E_LA_PLAYBACK1; + mSourceDevRefreshBuf[1] = E_LA_PLAYBACK2; + mSourceDevRefreshBuf[2] = E_LA_PLYBACK3; +} + +CTvin::CHDMIRxCEC::~CHDMIRxCEC() +{ +} + +int CTvin::CHDMIRxCEC::start() +{ + CMutex::Autolock _l (mLock); + + if (GetModuleEnableFlag() == 0) { + return -1; + } + + if (mState == STATE_STOPED) { + this->run(); + } + + return mState; +} + +int CTvin::CHDMIRxCEC::stop() +{ + CMutex::Autolock _l (mLock); + + if (GetModuleEnableFlag() == 0) { + return -1; + } + + if (mState == STATE_PAUSE) { + resume(); + } + + requestExit(); + mState = STATE_STOPED; + return mState; +} + +int CTvin::CHDMIRxCEC::pause() +{ + CMutex::Autolock _l (mLock); + + if (GetModuleEnableFlag() == 0) { + return -1; + } + + mRequestPause = true; + return 0; +} + +int CTvin::CHDMIRxCEC::resume() +{ + CMutex::Autolock _l (mLock); + + if (GetModuleEnableFlag() == 0) { + return -1; + } + + ClearRxMessageBuffer(); + + mRequestPause = false; + mPauseCondition.signal(); + + ClearRxMessageBuffer(); + return 0; +} + +int CTvin::CHDMIRxCEC::isAllowOperate(int source_input) +{ + if (GetModuleEnableFlag() == 0) { + return -1; + } + + int source_port = CTvin::Tvin_GetSourcePortBySourceInput((tv_source_input_t)source_input); + if (mpTvin->VDIN_GetPortConnect(source_port) == false) { + return -1; + } + + return 0; +} + +int CTvin::CHDMIRxCEC::GetModuleEnableFlag() +{ + const char *config_value = NULL; + + if (mModuleEnableFlag < 0) { + config_value = config_get_str("TV", "tvin.hdmirx.cec.enable", "null"); + if (strcasecmp(config_value, "null") == 0) { + mModuleEnableFlag = 0; + } else if (strcasecmp(config_value, "1") == 0 || strcasecmp(config_value, "true") == 0) { + mModuleEnableFlag = 1; + } else { + mModuleEnableFlag = 0; + } + } + + return mModuleEnableFlag; +} + +int CTvin::CHDMIRxCEC::PrintMessage(const char *func_name, int data_type, struct _cec_msg *msg) +{ +#ifdef CC_ENABLE_PRINT_MESSAGE + if (msg == NULL) { + LOGE("%s, msg is NULL\n", func_name); + return -1; + } + + LOGD("%s, msg_len = %d\n", func_name, msg->msg_len); + LOGD("%s, msg addr 0x%02X\n", func_name, msg->addr); + LOGD("%s, msg cmd 0x%02X\n", func_name, msg->cmd); + for (int i = 0; i < msg->msg_len - 2; i++) { + if (data_type == 0) { + LOGD("%s, msg data[%d] = 0x%02X\n", func_name, i, msg->msg_data[i]); + } else { + LOGD("%s, msg data[%d] = %c\n", func_name, i, msg->msg_data[i]); + } + } +#endif + return 0; +} + +int CTvin::CHDMIRxCEC::ClrReplyListItem(HDMIRxRequestReplyItem *reply_item) +{ + if (reply_item == NULL) { + return -1; + } + + reply_item->WaitCmd = 0; + reply_item->WaitLogicAddr = 0; + reply_item->WaitTimeOut = 0; + reply_item->WaitFlag = 0; + reply_item->DataFlag = 0; + memset((void *) & (reply_item->msg), 0, sizeof(struct _cec_msg)); + + return 0; +} + +int CTvin::CHDMIRxCEC::CopyMessageData(unsigned char data_buf[], unsigned char msg_data[], int msg_len) +{ + if (data_buf == NULL) { + return 0; + } + + memset((void *)data_buf, 0, CC_CEC_STREAM_SIZE); + + if (msg_len > CC_CEC_STREAM_SIZE) { + return 0; + } + + if (msg_len <= 2) { + return 0; + } + + msg_len -= 2; + + memcpy(data_buf, msg_data, msg_len); + + return msg_len; +} + +int CTvin::CHDMIRxCEC::GetDeviceLogicAddr(int source_input) +{ + return mSourceDevLogicAddrBuf[source_input - SOURCE_HDMI1]; +} + +int CTvin::CHDMIRxCEC::processRefreshSrcDevice(int source_input) +{ + int i = 0, physical_addr = 0; + int source_port_1 = 0, source_port_2 = 0; + + if (source_input != SOURCE_HDMI1 && source_input != SOURCE_HDMI2 && source_input != SOURCE_HDMI3) { + return -1; + } + + mSourceDevLogicAddrBuf[0] = E_LA_TV; + mSourceDevLogicAddrBuf[1] = E_LA_TV; + mSourceDevLogicAddrBuf[2] = E_LA_TV; + + for (i = 0; i < CC_SOURCE_DEV_REFRESH_CNT; i++) { + if (mSourceDevRefreshBuf[i] < 0) { + continue; + } + + physical_addr = 0; + if (SendGivePhysicalAddressMessage(source_input, mSourceDevRefreshBuf[i], &physical_addr) > 0) { + source_port_1 = CTvin::Tvin_GetSourcePortBySourceInput((tv_source_input_t)source_input); + source_port_2 = CTvin::Tvin_GetSourcePortByCECPhysicalAddress(physical_addr); + if (source_port_1 == source_port_2) { + mSourceDevLogicAddrBuf[source_input - SOURCE_HDMI1] = mSourceDevRefreshBuf[i]; + break; + } + } + } + + if (i == CC_SOURCE_DEV_REFRESH_CNT) { + return -1; + } + + return 0; +} + +int CTvin::CHDMIRxCEC::ClearRxMessageBuffer() +{ + int m_cec_dev_fd = -1; + + m_cec_dev_fd = open(CS_HDMIRX_CEC_PATH, O_RDWR); + if (m_cec_dev_fd < 0) { + LOGE("%s, Open file %s error: (%s)!\n", __FUNCTION__, CS_HDMIRX_CEC_PATH, strerror ( errno )); + return -1; + } + + ioctl(m_cec_dev_fd, HDMI_IOC_CEC_CLEAR_BUFFER, NULL); + + close(m_cec_dev_fd); + m_cec_dev_fd = -1; + + return 0; +} + +int CTvin::CHDMIRxCEC::GetMessage(struct _cec_msg msg_buf[]) +{ + int i = 0; + int m_cec_dev_fd = -1; + int msg_cnt = 0; + + if (msg_buf == NULL) { + LOGE("%s, msg_buf is NULL\n", __FUNCTION__); + } + + m_cec_dev_fd = open(CS_HDMIRX_CEC_PATH, O_RDWR); + if (m_cec_dev_fd < 0) { + LOGE("%s, Open file %s error: (%s)!\n", __FUNCTION__, CS_HDMIRX_CEC_PATH, strerror ( errno )); + return 0; + } + + ioctl(m_cec_dev_fd, HDMI_IOC_CEC_GET_MSG_CNT, &msg_cnt); + if (msg_cnt > 0) { + LOGD("%s, msg_cnt = %d\n", __FUNCTION__, msg_cnt); + + for (i = 0; i < msg_cnt; i++) { + ioctl(m_cec_dev_fd, HDMI_IOC_CEC_GET_MSG, &msg_buf[i]); + PrintMessage(__FUNCTION__, 0, &msg_buf[i]); + } + } + + close(m_cec_dev_fd); + m_cec_dev_fd = -1; + + return msg_cnt; +} + + +int CTvin::CHDMIRxCEC::SendMessage(struct _cec_msg *msg) +{ + int m_cec_dev_fd = -1; + + if (msg == NULL) { + LOGE("%s, msg is NULL\n", __FUNCTION__); + } + + PrintMessage(__FUNCTION__, 0, msg); + + m_cec_dev_fd = open(CS_HDMIRX_CEC_PATH, O_RDWR); + if (m_cec_dev_fd < 0) { + LOGE("%s, Open file %s error: (%s)!\n", __FUNCTION__, CS_HDMIRX_CEC_PATH, strerror ( errno )); + return -1; + } + + ioctl(m_cec_dev_fd, HDMI_IOC_CEC_SENT_MSG, msg); + + close(m_cec_dev_fd); + m_cec_dev_fd = -1; + + return 0; +} + + + +int CTvin::CHDMIRxCEC::sendMessageAndWaitReply(struct _cec_msg *msg, struct _cec_msg *reply_msg, int WaitCmd, int timeout) +{ + int tmp_ret = 0, tmp_ind = 0; + + tmp_ret = SendMessage(msg); + if (tmp_ret < 0) { + return tmp_ret; + } + + reply_msg->msg_len = 0; + + HDMIRxRequestReplyItem reply_item; + reply_item.WaitCmd = WaitCmd; + reply_item.WaitLogicAddr = msg->addr; + reply_item.WaitTimeOut = timeout; + reply_item.WaitFlag = 1; + reply_item.DataFlag = 0; + + tmp_ind = addToRequestList(&reply_item); + + mReplyLock[tmp_ind].lock(); + mReplyList[tmp_ind].WaitReplyCondition.waitRelative(mReplyLock[tmp_ind], timeout);//wait reply + mReplyLock[tmp_ind].unlock(); + + if (mReplyList[tmp_ind].DataFlag == 1) { + PrintMessage(__FUNCTION__, 0, &mReplyList[tmp_ind].msg); + *reply_msg = mReplyList[tmp_ind].msg; + } else { + rmFromRequestList(tmp_ind); + return -1; + } + + rmFromRequestList(tmp_ind); + + return 0; +} + +int CTvin::CHDMIRxCEC::SendCustomMessage(int source_input, unsigned char data_buf[]) +{ + CECMsgStream msg_stream; + + if (isAllowOperate(source_input) < 0) { + return -1; + } + + memcpy((void *)msg_stream.buf, data_buf, CC_CEC_STREAM_SIZE); + if (msg_stream.msg.msg_len > CC_CEC_STREAM_SIZE) { + return -1; + } + + return SendMessage(&msg_stream.msg); +} + +int CTvin::CHDMIRxCEC::SendCustomMessageAndWaitReply(int source_input, unsigned char data_buf[], unsigned char reply_buf[], int WaitCmd, int timeout) +{ + CECMsgStream msg_stream; + struct _cec_msg reply_msg; + + if (isAllowOperate(source_input) < 0) { + return -1; + } + + memcpy((void *)msg_stream.buf, data_buf, CC_CEC_STREAM_SIZE); + if (msg_stream.msg.msg_len > CC_CEC_STREAM_SIZE) { + return -1; + } + + if (sendMessageAndWaitReply(&msg_stream.msg, &reply_msg, WaitCmd, timeout) < 0) { + return -1; + } + + return CopyMessageData(reply_buf, reply_msg.msg_data, reply_msg.msg_len); +} + +int CTvin::CHDMIRxCEC::SendBoradcastStandbyMessage(int source_input) +{ + struct _cec_msg msg; + + if (isAllowOperate(source_input) < 0) { + return -1; + } + + msg.addr = GetDeviceLogicAddr(source_input); + msg.cmd = E_MSG_STANDBY; + msg.msg_data[0] = 0; + msg.msg_len = 2; + + return SendMessage(&msg); +} + +int CTvin::CHDMIRxCEC::SendGiveCECVersionMessage(int source_input, unsigned char data_buf[]) +{ + struct _cec_msg msg, reply_msg; + + if (isAllowOperate(source_input) < 0) { + return -1; + } + + if (data_buf == NULL) { + return -1; + } + + msg.addr = GetDeviceLogicAddr(source_input); + msg.cmd = E_MSG_GET_CEC_VERSION; + msg.msg_data[0] = 0; + msg.msg_len = 2; + + if (sendMessageAndWaitReply(&msg, &reply_msg, E_MSG_CEC_VERSION, 2000) < 0) { + return -1; + } + + return CopyMessageData(data_buf, reply_msg.msg_data, reply_msg.msg_len); +} + +int CTvin::CHDMIRxCEC::SendGiveDeviceVendorIDMessage(int source_input, unsigned char data_buf[]) +{ + struct _cec_msg msg, reply_msg; + + if (isAllowOperate(source_input) < 0) { + return -1; + } + + if (data_buf == NULL) { + return -1; + } + + msg.addr = GetDeviceLogicAddr(source_input); + msg.cmd = E_MSG_GIVE_DEVICE_VENDOR_ID; + msg.msg_data[0] = 0; + msg.msg_len = 2; + + if (sendMessageAndWaitReply(&msg, &reply_msg, E_MSG_DEVICE_VENDOR_ID, 2000) < 0) { + return -1; + } + + return CopyMessageData(data_buf, reply_msg.msg_data, reply_msg.msg_len); +} + +int CTvin::CHDMIRxCEC::SendGiveOSDNameMessage(int source_input, unsigned char data_buf[]) +{ + struct _cec_msg msg, reply_msg; + + if (isAllowOperate(source_input) < 0) { + return -1; + } + + if (data_buf == NULL) { + return -1; + } + + msg.addr = GetDeviceLogicAddr(source_input); + msg.cmd = E_MSG_OSDNT_GIVE_OSD_NAME; + msg.msg_data[0] = 0; + msg.msg_len = 2; + + if (sendMessageAndWaitReply(&msg, &reply_msg, E_MSG_OSDNT_SET_OSD_NAME, 2000) < 0) { + return -1; + } + + return CopyMessageData(data_buf, reply_msg.msg_data, reply_msg.msg_len); +} + +int CTvin::CHDMIRxCEC::SendGivePhysicalAddressMessage(int source_input, int logic_addr, int *physical_addr) +{ + struct _cec_msg msg, reply_msg; + + if (isAllowOperate(source_input) < 0) { + return -1; + } + + if (physical_addr == NULL) { + return -1; + } + + msg.addr = logic_addr; + msg.cmd = E_MSG_GIVE_PHYSICAL_ADDRESS; + msg.msg_data[0] = 0; + msg.msg_len = 2; + + if (sendMessageAndWaitReply(&msg, &reply_msg, E_MSG_REPORT_PHYSICAL_ADDRESS, 2000) < 0) { + return -1; + } + + if (reply_msg.msg_len == 5) { + *physical_addr = 0; + *physical_addr |= reply_msg.msg_data[0] << 8; + *physical_addr |= reply_msg.msg_data[1]; + return reply_msg.msg_len; + } + + return -1; +} + +int CTvin::CHDMIRxCEC::SendSetMenuLanguageMessage(int source_input, unsigned char data_buf[]) +{ + struct _cec_msg msg; + + if (isAllowOperate(source_input) < 0) { + return -1; + } + + if (data_buf == NULL) { + return -1; + } + + msg.addr = GetDeviceLogicAddr(source_input); + msg.cmd = E_MSG_SET_MENU_LANGUAGE; + msg.msg_data[0] = data_buf[0]; + msg.msg_data[1] = data_buf[1]; + msg.msg_data[2] = data_buf[2]; + msg.msg_len = 5; + + return SendMessage(&msg); +} + +int CTvin::CHDMIRxCEC::SendVendorRemoteKeyDownMessage(int source_input, unsigned char key_val) +{ + struct _cec_msg msg; + + if (isAllowOperate(source_input) < 0) { + return -1; + } + + msg.addr = GetDeviceLogicAddr(source_input); + msg.cmd = E_MSG_VENDOR_RC_BUT_DOWN; + msg.msg_data[0] = key_val; + msg.msg_len = 3; + + return SendMessage(&msg); +} + +int CTvin::CHDMIRxCEC::SendVendorRemoteKeyUpMessage(int source_input) +{ + struct _cec_msg msg; + + if (isAllowOperate(source_input) < 0) { + return -1; + } + + msg.addr = GetDeviceLogicAddr(source_input); + msg.cmd = E_MSG_VENDOR_RC_BUT_UP; + msg.msg_data[0] = 0; + msg.msg_len = 2; + + return SendMessage(&msg); +} + +int CTvin::CHDMIRxCEC::rmFromRequestList(int index) +{ + mListLock.lock(); + + ClrReplyListItem(&mReplyList[index]); + + mListLock.unlock(); + + return 0; +} + +int CTvin::CHDMIRxCEC::addToRequestList(HDMIRxRequestReplyItem *reply_item) +{ + int i = 0; + + mListLock.lock(); + + for (i = 0; i < CC_REQUEST_LIST_SIZE; i++) { + if (mReplyList[i].WaitFlag == 0) { + mReplyList[i] = *reply_item; + mListLock.unlock(); + return i; + } + } + + mListLock.unlock(); + + return 0; +} + +int CTvin::CHDMIRxCEC::processData(int msg_cnt) +{ + int i = 0, j = 0; + CECMsgStream msg_stream; + + for (i = 0; i < msg_cnt; i++) { + for (j = 0; j < CC_REQUEST_LIST_SIZE; j++) { + if (mReplyList[j].WaitFlag) { + if (mMsgBuf[i].cmd == mReplyList[j].WaitCmd && ((mMsgBuf[i].addr & 0xF0) >> 4) == mReplyList[j].WaitLogicAddr) { + mReplyList[j].DataFlag = 1; + mReplyList[j].msg = mMsgBuf[i]; + PrintMessage(__FUNCTION__, 0, &mReplyList[j].msg); + mReplyList[j].WaitReplyCondition.signal(); + + return 0; + } + } + } + + msg_stream.msg = mMsgBuf[i]; + if (mpObserver != NULL) { + mpObserver->onHDMIRxCECMessage(msg_stream.msg.msg_len, msg_stream.buf); + } + } + + return 0; +} + +bool CTvin::CHDMIRxCEC::threadLoop() +{ + int msg_cnt = 0; + int sleeptime = 200; //ms + + mState = STATE_RUNNING; + + while (!exitPending()) { //requietexit() or requietexitWait() not call + while (mRequestPause) { + mLock.lock(); + mState = STATE_PAUSE; + mPauseCondition.wait(mLock); //first unlock,when return,lock again,so need,call unlock + mState = STATE_RUNNING; + mLock.unlock(); + } + + msg_cnt = GetMessage(mMsgBuf); + + processData(msg_cnt); + + if (!mRequestPause) { + usleep(sleeptime * 1000); + } + } + + mState = STATE_STOPED; + //exit + //return true, run again, return false,not run. + return false; +} diff --git a/tvapi/libtv/tvin/CSourceConnectDetect.cpp b/tvapi/libtv/tvin/CSourceConnectDetect.cpp new file mode 100644 index 0000000..1fe801d --- a/dev/null +++ b/tvapi/libtv/tvin/CSourceConnectDetect.cpp @@ -0,0 +1,312 @@ +#include "CTvin.h" +#include <CTvLog.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <sys/prctl.h> +#include <fcntl.h> +#include <errno.h> + +#include <cutils/log.h> + +#include "../tvutils/tvutils.h" +#include "../tvconfig/tvconfig.h" + +#ifdef LOG_TAG +#undef LOG_TAG +#define LOG_TAG "CSourceConnectDetect" +#endif + +#define CC_DETECT_SOURCE_AV2 (0) + +#define CC_DEBUG_AV_SAMPLE_BUF (1) + +#define CC_AV_PLUG_OUT_ADC_DEF_THRESHOLD (28) // voltage / 1800 * 1023 +#define CC_AV_PLUG_IN_ADC_DEF_THRESHOLD (70) // voltage / 1800 * 1023 + +CTvin::CSourceConnectDetect::CSourceConnectDetect(CTvin *pTvin) +{ + for (int i = 0; i < SOURCE_MAX; i++) { + mSourceDetectTable[i] = SOURCE_INVALID; + mSourceDetectPreStatusBuf[i] = CC_SOURCE_PLUG_OUT; + mSourceDetectCurStatusBuf[i] = CC_SOURCE_PLUG_OUT; + } + + for (int i = 0; i < CC_AV_DETECT_SAMPLE_DATA_MAX_LEN; i++) { + mAV1SampleDataBuf[i] = 0; + mAV2SampleDataBuf[i] = 0; + } + +#if CC_DETECT_SOURCE_AV2 == 1 + mSourceDetectTable[0] = SOURCE_AV1; + mSourceDetectTable[1] = SOURCE_AV2; + mSourceDetectTable[2] = SOURCE_HDMI1; + mSourceDetectTable[3] = SOURCE_HDMI2; + mSourceDetectTable[4] = SOURCE_HDMI3; +#else + mSourceDetectTable[0] = SOURCE_AV1; + mSourceDetectTable[1] = SOURCE_HDMI1; + mSourceDetectTable[2] = SOURCE_HDMI2; + mSourceDetectTable[3] = SOURCE_HDMI3; +#endif + + mSourceDetectSleepTime = 200; //default 200ms + + mAVDetectMethod = CC_AV_DETECT_METHOD_ADC_PLUG_OUT; + mAVDetectPlugOutADCThreshold = CC_AV_PLUG_OUT_ADC_DEF_THRESHOLD; + mAVDetectPlugInADCThreshold = CC_AV_PLUG_IN_ADC_DEF_THRESHOLD; + mAVDetectPlugInDutyCycle = 70; + mAVDetectPlugOutDutyCycle = 70; + mAVDetectSampleSize = 15; + mAV1DetectADCChan = 2; + mAV2DetectADCChan = 3; + + mpObserver = NULL; + mpTvin = pTvin; +} + +CTvin::CSourceConnectDetect::~CSourceConnectDetect() +{ +} + +int CTvin::CSourceConnectDetect::startDetect() +{ + refreshDetectSources(); + refreshDetectAVInfo(); + this->run(); + + return 0; +} + +int CTvin::CSourceConnectDetect::refreshDetectSources() +{ + int cur_index = 0; + char *token = NULL; + const char *strDelimit = ","; + const char *config_value = NULL; + char data_str[CC_CFG_VALUE_STR_MAX_LEN] = { 0 }; + + config_value = config_get_str("TV", "tvin.SourceConnectDetect.sources", "null"); + if (strcasecmp(config_value, "null") == 0) { + return 0; + } + + for (int i = 0; i < SOURCE_MAX; i++) { + mSourceDetectTable[i] = SOURCE_INVALID; + mSourceDetectPreStatusBuf[i] = CC_SOURCE_PLUG_OUT; + mSourceDetectCurStatusBuf[i] = CC_SOURCE_PLUG_OUT; + } + + cur_index = 0; + memset((void *)data_str, 0, sizeof(data_str)); + strncpy(data_str, config_value, sizeof(data_str) - 1); + token = strtok(data_str, strDelimit); + while (token != NULL) { + if (strcasecmp(token, "SOURCE_AV1") == 0) { + mSourceDetectTable[cur_index] = SOURCE_AV1; + cur_index += 1; + //LOGD("%s, add detect source SOURCE_AV1.\n", __FUNCTION__); + } else if (strcasecmp(token, "SOURCE_AV2") == 0) { + mSourceDetectTable[cur_index] = SOURCE_AV2; + cur_index += 1; + //LOGD("%s, add detect source SOURCE_AV2.\n", __FUNCTION__); + } else if (strcasecmp(token, "SOURCE_HDMI1") == 0) { + mSourceDetectTable[cur_index] = SOURCE_HDMI1; + cur_index += 1; + //LOGD("%s, add detect source SOURCE_HDMI1.\n", __FUNCTION__); + } else if (strcasecmp(token, "SOURCE_HDMI2") == 0) { + mSourceDetectTable[cur_index] = SOURCE_HDMI2; + cur_index += 1; + //LOGD("%s, add detect source SOURCE_HDMI2.\n", __FUNCTION__); + } else if (strcasecmp(token, "SOURCE_HDMI3") == 0) { + mSourceDetectTable[cur_index] = SOURCE_HDMI3; + cur_index += 1; + //LOGD("%s, add detect source SOURCE_HDMI3.\n", __FUNCTION__); + } + + token = strtok(NULL, strDelimit); + } + + return 0; +} + +int CTvin::CSourceConnectDetect::refreshDetectAVInfo() +{ + int cur_index = 0; + char *token = NULL; + const char *strDelimit = ","; + const char *config_value = NULL; + char data_str[CC_CFG_VALUE_STR_MAX_LEN] = { 0 }; + + config_value = config_get_str("TV", "tvin.SourceConnectDetect.av.info", "null"); + if (strcasecmp(config_value, "null") == 0) { + return 0; + } + + cur_index = 0; + memset((void *)data_str, 0, sizeof(data_str)); + strncpy(data_str, config_value, sizeof(data_str) - 1); + token = strtok(data_str, strDelimit); + while (token != NULL) { + if (cur_index == 0) { + mAV1DetectADCChan = strtol(token, NULL, 10); + } else if (cur_index == 1) { + mAV2DetectADCChan = strtol(token, NULL, 10); + } else if (cur_index == 2) { + mAVDetectSampleSize = strtol(token, NULL, 10); + } else if (cur_index == 3) { + mAVDetectMethod = strtol(token, NULL, 10); + } else if (cur_index == 4) { + mAVDetectPlugInDutyCycle = strtol(token, NULL, 10); + } else if (cur_index == 5) { + mAVDetectPlugOutDutyCycle = strtol(token, NULL, 10); + } else if (cur_index == 6) { + mAVDetectPlugInADCThreshold = strtol(token, NULL, 10); + } else if (cur_index == 7) { + mAVDetectPlugOutADCThreshold = strtol(token, NULL, 10); + } + + cur_index += 1; + token = strtok(NULL, strDelimit); + } + + return 0; +} + +int CTvin::CSourceConnectDetect::GetSourceConnectStatus(int source_input) +{ + for (int i = 0; i < SOURCE_MAX; i++) { + if (mSourceDetectTable[i] == source_input) { + return mSourceDetectCurStatusBuf[i]; + } + } + + return CC_SOURCE_PLUG_OUT; +} + +bool CTvin::CSourceConnectDetect::threadLoop() +{ + if ( mpObserver == NULL ) { + return false; + } + + LOGD("%s, entering...\n", "TV"); + + prctl(PR_SET_NAME, (unsigned long)"CSourceConnectDetect thread loop"); + + mpTvin->VDIN_OpenHDMIPinMuxOn(true); + + while (!exitPending()) { //requietexit() or requietexitWait() not call + DetectSources(); + + usleep(mSourceDetectSleepTime * 1000); + } + + LOGD("%s, exiting...\n", "TV"); + //return true, run again, return false,not run. + return false; +} + +int CTvin::CSourceConnectDetect::DetectSources() +{ + int i = 0, cur_source = 0; + + for (i = 0; i < SOURCE_MAX; i++) { + cur_source = mSourceDetectTable[i]; + if (cur_source == SOURCE_AV1 || cur_source == SOURCE_AV2) { + mSourceDetectCurStatusBuf[i] = DetectAVSource(cur_source); + } else if (cur_source == SOURCE_HDMI1 || cur_source == SOURCE_HDMI2 || cur_source == SOURCE_HDMI3) { + mSourceDetectCurStatusBuf[i] = DetectHDMISource(cur_source); + } + } + + for (i = 0; i < SOURCE_MAX; i++) { + if (mSourceDetectCurStatusBuf[i] != mSourceDetectPreStatusBuf[i]) { + mSourceDetectPreStatusBuf[i] = mSourceDetectCurStatusBuf[i]; + LOGD("%s, Source id = %d, Source plug status = %d\n", "TV", mSourceDetectTable[i], mSourceDetectCurStatusBuf[i]); + +#if CC_DEBUG_AV_SAMPLE_BUF == 1 + int *cur_sample_buf = NULL; + + if (mSourceDetectTable[i] == SOURCE_AV1) { + cur_sample_buf = mAV1SampleDataBuf; + } else if (mSourceDetectTable[i] == SOURCE_AV2) { + cur_sample_buf = mAV2SampleDataBuf; + } + + if (cur_sample_buf != NULL) { + for (int j = 0; j < mAVDetectSampleSize; j++) { + LOGD("%s, cur_sample_buf[%d] = %d\n", "TV", j, cur_sample_buf[j]); + } + LOGD("%s, \n\n\n", "TV", i, cur_sample_buf[i]); + } +#endif + + mpObserver->onSourceConnect(mSourceDetectTable[i], mSourceDetectCurStatusBuf[i]); + } + } + + return 0; +} + +int CTvin::CSourceConnectDetect::DetectAVSource(int source_input) +{ + int i = 0, plug_in_cnt = 0, plug_out_cnt = 0; + int detect_adc_chan = -1, cur_adc_val = 0; + int *cur_sample_ind = 0; + int *cur_sample_buf = NULL; + + if (source_input == SOURCE_AV1) { + detect_adc_chan = mAV1DetectADCChan; + cur_sample_ind = &mAV1CurSampleInd; + cur_sample_buf = mAV1SampleDataBuf; + } else if (source_input == SOURCE_AV2) { + detect_adc_chan = mAV2DetectADCChan; + cur_sample_ind = &mAV2CurSampleInd; + cur_sample_buf = mAV2SampleDataBuf; + } else { + return CC_SOURCE_PLUG_OUT; + } + + cur_adc_val = ReadADCSpecialChannelValue(detect_adc_chan); + *cur_sample_ind = *cur_sample_ind % mAVDetectSampleSize; + cur_sample_buf[*cur_sample_ind] = cur_adc_val; + *cur_sample_ind = (*cur_sample_ind + 1 ) % mAVDetectSampleSize; + + plug_in_cnt = 0; + plug_out_cnt = 0; + for (i = 0; i < mAVDetectSampleSize; i++) { + if (cur_sample_buf[i] >= mAVDetectPlugInADCThreshold) { + plug_in_cnt += 1; + } else if (cur_sample_buf[i] <= mAVDetectPlugOutADCThreshold) { + plug_out_cnt += 1; + } + } + + if (mAVDetectMethod == CC_AV_DETECT_METHOD_ADC_PLUG_IN) { + if ((plug_in_cnt * 100 / mAVDetectSampleSize) >= mAVDetectPlugInDutyCycle) { + return CC_SOURCE_PLUG_IN; + } + + return CC_SOURCE_PLUG_OUT; + } else if (mAVDetectMethod == CC_AV_DETECT_METHOD_ADC_PLUG_OUT) { + if ((plug_out_cnt * 100 / mAVDetectSampleSize) >= mAVDetectPlugOutDutyCycle) { + return CC_SOURCE_PLUG_OUT; + } + + return CC_SOURCE_PLUG_IN; + } + + return CC_SOURCE_PLUG_OUT; +} + +int CTvin::CSourceConnectDetect::DetectHDMISource(int source_input) +{ + int source_port = CTvin::Tvin_GetSourcePortBySourceInput((tv_source_input_t)source_input); + + if (mpTvin->VDIN_GetPortConnect(source_port) == true) { + return CC_SOURCE_PLUG_IN; + } + + return CC_SOURCE_PLUG_OUT; +} diff --git a/tvapi/libtv/tvin/CTvin.cpp b/tvapi/libtv/tvin/CTvin.cpp new file mode 100644 index 0000000..3a43fa3 --- a/dev/null +++ b/tvapi/libtv/tvin/CTvin.cpp @@ -0,0 +1,3292 @@ + +#include "CTvin.h" +#include <CTvLog.h> +#include <stdio.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/ioctl.h> +#include <fcntl.h> +#include <string.h> +#include <errno.h> +#include <dlfcn.h> +#include <linux/fb.h> +#include <stdlib.h> +#include <cutils/properties.h> +#include <cutils/log.h> +#include <sys/mman.h> +#include "../vpp/CPQdb.h" +#include "CAv.h" +#include "../tvsetting/CTvSetting.h" +#include "../tvutils/tvutils.h" +#include "../tvconfig/tvconfig.h" + + +#ifdef LOG_TAG +#undef LOG_TAG +#define LOG_TAG "CTvin" +#endif + +#define AFE_DEV_PATH "/dev/tvafe0" +#define HDMIRX_KSV_PATH "/dev/hdmirx0" + + +#define CC_SEL_VDIN_DEV (0) + +#define MODE_3D_DISABLE 0x00000000 +#define MODE_3D_ENABLE 0x00000001 +#define MODE_AUTO 0x00000002 +#define MODE_2D_TO_3D 0x00000004 +#define MODE_LR 0x00000008 +#define MODE_BT 0x00000010 +#define MODE_LR_SWITCH 0x00000020 +#define MODE_FIELD_DEPTH 0x00000040 +#define MODE_3D_TO_2D_L 0x00000080 +#define MODE_3D_TO_2D_R 0x00000100 +#define LR_FORMAT_INDICATOR 0x00000200 +#define BT_FORMAT_INDICATOR 0x00000400 + +/* ADC calibration pattern & format define */ +/* default 100% 8 color-bar */ +//#define VGA_SOURCE_RGB444 +#define VGA_H_ACTIVE (1024) +#define VGA_V_ACTIVE (768) +#define COMP_H_ACTIVE (1280) +#define COMP_V_ACTIVE (720) +#define CVBS_H_ACTIVE (720) +#define CVBS_V_ACTIVE (480) + +#define FBIOPUT_OSD_FREE_SCALE_ENABLE 0x4504 +#define FBIOPUT_OSD_FREE_SCALE_WIDTH 0x4505 +#define FBIOPUT_OSD_FREE_SCALE_HEIGHT 0x4506 + +typedef enum { + VIEWMODE_NULL = 0, + VIEWMODE_4_3, + VIEWMODE_16_9 +} view_mode_t; +int CTvin::mSourceInputToPortMap[SOURCE_MAX]; +CTvin::CTvin() +{ + int i = 0; + + m_vdin_dev_fd = -1; + afe_dev_fd = -1; + + m_tvin_param.index = 0; + m_is_decoder_start = false; + gExistD2D3 = -1; + gVideoPath[0] = '\0'; + m_pathid = TV_PATH_DECODER_3D_AMVIDEO; + + for (i = 0; i < SOURCE_MAX; i++) { + mSourceInputToPortMap[i] = TVIN_PORT_NULL; + } + + mSourceInputToPortMap[SOURCE_TV] = TVIN_PORT_CVBS3; + mSourceInputToPortMap[SOURCE_AV1] = TVIN_PORT_CVBS1; + mSourceInputToPortMap[SOURCE_AV2] = TVIN_PORT_CVBS2; + mSourceInputToPortMap[SOURCE_YPBPR1] = TVIN_PORT_COMP0; + mSourceInputToPortMap[SOURCE_YPBPR2] = TVIN_PORT_COMP1; + mSourceInputToPortMap[SOURCE_HDMI1] = TVIN_PORT_HDMI0; + mSourceInputToPortMap[SOURCE_HDMI2] = TVIN_PORT_HDMI2; + mSourceInputToPortMap[SOURCE_HDMI3] = TVIN_PORT_HDMI1; + mSourceInputToPortMap[SOURCE_VGA] = TVIN_PORT_VGA0; + mSourceInputToPortMap[SOURCE_MPEG] = TVIN_PORT_MPEG0; + mSourceInputToPortMap[SOURCE_DTV] = TVIN_PORT_DTV; + mSourceInputToPortMap[SOURCE_IPTV] = TVIN_PORT_BT656; +} + +CTvin::~CTvin() +{ + +} + +int CTvin::OpenTvin() +{ + const char *config_value; + config_value = config_get_str ( "TV", "tvin.manual.set.tvpath", "null" ); + strcpy ( config_tv_path, config_value ); + memset ( config_default_path, 0x0, 64 ); + config_value = config_get_str ( "TV", "tvin.manual.set.defaultpath", "null" ); + strcpy ( config_default_path, config_value ); + return 0; +} + +int CTvin::IsFileExist ( const char *file_name ) +{ + struct stat tmp_st; + + if ( stat ( file_name, &tmp_st ) < 0 ) { + return 0; + } + + return 1; +} + +char *CTvin::DelSub ( char *str, char *sub ) +{ + char *psrc = str, *pdest = str, *psub = NULL, *p = NULL; + + if ( ( str == NULL ) || ( sub == NULL ) ) { + return NULL; + } + + while ( *psrc ) { + p = psrc; + psub = sub; + + while ( *p && *p == *psub ) { + p++; + psub++; + } + + if ( *psub == 0 ) { + psrc = p; + } else { + *pdest++ = *psrc++; + } + } + + *pdest = 0; + + return str; +} + +int CTvin::setMpeg2Vdin(int enable) +{ + /* let output data loop to vdin */ + FILE *fp = fopen ( "/sys/module/di/parameters/mpeg2vdin_en", "w" ); + + if ( fp == NULL ) { + LOGW ( "Open /sys/module/di/parameters/mpeg2vdin_en error\n" ); + return -1; + } + fprintf ( fp, "%d", enable ); + fclose ( fp ); + return 0; +} + +char *CTvin::VDIN_CheckVideoPath ( const char *videopath ) +{ + strncpy ( gVideoPath, videopath, sizeof ( gVideoPath ) ); + + if ( strstr ( videopath, "d2d3 " ) != NULL ) { + if ( gExistD2D3 == -1 ) { + gExistD2D3 = IsFileExist ( "/sys/class/d2d3/d2d3" ); + } + + if ( gExistD2D3 == 0 ) { + DelSub ( gVideoPath, "d2d3 " ); + } + } + + LOGW ( "%s, video path before check [%s]\n", "TV", videopath ); + LOGW ( "%s, video path after check [%s]\n", "TV", gVideoPath ); + + return gVideoPath; +} + +int CTvin::VDIN_AddPath ( const char *videopath ) +{ + FILE *fp = NULL; + int ret = -1; + char *tmp_video_path = NULL; + + tmp_video_path = VDIN_CheckVideoPath ( videopath ); + + fp = fopen ( "/sys/class/vfm/map", "w" ); + + if ( fp == NULL ) { + LOGW ( "Open /sys/class/vfm/map error(%s)!\n", strerror ( errno ) ); + return -1; + } + + ret = fprintf ( fp, "%s", tmp_video_path ); + + if ( ret < 0 ) { + LOGW ( "Add VideoPath error(%s)!\n", strerror ( errno ) ); + } + + fclose ( fp ); + fp = NULL; + + return ret; +} + +int CTvin::VDIN_RmDefPath ( void ) +{ + int fd = -1, ret; + char str[] = "rm default"; + + + fd = open ( "/sys/class/vfm/map", O_RDWR ); + + if ( fd < 0 ) { + LOGW ( "Open /sys/class/vfm/map error(%s)!\n", strerror ( errno ) ); + return -1; + } + + ret = write ( fd, str, sizeof ( str ) ); + + if ( ret < 0 ) { + LOGW ( "Rm default path error(%s)!\n", strerror ( errno ) ); + } + + close ( fd ); + fd = -1; + + return ret; +} + +int CTvin::VDIN_RmTvPath ( void ) +{ + int fd, ret; + char str[] = "rm tvpath"; + + + fd = open ( "/sys/class/vfm/map", O_RDWR ); + + if ( fd < 0 ) { + LOGW ( "Open /sys/class/vfm/map error(%s)!\n", strerror ( errno ) ); + return -1; + } + + ret = write ( fd, str, sizeof ( str ) ); + + if ( ret <= 0 ) { + LOGW ( "Rm tv path error(%s)!\n", strerror ( errno ) ); + } + + close ( fd ); + fd = -1; + return ret; +} + +int CTvin::VDIN_AddVideoPath ( int selPath ) +{ + int ret = -1; + char prop_value[PROPERTY_VALUE_MAX]; + + switch ( selPath ) { + case TV_PATH_VDIN_AMVIDEO: + ret = VDIN_AddPath ( "add tvpath vdin0 amvideo" ); + break; + + case TV_PATH_VDIN_DEINTERLACE_AMVIDEO: + ret = VDIN_AddPath ( "add tvpath vdin0 deinterlace amvideo" ); + break; + + case TV_PATH_VDIN_3D_AMVIDEO: + ret = VDIN_AddPath ( "add tvpath vdin0 ppmgr amvideo" ); + break; + + case TV_PATH_VDIN_NEW3D_AMVIDEO: + ret = VDIN_AddPath ( "add tvpath vdin0 deinterlace ppmgr d2d3 amvideo" ); + break; + + case TV_PATH_VDIN_NEW3D_WITHOUTPPMGR_AMVIDEO: + ret = VDIN_AddPath ( "add tvpath vdin0 deinterlace d2d3 amvideo" ); + break; + + case TV_PATH_DECODER_3D_AMVIDEO: + ret = VDIN_AddPath ( "add default decoder ppmgr deinterlace amvideo" ); + break; + + case TV_PATH_DECODER_AMVIDEO: + ret = VDIN_AddPath ( "add default decoder deinterlace amvideo" ); + break; + + case TV_PATH_VDIN_FREESCALE_AMVIDEO: + ret = VDIN_AddPath ( "add previewpath vdin0 freescale amvideo" ); + break; + + case TV_PATH_DECODER_NEW3D_AMVIDEO: + ret = VDIN_AddPath ( "add default decoder deinterlace ppmgr d2d3 amvideo" ); + break; + + case TV_PATH_DECODER_NEW3D_WITHOUTPPMGR_AMVIDEO: + ret = VDIN_AddPath ( "add default decoder deinterlace d2d3 amvideo" ); + break; + } + + return ret; +} + +int CTvin::VDIN_RmPreviewPath ( void ) +{ + int fd, ret; + char str[] = "rm previewpath"; + + + fd = open ( "/sys/class/vfm/map", O_RDWR ); + + if ( fd < 0 ) { + LOGW ( "Open /sys/class/vfm/map error(%s)!\n", strerror ( errno ) ); + return -1; + } + + ret = write ( fd, str, sizeof ( str ) ); + + if ( ret < 0 ) { + LOGW ( "Rm tv path error(%s)!\n", strerror ( errno ) ); + } + + close ( fd ); + fd = -1; + + return ret; +} +int CTvin::VDIN_OpenModule() +{ + char file_name[64]; + sprintf ( file_name, "/dev/vdin%d", CC_SEL_VDIN_DEV ); + m_vdin_dev_fd = open ( file_name, O_RDWR ); + + if ( m_vdin_dev_fd < 0 ) { + LOGW ( "Open %s error(%s)!\n", file_name, strerror ( errno ) ); + return -1; + } + + memset ( &gTvinVDINParam, 0, sizeof ( gTvinVDINParam ) ); + memset ( &gTvinVDINSignalInfo, 0, sizeof ( gTvinVDINSignalInfo ) ); + + LOGD ( "Open vdin module vdin_dev_fd = [%d]", m_vdin_dev_fd ); + + return m_vdin_dev_fd; +} + +int CTvin::VDIN_GetVdinFd() +{ + return m_vdin_dev_fd; +} + +int CTvin::VDIN_CloseModule() +{ + if ( m_vdin_dev_fd != -1 ) { + close ( m_vdin_dev_fd ); + m_vdin_dev_fd = -1; + } + + return 0; +} + +int CTvin::VDIN_DeviceIOCtl ( int request, ... ) +{ + int tmp_ret = -1; + va_list ap; + void *arg; + + if ( m_vdin_dev_fd >= 0 ) { + va_start ( ap, request ); + arg = va_arg ( ap, void * ); + va_end ( ap ); + + tmp_ret = ioctl ( m_vdin_dev_fd, request, arg ); + return tmp_ret; + } + + return -1; +} + +int CTvin::VDIN_OpenPort ( tvin_port_t port ) +{ + int rt = -1; + struct tvin_parm_s vdinParam; + vdinParam.port = port; + vdinParam.index = 0; + rt = VDIN_DeviceIOCtl ( TVIN_IOC_OPEN, &vdinParam ); + + if ( rt < 0 ) { + LOGW ( "Vdin open port, error(%s)!", strerror ( errno ) ); + } + + return rt; +} + +int CTvin::VDIN_ClosePort() +{ + int rt = -1; + + rt = VDIN_DeviceIOCtl ( TVIN_IOC_CLOSE ); + + if ( rt < 0 ) { + LOGW ( "Vdin close port, error(%s)!", strerror ( errno ) ); + } + + return rt; +} + +int CTvin::VDIN_StartDec ( const struct tvin_parm_s *vdinParam ) +{ + int rt = -1; + + if ( vdinParam == NULL ) { + return -1; + } + + rt = VDIN_DeviceIOCtl ( TVIN_IOC_START_DEC, vdinParam ); + + LOGD ( "VDIN_StartDec:\n" ); + LOGD ( "index = [%d]\n", vdinParam->index ); + LOGD ( "port = [0x%x]\n", ( unsigned int ) vdinParam->port ); + LOGD ( "format = [0x%x]\n", ( unsigned int ) ( vdinParam->info.fmt ) ); + + if ( rt < 0 ) { + LOGW ( "Vdin start decode, error(%s)!\n", strerror ( errno ) ); + } + + return rt; +} + +int CTvin::VDIN_StopDec() +{ + int rt = -1; + + rt = VDIN_DeviceIOCtl ( TVIN_IOC_STOP_DEC ); + + if ( rt < 0 ) { + LOGW ( "Vdin stop decode, error(%s)", strerror ( errno ) ); + } + + return rt; +} + +int CTvin::VDIN_GetSignalInfo ( struct tvin_info_s *SignalInfo ) +{ + int rt = -1; + + rt = VDIN_DeviceIOCtl ( TVIN_IOC_G_SIG_INFO, SignalInfo ); + + if ( rt < 0 ) { + LOGW ( "Vdin get signal info, error(%s), ret = %d.\n", strerror ( errno ), rt ); + system("reboot"); + } + + return rt; +} + +int CTvin::VDIN_SetVdinParam ( const struct tvin_parm_s *vdinParam ) +{ + int rt = -1, i = 0; + + rt = VDIN_DeviceIOCtl ( TVIN_IOC_S_PARM, vdinParam ); + + if ( rt < 0 ) { + LOGW ( "Vdin set signal param, error(%s)\n", strerror ( errno ) ); + } + + return rt; +} + +int CTvin::VDIN_GetVdinParam ( const struct tvin_parm_s *vdinParam ) +{ + int rt = -1, i = 0; + + rt = VDIN_DeviceIOCtl ( TVIN_IOC_G_PARM, vdinParam ); + + if ( rt < 0 ) { + LOGW ( "Vdin get signal param, error(%s)\n", strerror ( errno ) ); + } + + return rt; +} + +int CTvin::VDIN_OnoffVScaler ( int isOn ) +{ + FILE *fp = NULL; + + if ( isOn == 1 ) { + isOn = 1; + } else { + isOn = 0; + } + + + fp = fopen ( "/sys/class/video/vscaler", "w" ); + + if ( fp == NULL ) { + LOGW ( "Open /sys/class/video/vscaler error(%s)!\n", strerror ( errno ) ); + return -1; + } + + fprintf ( fp, "%d", ( int ) isOn ); + + fclose ( fp ); + fp = NULL; + + return 0; +} + +int CTvin::VDIN_GetDisplayVFreq (void) +{ + int fd = -1; + char buf[32]; + + fd = open("/sys/class/display/mode", O_RDWR); + if (fd < 0) { + LOGW("Open /sys/class/display/mode error(%s)!\n", strerror(errno)); + return -1; + } + memset(buf, 0, sizeof(buf)); + read(fd, buf, sizeof(buf)); + close(fd); + if (strncmp("4k2k50hz420", buf, 11) == 0) { + LOGD("VDIN_GetDisplayVFreq (%s)----1.\n", buf); + return 50; + } else if (strncmp("4k2k60hz420", buf, 11) == 0) { + LOGD("VDIN_GetDisplayVFreq (%s)----2.\n", buf); + return 60; + } else if (strncmp("1080p", buf, 5) == 0) { + LOGD("VDIN_GetDisplayVFreq (%s)----3.\n", buf); + return 60; + } else if (strncmp("4k2k30hz", buf, 8) == 0) { + LOGD("VDIN_GetDisplayVFreq (%s)----4.\n", buf); + return 30; + } + return 50; +} + +int CTvin::VDIN_SetDisplayVFreq ( int freq, int display_resolution , bool isFbc) +{ + FILE *fp = NULL; + const char *config_value = NULL; + static int display_mode_type = -1; + + if (display_mode_type == -1) { + config_value = config_get_str ( "TV", "tvin.display.mode.type", "null" ); + if (strcasecmp(config_value, "null") == 0 || strcasecmp(config_value, "hdmi_out") == 0) { + display_mode_type = 0; + } else if (strcasecmp(config_value, "lvds_out") == 0) { + display_mode_type = 1; + } else { + display_mode_type = 0; + } + } + + fp = fopen ( "/sys/class/display/mode", "w" ); + + if ( fp == NULL ) { + LOGW ( "Open /sys/class/display/mode error(%s)!\n", strerror ( errno ) ); + return -1; + } + + switch ( display_resolution ) { + case VPP_DISPLAY_RESOLUTION_1366X768: + if ( freq == 50 ) { + fprintf ( fp, "%s", "768p50hz" ); + } else { + fprintf ( fp, "%s", "768p60hz" ); + } + break; + case VPP_DISPLAY_RESOLUTION_3840X2160: + if ( freq == 50 ) { + if (isFbc) { + fprintf ( fp, "%s", "4k2k50hz420" ); + } else { + fprintf ( fp, "%s", "4k2k50hz" ); + } + } else { + if (isFbc) { + fprintf ( fp, "%s", "4k2k60hz420" ); + } else { + fprintf ( fp, "%s", "4k2k60hz" ); + } + } + break; + case VPP_DISPLAY_RESOLUTION_1920X1080: + default: + if ( freq == 50 ) { + fprintf ( fp, "%s", "1080p50hz" ); + } else { + fprintf ( fp, "%s", "1080p" ); + } + break; + } + + fclose ( fp ); + fp = NULL; + + return 0; +} + +void CTvin::Tvin_SetDepthOf2Dto3D ( int value ) +{ + //value = -16~16 + int tmp_value = DepthTable_2DTO3D[value + 16]; + LOGD ( "%s, value: %d", __FUNCTION__, value ); + VDIN_Set2D3DDepth ( value ); +} + + +int CTvin::VDIN_Set2D3DDepth ( int count ) +{ + FILE *fp = NULL; + + + fp = fopen ( "/sys/module/d2d3/parameters/depth", "w" ); + + if ( fp == NULL ) { + LOGW ( "Open /sys/module/d2d3/parameters/depth ERROR(%s)!!\n", strerror ( errno ) ); + return -1; + } + + if ( count >= -127 && count <= 127 ) { +#ifdef LOGD_3D_FUNCTION + LOGD ( "set depth value (%d).\n", count ); +#endif + } else { + count = 8 * 12; + LOGE ( "set depth value ERROR!! set default depth.\n" ); + } + + fprintf ( fp, "%d", count ); + fclose ( fp ); + fp = NULL; + + return 0; +} + +int CTvin::VDIN_Set2Dto3D ( int on_off ) +{ + struct tvin_parm_s VdinParam; + VDIN_GetVdinParam ( &VdinParam ); + VdinParam.flag &= ( ~TVIN_PARM_FLAG_2D_TO_3D ); + VdinParam.flag |= ( on_off ) ? ( TVIN_PARM_FLAG_2D_TO_3D ) : ( 0 ); + return VDIN_SetVdinParam ( &VdinParam ); +} +int CTvin::VDIN_GetHistgram ( int *hisgram ) +{ + int i = 0; + struct tvin_parm_s vdinParam; + + if ( NULL == hisgram ) { + return -1; + } + + if ( 0 == VDIN_GetVdinParam ( &vdinParam ) ) { + for ( i = 0; i < CC_HIST_GRAM_BUF_SIZE; i++ ) { + hisgram[i] = ( int ) vdinParam.histgram[i]; + } + } else { + return -1; + } + + return 0; +} + +int CTvin::VDIN_SetMVCViewMode ( int mode ) +{ + FILE *fp = NULL; + + + fp = fopen ( "/sys/module/amvdec_h264mvc/parameters/view_mode", "w" ); + + if ( fp == NULL ) { + LOGW ( "Open /sys/module/amvdec_h264mvc/parameters/view_mode error(%s)!\n", strerror ( errno ) ); + return -1; + } + + fprintf ( fp, "%d", ( int ) mode ); + + fclose ( fp ); + fp = NULL; + + return 0; +} + +int CTvin::VDIN_GetMVCViewMode ( void ) +{ + FILE *fp = NULL; + int ret = 0; + int mode = 0; + + + fp = fopen ( "/sys/module/amvdec_h264mvc/parameters/view_mode", "w" ); + + if ( fp == NULL ) { + LOGW ( "Open /sys/module/amvdec_h264mvc/parameters/view_mode ERROR(%s)!!\n", strerror ( errno ) ); + return -1; + } + + ret = fread ( &mode, 1, 1, fp ); + LOGD ( "fread /sys/module/amvdec_h264mvc/parameters/view_mode = [%d]", mode ); + + fclose ( fp ); + fp = NULL; + + return mode; +} + +int CTvin::VDIN_SetDIBuffMgrMode ( int mgr_mode ) +{ + FILE *fp = NULL; + + + fp = fopen ( "sys/module/di/parameters/buf_mgr_mode", "w" ); + + if ( fp == NULL ) { + LOGW ( "Open /sys/module/di/parameters/buf_mgr_mode error(%s)!\n", strerror ( errno ) ); + return -1; + } + + fprintf ( fp, "%d", mgr_mode ); + + fclose ( fp ); + fp = NULL; + + return 0; +} + +int CTvin::VDIN_SetDICFG ( int cfg ) +{ + FILE *fp = NULL; + + + fp = fopen ( "sys/class/deinterlace/di0/config", "w" ); + + if ( fp == NULL ) { + LOGW ( "Open /sys/class/deinterlace/di0/config error(%s)!\n", strerror ( errno ) ); + return -1; + } + + if ( 0 == cfg ) { + fprintf ( fp, "%s", "disable" ); + } else { + fprintf ( fp, "%s", "enable" ); + } + + fclose ( fp ); + fp = NULL; + + return 0; +} + +int CTvin::VDIN_SetDI3DDetc ( int enable ) +{ + FILE *fp = NULL; + + + fp = fopen ( "/sys/module/di/parameters/det3d_en", "w" ); + + if ( fp == NULL ) { + LOGW ( "Open /sys/module/di/parameters/det3d_en error(%s)!\n", strerror ( errno ) ); + return -1; + } + + fprintf ( fp, "%d", enable ); + + + fclose ( fp ); + fp = NULL; + + return 0; +} + +int CTvin::VDIN_Get3DDetc ( void ) +{ + int fd = -1; + int ret = -1; + char buf[10]; + + + fd = open ( "/sys/module/di/parameters/det3d_en", O_RDWR ); + + if ( fd < 0 ) { + LOGW ( "Open /sys/module/di/parameters/det3d_en error(%s)!\n", strerror ( errno ) ); + return -1; + } + + ret = read ( fd, buf, sizeof ( buf ) ); + + close ( fd ); + fd = -1; + + + if ( strcmp ( "enable", buf ) == 0 ) { + return 1; + } else { + return 0; + } +} + + +int CTvin::VDIN_GetVscalerStatus ( void ) +{ + int fd = -1; + int ret = -1; + char buf[7]; + + + fd = open ( "/sys/class/video/vscaler", O_RDWR ); + + if ( fd < 0 ) { + LOGW ( "Open /sys/class/video/vscaler error(%s)!\n", strerror ( errno ) ); + return -1; + } + + ret = read ( fd, buf, sizeof ( buf ) ); + + close ( fd ); + fd = -1; + + sscanf ( buf, "%d", &ret ); + + ret = ( ( ret & 0x40000 ) == 0 ) ? 1 : 0; + + if ( ret == 1 ) { + sleep ( 1 ); + } + + return ret; +} + +int CTvin::VDIN_TurnOnBlackBarDetect ( int isEnable ) +{ + FILE *fp = NULL; + + + fp = fopen ( "/sys/module/tvin_vdin/parameters/black_bar_enable", "w" ); + + if ( fp == NULL ) { + LOGW ( "Open /sys/module/tvin_vdin/parameters/black_bar_enable error(%s)!\n", strerror ( errno ) ); + return -1; + } + + fprintf ( fp, "%d", isEnable ); + + fclose ( fp ); + fp = NULL; + + return 0; +} + +int CTvin::VDIN_LoadHdcpKey ( unsigned char *hdcpkey_buff ) +{ + unsigned char testHdcp[368] = { 0x53, 0x4B, 0x59, 0x01, 0x00, 0x10, 0x0D, 0x15, 0x3A, 0x8E, 0x99, 0xEE, 0x2A, 0x55, 0x58, 0xEE, 0xED, 0x4B, 0xBE, 0x00, 0x74, 0xA9, 0x00, 0x10, 0x0A, 0x21, 0xE3, + 0x30, 0x66, 0x34, 0xCE, 0x9C, 0xC7, 0x8B, 0x51, 0x27, 0xF9, 0x0B, 0xAD, 0x09, 0x5F, 0x4D, 0xC2, 0xCA, 0xA2, 0x13, 0x06, 0x18, 0x8D, 0x34, 0x82, 0x46, 0x2D, 0xC9, 0x4B, 0xB0, 0x1C, 0xDE, + 0x3D, 0x49, 0x39, 0x58, 0xEF, 0x2B, 0x68, 0x39, 0x71, 0xC9, 0x4D, 0x25, 0xE9, 0x75, 0x4D, 0xAC, 0x62, 0xF5, 0xF5, 0x87, 0xA0, 0xB2, 0x4A, 0x60, 0xD3, 0xF1, 0x09, 0x3A, 0xB2, 0x3E, 0x19, + 0x4F, 0x3B, 0x1B, 0x2F, 0x85, 0x14, 0x28, 0x44, 0xFC, 0x69, 0x6F, 0x50, 0x42, 0x81, 0xBF, 0x7C, 0x2B, 0x3A, 0x17, 0x2C, 0x15, 0xE4, 0x93, 0x77, 0x74, 0xE8, 0x1F, 0x1C, 0x38, 0x54, 0x49, + 0x10, 0x64, 0x5B, 0x7D, 0x90, 0x3D, 0xA0, 0xE1, 0x8B, 0x67, 0x5C, 0x19, 0xE6, 0xCA, 0x9D, 0xE9, 0x68, 0x5A, 0xB5, 0x62, 0xDF, 0xA1, 0x28, 0xBC, 0x68, 0x82, 0x9A, 0x22, 0xC4, 0xDC, 0x48, + 0x85, 0x0F, 0xF1, 0x3E, 0x05, 0xDD, 0x1B, 0x2D, 0xF5, 0x49, 0x3A, 0x15, 0x29, 0xE7, 0xB6, 0x0B, 0x2A, 0x40, 0xE3, 0xB0, 0x89, 0xD5, 0x75, 0x84, 0x2E, 0x76, 0xE7, 0xBC, 0x63, 0x67, 0xE3, + 0x57, 0x67, 0x86, 0x81, 0xF4, 0xD7, 0xEA, 0x4D, 0x89, 0x8E, 0x37, 0x95, 0x59, 0x1C, 0x8A, 0xCD, 0x79, 0xF8, 0x4F, 0x82, 0xF2, 0x6C, 0x7E, 0x7F, 0x79, 0x8A, 0x6B, 0x90, 0xC0, 0xAF, 0x4C, + 0x8D, 0x43, 0x47, 0x1F, 0x9A, 0xF1, 0xBB, 0x88, 0x64, 0x49, 0x14, 0x50, 0xD1, 0xC3, 0xDF, 0xA6, 0x87, 0xA0, 0x15, 0x98, 0x51, 0x81, 0xF5, 0x97, 0x55, 0x10, 0x4A, 0x99, 0x30, 0x54, 0xA4, + 0xFC, 0xDA, 0x0E, 0xAC, 0x6A, 0xFA, 0x90, 0xEE, 0x12, 0x70, 0x69, 0x74, 0x63, 0x46, 0x63, 0xFB, 0xE6, 0x1F, 0x72, 0xEC, 0x43, 0x5D, 0x50, 0xFF, 0x03, 0x4F, 0x05, 0x33, 0x88, 0x36, 0x93, + 0xE4, 0x72, 0xD5, 0xCC, 0x34, 0x52, 0x96, 0x15, 0xCE, 0xD0, 0x32, 0x52, 0x41, 0x4F, 0xBC, 0x2D, 0xDF, 0xC5, 0xD6, 0x7F, 0xD5, 0x74, 0xCE, 0x51, 0xDC, 0x10, 0x5E, 0xF7, 0xAA, 0x4A, 0x2D, + 0x20, 0x9A, 0x17, 0xDD, 0x30, 0x89, 0x71, 0x82, 0x36, 0x50, 0x09, 0x1F, 0x7C, 0xF3, 0x12, 0xE9, 0x43, 0x10, 0x5F, 0x51, 0xBF, 0xB8, 0x45, 0xA8, 0x5A, 0x8D, 0x3F, 0x77, 0xE5, 0x96, 0x73, + 0x68, 0xAB, 0x73, 0xE5, 0x4C, 0xFB, 0xE5, 0x98, 0xB9, 0xAE, 0x74, 0xEB, 0x51, 0xDB, 0x91, 0x07, 0x7B, 0x66, 0x02, 0x9B, 0x79, 0x03, 0xC5, 0x34, 0x1C, 0x58, 0x13, 0x31, 0xD2, 0x4A, 0xEC + }; + int ret = -1; + int fd = -1; + + + fd = open ( "/sys/class/hdmirx/hdmirx0/edid", O_RDWR ); + + if ( fd < 0 ) { + LOGW ( "Open hdmi hdcp key error(%s)!!\n", strerror ( errno ) ); + return -1; + } + + ret = write ( fd, testHdcp, 368 ); + + if ( ret < 0 ) { + LOGD ( "Write hdmi hdcp key error(%s)!!\n", strerror ( errno ) ); + } + + close ( fd ); + fd = -1; + + return ret; +} + +int CTvin::VDIN_KeepLastFrame ( int enable ) +{ + FILE *fp = NULL; + + return 0; + + + fp = fopen ( "/sys/module/amvideo/parameters/keep_old_frame", "w" ); + + if ( fp == NULL ) { + LOGW ( "Open /sys/module/amvideo/parameters/keep_old_frame error(%s)!\n", strerror ( errno ) ); + return -1; + } + + fprintf ( fp, "%d", enable ); + + fclose ( fp ); + fp = NULL; + + return 0; +} + +int CTvin::VDIN_SetVideoFreeze ( int enable ) +{ + FILE *fp = NULL; + + + fp = fopen ( "/sys/class/vdin/vdin0/attr", "w" ); + + if ( fp == NULL ) { + LOGW ( "Open /sys/class/vdin/vdin0/attr error(%s)!\n", strerror ( errno ) ); + return -1; + } + + if ( enable == 1 ) { + fprintf ( fp, "freeze" ); + } else { + fprintf ( fp, "unfreeze" ); + } + + fclose ( fp ); + fp = NULL; + + return 0; +} + +int CTvin::VDIN_SetDIBypasshd ( int enable ) +{ + FILE *fp = NULL; + + + fp = fopen ( "/sys/module/di/parameters/bypass_hd", "w" ); + + if ( fp == NULL ) { + LOGW ( "Open /sys/module/di/parameters/bypass_hd error(%s)!\n", strerror ( errno ) ); + return -1; + } + + fprintf ( fp, "%d", enable ); + + fclose ( fp ); + fp = NULL; + + return 0; +} + +int CTvin::VDIN_SetDIBypassAll ( int enable ) +{ + FILE *fp = NULL; + + fp = fopen ( "/sys/module/di/parameters/bypass_all", "w" ); + + if ( fp == NULL ) { + LOGW ( "Open /sys/module/di/parameters/bypass_all error(%s)!\n", strerror ( errno ) ); + return -1; + } + + fprintf ( fp, "%d", enable ); + fclose ( fp ); + fp = NULL; + return 0; +} + +int CTvin::VDIN_SetDIBypass_Get_Buf_Threshold ( int enable ) +{ + FILE *fp = NULL; + + + fp = fopen ( "/sys/module/di/parameters/bypass_get_buf_threshold", "w" ); + + if ( fp == NULL ) { + LOGW ( "Open /sys/module/di/parameters/bypass_get_buf_threshold error(%s)!\n", strerror ( errno ) ); + return -1; + } + + fprintf ( fp, "%d", enable ); + + fclose ( fp ); + fp = NULL; + + return 0; + +} + +int CTvin::VDIN_SetDIBypassProg ( int enable ) +{ + FILE *fp = NULL; + + + fp = fopen ( "/sys/module/di/parameters/bypass_prog", "w" ); + + if ( fp == NULL ) { + LOGW ( "Open /sys/module/di/parameters/bypass_prog error(%s)!\n", strerror ( errno ) ); + return -1; + } + + fprintf ( fp, "%d", enable ); + + fclose ( fp ); + fp = NULL; + + return 0; +} + +int CTvin::VDIN_SetDIBypassDynamic ( int flag ) +{ + FILE *fp = NULL; + + + fp = fopen ( "/sys/module/di/parameters/bypass_dynamic", "w" ); + + if ( fp == NULL ) { + LOGW ( "Open /sys/module/di/parameters/bypass_dynamic error(%s)!\n", strerror ( errno ) ); + return -1; + } + + fprintf ( fp, "%d", flag ); + + fclose ( fp ); + fp = NULL; + + return 0; +} + +int CTvin::VDIN_SetDIDet3DMode ( int value ) +{ + FILE *fp = NULL; + + + fp = fopen ( "/sys/module/di/parameters/det3d_mode", "w" ); + + if ( fp == NULL ) { + LOGW ( "Open /sys/module/di/parameters/det3d_mode error(%s)!\n", strerror ( errno ) ); + return -1; + } + + fprintf ( fp, "%d", value ); + + fclose ( fp ); + fp = NULL; + + return 0; +} + +int CTvin::VDIN_SetDIBypass3D ( int enable ) +{ + FILE *fp = NULL; + + + fp = fopen ( "/sys/module/di/parameters/bypass_3d", "w" ); + + if ( fp == NULL ) { + LOGW ( "Open /sys/module/di/parameters/bypass_3d error(%s)!\n", strerror ( errno ) ); + return -1; + } + + fprintf ( fp, "%d", enable ); + + fclose ( fp ); + fp = NULL; + + return 0; +} + +int CTvin::VDIN_SetDIBypassPost ( int enable ) +{ + FILE *fp = NULL; + + + fp = fopen ( "/sys/module/di/parameters/bypass_post", "w" ); + + if ( fp == NULL ) { + LOGW ( "Open /sys/module/di/parameters/bypass_post error(%s)!\n", strerror ( errno ) ); + return -1; + } + + fprintf ( fp, "%d", enable ); + + fclose ( fp ); + fp = NULL; + + return 0; +} + +int CTvin::set3D_FL_Frame(int value) +{ + FILE *fp = NULL; + fp = fopen ( "/sys/module/amvideo/parameters/pause_one_3d_fl_frame", "w" ); + if ( fp == NULL ) { + LOGW ( "Open /sys/module/amvideo/parameters/pause_one_3d_fl_frame error(%s)!\n", strerror ( errno ) ); + return -1; + } + fprintf ( fp, "%d", value ); + fclose ( fp ); + fp = NULL; + return 0; +} + +int CTvin::setLatchFlag(int value) +{ + FILE *fp = NULL; + fp = fopen ( "/sys/module/am_vecm/parameters/vecm_latch_flag", "w" ); + if ( fp == NULL ) { + LOGW ( "/sys/module/am_vecm/parameters/vecm_latch_flag error(%s)!\n", strerror ( errno ) ); + return -1; + } + fprintf ( fp, "%d", value ); + fclose ( fp ); + fp = NULL; + return 0; +} + +int CTvin::VDIN_SetDIProg_Proc_Config ( int value ) +{ + FILE *fp = NULL; + + + fp = fopen ( "/sys/module/di/parameters/prog_proc_config", "w" ); + + if ( fp == NULL ) { + LOGW ( "Open /sys/module/di/parameters/prog_proc_config error(%s)!\n", strerror ( errno ) ); + return -1; + } + + + fprintf ( fp, "%d", value ); + + fclose ( fp ); + fp = NULL; + + return 0; +} +#if(1) +int CTvin::VDIN_SetDISip_Top_Bot ( int value ) +{ + FILE *fp = NULL; + + + fp = fopen ( "/sys/module/di/parameters/skip_top_bot", "w" ); + + if ( fp == NULL ) { + LOGW ( "Open /sys/module/di/parameters/skip_top_bot error(%s)!\n", strerror ( errno ) ); + return -1; + } + + fprintf ( fp, "%d", value ); + + fclose ( fp ); + fp = NULL; + + return 0; + +} +#endif +int CTvin::VDIN_SetVdinFlag ( int flag ) +{ + FILE *fp = NULL; + int freq = 1200000; + + fp = fopen ( "/sys/class/vdin/memp", "w" ); + + if ( fp == NULL ) { + LOGW ( "Open /sys/class/vdin/memp error(%s)!\n", strerror ( errno ) ); + return -1; + } + + fprintf ( fp, "%d", flag ); + fclose ( fp ); + fp = NULL; + + return 0; +} + +int CTvin::VDIN_EnableRDMA ( int enable ) +{ + FILE *fp = NULL; + fp = fopen ( "/sys/module/rdma/parameters/enable", "w" ); + + if ( fp == NULL ) { + LOGW ( "Open /sys/module/rdma/parameters/enable error(%s)!\n", strerror ( errno ) ); + return -1; + } + + fprintf ( fp, "%d", enable ); + fclose ( fp ); + fp = NULL; + return 0; +} + +// AFE +int CTvin::AFE_OpenModule ( void ) +{ + + if ( afe_dev_fd < 0 ) { + afe_dev_fd = open ( AFE_DEV_PATH, O_RDWR ); + + if ( afe_dev_fd < 0 ) { + LOGW ( "Open tvafe module, error(%s).\n", strerror ( errno ) ); + return -1; + } + } + + return afe_dev_fd; +} + +void CTvin::AFE_CloseModule ( void ) +{ + if ( afe_dev_fd >= 0 ) { + close ( afe_dev_fd ); + afe_dev_fd = -1; + } + + return; +} + +int CTvin::AFE_DeviceIOCtl ( int request, ... ) +{ + int tmp_ret = -1; + va_list ap; + void *arg; + + + if ( afe_dev_fd >= 0 ) { + va_start ( ap, request ); + arg = va_arg ( ap, void * ); + va_end ( ap ); + + tmp_ret = ioctl ( afe_dev_fd, request, arg ); + + return tmp_ret; + } + + return -1; +} + +int CTvin::AFE_GetDeviceFileHandle() +{ + return afe_dev_fd; +} + +int CTvin::AFE_SetVGAEdid ( const unsigned char *ediddata ) +{ + int rt = -1; + struct tvafe_vga_edid_s vgaEdid; + +#ifdef NO_IC_TEST + + for ( int i = 0; i < 256; i++ ) { + test_edid[i] = ediddata[i]; + } + +#endif + + for ( int i = 0; i < 256; i++ ) { + vgaEdid.value[i] = ediddata[i]; + } + + rt = AFE_DeviceIOCtl ( TVIN_IOC_S_AFE_VGA_EDID, &vgaEdid ); + + if ( rt < 0 ) { + LOGW ( "AFE_SetVGAEdid, error(%s).!\n", strerror ( errno ) ); + } + + return rt; +} + +int CTvin::AFE_GetVGAEdid ( unsigned char *ediddata ) +{ + int rt = -1; + struct tvafe_vga_edid_s vgaEdid; + +#ifdef NO_IC_TEST + + for ( int i = 0; i < 256; i++ ) { + ediddata[i] = test_edid[i]; + } + + LOGD ( "AFE_GetVGAEdid:\n" ); + LOGD ( "===================================================\n" ); + + for ( int i = 0; i < 256; i++ ) { + LOGD ( "vag edid[%d] = [0x%x].\n", i, ediddata[i] ); + } + + LOGD ( "===================================================\n" ); +#endif + + rt = AFE_DeviceIOCtl ( TVIN_IOC_G_AFE_VGA_EDID, &vgaEdid ); + + for ( int i = 0; i < 256; i++ ) { + ediddata[i] = vgaEdid.value[i]; + } + + if ( rt < 0 ) { + LOGW ( "AFE_GetVGAEdid, error(%s)!\n", strerror ( errno ) ); + } + + return rt; +} + +int CTvin::AFE_SetADCTimingAdjust ( const struct tvafe_vga_parm_s *timingadj ) +{ + int rt = -1; + + if ( timingadj == NULL ) { + return rt; + } + + rt = AFE_DeviceIOCtl ( TVIN_IOC_S_AFE_VGA_PARM, timingadj ); + + if ( rt < 0 ) { + LOGW ( "AFE_SetADCTimingAdjust, error(%s)!\n", strerror ( errno ) ); + } + + return rt; +} + +int CTvin::AFE_GetADCCurrentTimingAdjust ( struct tvafe_vga_parm_s *timingadj ) +{ + int rt = -1; + + if ( timingadj == NULL ) { + return rt; + } + + rt = AFE_DeviceIOCtl ( TVIN_IOC_G_AFE_VGA_PARM, timingadj ); + + if ( rt < 0 ) { + LOGW ( "AFE_GetADCCurrentTimingAdjust, error(%s)!\n", strerror ( errno ) ); + return -1; + } + + return 0; +} + +int CTvin::AFE_VGAAutoAdjust ( struct tvafe_vga_parm_s *timingadj ) +{ + enum tvafe_cmd_status_e CMDStatus = TVAFE_CMD_STATUS_PROCESSING; + struct tvin_parm_s tvin_para; + int rt = -1, i = 0; + + if ( timingadj == NULL ) { + return -1; + } + + for ( i = 0, CMDStatus == TVAFE_CMD_STATUS_PROCESSING; i < 50; i++ ) { + rt = AFE_DeviceIOCtl ( TVIN_IOC_G_AFE_CMD_STATUS, &CMDStatus ); + + if ( rt < 0 ) { + LOGD ( "get afe CMD status, error(%s), fd(%d), return(%d).\n", strerror ( errno ), AFE_GetDeviceFileHandle(), rt ); + } + + if ( ( CMDStatus == TVAFE_CMD_STATUS_IDLE ) || ( CMDStatus == TVAFE_CMD_STATUS_SUCCESSFUL ) ) { + break; + } + + usleep ( 10 * 1000 ); + } + + if ( ( CMDStatus == TVAFE_CMD_STATUS_PROCESSING ) || ( CMDStatus == TVAFE_CMD_STATUS_FAILED ) ) { + return -1; + } + + for ( i = 0; i < 100; i++ ) { + rt = VDIN_DeviceIOCtl ( TVIN_IOC_G_PARM, &tvin_para ); + + if ( tvin_para.info.status == TVIN_SIG_STATUS_STABLE ) { + break; + } + + usleep ( 10 * 1000 ); + } + + rt = AFE_DeviceIOCtl ( TVIN_IOC_S_AFE_VGA_AUTO ); + + if ( rt < 0 ) { + timingadj->clk_step = 0; + timingadj->phase = 0; + timingadj->hpos_step = 0; + timingadj->vpos_step = 0; + AFE_DeviceIOCtl ( TVIN_IOC_S_AFE_VGA_PARM, timingadj ); + return rt; + } else { + ;//AFE_DeviceIOCtl(TVIN_IOC_G_AFE_VGA_PARM, timingadj); + } + + for ( i = 0; i < 10; i++ ) { + sleep ( 1 ); + + rt = AFE_DeviceIOCtl ( TVIN_IOC_G_AFE_CMD_STATUS, &CMDStatus ); + + if ( rt < 0 ) { + return rt; + } else { + if ( CMDStatus == TVAFE_CMD_STATUS_SUCCESSFUL ) { + usleep ( 100 * 1000 ); + AFE_GetADCCurrentTimingAdjust ( timingadj ); + LOGD ( "===================================================\n" ); + LOGW ( "AFE_VGAAutoAdjust, successfull!\n" ); + return 0; + } + } + } + + return -1; +} + +int CTvin::AFE_SetVGAAutoAjust ( void ) +{ + int rt = -1; + tvafe_vga_parm_t timingadj; + tvafe_cmd_status_t Status; + rt = AFE_DeviceIOCtl ( TVIN_IOC_G_AFE_CMD_STATUS, &Status ); + + if ( ( Status == TVAFE_CMD_STATUS_IDLE ) || ( Status == TVAFE_CMD_STATUS_SUCCESSFUL ) ) { + ; + } else { + LOGW ( "AFE_SetVGAAutoAjust, TVIN_IOC_G_AFE_CMD_STATUS failed!\n" ); + return -1; + } + + rt = AFE_DeviceIOCtl ( TVIN_IOC_S_AFE_VGA_AUTO ); + + if ( rt < 0 ) { + timingadj.clk_step = 0; + timingadj.phase = 0; + timingadj.hpos_step = 0; + timingadj.vpos_step = 0; + AFE_DeviceIOCtl ( TVIN_IOC_S_AFE_VGA_PARM, &timingadj ); + return rt; + } + + return 0; +} + +int CTvin::AFE_GetVGAAutoAdjustCMDStatus ( tvafe_cmd_status_t *Status ) +{ + int rt = -1; + + if ( Status == NULL ) { + return rt; + } + + rt = AFE_DeviceIOCtl ( TVIN_IOC_G_AFE_CMD_STATUS, Status ); + + if ( rt < 0 ) { + LOGW ( "AFE_GetVGAAutoAdjustStatus, get status, error(%s) fd(%d) return(%d)\n", strerror ( errno ), AFE_GetDeviceFileHandle(), rt ); + return rt; + } + + return 0; +} + +int CTvin::AFE_GetAdcCal ( struct tvafe_adc_cal_s *adccalvalue ) +{ + int rt = -1; + + rt = AFE_DeviceIOCtl ( TVIN_IOC_G_AFE_ADC_CAL, adccalvalue ); + + if ( rt < 0 ) { + LOGW ( "AFE_GetADCGainOffset, error(%s)!\n", strerror ( errno ) ); + } + + return rt; +} + +int CTvin::AFE_SetAdcCal ( struct tvafe_adc_cal_s *adccalvalue ) +{ + int rt = AFE_DeviceIOCtl ( TVIN_IOC_S_AFE_ADC_CAL, adccalvalue ); + + if ( rt < 0 ) { + LOGW ( "AFE_SetAdcCal, error(%s)!", strerror ( errno ) ); + } + + return rt; +} + +int CTvin::AFE_GetAdcCompCal ( struct tvafe_adc_comp_cal_s *adccalvalue ) +{ + int rt = -1; + + rt = AFE_DeviceIOCtl ( TVIN_IOC_G_AFE_ADC_COMP_CAL, adccalvalue ); + + if ( rt < 0 ) { + LOGW ( "AFE_GetYPbPrADCGainOffset, error(%s)!\n", strerror ( errno ) ); + } + + return rt; +} + +int CTvin::AFE_SetAdcCompCal ( struct tvafe_adc_comp_cal_s *adccalvalue ) +{ + int rt = AFE_DeviceIOCtl ( TVIN_IOC_S_AFE_ADC_COMP_CAL, adccalvalue ); + + if ( rt < 0 ) { + LOGW ( "AFE_SetYPbPrADCGainOffset, error(%s)!", strerror ( errno ) ); + } + + return rt; +} +int CTvin::AFE_GetYPbPrWSSinfo ( struct tvafe_comp_wss_s *wssinfo ) +{ + int rt = AFE_DeviceIOCtl ( TVIN_IOC_G_AFE_COMP_WSS, wssinfo ); + + if ( rt < 0 ) { + LOGW ( "AFE_GetYPbPrWSSinfo, error(%s)!", strerror ( errno ) ); + } + + return rt; +} + +#define RGB444 3 +#define YCBCR422 2 +#define YCBCR444 3 +#define Y422_POS 0 +#define CB422_POS 1 +#define CR422_POS 3 +#define Y444_POS 0 +#define CB444_POS 1 +#define CR444_POS 2 +#define R444_POS 0 +#define G444_POS 1 +#define B444_POS 2 + +//=========== VGA ===================== +#define VGA_BUF_WID (VGA_H_ACTIVE) + +#ifdef PATTERN_7_COLOR_BAR +#define VGA_BAR_WID (VGA_H_ACTIVE/7) +#define VGA_H_CUT_WID (10) +#else +#define VGA_BAR_WID (VGA_H_ACTIVE/8) +#define VGA_H_CUT_WID (10) +#endif + +#define VGA_V_CUT_WID (40) +#define VGA_V_CAL_WID (200+VGA_V_CUT_WID) + +#define VGA_WHITE_HS (VGA_BAR_WID*0+VGA_H_CUT_WID) +#define VGA_WHITE_HE (VGA_BAR_WID*1-VGA_H_CUT_WID-1) +#define VGA_WHITE_VS (VGA_V_CUT_WID) +#define VGA_WHITE_VE (VGA_V_CAL_WID-1) +#define VGA_WHITE_SIZE ((VGA_WHITE_HE-VGA_WHITE_HS+1)*(VGA_WHITE_VE-VGA_WHITE_VS+1)) +#ifdef PATTERN_7_COLOR_BAR +#define VGA_BLACK_HS (VGA_BAR_WID*6+VGA_H_CUT_WID) +#define VGA_BLACK_HE (VGA_BAR_WID*7-VGA_H_CUT_WID-1) +#define VGA_BLACK_VS (768-140) +#define VGA_BLACK_VE (768-40-1) +#define VGA_BLACK_SIZE ((VGA_BLACK_HE-VGA_BLACK_HS+1)*(VGA_BLACK_VE-VGA_BLACK_VS+1)) +#else +#define VGA_BLACK_HS (VGA_BAR_WID*7+VGA_H_CUT_WID) +#define VGA_BLACK_HE (VGA_BAR_WID*8-VGA_H_CUT_WID-1) +#define VGA_BLACK_VS (VGA_V_CUT_WID) +#define VGA_BLACK_VE (VGA_V_CAL_WID-1) +#define VGA_BLACK_SIZE ((VGA_BLACK_HE-VGA_BLACK_HS+1)*(VGA_BLACK_VE-VGA_BLACK_VS+1)) +#endif + +//=========== YPBPR ===================== +#define COMP_BUF_WID (COMP_H_ACTIVE) + +#define COMP_BAR_WID (COMP_H_ACTIVE/8) +#define COMP_H_CUT_WID (20) +#define COMP_V_CUT_WID (100) +#define COMP_V_CAL_WID (200+COMP_V_CUT_WID) + +#define COMP_WHITE_HS (COMP_BAR_WID*0+COMP_H_CUT_WID) +#define COMP_WHITE_HE (COMP_BAR_WID*1-COMP_H_CUT_WID-1) +#define COMP_WHITE_VS (COMP_V_CUT_WID) +#define COMP_WHITE_VE (COMP_V_CAL_WID-1) +#define COMP_WHITE_SIZE ((COMP_WHITE_HE-COMP_WHITE_HS+1)*(COMP_WHITE_VE-COMP_WHITE_VS+1)) +#define CB_WHITE_SIZE ((COMP_WHITE_HE-COMP_WHITE_HS+1)*(COMP_WHITE_VE-COMP_WHITE_VS+1)/2) +#define CR_WHITE_SIZE ((COMP_WHITE_HE-COMP_WHITE_HS+1)*(COMP_WHITE_VE-COMP_WHITE_VS+1)/2) + +#define COMP_YELLOW_HS (COMP_BAR_WID*1+COMP_H_CUT_WID) +#define COMP_YELLOW_HE (COMP_BAR_WID*2-COMP_H_CUT_WID-1) +#define COMP_YELLOW_VS (COMP_V_CUT_WID) +#define COMP_YELLOW_VE (COMP_V_CAL_WID-1) +#define COMP_YELLOW_SIZE ((COMP_YELLOW_HE-COMP_YELLOW_HS+1)*(COMP_YELLOW_VE-COMP_YELLOW_VS+1)/2) + +#define COMP_CYAN_HS (COMP_BAR_WID*2+COMP_H_CUT_WID) +#define COMP_CYAN_HE (COMP_BAR_WID*3-COMP_H_CUT_WID-1) +#define COMP_CYAN_VS (COMP_V_CUT_WID) +#define COMP_CYAN_VE (COMP_V_CAL_WID-1) +#define COMP_CYAN_SIZE ((COMP_CYAN_HE-COMP_CYAN_HS+1)*(COMP_CYAN_VE-COMP_CYAN_VS+1)/2) + +#define COMP_RED_HS (COMP_BAR_WID*5+COMP_H_CUT_WID) +#define COMP_RED_HE (COMP_BAR_WID*6-COMP_H_CUT_WID-1) +#define COMP_RED_VS (COMP_V_CUT_WID) +#define COMP_RED_VE (COMP_V_CAL_WID-1) +#define COMP_RED_SIZE ((COMP_RED_HE-COMP_RED_HS+1)*(COMP_RED_VE-COMP_RED_VS+1)/2) + +#define COMP_BLUE_HS (COMP_BAR_WID*6+COMP_H_CUT_WID) +#define COMP_BLUE_HE (COMP_BAR_WID*7-COMP_H_CUT_WID-1) +#define COMP_BLUE_VS (COMP_V_CUT_WID) +#define COMP_BLUE_VE (COMP_V_CAL_WID-1) +#define COMP_BLUE_SIZE ((COMP_BLUE_HE-COMP_BLUE_HS+1)*(COMP_BLUE_VE-COMP_BLUE_VS+1)/2) + +#define COMP_BLACK_HS (COMP_BAR_WID*7+COMP_H_CUT_WID) +#define COMP_BLACK_HE (COMP_BAR_WID*8-COMP_H_CUT_WID-1) +#define COMP_BLACK_VS (COMP_V_CUT_WID) +#define COMP_BLACK_VE (COMP_V_CAL_WID-1) +#define COMP_BLACK_SIZE ((COMP_BLACK_HE-COMP_BLACK_HS+1)*(COMP_BLACK_VE-COMP_BLACK_VS+1)) +#define CB_BLACK_SIZE ((COMP_BLACK_HE-COMP_BLACK_HS+1)*(COMP_BLACK_VE-COMP_BLACK_VS+1)/2) +#define CR_BLACK_SIZE ((COMP_BLACK_HE-COMP_BLACK_HS+1)*(COMP_BLACK_VE-COMP_BLACK_VS+1)/2) + +//=========== CVBS ===================== +#define CVBS_BUF_WID (CVBS_H_ACTIVE) +#define CVBS_BAR_WID (CVBS_H_ACTIVE/8) +#define CVBS_H_CUT_WID (20) + +#define CVBS_V_CUT_WID (40) +#define CVBS_V_CAL_WID (140+CVBS_V_CUT_WID) + +#define CVBS_WHITE_HS (CVBS_BAR_WID*0+CVBS_H_CUT_WID) +#define CVBS_WHITE_HE (CVBS_BAR_WID*1-CVBS_H_CUT_WID-1) +#define CVBS_WHITE_VS (CVBS_V_CUT_WID) +#define CVBS_WHITE_VE (CVBS_V_CAL_WID-1) +#define CVBS_WHITE_SIZE ((CVBS_WHITE_HE-CVBS_WHITE_HS+1)*(CVBS_WHITE_VE-CVBS_WHITE_VS+1)) + +#define CVBS_BLACK_HS (CVBS_BAR_WID*7+CVBS_H_CUT_WID) +#define CVBS_BLACK_HE (CVBS_BAR_WID*8-CVBS_H_CUT_WID-1) +#define CVBS_BLACK_VS (CVBS_V_CUT_WID) +#define CVBS_BLACK_VE (CVBS_V_CAL_WID-1) +#define CVBS_BLACK_SIZE ((CVBS_BLACK_HE-CVBS_BLACK_HS+1)*(CVBS_BLACK_VE-CVBS_BLACK_VS+1)) + +#define COMP_CAP_SIZE (COMP_H_ACTIVE*COMP_V_ACTIVE*YCBCR422) +#ifdef VGA_SOURCE_RGB444 +#define VGA_CAP_SIZE (VGA_H_ACTIVE*VGA_V_ACTIVE*RGB444) +#else +#define VGA_CAP_SIZE (VGA_H_ACTIVE*VGA_V_ACTIVE*YCBCR444) +#endif +#define CVBS_CAP_SIZE (CVBS_H_ACTIVE*CVBS_V_ACTIVE) + +#define PRE_0 -16 +#define PRE_1 -128 +#define PRE_2 -128 +#define COEF_00 1.164 +#define COEF_01 0 +#define COEF_02 1.793 +#define COEF_10 1.164 +#define COEF_11 -0.213 +#define COEF_12 -0.534 +#define COEF_20 1.164 +#define COEF_21 2.115 +#define COEF_22 0 +#define POST_0 0 +#define POST_1 0 +#define POST_2 0 + +unsigned int CTvin::data_limit ( float data ) +{ + if ( data < 0 ) { + return ( 0 ); + } else if ( data > 255 ) { + return ( 255 ); + } else { + return ( ( unsigned int ) data ); + } +} + +void CTvin::matrix_convert_yuv709_to_rgb ( unsigned int y, unsigned int u, unsigned int v, unsigned int *r, unsigned int *g, unsigned int *b ) +{ + *r = data_limit ( ( ( float ) y + PRE_0 ) * COEF_00 + ( ( float ) u + PRE_1 ) * COEF_01 + ( ( float ) v + PRE_2 ) * COEF_02 + POST_0 + 0.5 ); + *g = data_limit ( ( ( float ) y + PRE_0 ) * COEF_10 + ( ( float ) u + PRE_1 ) * COEF_11 + ( ( float ) v + PRE_2 ) * COEF_12 + POST_1 + 0.5 ); + *b = data_limit ( ( ( float ) y + PRE_0 ) * COEF_20 + ( ( float ) u + PRE_1 ) * COEF_21 + ( ( float ) v + PRE_2 ) * COEF_22 + POST_2 + 0.5 ); +} + +void CTvin::re_order ( unsigned int *a, unsigned int *b ) +{ + unsigned int c = 0; + + if ( *a > *b ) { + c = *a; + *a = *b; + *b = c; + } +} + +char *CTvin::get_cap_addr ( enum adc_cal_type_e calType ) +{ + int n; + char *dp; + + for ( n = 0; n < 0x00ff; n++ ) { + if ( VDIN_DeviceIOCtl ( TVIN_IOC_G_SIG_INFO, &gTvinAFESignalInfo ) < 0 ) { + LOGW ( "get_cap_addr, get signal info, error(%s),fd(%d).\n", strerror ( errno ), m_vdin_dev_fd ); + return NULL; + } else { + if ( gTvinAFESignalInfo.status == TVIN_SIG_STATUS_STABLE ) { + gTvinAFEParam.info.fmt = gTvinAFESignalInfo.fmt; + break; + } + } + } + + if ( gTvinAFESignalInfo.status != TVIN_SIG_STATUS_STABLE ) { + LOGD ( "get_cap_addr, signal isn't stable, out of calibration!\n" ); + return NULL; + } else { + if ( VDIN_DeviceIOCtl ( TVIN_IOC_STOP_DEC ) < 0 ) { + LOGW ( "get_cap_addr, stop vdin, error (%s).\n", strerror ( errno ) ); + return NULL; + } + + usleep ( 1000 ); + + if ( calType == CAL_YPBPR ) { + dp = ( char * ) mmap ( NULL, COMP_CAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, m_vdin_dev_fd, 0 ); + } else { + dp = ( char * ) mmap ( NULL, VGA_CAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, m_vdin_dev_fd, 0 ); + } + + if ( dp < 0 ) { + LOGD ( "get_cap_addr, mmap failed!\n" ); + } + + return dp; + } + + return NULL; +} + +inline unsigned char CTvin::get_mem_data ( char *dp, unsigned int addr ) +{ + return ( * ( dp + ( addr ^ 7 ) ) ); +} + +int CTvin::get_frame_average ( enum adc_cal_type_e calType, struct adc_cal_s *mem_data ) +{ + unsigned int y = 0, cb = 0, cr = 0; + unsigned int r = 0, g = 0, b = 0; + unsigned long n; + unsigned int i = 0, j = 0; + char *dp = get_cap_addr ( calType ); + + if ( calType == CAL_YPBPR ) { + for ( j = COMP_WHITE_VS; j <= COMP_WHITE_VE; j++ ) { + for ( i = COMP_WHITE_HS; i <= COMP_WHITE_HE; i++ ) { + mem_data->g_y_max += get_mem_data ( dp, ( ( COMP_BUF_WID * j + i ) * YCBCR422 ) ); + } + } + + mem_data->g_y_max /= COMP_WHITE_SIZE; + + for ( j = COMP_WHITE_VS; j <= COMP_WHITE_VE; j++ ) { + for ( i = COMP_WHITE_HS; i <= COMP_WHITE_HE; ) { + mem_data->cb_white += get_mem_data ( dp, ( ( COMP_BUF_WID * j + i ) * YCBCR422 + CB422_POS ) ); + mem_data->cr_white += get_mem_data ( dp, ( ( COMP_BUF_WID * j + i ) * YCBCR422 + CR422_POS ) ); + i = i + 2; + } + } + + mem_data->cb_white /= CB_WHITE_SIZE; + mem_data->cr_white /= CR_WHITE_SIZE; + + for ( j = COMP_RED_VS; j <= COMP_RED_VE; j++ ) { + for ( i = COMP_RED_HS; i <= COMP_RED_HE; ) { + mem_data->rcr_max += get_mem_data ( dp, ( ( COMP_BUF_WID * j + i ) * YCBCR422 + CR422_POS ) ); + i = i + 2; + } + } + + mem_data->rcr_max /= COMP_RED_SIZE; + + for ( j = COMP_BLUE_VS; j <= COMP_BLUE_VE; j++ ) { + for ( i = COMP_BLUE_HS; i <= COMP_BLUE_HE; ) { + mem_data->bcb_max += get_mem_data ( dp, ( ( COMP_BUF_WID * j + i ) * YCBCR422 + CB422_POS ) ); + i = i + 2; + } + } + + mem_data->bcb_max /= COMP_BLUE_SIZE; + + for ( j = COMP_BLACK_VS; j <= COMP_BLACK_VE; j++ ) { + for ( i = COMP_BLACK_HS; i <= COMP_BLACK_HE; i++ ) { + mem_data->g_y_min += get_mem_data ( dp, ( ( COMP_BUF_WID * j + i ) * YCBCR422 ) ); + } + } + + mem_data->g_y_min /= COMP_BLACK_SIZE; + + for ( j = COMP_BLACK_VS; j <= COMP_BLACK_VE; j++ ) { + for ( i = COMP_BLACK_HS; i <= COMP_BLACK_HE; ) { + mem_data->cb_black += get_mem_data ( dp, ( ( COMP_BUF_WID * j + i ) * YCBCR422 + CB422_POS ) ); + mem_data->cr_black += get_mem_data ( dp, ( ( COMP_BUF_WID * j + i ) * YCBCR422 + CR422_POS ) ); + i = i + 2; + } + } + + mem_data->cb_black /= CB_BLACK_SIZE; + mem_data->cr_black /= CR_BLACK_SIZE; + + /* + for (j=COMP_BLACK_VS; j<=COMP_BLACK_VE; j++) { + for (i=COMP_BLACK_HS; i<=COMP_BLACK_HE;) { + //mem_data->cb_black += get_mem_data(dp, ((COMP_BUF_WID*j+i)*YCBCR422+CB422_POS)); + mem_data->cr_black += get_mem_data(dp, ((COMP_BUF_WID*j+i)*YCBCR422+CR422_POS)); + i = i+2; + } + } + mem_data->cr_black /= CR_BLACK_SIZE; + */ + for ( j = COMP_CYAN_VS; j <= COMP_CYAN_VE; j++ ) { + for ( i = COMP_CYAN_HS; i <= COMP_CYAN_HE; ) { + mem_data->rcr_min += get_mem_data ( dp, ( ( COMP_BUF_WID * j + i ) * YCBCR422 + CR422_POS ) ); + i = i + 2; + } + } + + mem_data->rcr_min /= COMP_CYAN_SIZE; + + for ( j = COMP_YELLOW_VS; j <= COMP_YELLOW_VE; j++ ) { + for ( i = COMP_YELLOW_HS; i <= COMP_YELLOW_HE; ) { + mem_data->bcb_min += get_mem_data ( dp, ( COMP_BUF_WID * j + i ) * YCBCR422 + CB422_POS ); + i = i + 2; + } + } + + mem_data->bcb_min /= COMP_YELLOW_SIZE; + + } else if ( calType == CAL_VGA ) { + for ( j = VGA_WHITE_VS; j <= VGA_WHITE_VE; j++ ) { + for ( i = VGA_WHITE_HS; i <= VGA_WHITE_HE; i++ ) { +#ifdef VGA_SOURCE_RGB444 + r = get_mem_data ( dp, ( ( VGA_BUF_WID * j + i ) * RGB444 + R444_POS ) ); + g = get_mem_data ( dp, ( ( VGA_BUF_WID * j + i ) * RGB444 + G444_POS ) ); + b = get_mem_data ( dp, ( ( VGA_BUF_WID * j + i ) * RGB444 + B444_POS ) ); +#else + y = get_mem_data ( dp, ( ( VGA_BUF_WID * j + i ) * YCBCR444 + Y444_POS ) ); + cb = get_mem_data ( dp, ( ( VGA_BUF_WID * j + i ) * YCBCR444 + CB444_POS ) ); + cr = get_mem_data ( dp, ( ( VGA_BUF_WID * j + i ) * YCBCR444 + CR444_POS ) ); + matrix_convert_yuv709_to_rgb ( y, cb, cr, &r, &g, &b ); +#endif + mem_data->rcr_max = mem_data->rcr_max + r; + mem_data->g_y_max = mem_data->g_y_max + g; + mem_data->bcb_max = mem_data->bcb_max + b; + } + } + + mem_data->rcr_max = mem_data->rcr_max / VGA_WHITE_SIZE; + mem_data->g_y_max = mem_data->g_y_max / VGA_WHITE_SIZE; + mem_data->bcb_max = mem_data->bcb_max / VGA_WHITE_SIZE; + + for ( j = VGA_BLACK_VS; j <= VGA_BLACK_VE; j++ ) { + for ( i = VGA_BLACK_HS; i <= VGA_BLACK_HE; i++ ) { +#ifdef VGA_SOURCE_RGB444 + r = get_mem_data ( dp, ( ( VGA_BUF_WID * j + i ) * RGB444 + R444_POS ) ); + g = get_mem_data ( dp, ( ( VGA_BUF_WID * j + i ) * RGB444 + G444_POS ) ); + b = get_mem_data ( dp, ( ( VGA_BUF_WID * j + i ) * RGB444 + B444_POS ) ); +#else + y = get_mem_data ( dp, ( ( VGA_BUF_WID * j + i ) * YCBCR444 + Y444_POS ) ); + cb = get_mem_data ( dp, ( ( VGA_BUF_WID * j + i ) * YCBCR444 + CB444_POS ) ); + cr = get_mem_data ( dp, ( ( VGA_BUF_WID * j + i ) * YCBCR444 + CR444_POS ) ); + matrix_convert_yuv709_to_rgb ( y, cb, cr, &r, &g, &b ); +#endif + mem_data->rcr_min = mem_data->rcr_min + r; + mem_data->g_y_min = mem_data->g_y_min + g; + mem_data->bcb_min = mem_data->bcb_min + b; + } + } + + mem_data->rcr_min = mem_data->rcr_min / VGA_BLACK_SIZE; + mem_data->g_y_min = mem_data->g_y_min / VGA_BLACK_SIZE; + mem_data->bcb_min = mem_data->bcb_min / VGA_BLACK_SIZE; + + } else { //CVBS + for ( j = CVBS_WHITE_VS; j <= CVBS_WHITE_VE; j++ ) { + for ( i = CVBS_WHITE_HS; i <= CVBS_WHITE_HE; i++ ) { + mem_data->g_y_max += mem_data->g_y_max + get_mem_data ( dp, ( ( CVBS_BUF_WID * j + i ) * YCBCR422 ) ); + } + } + + mem_data->g_y_max /= COMP_WHITE_SIZE; + + for ( j = CVBS_BLACK_VS; j <= CVBS_BLACK_VE; j++ ) { + for ( i = CVBS_BLACK_HS; i <= CVBS_BLACK_HE; i++ ) { + mem_data->g_y_min += mem_data->g_y_min + get_mem_data ( dp, ( ( CVBS_BUF_WID * j + i ) * YCBCR422 ) ); + } + } + + mem_data->g_y_min /= CVBS_BLACK_SIZE; + } + + if ( calType == CAL_YPBPR ) { + munmap ( dp, COMP_CAP_SIZE ); + } else if ( calType == CAL_VGA ) { + munmap ( dp, VGA_CAP_SIZE ); + } else { + munmap ( dp, CVBS_CAP_SIZE ); + } + + if ( VDIN_DeviceIOCtl ( TVIN_IOC_START_DEC, &gTvinAFEParam ) < 0 ) { + LOGW ( "get_frame_average, get vdin signal info, error(%s),fd(%d).\n", strerror ( errno ), m_vdin_dev_fd ); + return NULL; + } else { + ; + } + + return 0; +} + +#define ADC_CAL_FRAME_QTY_ORDER 2 //NOTE: MUST >=2!! +struct adc_cal_s CTvin::get_n_frame_average ( enum adc_cal_type_e calType ) +{ + struct adc_cal_s mem_data = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + unsigned int rcrmax[1 << ADC_CAL_FRAME_QTY_ORDER]; + unsigned int rcrmin[1 << ADC_CAL_FRAME_QTY_ORDER]; + unsigned int g_ymax[1 << ADC_CAL_FRAME_QTY_ORDER]; + unsigned int g_ymin[1 << ADC_CAL_FRAME_QTY_ORDER]; + unsigned int bcbmax[1 << ADC_CAL_FRAME_QTY_ORDER]; + unsigned int bcbmin[1 << ADC_CAL_FRAME_QTY_ORDER]; + unsigned int cbwhite[1 << ADC_CAL_FRAME_QTY_ORDER]; + unsigned int crwhite[1 << ADC_CAL_FRAME_QTY_ORDER]; + unsigned int cbblack[1 << ADC_CAL_FRAME_QTY_ORDER]; + unsigned int crblack[1 << ADC_CAL_FRAME_QTY_ORDER]; + unsigned int i = 0, j = 0; + + for ( i = 0; i < ( 1 << ADC_CAL_FRAME_QTY_ORDER ); i++ ) { + get_frame_average ( calType, &mem_data ); + rcrmax[i] = mem_data.rcr_max; + rcrmin[i] = mem_data.rcr_min; + g_ymax[i] = mem_data.g_y_max; + g_ymin[i] = mem_data.g_y_min; + bcbmax[i] = mem_data.bcb_max; + bcbmin[i] = mem_data.bcb_min; + cbwhite[i] = mem_data.cb_white; + crwhite[i] = mem_data.cr_white; + cbblack[i] = mem_data.cb_black; + crblack[i] = mem_data.cr_black; + } + + for ( i = 0; i < ( 1 << ADC_CAL_FRAME_QTY_ORDER ) - 1; i++ ) { + for ( j = 1; j < ( 1 << ADC_CAL_FRAME_QTY_ORDER ); j++ ) { + re_order ( & ( rcrmax[i] ), & ( rcrmax[j] ) ); + re_order ( & ( rcrmin[i] ), & ( rcrmin[j] ) ); + re_order ( & ( g_ymax[i] ), & ( g_ymax[j] ) ); + re_order ( & ( g_ymin[i] ), & ( g_ymin[j] ) ); + re_order ( & ( bcbmax[i] ), & ( bcbmax[j] ) ); + re_order ( & ( bcbmin[i] ), & ( bcbmin[j] ) ); + re_order ( & ( cbwhite[i] ), & ( cbwhite[j] ) ); + re_order ( & ( crwhite[i] ), & ( crwhite[j] ) ); + re_order ( & ( cbblack[i] ), & ( cbblack[j] ) ); + re_order ( & ( crblack[i] ), & ( crblack[j] ) ); + } + } + + + memset ( &mem_data, 0, sizeof ( mem_data ) ); + + for ( i = 0; i < ( 1 << ( ADC_CAL_FRAME_QTY_ORDER - 1 ) ); i++ ) { //(1<<(ADC_CAL_FRAME_QTY_ORDER-1)) + mem_data.rcr_max += rcrmax[i + ( 1 << ( ADC_CAL_FRAME_QTY_ORDER - 2 ) )]; + mem_data.rcr_min += rcrmin[i + ( 1 << ( ADC_CAL_FRAME_QTY_ORDER - 2 ) )]; + mem_data.g_y_max += g_ymax[i + ( 1 << ( ADC_CAL_FRAME_QTY_ORDER - 2 ) )]; + mem_data.g_y_min += g_ymin[i + ( 1 << ( ADC_CAL_FRAME_QTY_ORDER - 2 ) )]; + mem_data.bcb_max += bcbmax[i + ( 1 << ( ADC_CAL_FRAME_QTY_ORDER - 2 ) )]; + mem_data.bcb_min += bcbmin[i + ( 1 << ( ADC_CAL_FRAME_QTY_ORDER - 2 ) )]; + mem_data.cb_white += cbwhite[i + ( 1 << ( ADC_CAL_FRAME_QTY_ORDER - 2 ) )]; + mem_data.cr_white += crwhite[i + ( 1 << ( ADC_CAL_FRAME_QTY_ORDER - 2 ) )]; + mem_data.cb_black += cbblack[i + ( 1 << ( ADC_CAL_FRAME_QTY_ORDER - 2 ) )]; + mem_data.cr_black += crblack[i + ( 1 << ( ADC_CAL_FRAME_QTY_ORDER - 2 ) )]; + } + + + mem_data.rcr_max >>= ( ADC_CAL_FRAME_QTY_ORDER - 1 ); + mem_data.rcr_min >>= ( ADC_CAL_FRAME_QTY_ORDER - 1 ); + mem_data.g_y_max >>= ( ADC_CAL_FRAME_QTY_ORDER - 1 ); + mem_data.g_y_min >>= ( ADC_CAL_FRAME_QTY_ORDER - 1 ); + mem_data.bcb_max >>= ( ADC_CAL_FRAME_QTY_ORDER - 1 ); + mem_data.bcb_min >>= ( ADC_CAL_FRAME_QTY_ORDER - 1 ); + mem_data.cb_white >>= ( ADC_CAL_FRAME_QTY_ORDER - 1 ); + mem_data.cr_white >>= ( ADC_CAL_FRAME_QTY_ORDER - 1 ); + mem_data.cb_black >>= ( ADC_CAL_FRAME_QTY_ORDER - 1 ); + mem_data.cr_black >>= ( ADC_CAL_FRAME_QTY_ORDER - 1 ); + + return mem_data; +} + +int CTvin::AFE_GetMemData ( int typeSel, struct adc_cal_s *mem_data ) +{ + int rt = -1; + + if ( m_vdin_dev_fd < 0 || mem_data == NULL ) { + LOGW ( "AFE_GetMemData, didn't open vdin fd, return!\n" ); + return -1; + } + + memset ( &gTvinAFEParam, 0, sizeof ( gTvinAFEParam ) ); + memset ( &gTvinAFESignalInfo, 0, sizeof ( gTvinAFESignalInfo ) ); + + if ( VDIN_DeviceIOCtl ( TVIN_IOC_G_PARM, &gTvinAFEParam ) < 0 ) { + LOGW ( "AFE_GetMemData, get vdin param, error(%s), fd(%d)!\n", strerror ( errno ), m_vdin_dev_fd ); + return -1; + } + + gTvinAFEParam.flag = gTvinAFEParam.flag | TVIN_PARM_FLAG_CAP; + + if ( VDIN_DeviceIOCtl ( TVIN_IOC_S_PARM, &gTvinAFEParam ) < 0 ) { + LOGW ( "AFE_GetMemData, set vdin param error(%s)!\n", strerror ( errno ) ); + return -1; + } + + if ( typeSel == 0 ) { + get_frame_average ( CAL_YPBPR, mem_data ); + } else if ( typeSel == 1 ) { + get_frame_average ( CAL_VGA, mem_data ); + } else { + *mem_data = get_n_frame_average ( CAL_CVBS ); + } + + gTvinAFEParam.flag &= 0x11111110; + + if ( VDIN_DeviceIOCtl ( TVIN_IOC_S_PARM, &gTvinAFEParam ) < 0 ) { + LOGW ( "AFE_GetMemData, set vdin param error(%s)\n", strerror ( errno ) ); + return -1; + } + + LOGD ( "AFE_GetMemData, MAX ======> :\n Y(White)->%d \n Cb(Blue)->%d \n Cr(Red)->%d\n", mem_data->g_y_max, mem_data->bcb_max, mem_data->rcr_max ); + LOGD ( "AFE_GetMemData, MIN ======>:\n Y(Black)->%d \n Cb(Yellow)->%d \n Cr(Cyan)->%d\n Cb(White) ->%d\n Cb(Black)->%d\n Cr(Black)->%d\n", mem_data->g_y_min, mem_data->bcb_min, mem_data->rcr_min, + mem_data->cb_white, mem_data->cb_black, mem_data->cr_black ); + return 0; +} + +int CTvin::AFE_GetCVBSLockStatus ( enum tvafe_cvbs_video_e *cvbs_lock_status ) +{ + int rt = -1; + + rt = AFE_DeviceIOCtl ( TVIN_IOC_G_AFE_CVBS_LOCK, cvbs_lock_status ); + + if ( rt < 0 ) { + LOGD ( "AFE_GetCVBSLockStatus, error: return(%d), error(%s)!\n", rt, strerror ( errno ) ); + } else { + LOGD ( "AFE_GetCVBSLockStatus, value=%d.\n", *cvbs_lock_status ); + } + + return *cvbs_lock_status; +} + +int CTvin::AFE_SetCVBSStd ( tvin_sig_fmt_t fmt ) +{ + int rt = -1; + + LOGD ( "AFE_SetCVBSStd, sig_fmt = %d\n", fmt ); + rt = AFE_DeviceIOCtl ( TVIN_IOC_S_AFE_CVBS_STD, &fmt ); + + if ( rt < 0 ) { + LOGD ( "AFE_SetCVBSStd, error: return(%d), error(%s)!\n", rt, strerror ( errno ) ); + } + + return rt; +} + +int CTvin::TvinApi_SetStartDropFrameCn ( int count ) +{ + int ret = -1; + char set_str[4]; + + memset ( set_str, 0, 4 ); + sprintf ( set_str, "%d", count ); + return SetFileAttrValue ( "/sys/module/di/parameters/start_frame_drop_count", set_str ); +} + +int CTvin::TvinApi_SetVdinHVScale ( int vdinx, int hscale, int vscale ) +{ + int ret = -1; + char set_str[32]; + + memset ( set_str, 0, 32 ); + sprintf ( set_str, "%s %d %d", "hvscaler", hscale, vscale ); + + if ( vdinx == 0 ) { + ret = SetFileAttrValue ( "/sys/class/vdin/vdin0/attr", set_str ); + } else { + ret = SetFileAttrValue ( "/sys/class/vdin/vdin1/attr", set_str ); + } + + return ret; +} +int CTvin::TvinApi_SetCompPhase ( am_phase_t &am_phase ) +{ + int ret = -1, fd = -1; + unsigned int i = 0; + int idx = 0, len = 0; + char str1[200], str2[100]; + + LOGD ( "enter,TvinApi_SetCompPhase" ); + + fd = open ( "/sys/module/tvin_afe/parameters/comp_phase", O_RDWR ); + + if ( fd < 0 ) { + LOGW ( "Open vdin_comp_phase_op_mutex error(%s)!!\n", strerror ( errno ) ); + + return -1; + } + + for ( i = 0; i < am_phase.length; i++ ) { + sprintf ( &str1[idx], "%d,", am_phase.phase[i] ); + sprintf ( str2, "%d,", am_phase.phase[i] ); + int len = strlen ( str2 ); + idx = idx + len; + } + + LOGD ( "##########str1 = %s\n", str1 ); + + ret = write ( fd, str1, strlen ( str1 ) ); + + if ( ret < 0 ) { + LOGD ( "Write vdin_comp_phase_op_mutex error(%s)!!\n", strerror ( errno ) ); + } + + LOGD ( "write ok!!!" ); + close ( fd ); + fd = -1; + + return ret; +} + +tvin_trans_fmt CTvin::TvinApi_Get3DDectMode() +{ + + int fd; + int ret; + char det_3d[10]; + int det_3dmode = 8; + //LOGW("det_3dmode %d\n", det_3dmode); + + fd = open ( "/sys/module/di/parameters/det3d_mode", O_RDWR ); + + if ( fd < 0 ) { + LOGW ( "/sys/module/di/parameters/det3d_mode error(%s)!!\n", strerror ( errno ) ); + + return TVIN_TFMT_3D_MAX; + } + + ret = read ( fd, det_3d, 10 ); + + if ( ret < 0 ) { + LOGW ( "/sys/module/di/parameters/det3d_mode error(%s)!!\n", strerror ( errno ) ); + } + + det_3dmode = atoi ( det_3d ); + close ( fd ); + fd = -1; + + return (tvin_trans_fmt)det_3dmode; +} +int CTvin::TvinApi_SetCompPhaseEnable ( int enable ) +{ + int ret = -1; + + if ( enable == 1 ) { + ret = SetFileAttrValue ( "/sys/module/tvin_afe/parameters/enable_dphase", "Y" ); + LOGD ( "%s, enable TvinApi_SetCompPhase.", "TV" ); + } + + return ret; +} + +int CTvin::VDIN_GetPortConnect ( int port ) +{ + int status = 0; + + if ( VDIN_DeviceIOCtl ( TVIN_IOC_CALLMASTER_SET, &port ) < 0 ) { + LOGW ( "TVIN_IOC_CALLMASTER_SET error(%s) port %d\n", strerror ( errno ), port ); + return 0; + } + + if ( VDIN_DeviceIOCtl ( TVIN_IOC_CALLMASTER_GET, &status ) < 0 ) { + LOGW ( "TVIN_IOC_CALLMASTER_GET error(%s)\n", strerror ( errno ) ); + return 0; + } + + //LOGD("%s, port:%x,status:%d", "TV",port,status); + + return status; +} + +int CTvin::VDIN_OpenHDMIPinMuxOn ( bool flag ) +{ + FILE *fp = NULL; + int status = 1; + + fp = fopen ( "/sys/class/hdmirx/hdmirx0/debug", "w" ); + + if ( fp == NULL ) { + LOGW ( "Open /sys/class/hdmirx/hdmirx0/debug(%s)!\n", strerror ( errno ) ); + return -1; + } + + if ( flag ) { + fprintf ( fp, "%s", "pinmux_on" ); + } else { + fprintf ( fp, "%s", "pinmux_off" ); + + } + + fclose ( fp ); + fp = NULL; + return status; +} + +int CTvin::VDIN_GetHdmiHdcpKeyKsvInfo(struct _hdcp_ksv *msg) +{ + int m_ksv_dev_fd = -1; + + if (msg == NULL) { + LOGE("%s, msg is NULL\n", __FUNCTION__); + } + + //PrintMessage(__FUNCTION__, 0, msg); + + m_ksv_dev_fd = open(HDMIRX_KSV_PATH, O_RDWR); + if (m_ksv_dev_fd < 0) { + LOGE("%s, Open file %s error: (%s)!\n", __FUNCTION__, HDMIRX_KSV_PATH, strerror ( errno )); + return -1; + } + LOGD("# call ioctl with HDMI_IOC_HDCP_SENT_KSV #"); + ioctl(m_ksv_dev_fd, HDMI_IOC_HDCP_KSV, msg); + + close(m_ksv_dev_fd); + m_ksv_dev_fd = -1; + + LOGD("msg->bksv0 is %x, msg->bksv1 is %x", msg->bksv0, msg->bksv1); + + return 0; +} + + +int CTvin::get_hdmi_ksv_info(int source_input, int data_buf[]) +{ + if (source_input != SOURCE_HDMI1 && source_input != SOURCE_HDMI2 && source_input != SOURCE_HDMI3) { + return -1; + } + + struct _hdcp_ksv msg; + int ret = -1; + ret = VDIN_GetHdmiHdcpKeyKsvInfo(&msg); + memset((void *)data_buf, 0, 2); + data_buf[0] = msg.bksv0; + data_buf[1] = msg.bksv1; + return ret; +} + + +int CTvin::TVAFE_EnablePlugInDetect ( bool flag ) +{ + FILE *fp = NULL; + int status = 1; + + fp = fopen ( "/sys/class/tvafe/tvafe0/debug", "w" ); + + if ( fp == NULL ) { + LOGW ( "Open /sys/class/tvafe/tvafe0/debug (%s)!\n", strerror ( errno ) ); + return -1; + } + + if ( flag ) { + fprintf ( fp, "%s", "tvafe_enable" ); + } else { + fprintf ( fp, "%s", "tvafe_down" ); + + } + + fclose ( fp ); + fp = NULL; + return status; +} + +int CTvin::TvinApi_GetHDMIAudioStatus ( void ) +{ + int fd; + int val = 0; + char bcmd[16]; + fd = open ( "/sys/module/tvin_hdmirx/parameters/auds_rcv_sts", O_RDONLY ); + + if ( fd >= 0 ) { + read ( fd, bcmd, sizeof ( bcmd ) ); + val = strtol ( bcmd, NULL, 10 ); + close ( fd ); + } else { + LOGE ( "open /sys/module/tvin_hdmirx/parameters/auds_rcv_sts ERROR(%s)!!\n", strerror ( errno ) ); + return -1; + } + + return val; +} + +int CTvin::TvinApi_LoadPLLValues ( am_regs_t regs ) +{ + int rt = AFE_DeviceIOCtl ( TVIN_IOC_LOAD_REG, ®s ); + + if ( rt < 0 ) { + LOGE ( "TvinApi_LoadPLLValues, error(%s)!\n", strerror ( errno ) ); + } + + return rt; +} + +int CTvin::TvinApi_LoadCVD2Values ( am_regs_t regs ) +{ + int rt = AFE_DeviceIOCtl ( TVIN_IOC_LOAD_REG, ®s ); + + if ( rt < 0 ) { + LOGE ( "TvinApi_LoadCVD2Values, error(%s)!\n", strerror ( errno ) ); + } + + return rt; +} + + +int CTvin::TvinApi_GetFbSize ( unsigned int *fb_width, unsigned int *fb_height ) +{ + int fbfd = 0; + struct fb_var_screeninfo vinfo; + struct fb_fix_screeninfo finfo; + int xres = 0, yres = 0, bits_per_pixel = 0; + + fbfd = open ( "/dev/graphics/fb0", O_RDWR ); + + if ( !fbfd ) { + return -1; + } + + if ( ioctl ( fbfd, FBIOGET_FSCREENINFO, &finfo ) ) { + goto fail_close_fb; + } + + if ( ioctl ( fbfd, FBIOGET_VSCREENINFO, &vinfo ) ) { + goto fail_close_fb; + } + + *fb_width = vinfo.xres; + *fb_height = vinfo.yres; + + return 1; + +fail_close_fb: + close ( fbfd );; + return -1; +} + +tv_source_input_type_t CTvin::Tvin_SourceInputToSourceInputType ( tv_source_input_t source_input ) +{ + if (source_input == SOURCE_TV) { + return SOURCE_TYPE_TV; + } else if (source_input == SOURCE_AV1 || source_input == SOURCE_AV2) { + return SOURCE_TYPE_AV; + } else if (source_input == SOURCE_YPBPR1 || source_input == SOURCE_YPBPR2) { + return SOURCE_TYPE_COMPONENT; + } else if (source_input == SOURCE_VGA) { + return SOURCE_TYPE_VGA; + } else if (source_input == SOURCE_HDMI1 || source_input == SOURCE_HDMI2 || source_input == SOURCE_HDMI3) { + return SOURCE_TYPE_HDMI; + } else if (source_input == SOURCE_DTV) { + return SOURCE_TYPE_DTV; + } else if (source_input == SOURCE_IPTV) { + return SOURCE_TYPE_IPTV; + } else if (source_input == SOURCE_MPEG) { + return SOURCE_TYPE_MPEG; + } + + return SOURCE_TYPE_MPEG; +} + +tv_source_input_type_t CTvin::Tvin_SourcePortToSourceInputType ( tvin_port_t source_port ) +{ + tv_source_input_t source_input = Tvin_PortToSourceInput(source_port); + return Tvin_SourceInputToSourceInputType(source_input); +} + +tvin_port_t CTvin::Tvin_GetSourcePortBySourceType ( tv_source_input_type_t source_type ) +{ + tvin_port_t source_port; + + switch ( source_type ) { + case SOURCE_TYPE_TV: + source_port = Tvin_GetSourcePortBySourceInput(SOURCE_TV); + break; + case SOURCE_TYPE_AV: + source_port = Tvin_GetSourcePortBySourceInput(SOURCE_AV1); + break; + case SOURCE_TYPE_COMPONENT: + source_port = Tvin_GetSourcePortBySourceInput(SOURCE_YPBPR1); + break; + case SOURCE_TYPE_VGA: + source_port = Tvin_GetSourcePortBySourceInput(SOURCE_VGA); + break; + case SOURCE_TYPE_HDMI: + source_port = TVIN_PORT_HDMI0; + break; + case SOURCE_TYPE_IPTV: + source_port = Tvin_GetSourcePortBySourceInput(SOURCE_IPTV); + break; + case SOURCE_TYPE_DTV: + source_port = Tvin_GetSourcePortBySourceInput(SOURCE_DTV); + break; + case SOURCE_TYPE_MPEG: + default: + source_port = Tvin_GetSourcePortBySourceInput(SOURCE_MPEG); + break; + } + + return source_port; +} + + +tvin_port_t CTvin::Tvin_GetSourcePortBySourceInput ( tv_source_input_t source_input ) +{ + tvin_port_t source_port = TVIN_PORT_NULL; + + if ( source_input < SOURCE_TV || source_input >= SOURCE_MAX ) { + source_port = TVIN_PORT_NULL; + } else { + source_port = ( tvin_port_t ) mSourceInputToPortMap[ ( int ) source_input]; + } + + return source_port; +} + +tv_source_input_t CTvin::Tvin_PortToSourceInput ( tvin_port_t port ) +{ + int i; + + for ( i = SOURCE_TV; i < SOURCE_MAX; i++ ) { + if ( mSourceInputToPortMap[i] == port ) { + break; + } + } + + if ( i == SOURCE_MAX ) { + return SOURCE_MAX; + } else { + return tv_source_input_t ( i ); + } +} + +unsigned int CTvin::Tvin_TransPortStringToValue(const char *port_str) +{ + if (strcasecmp(port_str, "TVIN_PORT_CVBS0") == 0) { + return TVIN_PORT_CVBS0; + } else if (strcasecmp(port_str, "TVIN_PORT_CVBS1") == 0) { + return TVIN_PORT_CVBS1; + } else if (strcasecmp(port_str, "TVIN_PORT_CVBS2") == 0) { + return TVIN_PORT_CVBS2; + } else if (strcasecmp(port_str, "TVIN_PORT_CVBS3") == 0) { + return TVIN_PORT_CVBS3; + } else if (strcasecmp(port_str, "TVIN_PORT_COMP0") == 0) { + return TVIN_PORT_COMP0; + } else if (strcasecmp(port_str, "TVIN_PORT_COMP1") == 0) { + return TVIN_PORT_COMP1; + } else if (strcasecmp(port_str, "TVIN_PORT_VGA0") == 0) { + return TVIN_PORT_VGA0; + } else if (strcasecmp(port_str, "TVIN_PORT_HDMI0") == 0) { + return TVIN_PORT_HDMI0; + } else if (strcasecmp(port_str, "TVIN_PORT_HDMI1") == 0) { + return TVIN_PORT_HDMI1; + } else if (strcasecmp(port_str, "TVIN_PORT_HDMI2") == 0) { + return TVIN_PORT_HDMI2; + } else if (strcasecmp(port_str, "TVIN_PORT_HDMI3") == 0) { + return TVIN_PORT_HDMI3; + } + + return TVIN_PORT_MPEG0; +} + +void CTvin::Tvin_LoadSourceInputToPortMap() +{ + const char *SourceInputMapSection = "SourceInputMap"; + const char *config_value = NULL; + + config_value = config_get_str(SourceInputMapSection, "ro.tv.tvinchannel.atv", "TVIN_PORT_CVBS3"); + mSourceInputToPortMap[SOURCE_TV] = Tvin_TransPortStringToValue(config_value); + + config_value = config_get_str(SourceInputMapSection, "ro.tv.tvinchannel.av1", "TVIN_PORT_CVBS1"); + mSourceInputToPortMap[SOURCE_AV1] = Tvin_TransPortStringToValue(config_value); + + config_value = config_get_str(SourceInputMapSection, "ro.tv.tvinchannel.av2", "TVIN_PORT_CVBS2"); + mSourceInputToPortMap[SOURCE_AV2] = Tvin_TransPortStringToValue(config_value); + + config_value = config_get_str(SourceInputMapSection, "ro.tv.tvinchannel.ypbpr1", "TVIN_PORT_COMP0"); + mSourceInputToPortMap[SOURCE_YPBPR1] = Tvin_TransPortStringToValue(config_value); + + config_value = config_get_str(SourceInputMapSection, "ro.tv.tvinchannel.ypbpr2", "TVIN_PORT_COMP1"); + mSourceInputToPortMap[SOURCE_YPBPR2] = Tvin_TransPortStringToValue(config_value); + + config_value = config_get_str(SourceInputMapSection, "ro.tv.tvinchannel.hdmi1", "TVIN_PORT_HDMI0"); + mSourceInputToPortMap[SOURCE_HDMI1] = Tvin_TransPortStringToValue(config_value); + + config_value = config_get_str(SourceInputMapSection, "ro.tv.tvinchannel.hdmi2", "TVIN_PORT_HDMI2"); + mSourceInputToPortMap[SOURCE_HDMI2] = Tvin_TransPortStringToValue(config_value); + + config_value = config_get_str(SourceInputMapSection, "ro.tv.tvinchannel.hdmi3", "TVIN_PORT_HDMI1"); + mSourceInputToPortMap[SOURCE_HDMI3] = Tvin_TransPortStringToValue(config_value); + + config_value = config_get_str(SourceInputMapSection, "ro.tv.tvinchannel.vga", "TVIN_PORT_VGA0"); + mSourceInputToPortMap[SOURCE_VGA] = Tvin_TransPortStringToValue(config_value); + + mSourceInputToPortMap[SOURCE_MPEG] = TVIN_PORT_MPEG0; + mSourceInputToPortMap[SOURCE_DTV] = TVIN_PORT_DTV; + mSourceInputToPortMap[SOURCE_IPTV] = TVIN_PORT_BT656; + + return; +} + +int CTvin::Tvin_GetSourcePortByCECPhysicalAddress(int physical_addr) +{ + if (physical_addr == 0x1000) { + return TVIN_PORT_HDMI0; + } else if (physical_addr == 0x2000) { + return TVIN_PORT_HDMI1; + } else if (physical_addr == 0x3000) { + return TVIN_PORT_HDMI2; + } + + return TVIN_PORT_MAX; +} + +tv_audio_channel_t CTvin::Tvin_GetInputSourceAudioChannelIndex ( tv_source_input_t source_input ) +{ + int aud_chan = TV_AUDIO_LINE_IN_0; + const char *config_value = NULL; + + if ( source_input == SOURCE_TV ) { + config_value = config_get_str("TV", "tvin.aud.chan.atv", "2"); + } else if ( source_input == SOURCE_AV1 ) { + config_value = config_get_str("TV", "tvin.aud.chan.av1", "1"); + } else if ( source_input == SOURCE_AV2 ) { + config_value = config_get_str("TV", "tvin.aud.chan.av2", "3"); + } else if ( source_input == SOURCE_YPBPR1 ) { + config_value = config_get_str("TV", "tvin.aud.chan.comp1", "0"); + } else if ( source_input == SOURCE_YPBPR2 ) { + config_value = config_get_str("TV", "tvin.aud.chan.comp2", "0"); + } else if ( source_input == SOURCE_HDMI1 ) { + config_value = config_get_str("TV", "tvin.aud.chan.hdmi1", "0"); + } else if ( source_input == SOURCE_HDMI2 ) { + config_value = config_get_str("TV", "tvin.aud.chan.hdmi2", "0"); + } else if ( source_input == SOURCE_HDMI3 ) { + config_value = config_get_str("TV", "tvin.aud.chan.hdmi3", "0"); + } else if ( source_input == SOURCE_VGA ) { + config_value = config_get_str("TV", "tvin.aud.chan.vga", "0"); + } else if ( source_input == SOURCE_MPEG ) { + config_value = config_get_str("TV", "tvin.aud.chan.mpeg", "0"); + } + + if (config_value != NULL) { + aud_chan = strtol (config_value, NULL, 10); + } + + return ( tv_audio_channel_t ) aud_chan; +} + +tv_audio_in_source_type_t CTvin::Tvin_GetAudioInSourceType ( tv_source_input_t source_input ) +{ + const char *config_value = NULL; + + if (source_input == SOURCE_TV) { + config_value = config_get_str("TV", "tvin.aud.insource.atv", "TV_AUDIO_IN_SOURCE_TYPE_LINEIN"); + if (strcasecmp(config_value, "TV_AUDIO_IN_SOURCE_TYPE_ATV") == 0) { + return TV_AUDIO_IN_SOURCE_TYPE_ATV; + } + return TV_AUDIO_IN_SOURCE_TYPE_LINEIN; + } else if (source_input == SOURCE_AV1 || source_input == SOURCE_AV2) { + return TV_AUDIO_IN_SOURCE_TYPE_LINEIN; + } else if (source_input == SOURCE_YPBPR1 || source_input == SOURCE_YPBPR2 || source_input == SOURCE_VGA) { + return TV_AUDIO_IN_SOURCE_TYPE_LINEIN; + } else if (source_input == SOURCE_HDMI1 || source_input == SOURCE_HDMI2 || source_input == SOURCE_HDMI3) { + return TV_AUDIO_IN_SOURCE_TYPE_HDMI; + } + + return TV_AUDIO_IN_SOURCE_TYPE_LINEIN; +} + +int CTvin::isVgaFmtInHdmi ( tvin_sig_fmt_t fmt ) +{ + if ( fmt == TVIN_SIG_FMT_HDMI_640X480P_60HZ + || fmt == TVIN_SIG_FMT_HDMI_800X600_00HZ + || fmt == TVIN_SIG_FMT_HDMI_1024X768_00HZ + || fmt == TVIN_SIG_FMT_HDMI_720X400_00HZ + || fmt == TVIN_SIG_FMT_HDMI_1280X768_00HZ + || fmt == TVIN_SIG_FMT_HDMI_1280X800_00HZ + || fmt == TVIN_SIG_FMT_HDMI_1280X960_00HZ + || fmt == TVIN_SIG_FMT_HDMI_1280X1024_00HZ + || fmt == TVIN_SIG_FMT_HDMI_1360X768_00HZ + || fmt == TVIN_SIG_FMT_HDMI_1366X768_00HZ + || fmt == TVIN_SIG_FMT_HDMI_1600X1200_00HZ + || fmt == TVIN_SIG_FMT_HDMI_1920X1200_00HZ ) { + LOGD ( "%s, HDMI source : VGA format.", "TV" ); + return 1; + } + + return -1; +} + + +bool CTvin::Tvin_is50HzFrameRateFmt ( tvin_sig_fmt_t fmt ) +{ + /** component **/ + if ( fmt == TVIN_SIG_FMT_COMP_576P_50HZ_D000 + || fmt == TVIN_SIG_FMT_COMP_576I_50HZ_D000 + || fmt == TVIN_SIG_FMT_COMP_720P_50HZ_D000 + || fmt == TVIN_SIG_FMT_COMP_1080P_50HZ_D000 + || fmt == TVIN_SIG_FMT_COMP_1080I_50HZ_D000_A + || fmt == TVIN_SIG_FMT_COMP_1080I_50HZ_D000_B + || fmt == TVIN_SIG_FMT_COMP_1080I_50HZ_D000_C + || fmt == TVIN_SIG_FMT_COMP_1080P_24HZ_D000 + || fmt == TVIN_SIG_FMT_COMP_1080P_25HZ_D000 + /** hdmi **/ + || fmt == TVIN_SIG_FMT_HDMI_720X576P_50HZ + || fmt == TVIN_SIG_FMT_HDMI_1280X720P_50HZ + || fmt == TVIN_SIG_FMT_HDMI_1920X1080I_50HZ_A + || fmt == TVIN_SIG_FMT_HDMI_1440X576I_50HZ + || fmt == TVIN_SIG_FMT_HDMI_1440X288P_50HZ + || fmt == TVIN_SIG_FMT_HDMI_2880X576I_50HZ + || fmt == TVIN_SIG_FMT_HDMI_2880X288P_50HZ + || fmt == TVIN_SIG_FMT_HDMI_1440X576P_50HZ + || fmt == TVIN_SIG_FMT_HDMI_1920X1080P_50HZ + || fmt == TVIN_SIG_FMT_HDMI_1920X1080I_50HZ_B + || fmt == TVIN_SIG_FMT_HDMI_1280X720P_50HZ_FRAME_PACKING + || fmt == TVIN_SIG_FMT_HDMI_1920X1080I_50HZ_FRAME_PACKING + || fmt == TVIN_SIG_FMT_HDMI_720X576P_50HZ_FRAME_PACKING + /** cvbs **/ + || fmt == TVIN_SIG_FMT_CVBS_PAL_I + || fmt == TVIN_SIG_FMT_CVBS_PAL_M + || fmt == TVIN_SIG_FMT_CVBS_PAL_CN + || fmt == TVIN_SIG_FMT_CVBS_SECAM ) { + LOGD ( "%s, Frame rate == 50Hz.", "TV" ); + return true; + } else { + LOGD ( "%s, Frame rate != 50Hz.", "TV" ); + return false; + } +} + + +bool CTvin::Tvin_IsDeinterlaceFmt ( tvin_sig_fmt_t fmt ) +{ + if ( fmt == TVIN_SIG_FMT_COMP_480I_59HZ_D940 + || fmt == TVIN_SIG_FMT_COMP_576I_50HZ_D000 + || fmt == TVIN_SIG_FMT_COMP_1080I_47HZ_D952 + || fmt == TVIN_SIG_FMT_COMP_1080I_48HZ_D000 + || fmt == TVIN_SIG_FMT_COMP_1080I_50HZ_D000_A + || fmt == TVIN_SIG_FMT_COMP_1080I_50HZ_D000_B + || fmt == TVIN_SIG_FMT_COMP_1080I_50HZ_D000_C + || fmt == TVIN_SIG_FMT_COMP_1080I_60HZ_D000 + || fmt == TVIN_SIG_FMT_HDMI_1440X480I_120HZ + || fmt == TVIN_SIG_FMT_HDMI_1440X480I_240HZ + || fmt == TVIN_SIG_FMT_HDMI_1440X480I_60HZ + || fmt == TVIN_SIG_FMT_HDMI_1440X576I_100HZ + || fmt == TVIN_SIG_FMT_HDMI_1440X576I_200HZ + || fmt == TVIN_SIG_FMT_HDMI_1440X576I_50HZ + || fmt == TVIN_SIG_FMT_HDMI_1920X1080I_100HZ + || fmt == TVIN_SIG_FMT_HDMI_1920X1080I_120HZ + || fmt == TVIN_SIG_FMT_HDMI_1920X1080I_50HZ_A + || fmt == TVIN_SIG_FMT_HDMI_1920X1080I_50HZ_B + || fmt == TVIN_SIG_FMT_HDMI_1920X1080I_50HZ_FRAME_PACKING + || fmt == TVIN_SIG_FMT_HDMI_1920X1080I_60HZ + || fmt == TVIN_SIG_FMT_HDMI_1920X1080I_60HZ_FRAME_PACKING + || fmt == TVIN_SIG_FMT_HDMI_2880X480I_60HZ + || fmt == TVIN_SIG_FMT_HDMI_2880X576I_50HZ + || fmt == TVIN_SIG_FMT_CVBS_NTSC_M + || fmt == TVIN_SIG_FMT_CVBS_NTSC_443 + || fmt == TVIN_SIG_FMT_CVBS_PAL_60 + || fmt == TVIN_SIG_FMT_CVBS_PAL_CN + || fmt == TVIN_SIG_FMT_CVBS_PAL_I + || fmt == TVIN_SIG_FMT_CVBS_PAL_M + || fmt == TVIN_SIG_FMT_CVBS_SECAM ) { + LOGD ( "%s, Interlace format.", "TV" ); + return true; + } else { + LOGD ( "%s, Progressive format.", "TV" ); + return false; + } +} + +int CTvin::Tvin_StartDecoder ( tvin_info_t &info ) +{ + if ( m_is_decoder_start == false ) { + m_tvin_param.info = info; + + if ( VDIN_StartDec ( &m_tvin_param ) >= 0 ) { + LOGD ( "StartDecoder succeed." ); + m_is_decoder_start = true; + } else { + LOGW ( "StartDecoder failed." ); + return -1; + } + } else { + return -2; + } + + return 0; +} + +int CTvin::SwitchPort (tvin_port_t source_port ) +{ + int ret = 0; + LOGD ("%s, source_port = %x", __FUNCTION__, source_port); + ret = Tvin_StopDecoder(); + if ( 0 == ret || 1 == ret ) { + if ( 1 == ret ) { //decode not started + //mVpp.Tvin_SetVideoScreenColorType ( TV_SIGNAL_BLUE_PATTERN ); + } + VDIN_ClosePort(); + } else { + LOGW ( "%s,stop decoder failed.", __FUNCTION__); + return -1; + } + // Open Port + if ( VDIN_OpenPort ( source_port ) < 0 ) { + LOGD ( "%s, OpenPort failed, source_port =%x ", __FUNCTION__, source_port ); + } + m_tvin_param.port = source_port; + return 0; +} + +int CTvin::Tvin_StopDecoder() +{ + if ( m_is_decoder_start == true ) { + if ( VDIN_StopDec() >= 0 ) { + LOGD ( "StopDecoder ok!" ); + m_is_decoder_start = false; + return 0; + } else { + LOGD ( "StopDecoder Failed!" ); + } + } else { + return 1; + } + + return -1; +} + +int CTvin::init_vdin ( void ) +{ + VDIN_OpenModule(); + return 0; +} + +int CTvin::uninit_vdin ( void ) +{ + VDIN_ClosePort(); + VDIN_CloseModule(); + return 0; +} + +int CTvin::Tvin_AddPath ( tvin_path_id_t pathid ) +{ + int ret = -1; + int i = 0, dly = 10; + tv_path_type_t pathtype; + + if ( pathid >= TV_PATH_VDIN_AMVIDEO && pathid < TV_PATH_DECODER_3D_AMVIDEO ) { + pathtype = TV_PATH_TYPE_TVIN; + } else { + pathtype = TV_PATH_TYPE_DEFAULT; + } + + if ( pathid >= TV_PATH_VDIN_AMVIDEO && pathid < TV_PATH_DECODER_3D_AMVIDEO ) { + if ( m_pathid == pathid ) { + LOGW ( "%s, no need to add the same tvin path.\n", "TV" ); + return 0; + } + + for ( i = 0; i < 50; i++ ) { + ret = VDIN_RmTvPath(); + + if ( ret > 0 ) { + LOGD ( "%s, remove tvin path ok, %d ms gone.\n", "TV", ( dly * i ) ); + break; + } else { + LOGW ( "%s, remove tvin path faild, %d ms gone.\n", "TV", ( dly * i ) ); + usleep ( dly * 1000 ); + } + } + } else { + for ( i = 0; i < 50; i++ ) { + ret = VDIN_RmDefPath(); + + if ( ret > 0 ) { + LOGD ( "%s, remove default path ok, %d ms gone.\n", "TV", ( dly * i ) ); + break; + } else { + LOGW ( "%s, remove default path faild, %d ms gone.\n", "TV", ( dly * i ) ); + usleep ( dly * 1000 ); + } + } + } + + for ( i = 0; i < 50; i++ ) { + if ( pathid >= TV_PATH_VDIN_AMVIDEO && pathid < TV_PATH_DECODER_3D_AMVIDEO ) { + if ( strcmp ( config_tv_path, "null" ) == 0 ) { + ret = VDIN_AddVideoPath ( pathid ); + } else { + ret = VDIN_AddPath ( config_tv_path ); + } + } else { + if ( strcmp ( config_default_path, "null" ) == 0 ) { + ret = VDIN_AddVideoPath ( pathid ); + } else { + ret = VDIN_AddPath ( config_default_path ); + } + } + + if ( ret >= 0 ) { + LOGD ( "%s, add pathid[%d] ok, %d ms gone.\n", "TV", pathid, i ); + break; + } else { + LOGW ( "%s, add pathid[%d] faild, %d ms gone.\n", "TV", pathid, i ); + usleep ( dly * 1000 ); + } + } + + if ( pathid >= TV_PATH_VDIN_AMVIDEO && pathid < TV_PATH_MAX ) { + m_pathid = pathid; + } + + return ret; +} + + +int CTvin::Tvin_RemovePath ( tv_path_type_t pathtype ) +{ + int ret = -1; + int i = 0, dly = 10; + + for ( i = 0; i < 500; i++ ) { + ret = Tvin_CheckPathActive ( pathtype, 0 ); + + if ( ret == TV_PATH_STATUS_INACTIVE ) { + LOGD ( "%s, check path is inactive, %d ms gone.\n", "TV", ( dly * i ) ); + break; + } else if ( ret == TV_PATH_STATUS_INACTIVE || ret == TV_PATH_STATUS_ERROR ) { + usleep ( dly * 1000 ); + } else { + break; + } + } + + if ( i == 500 ) { + LOGE ( "%s, check path active faild, %d ms gone.\n", "TV", ( dly * i ) ); + } + + if ( pathtype == TV_PATH_TYPE_DEFAULT ) { + for ( i = 0; i < 50; i++ ) { + ret = VDIN_RmDefPath(); + + if ( ret > 0 ) { + LOGD ( "%s, remove default path ok, %d ms gone.\n", "TV", ( dly * i ) ); + break; + } else { + LOGW ( "%s, remove default path faild, %d ms gone.\n", "TV", ( dly * i ) ); + usleep ( dly * 1000 ); + } + } + } else if ( pathtype == TV_PATH_TYPE_TVIN ) { + for ( i = 0; i < 50; i++ ) { + ret = VDIN_RmTvPath(); + + if ( ret > 0 ) { + LOGD ( "%s, remove tvin path ok, %d ms gone.\n", "TV", ( dly * i ) ); + break; + } else { + LOGW ( "%s, remove tvin path faild, %d ms gone.\n", "TV", ( dly * i ) ); + usleep ( dly * 1000 ); + } + } + + m_pathid = TV_PATH_DECODER_3D_AMVIDEO; + } else if ( pathtype == TV_PATH_TYPE_TVIN_PREVIEW ) { + for ( i = 0; i < 50; i++ ) { + ret = VDIN_RmPreviewPath(); + + if ( ret > 0 ) { + LOGD ( "%s, remove preview path ok, %d ms gone.\n", "TV", ( dly * i ) ); + break; + } else { + LOGW ( "%s, remove preview path faild, %d ms gone.\n", "TV", ( dly * i ) ); + usleep ( dly * 1000 ); + } + } + + m_pathid = TV_PATH_DECODER_NEW3D_WITHOUTPPMGR_AMVIDEO; + } else { + ret = -1; + } + + return ret; +} + + +int CTvin::Tvin_CheckPathActive ( tv_path_type_t path_type, int isCheckD2D3 ) +{ + FILE *f; + char path[256]; + char decoder_str[20] = "default {"; + char tvin_str[20] = "tvpath {"; + char decoder_active_str[20] = "decoder(1)"; + char tvin_active_str[20] = "vdin0(1)"; + char di_active_str[20] = "deinterlace(1)"; + char d2d3_active_str[20] = "d2d3(1)"; + char decoder_inactive_str[20] = "decoder(0)"; + char tvin_inactive_str[20] = "vdin0(0)"; + char di_inactive_str[20] = "deinterlace(0)"; + char d2d3_inactive_str[20] = "d2d3(0)"; + + char *str_find = NULL; + char *active_str = NULL; + char *inactive_str = NULL; + int mount_freq; + int match; + int is_active = TV_PATH_STATUS_INACTIVE; + + memset ( path, 0, 255 ); + + f = fopen ( "/sys/class/vfm/map", "r" ); + + if ( !f ) { + LOGE ( "%s, can not open /sys/class/vfm/map!\n", "TV" ); + return TV_PATH_STATUS_NO_DEV; + } + + while ( fgets ( path, 254, f ) ) { + if ( path_type == TV_PATH_TYPE_DEFAULT ) { + str_find = strstr ( path, decoder_str ); + active_str = decoder_active_str; + inactive_str = decoder_inactive_str; + } else if ( path_type == TV_PATH_TYPE_TVIN || path_type == TV_PATH_TYPE_TVIN_PREVIEW ) { + str_find = strstr ( path, tvin_str ); + active_str = tvin_active_str; + inactive_str = tvin_inactive_str; + } else { + LOGW ( "%s, there is no %d path_type.\n", "TV", path_type ); + break; + } + + if ( str_find ) { + if ( isCheckD2D3 == 0 ) { + if ( strstr ( str_find, active_str ) && strstr ( str_find, di_active_str ) ) { + is_active = TV_PATH_STATUS_ACTIVE; + //LOGD("%s, %s is active.\n", "TV", path); + } else if ( strstr ( str_find, inactive_str ) + && ( strstr ( str_find, di_inactive_str ) || ( !strstr ( str_find, di_inactive_str ) ) ) + ) { + is_active = TV_PATH_STATUS_INACTIVE; + //LOGD("%s, %s is inactive.\n", "TV", path); + } else { + is_active = TV_PATH_STATUS_ERROR; + LOGE ( "%s, %s is error!\n", "TV", path ); + } + + break; + } else { + if ( strstr ( str_find, active_str ) && strstr ( str_find, di_active_str ) && strstr ( str_find, d2d3_active_str ) ) { + is_active = TV_PATH_STATUS_ACTIVE; + //LOGD("%s, %s is active.\n", "TV", path); + } else if ( strstr ( str_find, inactive_str ) + && ( strstr ( str_find, di_inactive_str ) || ( !strstr ( str_find, di_inactive_str ) ) ) + && ( strstr ( str_find, d2d3_inactive_str ) || ( !strstr ( str_find, d2d3_inactive_str ) ) ) + ) { + is_active = TV_PATH_STATUS_INACTIVE; + //LOGD("%s, %s is inactive.\n", "TV", path); + } else { + is_active = TV_PATH_STATUS_ERROR; + LOGE ( "%s, %s is error!\n", "TV", path ); + } + + break; + } + } + } + + fclose ( f ); + + return is_active; +} + + +int CTvin::Tv_init_afe ( void ) +{ + AFE_OpenModule(); + return 0; +} + +int CTvin::Tv_uninit_afe ( void ) +{ + AFE_CloseModule(); + return 0; +} + +int CTvin::get_hdmi_sampling_rate() +{ + int fd; + int val = 0; + char bcmd[16]; + fd = open ( "/sys/module/tvin_hdmirx/parameters/audio_sample_rate", O_RDONLY ); + + if ( fd >= 0 ) { + read ( fd, bcmd, sizeof ( bcmd ) ); + val = strtol ( bcmd, NULL, 10 ); + close ( fd ); + } + + return val; +} + + +//************************************************************************** +CTvin::CTvinSigDetect::CTvinSigDetect ( CTvin *pTvin ) +{ + m_cur_sig_info.trans_fmt = TVIN_TFMT_2D; + m_cur_sig_info.fmt = TVIN_SIG_FMT_NULL; + m_cur_sig_info.status = TVIN_SIG_STATUS_NULL; + m_cur_sig_info.reserved = 0; + + m_pre_sig_info = m_cur_sig_info; + mDetectState = STATE_STOPED; + mpObserver = NULL; + mpTvin = pTvin; + mKeepNosigTime = 0; + m_is_nosig_checktimes_once_valid = false; +} + +CTvin::CTvinSigDetect::~CTvinSigDetect() +{ + +} + +int CTvin::CTvinSigDetect::startDetect() +{ + LOGD ( "startDetect()" ); + + if ( mDetectState == STATE_RUNNING || mDetectState == STATE_PAUSE ) { + return mDetectState; + } + + m_cur_sig_info.trans_fmt = TVIN_TFMT_2D; + m_cur_sig_info.fmt = TVIN_SIG_FMT_NULL; + m_cur_sig_info.status = TVIN_SIG_STATUS_NULL; + m_cur_sig_info.reserved = 0; + + m_pre_sig_info = m_cur_sig_info; + + // + m_request_pause_detect = false; + this->run(); + return mDetectState; +} + +int CTvin::CTvinSigDetect::initSigState() +{ + m_cur_sig_info.trans_fmt = TVIN_TFMT_2D; + m_cur_sig_info.fmt = TVIN_SIG_FMT_NULL; + m_cur_sig_info.status = TVIN_SIG_STATUS_NULL; + m_cur_sig_info.reserved = 0; + m_pre_sig_info = m_cur_sig_info; + mKeepNosigTime = 0; + m_is_nosig_checktimes_once_valid = false; + return 0; +} + +int CTvin::CTvinSigDetect::stopDetect() +{ + CMutex::Autolock _l ( mLock ); + LOGD ( "stopDetect()" ); + requestExit(); + return 0; +} + +int CTvin::CTvinSigDetect::pauseDetect() +{ + CMutex::Autolock _l ( mLock ); + LOGD ( "pauseDetect()" ); + m_request_pause_detect = true; + return 0; +} + +int CTvin::CTvinSigDetect::requestAndWaitPauseDetect() +{ + CMutex::Autolock _l ( mLock ); + LOGD ( "requestAndWaitPauseDetect()" ); + m_request_pause_detect = true; + + if ( mDetectState == STATE_RUNNING ) { + mRequestPauseCondition.wait ( mLock ); + } + + return 0; +} + +int CTvin::CTvinSigDetect::resumeDetect() +{ + CMutex::Autolock _l ( mLock ); + LOGD ( "resumeDetect()" ); + m_request_pause_detect = false; + mDetectPauseCondition.signal(); + return 0; +} + +void CTvin::CTvinSigDetect::setVdinNoSigCheckKeepTimes(int times, bool isOnce) +{ + LOGD("setVdinNoSigCheckKeepTimes mKeepNosigTime = %d, times = %d", mKeepNosigTime, times); + mKeepNosigTime = times; + m_is_nosig_checktimes_once_valid = isOnce; +} + +int CTvin::CTvinSigDetect::Tv_TvinSigDetect ( int &sleeptime ) +{ + mpTvin->VDIN_GetSignalInfo ( &m_cur_sig_info ); //get info + //set no sig check times + static long long sNosigKeepTime = 0; + //LOGD("stime=%d status=%d, sNosigKeepTime = %d, mKeepNosigTime = %d", sleeptime, m_cur_sig_info.status, sNosigKeepTime, mKeepNosigTime); + if (m_cur_sig_info.status == TVIN_SIG_STATUS_NOSIG || m_cur_sig_info.status == TVIN_SIG_STATUS_NULL) { + sNosigKeepTime += sleeptime; + if (sNosigKeepTime > mKeepNosigTime) { //real no sig + //cur is no sig + if (m_is_nosig_checktimes_once_valid) { //just once change,is nosig, and default it + m_is_nosig_checktimes_once_valid = false; + mKeepNosigTime = 0; + } + // + } else { //not + m_cur_sig_info.status = m_pre_sig_info.status; + } + } else { + sNosigKeepTime = 0; + // + if (m_is_nosig_checktimes_once_valid) { //just once change,not nosig,default is + m_is_nosig_checktimes_once_valid = false; + mKeepNosigTime = 0; + } + // + } + + //if state change + if ( m_cur_sig_info.status != m_pre_sig_info.status ) { + //sleeptime = 200; + + if ( m_cur_sig_info.status == TVIN_SIG_STATUS_STABLE ) { // to stable + // + sleeptime = 200; + mpObserver->onSigToStable(); + } else if ( m_pre_sig_info.status == TVIN_SIG_STATUS_STABLE && m_cur_sig_info.status == TVIN_SIG_STATUS_UNSTABLE ) { //stable to unstable + // + //mVpp.Tvin_SetVideoScreenColorType ( TV_SIGNAL_BLACK_PATTERN ); + sleeptime = 20; + mpObserver->onSigStableToUnstable(); + } else if ( m_pre_sig_info.status == TVIN_SIG_STATUS_STABLE && m_cur_sig_info.status == TVIN_SIG_STATUS_NOTSUP ) { + // + sleeptime = 20; + mpObserver->onSigStableToUnSupport(); + } else if ( m_pre_sig_info.status == TVIN_SIG_STATUS_STABLE && m_cur_sig_info.status == TVIN_SIG_STATUS_NOSIG ) { + // + sleeptime = 20; + mpObserver->onSigStableToNoSig(); + } else if ( m_pre_sig_info.status == TVIN_SIG_STATUS_UNSTABLE && m_cur_sig_info.status == TVIN_SIG_STATUS_NOTSUP ) { + // + sleeptime = 20; + mpObserver->onSigUnStableToUnSupport(); + } else if ( m_pre_sig_info.status == TVIN_SIG_STATUS_UNSTABLE && m_cur_sig_info.status == TVIN_SIG_STATUS_NOSIG ) { + // + sleeptime = 20; + mpObserver->onSigUnStableToNoSig(); + } else if ( m_pre_sig_info.status == TVIN_SIG_STATUS_NULL && m_cur_sig_info.status == TVIN_SIG_STATUS_NOSIG ) { + // + sleeptime = 20; + mpObserver->onSigNullToNoSig(); + } else if ( m_pre_sig_info.status == TVIN_SIG_STATUS_NOSIG && m_cur_sig_info.status == TVIN_SIG_STATUS_UNSTABLE ) { + // + sleeptime = 20; + mpObserver->onSigNoSigToUnstable(); + } else { + sleeptime = 20; + } + } else { //state not change + //sleeptime = 500; + + switch ( m_cur_sig_info.status ) { + case TVIN_SIG_STATUS_STABLE: + // + sleeptime = 20;//sleeptime = 500; + mpObserver->onSigStillStable(); + break; + + case TVIN_SIG_STATUS_NOTSUP: + // + sleeptime = 20; + mpObserver->onSigStillNoSupport(); + break; + + case TVIN_SIG_STATUS_UNSTABLE: + // + sleeptime = 20; + mpObserver->onSigStillUnstable(); + break; + + case TVIN_SIG_STATUS_NOSIG: + // + sleeptime = 20; + mpObserver->onSigStillNosig(); + break; + + case TVIN_SIG_STATUS_NULL: + // + sleeptime = 20; + mpObserver->onSigStillNull(); + break; + + default: + // + sleeptime = 20; + mpObserver->onSigStillNull(); + break; + } + } + + m_pre_sig_info = m_cur_sig_info;//backup info + + return sleeptime; +} + +bool CTvin::CTvinSigDetect::threadLoop() +{ + //enter onStart() + if ( mpObserver == NULL ) { + return false; + } + + int sleeptime = 200;//ms + mDetectState = STATE_RUNNING; + mpObserver->onSigDetectEnter(); + + while ( !exitPending() ) { //requietexit() or requietexitWait() not call + while ( m_request_pause_detect ) { + mRequestPauseCondition.broadcast(); + mLock.lock(); + mDetectState = STATE_PAUSE; + mDetectPauseCondition.wait ( mLock ); //first unlock,when return,lock again,so need,call unlock + mDetectState = STATE_RUNNING; + mLock.unlock(); + } + + // + mpObserver->onLoop(); + Tv_TvinSigDetect ( sleeptime ); + //可以优化 + if ( !m_request_pause_detect ) { + usleep ( sleeptime * 1000 ); + } + } + + mDetectState = STATE_STOPED; + mRequestPauseCondition.broadcast(); + //exit + //return true, run again, return false,not run. + return false; +} + +v4l2_std_id CTvin::CvbsFtmToV4l2ColorStd(tvin_sig_fmt_t fmt) +{ + v4l2_std_id v4l2_std; + if (fmt == TVIN_SIG_FMT_CVBS_NTSC_M || fmt == TVIN_SIG_FMT_CVBS_NTSC_443) { + v4l2_std = V4L2_COLOR_STD_NTSC; + } else if (fmt >= TVIN_SIG_FMT_CVBS_PAL_I && fmt <= TVIN_SIG_FMT_CVBS_PAL_CN) { + v4l2_std = V4L2_COLOR_STD_PAL; + } else if (fmt == TVIN_SIG_FMT_CVBS_SECAM) { + v4l2_std = V4L2_COLOR_STD_SECAM; + } else { + v4l2_std = V4L2_COLOR_STD_PAL; + } + return v4l2_std; +} +//************************************************************************** diff --git a/tvapi/libtv/tvin/CTvin.h b/tvapi/libtv/tvin/CTvin.h new file mode 100644 index 0000000..3452f4a --- a/dev/null +++ b/tvapi/libtv/tvin/CTvin.h @@ -0,0 +1,1379 @@ +/* + * TVIN Modules Exported Header File + * + * Author: Lin Xu <lin.xu@amlogic.com> + * Bobby Yang <bo.yang@amlogic.com> + * + * Copyright (C) 2010 Amlogic Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + + +#ifndef _CTVIN_H +#define _CTVIN_H + + +#include <pthread.h> +#include <cm.h> +#include <ve.h> +#include "../tvutils/CThread.h" +#include <hdmirx_cec.h> +#include "../tv/CFrontEnd.h" + +#define DEPTH_LEVEL_2DTO3D 33 +static const int DepthTable_2DTO3D[DEPTH_LEVEL_2DTO3D] = { + -64, // -16 + -60, // -15 + -56, // -14 + -52, // -13 + -49, // -12 + -46, // -11 + -43, // -10 + -40, // -09 + -37, // -08 + -34, // -07 + -31, // -06 + -28, // -05 + -25, // -04 + -22, // -03 + -19, // -02 + -16, // -01 + -13, // 0 + 3, // 1 + 6, // 2 + 9, // 3 + 12, // 4 + 15, // 5 + 18, // 6 + 21, // 7 + 24, // 8 + 28, // 9 + 32, // 10 + 36, // 11 + 40, // 12 + 44, // 13 + 48, // 14 + 52, // 15 + 56, // 16 +}; + +enum { + MEMP_VDIN_WITHOUT_3D = 0, + MEMP_VDIN_WITH_3D, + MEMP_DCDR_WITHOUT_3D, + MEMP_DCDR_WITH_3D, + MEMP_ATV_WITHOUT_3D, + MEMP_ATV_WITH_3D, +}; + +// *************************************************************************** +// *** TVIN general definition/enum/struct *********************************** +// *************************************************************************** +/* tvin input port select */ +typedef enum tvin_port_e { + TVIN_PORT_NULL = 0x00000000, + TVIN_PORT_MPEG0 = 0x00000100, + TVIN_PORT_BT656 = 0x00000200, + TVIN_PORT_BT601, + TVIN_PORT_CAMERA, + TVIN_PORT_VGA0 = 0x00000400, + TVIN_PORT_VGA1, + TVIN_PORT_VGA2, + TVIN_PORT_VGA3, + TVIN_PORT_VGA4, + TVIN_PORT_VGA5, + TVIN_PORT_VGA6, + TVIN_PORT_VGA7, + TVIN_PORT_COMP0 = 0x00000800, + TVIN_PORT_COMP1, + TVIN_PORT_COMP2, + TVIN_PORT_COMP3, + TVIN_PORT_COMP4, + TVIN_PORT_COMP5, + TVIN_PORT_COMP6, + TVIN_PORT_COMP7, + TVIN_PORT_CVBS0 = 0x00001000, + TVIN_PORT_CVBS1, + TVIN_PORT_CVBS2, + TVIN_PORT_CVBS3, //as atv demod to tvafe + TVIN_PORT_CVBS4, + TVIN_PORT_CVBS5, + TVIN_PORT_CVBS6, + TVIN_PORT_CVBS7, + TVIN_PORT_SVIDEO0 = 0x00002000, + TVIN_PORT_SVIDEO1, + TVIN_PORT_SVIDEO2, + TVIN_PORT_SVIDEO3, + TVIN_PORT_SVIDEO4, + TVIN_PORT_SVIDEO5, + TVIN_PORT_SVIDEO6, + TVIN_PORT_SVIDEO7, + TVIN_PORT_HDMI0 = 0x00004000, + TVIN_PORT_HDMI1, + TVIN_PORT_HDMI2, + TVIN_PORT_HDMI3, + TVIN_PORT_HDMI4, + TVIN_PORT_HDMI5, + TVIN_PORT_HDMI6, + TVIN_PORT_HDMI7, + TVIN_PORT_DVIN0 = 0x00008000, + TVIN_PORT_VIU = 0x0000C000, + TVIN_PORT_MIPI = 0x00010000, + TVIN_PORT_ISP = 0x00020000, + TVIN_PORT_DTV = 0x00040000, + TVIN_PORT_MAX = 0x80000000, +} tvin_port_t; + +const char *tvin_port_str(enum tvin_port_e port); + + +/* tvin signal format table */ +typedef enum tvin_sig_fmt_e { + TVIN_SIG_FMT_NULL = 0, + //VGA Formats + TVIN_SIG_FMT_VGA_512X384P_60HZ_D147 = 0x001, + TVIN_SIG_FMT_VGA_560X384P_60HZ_D147 = 0x002, + TVIN_SIG_FMT_VGA_640X200P_59HZ_D924 = 0x003, + TVIN_SIG_FMT_VGA_640X350P_85HZ_D080 = 0x004, + TVIN_SIG_FMT_VGA_640X400P_59HZ_D940 = 0x005, + TVIN_SIG_FMT_VGA_640X400P_85HZ_D080 = 0x006, + TVIN_SIG_FMT_VGA_640X400P_59HZ_D638 = 0x007, + TVIN_SIG_FMT_VGA_640X400P_56HZ_D416 = 0x008, + TVIN_SIG_FMT_VGA_640X480P_66HZ_D619 = 0x009, + TVIN_SIG_FMT_VGA_640X480P_66HZ_D667 = 0x00a, + TVIN_SIG_FMT_VGA_640X480P_59HZ_D940 = 0x00b, + TVIN_SIG_FMT_VGA_640X480P_60HZ_D000 = 0x00c, + TVIN_SIG_FMT_VGA_640X480P_72HZ_D809 = 0x00d, + TVIN_SIG_FMT_VGA_640X480P_75HZ_D000_A = 0x00e, + TVIN_SIG_FMT_VGA_640X480P_85HZ_D008 = 0x00f, + TVIN_SIG_FMT_VGA_640X480P_59HZ_D638 = 0x010, + TVIN_SIG_FMT_VGA_640X480P_75HZ_D000_B = 0x011, + TVIN_SIG_FMT_VGA_640X870P_75HZ_D000 = 0x012, + TVIN_SIG_FMT_VGA_720X350P_70HZ_D086 = 0x013, + TVIN_SIG_FMT_VGA_720X400P_85HZ_D039 = 0x014, + TVIN_SIG_FMT_VGA_720X400P_70HZ_D086 = 0x015, + TVIN_SIG_FMT_VGA_720X400P_87HZ_D849 = 0x016, + TVIN_SIG_FMT_VGA_720X400P_59HZ_D940 = 0x017, + TVIN_SIG_FMT_VGA_720X480P_59HZ_D940 = 0x018, + TVIN_SIG_FMT_VGA_768X480P_59HZ_D896 = 0x019, + TVIN_SIG_FMT_VGA_800X600P_56HZ_D250 = 0x01a, + TVIN_SIG_FMT_VGA_800X600P_60HZ_D000 = 0x01b, + TVIN_SIG_FMT_VGA_800X600P_60HZ_D000_A = 0x01c, + TVIN_SIG_FMT_VGA_800X600P_60HZ_D317 = 0x01d, + TVIN_SIG_FMT_VGA_800X600P_72HZ_D188 = 0x01e, + TVIN_SIG_FMT_VGA_800X600P_75HZ_D000 = 0x01f, + TVIN_SIG_FMT_VGA_800X600P_85HZ_D061 = 0x020, + TVIN_SIG_FMT_VGA_832X624P_75HZ_D087 = 0x021, + TVIN_SIG_FMT_VGA_848X480P_84HZ_D751 = 0x022, + TVIN_SIG_FMT_VGA_960X600P_59HZ_D635 = 0x023, + TVIN_SIG_FMT_VGA_1024X768P_59HZ_D278 = 0x024, + TVIN_SIG_FMT_VGA_1024X768P_60HZ_D000 = 0x025, + TVIN_SIG_FMT_VGA_1024X768P_60HZ_D000_A = 0x026, + TVIN_SIG_FMT_VGA_1024X768P_60HZ_D000_B = 0x027, + TVIN_SIG_FMT_VGA_1024X768P_74HZ_D927 = 0x028, + TVIN_SIG_FMT_VGA_1024X768P_60HZ_D004 = 0x029, + TVIN_SIG_FMT_VGA_1024X768P_70HZ_D069 = 0x02a, + TVIN_SIG_FMT_VGA_1024X768P_75HZ_D029 = 0x02b, + TVIN_SIG_FMT_VGA_1024X768P_84HZ_D997 = 0x02c, + TVIN_SIG_FMT_VGA_1024X768P_74HZ_D925 = 0x02d, + TVIN_SIG_FMT_VGA_1024X768P_60HZ_D020 = 0x02e, + TVIN_SIG_FMT_VGA_1024X768P_70HZ_D008 = 0x02f, + TVIN_SIG_FMT_VGA_1024X768P_75HZ_D782 = 0x030, + TVIN_SIG_FMT_VGA_1024X768P_77HZ_D069 = 0x031, + TVIN_SIG_FMT_VGA_1024X768P_71HZ_D799 = 0x032, + TVIN_SIG_FMT_VGA_1024X1024P_60HZ_D000 = 0x033, + TVIN_SIG_FMT_VGA_1152X864P_60HZ_D000 = 0x034, + TVIN_SIG_FMT_VGA_1152X864P_70HZ_D012 = 0x035, + TVIN_SIG_FMT_VGA_1152X864P_75HZ_D000 = 0x036, + TVIN_SIG_FMT_VGA_1152X864P_84HZ_D999 = 0x037, + TVIN_SIG_FMT_VGA_1152X870P_75HZ_D062 = 0x038, + TVIN_SIG_FMT_VGA_1152X900P_65HZ_D950 = 0x039, + TVIN_SIG_FMT_VGA_1152X900P_66HZ_D004 = 0x03a, + TVIN_SIG_FMT_VGA_1152X900P_76HZ_D047 = 0x03b, + TVIN_SIG_FMT_VGA_1152X900P_76HZ_D149 = 0x03c, + TVIN_SIG_FMT_VGA_1280X720P_59HZ_D855 = 0x03d, + TVIN_SIG_FMT_VGA_1280X720P_60HZ_D000_A = 0x03e, + TVIN_SIG_FMT_VGA_1280X720P_60HZ_D000_B = 0x03f, + TVIN_SIG_FMT_VGA_1280X720P_60HZ_D000_C = 0x040, + TVIN_SIG_FMT_VGA_1280X720P_60HZ_D000_D = 0x041, + TVIN_SIG_FMT_VGA_1280X768P_59HZ_D870 = 0x042, + TVIN_SIG_FMT_VGA_1280X768P_59HZ_D995 = 0x043, + TVIN_SIG_FMT_VGA_1280X768P_60HZ_D100 = 0x044, + TVIN_SIG_FMT_VGA_1280X768P_85HZ_D000 = 0x045, + TVIN_SIG_FMT_VGA_1280X768P_74HZ_D893 = 0x046, + TVIN_SIG_FMT_VGA_1280X768P_84HZ_D837 = 0x047, + TVIN_SIG_FMT_VGA_1280X800P_59HZ_D810 = 0x048, + TVIN_SIG_FMT_VGA_1280X800P_59HZ_D810_A = 0x049, + TVIN_SIG_FMT_VGA_1280X800P_60HZ_D000 = 0x04a, + TVIN_SIG_FMT_VGA_1280X800P_85HZ_D000 = 0x04b, + TVIN_SIG_FMT_VGA_1280X960P_60HZ_D000 = 0x04c, + TVIN_SIG_FMT_VGA_1280X960P_60HZ_D000_A = 0x04d, + TVIN_SIG_FMT_VGA_1280X960P_75HZ_D000 = 0x04e, + TVIN_SIG_FMT_VGA_1280X960P_85HZ_D002 = 0x04f, + TVIN_SIG_FMT_VGA_1280X1024P_60HZ_D020 = 0x050, + TVIN_SIG_FMT_VGA_1280X1024P_60HZ_D020_A = 0x051, + TVIN_SIG_FMT_VGA_1280X1024P_75HZ_D025 = 0x052, + TVIN_SIG_FMT_VGA_1280X1024P_85HZ_D024 = 0x053, + TVIN_SIG_FMT_VGA_1280X1024P_59HZ_D979 = 0x054, + TVIN_SIG_FMT_VGA_1280X1024P_72HZ_D005 = 0x055, + TVIN_SIG_FMT_VGA_1280X1024P_60HZ_D002 = 0x056, + TVIN_SIG_FMT_VGA_1280X1024P_67HZ_D003 = 0x057, + TVIN_SIG_FMT_VGA_1280X1024P_74HZ_D112 = 0x058, + TVIN_SIG_FMT_VGA_1280X1024P_76HZ_D179 = 0x059, + TVIN_SIG_FMT_VGA_1280X1024P_66HZ_D718 = 0x05a, + TVIN_SIG_FMT_VGA_1280X1024P_66HZ_D677 = 0x05b, + TVIN_SIG_FMT_VGA_1280X1024P_76HZ_D107 = 0x05c, + TVIN_SIG_FMT_VGA_1280X1024P_59HZ_D996 = 0x05d, + TVIN_SIG_FMT_VGA_1280X1024P_60HZ_D000 = 0x05e, + TVIN_SIG_FMT_VGA_1360X768P_59HZ_D799 = 0x05f, + TVIN_SIG_FMT_VGA_1360X768P_60HZ_D015 = 0x060, + TVIN_SIG_FMT_VGA_1360X768P_60HZ_D015_A = 0x061, + TVIN_SIG_FMT_VGA_1360X850P_60HZ_D000 = 0x062, + TVIN_SIG_FMT_VGA_1360X1024P_60HZ_D000 = 0x063, + TVIN_SIG_FMT_VGA_1366X768P_59HZ_D790 = 0x064, + TVIN_SIG_FMT_VGA_1366X768P_60HZ_D000 = 0x065, + TVIN_SIG_FMT_VGA_1400X1050P_59HZ_D978 = 0x066, + TVIN_SIG_FMT_VGA_1440X900P_59HZ_D887 = 0x067, + TVIN_SIG_FMT_VGA_1440X1080P_60HZ_D000 = 0x068, + TVIN_SIG_FMT_VGA_1600X900P_60HZ_D000 = 0x069, + TVIN_SIG_FMT_VGA_1600X1024P_60HZ_D000 = 0x06a, + TVIN_SIG_FMT_VGA_1600X1200P_59HZ_D869 = 0x06b, + TVIN_SIG_FMT_VGA_1600X1200P_60HZ_D000 = 0x06c, + TVIN_SIG_FMT_VGA_1600X1200P_65HZ_D000 = 0x06d, + TVIN_SIG_FMT_VGA_1600X1200P_70HZ_D000 = 0x06e, + TVIN_SIG_FMT_VGA_1680X1050P_59HZ_D954 = 0x06f, + TVIN_SIG_FMT_VGA_1680X1080P_60HZ_D000 = 0x070, + TVIN_SIG_FMT_VGA_1920X1080P_49HZ_D929 = 0x071, + TVIN_SIG_FMT_VGA_1920X1080P_59HZ_D963_A = 0x072, + TVIN_SIG_FMT_VGA_1920X1080P_59HZ_D963 = 0x073, + TVIN_SIG_FMT_VGA_1920X1080P_60HZ_D000 = 0x074, + TVIN_SIG_FMT_VGA_1920X1200P_59HZ_D950 = 0x075, + TVIN_SIG_FMT_VGA_1024X768P_60HZ_D000_C = 0x076, + TVIN_SIG_FMT_VGA_1024X768P_60HZ_D000_D = 0x077, + TVIN_SIG_FMT_VGA_1920X1200P_59HZ_D988 = 0x078, + TVIN_SIG_FMT_VGA_1400X900P_60HZ_D000 = 0x079, + TVIN_SIG_FMT_VGA_1680X1050P_60HZ_D000 = 0x07a, + TVIN_SIG_FMT_VGA_800X600P_60HZ_D062 = 0x07b, + TVIN_SIG_FMT_VGA_800X600P_60HZ_317_B = 0x07c, + TVIN_SIG_FMT_VGA_RESERVE8 = 0x07d, + TVIN_SIG_FMT_VGA_RESERVE9 = 0x07e, + TVIN_SIG_FMT_VGA_RESERVE10 = 0x07f, + TVIN_SIG_FMT_VGA_RESERVE11 = 0x080, + TVIN_SIG_FMT_VGA_RESERVE12 = 0x081, + TVIN_SIG_FMT_VGA_MAX = 0x082, + TVIN_SIG_FMT_VGA_THRESHOLD = 0x200, + //Component Formats + TVIN_SIG_FMT_COMP_480P_60HZ_D000 = 0x201, + TVIN_SIG_FMT_COMP_480I_59HZ_D940 = 0x202, + TVIN_SIG_FMT_COMP_576P_50HZ_D000 = 0x203, + TVIN_SIG_FMT_COMP_576I_50HZ_D000 = 0x204, + TVIN_SIG_FMT_COMP_720P_59HZ_D940 = 0x205, + TVIN_SIG_FMT_COMP_720P_50HZ_D000 = 0x206, + TVIN_SIG_FMT_COMP_1080P_23HZ_D976 = 0x207, + TVIN_SIG_FMT_COMP_1080P_24HZ_D000 = 0x208, + TVIN_SIG_FMT_COMP_1080P_25HZ_D000 = 0x209, + TVIN_SIG_FMT_COMP_1080P_30HZ_D000 = 0x20a, + TVIN_SIG_FMT_COMP_1080P_50HZ_D000 = 0x20b, + TVIN_SIG_FMT_COMP_1080P_60HZ_D000 = 0x20c, + TVIN_SIG_FMT_COMP_1080I_47HZ_D952 = 0x20d, + TVIN_SIG_FMT_COMP_1080I_48HZ_D000 = 0x20e, + TVIN_SIG_FMT_COMP_1080I_50HZ_D000_A = 0x20f, + TVIN_SIG_FMT_COMP_1080I_50HZ_D000_B = 0x210, + TVIN_SIG_FMT_COMP_1080I_50HZ_D000_C = 0x211, + TVIN_SIG_FMT_COMP_1080I_60HZ_D000 = 0x212, + TVIN_SIG_FMT_COMP_MAX = 0x213, + TVIN_SIG_FMT_COMP_THRESHOLD = 0x400, + //HDMI Formats + TVIN_SIG_FMT_HDMI_640X480P_60HZ = 0x401, + TVIN_SIG_FMT_HDMI_720X480P_60HZ = 0x402, + TVIN_SIG_FMT_HDMI_1280X720P_60HZ = 0x403, + TVIN_SIG_FMT_HDMI_1920X1080I_60HZ = 0x404, + TVIN_SIG_FMT_HDMI_1440X480I_60HZ = 0x405, + TVIN_SIG_FMT_HDMI_1440X240P_60HZ = 0x406, + TVIN_SIG_FMT_HDMI_2880X480I_60HZ = 0x407, + TVIN_SIG_FMT_HDMI_2880X240P_60HZ = 0x408, + TVIN_SIG_FMT_HDMI_1440X480P_60HZ = 0x409, + TVIN_SIG_FMT_HDMI_1920X1080P_60HZ = 0x40a, + TVIN_SIG_FMT_HDMI_720X576P_50HZ = 0x40b, + TVIN_SIG_FMT_HDMI_1280X720P_50HZ = 0x40c, + TVIN_SIG_FMT_HDMI_1920X1080I_50HZ_A = 0x40d, + TVIN_SIG_FMT_HDMI_1440X576I_50HZ = 0x40e, + TVIN_SIG_FMT_HDMI_1440X288P_50HZ = 0x40f, + TVIN_SIG_FMT_HDMI_2880X576I_50HZ = 0x410, + TVIN_SIG_FMT_HDMI_2880X288P_50HZ = 0x411, + TVIN_SIG_FMT_HDMI_1440X576P_50HZ = 0x412, + TVIN_SIG_FMT_HDMI_1920X1080P_50HZ = 0x413, + TVIN_SIG_FMT_HDMI_1920X1080P_24HZ = 0x414, + TVIN_SIG_FMT_HDMI_1920X1080P_25HZ = 0x415, + TVIN_SIG_FMT_HDMI_1920X1080P_30HZ = 0x416, + TVIN_SIG_FMT_HDMI_2880X480P_60HZ = 0x417, + TVIN_SIG_FMT_HDMI_2880X576P_60HZ = 0x418, + TVIN_SIG_FMT_HDMI_1920X1080I_50HZ_B = 0x419, + TVIN_SIG_FMT_HDMI_1920X1080I_100HZ = 0x41a, + TVIN_SIG_FMT_HDMI_1280X720P_100HZ = 0x41b, + TVIN_SIG_FMT_HDMI_720X576P_100HZ = 0x41c, + TVIN_SIG_FMT_HDMI_1440X576I_100HZ = 0x41d, + TVIN_SIG_FMT_HDMI_1920X1080I_120HZ = 0x41e, + TVIN_SIG_FMT_HDMI_1280X720P_120HZ = 0x41f, + TVIN_SIG_FMT_HDMI_720X480P_120HZ = 0x420, + TVIN_SIG_FMT_HDMI_1440X480I_120HZ = 0x421, + TVIN_SIG_FMT_HDMI_720X576P_200HZ = 0x422, + TVIN_SIG_FMT_HDMI_1440X576I_200HZ = 0x423, + TVIN_SIG_FMT_HDMI_720X480P_240HZ = 0x424, + TVIN_SIG_FMT_HDMI_1440X480I_240HZ = 0x425, + TVIN_SIG_FMT_HDMI_1280X720P_24HZ = 0x426, + TVIN_SIG_FMT_HDMI_1280X720P_25HZ = 0x427, + TVIN_SIG_FMT_HDMI_1280X720P_30HZ = 0x428, + TVIN_SIG_FMT_HDMI_1920X1080P_120HZ = 0x429, + TVIN_SIG_FMT_HDMI_1920X1080P_100HZ = 0x42a, + TVIN_SIG_FMT_HDMI_1280X720P_60HZ_FRAME_PACKING = 0x42b, + TVIN_SIG_FMT_HDMI_1280X720P_50HZ_FRAME_PACKING = 0x42c, + TVIN_SIG_FMT_HDMI_1280X720P_24HZ_FRAME_PACKING = 0x42d, + TVIN_SIG_FMT_HDMI_1280X720P_30HZ_FRAME_PACKING = 0x42e, + TVIN_SIG_FMT_HDMI_1920X1080I_60HZ_FRAME_PACKING = 0x42f, + TVIN_SIG_FMT_HDMI_1920X1080I_50HZ_FRAME_PACKING = 0x430, + TVIN_SIG_FMT_HDMI_1920X1080P_24HZ_FRAME_PACKING = 0x431, + TVIN_SIG_FMT_HDMI_1920X1080P_30HZ_FRAME_PACKING = 0x432, + TVIN_SIG_FMT_HDMI_800X600_00HZ = 0x433, + TVIN_SIG_FMT_HDMI_1024X768_00HZ = 0x434, + TVIN_SIG_FMT_HDMI_720X400_00HZ = 0x435, + TVIN_SIG_FMT_HDMI_1280X768_00HZ = 0x436, + TVIN_SIG_FMT_HDMI_1280X800_00HZ = 0x437, + TVIN_SIG_FMT_HDMI_1280X960_00HZ = 0x438, + TVIN_SIG_FMT_HDMI_1280X1024_00HZ = 0x439, + TVIN_SIG_FMT_HDMI_1360X768_00HZ = 0x43a, + TVIN_SIG_FMT_HDMI_1366X768_00HZ = 0x43b, + TVIN_SIG_FMT_HDMI_1600X1200_00HZ = 0x43c, + TVIN_SIG_FMT_HDMI_1920X1200_00HZ = 0x43d, + TVIN_SIG_FMT_HDMI_1440X900_00HZ = 0x43e, + TVIN_SIG_FMT_HDMI_1400X1050_00HZ = 0x43f, + TVIN_SIG_FMT_HDMI_1680X1050_00HZ = 0x440, + /* for alternative and 4k2k */ + TVIN_SIG_FMT_HDMI_1920X1080I_60HZ_ALTERNATIVE = 0x441, + TVIN_SIG_FMT_HDMI_1920X1080I_50HZ_ALTERNATIVE = 0x442, + TVIN_SIG_FMT_HDMI_1920X1080P_24HZ_ALTERNATIVE = 0x443, + TVIN_SIG_FMT_HDMI_1920X1080P_30HZ_ALTERNATIVE = 0x444, + TVIN_SIG_FMT_HDMI_3840_2160_00HZ = 0x445, + TVIN_SIG_FMT_HDMI_4096_2160_00HZ = 0x446, + TVIN_SIG_FMT_HDMI_RESERVE7 = 0x447, + TVIN_SIG_FMT_HDMI_RESERVE8 = 0x448, + TVIN_SIG_FMT_HDMI_RESERVE9 = 0x449, + TVIN_SIG_FMT_HDMI_RESERVE10 = 0x44a, + TVIN_SIG_FMT_HDMI_RESERVE11 = 0x44b, + TVIN_SIG_FMT_HDMI_720X480P_60HZ_FRAME_PACKING = 0x44c, + TVIN_SIG_FMT_HDMI_720X576P_50HZ_FRAME_PACKING = 0x44d, + TVIN_SIG_FMT_HDMI_MAX = 0x44e, + TVIN_SIG_FMT_HDMI_THRESHOLD = 0x600, + //Video Formats + TVIN_SIG_FMT_CVBS_NTSC_M = 0x601, + TVIN_SIG_FMT_CVBS_NTSC_443 = 0x602, + TVIN_SIG_FMT_CVBS_PAL_I = 0x603, + TVIN_SIG_FMT_CVBS_PAL_M = 0x604, + TVIN_SIG_FMT_CVBS_PAL_60 = 0x605, + TVIN_SIG_FMT_CVBS_PAL_CN = 0x606, + TVIN_SIG_FMT_CVBS_SECAM = 0x607, + TVIN_SIG_FMT_CVBS_MAX = 0x608, + TVIN_SIG_FMT_CVBS_THRESHOLD = 0x800, + //656 Formats + TVIN_SIG_FMT_BT656IN_576I_50HZ = 0x801, + TVIN_SIG_FMT_BT656IN_480I_60HZ = 0x802, + //601 Formats + TVIN_SIG_FMT_BT601IN_576I_50HZ = 0x803, + TVIN_SIG_FMT_BT601IN_480I_60HZ = 0x804, + //Camera Formats + TVIN_SIG_FMT_CAMERA_640X480P_30HZ = 0x805, + TVIN_SIG_FMT_CAMERA_800X600P_30HZ = 0x806, + TVIN_SIG_FMT_CAMERA_1024X768P_30HZ = 0x807, + TVIN_SIG_FMT_CAMERA_1920X1080P_30HZ = 0x808, + TVIN_SIG_FMT_CAMERA_1280X720P_30HZ = 0x809, + TVIN_SIG_FMT_BT601_MAX = 0x80a, + TVIN_SIG_FMT_BT601_THRESHOLD = 0xa00, + TVIN_SIG_FMT_MAX, +} tvin_sig_fmt_t; + +//tvin signal status +typedef enum tvin_sig_status_e { + TVIN_SIG_STATUS_NULL = 0, // processing status from init to the finding of the 1st confirmed status + TVIN_SIG_STATUS_NOSIG, // no signal - physically no signal + TVIN_SIG_STATUS_UNSTABLE, // unstable - physically bad signal + TVIN_SIG_STATUS_NOTSUP, // not supported - physically good signal & not supported + TVIN_SIG_STATUS_STABLE, // stable - physically good signal & supported +} tvin_sig_status_t; + +const char *tvin_sig_status_str(enum tvin_sig_status_e status); + +// tvin parameters +#define TVIN_PARM_FLAG_CAP 0x00000001 //tvin_parm_t.flag[ 0]: 1/enable or 0/disable frame capture function +#define TVIN_PARM_FLAG_CAL 0x00000002 //tvin_parm_t.flag[ 1]: 1/enable or 0/disable adc calibration +/*used for processing 3d in ppmgr set this flag to drop one field and send real height in vframe*/ +#define TVIN_PARM_FLAG_2D_TO_3D 0x00000004 //tvin_parm_t.flag[ 2]: 1/enable or 0/disable 2D->3D mode + +typedef enum tvin_trans_fmt { + TVIN_TFMT_2D = 0, + TVIN_TFMT_3D_LRH_OLOR, // 1 Primary: Side-by-Side(Half) Odd/Left picture, Odd/Right p + TVIN_TFMT_3D_LRH_OLER, // 2 Primary: Side-by-Side(Half) Odd/Left picture, Even/Right picture + TVIN_TFMT_3D_LRH_ELOR, // 3 Primary: Side-by-Side(Half) Even/Left picture, Odd/Right picture + TVIN_TFMT_3D_LRH_ELER, // 4 Primary: Side-by-Side(Half) Even/Left picture, Even/Right picture + TVIN_TFMT_3D_TB, // 5 Primary: Top-and-Bottom + TVIN_TFMT_3D_FP, // 6 Primary: Frame Packing + TVIN_TFMT_3D_FA, // 7 Secondary: Field Alternative + TVIN_TFMT_3D_LA, // 8 Secondary: Line Alternative + TVIN_TFMT_3D_LRF, // 9 Secondary: Side-by-Side(Full) + TVIN_TFMT_3D_LD, // 10 Secondary: L+depth + TVIN_TFMT_3D_LDGD, // 11 Secondary: L+depth+Graphics+Graphics-depth + /* normal 3D format */ + TVIN_TFMT_3D_DET_TB,// 12 + TVIN_TFMT_3D_DET_LR,// 13 + TVIN_TFMT_3D_DET_INTERLACE,// 14 + TVIN_TFMT_3D_DET_CHESSBOARD,// 15 + TVIN_TFMT_3D_MAX, +} tvin_trans_fmt_t; + +const char *tvin_trans_fmt_str(enum tvin_trans_fmt trans_fmt); + +typedef enum tvin_color_fmt_e { + TVIN_RGB444 = 0, + TVIN_YUV422, // 1 + TVIN_YUV444, // 2 + TVIN_YUYV422,// 3 + TVIN_YVYU422,// 4 + TVIN_UYVY422,// 5 + TVIN_VYUY422,// 6 + TVIN_NV12, // 7 + TVIN_NV21, // 8 + TVIN_BGGR, // 9 raw data + TVIN_RGGB, // 10 raw data + TVIN_GBRG, // 11 raw data + TVIN_GRBG, // 12 raw data + TVIN_COLOR_FMT_MAX, +} tvin_color_fmt_t; + +const char *tvin_color_fmt_str(enum tvin_color_fmt_e color_fmt); +typedef enum tvin_scan_mode_e { + TVIN_SCAN_MODE_NULL = 0, + TVIN_SCAN_MODE_PROGRESSIVE, + TVIN_SCAN_MODE_INTERLACED, +} tvin_scan_mode_t; + +typedef struct tvin_info_s { + enum tvin_trans_fmt trans_fmt; + enum tvin_sig_fmt_e fmt; + volatile enum tvin_sig_status_e status; + enum tvin_color_fmt_e cfmt; + unsigned int fps; + unsigned int reserved; +} tvin_info_t; + +typedef struct tvin_buf_info_s { + unsigned int vf_size; + unsigned int buf_count; + unsigned int buf_width; + unsigned int buf_height; + unsigned int buf_size; + unsigned int wr_list_size; +} tvin_buf_info_t; + +typedef struct tvin_video_buf_s { + unsigned int index; + unsigned int reserved; +} tvin_video_buf_t; + +// hs=he=vs=ve=0 is to disable Cut Window +typedef struct tvin_cutwin_s { + unsigned short hs; + unsigned short he; + unsigned short vs; + unsigned short ve; +} tvin_cutwin_t; + +typedef struct tvin_parm_s { + int index; // index of frontend for vdin + enum tvin_port_e port; // must set port in IOCTL + struct tvin_info_s info; + unsigned int hist_pow; + unsigned int luma_sum; + unsigned int pixel_sum; + unsigned short histgram[64]; + unsigned int flag; + unsigned short dest_width;//for vdin horizontal scale down + unsigned short dest_height;//for vdin vertical scale down + bool h_reverse;//for vdin horizontal reverse + bool v_reverse;//for vdin vertical reverse + unsigned int reserved; +} tvin_parm_t; + + + +// *************************************************************************** +// *** AFE module definition/enum/struct ************************************* +// *************************************************************************** + +typedef enum tvafe_cmd_status_e { + TVAFE_CMD_STATUS_IDLE = 0, // idle, be ready for TVIN_IOC_S_AFE_VGA_AUTO command + TVAFE_CMD_STATUS_PROCESSING, // TVIN_IOC_S_AFE_VGA_AUTO command is in process + TVAFE_CMD_STATUS_SUCCESSFUL, // TVIN_IOC_S_AFE_VGA_AUTO command is done with success + TVAFE_CMD_STATUS_FAILED, // TVIN_IOC_S_AFE_VGA_AUTO command is done with failure + TVAFE_CMD_STATUS_TERMINATED, // TVIN_IOC_S_AFE_VGA_AUTO command is terminated by others related +} tvafe_cmd_status_t; + +typedef struct tvafe_vga_edid_s { + unsigned char value[256]; //256 byte EDID +} tvafe_vga_edid_t; + +typedef struct tvafe_comp_wss_s { + unsigned int wss1[5]; + unsigned int wss2[5]; +} tvafe_comp_wss_t; + +typedef struct tvafe_vga_parm_s { + signed short clk_step; // clock < 0, tune down clock freq + // clock > 0, tune up clock freq + unsigned short phase; // phase is 0~31, it is absolute value + signed short hpos_step; // hpos_step < 0, shift display to left + // hpos_step > 0, shift display to right + signed short vpos_step; // vpos_step < 0, shift display to top + // vpos_step > 0, shift display to bottom + unsigned int vga_in_clean; // flage for vga clean screen +} tvafe_vga_parm_t; + +#define TVAFE_ADC_CAL_VALID 0x00000001 +typedef struct tvafe_adc_cal_s { + // ADC A + unsigned short a_analog_clamp; // 0x00~0x7f + unsigned short a_analog_gain; // 0x00~0xff, means 0dB~6dB + unsigned short a_digital_offset1; // offset for fine-tuning + // s11.0: signed value, 11 integer bits, 0 fraction bits + unsigned short a_digital_gain; // 0~3.999 + // u2.10: unsigned value, 2 integer bits, 10 fraction bits + unsigned short a_digital_offset2; // offset for format + // s11.0: signed value, 11 integer bits, 0 fraction bits + // ADC B + unsigned short b_analog_clamp; // ditto to ADC A + unsigned short b_analog_gain; + unsigned short b_digital_offset1; + unsigned short b_digital_gain; + unsigned short b_digital_offset2; + // ADC C + unsigned short c_analog_clamp; // ditto to ADC A + unsigned short c_analog_gain; + unsigned short c_digital_offset1; + unsigned short c_digital_gain; + unsigned short c_digital_offset2; + // ADC D + unsigned short d_analog_clamp; // ditto to ADC A + unsigned short d_analog_gain; + unsigned short d_digital_offset1; + unsigned short d_digital_gain; + unsigned short d_digital_offset2; + unsigned int reserved; // bit[ 0]: TVAFE_ADC_CAL_VALID +} tvafe_adc_cal_t; + +typedef struct tvafe_adc_cal_clamp_s { + short a_analog_clamp_diff; + short b_analog_clamp_diff; + short c_analog_clamp_diff; +} tvafe_adc_cal_clamp_t; + +typedef struct tvafe_adc_comp_cal_s { + struct tvafe_adc_cal_s comp_cal_val[3]; +} tvafe_adc_comp_cal_t; + +typedef enum tvafe_cvbs_video_e { + TVAFE_CVBS_VIDEO_HV_UNLOCKED = 0, + TVAFE_CVBS_VIDEO_H_LOCKED, + TVAFE_CVBS_VIDEO_V_LOCKED, + TVAFE_CVBS_VIDEO_HV_LOCKED, +} tvafe_cvbs_video_t; + +// for pin selection +typedef enum tvafe_adc_pin_e { + TVAFE_ADC_PIN_NULL = 0, +#if (MESON_CPU_TYPE == MESON_CPU_TYPE_MESONG9TV) + TVAFE_CVBS_IN0 = 1, + TVAFE_CVBS_IN1 = 2, + TVAFE_CVBS_IN2 = 3, + TVAFE_CVBS_IN3 = 4,//as atvdemod to tvafe +#else + TVAFE_ADC_PIN_A_PGA_0 = 1, + TVAFE_ADC_PIN_A_PGA_1 = 2, + TVAFE_ADC_PIN_A_PGA_2 = 3, + TVAFE_ADC_PIN_A_PGA_3 = 4, + TVAFE_ADC_PIN_A_PGA_4 = 5, + TVAFE_ADC_PIN_A_PGA_5 = 6, + TVAFE_ADC_PIN_A_PGA_6 = 7, + TVAFE_ADC_PIN_A_PGA_7 = 8, + TVAFE_ADC_PIN_A_0 = 9, + TVAFE_ADC_PIN_A_1 = 10, + TVAFE_ADC_PIN_A_2 = 11, + TVAFE_ADC_PIN_A_3 = 12, + TVAFE_ADC_PIN_A_4 = 13, + TVAFE_ADC_PIN_A_5 = 14, + TVAFE_ADC_PIN_A_6 = 15, + TVAFE_ADC_PIN_A_7 = 16, + TVAFE_ADC_PIN_B_0 = 17, + TVAFE_ADC_PIN_B_1 = 18, + TVAFE_ADC_PIN_B_2 = 19, + TVAFE_ADC_PIN_B_3 = 20, + TVAFE_ADC_PIN_B_4 = 21, + TVAFE_ADC_PIN_B_5 = 22, + TVAFE_ADC_PIN_B_6 = 23, + TVAFE_ADC_PIN_B_7 = 24, + TVAFE_ADC_PIN_C_0 = 25, + TVAFE_ADC_PIN_C_1 = 26, + TVAFE_ADC_PIN_C_2 = 27, + TVAFE_ADC_PIN_C_3 = 28, + TVAFE_ADC_PIN_C_4 = 29, + TVAFE_ADC_PIN_C_5 = 30, + TVAFE_ADC_PIN_C_6 = 31, + TVAFE_ADC_PIN_C_7 = 32, + TVAFE_ADC_PIN_D_0 = 33, + TVAFE_ADC_PIN_D_1 = 34, + TVAFE_ADC_PIN_D_2 = 35, + TVAFE_ADC_PIN_D_3 = 36, + TVAFE_ADC_PIN_D_4 = 37, + TVAFE_ADC_PIN_D_5 = 38, + TVAFE_ADC_PIN_D_6 = 39, + TVAFE_ADC_PIN_D_7 = 40, + TVAFE_ADC_PIN_SOG_0 = 41, + TVAFE_ADC_PIN_SOG_1 = 42, + TVAFE_ADC_PIN_SOG_2 = 43, + TVAFE_ADC_PIN_SOG_3 = 44, + TVAFE_ADC_PIN_SOG_4 = 45, + TVAFE_ADC_PIN_SOG_5 = 46, + TVAFE_ADC_PIN_SOG_6 = 47, + TVAFE_ADC_PIN_SOG_7 = 48, +#endif + TVAFE_ADC_PIN_MAX, +} tvafe_adc_pin_t; + +typedef enum tvafe_src_sig_e { +#if (MESON_CPU_TYPE == MESON_CPU_TYPE_MESONG9TV) + CVBS_IN0 = 0, + CVBS_IN1, + CVBS_IN2, + CVBS_IN3, +#else + CVBS0_Y = 0, + CVBS0_SOG, + CVBS1_Y, + CVBS1_SOG, + CVBS2_Y, + CVBS2_SOG, + CVBS3_Y, + CVBS3_SOG, + CVBS4_Y, + CVBS4_SOG, + CVBS5_Y, + CVBS5_SOG, + CVBS6_Y, + CVBS6_SOG, + CVBS7_Y, + CVBS7_SOG, + S_VIDEO0_Y, + S_VIDEO0_C, + S_VIDEO0_SOG, + S_VIDEO1_Y, + S_VIDEO1_C, + S_VIDEO1_SOG, + S_VIDEO2_Y, + S_VIDEO2_C, + S_VIDEO2_SOG, + S_VIDEO3_Y, + S_VIDEO3_C, + S_VIDEO3_SOG, + S_VIDEO4_Y, + S_VIDEO4_C, + S_VIDEO4_SOG, + S_VIDEO5_Y, + S_VIDEO5_C, + S_VIDEO5_SOG, + S_VIDEO6_Y, + S_VIDEO6_C, + S_VIDEO6_SOG, + S_VIDEO7_Y, + S_VIDEO7_C, + S_VIDEO7_SOG, + VGA0_G, + VGA0_B, + VGA0_R, + VGA0_SOG, + VGA1_G, + VGA1_B, + VGA1_R, + VGA1_SOG, + VGA2_G, + VGA2_B, + VGA2_R, + VGA2_SOG, + VGA3_G, + VGA3_B, + VGA3_R, + VGA3_SOG, + VGA4_G, + VGA4_B, + VGA4_R, + VGA4_SOG, + VGA5_G, + VGA5_B, + VGA5_R, + VGA5_SOG, + VGA6_G, + VGA6_B, + VGA6_R, + VGA6_SOG, + VGA7_G, + VGA7_B, + VGA7_R, + VGA7_SOG, + COMP0_Y, + COMP0_PB, + COMP0_PR, + COMP0_SOG, + COMP1_Y, + COMP1_PB, + COMP1_PR, + COMP1_SOG, + COMP2_Y, + COMP2_PB, + COMP2_PR, + COMP2_SOG, + COMP3_Y, + COMP3_PB, + COMP3_PR, + COMP3_SOG, + COMP4_Y, + COMP4_PB, + COMP4_PR, + COMP4_SOG, + COMP5_Y, + COMP5_PB, + COMP5_PR, + COMP5_SOG, + COMP6_Y, + COMP6_PB, + COMP6_PR, + COMP6_SOG, + COMP7_Y, + COMP7_PB, + COMP7_PR, + COMP7_SOG, + SCART0_G, + SCART0_B, + SCART0_R, + SCART0_CVBS, + SCART1_G, + SCART1_B, + SCART1_R, + SCART1_CVBS, + SCART2_G, + SCART2_B, + SCART2_R, + SCART2_CVBS, + SCART3_G, + SCART3_B, + SCART3_R, + SCART3_CVBS, + SCART4_G, + SCART4_B, + SCART4_R, + SCART4_CVBS, + SCART5_G, + SCART5_B, + SCART5_R, + SCART5_CVBS, + SCART6_G, + SCART6_B, + SCART6_R, + SCART6_CVBS, + SCART7_G, + SCART7_B, + SCART7_R, + SCART7_CVBS, +#endif + TVAFE_SRC_SIG_MAX_NUM, +} tvafe_src_sig_t; + +typedef struct tvafe_pin_mux_s { + enum tvafe_adc_pin_e pin[TVAFE_SRC_SIG_MAX_NUM]; +} tvafe_pin_mux_t; + + +// *************************************************************************** +// *** IOCTL command definition ********************************************** +// *************************************************************************** + +#define TVIN_IOC_MAGIC 'T' + +//GENERAL +#define TVIN_IOC_OPEN _IOW(TVIN_IOC_MAGIC, 0x01, struct tvin_parm_s) +#define TVIN_IOC_START_DEC _IOW(TVIN_IOC_MAGIC, 0x02, struct tvin_parm_s) +#define TVIN_IOC_STOP_DEC _IO( TVIN_IOC_MAGIC, 0x03) +#define TVIN_IOC_CLOSE _IO( TVIN_IOC_MAGIC, 0x04) +#define TVIN_IOC_G_PARM _IOR(TVIN_IOC_MAGIC, 0x05, struct tvin_parm_s) +#define TVIN_IOC_S_PARM _IOW(TVIN_IOC_MAGIC, 0x06, struct tvin_parm_s) +#define TVIN_IOC_G_SIG_INFO _IOR(TVIN_IOC_MAGIC, 0x07, struct tvin_info_s) +#define TVIN_IOC_G_BUF_INFO _IOR(TVIN_IOC_MAGIC, 0x08, struct tvin_buf_info_s) +#define TVIN_IOC_START_GET_BUF _IO( TVIN_IOC_MAGIC, 0x09) +#define TVIN_IOC_GET_BUF _IOR(TVIN_IOC_MAGIC, 0x10, struct tvin_video_buf_s) +#define TVIN_IOC_PAUSE_DEC _IO(TVIN_IOC_MAGIC, 0x41) +#define TVIN_IOC_RESUME_DEC _IO(TVIN_IOC_MAGIC, 0x42) +#define TVIN_IOC_VF_REG _IO(TVIN_IOC_MAGIC, 0x43) +#define TVIN_IOC_VF_UNREG _IO(TVIN_IOC_MAGIC, 0x44) +#define TVIN_IOC_FREEZE_VF _IO(TVIN_IOC_MAGIC, 0x45) +#define TVIN_IOC_UNFREEZE_VF _IO(TVIN_IOC_MAGIC, 0x46) + +//HDMI +#define HDMI_IOC_HDCP_KSV _IOR(HDMI_IOC_MAGIC, 0x09, struct _hdcp_ksv) + + + +//TVAFE +#define TVIN_IOC_S_AFE_ADC_CAL _IOW(TVIN_IOC_MAGIC, 0x11, struct tvafe_adc_cal_s) +#define TVIN_IOC_G_AFE_ADC_CAL _IOR(TVIN_IOC_MAGIC, 0x12, struct tvafe_adc_cal_s) +#define TVIN_IOC_G_AFE_COMP_WSS _IOR(TVIN_IOC_MAGIC, 0x13, struct tvafe_comp_wss_s) +#define TVIN_IOC_S_AFE_VGA_EDID _IOW(TVIN_IOC_MAGIC, 0x14, struct tvafe_vga_edid_s) +#define TVIN_IOC_G_AFE_VGA_EDID _IOR(TVIN_IOC_MAGIC, 0x15, struct tvafe_vga_edid_s) +#define TVIN_IOC_S_AFE_VGA_PARM _IOW(TVIN_IOC_MAGIC, 0x16, struct tvafe_vga_parm_s) +#define TVIN_IOC_G_AFE_VGA_PARM _IOR(TVIN_IOC_MAGIC, 0x17, struct tvafe_vga_parm_s) +#define TVIN_IOC_S_AFE_VGA_AUTO _IO( TVIN_IOC_MAGIC, 0x18) +#define TVIN_IOC_G_AFE_CMD_STATUS _IOR(TVIN_IOC_MAGIC, 0x19, enum tvafe_cmd_status_e) +#define TVIN_IOC_G_AFE_CVBS_LOCK _IOR(TVIN_IOC_MAGIC, 0x1a, enum tvafe_cvbs_video_e) +#define TVIN_IOC_S_AFE_CVBS_STD _IOW(TVIN_IOC_MAGIC, 0x1b, enum tvin_sig_fmt_e) +#define TVIN_IOC_CALLMASTER_SET _IOW(TVIN_IOC_MAGIC, 0x1c, enum tvin_port_e) +#define TVIN_IOC_CALLMASTER_GET _IO( TVIN_IOC_MAGIC, 0x1d) +#define TVIN_IOC_S_AFE_ADC_COMP_CAL _IOW(TVIN_IOC_MAGIC, 0x1e, struct tvafe_adc_comp_cal_s) +#define TVIN_IOC_G_AFE_ADC_COMP_CAL _IOR(TVIN_IOC_MAGIC, 0x1f, struct tvafe_adc_comp_cal_s) +#define TVIN_IOC_LOAD_REG _IOW(TVIN_IOC_MAGIC, 0x20, struct am_regs_s) +#define TVIN_IOC_S_AFE_ADC_DIFF _IOW(TVIN_IOC_MAGIC, 0x21, struct tvafe_adc_cal_clamp_s) + +// *************************************************************************** +// *** add more ********************************************** +// *************************************************************************** + +typedef enum tvin_path_id_e { + TV_PATH_VDIN_AMVIDEO, + TV_PATH_VDIN_DEINTERLACE_AMVIDEO, + TV_PATH_VDIN_3D_AMVIDEO, + TV_PATH_VDIN_NEW3D_AMVIDEO, + TV_PATH_VDIN_NEW3D_WITHOUTPPMGR_AMVIDEO, + TV_PATH_VDIN_FREESCALE_AMVIDEO, + TV_PATH_DECODER_3D_AMVIDEO, + TV_PATH_DECODER_AMVIDEO, + TV_PATH_DECODER_NEW3D_AMVIDEO, + TV_PATH_DECODER_NEW3D_WITHOUTPPMGR_AMVIDEO, + TV_PATH_MAX, +} tvin_path_id_t; + +#define CAMERA_IOC_MAGIC 'C' +#define CAMERA_IOC_START _IOW(CAMERA_IOC_MAGIC, 0x01, struct camera_info_s) +#define CAMERA_IOC_STOP _IO(CAMERA_IOC_MAGIC, 0x02) +#define CAMERA_IOC_SET_PARA _IOW(CAMERA_IOC_MAGIC, 0x03, struct camera_info_s) +#define CAMERA_IOC_GET_PARA _IOR(CAMERA_IOC_MAGIC, 0x04, struct camera_info_s) + + +#define CC_HIST_GRAM_BUF_SIZE (64) +/*******************************extend define*******************************/ + +typedef enum tv_source_input_e { + SOURCE_INVALID = -1, + SOURCE_TV = 0, + SOURCE_AV1, + SOURCE_AV2, + SOURCE_YPBPR1, + SOURCE_YPBPR2, + SOURCE_HDMI1, + SOURCE_HDMI2, + SOURCE_HDMI3, + SOURCE_VGA, + SOURCE_MPEG, + SOURCE_DTV, + SOURCE_SVIDEO, + SOURCE_IPTV, + SOURCE_DUMMY, + SOURCE_MAX, +} tv_source_input_t; + +typedef enum tv_source_input_type_e { + SOURCE_TYPE_TV, + SOURCE_TYPE_AV, + SOURCE_TYPE_COMPONENT, + SOURCE_TYPE_HDMI, + SOURCE_TYPE_VGA, + SOURCE_TYPE_MPEG, + SOURCE_TYPE_DTV, + SOURCE_TYPE_SVIDEO, + SOURCE_TYPE_IPTV, + SOURCE_TYPE_MAX, +} tv_source_input_type_t; + +typedef enum adc_cal_type_e { + CAL_YPBPR = 0, + CAL_VGA, + CAL_CVBS, +} adc_cal_type_t; + +typedef enum signal_range_e { + RANGE100 = 0, + RANGE75, +} signal_range_t; + +typedef struct adc_cal_s { + unsigned int rcr_max; + unsigned int rcr_min; + unsigned int g_y_max; + unsigned int g_y_min; + unsigned int bcb_max; + unsigned int bcb_min; + unsigned int cr_white; + unsigned int cb_white; + unsigned int cr_black; + unsigned int cb_black; +} adc_cal_t; + +typedef struct tvin_window_pos_s { + int x1; + int y1; + int x2; + int y2; +} tvin_window_pos_t; + + +typedef enum tv_path_type_e { + TV_PATH_TYPE_DEFAULT, + TV_PATH_TYPE_TVIN, + TV_PATH_TYPE_TVIN_PREVIEW, + TV_PATH_TYPE_MAX, +} tv_path_type_t; + +typedef enum tv_path_status_e { + TV_PATH_STATUS_NO_DEV = -2, + TV_PATH_STATUS_ERROR = -1, + TV_PATH_STATUS_INACTIVE = 0, + TV_PATH_STATUS_ACTIVE = 1, + TV_PATH_STATUS_MAX, +} tv_path_status_t; + +typedef enum tv_audio_channel_e { + TV_AUDIO_LINE_IN_0, + TV_AUDIO_LINE_IN_1, + TV_AUDIO_LINE_IN_2, + TV_AUDIO_LINE_IN_3, + TV_AUDIO_LINE_IN_4, + TV_AUDIO_LINE_IN_5, + TV_AUDIO_LINE_IN_6, + TV_AUDIO_LINE_IN_7, + TV_AUDIO_LINE_IN_MAX, +} tv_audio_channel_t; + +typedef enum tv_audio_in_source_type_e { + TV_AUDIO_IN_SOURCE_TYPE_LINEIN, + TV_AUDIO_IN_SOURCE_TYPE_ATV, + TV_AUDIO_IN_SOURCE_TYPE_HDMI, + TV_AUDIO_IN_SOURCE_TYPE_MAX, +} tv_audio_in_source_type_t; + +#define CC_RESOLUTION_1366X768_W (1366) +#define CC_RESOLUTION_1366X768_H (768) +#define CC_RESOLUTION_1920X1080_W (1920) +#define CC_RESOLUTION_1920X1080_H (1080) +#define CC_RESOLUTION_3840X2160_W (3840) +#define CC_RESOLUTION_3840X2160_H (2160) + +typedef enum tv_source_connect_detect_status_e { + CC_SOURCE_PLUG_OUT, + CC_SOURCE_PLUG_IN, +} tv_source_connect_detect_status_t; + +//HDMI rx cec +typedef struct tagHDMIRxRequestReplyItem { + CCondition WaitReplyCondition; + int WaitCmd; + int WaitLogicAddr; + int WaitTimeOut; + int WaitFlag; + int DataFlag; + struct _cec_msg msg; +} HDMIRxRequestReplyItem; + +typedef struct _hdcp_ksv { + int bksv0; + int bksv1; +} _hdcp_ksv; + + +typedef struct am_phase_s { + unsigned int length; // Length of total + unsigned int phase[TVIN_SIG_FMT_COMP_MAX - TVIN_SIG_FMT_VGA_THRESHOLD]; +} am_phase_t; + + +#define CC_REQUEST_LIST_SIZE (32) +#define CC_CEC_STREAM_SIZE (sizeof(struct _cec_msg)) +#define CC_SOURCE_DEV_REFRESH_CNT (E_LA_MAX) + +class CTvin +{ +public: + CTvin(); + ~CTvin(); + int OpenTvin(); + int init_vdin(); + int uninit_vdin ( void ); + int Tv_init_afe ( void ); + int Tv_uninit_afe ( void ); + int Tvin_AddPath ( tvin_path_id_t pathid ); + int Tvin_RemovePath ( tv_path_type_t pathtype ); + int Tvin_CheckPathActive ( tv_path_type_t path_type, int isCheckD2D3 ); + int setMpeg2Vdin(int enable); + //pre apis + int AFE_DeviceIOCtl ( int request, ... ); + void TvinApi_CloseAFEModule ( void ); + int TvinApi_SetVdinHVScale ( int vdinx, int hscale, int vscale ); + int TvinApi_SetCompPhase ( am_phase_t &am_phase ); + int TvinApi_SetStartDropFrameCn ( int count ); + int TvinApi_SetCompPhaseEnable ( int enable ); + tvin_trans_fmt TvinApi_Get3DDectMode(); + int TvinApi_GetHDMIAudioStatus ( void ); + int TvinApi_LoadPLLValues ( am_regs_t regs ); + int TvinApi_LoadCVD2Values ( am_regs_t regs ); + int TvinApi_GetFbSize ( unsigned int *fb_width, unsigned int *fb_height ); + int Tvin_StartDecoder ( tvin_info_t &info ); + int Tvin_StopDecoder(); + int get_hdmi_sampling_rate(); + int get_hdmi_ksv_info(int source_input, int data_buf[]); + int SwitchPort (tvin_port_t source_port ); + // + void Tvin_SetDepthOf2Dto3D ( int value ); + int set3D_FL_Frame(int value); + int setLatchFlag(int value); + // + int IsFileExist ( const char *file_name ); + char *DelSub ( char *str, char *sub ); + char *VDIN_CheckVideoPath ( const char *videopath ); + int VDIN_AddPath ( const char *videopath ); + int VDIN_RmDefPath ( void ); + int VDIN_RmTvPath ( void ); + int VDIN_AddVideoPath ( int selPath ); + int VDIN_RmPreviewPath ( void ); + int VDIN_GetVdinFd(); + + int VDIN_OpenModule(); + int VDIN_CloseModule(); + int VDIN_DeviceIOCtl ( int request, ... ); + int VDIN_GetDeviceFileHandle(); + int VDIN_OpenPort ( tvin_port_t port ); + int VDIN_ClosePort(); + int VDIN_StartDec ( const struct tvin_parm_s *vdinParam ); + int VDIN_StopDec(); + int VDIN_GetSignalInfo ( struct tvin_info_s *SignalInfo ); + int VDIN_SetVdinParam ( const struct tvin_parm_s *vdinParam ); + int VDIN_GetVdinParam ( const struct tvin_parm_s *vdinParam ); + int VDIN_OnoffVScaler ( int isOn ); + int VDIN_GetDisplayVFreq ( void ); + int VDIN_SetDisplayVFreq ( int freq, int display_resolution , bool isFbc); + + int VDIN_Set2D3DDepth ( int count ); + + int VDIN_Set2Dto3D ( int on_off ); + int VDIN_Set3DCmd ( int cmd ); + + + int VDIN_GetHistgram ( int *hisgram ); + int VDIN_SetMVCViewMode ( int mode ); + int VDIN_GetMVCViewMode ( void ); + int VDIN_SetDIBuffMgrMode ( int mgr_mode ); + int VDIN_SetDICFG ( int cfg ); + int VDIN_SetDI3DDetc ( int enable ); + int VDIN_Get3DDetc ( void ); + int VDIN_GetVscalerStatus ( void ); + int VDIN_TurnOnBlackBarDetect ( int isEnable ); + int VDIN_LoadHdcpKey ( unsigned char *hdcpkey_buff ); + int VDIN_KeepLastFrame ( int enable ); + int VDIN_SetVideoFreeze ( int enable ); + int VDIN_SetDIBypasshd ( int enable ); + int VDIN_SetDIBypassAll ( int enable ); + int VDIN_SetDIBypass_Get_Buf_Threshold ( int enable ); + int VDIN_SetDIBypassProg ( int enable ); + int VDIN_SetDIBypassDynamic ( int flag ); + int VDIN_SetDIDet3DMode ( int value ); + int VDIN_SetDIBypass3D ( int enable ); + int VDIN_SetDIBypassPost ( int enable ); + int VDIN_SetDIProg_Proc_Config ( int value ); + int VDIN_SetDISip_Top_Bot ( int value ); + int VDIN_SetVdinFlag ( int flag ); + int VDIN_EnableRDMA ( int enable ); + int VDIN_GetHdmiHdcpKeyKsvInfo(struct _hdcp_ksv *msg); + int AFE_OpenModule ( void ); + void AFE_CloseModule ( void ); + int AFE_GetDeviceFileHandle(); + int AFE_SetCVBSStd ( tvin_sig_fmt_t cvbs_fmt ); + int AFE_SetVGAEdid ( const unsigned char *ediddata ); + int AFE_GetVGAEdid ( unsigned char *ediddata ); + int AFE_SetADCTimingAdjust ( const struct tvafe_vga_parm_s *timingadj ); + int AFE_GetADCCurrentTimingAdjust ( struct tvafe_vga_parm_s *timingadj ); + int AFE_VGAAutoAdjust ( struct tvafe_vga_parm_s *timingadj ); + int AFE_SetVGAAutoAjust ( void ); + int AFE_GetVGAAutoAdjustCMDStatus ( tvafe_cmd_status_t *Status ); + int AFE_GetAdcCal ( struct tvafe_adc_cal_s *adccalvalue ); + int AFE_SetAdcCal ( struct tvafe_adc_cal_s *adccalvalue ); + int AFE_GetAdcCompCal ( struct tvafe_adc_comp_cal_s *adccalvalue ); + int AFE_SetAdcCompCal ( struct tvafe_adc_comp_cal_s *adccalvalue ); + int AFE_GetYPbPrWSSinfo ( struct tvafe_comp_wss_s *wssinfo ); + unsigned int data_limit ( float data ); + void matrix_convert_yuv709_to_rgb ( unsigned int y, unsigned int u, unsigned int v, unsigned int *r, unsigned int *g, unsigned int *b ); + void re_order ( unsigned int *a, unsigned int *b ); + char *get_cap_addr ( enum adc_cal_type_e calType ); + inline unsigned char get_mem_data ( char *dp, unsigned int addr ); + int get_frame_average ( enum adc_cal_type_e calType, struct adc_cal_s *mem_data ); + struct adc_cal_s get_n_frame_average ( enum adc_cal_type_e calType ) ; + int AFE_GetMemData ( int typeSel, struct adc_cal_s *mem_data ); + int AFE_GetCVBSLockStatus ( enum tvafe_cvbs_video_e *cvbs_lock_status ); + int AFE_SetCVBSStd ( unsigned int sig_fmt ); + int VDIN_GetPortConnect ( int port ); + int VDIN_OpenHDMIPinMuxOn ( bool flag ); + int TVAFE_EnablePlugInDetect ( bool flag ); + /*******************************************extend funs*********************/ + static tv_source_input_type_t Tvin_SourcePortToSourceInputType ( tvin_port_t source_port ); + static tv_source_input_type_t Tvin_SourceInputToSourceInputType ( tv_source_input_t source_input ); + static tvin_port_t Tvin_GetSourcePortBySourceType ( tv_source_input_type_t source_type ); + static tvin_port_t Tvin_GetSourcePortBySourceInput ( tv_source_input_t source_input ); + static unsigned int Tvin_TransPortStringToValue(const char *port_str); + static void Tvin_LoadSourceInputToPortMap(); + static int Tvin_GetSourcePortByCECPhysicalAddress(int physical_addr); + static tv_audio_channel_t Tvin_GetInputSourceAudioChannelIndex ( tv_source_input_t source_input ); + static tv_audio_in_source_type_t Tvin_GetAudioInSourceType ( tv_source_input_t source_input ); + static tv_source_input_t Tvin_PortToSourceInput ( tvin_port_t port ); + static int isVgaFmtInHdmi ( tvin_sig_fmt_t fmt ); + static bool Tvin_is50HzFrameRateFmt ( tvin_sig_fmt_t fmt ); + static bool Tvin_IsDeinterlaceFmt ( tvin_sig_fmt_t fmt ); + static v4l2_std_id CvbsFtmToV4l2ColorStd(tvin_sig_fmt_t fmt); + +public: + class CTvinSigDetect: public CThread + { + public: + static const int VDIN_NOSIG_DEFAULT_CHECK_TIMES = 1; + CTvinSigDetect ( CTvin *pTvin ); + ~CTvinSigDetect(); + int startDetect(); + int stopDetect(); + int pauseDetect(); + int resumeDetect(); + int initSigState(); + void setVdinNoSigCheckKeepTimes(int times, bool isOnce);//times is time, ms + int requestAndWaitPauseDetect(); + //first pause detect? ok + tvin_info_t &getCurSigInfo() + { + return m_cur_sig_info; + } + class ISigDetectObserver + { + public: + ISigDetectObserver() + {}; + virtual ~ISigDetectObserver() + {}; + virtual void onSigToStable() + {}; + virtual void onSigStableToUnstable() {}; + virtual void onSigStableToUnSupport() {}; + virtual void onSigStableToNoSig() {}; + virtual void onSigUnStableToUnSupport() {}; + virtual void onSigUnStableToNoSig() {}; + virtual void onSigNullToNoSig() {}; + virtual void onSigNoSigToUnstable() {}; + + virtual void onSigStillStable() {}; + virtual void onSigStillUnstable() {}; + virtual void onSigStillNosig() {}; + virtual void onSigStillNoSupport() {}; + virtual void onSigStillNull() {}; + virtual void onStableSigFmtChange() {}; + virtual void onStableTransFmtChange() {}; + + virtual void onSigDetectEnter() {}; + virtual void onLoop() {}; + }; + void setObserver ( ISigDetectObserver *pOb ) + { + mpObserver = pOb; + }; + private: + bool threadLoop(); + int Tv_TvinSigDetect ( int &args ); + + //member + tvin_info_t m_cur_sig_info; + tvin_info_t m_pre_sig_info; + int mKeepNosigTime; + bool m_is_nosig_checktimes_once_valid; + CTvin *mpTvin; + mutable CMutex mLock; + CCondition mDetectPauseCondition; + CCondition mRequestPauseCondition; + volatile int m_sig_detect_status; + volatile bool m_request_pause_detect; + enum DetectState { + STATE_STOPED = 0, + STATE_RUNNING, + STATE_PAUSE + }; + int mDetectState; + ISigDetectObserver *mpObserver; + };// + + class CSourceConnectDetect: public CThread + { + public: + CSourceConnectDetect(CTvin *pTvin); + ~CSourceConnectDetect(); + + int startDetect(); + int refreshDetectSources(); + int refreshDetectAVInfo(); + int GetSourceConnectStatus(int source_input); + + class ISourceConnectObserver + { + public: + ISourceConnectObserver() {}; + virtual ~ISourceConnectObserver() {}; + virtual void onSourceConnect(int source_type, int connect_status) {}; + }; + void setObserver ( ISourceConnectObserver *pOb ) + { + mpObserver = pOb; + }; + private: +#define CC_AV_DETECT_METHOD_ADC_PLUG_IN (0) +#define CC_AV_DETECT_METHOD_ADC_PLUG_OUT (1) +#define CC_AV_DETECT_SAMPLE_DATA_MAX_LEN (512) + + bool threadLoop(); + + ISourceConnectObserver *mpObserver; + CTvin *mpTvin; + + volatile int mSourceDetectSleepTime; + + //AV detect variables + int mAVDetectMethod; + int mAVDetectPlugOutDutyCycle; + int mAVDetectPlugInDutyCycle; + int mAVDetectPlugOutADCThreshold; + int mAVDetectPlugInADCThreshold; + int mAVDetectSampleSize; + int mAV1DetectADCChan; + int mAV2DetectADCChan; + int mAV1CurSampleInd; + int mAV2CurSampleInd; + int mAV1SampleDataBuf[CC_AV_DETECT_SAMPLE_DATA_MAX_LEN]; + int mAV2SampleDataBuf[CC_AV_DETECT_SAMPLE_DATA_MAX_LEN]; + + int mSourceDetectTable[SOURCE_MAX]; + int mSourceDetectPreStatusBuf[SOURCE_MAX]; + int mSourceDetectCurStatusBuf[SOURCE_MAX]; + + int DetectSources(); + int DetectAVSource(int source_input); + int DetectHDMISource(int source_input); + }; + + class CHDMIRxCEC: public CThread + { + public: + CHDMIRxCEC(CTvin *pTvin); + ~CHDMIRxCEC(); + + class IHDMIRxCECObserver + { + public: + IHDMIRxCECObserver() {}; + virtual ~IHDMIRxCECObserver() {}; + virtual void onHDMIRxCECMessage(int msg_len, unsigned char msg_buf[]) {}; + }; + void setObserver ( IHDMIRxCECObserver *pOb ) + { + mpObserver = pOb; + }; + + int start(); + int stop(); + int pause(); + int resume(); + int ClearRxMessageBuffer(); + int processRefreshSrcDevice(int source_input); + int SendCustomMessage(int source_input, unsigned char data_buf[]); + int SendCustomMessageAndWaitReply(int source_input, unsigned char data_buf[], unsigned char reply_buf[], int WaitCmd, int timeout); + int SendBoradcastStandbyMessage(int source_input); + int SendGiveCECVersionMessage(int source_input, unsigned char data_buf[]); + int SendGiveDeviceVendorIDMessage(int source_input, unsigned char data_buf[]); + int SendGiveOSDNameMessage(int source_input, unsigned char data_buf[]); + int SendGivePhysicalAddressMessage(int source_input, int logic_addr, int *physical_addr); + int SendSetMenuLanguageMessage(int source_input, unsigned char data_buf[]); + int SendVendorRemoteKeyDownMessage(int source_input, unsigned char key_val); + int SendVendorRemoteKeyUpMessage(int source_input); + + + private: + int mModuleEnableFlag; + int mRequestPause; + int mState; + IHDMIRxCECObserver *mpObserver; + CTvin *mpTvin; + + bool threadLoop(); + int processData(int msg_cnt); + + int isAllowOperate(int source_input); + int GetModuleEnableFlag(); + int GetDeviceLogicAddr(int source_input); + int SendMessage(struct _cec_msg *msg); + int sendMessageAndWaitReply(struct _cec_msg *msg, struct _cec_msg *reply_msg, int WaitCmd, int timeout); + int GetMessage(struct _cec_msg *msg_list); + int rmFromRequestList(int index); + int addToRequestList(HDMIRxRequestReplyItem *reply_item); + int PrintMessage(const char *func_name, int data_type, struct _cec_msg *msg); + int ClrReplyListItem(HDMIRxRequestReplyItem *reply_item); + int CopyMessageData(unsigned char data_buf[], unsigned char msg_data[], int msg_len); + + int mSourceDevLogicAddrBuf[CC_SOURCE_DEV_REFRESH_CNT]; + int mSourceDevRefreshBuf[CC_SOURCE_DEV_REFRESH_CNT]; + + CCondition mPauseCondition; + mutable CMutex mLock; + mutable CMutex mListLock; + mutable CMutex mReplyLock[CC_REQUEST_LIST_SIZE]; + HDMIRxRequestReplyItem mReplyList[CC_REQUEST_LIST_SIZE]; + struct _cec_msg mMsgBuf[CC_REQUEST_LIST_SIZE]; + + enum RefreshState { + STATE_STOPED = 0, + STATE_RUNNING, + STATE_PAUSE, + STATE_FINISHED, + }; + }; + +private: + int m_vdin_dev_fd; + int afe_dev_fd; + tvin_parm_t m_tvin_param; + tvin_parm_t gTvinVDINParam; + tvin_info_t gTvinVDINSignalInfo; + tvin_parm_t gTvinAFEParam; + tvin_info_t gTvinAFESignalInfo; + static int mSourceInputToPortMap[SOURCE_MAX]; + int gExistD2D3; + char gVideoPath[256]; + int m_is_decoder_start; + + enum tvin_path_id_e m_pathid; + char config_tv_path[64]; + char config_default_path[64]; +}; +#endif diff --git a/tvapi/libtv/tvsetting/CBlobDevice.cpp b/tvapi/libtv/tvsetting/CBlobDevice.cpp new file mode 100644 index 0000000..8974fbf --- a/dev/null +++ b/tvapi/libtv/tvsetting/CBlobDevice.cpp @@ -0,0 +1,27 @@ +#include <stdio.h> +#include <string.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <pthread.h> +#include "CBlobDeviceE2prom.h" +#include "CBlobDevice.h" +#include "CTvLog.h" + +#define LOG_TAG "CBlobDevice" + + +CBlobDevice::CBlobDevice() +{ + m_dev_path[0] = '\0'; +} + +CBlobDevice::~CBlobDevice() +{ +} + +int CBlobDevice::IsFileExist(const char *file_name) +{ + struct stat tmp_st; + + return stat(file_name, &tmp_st); +} diff --git a/tvapi/libtv/tvsetting/CBlobDevice.h b/tvapi/libtv/tvsetting/CBlobDevice.h new file mode 100644 index 0000000..43f2d49 --- a/dev/null +++ b/tvapi/libtv/tvsetting/CBlobDevice.h @@ -0,0 +1,51 @@ +#ifndef BLOB_BASE_DEVICE_H +#define BLOB_BASE_DEVICE_H + +class CBlobDevice +{ + +public: + static const int CC_MAX_FILE_PATH = 256; + static const int CC_ERR_FILE_HANDLE = -1; + static const int CC_INIT_BYTE_VAL = 0xFF; + static const int CC_SSM_PROTECT_ON = 0; + static const int CC_SSM_PROTECT_OFF = 1; + + static const int CC_DEVICE_E2PROM = (0); + static const int CC_DEVICE_SPI = (1); + static const int CC_DEVICE_FILE = (2); + static const int CC_DEVICE_RAM = (3); + + CBlobDevice(); + virtual ~CBlobDevice(); + + virtual int WriteBytes(int offset, int size, unsigned char *buf) = 0; + virtual int ReadBytes(int offset, int size, unsigned char *buf) = 0; + virtual int EraseAllData() = 0; + virtual int InitCheck() = 0; + virtual int OpenDevice() = 0; + virtual int CloseDevice() = 0; + int WriteOneByte(int offset, unsigned char val) + { + return WriteBytes(offset, 1, &val); + } + int ReadOneByte(int offset, unsigned char *ptrVal) + { + return ReadBytes(offset, 1, ptrVal); + } + + int m_dev_type; //device type + int m_dev_total_size; //device total size(Byte) + + char m_dev_path[CC_MAX_FILE_PATH]; //device path + int m_dev_fd; + +protected: + unsigned char *mDataBuf; + +private: + int IsFileExist(const char *file_name); + +}; + +#endif // ANDROID_SSM_BASE_H diff --git a/tvapi/libtv/tvsetting/CBlobDeviceE2prom.cpp b/tvapi/libtv/tvsetting/CBlobDeviceE2prom.cpp new file mode 100644 index 0000000..2e0ebe3 --- a/dev/null +++ b/tvapi/libtv/tvsetting/CBlobDeviceE2prom.cpp @@ -0,0 +1,353 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <fcntl.h> +#include <errno.h> + +#include "CBlobDeviceE2prom.h" +#include "../tvconfig/tvconfig.h" +#include "../tvutils/tvutils.h" +#include "CTvLog.h" + +#define LOG_TAG "CBlobDeviceE2prom" + +#define msleep(x) usleep(x*1000) + +CBlobDeviceE2prom::CBlobDeviceE2prom() +{ + +} + +CBlobDeviceE2prom::~CBlobDeviceE2prom() +{ +} + +int CBlobDeviceE2prom::WriteBytes(int offset, int size, unsigned char *buf) +{ + return 0; +} +int CBlobDeviceE2prom::ReadBytes(int offset, int size, unsigned char *buf) +{ + return 0; +} +int CBlobDeviceE2prom::EraseAllData() +{ + return 0; +} +int CBlobDeviceE2prom::InitCheck() +{ + return 0; +} +int CBlobDeviceE2prom::OpenDevice() +{ + return 0; +} +int CBlobDeviceE2prom::CloseDevice() +{ + return 0; +} +//int CBlobDeviceE2prom::InitCheck() { +/* int i, tmp_dev_total_size = 0, tmp_offset = 0, rw_check_count = 4; + unsigned char *tmp_buf = NULL; + unsigned char w_ch = 0, r_ch = 0; + + SetWriteProtectStatus (CC_SSM_PROTECT_ON); + + if (ValidOperateCheck() < 0) { + return -1; + } + + tmp_offset = E2P_DEV_RW_TEST_OFFSET; + + if (tmp_offset >= 0) { + for (i = 0; i < rw_check_count; i++) { + w_ch = 0x5A; + WriteNBytes(tmp_offset, 1, &w_ch); + + r_ch = 0x00; + ReadNBytes(tmp_offset, 1, &r_ch); + + if (r_ch != w_ch) { + LOGE("%s, Device rw check error, write %d, read %d.\n", "TV", w_ch, r_ch); + return -1; + } + + w_ch = 0xA5; + WriteNBytes(tmp_offset, 1, &w_ch); + + r_ch = 0x00; + ReadNBytes(tmp_offset, 1, &r_ch); + + if (r_ch != w_ch) { + LOGE("%s, Device rw check error, write %d, read %d.\n", "TV", w_ch, r_ch); + return -1; + } + } + } + + if (device_buf != NULL) { + delete device_buf; + device_buf = NULL; + } + + if (device_use_buffer) { + tmp_dev_total_size = GetDeviceTotalSize(); + if (tmp_dev_total_size <= 0) { + LOGE("%s, Device file size must be more than 0.\n", "TV"); + return -1; + } + + tmp_buf = new unsigned char[tmp_dev_total_size]; + if (tmp_buf != NULL) { + if (ReadNBytes(0, tmp_dev_total_size, tmp_buf) < 0) { + delete tmp_buf; + tmp_buf = NULL; + + LOGE("%s, Read data from device error when read data to device rw buffer!!!.\n", "TV"); + return -1; + } + + device_buf = new unsigned char[tmp_dev_total_size]; + if (device_buf != NULL) { + memcpy((void *) device_buf, (void *) tmp_buf, tmp_dev_total_size); + } + + delete tmp_buf; + tmp_buf = NULL; + } + } +*/ +// return 0; +//} + +//int CBlobDeviceE2prom::OpenDevice() { +/*int device_fd = CC_ERR_FILE_HANDLE; + +if (gFilePathBuf == NULL) { + LOGE("%s, Device file name is NULL.\n", "TV"); + return CC_ERR_FILE_HANDLE; +} + +device_fd = open(gFilePathBuf, O_RDWR); +if (device_fd < 0) { + LOGE("%s, Open device file \"%s\" error: %s.\n", "TV", gFilePathBuf, strerror(errno)); + return CC_ERR_FILE_HANDLE; +} + +return device_fd;*/ +// return 0; +//} + +//int CBlobDeviceE2prom::CloseDevice() { +/*if (*device_fd >= 0) { + close(*device_fd); + *device_fd = CC_ERR_FILE_HANDLE; +}*/ + +// return 0; +//} + +/*int CBlobDeviceE2prom::SetWriteProtectStatus(int protect_status) { +}*/ + +/*int CBlobDeviceE2prom::CheckDeviceWrAvaliable(int offset, int len) { + int tmp_dev_start_offset = 0; + int tmp_dev_end_offset = 0; + + GetDeviceRWStartOffset(&tmp_dev_start_offset); + if (tmp_dev_start_offset < 0) { + LOGE("%s, Device file r/w start offset must be greater than or euqal to 0.\n", "TV"); + return -1; + } + + GetDeviceRWEndOffset(&tmp_dev_end_offset); + if (tmp_dev_end_offset < 0) { + LOGE("%s, Device file r/w end offset must be more than 0.\n", "TV"); + return -1; + } + + if (len <= 0) { + LOGE("%s, The w/r length should be more than 0.\n", "TV"); + return -1; + } + + if ((len + tmp_dev_start_offset + offset) > tmp_dev_end_offset + 1) { + LOGE("%s, w/r would be overflow!!! len = %d, start offset = %d, offset = %d, end offset = %d.\n", "TV", len, tmp_dev_start_offset, offset, tmp_dev_end_offset); + return -1; + } + + if (ValidOperateCheck() < 0) { + return -1; + } + + return 0; +} + +/*int CBlobDeviceE2prom::WriteSpecialBytes(int offset, int len, unsigned char data_buf[]) { + int i = 0, tmp_ret = 0; + int tmp_dev_w_page_size = 0; + int tmp_dev_slave_addr = 0; + int device_fd = CC_ERR_FILE_HANDLE; + struct i2c_rdwr_ioctl_data ctl_data; + struct i2c_msg msg; + unsigned char msg_buf[E2P_MSG_BUF_SIZE]; + + //GetDeviceWritePageSize(&tmp_dev_w_page_size); + //if (len > tmp_dev_w_page_size) { + // LOGE("%s, The write length should be less than page size(%d).\n", "TV", tmp_dev_w_page_size); + // return -1; + //} + + if (CheckDeviceWrAvaliable(offset, len) < 0) { + return -1; + } + + device_fd = OpenDevice(); + if (device_fd == CC_ERR_FILE_HANDLE) { + return -1; + } + + memset((void *) msg_buf, 0, E2P_MSG_BUF_SIZE); + + msg_buf[0] = (unsigned char) (offset >> 8); + msg_buf[1] = (unsigned char) (offset & 0x00ff); + + memcpy((void *) &msg_buf[2], data_buf, len); + + //GetDeviceSlaveAddress(&tmp_dev_slave_addr); + + //showboz + msg.addr = // + //tmp_dev_slave_addr//0; + msg.flags = I2C_M_WR; + msg.len = 2 + len; + msg.buf = msg_buf; + ctl_data.nmsgs = 1; + ctl_data.msgs = &msg; + + SetWriteProtectStatus (CC_SSM_PROTECT_OFF); + + tmp_ret = ioctl(device_fd, I2C_RDWR, &ctl_data); + + SetWriteProtectStatus (CC_SSM_PROTECT_ON); + + if (tmp_ret < 0) { + LOGE("%s, ioctl failed, error %d (%s).\n", "TV", errno, strerror(errno)); + + CloseDevice(&device_fd); + return -1; + } + + if (device_use_buffer && device_buf != NULL) { + memcpy((void *) (device_buf + offset), (void *) data_buf, len); + } + + CloseDevice(&device_fd); + + msleep(10); + + return 0; +}*/ + +/*int CBlobDeviceE2prom::ReadSpecialBytes(int offset, int len, unsigned char data_buf[]) { + int i = 0, tmp_ret = 0; + int device_fd = CC_ERR_FILE_HANDLE; + int tmp_dev_slave_addr = 0; + struct i2c_rdwr_ioctl_data ctl_data; + struct i2c_msg msg; + unsigned char msg_buf[E2P_MSG_BUF_SIZE]; + + if (CheckDeviceWrAvaliable(offset, len) < 0) { + return -1; + } + + if (device_use_buffer && device_buf != NULL) { + memcpy((void *) data_buf, (void *) (device_buf + offset), len); + return 0; + } + + device_fd = OpenDevice(); + if (device_fd == CC_ERR_FILE_HANDLE) { + return -1; + } + + //GetDeviceSlaveAddress(&tmp_dev_slave_addr); + + msg_buf[0] = (unsigned char) (offset >> 8); + msg_buf[1] = (unsigned char) (offset & 0x00ff); + msg.addr = tmp_dev_slave_addr; + msg.flags = I2C_M_WR; + msg.len = 2; + msg.buf = msg_buf; + ctl_data.nmsgs = 1; + ctl_data.msgs = &msg; + + tmp_ret = ioctl(device_fd, I2C_RDWR, &ctl_data); + + if (tmp_ret < 0) { + LOGE("%s, ioctl failed(erase), error %d (%s).\n", "TV", errno, strerror(errno)); + CloseDevice(&device_fd); + return -1; + } + + msg.addr = tmp_dev_slave_addr; + msg.flags |= I2C_M_RD; + msg.len = len; + msg.buf = data_buf; + ctl_data.nmsgs = 1; + ctl_data.msgs = &msg; + tmp_ret = ioctl(device_fd, I2C_RDWR, &ctl_data); + if (tmp_ret < 0) { + LOGE("%s, ioctl failed, error %d (%s).\n", "TV", errno, strerror(errno)); + CloseDevice(&device_fd); + return -1; + } + + CloseDevice(&device_fd); + + msleep(10); + + return 0; +} + +int CTvSettingDeviceE2prom::ValidOperateCheck() { + int tmp_dev_total_size = 0; + int tmp_dev_start_offset = 0; + int tmp_dev_end_offset = 0; + + if (gFilePathBuf == NULL) { + LOGE("%s, Device file name is NULL.\n", "TV"); + return -1; + } + + if (IsFileExist(gFilePathBuf) < 0) { + LOGE("%s, Device file is not exist.\n", "TV"); + return -1; + } + + tmp_dev_total_size = GetDeviceTotalSize(); + if (tmp_dev_total_size < 0) { + LOGE("%s, Device file total size must be greater than or euqal to 0.\n", "TV"); + return -1; + } + + //GetDeviceRWStartOffset(&tmp_dev_start_offset); + //if (tmp_dev_start_offset < 0) { + // LOGE("%s, Device file r/w start offset must be greater than or euqal to 0.\n", "TV"); + // return -1; + //} + + //GetDeviceRWEndOffset(&tmp_dev_end_offset); + //if (tmp_dev_end_offset < 0) { + // LOGE("%s, Device file r/w end offset must be more than 0.\n", "TV"); + // return -1; + //} + + //if (tmp_dev_end_offset - tmp_dev_start_offset + 1 > tmp_dev_total_size) { + // LOGE("%s, end offset (%d) - start offset (%d) + 1 is more than total size(%d).\n", "TV", tmp_dev_end_offset, tmp_dev_start_offset, tmp_dev_total_size); + // return -1; + //} + + return 0; +}*/ diff --git a/tvapi/libtv/tvsetting/CBlobDeviceE2prom.h b/tvapi/libtv/tvsetting/CBlobDeviceE2prom.h new file mode 100644 index 0000000..189cc15 --- a/dev/null +++ b/tvapi/libtv/tvsetting/CBlobDeviceE2prom.h @@ -0,0 +1,77 @@ +#ifndef BLOB_E2PROM_H +#define BLOB_E2PROM_H + +#include "CBlobDevice.h" + +#define I2C_RETRIES 0x0701 /* number of times a device address + should be polled when not + acknowledging */ +#define I2C_TIMEOUT 0x0702 /* set timeout in units of 10 ms */ + +/* NOTE: Slave address is 7 or 10 bits, but 10-bit addresses + * are NOT supported! (due to code brokenness) + */ +#define I2C_SLAVE 0x0703 /* Use this slave address */ +#define I2C_SLAVE_FORCE 0x0706 /* Use this slave address, even if it + is already in use by a driver! */ +#define I2C_TENBIT 0x0704 /* 0 for 7 bit addrs, != 0 for 10 bit */ +#define I2C_FUNCS 0x0705 /* Get the adapter functionality mask */ +#define I2C_RDWR 0x0707 /* Combined R/W transfer (one STOP only) */ +#define I2C_PEC 0x0708 /* != 0 to use PEC with SMBus */ +#define I2C_SMBUS 0x0720 /* SMBus transfer */ + +struct i2c_msg { + unsigned short addr; /* slave address */ + unsigned short flags; +#define I2C_M_TEN 0x0010 /* this is a ten bit chip address */ +#define I2C_M_WR 0x0000 /* write data, from master to slave */ +#define I2C_M_RD 0x0001 /* read data, from slave to master */ +#define I2C_M_NOSTART 0x4000 /* if I2C_FUNC_PROTOCOL_MANGLING */ +#define I2C_M_REV_DIR_ADDR 0x2000 /* if I2C_FUNC_PROTOCOL_MANGLING */ +#define I2C_M_IGNORE_NAK 0x1000 /* if I2C_FUNC_PROTOCOL_MANGLING */ +#define I2C_M_NO_RD_ACK 0x0800 /* if I2C_FUNC_PROTOCOL_MANGLING */ +#define I2C_M_RECV_LEN 0x0400 /* length will be first received byte */ + + unsigned short len; /* msg length */ + unsigned char *buf; /* pointer to msg data */ +}; + +struct i2c_rdwr_ioctl_data { + struct i2c_msg *msgs; + unsigned int nmsgs; +}; + +// 24C64 eeprom +#define E2P_MSG_BUF_SIZE (34) + +class CBlobDeviceE2prom: public CBlobDevice +{ + +public: + CBlobDeviceE2prom(); + virtual ~CBlobDeviceE2prom(); + + virtual int WriteBytes(int offset, int size, unsigned char *buf); + virtual int ReadBytes(int offset, int size, unsigned char *buf); + virtual int EraseAllData(); + virtual int InitCheck(); + virtual int OpenDevice(); + virtual int CloseDevice(); + +private: + +private: + /*int E2P_DEV_TOTAL_SIZE; + int E2P_DEV_RW_START_OFFSET; + int E2P_DEV_RW_END_OFFSET; + int E2P_DEV_W_PAGE_SIZE; + int E2P_DEV_R_PAGE_SIZE; + int E2P_DEV_SLAVE_ADDR; + int E2P_DEV_RW_TEST_OFFSET; + int device_use_buffer; + unsigned char *device_buf; + char gFilePathBuf[CC_MAX_FILE_PATH];*/ +}; + + +#endif diff --git a/tvapi/libtv/tvsetting/CBlobDeviceFile.cpp b/tvapi/libtv/tvsetting/CBlobDeviceFile.cpp new file mode 100644 index 0000000..03cd45b --- a/dev/null +++ b/tvapi/libtv/tvsetting/CBlobDeviceFile.cpp @@ -0,0 +1,80 @@ +#include <stdio.h> +#include <unistd.h> +#include <string.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <errno.h> +#include "tvconfig/tvconfig.h" +#include "CBlobDeviceFile.h" +#include "CTvLog.h" + + + +#define LOG_TAG "BLOB_FILE" + +CBlobDeviceFile::CBlobDeviceFile() +{ + m_dev_total_size = 4 * 1024; + m_dev_fd = -1; + mDataBuf = new unsigned char[m_dev_total_size]; + + const char *device_path = config_get_str("SETTING", "device_path", "/param/default_data"); + const char *device_size = config_get_str("SETTING", "device_size", "0x1000"); + strcpy(m_dev_path, device_path); +} + +CBlobDeviceFile::~CBlobDeviceFile() +{ + if (mDataBuf != NULL) { + delete mDataBuf; + mDataBuf = NULL; + } + CloseDevice(); +} + +int CBlobDeviceFile::WriteBytes(int offset, int size, unsigned char *buf) +{ + + lseek(m_dev_fd, offset, SEEK_SET); + write(m_dev_fd, buf, size); + //not need + //fsync(device_fd); + return 0; +} +int CBlobDeviceFile::ReadBytes(int offset, int size, unsigned char *buf) +{ + lseek(m_dev_fd, offset, SEEK_SET); + read(m_dev_fd, buf, size); + return 0; +} +int CBlobDeviceFile::EraseAllData() +{ + return 0; +} +int CBlobDeviceFile::InitCheck() +{ + return 0; +} + +int CBlobDeviceFile::OpenDevice() +{ + if (strlen(m_dev_path) <= 0) return -1; + + m_dev_fd = open(m_dev_path, O_RDWR | O_SYNC | O_CREAT, S_IRUSR | S_IWUSR); + + if (m_dev_fd < 0) { + LOGE("%s, Open device file \"%s\" error: %s.\n", "TV", m_dev_path, strerror(errno)); + return -1; + } + + return 0; +} + +int CBlobDeviceFile::CloseDevice() +{ + if (m_dev_fd >= 0) { + close(m_dev_fd); + m_dev_fd = -1; + } + return 0; +} diff --git a/tvapi/libtv/tvsetting/CBlobDeviceFile.h b/tvapi/libtv/tvsetting/CBlobDeviceFile.h new file mode 100644 index 0000000..3d59685 --- a/dev/null +++ b/tvapi/libtv/tvsetting/CBlobDeviceFile.h @@ -0,0 +1,27 @@ +#ifndef _BLOB_FILE_H_ +#define _BLOB_FILE_H_ + +#include "CBlobDevice.h" +class CBlobDeviceFile: public CBlobDevice +{ + +public: + CBlobDeviceFile(); + virtual ~CBlobDeviceFile(); + + virtual int WriteBytes(int offset, int size, unsigned char *buf); + virtual int ReadBytes(int offset, int size, unsigned char *buf); + virtual int EraseAllData(); + virtual int InitCheck(); + virtual int OpenDevice(); + virtual int CloseDevice(); + +private: + int ValidOperateCheck(); + int CreateNewFile(const char *file_name); + +private: + +}; + +#endif // ANDROID_SSM_FILE_H diff --git a/tvapi/libtv/tvsetting/CBlobDeviceRam.cpp b/tvapi/libtv/tvsetting/CBlobDeviceRam.cpp new file mode 100644 index 0000000..c938be7 --- a/dev/null +++ b/tvapi/libtv/tvsetting/CBlobDeviceRam.cpp @@ -0,0 +1,129 @@ +#include <stdio.h> +#include <string.h> + +#include <android/log.h> + +#include "CTvSettingDeviceRam.h" + +#define LOG_TAG "ssmram" +#include "CTvLog.h" + +CTvSettingDeviceRam::CTvSettingDeviceRam() +{ + RAM_DEV_TOTAL_SIZE = 4 * 1024; + RAM_DEV_RW_START_OFFSET = 0; + RAM_DEV_RW_END_OFFSET = RAM_DEV_TOTAL_SIZE - 1; + RAM_DEV_W_PAGE_SIZE = 32; + RAM_DEV_R_PAGE_SIZE = 32; + RAM_DEV_SLAVE_ADDR = (0xA0 >> 1); + RAM_DEV_RW_TEST_OFFSET = -1; + device_use_buffer = 0; + device_buf = NULL; + gFilePathBuf[0] = '\0'; +} + +CTvSettingDeviceRam::~CTvSettingDeviceRam() +{ +} + +int CTvSettingDeviceRam::GetDeviceTotalSize() +{ + return 0; +} +int CTvSettingDeviceRam::InitCheck() +{ + int tmp_dev_total_size = 0; + + if (device_buf == NULL) { + tmp_dev_total_size = GetDeviceTotalSize(); + if (tmp_dev_total_size <= 0) { + LOGE("%s, Device file size must be more than 0.\n", "TV"); + return -1; + } + + device_buf = new unsigned char[tmp_dev_total_size]; + if (device_buf == NULL) { + return -1; + } + + memset((void *) device_buf, CC_INIT_BYTE_VAL, tmp_dev_total_size); + } + + return 0; +} + +int CTvSettingDeviceRam::OpenDevice() +{ + return 0; +} + +int CTvSettingDeviceRam::CloseDevice(int *device_fd) +{ + + + return 0; +} + +int CTvSettingDeviceRam::CheckDeviceWrAvaliable(int offset, int len) +{ + /*int tmp_dev_start_offset = 0; + int tmp_dev_end_offset = 0; + + GetDeviceRWStartOffset(&tmp_dev_start_offset); + if (tmp_dev_start_offset < 0) { + LOGE("%s, Device file r/w start offset must be greater than or euqal to 0.\n", "TV"); + return -1; + } + + GetDeviceRWEndOffset(&tmp_dev_end_offset); + if (tmp_dev_end_offset < 0) { + LOGE("%s, Device file r/w end offset must be more than 0.\n", "TV"); + return -1; + } + + if (len <= 0) { + LOGE("%s, The w/r length should be more than 0.\n", "TV"); + return -1; + } + + if ((len + tmp_dev_start_offset + offset) > tmp_dev_end_offset + 1) { + LOGE("%s, w/r would be overflow!!! len = %d, start offset = %d, offset = %d, end offset = %d.\n", "TV", len, tmp_dev_start_offset, offset, tmp_dev_end_offset); + return -1; + } + + if (ValidOperateCheck() < 0) { + return -1; + }*/ + + return 0; +} + +int CTvSettingDeviceRam::WriteSpecialBytes(int offset, int len, unsigned char data_buf[]) +{ + int tmp_dev_w_page_size = 0; + + //GetDeviceWritePageSize(&tmp_dev_w_page_size); + //if (len > tmp_dev_w_page_size) { + // LOGE("%s, The write length should be less than page size(%d).\n", "TV", tmp_dev_w_page_size); + // return -1; + // } + + if (CheckDeviceWrAvaliable(offset, len) < 0) { + return -1; + } + + memcpy((void *) (device_buf + offset), (void *) data_buf, len); + + return 0; +} + +int CTvSettingDeviceRam::ReadSpecialBytes(int offset, int len, unsigned char data_buf[]) +{ + if (CheckDeviceWrAvaliable(offset, len) < 0) { + return -1; + } + + memcpy((void *) data_buf, (void *) (device_buf + offset), len); + + return 0; +} diff --git a/tvapi/libtv/tvsetting/CBlobDeviceRam.h b/tvapi/libtv/tvsetting/CBlobDeviceRam.h new file mode 100644 index 0000000..6165bb9 --- a/dev/null +++ b/tvapi/libtv/tvsetting/CBlobDeviceRam.h @@ -0,0 +1,38 @@ +#ifndef TV_SETTING_RAM_H +#define TV_SETTING_RAM_H + +#include "CTvSettingBaseDevice.h" + +class CTvSettingDeviceRam: public CTvSettingBaseDevice +{ + +public: + CTvSettingDeviceRam(); + virtual ~CTvSettingDeviceRam(); + + virtual int InitCheck(); + virtual int OpenDevice(); + virtual int CloseDevice(int *device_fd); + virtual int GetDeviceTotalSize(); + + virtual int CheckDeviceWrAvaliable(int offset, int len); + virtual int WriteSpecialBytes(int offset, int len, unsigned char data_buf[]); + virtual int ReadSpecialBytes(int offset, int len, unsigned char data_buf[]); + +private: + int ValidOperateCheck(); + +private: + int RAM_DEV_TOTAL_SIZE; + int RAM_DEV_RW_START_OFFSET; + int RAM_DEV_RW_END_OFFSET; + int RAM_DEV_W_PAGE_SIZE; + int RAM_DEV_R_PAGE_SIZE; + int RAM_DEV_SLAVE_ADDR; + int RAM_DEV_RW_TEST_OFFSET; + int device_use_buffer; + unsigned char *device_buf; + char gFilePathBuf[CC_MAX_FILE_PATH]; +}; + +#endif // ANDROID_SSM_RAM_H diff --git a/tvapi/libtv/tvsetting/CTvSetting.cpp b/tvapi/libtv/tvsetting/CTvSetting.cpp new file mode 100644 index 0000000..97417d8 --- a/dev/null +++ b/tvapi/libtv/tvsetting/CTvSetting.cpp @@ -0,0 +1,2212 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <fcntl.h> +#include <errno.h> +#include <sys/stat.h> +#include <sys/wait.h> +#include <cutils/properties.h> + +#include <netinet/ether.h> +#include <netinet/if_ether.h> + +#include <netutils/ifc.h> +#include <netutils/dhcp.h> + +#include "CTvSetting.h" + +#include "../tvconfig/tvconfig.h" +#include "../audio/audio_api.h" + +#include "../tv/CTvLog.h" +#define CC_DEF_CHARACTER_CHAR_VAL (0x8A) + +pthread_mutex_t ssm_r_w_op_mutex = PTHREAD_MUTEX_INITIALIZER; + +/************************ Start APIs For UI ************************/ + +CTvSettingDeviceFactory *mpSettingDeviceFactory = NULL; +CBlobDevice *mpCurDevice = NULL; + +bool CTvSettingLoad() +{ + mpSettingDeviceFactory = new CTvSettingDeviceFactory(); + mpCurDevice = mpSettingDeviceFactory->getSaveDeviceFromConfigFile(); + if (mpCurDevice == NULL) { + LOGD("%s, CTvSettingLoad = NULL", "TV"); + return false; + } else { + mpCurDevice->OpenDevice(); + } + return true; +} + +bool CTvSettingunLoad() +{ + if (mpSettingDeviceFactory != NULL) { + delete mpSettingDeviceFactory; + mpSettingDeviceFactory = NULL; + } + return true; +} + +template<typename T> +static int SSMWriteNTypes(int offset, int data_len, T *data_buf) +{ + pthread_mutex_lock(&ssm_r_w_op_mutex); + + if (data_buf == NULL) { + LOGE("%s, data_buf is NULL.\n", "TV"); + + pthread_mutex_unlock(&ssm_r_w_op_mutex); + return -1; + } + + if (mpCurDevice == NULL) { + LOGE("%s, ssm_device is NULL.\n", "TV"); + + pthread_mutex_unlock(&ssm_r_w_op_mutex); + return -1; + } + + if (mpCurDevice->WriteBytes(offset, data_len * sizeof(T), + (unsigned char *) data_buf) < 0) { + LOGE("%s, device WriteNBytes error.\n", "TV"); + + pthread_mutex_unlock(&ssm_r_w_op_mutex); + return -1; + } + + pthread_mutex_unlock(&ssm_r_w_op_mutex); + return 0; +} + +template<typename T> +static int SSMReadNTypes(int offset, int data_len, T *data_buf) +{ + pthread_mutex_lock(&ssm_r_w_op_mutex); + + if (data_buf == NULL) { + LOGE("%s, data_buf is NULL.\n", "TV"); + + pthread_mutex_unlock(&ssm_r_w_op_mutex); + return -1; + } + + if (mpCurDevice == NULL) { + LOGE("%s, ssm_device is NULL.\n", "TV"); + + pthread_mutex_unlock(&ssm_r_w_op_mutex); + return -1; + } + + if (mpCurDevice->ReadBytes(offset, data_len * sizeof(T), + (unsigned char *) data_buf) < 0) { + LOGE("%s, device ReadNBytes error.\n", "TV"); + pthread_mutex_unlock(&ssm_r_w_op_mutex); + return -1; + } + + pthread_mutex_unlock(&ssm_r_w_op_mutex); + return 0; +} +int SSMSaveFlash_One_N310_N311(int offset, int rw_val) +{ + unsigned char tmp_val = rw_val; + LOGD ( "~~~ SSMSaveFlash_One ~~~##offset %d##rw_val %d##" , offset, rw_val); + + return SSMWriteNTypes(offset, 1, &tmp_val); +} + +int SSMReadFlash_One_N310_N311(int offset) +{ + unsigned char tmp_val = 0; + + if (SSMReadNTypes(offset, 1, &tmp_val) < 0) { + return -1; + } + LOGD ( "~~~ SSMReadFlash_One ~~~##offset %d##rw_val %d##" , offset, tmp_val); + + return tmp_val; +} + +int SSMSaveFlash_N_N310_N311(int offset, int data_len, int *data_buf) +{ + int i = 0; + unsigned char *ptr = NULL; + + ptr = new unsigned char[data_len]; + + if (ptr != NULL) { + for (i = 0; i < data_len; i++) { + ptr[i] = data_buf[i]; + } + } else { + delete ptr; + ptr = NULL; + + return -1; + } + + if (SSMWriteNTypes(offset, data_len, ptr) < 0) { + delete ptr; + ptr = NULL; + + return -1; + } + + delete ptr; + ptr = NULL; + + return 0; +} + +int SSMReadFlash_N_N310_N311(int offset, int data_len, int *data_buf) +{ + int i = 0; + unsigned char *ptr = NULL; + + ptr = new unsigned char[data_len]; + + if (ptr != NULL) { + if (SSMReadNTypes(offset, data_len, ptr) < 0) { + delete ptr; + ptr = NULL; + + return -1; + } + } else { + delete ptr; + ptr = NULL; + + return -1; + } + + for (i = 0; i < data_len; i++) { + data_buf[i] = ptr[i]; + } + + delete ptr; + ptr = NULL; + + return 0; +} +int EEPWriteOneByte(int offset, unsigned char *data_buf) +{ + int fd = 0; + const char *device_path = config_get_str("SETTING", "peripheral.eeprom.path", "/sys/devices/i2c-2/2-0050/eeprom"); + pthread_mutex_lock(&ssm_r_w_op_mutex); + + LOGD ( "~~~EEPWriteOneByte~~~##offset %d##rw_val %s##" , offset, data_buf); + + if (data_buf == NULL) { + LOGE("%s, data_buf is NULL.\n", "TV"); + + pthread_mutex_unlock(&ssm_r_w_op_mutex); + return -1; + } + + fd = open(device_path, O_RDWR); + + if (fd < 0) { + LOGE("%s, ####i2c test device open failed####.\n", "TV"); + + pthread_mutex_unlock(&ssm_r_w_op_mutex); + return -1; + } + + lseek(fd, offset, SEEK_SET); + + if (write(fd, data_buf, 1) < 0) { + LOGE("%s, device WriteOneBytes error.\n", "TV"); + + pthread_mutex_unlock(&ssm_r_w_op_mutex); + return -1; + } + + close(fd); + + LOGE("%s, device WriteOneBytes OK.\n", "TV"); + + pthread_mutex_unlock(&ssm_r_w_op_mutex); + return 0; +} + +int EEPReadOneByte(int offset , unsigned char *data_buf) +{ + int fd = 0; + //const char* device_type = config_get_str("SETTING", "peripheral.eeprom.device", "disable"); + const char *device_path = config_get_str("SETTING", "peripheral.eeprom.path", "/sys/devices/i2c-2/2-0050/eeprom"); + + pthread_mutex_lock(&ssm_r_w_op_mutex); + + if (data_buf == NULL) { + LOGE("%s, data_buf is NULL.\n", "TV"); + + pthread_mutex_unlock(&ssm_r_w_op_mutex); + return -1; + } + + fd = open(device_path, O_RDWR); + + if (fd < 0) { + LOGE("%s, ssm_device is NULL.\n", "TV"); + + pthread_mutex_unlock(&ssm_r_w_op_mutex); + return -1; + } + lseek(fd, offset, SEEK_SET); + + if (read(fd, data_buf, 1) < 0) { + LOGE("%s, device ReadOneBytes error.\n", "TV"); + pthread_mutex_unlock(&ssm_r_w_op_mutex); + return -1; + } + + close(fd); + + LOGD ( "~~~EEPReadOneByte~~~##offset %d##rw_val %d##" , offset, data_buf); + + pthread_mutex_unlock(&ssm_r_w_op_mutex); + return 0; +} + +int EEPWriteNByte(int offset, int data_len, unsigned char *data_buf) +{ + int fd = 0; + const char *device_path = config_get_str("SETTING", "peripheral.eeprom.path", "/sys/devices/i2c-2/2-0050/eeprom"); + pthread_mutex_lock(&ssm_r_w_op_mutex); + + LOGD ( "~~~EEPWriteNByte~~~##offset %d##data_len %d##" , offset, data_len); + + if (data_buf == NULL) { + LOGE("%s, data_buf is NULL.\n", "TV"); + + pthread_mutex_unlock(&ssm_r_w_op_mutex); + return -1; + } + + fd = open(device_path, O_RDWR); + + if (fd < 0) { + LOGE("%s, ####i2c test device open failed####.\n", "TV"); + + pthread_mutex_unlock(&ssm_r_w_op_mutex); + return -1; + } + + lseek(fd, offset, SEEK_SET); + + if (write(fd, data_buf, data_len) < 0) { + LOGE("%s, device WriteNBytes error.\n", "TV"); + + pthread_mutex_unlock(&ssm_r_w_op_mutex); + return -1; + } + + close(fd); + + LOGE("%s, device WriteNBytes OK.\n", "TV"); + + pthread_mutex_unlock(&ssm_r_w_op_mutex); + return 0; +} +int EEPReadNByte(int offset, int data_len, unsigned char *data_buf) +{ + int fd = 0; + const char *device_path = config_get_str("SETTING", "peripheral.eeprom.path", "/sys/devices/i2c-2/2-0050/eeprom"); + pthread_mutex_lock(&ssm_r_w_op_mutex); + + if (data_buf == NULL) { + LOGE("%s, data_buf is NULL.\n", "TV"); + + pthread_mutex_unlock(&ssm_r_w_op_mutex); + return -1; + } + + fd = open(device_path, O_RDWR); + + if (fd < 0) { + LOGE("%s, ssm_device is NULL.\n", "TV"); + + pthread_mutex_unlock(&ssm_r_w_op_mutex); + return -1; + } + lseek(fd, offset, SEEK_SET); + + if (read(fd, data_buf, data_len) < 0) { + LOGE("%s, device ReadNBytes error.\n", "TV"); + + pthread_mutex_unlock(&ssm_r_w_op_mutex); + return -1; + } + + close(fd); + + LOGD ( "~~~EEPReadNByte~~~##offset %d##data_len %d##" , offset, data_len); + + pthread_mutex_unlock(&ssm_r_w_op_mutex); + return 0; +} + + +int SSMSaveEEP_One_N310_N311(int offset, int rw_val) +{ + unsigned char tmp_val = rw_val; + const char *device_config = config_get_str("SETTING", "peripheral.eeprom.device", "disable"); + + if (strcmp(device_config, "enable") != 0) { + LOGD ( "~~~ SSMSaveEEP_One ~~~##peripheral.eeprom.device error##"); + return -1; + } + LOGD ( "~~~SSMSaveEEP_One~~~##offset %d##rw_val %d##" , offset, rw_val); + + return EEPWriteOneByte(offset, &tmp_val); +} + +int SSMReadEEP_One_N310_N311(int offset) +{ + unsigned char tmp_val = 0; + const char *device_config = config_get_str("SETTING", "peripheral.eeprom.device", "disable"); + + if (strcmp(device_config, "enable") != 0) { + LOGD ( "~~~ SSMReadEEP_One ~~~##peripheral.eeprom.device error##"); + return -1; + } + + if (EEPReadOneByte(offset, &tmp_val) < 0) { + return -1; + } + LOGD ( "~~~SSMReadEEP_One~~~##offset %d##rw_val %d##" , offset, tmp_val); + + return tmp_val; +} + +int SSMSaveEEP_N_N310_N311(int offset, int data_len, int *data_buf) +{ + int i = 0; + unsigned char *ptr = NULL; + const char *device_config = config_get_str("SETTING", "peripheral.eeprom.device", "disable"); + + if (strcmp(device_config, "enable") != 0) { + LOGD ( "~~~ SSMSaveEEP_N ~~~##peripheral.eeprom.device error##"); + return -1; + } + + ptr = new unsigned char[data_len]; + + if (ptr != NULL) { + for (i = 0; i < data_len; i++) { + ptr[i] = data_buf[i]; + } + } else { + delete ptr; + ptr = NULL; + + return -1; + } + + if (EEPWriteNByte(offset, data_len, ptr) < 0) { + delete ptr; + ptr = NULL; + + return -1; + } + + delete ptr; + ptr = NULL; + + return 0; +} + +int SSMReadEEP_N_N310_N311(int offset, int data_len, int *data_buf) +{ + int i = 0; + unsigned char *ptr = NULL; + const char *device_config = config_get_str("SETTING", "peripheral.eeprom.device", "disable"); + + if (strcmp(device_config, "enable") != 0) { + LOGD ( "~~~ SSMReadEEP_N ~~~##peripheral.eeprom.device error##"); + return -1; + } + ptr = new unsigned char[data_len]; + + if (ptr != NULL) { + if (EEPReadNByte(offset, data_len, ptr) < 0) { + delete ptr; + ptr = NULL; + + return -1; + } + } else { + delete ptr; + ptr = NULL; + + return -1; + } + + for (i = 0; i < data_len; i++) { + data_buf[i] = ptr[i]; + } + + delete ptr; + ptr = NULL; + + return 0; +} +/************************ Start APIs For UI ************************/ +int MiscSSMRestoreDefault() +{ + SSMSaveFactoryBurnMode(0); + SSMSavePowerOnOffChannel(0); + SSMSaveSystemLanguage(0); + SSMSaveAgingMode(0); + SSMSavePanelType(0); + SSMSavePowerOnMusicSwitch(0); + SSMSavePowerOnMusicVolume(20); + SSMSaveSystemSleepTimer(0xFFFFFFFF); + SSMSaveInputSourceParentalControl(0, 0); + SSMSaveParentalControlSwitch(0); + SSMSaveSerialCMDSwitchValue(0); + SSMSaveBlackoutEnable(0); + return 0; +} + +int MiscSSMFacRestoreDefault() +{ + SSMSaveSystemLanguage(0); + SSMSavePowerOnMusicSwitch(1); + SSMSavePowerOnMusicVolume(20); + SSMSaveSystemSleepTimer(0xFFFFFFFF); + SSMSaveInputSourceParentalControl(0, 0); + SSMSaveParentalControlSwitch(0); + SSMSaveSearchNavigateFlag(1); + SSMSaveInputNumLimit(2); + SSMSaveLocalDimingOnOffFlg(0); + + return 0; +} + +int ReservedSSMRestoreDefault() +{ + SSMSaveBurnWriteCharaterChar(CC_DEF_CHARACTER_CHAR_VAL); + + return 0; +} + +int SSMSaveBurnWriteCharaterChar(int rw_val) +{ + unsigned char tmp_val = rw_val; + + return SSMWriteNTypes(SSM_RSV_W_CHARACTER_CHAR_START, 1, &tmp_val); +} + +int SSMReadBurnWriteCharaterChar() +{ + unsigned char tmp_val = 0; + + if (SSMReadNTypes(SSM_RSV_W_CHARACTER_CHAR_START, 1, &tmp_val) < 0) { + return -1; + } + + return tmp_val; +} + +int SSMSaveFactoryBurnMode(int rw_val) +{ + unsigned char tmp_val = rw_val; + + return SSMWriteNTypes(SSM_RW_FBMF_START, 1, &tmp_val); +} + +int SSMReadFactoryBurnMode() +{ + unsigned char tmp_val = 0; + + if (SSMReadNTypes(SSM_RW_FBMF_START, 1, &tmp_val) < 0) { + return 0; + } + + if (tmp_val != 0) { + return 1; + } + + return 0; +} + +int SSMSavePowerOnOffChannel(int rw_val) +{ + unsigned char tmp_val = rw_val; + return SSMWriteNTypes(SSM_RW_POWER_CHANNEL_START, 1, &tmp_val); +} + +int SSMReadPowerOnOffChannel() +{ + unsigned char tmp_val = 0; + + if (SSMReadNTypes(SSM_RW_POWER_CHANNEL_START, 1, &tmp_val) < 0) { + return 0; + } + return tmp_val; +} + +int SSMSaveLastSelectSourceInput(int rw_val) +{ + unsigned char tmp_val = rw_val; + return SSMWriteNTypes(SSM_RW_LAST_SOURCE_INPUT_START, 1, &tmp_val); +} + +int SSMReadLastSelectSourceInput() +{ + unsigned char tmp_val = 0; + + if (SSMReadNTypes(SSM_RW_LAST_SOURCE_INPUT_START, 1, &tmp_val) < 0) { + return 0; + } + if (tmp_val == CBlobDevice::CC_INIT_BYTE_VAL) { + tmp_val = 0; + } + + return tmp_val; +} + +int SSMSaveSystemLanguage(int rw_val) +{ + unsigned char tmp_val = rw_val; + + return SSMWriteNTypes(SSM_RW_SYS_LANGUAGE_START, 1, &tmp_val); +} + +int SSMReadSystemLanguage() +{ + unsigned char tmp_val = 0; + + if (SSMReadNTypes(SSM_RW_SYS_LANGUAGE_START, 1, &tmp_val) < 0) { + return 0; + } + + if (tmp_val == CBlobDevice::CC_INIT_BYTE_VAL) { + tmp_val = 0; + } + + return tmp_val; +} + +int SSMSaveAgingMode(int rw_val) +{ + unsigned char tmp_val = rw_val; + + return SSMWriteNTypes(SSM_RW_AGING_MODE_START, 1, &tmp_val); +} + +int SSMReadAgingMode() +{ + unsigned char tmp_val = 0; + + if (SSMReadNTypes(SSM_RW_AGING_MODE_START, 1, &tmp_val) < 0) { + return 0; + } + + if (tmp_val == CBlobDevice::CC_INIT_BYTE_VAL) { + tmp_val = 0; + } + + return tmp_val; +} + +int SSMSavePanelType(int rw_val) +{ + unsigned char tmp_val = rw_val; + + return SSMWriteNTypes(SSM_RW_PANEL_TYPE_START, 1, &tmp_val); +} + +int SSMReadPanelType() +{ + unsigned char tmp_val = 0; + + if (SSMReadNTypes(SSM_RW_PANEL_TYPE_START, 1, &tmp_val) < 0) { + return 0; + } + + if (tmp_val == CBlobDevice::CC_INIT_BYTE_VAL) { + tmp_val = 0; + } + + return tmp_val; +} + +int SSMSavePowerOnMusicSwitch(int rw_val) +{ + unsigned char tmp_val = rw_val; + + return SSMWriteNTypes(SSM_RW_POWER_ON_MUSIC_SWITCH_START, 1, &tmp_val); +} + +int SSMReadPowerOnMusicSwitch() +{ + unsigned char tmp_val = 0; + + if (SSMReadNTypes(SSM_RW_POWER_ON_MUSIC_SWITCH_START, 1, &tmp_val) < 0) { + return 0; + } + + if (tmp_val == CBlobDevice::CC_INIT_BYTE_VAL) { + tmp_val = 0; + } + + return tmp_val; +} + +int SSMSavePowerOnMusicVolume(int rw_val) +{ + unsigned char tmp_val = rw_val; + + return SSMWriteNTypes(SSM_RW_POWER_ON_MUSIC_VOL_START, 1, &tmp_val); +} + +int SSMReadPowerOnMusicVolume() +{ + unsigned char tmp_val = 0; + + if (SSMReadNTypes(SSM_RW_POWER_ON_MUSIC_VOL_START, 1, &tmp_val) < 0) { + return 0; + } + + if (tmp_val == CBlobDevice::CC_INIT_BYTE_VAL) { + tmp_val = 0; + } + + return tmp_val; +} + +int SSMSaveSystemSleepTimer(int rw_val) +{ + return SSMWriteNTypes(SSM_RW_SYS_SLEEP_TIMER_START, 1, &rw_val); +} + +int SSMReadSystemSleepTimer() +{ + int tmp_val = 0; + + if (SSMReadNTypes(SSM_RW_SYS_SLEEP_TIMER_START, 1, &tmp_val) < 0) { + return 0; + } + + if (tmp_val < 0) { + tmp_val = 0; + } + + return tmp_val; +} + +int SSMSaveInputSourceParentalControl(int source_index, + unsigned char ctl_flag) +{ + int tmp_val = 0; + + if (source_index < 0 || source_index > 31) { + return -1; + } + + if (ctl_flag != 0 && ctl_flag != 1) { + return -1; + } + + if (SSMReadNTypes(SSM_RW_INPUT_SRC_PARENTAL_CTL_START, 4, + (unsigned char *) &tmp_val) < 0) { + return -1; + } + + tmp_val = (tmp_val & (~(1 << source_index))) | (ctl_flag << source_index); + + return SSMWriteNTypes(SSM_RW_INPUT_SRC_PARENTAL_CTL_START, 4, + (unsigned char *) &tmp_val); +} + +int SSMReadInputSourceParentalControl(int source_index) +{ + int tmp_val = 0; + + if (SSMReadParentalControlSwitch() == 0) { + return 0; + } + + if (SSMReadNTypes(SSM_RW_INPUT_SRC_PARENTAL_CTL_START, 4, + (unsigned char *) &tmp_val) < 0) { + return 0; + } + + if (tmp_val & (1 << source_index)) { + return 1; + } + + return 0; +} + +int SSMSaveParentalControlSwitch(int rw_val) +{ + unsigned char tmp_val = rw_val; + + return SSMWriteNTypes(SSM_RW_PARENTAL_CTL_SWITCH_START, 1, &tmp_val); +} + +int SSMReadParentalControlSwitch() +{ + unsigned char tmp_val = 0; + + if (SSMReadNTypes(SSM_RW_PARENTAL_CTL_SWITCH_START, 1, &tmp_val) < 0) { + return 0; + } + + if (tmp_val != 0) { + tmp_val = 1; + } + + return tmp_val; +} + +int SSMGetCustomerDataStart() +{ + return SSM_RW_CUSTOMER_DATA_START; +} + +int SSMGetCustomerDataLen() +{ + return SSM_RW_CUSTOMER_DATA_LEN; +} + +int SSMGetATVDataStart() +{ + return SSM_RW_ATV_START; +} + +int SSMGetATVDataLen() +{ + return SSM_RW_ATV_LEN; +} + +int SSMGetVPPDataStart() +{ + return SSM_RW_VPP_START; +} + +int SSMGetVPPDataLen() +{ + return SSM_RW_VPP_LEN; +} + +int SSMSaveSearchNavigateFlag(int rw_val) +{ + unsigned char tmp_val = rw_val; + + return SSMWriteNTypes(SSM_RW_SEARCH_NAVIGATE_FLAG_START, 1, &tmp_val); +} + +int SSMReadSearchNavigateFlag() +{ + unsigned char tmp_val = 0; + + if (SSMReadNTypes(SSM_RW_SEARCH_NAVIGATE_FLAG_START, 1, &tmp_val) < 0) { + return 0; + } + + return tmp_val; +} + +int SSMSaveInputNumLimit(int rw_val) +{ + unsigned char tmp_val = rw_val; + + return SSMWriteNTypes(SSM_RW_INPUT_NUMBER_LIMIT_START, 1, &tmp_val); +} + +int SSMReadInputNumLimit() +{ + unsigned char tmp_val = 0; + + if (SSMReadNTypes(SSM_RW_INPUT_NUMBER_LIMIT_START, 1, &tmp_val) < 0) { + return 0; + } + + return tmp_val; +} + +int SSMSaveLocalDimingOnOffFlg(int rw_val) +{ + unsigned char tmp_val = rw_val; + + return SSMWriteNTypes(SSM_RW_LOCAL_DIMING_START, 1, &tmp_val); +} + +int SSMReadLocalDimingOnOffFlg() +{ + unsigned char tmp_val = 0; + + if (SSMReadNTypes(SSM_RW_LOCAL_DIMING_START, 1, &tmp_val) < 0) { + return 0; + } + + return tmp_val; +} + +int SSMSaveVDac2DValue(unsigned short rw_val) +{ + return SSMWriteNTypes(SSM_RW_VDAC_2D_START, 1, &rw_val); +} + +int SSMReadVDac2DValue() +{ + unsigned short tmp_val = 0; + + if (SSMReadNTypes(SSM_RW_VDAC_2D_START, 1, &tmp_val) < 0) { + return 0; + } + + return tmp_val; +} + +int SSMSaveVDac3DValue(unsigned short rw_val) +{ + return SSMWriteNTypes(SSM_RW_VDAC_3D_START, 1, &rw_val); +} + +int SSMReadVDac3DValue() +{ + unsigned short tmp_val = 0; + + if (SSMReadNTypes(SSM_RW_VDAC_3D_START, 1, &tmp_val) < 0) { + return 0; + } + + return tmp_val; +} + +int SSMSaveChromaStatus(int mode) +{ + int fd = -1, ret = -1; + char value[20] = ""; + + sprintf(value, "%d", mode); + + fd = open("/sys/class/tvafe/tvafe0/cvd_reg8a", O_RDWR); + + if (fd < 0) { + LOGE("open /sys/class/tvafe/tvafe0/cvd_reg8a ERROR(%s)!!\n", + strerror(errno)); + return -1; + } + + ret = write(fd, value, strlen(value)); + + close(fd); + + return ret; +} + +int SSMSaveNonStandardValue(unsigned short rw_val) +{ + int i = 0, tmp_ret = 0; + unsigned char data[] = { 0, 0 }; + + { + data[0] = (unsigned char) rw_val; + rw_val >>= 8; + data[1] = (unsigned char) rw_val; + } + + LOGD("%s, save NonStandard_value = %d", "TV", rw_val); + + return SSMWriteNTypes(SSM_RW_NON_STANDARD_START, 2, data); +} + +int SSMReadNonStandardValue(void) +{ + int i = 0, value = 0; + int data[] = { 0, 0 }; + + if (SSMReadNTypes(SSM_RW_NON_STANDARD_START, 2, data) < 0) { + LOGE("%s, read NonStandard_value error.", "TV"); + return 0; + } + + { + value += data[1]; + value <<= 8; + value += data[0]; + } + + LOGD("%s, read NonStandard_value = %d.", "TV", value); + + return value; +} + +int SSMSaveAdbSwitchValue(int rw_val) +{ + unsigned char tmp_val = rw_val; + + return SSMWriteNTypes(SSM_RW_ADB_SWITCH_START, 1, &tmp_val); +} + +int SSMReadAdbSwitchValue(void) +{ + unsigned char switch_val = 0; + + if (SSMReadNTypes(SSM_RW_ADB_SWITCH_START, 1, &switch_val) < 0) { + LOGD("%s, read switch value error", "TV"); + return -1; + } + + LOGD("%s, read switch value = %d", "TV", switch_val); + + return switch_val; +} + +int SSMSaveSerialCMDSwitchValue(int rw_val) +{ + unsigned char tmp_val = rw_val; + + return SSMWriteNTypes(SSM_RW_SERIAL_CMD_SWITCH_START, 1, &tmp_val); +} + +int SSMReadSerialCMDSwitchValue(void) +{ + unsigned char switch_val = 0; + + if (SSMReadNTypes(SSM_RW_SERIAL_CMD_SWITCH_START, 1, &switch_val) < 0) { + LOGD("%s, read switch value error", "TV"); + return -1; + } + + LOGD("%s, read switch value = %d", "TV", switch_val); + + return switch_val; +} + +int SSMSaveNoiseGateThresholdValue(int rw_val) +{ + unsigned char tmp_val = rw_val; + + return SSMWriteNTypes(SSM_RW_NOISE_GATE_THRESHOLD_START, 1, &tmp_val); +} + +int SSMReadNoiseGateThresholdValue(void) +{ + unsigned char tmp_val = 0; + + if (SSMReadNTypes(SSM_RW_NOISE_GATE_THRESHOLD_START, 1, &tmp_val) < 0) { + LOGD("%s, read NoiseGateThreshold error", "TV"); + return -1; + } + + LOGD("%s, read NoiseGateThreshold = %d", "TV", tmp_val); + + return tmp_val; +} + +int SSMSaveGraphyBacklight(int rw_val) +{ + unsigned char tmp_val = rw_val; + + if (rw_val < 0 || rw_val > 100) { + return -1; + } + + return SSMWriteNTypes(SSM_RW_UI_GRHPHY_BACKLIGHT_START, 1, &tmp_val); +} + +int SSMReadGraphyBacklight(void) +{ + unsigned char value = 0; + + if (SSMReadNTypes(SSM_RW_UI_GRHPHY_BACKLIGHT_START, 1, &value) < 0) { + LOGD("%s, read graphybacklight error.\n", "TV"); + return -1; + } + + if (/*value < 0 || */value > 100) { + LOGD("%s, range of graphybacklight (%d) is not between 0-100.\n", + "TV", value); + return -1; + } + + return value; +} + +int SSMSaveFastSuspendFlag(int rw_val) +{ + unsigned char tmp_val = rw_val; + + return SSMWriteNTypes(SSM_RW_FASTSUSPEND_FLAG_START, 1, &tmp_val); +} + +int SSMReadFastSuspendFlag(void) +{ + unsigned char value = 0; + + if (SSMReadNTypes(SSM_RW_FASTSUSPEND_FLAG_START, 1, &value) < 0) { + LOGD("%s, read FastSuspendFlag error.\n", "TV"); + return -1; + } + + return value; +} + +int SSMSaveCABufferSizeValue(unsigned short rw_val) +{ + int i = 0, tmp_ret = 0; + unsigned char data[] = { 0, 0 }; + + { + data[0] = (unsigned char) rw_val; + rw_val >>= 8; + data[1] = (unsigned char) rw_val; + } + + return SSMWriteNTypes(SSM_RW_CA_BUFFER_SIZE_START, 2, data); +} + +int SSMReadCABufferSizeValue(void) +{ + int i = 0, value = 0; + unsigned char data[] = { 0, 0 }; + + if (SSMReadNTypes(SSM_RW_CA_BUFFER_SIZE_START, 2, data) < 0) { + LOGE("%s, read ca_buffer_size error", "TV"); + return 0; + } + + { + value += data[1]; + value <<= 8; + value += data[0]; + } + + return value; +} + +int SSMSaveStandbyMode(int rw_val) +{ + unsigned char tmp_val = rw_val; + + return SSMWriteNTypes(SSM_RW_STANDBY_MODE_FLAG_START, 1, &tmp_val); +} + +int SSMReadStandbyMode() +{ + unsigned char tmp_val = 0; + + if (SSMReadNTypes(SSM_RW_STANDBY_MODE_FLAG_START, 1, &tmp_val) < 0) { + return 0; + } + + return tmp_val; +} + +int SSMSaveHDMIEQMode(int rw_val) +{ + unsigned char tmp_val = rw_val; + + return SSMWriteNTypes(SSM_RW_HDMIEQ_MODE_START, 1, &tmp_val); +} + +int SSMReadHDMIEQMode() +{ + unsigned char tmp_val = 0; + + if (SSMReadNTypes(SSM_RW_HDMIEQ_MODE_START, 1, &tmp_val) < 0) { + return 0; + } + + return tmp_val; +} + +int SSMSaveLogoOnOffFlag(int rw_val) +{ + unsigned char tmp_val = rw_val; + + return SSMWriteNTypes(SSM_RW_LOGO_ON_OFF_FLAG_START, 1, &tmp_val); +} + +int SSMReadLogoOnOffFlag() +{ + unsigned char tmp_val = 0; + + if (SSMReadNTypes(SSM_RW_LOGO_ON_OFF_FLAG_START, 1, &tmp_val) < 0) { + return 0; + } + + return tmp_val; +} + +int SSMSaveHDMIInternalMode(unsigned int rw_val) +{ + int i = 0, tmp_ret = 0; + unsigned char data[] = { 0, 0, 0, 0 }; + + for (i = 3; i >= 0; i--) { + data[i] = (unsigned char) rw_val; + rw_val >>= 8; + } + + return SSMWriteNTypes(SSM_RW_HDMIINTERNAL_MODE_START, 4, data); +} + +int SSMReadHDMIInternalMode() +{ + int i = 0, value = 0; + int data[] = { 0, 0, 0, 0 }; + + if (SSMReadNTypes(SSM_RW_HDMIINTERNAL_MODE_START, 4, data) < 0) { + return 0; + } + + for (i = 0; i < 4; i++) { + value <<= 8; + value += data[i]; + } + + return value; +} + +int SSMSaveParentalControlPassWord(unsigned char *password, int size) +{ + return SSMWriteNTypes(SSM_RW_PARENTAL_CTL_PASSWORD_START, size, password); +} + +int SSMReadParentalControlPassWord(unsigned short *password) +{ + if (SSMReadNTypes(SSM_RW_PARENTAL_CTL_PASSWORD_START, + SSM_RW_PARENTAL_CTL_PASSWORD_LEN, (unsigned char *) password) + < 0) { + return -1; + } + return 0; +} + +int SSMSaveDisable3D(int rw_val) +{ + unsigned char tmp_val = rw_val; + + return SSMWriteNTypes(SSM_RW_DISABLE_3D_START, 1, &tmp_val); +} + +int SSMReadDisable3D() +{ + unsigned char tmp_val = 0; + + if (SSMReadNTypes(SSM_RW_DISABLE_3D_START, 1, &tmp_val) < 0) { + return 0; + } + + if (tmp_val == CBlobDevice::CC_INIT_BYTE_VAL) { + tmp_val = 0; + } + + return tmp_val; +} + +int SSMSaveGlobalOgoEnable(int rw_val) +{ + unsigned char tmp_val = rw_val; + + return SSMWriteNTypes(SSM_RW_GLOBAL_OGO_ENABLE_START, 1, &tmp_val); +} + +int SSMReadGlobalOgoEnable() +{ + unsigned char tmp_val = 0; + + if (SSMReadNTypes(SSM_RW_GLOBAL_OGO_ENABLE_START, 1, &tmp_val) < 0) { + return 0; + } + + if (tmp_val == CBlobDevice::CC_INIT_BYTE_VAL) { + tmp_val = 0; + } + + return tmp_val; +} + +int SSMDeviceMarkCheck() +{ + int i = 0, failed_count = 0; + int mark_offset[3] = { 0, 0, 0 }; + unsigned char mark_values[3] = { 0, 0, 0 }; + unsigned char tmp_ch = 0; + + //read temp one byte + SSMReadNTypes(0, 1, &tmp_ch); + + mark_offset[0] = SSM_MARK_01_START; + mark_offset[1] = SSM_MARK_02_START; + mark_offset[2] = SSM_MARK_03_START; + + mark_values[0] = SSM_MARK_01_VALUE; + mark_values[1] = SSM_MARK_02_VALUE; + mark_values[2] = SSM_MARK_03_VALUE; + + if (SSMReadBurnWriteCharaterChar() != CC_DEF_CHARACTER_CHAR_VAL) { + SSMSaveBurnWriteCharaterChar(CC_DEF_CHARACTER_CHAR_VAL); + } + + failed_count = 0; + for (i = 0; i < 3; i++) { + tmp_ch = 0; + if (SSMReadNTypes(mark_offset[i], 1, &tmp_ch) < 0) { + LOGE("%s, SSMDeviceMarkCheck Read Mark failed!!!\n", "TV"); + break; + } + + if (tmp_ch != mark_values[i]) { + failed_count += 1; + LOGE( + "%s, SSMDeviceMarkCheck Mark[%d]'s offset = %d, Mark[%d]'s Value = %d, read value = %d.\n", + "TV", i, mark_offset[i], i, mark_values[i], tmp_ch); + } + } + + if (failed_count >= 3) { + return -1; + } + + return 0; +} + +int SSMRestoreDeviceMarkValues() +{ + int i; + int mark_offset[3] = { + (int) SSM_MARK_01_START, // + (int) SSM_MARK_02_START, // + (int) SSM_MARK_03_START, // + }; + + unsigned char mark_values[3] = { + // + (unsigned char) SSM_MARK_01_VALUE, (unsigned char) SSM_MARK_02_VALUE, + (unsigned char) SSM_MARK_03_VALUE, // + }; + + for (i = 0; i < 3; i++) { + if (SSMWriteNTypes(mark_offset[i], 1, &(mark_values[i])) < 0) { + LOGD("SSMRestoreDeviceMarkValues Write Mark failed.\n"); + break; + } + } + + if (i < 3) { + return -1; + } + + return 0; +} + +static int SSMGetPreCopyingEnableCfg() +{ + const char *prop_value; + + prop_value = config_get_str("TV", "ssm.precopying.en", "null"); + if (strcmp(prop_value, "null") == 0 || strcmp(prop_value, "0") == 0 + || strcmp(prop_value, "disable") == 0) { + return 0; + } + + return 1; +} + +static int SSMGetPreCopyingDevicePathCfg(char dev_path[]) +{ + const char *prop_value; + + if (dev_path == NULL) { + return -1; + } + + prop_value = config_get_str("TV", "ssm.precopying.devpath", "null"); + if (strcmp(prop_value, "null") == 0) { + return 1; + } + + strcpy(dev_path, prop_value); + + return 0; +} + +static unsigned char gTempDataBuf[4096] = { 0 }; +int SSMHandlePreCopying() +{ + int device_fd = -1; + int i = 0, tmp_size = 0; + unsigned char tmp_ch = 0; + char tmpPreCopyingDevicePath[256] = { '\0' }; + + if (SSMGetPreCopyingEnableCfg() == 0) { + LOGD("%s, Pre copying is disable now.\n", "TV"); + return 0; + } + + //read temp one byte + SSMReadNTypes(0, 1, &tmp_ch); + + SSMGetPreCopyingDevicePathCfg(tmpPreCopyingDevicePath); + + device_fd = open(tmpPreCopyingDevicePath, O_RDONLY); + if (device_fd < 0) { + LOGE("%s, Open device file \"%s\" error: %s.\n", "TV", + tmpPreCopyingDevicePath, strerror(errno)); + return -1; + } + + tmp_size = lseek(device_fd, 0, SEEK_END); + if (tmp_size == 4096) { + lseek(device_fd, 0, SEEK_SET); + read(device_fd, gTempDataBuf, tmp_size); + + SSMWriteNTypes(0, tmp_size, gTempDataBuf); + } + + close(device_fd); + + remove(tmpPreCopyingDevicePath); + + return 0; +} + +int SSMSaveDTVType(int rw_val) +{ + unsigned char tmp_val = rw_val; + + return SSMWriteNTypes(SSM_RW_DTV_TYPE_START, 1, &tmp_val); +} + +int SSMReadDTVType(int *rw_val) +{ + int tmp_ret = 0; + unsigned char tmp_val = 0; + + tmp_ret = SSMReadNTypes(SSM_RW_DTV_TYPE_START, 1, &tmp_val); + *rw_val = tmp_val; + + return tmp_ret; +} + +#ifndef NELEM +# define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0]))) +#endif + +/************************ End APIs For UI ************************/ + +// other api +int GetSSMCfgBufferData(const char *key_str, int *buf_item_count, int radix, + unsigned char data_buf[]) +{ + int cfg_item_count = 0; + char *token = NULL; + const char *strDelimit = ","; + const char *config_value; + char data_str[CC_CFG_VALUE_STR_MAX_LEN] = { 0 }; + + config_value = config_get_str("TV", key_str, "null"); + if (strcasecmp(config_value, "null") == 0) { + LOGE("%s, can't get config \"%s\"!!!\n", "TV", key_str); + return -1; + } + + cfg_item_count = 0; + + memset((void *)data_str, 0, sizeof(data_str)); + strncpy(data_str, config_value, sizeof(data_str) - 1); + + token = strtok(data_str, strDelimit); + while (token != NULL) { + if (cfg_item_count < *buf_item_count) { + data_buf[cfg_item_count] = strtol(token, NULL, radix); + + token = strtok(NULL, strDelimit); + cfg_item_count += 1; + } else { + LOGE("%s, we get data count more than desire count (%d)!!!\n", + "TV", *buf_item_count); + return -1; + } + } + + *buf_item_count = cfg_item_count; + + return 0; +} + +int SSMSaveSourceInput(unsigned char rw_val) +{ + return SSMWriteNTypes(TVIN_DATA_POS_SOURCE_INPUT_START, 1, &rw_val); +} + +int SSMReadSourceInput() +{ + unsigned char tmp_val = 0; + + if (SSMReadNTypes(TVIN_DATA_POS_SOURCE_INPUT_START, 1, &tmp_val) < 0) { + return 0; + } + if (tmp_val == CBlobDevice::CC_INIT_BYTE_VAL) { + tmp_val = 0; + } + + return tmp_val; +} + +int SSMSaveCVBSStd(unsigned char rw_val) +{ + return SSMWriteNTypes(TVIN_DATA_CVBS_STD_START, 1, &rw_val); +} + +int SSMReadCVBSStd(unsigned char *rw_val) +{ + return SSMReadNTypes(TVIN_DATA_CVBS_STD_START, 1, rw_val); +} + +int SSMSave3DMode(unsigned char rw_val) +{ + return SSMWriteNTypes(TVIN_DATA_POS_3D_MODE_START, 1, &rw_val); +} + +int SSMRead3DMode(unsigned char *rw_val) +{ + return SSMReadNTypes(TVIN_DATA_POS_3D_MODE_START, 1, rw_val); +} + +int SSMSave3DLRSwitch(unsigned char rw_val) +{ + return SSMWriteNTypes(TVIN_DATA_POS_3D_LRSWITCH_START, 1, &rw_val); +} + +int SSMRead3DLRSwitch(unsigned char *rw_val) +{ + return SSMReadNTypes(TVIN_DATA_POS_3D_LRSWITCH_START, 1, rw_val); +} + +int SSMSave3DDepth(unsigned char rw_val) +{ + return SSMWriteNTypes(TVIN_DATA_POS_3D_DEPTH_START, 1, &rw_val); +} + +int SSMRead3DDepth(unsigned char *rw_val) +{ + return SSMReadNTypes(TVIN_DATA_POS_3D_DEPTH_START, 1, rw_val); +} + +int SSMSave3DTO2D(unsigned char rw_val) +{ + return SSMWriteNTypes(TVIN_DATA_POS_3D_TO2D_START, 1, &rw_val); +} + +int SSMRead3DTO2D(unsigned char *rw_val) +{ + return SSMReadNTypes(TVIN_DATA_POS_3D_TO2D_START, 1, rw_val); +} + +int SSMSaveBrightness(int offset, int rw_val) +{ + unsigned char tmp_val = rw_val; + + return SSMWriteNTypes(VPP_DATA_POS_BRIGHTNESS_START + offset, 1, &tmp_val); +} + +int SSMReadBrightness(int offset, int *rw_val) +{ + int tmp_ret = 0; + unsigned char tmp_val = 0; + + tmp_ret = SSMReadNTypes(VPP_DATA_POS_BRIGHTNESS_START + offset, 1, + &tmp_val); + *rw_val = tmp_val; + + return tmp_ret; +} + +int SSMSaveContrast(int offset, int rw_val) +{ + unsigned char tmp_val = rw_val; + + return SSMWriteNTypes(VPP_DATA_POS_CONTRAST_START + offset, 1, &tmp_val); +} + +int SSMReadContrast(int offset, int *rw_val) +{ + int tmp_ret = 0; + unsigned char tmp_val = 0; + + tmp_ret = SSMReadNTypes(VPP_DATA_POS_CONTRAST_START + offset, 1, &tmp_val); + *rw_val = tmp_val; + + return tmp_ret; +} + +int SSMSaveSaturation(int offset, int rw_val) +{ + unsigned char tmp_val = rw_val; + + return SSMWriteNTypes(VPP_DATA_POS_SATURATION_START + offset, 1, &tmp_val); +} + +int SSMReadSaturation(int offset, int *rw_val) +{ + int tmp_ret = 0; + unsigned char tmp_val = 0; + + tmp_ret = SSMReadNTypes(VPP_DATA_POS_SATURATION_START + offset, 1, + &tmp_val); + *rw_val = tmp_val; + + return tmp_ret; +} + +int SSMSaveHue(int offset, int rw_val) +{ + unsigned char tmp_val = rw_val; + + return SSMWriteNTypes(VPP_DATA_POS_HUE_START + offset, 1, &tmp_val); +} + +int SSMReadHue(int offset, int *rw_val) +{ + int tmp_ret = 0; + unsigned char tmp_val = 0; + + tmp_ret = SSMReadNTypes(VPP_DATA_POS_HUE_START + offset, 1, &tmp_val); + *rw_val = tmp_val; + + return tmp_ret; +} + +int SSMSaveSharpness(int offset, int rw_val) +{ + unsigned char tmp_val = rw_val; + + return SSMWriteNTypes(VPP_DATA_POS_SHARPNESS_START + offset, 1, &tmp_val); +} + +int SSMReadSharpness(int offset, int *rw_val) +{ + int tmp_ret = 0; + unsigned char tmp_val = 0; + + tmp_ret = SSMReadNTypes(VPP_DATA_POS_SHARPNESS_START + offset, 1, &tmp_val); + *rw_val = tmp_val; + + return tmp_ret; +} + +int SSMSaveSceneMode(int rw_val) +{ + unsigned char tmp_val = rw_val; + + return SSMWriteNTypes(VPP_DATA_POS_SCENE_MODE_START, 1, &tmp_val); +} + +int SSMReadSceneMode(int *rw_val) +{ + int tmp_ret = 0; + unsigned char tmp_val = 0; + + tmp_ret = SSMReadNTypes(VPP_DATA_POS_SCENE_MODE_START, 1, &tmp_val); + *rw_val = tmp_val; + + return tmp_ret; +} + +int SSMSavePictureMode(int offset, int rw_val) +{ + unsigned char tmp_val = rw_val; + + return SSMWriteNTypes(VPP_DATA_POS_PICTURE_MODE_START + offset, 1, &tmp_val); +} + +int SSMReadPictureMode(int offset, int *rw_val) +{ + int tmp_ret = 0; + unsigned char tmp_val = 0; + + tmp_ret = SSMReadNTypes(VPP_DATA_POS_PICTURE_MODE_START + offset, 1, + &tmp_val); + *rw_val = tmp_val; + + return tmp_ret; +} + +int SSMSaveColorTemperature(int offset, int rw_val) +{ + unsigned char tmp_val = rw_val; + + return SSMWriteNTypes(VPP_DATA_POS_COLOR_TEMP_START + offset, 1, &tmp_val); +} + +int SSMReadColorTemperature(int offset, int *rw_val) +{ + int tmp_ret = 0; + unsigned char tmp_val = 0; + + tmp_ret = SSMReadNTypes(VPP_DATA_POS_COLOR_TEMP_START + offset, 1, + &tmp_val); + *rw_val = tmp_val; + + return tmp_ret; +} + +int SSMSaveNoiseReduction(int offset, int rw_val) +{ + unsigned char tmp_val = rw_val; + + return SSMWriteNTypes(VPP_DATA_POS_NOISE_REDUCTION_START + offset, 1, + &tmp_val); +} + +int SSMReadNoiseReduction(int offset, int *rw_val) +{ + int tmp_ret = 0; + unsigned char tmp_val = 0; + + tmp_ret = SSMReadNTypes(VPP_DATA_POS_NOISE_REDUCTION_START + offset, 1, + &tmp_val); + *rw_val = tmp_val; + + return tmp_ret; +} + +int SSMSaveDisplayMode(int offset, int rw_val) +{ + unsigned char tmp_val = rw_val; + + return SSMWriteNTypes(VPP_DATA_POS_DISPLAY_MODE_START + offset, 1, &tmp_val); +} + +int SSMReadDisplayMode(int offset, int *rw_val) +{ + int tmp_ret = 0; + unsigned char tmp_val = 0; + + tmp_ret = SSMReadNTypes(VPP_DATA_POS_DISPLAY_MODE_START + offset, 1, + &tmp_val); + *rw_val = tmp_val; + + return tmp_ret; +} + +int SSMSaveBackLightVal(int offset, int rw_val) +{ + unsigned char tmp_val = rw_val; + + return SSMWriteNTypes(VPP_DATA_POS_BACKLIGHT_START + offset, 1, &tmp_val); +} + +int SSMReadBackLightVal(int offset, int *rw_val) +{ + int tmp_ret = 0; + unsigned char tmp_val = 0; + + tmp_ret = SSMReadNTypes(VPP_DATA_POS_BACKLIGHT_START + offset, 1, &tmp_val); + *rw_val = tmp_val; + + return tmp_ret; +} + +int SSMSaveFBCN360BackLightVal(int rw_val) +{ + unsigned char tmp_val = rw_val; + + return SSMWriteNTypes(VPP_DATA_POS_FBC_BACKLIGHT_START , 1, &tmp_val); +} + +int SSMReadFBCN360BackLightVal(int *rw_val) +{ + int tmp_ret = 0; + unsigned char tmp_val = 0; + + tmp_ret = SSMReadNTypes(VPP_DATA_POS_FBC_BACKLIGHT_START, 1, &tmp_val); + *rw_val = tmp_val; + + return tmp_ret; +} + +int SSMSaveFBCN360ColorTempVal(int rw_val) +{ + unsigned char tmp_val = rw_val; + + return SSMWriteNTypes(VPP_DATA_POS_FBC_COLORTEMP_START , 1, &tmp_val); +} + +int SSMReadFBCN360ColorTempVal(int *rw_val) +{ + int tmp_ret = 0; + unsigned char tmp_val = 0; + + tmp_ret = SSMReadNTypes(VPP_DATA_POS_FBC_COLORTEMP_START, 1, &tmp_val); + *rw_val = tmp_val; + + return tmp_ret; +} + + +int SSMSaveFBCELECmodeVal(int rw_val) +{ + unsigned char tmp_val = rw_val; + return SSMWriteNTypes(VPP_DATA_POS_FBC_ELECMODE_START , 1, &tmp_val); +} + +int SSMReadFBCELECmodeVal(int *rw_val) +{ + int tmp_ret = 0; + unsigned char tmp_val = 0; + + tmp_ret = SSMReadNTypes(VPP_DATA_POS_FBC_ELECMODE_START, 1, &tmp_val); + *rw_val = tmp_val; + + return tmp_ret; +} + + +int SSMSaveColorDemoMode(unsigned char rw_val) +{ + return SSMWriteNTypes(VPP_DATA_POS_COLOR_DEMO_MODE_START, 1, &rw_val); +} + +int SSMReadColorDemoMode(unsigned char *rw_val) +{ + return SSMReadNTypes(VPP_DATA_POS_COLOR_DEMO_MODE_START, 1, rw_val); +} + +int SSMSaveColorBaseMode(unsigned char rw_val) +{ + return SSMWriteNTypes(VPP_DATA_POS_COLOR_BASE_MODE_START, 1, &rw_val); +} + +int SSMReadColorBaseMode(unsigned char *rw_val) +{ + return SSMReadNTypes(VPP_DATA_POS_COLOR_BASE_MODE_START, 1, rw_val); +} + +int SSMSaveRGBGainRStart(int offset, unsigned int rw_val) +{ + return SSMWriteNTypes(VPP_DATA_POS_RGB_GAIN_R_START + offset, 1, &rw_val); +} + +int SSMReadRGBGainRStart(int offset, unsigned int *rw_val) +{ + return SSMReadNTypes(VPP_DATA_POS_RGB_GAIN_R_START + offset, 1, rw_val); +} + +int SSMSaveRGBGainGStart(int offset, unsigned int rw_val) +{ + return SSMWriteNTypes(VPP_DATA_POS_RGB_GAIN_G_START + offset, 1, &rw_val); +} + +int SSMReadRGBGainGStart(int offset, unsigned int *rw_val) +{ + return SSMReadNTypes(VPP_DATA_POS_RGB_GAIN_G_START + offset, 1, rw_val); +} + +int SSMSaveRGBGainBStart(int offset, unsigned int rw_val) +{ + return SSMWriteNTypes(VPP_DATA_POS_RGB_GAIN_B_START + offset, 1, &rw_val); +} + +int SSMReadRGBGainBStart(int offset, unsigned int *rw_val) +{ + return SSMReadNTypes(VPP_DATA_POS_RGB_GAIN_B_START + offset, 1, rw_val); +} + +int SSMSaveRGBPostOffsetRStart(int offset, int rw_val) +{ + return SSMWriteNTypes(VPP_DATA_POS_RGB_POST_OFFSET_R_START + offset, 1, + &rw_val); +} + +int SSMReadRGBPostOffsetRStart(int offset, int *rw_val) +{ + return SSMReadNTypes(VPP_DATA_POS_RGB_POST_OFFSET_R_START + offset, 1, + rw_val); +} + +int SSMSaveRGBPostOffsetGStart(int offset, int rw_val) +{ + return SSMWriteNTypes(VPP_DATA_POS_RGB_POST_OFFSET_G_START + offset, 1, + &rw_val); +} + +int SSMReadRGBPostOffsetGStart(int offset, int *rw_val) +{ + return SSMReadNTypes(VPP_DATA_POS_RGB_POST_OFFSET_G_START + offset, 1, + rw_val); +} + +int SSMSaveRGBPostOffsetBStart(int offset, int rw_val) +{ + return SSMWriteNTypes(VPP_DATA_POS_RGB_POST_OFFSET_B_START + offset, 1, + &rw_val); +} + +int SSMReadRGBPostOffsetBStart(int offset, int *rw_val) +{ + return SSMReadNTypes(VPP_DATA_POS_RGB_POST_OFFSET_B_START + offset, 1, + rw_val); +} + +int SSMSaveRGBValueStart(int offset, int8_t rw_val) +{ + return SSMWriteNTypes(VPP_DATA_RGB_START + offset, 1, &rw_val); +} + +int SSMReadRGBValueStart(int offset, int8_t *rw_val) +{ + return SSMReadNTypes(VPP_DATA_RGB_START + offset, 1, &rw_val); +} + +int SSMSaveDBCStart(unsigned char rw_val) +{ + return SSMWriteNTypes(VPP_DATA_POS_DBC_START, 1, &rw_val); +} + +int SSMReadDBCStart(unsigned char *rw_val) +{ + return SSMReadNTypes(VPP_DATA_POS_DBC_START, 1, rw_val); +} + +int SSMSaveColorSpaceStart(unsigned char rw_val) +{ + return SSMWriteNTypes(VPP_DATA_COLOR_SPACE_START, 1, &rw_val); +} + +int SSMReadColorSpaceStart(unsigned char *rw_val) +{ + return SSMReadNTypes(VPP_DATA_COLOR_SPACE_START, 1, rw_val); +} + +int SSMSaveDnlpStart(unsigned char rw_val) +{ + return SSMWriteNTypes(VPP_DATA_POS_DNLP_START, 1, &rw_val); +} + +int SSMReadDnlpStart(unsigned char *rw_val) +{ + return SSMReadNTypes(VPP_DATA_POS_DNLP_START, 1, rw_val); +} + +int SSMSavePanoramaStart(int offset, unsigned char rw_val) +{ + return SSMWriteNTypes(VPP_DATA_POS_PANORAMA_START + offset, 1, &rw_val); +} + +int SSMReadPanoramaStart(int offset, unsigned char *rw_val) +{ + return SSMReadNTypes(VPP_DATA_POS_PANORAMA_START + offset, 1, rw_val); +} + +int SSMSaveTestPattern(unsigned char rw_val) +{ + return SSMWriteNTypes(VPP_DATA_POS_TEST_PATTERN_START, 1, &rw_val); +} + +int SSMReadTestPattern(unsigned char *rw_val) +{ + return SSMReadNTypes(VPP_DATA_POS_TEST_PATTERN_START, 1, rw_val); +} + +int SSMSaveAPL(unsigned char rw_val) +{ + return SSMWriteNTypes(VPP_DATA_APL_START, VPP_DATA_APL_SIZE, &rw_val); +} + +int SSMReadAPL(unsigned char *rw_val) +{ + return SSMReadNTypes(VPP_DATA_APL_START, VPP_DATA_APL_SIZE, rw_val); +} + +int SSMSaveAPL2(unsigned char rw_val) +{ + return SSMWriteNTypes(VPP_DATA_APL2_START, VPP_DATA_APL2_SIZE, &rw_val); +} + +int SSMReadAPL2(unsigned char *rw_val) +{ + return SSMReadNTypes(VPP_DATA_APL2_START, VPP_DATA_APL2_SIZE, rw_val); +} + +int SSMSaveBD(unsigned char rw_val) +{ + return SSMWriteNTypes(VPP_DATA_BD_START, VPP_DATA_BD_SIZE, &rw_val); +} + +int SSMReadBD(unsigned char *rw_val) +{ + return SSMReadNTypes(VPP_DATA_BD_START, VPP_DATA_BD_SIZE, rw_val); +} + +int SSMSaveBP(unsigned char rw_val) +{ + return SSMWriteNTypes(VPP_DATA_BP_START, VPP_DATA_BP_SIZE, &rw_val); +} + +int SSMReadBP(unsigned char *rw_val) +{ + return SSMReadNTypes(VPP_DATA_BP_START, VPP_DATA_BP_SIZE, rw_val); +} + +int SSMSaveDDRSSC(unsigned char rw_val) +{ + return SSMWriteNTypes(VPP_DATA_POS_DDR_SSC_START, 1, &rw_val); +} + +int SSMReadDDRSSC(unsigned char *rw_val) +{ + return SSMReadNTypes(VPP_DATA_POS_DDR_SSC_START, 1, rw_val); +} + +int SSMSaveLVDSSSC(unsigned char rw_val) +{ + return SSMWriteNTypes(VPP_DATA_POS_LVDS_SSC_START, 1, &rw_val); +} + +int SSMReadLVDSSSC(unsigned char *rw_val) +{ + return SSMReadNTypes(VPP_DATA_POS_LVDS_SSC_START, 1, rw_val); +} + +int SSMSaveDreamPanel(unsigned char rw_val) +{ + return SSMWriteNTypes(VPP_DATA_POS_DREAM_PANEL_START, 1, &rw_val); +} + +int SSMReadDreamPanel(unsigned char *rw_val) +{ + return SSMReadNTypes(VPP_DATA_POS_DREAM_PANEL_START, 1, rw_val); +} + +int SSMSaveUserNatureLightSwitch(unsigned char rw_val) +{ + return SSMWriteNTypes(VPP_DATA_USER_NATURE_SWITCH_START, 1, &rw_val); +} + +int SSMReadUserNatureLightSwitch(unsigned char *rw_val) +{ + return SSMReadNTypes(VPP_DATA_USER_NATURE_SWITCH_START, 1, rw_val); +} + +int SSMSaveDBCBacklightEnable(unsigned char rw_val) +{ + return SSMWriteNTypes(VPP_DATA_DBC_BACKLIGHT_START, 1, &rw_val); +} + +int SSMReadDBCBacklightEnable(unsigned char *rw_val) +{ + return SSMReadNTypes(VPP_DATA_DBC_BACKLIGHT_START, 1, rw_val); +} + +int SSMSaveDBCBacklightStd(unsigned char rw_val) +{ + return SSMWriteNTypes(VPP_DATA_DBC_STANDARD_START, 1, &rw_val); +} + +int SSMReadDBCBacklightStd(unsigned char *rw_val) +{ + return SSMReadNTypes(VPP_DATA_DBC_STANDARD_START, 1, rw_val); +} + +int SSMSaveDBCEnable(unsigned char rw_val) +{ + return SSMWriteNTypes(VPP_DATA_DBC_ENABLE_START, 1, &rw_val); +} + +int SSMReadDBCEnable(unsigned char *rw_val) +{ + return SSMReadNTypes(VPP_DATA_DBC_ENABLE_START, 1, rw_val); +} + +int SSMSaveGammaValue(int rw_val) +{ + unsigned char tmp_val = rw_val; + + return SSMWriteNTypes(VPP_DATA_GAMMA_VALUE_START, 1, &tmp_val); +} + +int SSMReadGammaValue(int *rw_val) +{ + int tmp_ret = 0; + unsigned char tmp_val = 0; + + tmp_ret = SSMReadNTypes(VPP_DATA_GAMMA_VALUE_START, 1, &tmp_val); + *rw_val = tmp_val; + + return tmp_ret; +} + +int SSMSaveBackLightReverse(unsigned char rw_val) +{ + return SSMWriteNTypes(VPP_DATA_POS_BACKLIGHT_REVERSE_START, 1, &rw_val); +} + +int SSMReadBackLightReverse(unsigned char *rw_val) +{ + return SSMReadNTypes(VPP_DATA_POS_BACKLIGHT_REVERSE_START, 1, rw_val); +} + +int SSMSaveAudioMasterVolume(int8_t rw_val) +{ + return SSMWriteNTypes(SSM_AUD_MASTR_VOLUME_VAL, 1, &rw_val); +} + +int SSMReadAudioMasterVolume(int8_t *rw_val) +{ + return SSMReadNTypes(SSM_AUD_MASTR_VOLUME_VAL, 1, rw_val); +} + +int SSMSaveAudioBalanceVal(int8_t rw_val) +{ + return SSMWriteNTypes(SSM_AUD_BALANCE_VAL, 1, &rw_val); +} + +int SSMReadAudioBalanceVal(int8_t *rw_val) +{ + return SSMReadNTypes(SSM_AUD_BALANCE_VAL, 1, rw_val); +} + +int SSMSaveAudioSupperBassVolume(int8_t rw_val) +{ + return SSMWriteNTypes(SSM_AUD_SUPPERBASS_VOLUME_VAL, 1, &rw_val); +} + +int SSMReadAudioSupperBassVolume(int8_t *rw_val) +{ + return SSMReadNTypes(SSM_AUD_SUPPERBASS_VOLUME_VAL, 1, rw_val); +} + +int SSMSaveAudioSupperBassSwitch(int8_t rw_val) +{ + return SSMWriteNTypes(SSM_AUD_SUPPERBASS_SWITCH, 1, &rw_val); +} + +int SSMReadAudioSupperBassSwitch(int8_t *rw_val) +{ + return SSMReadNTypes(SSM_AUD_SUPPERBASS_SWITCH, 1, rw_val); +} + +int SSMSaveAudioSRSSurroundSwitch(int8_t rw_val) +{ + return SSMWriteNTypes(SSM_AUD_SRS_SURROUND_SWITCH, 1, &rw_val); +} + +int SSMReadAudioSRSSurroundSwitch(int8_t *rw_val) +{ + return SSMReadNTypes(SSM_AUD_SRS_SURROUND_SWITCH, 1, rw_val); +} + +int SSMSaveAudioSRSDialogClaritySwitch(int8_t rw_val) +{ + return SSMWriteNTypes(SSM_AUD_SRS_DIALOG_CLARITY_SWITCH, 1, &rw_val); +} + +int SSMReadAudioSRSDialogClaritySwitch(int8_t *rw_val) +{ + return SSMReadNTypes(SSM_AUD_SRS_DIALOG_CLARITY_SWITCH, 1, rw_val); +} + +int SSMSaveAudioSRSTruBassSwitch(int8_t rw_val) +{ + return SSMWriteNTypes(SSM_AUD_SRS_TRUEBASS_SWITCH, 1, &rw_val); +} + +int SSMReadAudioSRSTruBassSwitch(int8_t *rw_val) +{ + return SSMReadNTypes(SSM_AUD_SRS_TRUEBASS_SWITCH, 1, rw_val); +} + +int SSMSaveAudioBassVolume(int8_t rw_val) +{ + return SSMWriteNTypes(SSM_AUD_BASS_VOLUME_VAL, 1, &rw_val); +} + +int SSMReadAudioBassVolume(int8_t *rw_val) +{ + return SSMReadNTypes(SSM_AUD_BASS_VOLUME_VAL, 1, rw_val); +} + +int SSMSaveAudioTrebleVolume(int8_t rw_val) +{ + return SSMWriteNTypes(SSM_AUD_TREBLE_VOLUME_VAL, 1, &rw_val); +} + +int SSMReadAudioTrebleVolume(int8_t *rw_val) +{ + return SSMReadNTypes(SSM_AUD_TREBLE_VOLUME_VAL, 1, rw_val); +} + +int SSMSaveAudioSoundModeVal(int8_t rw_val) +{ + return SSMWriteNTypes(SSM_AUD_SOUND_MODE_VAL, 1, &rw_val); +} + +int SSMReadAudioSoundModeVal(int8_t *rw_val) +{ + return SSMReadNTypes(SSM_AUD_SOUND_MODE_VAL, 1, rw_val); +} + +int SSMSaveAudioWallEffectSwitch(int8_t rw_val) +{ + return SSMWriteNTypes(SSM_AUD_WALL_EFFCT_SWITCH, 1, &rw_val); +} + +int SSMReadAudioWallEffectSwitch(int8_t *rw_val) +{ + return SSMReadNTypes(SSM_AUD_WALL_EFFCT_SWITCH, 1, rw_val); +} + +int SSMSaveAudioSPDIFSwitchVal(int8_t rw_val) +{ + return SSMWriteNTypes(SSM_AUD_SPDIF_SWITCH, 1, &rw_val); +} + +int SSMReadAudioSPDIFSwitchVal(int8_t *rw_val) +{ + return SSMReadNTypes(SSM_AUD_SPDIF_SWITCH, 1, rw_val); +} + +int SSMSaveAudioSPDIFModeVal(int8_t rw_val) +{ + return SSMWriteNTypes(SSM_AUD_SPDIF_MODE_VAL, 1, &rw_val); +} + +int SSMReadAudioSPDIFModeVal(int8_t *rw_val) +{ + return SSMReadNTypes(SSM_AUD_SPDIF_MODE_VAL, 1, rw_val); +} + +int SSMSaveAudioEQModeVal(int8_t rw_val) +{ + return SSMWriteNTypes(SSM_AUD_EQ_MODE_VAL, 1, &rw_val); +} + +int SSMReadAudioEQModeVal(int8_t *rw_val) +{ + return SSMReadNTypes(SSM_AUD_EQ_MODE_VAL, 1, rw_val); +} + +int SSMSaveAudioEQGain(int offset, int size, int8_t tmp_buf[]) +{ + return SSMWriteNTypes(SSM_AUD_EQ_GAIN + offset, size, tmp_buf); +} + +int SSMReadAudioEQGain(int offset, int size, int8_t tmp_buf[]) +{ + return SSMReadNTypes(SSM_AUD_EQ_GAIN, size, tmp_buf); +} + +int SSMSaveBlackoutEnable(int8_t enable) +{ + return SSMWriteNTypes(SSM_RW_BLACKOUT_ENABLE_START, 1, &enable); +} + +int SSMReadBlackoutEnable(int8_t *enable) +{ + return SSMReadNTypes(SSM_RW_BLACKOUT_ENABLE_START, 1, enable); +} diff --git a/tvapi/libtv/tvsetting/CTvSetting.h b/tvapi/libtv/tvsetting/CTvSetting.h new file mode 100644 index 0000000..0cf5086 --- a/dev/null +++ b/tvapi/libtv/tvsetting/CTvSetting.h @@ -0,0 +1,251 @@ +#ifndef __TV_SETTING_H__ +#define __TV_SETTING_H__ + +#include <pthread.h> +#include <stdint.h> + +#include "CTvSettingCfg.h" +#include "CTvSettingDeviceFactory.h" +#include "TvKeyData.h" +#include "../tv/CTvLog.h" + +#define LOG_TAG "TvSetting" + +using namespace android; + +#ifdef __cplusplus +extern "C" { +#endif + +bool CTvSettingLoad(); +bool CTvSettingunLoad(); + +int MiscSSMRestoreDefault(); +int MiscSSMFacRestoreDefault(); +int ReservedSSMRestoreDefault(); + +int SSMSaveEEP_One_N310_N311(int offset, int rw_val) ; +int SSMReadEEP_One_N310_N311(int offset); +int SSMSaveEEP_N_N310_N311(int offset, int data_len, int *data_buf); +int SSMReadEEP_N_N310_N311(int offset, int data_len, int *data_buf); +//int EEPWriteNByte(int offset, int data_len, unsigned char * data_buf); +//int EEPReadNByte(int offset, int data_len, unsigned char * data_buf); +int SSMSaveFlash_One_N310_N311(int offset, int rw_val); +int SSMReadFlash_One_N310_N311(int offset); +int SSMSaveFlash_N_N310_N311(int offset, int data_len, int *data_buf); +int SSMReadFlash_N_N310_N311(int offset, int data_len, int *data_buf); + +int SSMSaveBurnWriteCharaterChar(int rw_val); +int SSMReadBurnWriteCharaterChar(); +int SSMSaveFactoryBurnMode(int rw_val); +int SSMReadFactoryBurnMode(); +int SSMSavePowerOnOffChannel(int rw_val); +int SSMReadPowerOnOffChannel(); +int SSMSaveLastSelectSourceInput(int rw_val); +int SSMReadLastSelectSourceInput(); +int SSMSaveSystemLanguage(int rw_val); +int SSMReadSystemLanguage(); +int SSMSaveAgingMode(int rw_val); +int SSMReadAgingMode(); +int SSMSavePanelType(int rw_val); +int SSMReadPanelType(); +int SSMSavePowerOnMusicSwitch(int rw_val); +int SSMReadPowerOnMusicSwitch(); +int SSMSavePowerOnMusicVolume(int rw_val); +int SSMReadPowerOnMusicVolume(); +int SSMSaveSystemSleepTimer(int rw_val); +int SSMReadSystemSleepTimer(); +int SSMSaveInputSourceParentalControl(int source_index, unsigned char ctl_flag); +int SSMReadInputSourceParentalControl(int source_index); +int SSMSaveParentalControlSwitch(int rw_val); +int SSMReadParentalControlSwitch(); +int SSMGetCustomerDataStart(); +int SSMGetCustomerDataLen(); +int SSMGetATVDataStart(); +int SSMGetATVDataLen(); +int SSMGetVPPDataStart(); +int SSMGetVPPDataLen(); +int SSMSaveSearchNavigateFlag(int rw_val); +int SSMReadSearchNavigateFlag(); +int SSMSaveInputNumLimit(int rw_val); +int SSMReadInputNumLimit(); +int SSMSaveLocalDimingOnOffFlg(int rw_val); +int SSMReadLocalDimingOnOffFlg(); +int SSMSaveVDac2DValue(unsigned short rw_val); +int SSMReadVDac2DValue(); +int SSMSaveVDac3DValue(unsigned short rw_val); +int SSMReadVDac3DValue(); +int SSMSaveChromaStatus(int mode); +int SSMSaveNonStandardValue(unsigned short rw_val); +int SSMReadNonStandardValue(void); +int SSMSaveAdbSwitchValue(int rw_val); +int SSMReadAdbSwitchValue(void); +int SSMSaveSerialCMDSwitchValue(int rw_val); +int SSMReadSerialCMDSwitchValue(void); +int SSMSaveNoiseGateThresholdValue(int rw_val); +int SSMReadNoiseGateThresholdValue(void); +int SSMSaveGraphyBacklight(int rw_val); +int SSMReadGraphyBacklight(void); +int SSMSaveFastSuspendFlag(int rw_val); +int SSMReadFastSuspendFlag(void); +int SSMSaveCABufferSizeValue(unsigned short rw_val); +int SSMReadCABufferSizeValue(void); +int SSMSaveStandbyMode(int rw_val); +int SSMReadStandbyMode(); +int SSMSaveHDMIEQMode(int rw_val); +int SSMReadHDMIEQMode(); +int SSMSaveLogoOnOffFlag(int rw_val); +int SSMReadLogoOnOffFlag(); +int SSMSaveHDMIInternalMode(unsigned int rw_val); +int SSMReadHDMIInternalMode(); +int SSMSaveParentalControlPassWord(unsigned char *password, int size); +int SSMReadParentalControlPassWord(unsigned short *password); +int SSMSaveDisable3D(int rw_val); +int SSMReadDisable3D(); +int SSMSaveGlobalOgoEnable(int rw_val); +int SSMReadGlobalOgoEnable(); +int SSMDeviceMarkCheck(); +int SSMRestoreDeviceMarkValues(); +int SSMHandlePreCopying(); +int SSMSaveDTVType(int rw_val); +int SSMReadDTVType(int *rw_val); + +int GetSSMCfgBufferData(const char *key_str, int *buf_item_count, int radix, unsigned char data_buf[]); + +int SSMSaveSourceInput(unsigned char rw_val); +int SSMReadSourceInput(); +int SSMSaveCVBSStd(unsigned char rw_val); +int SSMReadCVBSStd(unsigned char *rw_val); +int SSMSave3DMode(unsigned char rw_val); +int SSMRead3DMode(unsigned char *rw_val); +int SSMSave3DLRSwitch(unsigned char rw_val); +int SSMRead3DLRSwitch(unsigned char *rw_val); +int SSMSave3DDepth(unsigned char rw_val); +int SSMRead3DDepth(unsigned char *rw_val); +int SSMSave3DTO2D(unsigned char rw_val); +int SSMRead3DTO2D(unsigned char *rw_val); +int SSMSaveBrightness(int offset, int rw_val); +int SSMReadBrightness(int offset, int *rw_val); +int SSMSaveContrast(int offset, int rw_val); +int SSMReadContrast(int offset, int *rw_val); +int SSMSaveSaturation(int offset, int rw_val); +int SSMReadSaturation(int offset, int *rw_val); +int SSMSaveHue(int offset, int rw_val); +int SSMReadHue(int offset, int *rw_val); +int SSMSaveSharpness(int offset, int rw_val); +int SSMReadSharpness(int offset, int *rw_val); +int SSMSaveSceneMode(int rw_val); +int SSMReadSceneMode(int *rw_val); +int SSMSavePictureMode(int offset, int rw_val); +int SSMReadPictureMode(int offset, int *rw_val); +int SSMSaveColorTemperature(int offset, int rw_val); +int SSMReadColorTemperature(int offset, int *rw_val); +int SSMSaveNoiseReduction(int offset, int rw_val); +int SSMReadNoiseReduction(int offset, int *rw_val); +int SSMSaveDisplayMode(int offset, int rw_val); +int SSMReadDisplayMode(int offset, int *rw_val); +int SSMSaveBackLightVal(int offset, int rw_val); +int SSMReadBackLightVal(int offset, int *rw_val); + +int SSMReadFBCN360BackLightVal(int *rw_val); +int SSMSaveFBCN360BackLightVal(int rw_val); +int SSMSaveFBCELECmodeVal(int rw_val); +int SSMReadFBCELECmodeVal(int *rw_val); +int SSMSaveFBCN360ColorTempVal(int rw_val); +int SSMReadFBCN360ColorTempVal(int *rw_val); + + + +int SSMSaveColorDemoMode(unsigned char rw_val); +int SSMReadColorDemoMode(unsigned char *rw_val); +int SSMSaveColorBaseMode(unsigned char rw_val); +int SSMReadColorBaseMode(unsigned char *rw_val); +int SSMSaveRGBGainRStart(int offset, unsigned int rw_val); +int SSMReadRGBGainRStart(int offset, unsigned int *rw_val); +int SSMSaveRGBGainGStart(int offset, unsigned int rw_val); +int SSMReadRGBGainGStart(int offset, unsigned int *rw_val); +int SSMSaveRGBGainBStart(int offset, unsigned int rw_val); +int SSMReadRGBGainBStart(int offset, unsigned int *rw_val); +int SSMSaveRGBPostOffsetRStart(int offset, int rw_val); +int SSMReadRGBPostOffsetRStart(int offset, int *rw_val); +int SSMSaveRGBPostOffsetGStart(int offset, int rw_val); +int SSMReadRGBPostOffsetGStart(int offset, int *rw_val); +int SSMSaveRGBPostOffsetBStart(int offset, int rw_val); +int SSMReadRGBPostOffsetBStart(int offset, int *rw_val); +int SSMSaveRGBValueStart(int offset, int8_t rw_val); +int SSMReadRGBValueStart(int offset, int8_t *rw_val); +int SSMSaveDBCStart(unsigned char rw_val); +int SSMReadDBCStart(unsigned char *rw_val); +int SSMSaveColorSpaceStart(unsigned char rw_val); +int SSMReadColorSpaceStart(unsigned char *rw_val); +int SSMSaveDnlpStart(unsigned char rw_val); +int SSMReadDnlpStart(unsigned char *rw_val); +int SSMSavePanoramaStart(int offset, unsigned char rw_val); +int SSMReadPanoramaStart(int offset, unsigned char *rw_val); +int SSMSaveTestPattern(unsigned char rw_val); +int SSMReadTestPattern(unsigned char *rw_val); +int SSMSaveAPL(unsigned char rw_val); +int SSMReadAPL(unsigned char *rw_val); +int SSMSaveAPL2(unsigned char rw_val); +int SSMReadAPL2(unsigned char *rw_val); +int SSMSaveBD(unsigned char rw_val); +int SSMReadBD(unsigned char *rw_val); +int SSMSaveBP(unsigned char rw_val); +int SSMReadBP(unsigned char *rw_val); +int SSMSaveDDRSSC(unsigned char rw_val); +int SSMReadDDRSSC(unsigned char *rw_val); +int SSMSaveLVDSSSC(unsigned char rw_val); +int SSMReadLVDSSSC(unsigned char *rw_val); +int SSMSaveDreamPanel(unsigned char rw_val); +int SSMReadDreamPanel(unsigned char *rw_val); +int SSMSaveUserNatureLightSwitch(unsigned char rw_val); +int SSMReadUserNatureLightSwitch(unsigned char *rw_val); +int SSMSaveDBCBacklightEnable(unsigned char rw_val); +int SSMReadDBCBacklightEnable(unsigned char *rw_val); +int SSMSaveDBCBacklightStd(unsigned char rw_val); +int SSMReadDBCBacklightStd(unsigned char *rw_val); +int SSMSaveDBCEnable(unsigned char rw_val); +int SSMReadDBCEnable(unsigned char *rw_val); +int SSMSaveGammaValue(int rw_val); +int SSMReadGammaValue(int *rw_val); +int SSMSaveBackLightReverse(unsigned char rw_val); +int SSMReadBackLightReverse(unsigned char *rw_val); + +int SSMSaveAudioMasterVolume(int8_t rw_val); +int SSMReadAudioMasterVolume(int8_t *rw_val); +int SSMSaveAudioBalanceVal(int8_t rw_val); +int SSMReadAudioBalanceVal(int8_t *rw_val); +int SSMSaveAudioSupperBassVolume(int8_t rw_val); +int SSMReadAudioSupperBassVolume(int8_t *rw_val); +int SSMSaveAudioSupperBassSwitch(int8_t rw_val); +int SSMReadAudioSupperBassSwitch(int8_t *rw_val); +int SSMSaveAudioSRSSurroundSwitch(int8_t rw_val); +int SSMReadAudioSRSSurroundSwitch(int8_t *rw_val); +int SSMSaveAudioSRSDialogClaritySwitch(int8_t rw_val); +int SSMReadAudioSRSDialogClaritySwitch(int8_t *rw_val); +int SSMSaveAudioSRSTruBassSwitch(int8_t rw_val); +int SSMReadAudioSRSTruBassSwitch(int8_t *rw_val); +int SSMSaveAudioBassVolume(int8_t rw_val); +int SSMReadAudioBassVolume(int8_t *rw_val); +int SSMSaveAudioTrebleVolume(int8_t rw_val); +int SSMReadAudioTrebleVolume(int8_t *rw_val); +int SSMSaveAudioSoundModeVal(int8_t rw_val); +int SSMReadAudioSoundModeVal(int8_t *rw_val); +int SSMSaveAudioWallEffectSwitch(int8_t rw_val); +int SSMReadAudioWallEffectSwitch(int8_t *rw_val); +int SSMSaveAudioSPDIFSwitchVal(int8_t rw_val); +int SSMReadAudioSPDIFSwitchVal(int8_t *rw_val); +int SSMSaveAudioSPDIFModeVal(int8_t rw_val); +int SSMReadAudioSPDIFModeVal(int8_t *rw_val); +int SSMSaveAudioEQModeVal(int8_t rw_val); +int SSMReadAudioEQModeVal(int8_t *rw_val); +int SSMSaveAudioEQGain(int offset, int size, int8_t tmp_buf[]); +int SSMReadAudioEQGain(int offset, int size, int8_t tmp_buf[]); + +int SSMSaveBlackoutEnable(int8_t enable); +int SSMReadBlackoutEnable(int8_t *enable); +#ifdef __cplusplus +} +#endif + +#endif //__TV_SSM_API_H__ diff --git a/tvapi/libtv/tvsetting/CTvSettingCfg.h b/tvapi/libtv/tvsetting/CTvSettingCfg.h new file mode 100644 index 0000000..e64271e --- a/dev/null +++ b/tvapi/libtv/tvsetting/CTvSettingCfg.h @@ -0,0 +1,371 @@ +#ifndef __TV_SETTING_CFG__H__ +#define __TV_SETTING_CFG__H__ +#include "../tvin/CTvin.h" + +//Sections +static const int SSM_RES0_START = 0; +static const int SSM_RES0_LEN = 32; +static const int SSM_CR_START = SSM_RES0_START + SSM_RES0_LEN; +static const int SSM_CR_LEN = 1536; +static const int SSM_RW_START = SSM_CR_START + SSM_CR_LEN; +static const int SSM_RW_LEN = 2048; +static const int SSM_RES1_START = SSM_RW_START + SSM_RW_LEN; +static const int SSM_RES1_LEN = 64; + +// reserved0 section +static const int SSM_RSV_W_CHARACTER_CHAR_START = SSM_RES0_START + 0x0A; +static const int SSM_RSV_W_CHARACTER_CHAR_LEN = 1; + +//Read & write section +static const int SSM_MARK_01_START = SSM_RW_START + 0; +static const int SSM_MARK_01_LEN = 1; + +static const int SSM_RW_AUDIO_START = SSM_MARK_01_START + SSM_MARK_01_LEN; +static const int SSM_RW_AUDIO_LEN = 192; + +static const int SSM_RW_VPP_START = SSM_RW_AUDIO_START + SSM_RW_AUDIO_LEN; +static const int SSM_RW_VPP_LEN = 230; + +static const int SSM_RW_VDIN_START = SSM_RW_VPP_START + SSM_RW_VPP_LEN; +static const int SSM_RW_VDIN_LEN = 826; + +static const int SSM_RW_ATV_START = SSM_RW_VDIN_START + SSM_RW_VDIN_LEN; +static const int SSM_RW_ATV_LEN = 0; + +static const int SSM_RW_MISC_START = SSM_RW_ATV_START + SSM_RW_ATV_LEN; +static const int SSM_RW_MISC_LEN = 86; + +static const int SSM_RW_CUSTOMER_DATA_START = SSM_RW_MISC_START + SSM_RW_MISC_LEN; +static const int SSM_RW_CUSTOMER_DATA_LEN = 100; + +static const int SSM_MARK_02_START = SSM_RW_CUSTOMER_DATA_START + SSM_RW_CUSTOMER_DATA_LEN; +static const int SSM_MARK_02_LEN = 1; + +static const int SSM_RW_TEST_START = SSM_MARK_02_START + SSM_MARK_02_LEN; +static const int SSM_RW_TEST_LEN = 3; + +static const int SSM_MARK_03_START = SSM_RW_TEST_START + SSM_RW_TEST_LEN; +static const int SSM_MARK_03_LEN = 1; + +//Mark r/w values +static const int SSM_MARK_01_VALUE = 0xDD; +static const int SSM_MARK_02_VALUE = 0x88; +static const int SSM_MARK_03_VALUE = 0xCC; + + +//Read & write section(1824 Bytes) +static const int SSM_RW_AUDIO_END = (SSM_RW_AUDIO_START + SSM_RW_AUDIO_LEN); +static const int SSM_RW_VPP_END = (SSM_RW_VPP_START + SSM_RW_VPP_LEN); +static const int SSM_RW_VDIN_END = (SSM_RW_VDIN_START + SSM_RW_VDIN_LEN); +static const int SSM_RW_ATV_END = (SSM_RW_ATV_START + SSM_RW_ATV_LEN); +static const int SSM_RW_MISC_END = (SSM_RW_MISC_START + SSM_RW_MISC_LEN); + +static const int SSM_CR_END = (SSM_CR_START + SSM_CR_LEN); + +//Read & write misc section +static const int SSM_RW_FBMF_START = (SSM_RW_MISC_START); //Factory Burn Mode Flag +static const int SSM_RW_FBMF_LEN = (1); +static const int SSM_RW_DEF_HDCP_START = (SSM_RW_FBMF_START + SSM_RW_FBMF_LEN); //using default hdcp key flag +static const int SSM_RW_DEF_HDCP_LEN = (1); +static const int SSM_RW_POWER_CHANNEL_START = (SSM_RW_DEF_HDCP_START + SSM_RW_DEF_HDCP_LEN); //Power on/off channel type +static const int SSM_RW_POWER_CHANNEL_LEN = (1); +static const int SSM_RW_LAST_SOURCE_INPUT_START = (SSM_RW_POWER_CHANNEL_START + SSM_RW_POWER_CHANNEL_LEN); //Last tv select input source type +static const int SSM_RW_LAST_SOURCE_INPUT_LEN = (1); +static const int SSM_RW_SYS_LANGUAGE_START = (SSM_RW_LAST_SOURCE_INPUT_START + SSM_RW_LAST_SOURCE_INPUT_LEN); //system language +static const int SSM_RW_SYS_LANGUAGE_LEN = (1); +static const int SSM_RW_AGING_MODE_START = (SSM_RW_SYS_LANGUAGE_START + SSM_RW_SYS_LANGUAGE_LEN); //aging mode +static const int SSM_RW_AGING_MODE_LEN = (1); +static const int SSM_RW_PANEL_TYPE_START = (SSM_RW_AGING_MODE_START + SSM_RW_AGING_MODE_LEN); //panel type +static const int SSM_RW_PANEL_TYPE_LEN = (1); +static const int SSM_RW_POWER_ON_MUSIC_SWITCH_START = (SSM_RW_PANEL_TYPE_START + SSM_RW_PANEL_TYPE_LEN); //power on music switch +static const int SSM_RW_POWER_ON_MUSIC_SWITCH_LEN = (1); +static const int SSM_RW_POWER_ON_MUSIC_VOL_START = (SSM_RW_POWER_ON_MUSIC_SWITCH_START + SSM_RW_POWER_ON_MUSIC_SWITCH_LEN); //power on music volume +static const int SSM_RW_POWER_ON_MUSIC_VOL_LEN = (1); +static const int SSM_RW_SYS_SLEEP_TIMER_START = (SSM_RW_POWER_ON_MUSIC_VOL_START + SSM_RW_POWER_ON_MUSIC_VOL_LEN); //system sleep timer +static const int SSM_RW_SYS_SLEEP_TIMER_LEN = (4); +static const int SSM_RW_INPUT_SRC_PARENTAL_CTL_START = (SSM_RW_SYS_SLEEP_TIMER_START + SSM_RW_SYS_SLEEP_TIMER_LEN); //tv input source parental control +static const int SSM_RW_INPUT_SRC_PARENTAL_CTL_LEN = (4); +static const int SSM_RW_PARENTAL_CTL_SWITCH_START = (SSM_RW_INPUT_SRC_PARENTAL_CTL_START + SSM_RW_INPUT_SRC_PARENTAL_CTL_LEN); //parental control switch +static const int SSM_RW_PARENTAL_CTL_SWITCH_LEN = (1); +static const int SSM_RW_PARENTAL_CTL_PASSWORD_START = (SSM_RW_PARENTAL_CTL_SWITCH_START + SSM_RW_PARENTAL_CTL_SWITCH_LEN); //parental control pass word +static const int SSM_RW_PARENTAL_CTL_PASSWORD_LEN = (16); +static const int SSM_RW_SEARCH_NAVIGATE_FLAG_START = (SSM_RW_PARENTAL_CTL_PASSWORD_START + SSM_RW_PARENTAL_CTL_PASSWORD_LEN); +static const int SSM_RW_SEARCH_NAVIGATE_FLAG_LEN = (1); +static const int SSM_RW_INPUT_NUMBER_LIMIT_START = (SSM_RW_SEARCH_NAVIGATE_FLAG_START + SSM_RW_SEARCH_NAVIGATE_FLAG_LEN); +static const int SSM_RW_INPUT_NUMBER_LIMIT_LEN = (1); +static const int SSM_RW_SERIAL_ONOFF_FLAG_START = (SSM_RW_INPUT_NUMBER_LIMIT_START + SSM_RW_INPUT_NUMBER_LIMIT_LEN); +static const int SSM_RW_SERIAL_ONOFF_FLAG_LEN = (1); +static const int SSM_RW_STANDBY_MODE_FLAG_START = (SSM_RW_SERIAL_ONOFF_FLAG_START + SSM_RW_SERIAL_ONOFF_FLAG_LEN); +static const int SSM_RW_STANDBY_MODE_FLAG_LEN = (1); +static const int SSM_RW_HDMIEQ_MODE_START = (SSM_RW_STANDBY_MODE_FLAG_START + SSM_RW_STANDBY_MODE_FLAG_LEN); +static const int SSM_RW_HDMIEQ_MODE_LEN = (1); +static const int SSM_RW_LOGO_ON_OFF_FLAG_START = (SSM_RW_HDMIEQ_MODE_START + SSM_RW_HDMIEQ_MODE_LEN); +static const int SSM_RW_LOGO_ON_OFF_FLAG_LEN = (1); +static const int SSM_RW_HDMIINTERNAL_MODE_START = (SSM_RW_LOGO_ON_OFF_FLAG_START + SSM_RW_LOGO_ON_OFF_FLAG_LEN); +static const int SSM_RW_HDMIINTERNAL_MODE_LEN = (4); +static const int SSM_RW_DISABLE_3D_START = (SSM_RW_HDMIINTERNAL_MODE_START + SSM_RW_HDMIINTERNAL_MODE_LEN); +static const int SSM_RW_DISABLE_3D_LEN = (1); +static const int SSM_RW_GLOBAL_OGO_ENABLE_START = (SSM_RW_DISABLE_3D_START + SSM_RW_DISABLE_3D_LEN); +static const int SSM_RW_GLOBAL_OGO_ENABLE_LEN = (1); +static const int SSM_RW_LOCAL_DIMING_START = (SSM_RW_GLOBAL_OGO_ENABLE_START + SSM_RW_GLOBAL_OGO_ENABLE_LEN); +static const int SSM_RW_LOCAL_DIMING_LEN = (1); +static const int SSM_RW_VDAC_2D_START = (SSM_RW_LOCAL_DIMING_START + SSM_RW_LOCAL_DIMING_LEN); +static const int SSM_RW_VDAC_2D_LEN = (2); +static const int SSM_RW_VDAC_3D_START = (SSM_RW_VDAC_2D_START + SSM_RW_VDAC_2D_LEN); +static const int SSM_RW_VDAC_3D_LEN = (2); + +static const int SSM_RW_NON_STANDARD_START = (SSM_RW_VDAC_3D_START + SSM_RW_VDAC_3D_LEN); +static const int SSM_RW_NON_STANDARD_LEN = (2); +static const int SSM_RW_ADB_SWITCH_START = (SSM_RW_NON_STANDARD_START + SSM_RW_NON_STANDARD_LEN); +static const int SSM_RW_ADB_SWITCH_LEN = (1); +static const int SSM_RW_SERIAL_CMD_SWITCH_START = (SSM_RW_ADB_SWITCH_START + SSM_RW_ADB_SWITCH_LEN); +static const int SSM_RW_SERIAL_CMD_SWITCH_LEN = (1); + +static const int SSM_RW_CA_BUFFER_SIZE_START = (SSM_RW_SERIAL_CMD_SWITCH_START + SSM_RW_SERIAL_CMD_SWITCH_LEN); +static const int SSM_RW_CA_BUFFER_SIZE_LEN = (2); + +static const int SSM_RW_NOISE_GATE_THRESHOLD_START = (SSM_RW_CA_BUFFER_SIZE_START + SSM_RW_CA_BUFFER_SIZE_LEN); +static const int SSM_RW_NOISE_GATE_THRESHOLD_LEN = (1); + +static const int SSM_RW_DTV_TYPE_START = (SSM_RW_NOISE_GATE_THRESHOLD_START + SSM_RW_NOISE_GATE_THRESHOLD_LEN); +static const int SSM_RW_DTV_TYPE_LEN = (1); + +static const int SSM_RW_UI_GRHPHY_BACKLIGHT_START = (SSM_RW_DTV_TYPE_START + SSM_RW_DTV_TYPE_LEN); +static const int SSM_RW_UI_GRHPHY_BACKLIGHT_LEN = (1); + +static const int SSM_RW_FASTSUSPEND_FLAG_START = (SSM_RW_UI_GRHPHY_BACKLIGHT_START + SSM_RW_UI_GRHPHY_BACKLIGHT_LEN); +static const int SSM_RW_FASTSUSPEND_FLAG_LEN = (1); + +static const int SSM_RW_BLACKOUT_ENABLE_START = (SSM_RW_FASTSUSPEND_FLAG_START + SSM_RW_FASTSUSPEND_FLAG_LEN); +static const int SSM_RW_BLACKOUT_ENABLE__LEN = (1); + +//Audio data section +static const int SSM_AUD_MASTR_VOLUME_VAL = (SSM_RW_AUDIO_START + 0); +static const int SSM_AUD_BALANCE_VAL = (SSM_AUD_MASTR_VOLUME_VAL + 1); +static const int SSM_AUD_SUPPERBASS_VOLUME_VAL = (SSM_AUD_BALANCE_VAL + 1); +static const int SSM_AUD_SUPPERBASS_SWITCH = (SSM_AUD_SUPPERBASS_VOLUME_VAL + 1); +static const int SSM_AUD_SRS_SURROUND_SWITCH = (SSM_AUD_SUPPERBASS_SWITCH + 1); +static const int SSM_AUD_SRS_DIALOG_CLARITY_SWITCH = (SSM_AUD_SRS_SURROUND_SWITCH + 1); +static const int SSM_AUD_SRS_TRUEBASS_SWITCH = (SSM_AUD_SRS_DIALOG_CLARITY_SWITCH + 1); +static const int SSM_AUD_BASS_VOLUME_VAL = (SSM_AUD_SRS_TRUEBASS_SWITCH + 1); +static const int SSM_AUD_TREBLE_VOLUME_VAL = (SSM_AUD_BASS_VOLUME_VAL + 1); +static const int SSM_AUD_SOUND_MODE_VAL = (SSM_AUD_TREBLE_VOLUME_VAL + 1); +static const int SSM_AUD_WALL_EFFCT_SWITCH = (SSM_AUD_SOUND_MODE_VAL + 1); +static const int SSM_AUD_SPDIF_SWITCH = (SSM_AUD_WALL_EFFCT_SWITCH + 1); +static const int SSM_AUD_SPDIF_MODE_VAL = (SSM_AUD_SPDIF_SWITCH + 1); +static const int SSM_AUD_EQ_MODE_VAL = (SSM_RW_AUDIO_START + 32); +static const int SSM_AUD_EQ_GAIN = (SSM_AUD_EQ_MODE_VAL + 1); +static const int SSM_AUD_NOLINE_POINTS = (SSM_AUD_EQ_GAIN + 16); + +//VPP Data (115 bytes) +//ColorDemoMode 1byte +static const int VPP_DATA_POS_COLOR_DEMO_MODE_START = (SSM_RW_VPP_START + 0); +static const int VPP_DATA_POS_COLOR_DEMO_MODE_SIZE = (1); +static const int VPP_DATA_POS_COLOR_DEMO_MODE_END = (VPP_DATA_POS_COLOR_DEMO_MODE_START + VPP_DATA_POS_COLOR_DEMO_MODE_SIZE); +//ColorBaseMode 1byte +static const int VPP_DATA_POS_COLOR_BASE_MODE_START = (VPP_DATA_POS_COLOR_DEMO_MODE_END + 0); +static const int VPP_DATA_POS_COLOR_BASE_MODE_SIZE = (1); +static const int VPP_DATA_POS_COLOR_BASE_MODE_END = (VPP_DATA_POS_COLOR_BASE_MODE_START + VPP_DATA_POS_COLOR_BASE_MODE_SIZE); +//TestPattern 1byte +static const int VPP_DATA_POS_TEST_PATTERN_START = (VPP_DATA_POS_COLOR_BASE_MODE_END + 0); +static const int VPP_DATA_POS_TEST_PATTERN_SIZE = (1); +static const int VPP_DATA_POS_TEST_PATTERN_END = (VPP_DATA_POS_TEST_PATTERN_START + VPP_DATA_POS_TEST_PATTERN_SIZE); +//DDR SSC 1byte +static const int VPP_DATA_POS_DDR_SSC_START = (VPP_DATA_POS_TEST_PATTERN_END + 0); +static const int VPP_DATA_POS_DDR_SSC_SIZE = (1); +static const int VPP_DATA_POS_DDR_SSC_END = (VPP_DATA_POS_DDR_SSC_START + VPP_DATA_POS_DDR_SSC_SIZE); +//LVDS SSC 1byte +static const int VPP_DATA_POS_LVDS_SSC_START = (VPP_DATA_POS_DDR_SSC_END + 0); +static const int VPP_DATA_POS_LVDS_SSC_SIZE = (1); +static const int VPP_DATA_POS_LVDS_SSC_END = (VPP_DATA_POS_LVDS_SSC_START + VPP_DATA_POS_LVDS_SSC_SIZE); +//dream panel 1byte +static const int VPP_DATA_POS_DREAM_PANEL_START = (VPP_DATA_POS_LVDS_SSC_END + 0); +static const int VPP_DATA_POS_DREAM_PANEL_SIZE = (1); +static const int VPP_DATA_POS_DREAM_PANEL_END = (VPP_DATA_POS_DREAM_PANEL_START + VPP_DATA_POS_DREAM_PANEL_SIZE); +//Backlight reverse 1byte +static const int VPP_DATA_POS_BACKLIGHT_REVERSE_START = (VPP_DATA_POS_DREAM_PANEL_END + 0); +static const int VPP_DATA_POS_BACKLIGHT_REVERSE_SIZE = (1); +static const int VPP_DATA_POS_BACKLIGHT_REVERSE_END = (VPP_DATA_POS_BACKLIGHT_REVERSE_START + VPP_DATA_POS_BACKLIGHT_REVERSE_SIZE); +//Brightness 1*7=7byte +static const int VPP_DATA_POS_BRIGHTNESS_START = (VPP_DATA_POS_BACKLIGHT_REVERSE_END + 0); +static const int VPP_DATA_POS_BRIGHTNESS_SIZE = (1 * (SOURCE_TYPE_MAX)); +static const int VPP_DATA_POS_BRIGHTNESS_END = (VPP_DATA_POS_BRIGHTNESS_START + VPP_DATA_POS_BRIGHTNESS_SIZE); +//Contrast 1*7=7byte +static const int VPP_DATA_POS_CONTRAST_START = (VPP_DATA_POS_BRIGHTNESS_END + 0); +static const int VPP_DATA_POS_CONTRAST_SIZE = (1 * (SOURCE_TYPE_MAX)); +static const int VPP_DATA_POS_CONTRAST_END = (VPP_DATA_POS_CONTRAST_START + VPP_DATA_POS_CONTRAST_SIZE); +//Saturation 1*7=7byte +static const int VPP_DATA_POS_SATURATION_START = (VPP_DATA_POS_CONTRAST_END + 0); +static const int VPP_DATA_POS_SATURATION_SIZE = (1 * (SOURCE_TYPE_MAX)); +static const int VPP_DATA_POS_SATURATION_END = (VPP_DATA_POS_SATURATION_START + VPP_DATA_POS_SATURATION_SIZE); +//Hue 1*7=7byte +static const int VPP_DATA_POS_HUE_START = (VPP_DATA_POS_SATURATION_END + 0); +static const int VPP_DATA_POS_HUE_SIZE = (1 * (SOURCE_TYPE_MAX)); +static const int VPP_DATA_POS_HUE_END = (VPP_DATA_POS_HUE_START + VPP_DATA_POS_HUE_SIZE); +//Sharpness 1*7=7byte +static const int VPP_DATA_POS_SHARPNESS_START = (VPP_DATA_POS_HUE_END + 0); +static const int VPP_DATA_POS_SHARPNESS_SIZE = (1 * (SOURCE_TYPE_MAX)); +static const int VPP_DATA_POS_SHARPNESS_END = (VPP_DATA_POS_SHARPNESS_START + VPP_DATA_POS_SHARPNESS_SIZE); +//ColorTemperature 1*7=7byte +static const int VPP_DATA_POS_COLOR_TEMP_START = (VPP_DATA_POS_SHARPNESS_END + 0); +static const int VPP_DATA_POS_COLOR_TEMP_SIZE = (1 * (SOURCE_TYPE_MAX)); +static const int VPP_DATA_POS_COLOR_TEMP_END = (VPP_DATA_POS_COLOR_TEMP_START + VPP_DATA_POS_COLOR_TEMP_SIZE); +//NoiseReduction 1*7=7byte +static const int VPP_DATA_POS_NOISE_REDUCTION_START = (VPP_DATA_POS_COLOR_TEMP_END + 0); +static const int VPP_DATA_POS_NOISE_REDUCTION_SIZE = (1 * (SOURCE_TYPE_MAX)); +static const int VPP_DATA_POS_NOISE_REDUCTION_END = (VPP_DATA_POS_NOISE_REDUCTION_START + VPP_DATA_POS_NOISE_REDUCTION_SIZE); +//SceneMode 1byte +static const int VPP_DATA_POS_SCENE_MODE_START = (VPP_DATA_POS_NOISE_REDUCTION_END + 0); +static const int VPP_DATA_POS_SCENE_MODE_SIZE = (1); +static const int VPP_DATA_POS_SCENE_MODE_END = (VPP_DATA_POS_SCENE_MODE_START + VPP_DATA_POS_SCENE_MODE_SIZE); +//PictureMode 1*7=7byte +static const int VPP_DATA_POS_PICTURE_MODE_START = (VPP_DATA_POS_SCENE_MODE_END + 0); +static const int VPP_DATA_POS_PICTURE_MODE_SIZE = (1 * (SOURCE_TYPE_MAX)); +static const int VPP_DATA_POS_PICTURE_MODE_END = (VPP_DATA_POS_PICTURE_MODE_START + VPP_DATA_POS_PICTURE_MODE_SIZE); +//DisplayMode 1*7=7byte +static const int VPP_DATA_POS_DISPLAY_MODE_START = (VPP_DATA_POS_PICTURE_MODE_END + 0); +static const int VPP_DATA_POS_DISPLAY_MODE_SIZE = (1 * (SOURCE_TYPE_MAX)); +static const int VPP_DATA_POS_DISPLAY_MODE_END = (VPP_DATA_POS_DISPLAY_MODE_START + VPP_DATA_POS_DISPLAY_MODE_SIZE); +//Backlight 1*7=7byte +static const int VPP_DATA_POS_BACKLIGHT_START = (VPP_DATA_POS_DISPLAY_MODE_END + 0); +static const int VPP_DATA_POS_BACKLIGHT_SIZE = (1 * (SOURCE_TYPE_MAX)); +static const int VPP_DATA_POS_BACKLIGHT_END = (VPP_DATA_POS_BACKLIGHT_START + VPP_DATA_POS_BACKLIGHT_SIZE); +//RGB_Gain_R 4byte +static const int VPP_DATA_POS_RGB_GAIN_R_START = (VPP_DATA_POS_BACKLIGHT_END + 0); +static const int VPP_DATA_POS_RGB_GAIN_R_SIZE = (sizeof(int)); +static const int VPP_DATA_POS_RGB_GAIN_R_END = (VPP_DATA_POS_RGB_GAIN_R_START + VPP_DATA_POS_RGB_GAIN_R_SIZE); +//RGB_Gain_G 4byte +static const int VPP_DATA_POS_RGB_GAIN_G_START = (VPP_DATA_POS_RGB_GAIN_R_END + 0); +static const int VPP_DATA_POS_RGB_GAIN_G_SIZE = (sizeof(int)); +static const int VPP_DATA_POS_RGB_GAIN_G_END = (VPP_DATA_POS_RGB_GAIN_G_START + VPP_DATA_POS_RGB_GAIN_G_SIZE); +//RGB_Gain_B 4byte +static const int VPP_DATA_POS_RGB_GAIN_B_START = (VPP_DATA_POS_RGB_GAIN_G_END + 0); +static const int VPP_DATA_POS_RGB_GAIN_B_SIZE = (sizeof(int)); +static const int VPP_DATA_POS_RGB_GAIN_B_END = (VPP_DATA_POS_RGB_GAIN_B_START + VPP_DATA_POS_RGB_GAIN_B_SIZE); +//RGB_Post_Offset_R 4byte +static const int VPP_DATA_POS_RGB_POST_OFFSET_R_START = (VPP_DATA_POS_RGB_GAIN_B_END + 0); +static const int VPP_DATA_POS_RGB_POST_OFFSET_R_SIZE = (sizeof(int)); +static const int VPP_DATA_POS_RGB_POST_OFFSET_R_END = (VPP_DATA_POS_RGB_POST_OFFSET_R_START + VPP_DATA_POS_RGB_POST_OFFSET_R_SIZE); +//RGB_Post_Offset_G 4byte +static const int VPP_DATA_POS_RGB_POST_OFFSET_G_START = (VPP_DATA_POS_RGB_POST_OFFSET_R_END + 0); +static const int VPP_DATA_POS_RGB_POST_OFFSET_G_SIZE = (sizeof(int)); +static const int VPP_DATA_POS_RGB_POST_OFFSET_G_END = (VPP_DATA_POS_RGB_POST_OFFSET_G_START + VPP_DATA_POS_RGB_POST_OFFSET_G_SIZE); +//RGB_Post_Offset_B 4byte +static const int VPP_DATA_POS_RGB_POST_OFFSET_B_START = (VPP_DATA_POS_RGB_POST_OFFSET_G_END + 0); +static const int VPP_DATA_POS_RGB_POST_OFFSET_B_SIZE = (sizeof(int)); +static const int VPP_DATA_POS_RGB_POST_OFFSET_B_END = (VPP_DATA_POS_RGB_POST_OFFSET_B_START + VPP_DATA_POS_RGB_POST_OFFSET_B_SIZE); +//dbc_Enable 1byte +static const int VPP_DATA_POS_DBC_START = (VPP_DATA_POS_RGB_POST_OFFSET_B_END + 0); +static const int VPP_DATA_POS_DBC_SIZE = (1); +static const int VPP_DATA_POS_DBC_END = (VPP_DATA_POS_DBC_START + VPP_DATA_POS_DBC_SIZE); +//project id 1byte +static const int VPP_DATA_PROJECT_ID_START = (VPP_DATA_POS_DBC_END + 0); +static const int VPP_DATA_PROJECT_ID_SIZE = (1); +static const int VPP_DATA_PROJECT_ID_END = (VPP_DATA_PROJECT_ID_START + VPP_DATA_PROJECT_ID_SIZE); +//dnlp 1byte +static const int VPP_DATA_POS_DNLP_START = (VPP_DATA_PROJECT_ID_END + 0); +static const int VPP_DATA_POS_DNLP_SIZE = (1); +static const int VPP_DATA_POS_DNLP_END = (VPP_DATA_POS_DNLP_START + VPP_DATA_POS_DNLP_SIZE); +//panorama 1*7 = 7byte +static const int VPP_DATA_POS_PANORAMA_START = (VPP_DATA_POS_DNLP_END + 0); +static const int VPP_DATA_POS_PANORAMA_SIZE = (1 * (SOURCE_TYPE_MAX)); +static const int VPP_DATA_POS_PANORAMA_END = (VPP_DATA_POS_PANORAMA_START + VPP_DATA_POS_PANORAMA_SIZE); +//APL 1 byte +static const int VPP_DATA_APL_START = (VPP_DATA_POS_PANORAMA_END + 0); +static const int VPP_DATA_APL_SIZE = (1); +static const int VPP_DATA_APL_END = (VPP_DATA_APL_START + VPP_DATA_APL_SIZE); +//APL2 1 byte +static const int VPP_DATA_APL2_START = (VPP_DATA_APL_END + 0); +static const int VPP_DATA_APL2_SIZE = (1); +static const int VPP_DATA_APL2_END = (VPP_DATA_APL2_START + VPP_DATA_APL2_SIZE); +//BD 1 byte +static const int VPP_DATA_BD_START = (VPP_DATA_APL2_END + 0); +static const int VPP_DATA_BD_SIZE = (1); +static const int VPP_DATA_BD_END = (VPP_DATA_BD_START + VPP_DATA_BD_SIZE); +//BP 1 byte +static const int VPP_DATA_BP_START = (VPP_DATA_BD_END + 0); +static const int VPP_DATA_BP_SIZE = (1); +static const int VPP_DATA_BP_END = (VPP_DATA_BP_START + VPP_DATA_BP_SIZE); + +//Factory RGB 3*6 = 18byte +static const int VPP_DATA_RGB_START = (VPP_DATA_BP_END + 0); +static const int VPP_DATA_RGB_SIZE = (18); +static const int VPP_DATA_RGB_END = (VPP_DATA_RGB_START + VPP_DATA_RGB_SIZE); + +//COLOR_SPACE 1 byte +static const int VPP_DATA_COLOR_SPACE_START = (VPP_DATA_RGB_END + 0); +static const int VPP_DATA_COLOR_SPACE_SIZE = (1); +static const int VPP_DATA_COLOR_SPACE_END = (VPP_DATA_COLOR_SPACE_START + VPP_DATA_COLOR_SPACE_SIZE); + +static const int VPP_DATA_USER_NATURE_SWITCH_START = (VPP_DATA_COLOR_SPACE_END + 0); +static const int VPP_DATA_USER_NATURE_SWITCH_SIZE = (1); +static const int VPP_DATA_USER_NATURE_SWITCH_END = (VPP_DATA_USER_NATURE_SWITCH_START + VPP_DATA_USER_NATURE_SWITCH_SIZE); + +//gamma value 1 byte +static const int VPP_DATA_GAMMA_VALUE_START = (VPP_DATA_USER_NATURE_SWITCH_END + 0); +static const int VPP_DATA_GAMMA_VALUE_SIZE = (1); +static const int VPP_DATA_GAMMA_VALUE_END = (VPP_DATA_GAMMA_VALUE_START + VPP_DATA_GAMMA_VALUE_SIZE); + +//dbc backlight enable 1byte +static const int VPP_DATA_DBC_BACKLIGHT_START = (VPP_DATA_GAMMA_VALUE_END + 0); +static const int VPP_DATA_DBC_BACKLIGHT_SIZE = (1); +static const int VPP_DATA_DBC_BACKLIGHT_END = (VPP_DATA_DBC_BACKLIGHT_START + VPP_DATA_DBC_BACKLIGHT_SIZE); +//dbc backlight standard 1byte +static const int VPP_DATA_DBC_STANDARD_START = (VPP_DATA_DBC_BACKLIGHT_END + 0); +static const int VPP_DATA_DBC_STANDARD_SIZE = (1); +static const int VPP_DATA_DBC_STANDARD_END = (VPP_DATA_DBC_STANDARD_START + VPP_DATA_DBC_STANDARD_SIZE); +//dbc backlight enable 1byte +static const int VPP_DATA_DBC_ENABLE_START = (VPP_DATA_DBC_STANDARD_END + 0); +static const int VPP_DATA_DBC_ENABLE_SIZE = (1); +static const int VPP_DATA_DBC_ENABLE_END = (VPP_DATA_DBC_ENABLE_START + VPP_DATA_DBC_ENABLE_SIZE); + +//fbc Backlight 1 byte +static const int VPP_DATA_POS_FBC_BACKLIGHT_START = (VPP_DATA_DBC_ENABLE_END + 0); +static const int VPP_DATA_POS_FBC_BACKLIGHT_SIZE = (1); +static const int VPP_DATA_POS_FBC_BACKLIGHT_END = (VPP_DATA_POS_FBC_BACKLIGHT_START + VPP_DATA_POS_FBC_BACKLIGHT_SIZE); +//fbc Elecmode 1 byte +static const int VPP_DATA_POS_FBC_ELECMODE_START = (VPP_DATA_POS_FBC_BACKLIGHT_END + 0); +static const int VPP_DATA_POS_FBC_ELECMODE_SIZE = (1); +static const int VPP_DATA_POS_FBC_ELECMODE_END = (VPP_DATA_POS_FBC_ELECMODE_START + VPP_DATA_POS_FBC_ELECMODE_SIZE); +//fbc colortemp 1 byte +static const int VPP_DATA_POS_FBC_COLORTEMP_START = (VPP_DATA_POS_FBC_ELECMODE_END + 0); +static const int VPP_DATA_POS_FBC_COLORTEMP_SIZE = (1); +static const int VPP_DATA_POS_FBC_COLORTEMP_END = (VPP_DATA_POS_FBC_COLORTEMP_START + VPP_DATA_POS_FBC_COLORTEMP_SIZE); + + +//Tvin data section (581 bytes) +//SourceInput 1byte +static const int TVIN_DATA_POS_SOURCE_INPUT_START = (SSM_RW_VDIN_START + 0); +static const int TVIN_DATA_POS_SOURCE_INPUT_SIZE = (1); +static const int TVIN_DATA_POS_SOURCE_INPUT_END = (TVIN_DATA_POS_SOURCE_INPUT_START + TVIN_DATA_POS_SOURCE_INPUT_SIZE); +//CVBS Std 1byte +static const int TVIN_DATA_CVBS_STD_START = (TVIN_DATA_POS_SOURCE_INPUT_END + 0); +static const int TVIN_DATA_CVBS_STD_SIZE = (1); +static const int TVIN_DATA_CVBS_STD_END = (TVIN_DATA_CVBS_STD_START + TVIN_DATA_CVBS_STD_SIZE); +//3DMode 1byte +static const int TVIN_DATA_POS_3D_MODE_START = (TVIN_DATA_CVBS_STD_END + 0); +static const int TVIN_DATA_POS_3D_MODE_SIZE = (1); +static const int TVIN_DATA_POS_3D_MODE_END = (TVIN_DATA_POS_3D_MODE_START + TVIN_DATA_POS_3D_MODE_SIZE); +//3DLRSwitch 1byte +static const int TVIN_DATA_POS_3D_LRSWITCH_START = (TVIN_DATA_POS_3D_MODE_END + 0); +static const int TVIN_DATA_POS_3D_LRSWITCH_SIZE = (1); +static const int TVIN_DATA_POS_3D_LRSWITCH_END = (TVIN_DATA_POS_3D_LRSWITCH_START + TVIN_DATA_POS_3D_LRSWITCH_SIZE); +//3DDepth 1byte +static const int TVIN_DATA_POS_3D_DEPTH_START = (TVIN_DATA_POS_3D_LRSWITCH_END + 0); +static const int TVIN_DATA_POS_3D_DEPTH_SIZE = (1); +static const int TVIN_DATA_POS_3D_DEPTH_END = (TVIN_DATA_POS_3D_DEPTH_START + TVIN_DATA_POS_3D_DEPTH_SIZE); +//3DTo2D 1byte +static const int TVIN_DATA_POS_3D_TO2D_START = (TVIN_DATA_POS_3D_DEPTH_END + 0); +static const int TVIN_DATA_POS_3D_TO2D_SIZE = (1); +static const int TVIN_DATA_POS_3D_TO2D_END = (TVIN_DATA_POS_3D_TO2D_START + TVIN_DATA_POS_3D_TO2D_SIZE); +//3DTo2DNEW 1byte +static const int TVIN_DATA_POS_3D_TO2DNEW_START = (TVIN_DATA_POS_3D_TO2D_END + 0); +static const int TVIN_DATA_POS_3D_TO2DNEW_SIZE = (1); +static const int TVIN_DATA_POS_3D_TO2DNEW_END = (TVIN_DATA_POS_3D_TO2DNEW_START + TVIN_DATA_POS_3D_TO2DNEW_SIZE); + +static const int CHKSUM_PROJECT_ID_OFFSET = (SSM_RES0_START + 0); +static const int CHKSUM_MAC_ADDRESS_OFFSET = (SSM_RES0_START + 2); +static const int CHKSUM_HDCP_KEY_OFFSET = (SSM_RES0_START + 4); +static const int CHKSUM_BARCODE_OFFSET = (SSM_RES0_START + 6); + +#endif diff --git a/tvapi/libtv/tvsetting/CTvSettingDeviceFactory.cpp b/tvapi/libtv/tvsetting/CTvSettingDeviceFactory.cpp new file mode 100644 index 0000000..78fd830 --- a/dev/null +++ b/tvapi/libtv/tvsetting/CTvSettingDeviceFactory.cpp @@ -0,0 +1,187 @@ +#include "CTvSettingDeviceFactory.h" +#include "CBlobDeviceE2prom.h" +#include "CBlobDeviceFile.h" + +#include "../tvconfig/tvconfig.h" + +#include "CTvLog.h" +#include "CTvSettingCfg.h" + +#define CC_PRINT_DATA_INFO (0) + + +CTvSettingDeviceFactory::CTvSettingDeviceFactory() +{ + mpCurDevice = NULL; +} + +CTvSettingDeviceFactory::~CTvSettingDeviceFactory() +{ + + if (mpCurDevice != NULL) { + delete mpCurDevice; + mpCurDevice = NULL; + } + +} + +/*int CTvSettingDeviceFactory::SSMPrintAllDataInfo() { +#if CC_PRINT_DATA_INFO == 1 + static int gPrintInfoFlag = 0; + + if (gPrintInfoFlag == 1) { + return 0; + } + + gPrintInfoFlag = 1; + + SSMPrintDataInfo("Section reserved0", SSM_RESERVED0_START, SSM_RESERVED0_LEN); + SSMPrintDataInfo("Section HDCP key", SSM_RO_HDCP_KEY_START, SSM_RO_HDCP_KEY_LEN); + SSMPrintDataInfo("Section MAC address", SSM_RO_MAC_START, SSM_RO_MAC_LEN); + SSMPrintDataInfo("Section VGA EDID", SSM_RO_VGA_EDID_START, SSM_RO_VGA_EDID_LEN); + SSMPrintDataInfo("Section HDMI EDID", SSM_RO_HDMI_EDID_START, SSM_RO_HDMI_EDID_LEN); + + SSMPrintDataInfo("Section Mark 01", SSM_MARK_01_START, SSM_MARK_01_LEN); + + SSMPrintDataInfo("Section Audio", SSM_RW_AUDIO_START, SSM_RW_AUDIO_LEN); + SSMPrintDataInfo("Section Audio Master Volume", SSM_AUD_MASTR_VOLUME_VAL, 1); + SSMPrintDataInfo("Section Audio Balance Value", SSM_AUD_BALANCE_VAL, 1); + SSMPrintDataInfo("Section Audio SupperBass Volume", SSM_AUD_SUPPERBASS_VOLUME_VAL, 1); + SSMPrintDataInfo("Section Audio SupperBass Switch", SSM_AUD_SUPPERBASS_SWITCH, 1); + SSMPrintDataInfo("Section Audio SRS Surround Switch", SSM_AUD_SRS_SURROUND_SWITCH, 1); + SSMPrintDataInfo("Section Audio SRS Dialog Clarity Switch", SSM_AUD_SRS_DIALOG_CLARITY_SWITCH, 1); + SSMPrintDataInfo("Section Audio SRS Trubass switch", SSM_AUD_SRS_TRUEBASS_SWITCH, 1); + SSMPrintDataInfo("Section Audio Bass Volume", SSM_AUD_BASS_VOLUME_VAL, 1); + SSMPrintDataInfo("Section Audio Treble Volume", SSM_AUD_TREBLE_VOLUME_VAL, 1); + SSMPrintDataInfo("Section Audio Sound Mode Value", SSM_AUD_SOUND_MODE_VAL, 1); + SSMPrintDataInfo("Section Audio Wall effect switch", SSM_AUD_WALL_EFFCT_SWITCH, 1); + SSMPrintDataInfo("Section Audio spdif switch", SSM_AUD_SPDIF_SWITCH, 1); + SSMPrintDataInfo("Section Audio spdif mode", SSM_AUD_SPDIF_MODE_VAL, 1); + SSMPrintDataInfo("Section Audio Tv Master Volume", SSM_AUD_TV_MASTR_VOLUME_VAL, 1); + SSMPrintDataInfo("Section Audio Sound enhance", SSM_AUD_SOUND_ENHANCE_SWITCH, 1); + SSMPrintDataInfo("Section Audio EQ mode", SSM_AUD_EQ_MODE_VAL, 32); + SSMPrintDataInfo("Section Audio EQ gain", SSM_AUD_EQ_GAIN, 1); + SSMPrintDataInfo("Section Audio No Line points", SSM_AUD_NOLINE_POINTS, 16); + + SSMPrintDataInfo("Section VPP", SSM_RW_VPP_START, SSM_RW_VPP_LEN); + SSMPrintDataInfo("Section VPP color Demo mode", VPP_DATA_POS_COLOR_DEMO_MODE_START, VPP_DATA_POS_COLOR_DEMO_MODE_SIZE); + SSMPrintDataInfo("Section VPP color Base mode", VPP_DATA_POS_COLOR_BASE_MODE_START, VPP_DATA_POS_COLOR_BASE_MODE_SIZE); + SSMPrintDataInfo("Section VPP test pattern", VPP_DATA_POS_TEST_PATTERN_START, VPP_DATA_POS_TEST_PATTERN_SIZE); + SSMPrintDataInfo("Section VPP DDR SSC", VPP_DATA_POS_DDR_SSC_START, VPP_DATA_POS_DDR_SSC_SIZE); + SSMPrintDataInfo("Section VPP LVDS SSC", VPP_DATA_POS_LVDS_SSC_START, VPP_DATA_POS_LVDS_SSC_SIZE); + SSMPrintDataInfo("Section VPP Dream panel", VPP_DATA_POS_DREAM_PANEL_START, VPP_DATA_POS_DREAM_PANEL_SIZE); + SSMPrintDataInfo("Section VPP BackLight Reverse", VPP_DATA_POS_BACKLIGHT_REVERSE_START, VPP_DATA_POS_BACKLIGHT_REVERSE_SIZE); + SSMPrintDataInfo("Section VPP Brightness", VPP_DATA_POS_BRIGHTNESS_START, VPP_DATA_POS_BRIGHTNESS_SIZE); + SSMPrintDataInfo("Section VPP Contrast", VPP_DATA_POS_CONTRAST_START, VPP_DATA_POS_CONTRAST_SIZE); + SSMPrintDataInfo("Section VPP Saturation", VPP_DATA_POS_SATURATION_START, VPP_DATA_POS_SATURATION_SIZE); + SSMPrintDataInfo("Section VPP Hue", VPP_DATA_POS_HUE_START, VPP_DATA_POS_HUE_SIZE); + SSMPrintDataInfo("Section VPP Sharpness", VPP_DATA_POS_SHARPNESS_START, VPP_DATA_POS_SHARPNESS_SIZE); + SSMPrintDataInfo("Section VPP color temp", VPP_DATA_POS_COLOR_TEMP_START, VPP_DATA_POS_COLOR_TEMP_SIZE); + SSMPrintDataInfo("Section VPP Noise Reduction", VPP_DATA_POS_NOISE_REDUCTION_START, VPP_DATA_POS_NOISE_REDUCTION_SIZE); + SSMPrintDataInfo("Section VPP Picture Mode", VPP_DATA_POS_PICTURE_MODE_START, VPP_DATA_POS_PICTURE_MODE_SIZE); + SSMPrintDataInfo("Section VPP Display Mode", VPP_DATA_POS_DISPLAY_MODE_START, VPP_DATA_POS_DISPLAY_MODE_SIZE); + SSMPrintDataInfo("Section VPP BackLight", VPP_DATA_POS_BACKLIGHT_START, VPP_DATA_POS_BACKLIGHT_SIZE); + SSMPrintDataInfo("Section VPP RGB R Gain", VPP_DATA_POS_RGB_GAIN_R_START, VPP_DATA_POS_RGB_GAIN_R_SIZE); + SSMPrintDataInfo("Section VPP RGB G Gain", VPP_DATA_POS_RGB_GAIN_G_START, VPP_DATA_POS_RGB_GAIN_G_SIZE); + SSMPrintDataInfo("Section VPP RGB B Gain", VPP_DATA_POS_RGB_GAIN_B_START, VPP_DATA_POS_RGB_GAIN_B_SIZE); + SSMPrintDataInfo("Section VPP RGB R Offset", VPP_DATA_POS_RGB_POST_OFFSET_R_START, VPP_DATA_POS_RGB_POST_OFFSET_R_SIZE); + SSMPrintDataInfo("Section VPP RGB G Offset", VPP_DATA_POS_RGB_POST_OFFSET_G_START, VPP_DATA_POS_RGB_POST_OFFSET_G_SIZE); + SSMPrintDataInfo("Section VPP RGB B Offset", VPP_DATA_POS_RGB_POST_OFFSET_B_START, VPP_DATA_POS_RGB_POST_OFFSET_B_SIZE); + SSMPrintDataInfo("Section VPP DBC", VPP_DATA_POS_DBC_START, VPP_DATA_POS_DBC_SIZE); + SSMPrintDataInfo("Section VPP Project ID", VPP_DATA_PROJECT_ID_START, VPP_DATA_PROJECT_ID_SIZE); + SSMPrintDataInfo("Section VPP DNLP", VPP_DATA_POS_DNLP_START, VPP_DATA_POS_DNLP_SIZE); + SSMPrintDataInfo("Section VPP Panorama", VPP_DATA_POS_PANORAMA_START, VPP_DATA_POS_PANORAMA_SIZE); + SSMPrintDataInfo("Section VPP APL", VPP_DATA_APL_START, VPP_DATA_APL_SIZE); + SSMPrintDataInfo("Section VPP APL2", VPP_DATA_APL2_START, VPP_DATA_APL2_SIZE); + SSMPrintDataInfo("Section VPP BD", VPP_DATA_BD_START, VPP_DATA_BD_SIZE); + SSMPrintDataInfo("Section VPP BP", VPP_DATA_BP_START, VPP_DATA_BP_SIZE); + SSMPrintDataInfo("Section VPP RGB", VPP_DATA_RGB_START, VPP_DATA_RGB_SIZE); + SSMPrintDataInfo("Section VPP color Space", VPP_DATA_COLOR_SPACE_START, VPP_DATA_COLOR_SPACE_SIZE); + SSMPrintDataInfo("Section VPP User Nature Switch", VPP_DATA_USER_NATURE_SWITCH_START, VPP_DATA_USER_NATURE_SWITCH_SIZE); + SSMPrintDataInfo("Section VPP Gamma value", VPP_DATA_GAMMA_VALUE_START, VPP_DATA_GAMMA_VALUE_SIZE); + + SSMPrintDataInfo("Section VDIN", SSM_RW_VDIN_START, SSM_RW_VDIN_LEN); + SSMPrintDataInfo("Section VDIN source input", TVIN_DATA_POS_SOURCE_INPUT_START, TVIN_DATA_POS_SOURCE_INPUT_SIZE); + SSMPrintDataInfo("Section VDIN CVBS Std", TVIN_DATA_CVBS_STD_START, TVIN_DATA_CVBS_STD_SIZE); + SSMPrintDataInfo("Section VDIN 3D mode", TVIN_DATA_POS_3D_MODE_START, TVIN_DATA_POS_3D_MODE_SIZE); + SSMPrintDataInfo("Section VDIN 3D LR Switch", TVIN_DATA_POS_3D_LRSWITCH_START, TVIN_DATA_POS_3D_LRSWITCH_SIZE); + SSMPrintDataInfo("Section VDIN 3D Depth", TVIN_DATA_POS_3D_DEPTH_START, TVIN_DATA_POS_3D_DEPTH_SIZE); + SSMPrintDataInfo("Section VDIN 3D To 2D", TVIN_DATA_POS_3D_TO2D_START, TVIN_DATA_POS_3D_TO2D_SIZE); + SSMPrintDataInfo("Section VDIN 3D To 2D New", TVIN_DATA_POS_3D_TO2DNEW_START, TVIN_DATA_POS_3D_TO2DNEW_SIZE); + SSMPrintDataInfo("Section VDIN VGA Adjust", TVIN_DATA_POS_VGA_ADJ_VALUE_START, TVIN_DATA_POS_VGA_ADJ_VALUE_SIZE); + SSMPrintDataInfo("Section VDIN ADC Calibration flag", TVIN_DATA_POS_ADC_CAL_FLAG_VALUE_START, TVIN_DATA_POS_ADC_CAL_FLAG_VALUE_SIZE); + SSMPrintDataInfo("Section VDIN ADC Calibration data", TVIN_DATA_POS_ADC_CAL_VALUE_START, TVIN_DATA_POS_ADC_CAL_VALUE_SIZE); + SSMPrintDataInfo("Section VDIN YPbPr ADC Calibration data", TVIN_DATA_YPbPr_ADC_CAL_VALUE_START, TVIN_DATA_YPbPr_ADC_CAL_VALUE_SIZE); + + SSMPrintDataInfo("Section ATV", SSM_RW_ATV_START, SSM_RW_ATV_LEN); + SSMPrintDataInfo("Section ATV Channel Info Data", CC_ATV_SSM_CHAN_INFO_START, CC_ATV_SSM_CHAN_INFO_LEN); + SSMPrintDataInfo("Section ATV Current Channel", CC_ATV_SSM_CURRENT_CHAN_START, CC_ATV_SSM_CURRENT_CHAN_LEN); + SSMPrintDataInfo("Section ATV Channel Total", CC_ATV_SSM_CHAN_TOTAL_START, CC_ATV_SSM_CHAN_TOTAL_LEN); + SSMPrintDataInfo("Section ATV Desc En", CC_ATV_SSM_DESC_EN_START, CC_ATV_SSM_DESC_EN_LEN); + + SSMPrintDataInfo("Section MISC", SSM_RW_MISC_START, SSM_RW_MISC_LEN); + SSMPrintDataInfo("Section MISC FBMF", SSM_RW_FBMF_START, SSM_RW_FBMF_LEN); + SSMPrintDataInfo("Section MISC Def HDCP", SSM_RW_DEF_HDCP_START, SSM_RW_DEF_HDCP_LEN); + SSMPrintDataInfo("Section MISC power channel", SSM_RW_POWER_CHANNEL_START, SSM_RW_POWER_CHANNEL_LEN); + SSMPrintDataInfo("Section MISC last select input src", SSM_RW_LAST_SOURCE_INPUT_START, SSM_RW_LAST_SOURCE_INPUT_LEN); + SSMPrintDataInfo("Section MISC sys language", SSM_RW_SYS_LANGUAGE_START, SSM_RW_SYS_LANGUAGE_LEN); + SSMPrintDataInfo("Section MISC aging mode", SSM_RW_AGING_MODE_START, SSM_RW_AGING_MODE_LEN); + SSMPrintDataInfo("Section MISC panel type", SSM_RW_PANEL_TYPE_START, SSM_RW_PANEL_TYPE_LEN); + SSMPrintDataInfo("Section MISC power on music switch", SSM_RW_POWER_ON_MUSIC_SWITCH_START, SSM_RW_POWER_ON_MUSIC_SWITCH_LEN); + SSMPrintDataInfo("Section MISC power on music vol", SSM_RW_POWER_ON_MUSIC_VOL_START, SSM_RW_POWER_ON_MUSIC_VOL_LEN); + SSMPrintDataInfo("Section MISC system sleep timer", SSM_RW_SYS_SLEEP_TIMER_START, SSM_RW_SYS_SLEEP_TIMER_LEN); + SSMPrintDataInfo("Section MISC input src parental", SSM_RW_INPUT_SRC_PARENTAL_CTL_START, SSM_RW_INPUT_SRC_PARENTAL_CTL_LEN); + SSMPrintDataInfo("Section MISC parental contrl switch", SSM_RW_PARENTAL_CTL_SWITCH_START, SSM_RW_PARENTAL_CTL_SWITCH_LEN); + SSMPrintDataInfo("Section MISC parental contrl passwd", SSM_RW_PARENTAL_CTL_PASSWORD_START, SSM_RW_PARENTAL_CTL_PASSWORD_LEN); + SSMPrintDataInfo("Section MISC serach navigate flag", SSM_RW_SEARCH_NAVIGATE_FLAG_START, SSM_RW_SEARCH_NAVIGATE_FLAG_LEN); + SSMPrintDataInfo("Section MISC input number limit", SSM_RW_INPUT_NUMBER_LIMIT_START, SSM_RW_INPUT_NUMBER_LIMIT_LEN); + SSMPrintDataInfo("Section MISC serial onoff flag", SSM_RW_SERIAL_ONOFF_FLAG_START, SSM_RW_SERIAL_ONOFF_FLAG_LEN); + SSMPrintDataInfo("Section MISC standby mode flag", SSM_RW_STANDBY_MODE_FLAG_START, SSM_RW_STANDBY_MODE_FLAG_LEN); + SSMPrintDataInfo("Section MISC HDMIEQ mode", SSM_RW_HDMIEQ_MODE_START, SSM_RW_HDMIEQ_MODE_LEN); + SSMPrintDataInfo("Section MISC LOGO on/off", SSM_RW_LOGO_ON_OFF_FLAG_START, SSM_RW_LOGO_ON_OFF_FLAG_LEN); + SSMPrintDataInfo("Section MISC Disable 3D", SSM_RW_DISABLE_3D_START, SSM_RW_DISABLE_3D_LEN); + SSMPrintDataInfo("Section MISC Global OGO enable", SSM_RW_GLOBAL_OGO_ENABLE_START, SSM_RW_GLOBAL_OGO_ENABLE_LEN); + SSMPrintDataInfo("Section MISC Local Diming", SSM_RW_LOCAL_DIMING_START, SSM_RW_LOCAL_DIMING_LEN); + SSMPrintDataInfo("Section MISC VDAC 2D", SSM_RW_VDAC_2D_START, SSM_RW_VDAC_2D_LEN); + SSMPrintDataInfo("Section MISC VDAC 3D", SSM_RW_VDAC_3D_START, SSM_RW_VDAC_3D_LEN); + SSMPrintDataInfo("Section MISC Non Standard", SSM_RW_NON_STANDARD_START, SSM_RW_NON_STANDARD_LEN); + SSMPrintDataInfo("Section MISC adb switch", SSM_RW_ADB_SWITCH_START, SSM_RW_ADB_SWITCH_LEN); + SSMPrintDataInfo("Section MISC serial cmd switch", SSM_RW_SERIAL_CMD_SWITCH_START, SSM_RW_SERIAL_CMD_SWITCH_LEN); + SSMPrintDataInfo("Section MISC ca buffer size", SSM_RW_CA_BUFFER_SIZE_START, SSM_RW_CA_BUFFER_SIZE_LEN); + SSMPrintDataInfo("Section MISC noise gate threshold", SSM_RW_NOISE_GATE_THRESHOLD_START, SSM_RW_NOISE_GATE_THRESHOLD_LEN); + SSMPrintDataInfo("Section MISC DTV Type", SSM_RW_DTV_TYPE_START, SSM_RW_DTV_TYPE_LEN); + SSMPrintDataInfo("Section MISC UI graphy backlight", SSM_RW_UI_GRHPHY_BACKLIGHT_START, SSM_RW_UI_GRHPHY_BACKLIGHT_LEN); + SSMPrintDataInfo("Section MISC fast suspend flag", SSM_RW_FASTSUSPEND_FLAG_START, SSM_RW_FASTSUSPEND_FLAG_LEN); + + SSMPrintDataInfo("Section Customer", SSM_RW_CUSTOMER_DATA_START, SSM_RW_CUSTOMER_DATA_LEN); + + SSMPrintDataInfo("Section Mark 02", SSM_MARK_02_START, SSM_MARK_02_LEN); + + SSMPrintDataInfo("Section RW Test", SSM_RW_TEST_START, SSM_RW_TEST_LEN); + + SSMPrintDataInfo("Section Mark 03", SSM_MARK_03_START, SSM_MARK_03_LEN); + + SSMPrintDataInfo("Section Barcode(device id)", SSM_RSV_BAR_CODE_START, SSM_RSV_BAR_CODE_LEN); +#endif + + return 0; +}*/ + +CBlobDevice *CTvSettingDeviceFactory::getSaveDeviceFromConfigFile() +{ + const char *device_type = config_get_str("SETTING", "store.device.type", "file"); + const char *device_path = config_get_str("SETTING", "device_path", "/param/default_data"); + const char *device_size = config_get_str("SETTING", "device_size", "0x1000"); + LOGD("getSaveDeviceFromConfigFile type=%s path=%s size=%s", device_type, device_path, device_size); + + // + if (mpCurDevice != NULL) delete mpCurDevice; + + if (strcmp(device_type, "file") == 0) { + mpCurDevice = new CBlobDeviceFile(); + } else if (strcmp(device_type, "e2prom") == 0) { + } else if (strcmp(device_type, "ram") == 0) { + } + + return mpCurDevice; +} diff --git a/tvapi/libtv/tvsetting/CTvSettingDeviceFactory.h b/tvapi/libtv/tvsetting/CTvSettingDeviceFactory.h new file mode 100644 index 0000000..e4de350 --- a/dev/null +++ b/tvapi/libtv/tvsetting/CTvSettingDeviceFactory.h @@ -0,0 +1,23 @@ +#ifndef TV_SETTING_DEVICE_FACTORY +#define TV_SETTING_DEVICE_FACTORY +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/stat.h> + +#include "CBlobDevice.h" + +#include "../tvconfig/tvconfig.h" + +#include "CTvSettingCfg.h" + +class CTvSettingDeviceFactory +{ +public: + CTvSettingDeviceFactory(); + ~CTvSettingDeviceFactory(); + CBlobDevice *getSaveDeviceFromConfigFile(); +private: + CBlobDevice *mpCurDevice; +}; +#endif diff --git a/tvapi/libtv/tvsetting/TvKeyData.cpp b/tvapi/libtv/tvsetting/TvKeyData.cpp new file mode 100644 index 0000000..5a7563f --- a/dev/null +++ b/tvapi/libtv/tvsetting/TvKeyData.cpp @@ -0,0 +1,1392 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <fcntl.h> +#include <errno.h> +#include <sys/stat.h> +#include <sys/wait.h> +#include <cutils/properties.h> + +#include <netinet/ether.h> +#include <netinet/if_ether.h> + +#include <netutils/ifc.h> +#include <netutils/dhcp.h> + +#include "tvconfig/tvconfig.h" +#include "CTvSettingCfg.h" +#include "TvKeyData.h" + +#define CC_MAX_KEY_DATA_SIZE (2048) +#define CC_MAX_FILE_PATH (256) + +#define CC_MAC_LEN (6) +#define CC_HDCP_KEY_TOTAL_SIZE (368) +#define CC_HDCP_KEY_HEAD_SIZE (40) +#define CC_HDCP_KEY_CONTENT_SIZE (CC_HDCP_KEY_TOTAL_SIZE - CC_HDCP_KEY_HEAD_SIZE) + +#define CC_CUSTOMER_HDMI_EDID_TOTAL_SIZE (SSM_HDMI_EDID_SIZE + 4) + +#define CS_MAC_ADDRESS_STARTWRK_EN_CFG "ssm.macaddr.startwork.en" +#define CS_BARCODE_LEN_CFG "ssm.barcode.len" + +#define CS_HDCP_KEY_EN_CFG "ssm.handle.hdcpkey.en" +#define CS_HDCP_KEY_DEMO_EN_CFG "ssm.handle.hdcpkey.demo.en" +#define CS_HDCP_KEY_FILE_PATH_CFG "ssm.handle.hdcpkey.file.path" +#define CS_HDCP_KEY_FILE_OFFSET_CFG "ssm.handle.hdcpkey.file.offset" +#define CS_HDCP_KEY_HEADER_EN_CFG "ssm.handle.hdcpkey.header.en" + + +#define CS_HDMI_EDID_EN_CFG "ssm.handle.hdmi.edid.en" +#define CS_HDMI_EDID_USE_CFG "ssm.handle.hdmi.edid.use" +#define CS_HDMI_EDID_FILE_PATH_CFG "ssm.handle.hdmi.edid.file.path" +#define CS_HDMI_PORT1_EDID_FILE_PATH_CFG "ssm.handle.hdmi.port1.edid.file.path" +#define CS_HDMI_PORT2_EDID_FILE_PATH_CFG "ssm.handle.hdmi.port2.edid.file.path" +#define CS_HDMI_PORT3_EDID_FILE_PATH_CFG "ssm.handle.hdmi.port3.edid.file.path" +#define CS_HDMI_EDID_FILE_OFFSET_CFG "ssm.handle.hdmi.edid.file.offset" + +#define CS_RGBOGO_FILE_PATH_CFG "ssm.rgbogo.file.path" +#define CS_RGBOGO_FILE_OFFSET_CFG "ssm.rgbogo.file.offset" + +#define CS_AUDIO_NOLINEPOINTS_FILE_PATH_CFG "ssm.audio.nolinepoints.file.path" +#define CS_AUDIO_NOLINEPOINTS_FILE_OFFSET_CFG "ssm.audio.nolinepoints.file.offset" + +static unsigned char mHDCPKeyDefHeaderBuf[CC_HDCP_KEY_HEAD_SIZE] = { + //40 bytes + 0x53, 0x4B, 0x59, 0x01, 0x00, 0x10, 0x0D, 0x15, 0x3A, 0x8E, // 000~009 + 0x99, 0xEE, 0x2A, 0x55, 0x58, 0xEE, 0xED, 0x4B, 0xBE, 0x00, // 010~019 + 0x74, 0xA9, 0x00, 0x10, 0x0A, 0x21, 0xE3, 0x30, 0x66, 0x34, // 020~029 + 0xCE, 0x9C, 0xC7, 0x8B, 0x51, 0x27, 0xF9, 0x0B, 0xAD, 0x09, // 030~039 +}; + +static unsigned char mDefHDCPKeyContentBuf[CC_HDCP_KEY_CONTENT_SIZE] = { + //328 bytes + 0x5F, 0x4D, 0xC2, 0xCA, 0xA2, 0x13, 0x06, 0x18, 0x8D, 0x34, // 000~009 + 0x82, 0x46, 0x2D, 0xC9, 0x4B, 0xB0, 0x1C, 0xDE, 0x3D, 0x49, // 010~019 + 0x39, 0x58, 0xEF, 0x2B, 0x68, 0x39, 0x71, 0xC9, 0x4D, 0x25, // 020~029 + 0xE9, 0x75, 0x4D, 0xAC, 0x62, 0xF5, 0xF5, 0x87, 0xA0, 0xB2, // 030~039 + 0x4A, 0x60, 0xD3, 0xF1, 0x09, 0x3A, 0xB2, 0x3E, 0x19, 0x4F, // 040~049 + 0x3B, 0x1B, 0x2F, 0x85, 0x14, 0x28, 0x44, 0xFC, 0x69, 0x6F, // 050~059 + 0x50, 0x42, 0x81, 0xBF, 0x7C, 0x2B, 0x3A, 0x17, 0x2C, 0x15, // 060~069 + 0xE4, 0x93, 0x77, 0x74, 0xE8, 0x1F, 0x1C, 0x38, 0x54, 0x49, // 070~079 + 0x10, 0x64, 0x5B, 0x7D, 0x90, 0x3D, 0xA0, 0xE1, 0x8B, 0x67, // 080~089 + 0x5C, 0x19, 0xE6, 0xCA, 0x9D, 0xE9, 0x68, 0x5A, 0xB5, 0x62, // 090~099 + 0xDF, 0xA1, 0x28, 0xBC, 0x68, 0x82, 0x9A, 0x22, 0xC4, 0xDC, // 100~109 + 0x48, 0x85, 0x0F, 0xF1, 0x3E, 0x05, 0xDD, 0x1B, 0x2D, 0xF5, // 120~119 + 0x49, 0x3A, 0x15, 0x29, 0xE7, 0xB6, 0x0B, 0x2A, 0x40, 0xE3, // 120~129 + 0xB0, 0x89, 0xD5, 0x75, 0x84, 0x2E, 0x76, 0xE7, 0xBC, 0x63, // 130~139 + 0x67, 0xE3, 0x57, 0x67, 0x86, 0x81, 0xF4, 0xD7, 0xEA, 0x4D, // 140~149 + 0x89, 0x8E, 0x37, 0x95, 0x59, 0x1C, 0x8A, 0xCD, 0x79, 0xF8, // 150~159 + 0x4F, 0x82, 0xF2, 0x6C, 0x7E, 0x7F, 0x79, 0x8A, 0x6B, 0x90, // 160~169 + 0xC0, 0xAF, 0x4C, 0x8D, 0x43, 0x47, 0x1F, 0x9A, 0xF1, 0xBB, // 170~179 + 0x88, 0x64, 0x49, 0x14, 0x50, 0xD1, 0xC3, 0xDF, 0xA6, 0x87, // 180~189 + 0xA0, 0x15, 0x98, 0x51, 0x81, 0xF5, 0x97, 0x55, 0x10, 0x4A, // 190~199 + 0x99, 0x30, 0x54, 0xA4, 0xFC, 0xDA, 0x0E, 0xAC, 0x6A, 0xFA, // 200~209 + 0x90, 0xEE, 0x12, 0x70, 0x69, 0x74, 0x63, 0x46, 0x63, 0xFB, // 210~219 + 0xE6, 0x1F, 0x72, 0xEC, 0x43, 0x5D, 0x50, 0xFF, 0x03, 0x4F, // 220~229 + 0x05, 0x33, 0x88, 0x36, 0x93, 0xE4, 0x72, 0xD5, 0xCC, 0x34, // 230~239 + 0x52, 0x96, 0x15, 0xCE, 0xD0, 0x32, 0x52, 0x41, 0x4F, 0xBC, // 240~249 + 0x2D, 0xDF, 0xC5, 0xD6, 0x7F, 0xD5, 0x74, 0xCE, 0x51, 0xDC, // 250~259 + 0x10, 0x5E, 0xF7, 0xAA, 0x4A, 0x2D, 0x20, 0x9A, 0x17, 0xDD, // 260~269 + 0x30, 0x89, 0x71, 0x82, 0x36, 0x50, 0x09, 0x1F, 0x7C, 0xF3, // 270~279 + 0x12, 0xE9, 0x43, 0x10, 0x5F, 0x51, 0xBF, 0xB8, 0x45, 0xA8, // 280~289 + 0x5A, 0x8D, 0x3F, 0x77, 0xE5, 0x96, 0x73, 0x68, 0xAB, 0x73, // 290~299 + 0xE5, 0x4C, 0xFB, 0xE5, 0x98, 0xB9, 0xAE, 0x74, 0xEB, 0x51, // 300~309 + 0xDB, 0x91, 0x07, 0x7B, 0x66, 0x02, 0x9B, 0x79, 0x03, 0xC5, // 310~319 + 0x34, 0x1C, 0x58, 0x13, 0x31, 0xD2, 0x4A, 0xEC, // 320~327 +}; + +static int CreateMacAddressStartWorkThread(); + +static int GetSSMHandleHDCPKeyEnableCFG(); +static int GetSSMHandleHDCPKeyHeaderEnableCFG(); +static int GetSSMHandleHDCPKeyDemoEnableCFG(); +static int SSMSetDefaultHDCPKey(unsigned char hdcp_key_buf[]); +static int RealHandleHDCPKey(unsigned char hdcp_key_buf[]); +static int GetHDCPKeyFromFile(int rd_off, int rd_size, + unsigned char data_buf[]); +static int SaveHDCPKeyToFile(int wr_off, int wr_size, unsigned char data_buf[]); + +static int GetHDMIEdidFromFile(int rd_off, int rd_size, int port, + unsigned char data_buf[]); +static int RealHandleHDMIEdid(unsigned char hdmi_edid_buf[]); +static int GetSSMHandleHDMIEdidByCustomerEnableCFG(); +static int AppendEdidPrefixCode(unsigned char customer_hdmi_edid_buf[], + unsigned char hdmi_edid_buf[]); + +static int GetRGBOGOFromFile(int rd_off, int rd_size, unsigned char data_buf[]); +static int SaveRGBOGOToFile(int wr_off, int wr_size, unsigned char data_buf[]); + +static int GetAudioNoLinePointsDataFromFile(int offset, int size, + unsigned char data_buf[]); +static int SaveAudioNoLinePointsDataToFile(int offset, int size, + unsigned char data_buf[]); + +static int TransStringToHex(int data_cnt, char data_buf[], + unsigned char hex_buf[]) +{ + int i = 0, j = 0, tmp_val = 0; + char tmp_buf[3] = { 0, 0, 0 }; + + while (i < data_cnt) { + tmp_val = 0; + tmp_buf[0] = data_buf[i]; + tmp_buf[1] = data_buf[i + 1]; + tmp_val = strtoul(tmp_buf, NULL, 16); + hex_buf[j] = tmp_val; + //LOGD("%s, hex_buf[%d] = 0x%x\n", __FUNCTION__, j, hex_buf[j]); + i += 2; + j += 1; + } + + return j; +} + +static int TransToHexString(int hex_cnt, char data_buf[], + unsigned char hex_buf[]) +{ + int i = 0, j = 0; + char tmp_buf[17] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + + data_buf[0] = 0; + for (i = 0; i < hex_cnt; i++) { + sprintf(tmp_buf, "%02X", (unsigned char) hex_buf[i]); + strcat(data_buf, tmp_buf); + } + + return 2 * hex_cnt; +} + +int ReadKeyData(const char *key_name, unsigned int rd_data_len, unsigned char data_buf[]) +{ + FILE *dev_fp = NULL; + int i = 0, rd_cnt = 0; + char tmp_ori_buf[CC_MAX_KEY_DATA_SIZE]; + unsigned char tmp_tran_buf[CC_MAX_KEY_DATA_SIZE]; + + dev_fp = fopen(CS_KEY_DATA_NAME_DEV_PATH, "w"); + if (dev_fp == NULL) { + LOGE("%s, open %s ERROR(%s)!!\n", __FUNCTION__, + CS_KEY_DATA_NAME_DEV_PATH, strerror(errno)); + return -1; + } + + fprintf(dev_fp, "%s", key_name); + + fclose(dev_fp); + dev_fp = NULL; + + dev_fp = fopen(CS_KEY_DATA_READ_DEV_PATH, "r"); + if (dev_fp == NULL) { + LOGE("%s, open %s ERROR(%s)!!\n", __FUNCTION__, + CS_KEY_DATA_READ_DEV_PATH, strerror(errno)); + return -1; + } + + memset((void *)tmp_ori_buf, 0, CC_MAX_KEY_DATA_SIZE); + memset((void *)tmp_tran_buf, 0, CC_MAX_KEY_DATA_SIZE); + fscanf(dev_fp, "%s", tmp_ori_buf); + + rd_cnt = strlen(tmp_ori_buf); + rd_cnt = TransStringToHex(rd_cnt, tmp_ori_buf, tmp_tran_buf); + + fclose(dev_fp); + dev_fp = NULL; + + if (rd_cnt != rd_data_len) { + return 0; + } + + memcpy(data_buf, tmp_tran_buf, rd_cnt); + return rd_cnt; +} + +int WriteKeyData(const char *key_name, int wr_size, char data_buf[]) +{ + FILE *dev_fp = NULL; + int wr_cnt = 0; + + dev_fp = fopen(CS_KEY_DATA_NAME_DEV_PATH, "w"); + if (dev_fp == NULL) { + LOGE("%s, open %s ERROR(%s)!!\n", __FUNCTION__, + CS_KEY_DATA_NAME_DEV_PATH, strerror(errno)); + return -1; + } + + fprintf(dev_fp, "%s", key_name); + + fclose(dev_fp); + dev_fp = NULL; + + dev_fp = fopen(CS_KEY_DATA_WRITE_DEV_PATH, "w"); + if (dev_fp == NULL) { + LOGE("%s, open %s ERROR(%s)!!\n", __FUNCTION__, + CS_KEY_DATA_WRITE_DEV_PATH, strerror(errno)); + return -1; + } + + wr_cnt = fwrite(data_buf, 1, wr_size, dev_fp); + + fclose(dev_fp); + dev_fp = NULL; + + return wr_cnt; +} + +int KeyData_GetMacAddressDataLen() +{ + return CC_MAC_LEN; +} + +int KeyData_ReadMacAddress(unsigned char data_buf[]) +{ + int i = 0, rd_size = 0; + int data_i_buf[CC_MAC_LEN] = { 0, 0, 0, 0, 0, 0 }; + unsigned char tmp_buf[128] = { 0 }; + + rd_size = ReadKeyData(CS_MAC_KEY_NAME, 17, tmp_buf); + if (rd_size == 17) { + sscanf((char *) tmp_buf, "%02x:%02x:%02x:%02x:%02x:%02x", + &data_i_buf[0], &data_i_buf[1], &data_i_buf[2], &data_i_buf[3], + &data_i_buf[4], &data_i_buf[5]); + for (i = 0; i < sizeof(data_i_buf); i++) { + data_buf[i] = data_i_buf[i] & 0xFF; + } + } + + return KeyData_GetMacAddressDataLen(); +} + +int KeyData_SaveMacAddress(unsigned char data_buf[]) +{ + int tmp_ret = 0, wr_size = 0; + unsigned char hex_buf[128] = { 0 }; + char tmp_buf[128] = { 0 }; + + sprintf((char *) hex_buf, "%02x:%02x:%02x:%02x:%02x:%02x", data_buf[0], + data_buf[1], data_buf[2], data_buf[3], data_buf[4], data_buf[5]); + + TransToHexString(strlen((char *) hex_buf), tmp_buf, hex_buf); + + wr_size = strlen(tmp_buf); + tmp_ret = WriteKeyData(CS_MAC_KEY_NAME, wr_size, tmp_buf); + if (tmp_ret != wr_size) { + return -1; + } + + CreateMacAddressStartWorkThread(); + + return 0; +} + +static int gSSMBarCodeLen = -1; +int KeyData_GetBarCodeDataLen() +{ + const char *config_value; + + if (gSSMBarCodeLen <= 0) { + config_value = config_get_str("TV", CS_BARCODE_LEN_CFG, "null"); + if (strcmp(config_value, "null") == 0) { + gSSMBarCodeLen = 32; + } else { + gSSMBarCodeLen = strtol(config_value, NULL, 10); + } + } + + return gSSMBarCodeLen; +} + +int KeyData_ReadBarCode(unsigned char data_buf[]) +{ + int rd_size = 0, tmp_len = 0; + unsigned char tmp_buf[CC_MAX_KEY_DATA_SIZE] = { 0 }; + + tmp_len = KeyData_GetBarCodeDataLen(); + rd_size = ReadKeyData(CS_BARCODE_KEY_NAME, tmp_len, tmp_buf); + LOGD("%s, rd_size = %d\n", __FUNCTION__, rd_size); + if (rd_size == tmp_len) { + memcpy(data_buf, tmp_buf, tmp_len); + } + + return rd_size; +} + +int KeyData_SaveBarCode(unsigned char data_buf[]) +{ + int tmp_len = 0, wr_size = 0; + char tmp_buf[512] = { 0 }; + + tmp_len = KeyData_GetBarCodeDataLen(); + + TransToHexString(tmp_len, tmp_buf, data_buf); + + wr_size = strlen(tmp_buf); + tmp_len = WriteKeyData(CS_BARCODE_KEY_NAME, wr_size, tmp_buf); + if (tmp_len != wr_size) { + return -1; + } + + return 0; +} + +int SSMReadHDCPKey(unsigned char hdcp_key_buf[]) +{ + int tmp_ret = 0, rd_size = 0; + unsigned char tmp_buf[CC_HDCP_KEY_TOTAL_SIZE] = { 0 }; + + tmp_ret = GetHDCPKeyFromFile(0, CC_HDCP_KEY_TOTAL_SIZE, hdcp_key_buf); + if (tmp_ret < 0) { + rd_size = ReadKeyData(CS_RX_HDCP_KEY_NAME, CC_HDCP_KEY_TOTAL_SIZE, tmp_buf); + LOGD("%s, rd_size = %d\n", __FUNCTION__, rd_size); + if (rd_size == CC_HDCP_KEY_TOTAL_SIZE) { + memcpy(hdcp_key_buf, tmp_buf, CC_HDCP_KEY_TOTAL_SIZE); + } + + return rd_size; + } + + return CC_HDCP_KEY_TOTAL_SIZE; +} + +int SSMReadHDCPKeyExcludingHeader(unsigned char hdcp_key_buf[]) +{ + int tmp_ret = 0, rd_size = 0; + unsigned char tmp_buf[CC_HDCP_KEY_CONTENT_SIZE] = { 0 }; + + tmp_ret = GetHDCPKeyFromFile(0, CC_HDCP_KEY_CONTENT_SIZE, hdcp_key_buf); + if (tmp_ret < 0) { + LOGD("%s, GetHDCPKeyFromFile error = %d\n", __FUNCTION__, tmp_ret); + return tmp_ret; + } + + return CC_HDCP_KEY_CONTENT_SIZE; +} + + +int SSMSaveHDCPKey(unsigned char hdcp_key_buf[]) +{ + int tmp_ret = 0, wr_size = 0; + char tmp_buf[CC_MAX_KEY_DATA_SIZE] = { 0 }; + + tmp_ret = SaveHDCPKeyToFile(0, CC_HDCP_KEY_TOTAL_SIZE, hdcp_key_buf); + if (tmp_ret < 0) { + TransToHexString(CC_HDCP_KEY_TOTAL_SIZE, tmp_buf, hdcp_key_buf); + + wr_size = strlen(tmp_buf); + tmp_ret = WriteKeyData(CS_RX_HDCP_KEY_NAME, wr_size, tmp_buf); + if (tmp_ret != wr_size) { + tmp_ret = -1; + } + } + + return tmp_ret; +} + +int SSMSetHDCPKey() +{ + int i = 0; + unsigned char hdcp_key_buf[CC_HDCP_KEY_TOTAL_SIZE]; + unsigned char *hdcp_key_head_ptr = NULL; + + if (GetSSMHandleHDCPKeyEnableCFG() == 1) { + if (GetSSMHandleHDCPKeyDemoEnableCFG() == 1) { + return SSMSetDefaultHDCPKey(hdcp_key_buf); + } else if (GetSSMHandleHDCPKeyHeaderEnableCFG() == 1) { + LOGD("%s, handle hdcp key excluding header.\n", __FUNCTION__); + //copy header + hdcp_key_head_ptr = mHDCPKeyDefHeaderBuf; + memcpy(hdcp_key_buf, hdcp_key_head_ptr, CC_HDCP_KEY_HEAD_SIZE); + //load content and copy, then set + unsigned char hdcp_key_content_buf[CC_HDCP_KEY_CONTENT_SIZE]; + if (SSMReadHDCPKeyExcludingHeader(hdcp_key_content_buf) == CC_HDCP_KEY_CONTENT_SIZE) { + memcpy(hdcp_key_buf + 40, hdcp_key_content_buf, CC_HDCP_KEY_CONTENT_SIZE); + LOGD("%s, using ssm's hdcp key.\n", __FUNCTION__); + return RealHandleHDCPKey(hdcp_key_buf); + } + } else { + if (SSMReadHDCPKey(hdcp_key_buf) == CC_HDCP_KEY_TOTAL_SIZE) { + LOGD("%s, using ssm's hdcp key.\n", __FUNCTION__); + return RealHandleHDCPKey(hdcp_key_buf); + } + } + } + + return -1; +} + +int SSMRefreshHDCPKey() +{ + int ret = -1; + ret = SSMSetHDCPKey(); + system ( "/system/bin/dec" ); + return ret; +} + +int SSMGetHDCPKeyDataLen() +{ + return CC_HDCP_KEY_TOTAL_SIZE; +} + +//hdmi edid +int SSMSetHDMIEdid(int port) +{ + int i = 0; + unsigned char customer_hdmi_edid_buf[CC_CUSTOMER_HDMI_EDID_TOTAL_SIZE]; + unsigned char hdmi_edid_buf[SSM_HDMI_EDID_SIZE]; + + if (port < 1 && port > SSM_HDMI_PORT_MAX) { + LOGD("%s, hdmi port error.%d\n", __FUNCTION__, port); + return -1; + } + + if (GetSSMHandleHDMIEdidByCustomerEnableCFG() == 1) { + if (SSMReadHDMIEdid(port, hdmi_edid_buf) == 0) { + LOGD("%s, using ssm's hdmi edid.\n", __FUNCTION__); + LOGD("%s, begin to write hdmi edid:0x%x, 0x%x, 0x%x, 0x%x.\n", + __FUNCTION__, hdmi_edid_buf[8], hdmi_edid_buf[9], + hdmi_edid_buf[10], hdmi_edid_buf[255]); + if (AppendEdidPrefixCode(customer_hdmi_edid_buf, hdmi_edid_buf) + == 0) + ; + return RealHandleHDMIEdid(customer_hdmi_edid_buf); + } + } + + return -1; +} + +int SSMReadHDMIEdid(int port, unsigned char hdmi_edid_buf[]) +{ + int tmp_ret = 0; + LOGD("%s, read hdmi edid from bin file.\n", __FUNCTION__); + tmp_ret = GetHDMIEdidFromFile(0, SSM_HDMI_EDID_SIZE, port, hdmi_edid_buf); + if (tmp_ret < 0) { + LOGD("%s, read hdmi edid error.\n", __FUNCTION__); + } else { + LOGD("%s, 0x%x, 0x%x, 0x%x, 0x%x.\n", __FUNCTION__, hdmi_edid_buf[8], + hdmi_edid_buf[9], hdmi_edid_buf[10], hdmi_edid_buf[255]); + } + return tmp_ret; +} + +int KeyData_SaveProjectID(int rw_val) +{ + int tmp_ret = 0, wr_size = 0; + char tmp_buf[64] = { 0 }; + + sprintf(tmp_buf, "%08X", rw_val); + + wr_size = strlen(tmp_buf); + tmp_ret = WriteKeyData(CS_PROJECT_ID_KEY_NAME, wr_size, tmp_buf); + if (tmp_ret != wr_size) { + return -1; + } + + return 0; +} + +int KeyData_ReadProjectID() +{ + int rd_size = 0, tmp_val = 0; + unsigned char tmp_buf[64] = { 0 }; + + rd_size = ReadKeyData(CS_PROJECT_ID_KEY_NAME, 4, tmp_buf); + LOGD("%s, rd_size = %d\n", __FUNCTION__, rd_size); + if (rd_size == 4) { + tmp_val = 0; + tmp_val |= tmp_buf[0] << 24; + tmp_val |= tmp_buf[1] << 16; + tmp_val |= tmp_buf[2] << 8; + tmp_val |= tmp_buf[3] << 0; + } + + return tmp_val; +} + +int SSMSaveRGBOGOValue(int offset, int size, unsigned char data_buf[]) +{ + return SaveRGBOGOToFile(offset, size, data_buf); +} + +int SSMReadRGBOGOValue(int offset, int size, unsigned char data_buf[]) +{ + return GetRGBOGOFromFile(offset, size, data_buf); +} + +int SSMSaveAudioNoLinePoints(int offset, int size, unsigned char tmp_buf[]) +{ + return SaveAudioNoLinePointsDataToFile(offset, size, tmp_buf); +} + +int SSMReadAudioNoLinePoints(int offset, int size, unsigned char tmp_buf[]) +{ + return GetAudioNoLinePointsDataFromFile(offset, size, tmp_buf); +} + +/**************************** start mac address static functions ****************************/ +#define CC_ERR_THREAD_ID (0) + +static pthread_t mMacAddressStartWorkThreadID = CC_ERR_THREAD_ID; + +static volatile unsigned int mMacAddressLow = -1; +static volatile unsigned int mMacAddressHigh = -1; +static volatile int mMacAddressStartWorkThreadExecFlag = -1; +static volatile int mMacAddressStartWorkThreadTurnOnFlag = -1; + +static pthread_mutex_t mac_address_low_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t mac_address_high_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t mac_address_exec_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t mac_address_turnon_mutex = PTHREAD_MUTEX_INITIALIZER; + +static int GetSSMMacAddressStartWorkEnableCFG() +{ + const char *config_value; + + config_value = config_get_str("TV", CS_MAC_ADDRESS_STARTWRK_EN_CFG, "null"); + if (strcmp(config_value, "null") == 0) { + LOGD( + "%s, get config is \"%s\", return 0 to not enable mac address start work.\n", + __FUNCTION__, config_value); + return 0; + } + + return strtoul(config_value, NULL, 10); +} + +static unsigned int SetMacAddressLow(unsigned int low_val) +{ + unsigned int tmp_val; + + pthread_mutex_lock(&mac_address_low_mutex); + + tmp_val = mMacAddressLow; + + mMacAddressLow = low_val; + + pthread_mutex_unlock(&mac_address_low_mutex); + + return tmp_val; +} + +static unsigned int GetMacAddressLow() +{ + unsigned int tmp_val = 0; + + pthread_mutex_lock(&mac_address_low_mutex); + + tmp_val = mMacAddressLow; + + pthread_mutex_unlock(&mac_address_low_mutex); + + return tmp_val; +} + +static unsigned int SetMacAddressHigh(unsigned int high_val) +{ + unsigned int tmp_val; + + pthread_mutex_lock(&mac_address_high_mutex); + + tmp_val = mMacAddressHigh; + + mMacAddressHigh = high_val; + + pthread_mutex_unlock(&mac_address_high_mutex); + + return tmp_val; +} + +static unsigned int GetMacAddressHigh() +{ + int tmp_val = 0; + + pthread_mutex_lock(&mac_address_high_mutex); + + tmp_val = mMacAddressHigh; + + pthread_mutex_unlock(&mac_address_high_mutex); + + return tmp_val; +} + +static int SetMacAddressStartWorkThreadExecFlag(int tmp_flag) +{ + int tmp_val; + + pthread_mutex_lock(&mac_address_exec_mutex); + + tmp_val = mMacAddressStartWorkThreadExecFlag; + + mMacAddressStartWorkThreadExecFlag = tmp_flag; + + pthread_mutex_unlock(&mac_address_exec_mutex); + + return tmp_val; +} + +static int GetMacAddressStartWorkThreadExecFlag() +{ + int tmp_val = 0; + + pthread_mutex_lock(&mac_address_exec_mutex); + + tmp_val = mMacAddressStartWorkThreadExecFlag; + + pthread_mutex_unlock(&mac_address_exec_mutex); + + return tmp_val; +} + +static int SetMacAddressStartWorkThreadTurnOnFlag(int tmp_flag) +{ + int tmp_val; + + pthread_mutex_lock(&mac_address_turnon_mutex); + + tmp_val = mMacAddressStartWorkThreadTurnOnFlag; + + mMacAddressStartWorkThreadTurnOnFlag = tmp_flag; + + pthread_mutex_unlock(&mac_address_turnon_mutex); + + return tmp_val; +} + +static int GetMacAddressStartWorkThreadTurnOnFlag() +{ + int tmp_val = 0; + + pthread_mutex_lock(&mac_address_turnon_mutex); + + tmp_val = mMacAddressStartWorkThreadTurnOnFlag; + + pthread_mutex_unlock(&mac_address_turnon_mutex); + + return tmp_val; +} + +static void *SSMMacAddressStartWorkMainApp(void *data) +{ + unsigned int curMacAddrLow = 0, curMacAddrHigh = 0; + int p_status; + char ssm_addr_str[128]; + const char *iname = "eth0"; + pid_t pid; + + LOGD("%s, entering...\n", __FUNCTION__); + + if (GetSSMMacAddressStartWorkEnableCFG() == 0) { + LOGE("%s, ssm mac address start work is not enable.\n", "TV"); + return NULL; + } + + curMacAddrLow = GetMacAddressLow(); + curMacAddrHigh = GetMacAddressHigh(); + + while (GetMacAddressStartWorkThreadTurnOnFlag() == 1) { + pid = fork(); + if (pid == 0) { + if (execl("/system/bin/stop", "stop_eth_dhcpcd", "eth_dhcpcd", NULL) + < 0) { + _exit(-1); + } + _exit(0); + } + waitpid(pid, &p_status, 0); + + ifc_init(); + + ifc_down(iname); + + sprintf(ssm_addr_str, "%02x:%02x:%02x:%02x:%02x:%02x", + ((curMacAddrLow >> 0) & 0xFF), ((curMacAddrLow >> 8) & 0xFF), + ((curMacAddrLow >> 16) & 0xFF), ((curMacAddrLow >> 24) & 0xFF), + ((curMacAddrHigh >> 0) & 0xFF), ((curMacAddrHigh >> 8) & 0xFF)); + struct ether_addr *addr = ether_aton(ssm_addr_str); + if (addr) { + ifc_set_hwaddr(iname, addr->ether_addr_octet); + } + + ifc_up(iname); + + ifc_close(); + + if (curMacAddrLow == GetMacAddressLow() + && curMacAddrHigh == GetMacAddressHigh()) { + break; + } + + curMacAddrLow = GetMacAddressLow(); + curMacAddrHigh = GetMacAddressHigh(); + } + + return NULL; +} + +static void *SSMMacAddressStartWorkThreadMain(void *data) +{ + void *tmp_ret = NULL; + + SetMacAddressStartWorkThreadExecFlag(1); + + tmp_ret = SSMMacAddressStartWorkMainApp(NULL); + + SetMacAddressStartWorkThreadExecFlag(0); + + return tmp_ret; +} + +static int KillMacAddressStartWorkThread() +{ + int i = 0, tmp_timeout_count = 600; + + SetMacAddressStartWorkThreadTurnOnFlag(0); + while (1) { + if (GetMacAddressStartWorkThreadExecFlag() == 0) { + break; + } + + if (i >= tmp_timeout_count) { + break; + } + + i++; + + usleep(100 * 1000); + } + + if (i == tmp_timeout_count) { + LOGE( + "%s, we have try %d times, but the mac address start work thread's exec flag is still(%d)!!!\n", + "TV", tmp_timeout_count, + GetMacAddressStartWorkThreadExecFlag()); + return -1; + } + + pthread_join(mMacAddressStartWorkThreadID, NULL); + mMacAddressStartWorkThreadID = CC_ERR_THREAD_ID; + + LOGD("%s, kill the mac address start work thread sucess.\n", __FUNCTION__); + + return 0; +} + +static int CreateMacAddressStartWorkThread() +{ + unsigned int macAddrLow = 0, macAddrHigh = 0; + pthread_attr_t attr; + struct sched_param param; + unsigned char ssm_addr_buf[16] = { 0, 0, 0, 0, 0, 0 }; + + if (KeyData_ReadMacAddress(ssm_addr_buf) < 0) { + return -1; + } + + macAddrLow = 0; + macAddrLow |= ((ssm_addr_buf[0] & 0xFF) << 0); + macAddrLow |= ((ssm_addr_buf[1] & 0xFF) << 8); + macAddrLow |= ((ssm_addr_buf[2] & 0xFF) << 16); + macAddrLow |= ((ssm_addr_buf[3] & 0xFF) << 24); + + macAddrHigh = 0; + macAddrHigh |= ((ssm_addr_buf[4] & 0xFF) << 0); + macAddrHigh |= ((ssm_addr_buf[5] & 0xFF) << 8); + + if (mMacAddressStartWorkThreadID != CC_ERR_THREAD_ID) { + if (GetMacAddressStartWorkThreadExecFlag() == 1) { + SetMacAddressLow(macAddrLow); + SetMacAddressHigh(macAddrHigh); + return 0; + } else { + KillMacAddressStartWorkThread(); + } + } + + SetMacAddressLow(macAddrLow); + SetMacAddressHigh(macAddrHigh); + SetMacAddressStartWorkThreadTurnOnFlag(1); + + pthread_attr_init(&attr); + pthread_attr_setschedpolicy(&attr, SCHED_RR); + param.sched_priority = 20; + pthread_attr_setschedparam(&attr, ¶m); + + if (pthread_create(&mMacAddressStartWorkThreadID, &attr, + SSMMacAddressStartWorkThreadMain, NULL) < 0) { + pthread_attr_destroy(&attr); + mMacAddressStartWorkThreadID = CC_ERR_THREAD_ID; + return -1; + } + + pthread_attr_destroy(&attr); + + LOGD("%s, create channel select thread sucess.\n", __FUNCTION__); + + return 0; +} +/**************************** end mac address static functions ****************************/ + +/**************************** start hdcp key static functions ****************************/ +static int GetSSMHandleHDCPKeyEnableCFG() +{ + const char *config_value; + + config_value = config_get_str("TV", CS_HDCP_KEY_EN_CFG, "null"); +#if 0 + LOGD("%s, get \"%s\" is \"%s\".\n", __FUNCTION__, CS_HDCP_KEY_EN_CFG, + config_value); +#endif + if (strcmp(config_value, "null") == 0) { + LOGD( + "%s, get config \"%s\" is \"%s\", return 0 to not enable handle hdcp key.\n", + __FUNCTION__, CS_HDCP_KEY_EN_CFG, config_value); + return 0; + } + + return strtoul(config_value, NULL, 10); +} + +static int GetSSMHandleHDCPKeyDemoEnableCFG() +{ + const char *config_value; + + config_value = config_get_str("TV", CS_HDCP_KEY_DEMO_EN_CFG, "null"); +#if 0 + LOGD("%s, get \"%s\" is \"%s\".\n", __FUNCTION__, CS_HDCP_KEY_DEMO_EN_CFG, + config_value); +#endif + if (strcmp(config_value, "null") == 0) { + LOGD( + "%s, get config \"%s\" is \"%s\", return 0 to not enable handle hdcp key demo.\n", + __FUNCTION__, CS_HDCP_KEY_DEMO_EN_CFG, config_value); + return 0; + } + + return strtoul(config_value, NULL, 10); +} + +static int GetSSMHandleHDCPKeyHeaderEnableCFG() +{ + const char *config_value; + + config_value = config_get_str("TV", CS_HDCP_KEY_HEADER_EN_CFG, "null"); +#if 1 + LOGD("%s, get \"%s\" is \"%s\".\n", __FUNCTION__, CS_HDCP_KEY_HEADER_EN_CFG, + config_value); +#endif + if (strcmp(config_value, "null") == 0) { + LOGD( + "%s, get config \"%s\" is \"%s\", return 0 to not enable handle hdcp key header.\n", + __FUNCTION__, CS_HDCP_KEY_HEADER_EN_CFG, config_value); + return 0; + } + + return strtoul(config_value, NULL, 10); +} + + +static int SSMSetDefaultHDCPKey(unsigned char hdcp_key_buf[]) +{ + int i = 0; + + for (i = 0; i < CC_HDCP_KEY_HEAD_SIZE; i++) { + hdcp_key_buf[i] = mHDCPKeyDefHeaderBuf[i]; + } + + for (i = 0; i < CC_HDCP_KEY_CONTENT_SIZE; i++) { + hdcp_key_buf[i + CC_HDCP_KEY_HEAD_SIZE] = mDefHDCPKeyContentBuf[i]; + } + + LOGD("%s, using default hdcp key.\n", __FUNCTION__); + + return RealHandleHDCPKey(hdcp_key_buf); +} + +static int RealHandleHDCPKey(unsigned char hdcp_key_buf[]) +{ + int i = 0, dev_fd = -1; + + if (hdcp_key_buf == NULL) { + return -1; + } + + dev_fd = open("/sys/class/hdmirx/hdmirx0/edid", O_RDWR); + if (dev_fd < 0) { + LOGE("%s, open edid file ERROR(%s)!!\n", "TV", strerror(errno)); + return -1; + } + + if (write(dev_fd, hdcp_key_buf, CC_HDCP_KEY_TOTAL_SIZE) < 0) { + close(dev_fd); + dev_fd = -1; + LOGE("%s, write edid file ERROR(%s)!!\n", "TV", strerror(errno)); + + return -1; + } + + close(dev_fd); + dev_fd = -1; + return 0; +} + +/**************************** end hdcp key static functions ****************************/ + +/**************************** start hdmi edid static functions ****************************/ +static int GetSSMHandleHDMIEdidByCustomerEnableCFG() +{ + const char *config_value; + + config_value = config_get_str("TV", CS_HDMI_EDID_EN_CFG, "null"); +#if 0 + LOGD("%s, get \"%s\" is \"%s\".\n", __FUNCTION__, CS_HDMI_EDID_EN_CFG, + config_value); +#endif + if (strcmp(config_value, "null") == 0) { + LOGD( + "%s, get config \"%s\" is \"%s\", return 0 to not enable handle hdmi edid by customer.\n", + __FUNCTION__, CS_HDMI_EDID_EN_CFG, config_value); + return 0; + } + + return strtoul(config_value, NULL, 10); +} +static int RealHandleHDMIEdid(unsigned char customer_hdmi_edid_buf[]) +{ + int i = 0, dev_fd = -1; + + if (customer_hdmi_edid_buf == NULL) { + return -1; + } + + dev_fd = open("/sys/class/hdmirx/hdmirx0/edid", O_RDWR); + if (dev_fd < 0) { + LOGE("%s, open edid file ERROR(%s)!!\n", "TV", strerror(errno)); + return -1; + } + + if (write(dev_fd, customer_hdmi_edid_buf, CC_CUSTOMER_HDMI_EDID_TOTAL_SIZE) + < 0) { + close(dev_fd); + dev_fd = -1; + LOGE("%s, write edid file ERROR(%s)!!\n", "TV", strerror(errno)); + + return -1; + } + + close(dev_fd); + dev_fd = -1; + return 0; +} + +static int AppendEdidPrefixCode(unsigned char customer_hdmi_edid_buf[], + unsigned char hdmi_edid_buf[]) +{ + if (customer_hdmi_edid_buf == NULL || hdmi_edid_buf == NULL) { + LOGE("%s, Append hdmi edid's prefixCode ERROR(%s)!!\n", "TV", + strerror(errno)); + return -1; + } + memset(customer_hdmi_edid_buf, 0, + sizeof(char) * CC_CUSTOMER_HDMI_EDID_TOTAL_SIZE); + customer_hdmi_edid_buf[0] = 'E'; + customer_hdmi_edid_buf[1] = 'D'; + customer_hdmi_edid_buf[2] = 'I'; + customer_hdmi_edid_buf[3] = 'D'; + memcpy(customer_hdmi_edid_buf + 4, hdmi_edid_buf, + CC_CUSTOMER_HDMI_EDID_TOTAL_SIZE - 4); + /* + LOGD("%s, customer_hdmi_edid_buf: %c,%c,%c,%c,%x,%x,%x,%x.\n", __FUNCTION__, + customer_hdmi_edid_buf[0],customer_hdmi_edid_buf[1],customer_hdmi_edid_buf[2],customer_hdmi_edid_buf[3], + customer_hdmi_edid_buf[12],customer_hdmi_edid_buf[13],customer_hdmi_edid_buf[14],customer_hdmi_edid_buf[15]);*/ + /* + LOGD("%s, customer_hdmi_edid_buf: \n", __FUNCTION__); + int i, j; + for (i = 0; i < 16; i++) { + LOGD("[%2d] ", i); + for (j = 0; j < 16; j++) { + LOGD("0x%02lx, ", customer_hdmi_edid_buf[4 + (i*16 + j)]); + } + LOGD("\n"); + }*/ + return 0; +} + +/**************************** end hdmi edid static functions ****************************/ + +/**************************** start critical data op functions ****************************/ +#define CC_OP_TYPE_READ (0) +#define CC_OP_TYPE_SAVE (1) +#define CC_DATA_TYPE_CHAR (0) +#define CC_DATA_TYPE_INT (1) + +typedef int (*op_fun_ptr)(char *, int, int, unsigned char *); + +typedef struct tagRWDataInfo { + int op_type; + int data_type; + int max_size; + int rw_off; + int rw_size; + void *data_buf; + char *path_cfg_name; + char *off_cfg_name; + op_fun_ptr op_cb; +} RWDataInfo; + +static int GetFilePathCFG(char *key_str, char path_buf[]) +{ + int tmp_ret = 0; + const char *cfg_value; + + path_buf[0] = '\0'; + cfg_value = config_get_str("TV", key_str, ""); + strcpy(path_buf, cfg_value); +#if 0 + LOGD("%s, get \"%s\" is \"%s\".\n", "TV", key_str, path_buf); +#endif + return tmp_ret; +} + +static int GetFileOffsetCFG(char *key_str) +{ + const char *cfg_value; + + cfg_value = config_get_str("TV", key_str, "null"); +#if 0 + LOGD("%s, get \"%s\" is \"%s\".\n", "TV", key_str, cfg_value); +#endif + if (strcmp(cfg_value, "null") == 0) { + LOGD("%s, get config \"%s\" is \"%s\", return 0 for default.\n", "TV", + key_str, cfg_value); + return 0; + } + + return strtol(cfg_value, NULL, 10); +} + +static int handleDataFilePath(char *file_name, int offset, int nsize, + char file_path[]) +{ + if (file_name == NULL) { + LOGE("%s, file_name is NULL!!!\n", "TV"); + return -1; + } + + return 0; +} + +static int ReadDataFromFile(char *file_name, int offset, int nsize, + unsigned char data_buf[]) +{ + int device_fd = -1; + int tmp_ret = 0; + char *tmp_ptr = NULL; + char file_path[512] = { '\0' }; + + if (data_buf == NULL) { + LOGE("%s, data_buf is NULL!!!\n", "TV"); + return -1; + } + + tmp_ret = handleDataFilePath(file_name, offset, nsize, file_path); + if (tmp_ret < 0) { + tmp_ptr = NULL; + } else if (tmp_ret == 0) { + tmp_ptr = file_name; + } else if (tmp_ret == 1) { + tmp_ptr = file_path; + } + + if (tmp_ptr == NULL) { + return -1; + } + + device_fd = open(tmp_ptr, O_RDONLY); + if (device_fd < 0) { + LOGE("%s: open file \"%s\" error(%s).\n", "TV", file_name, + strerror(errno)); + return -1; + } + + lseek(device_fd, offset, SEEK_SET); + read(device_fd, data_buf, nsize); + + close(device_fd); + device_fd = -1; + + return 0; +} + +static int SaveDataToFile(char *file_name, int offset, int nsize, + unsigned char data_buf[]) +{ + int device_fd = -1; + int i = 0, tmp_ret = 0; + char *tmp_ptr = NULL; + char file_path[512] = { '\0' }; + + if (data_buf == NULL) { + LOGE("%s, data_buf is NULL!!!\n", "TV"); + return -1; + } + + tmp_ret = handleDataFilePath(file_name, offset, nsize, file_path); + if (tmp_ret < 0) { + tmp_ptr = NULL; + } else if (tmp_ret == 0) { + tmp_ptr = file_name; + } else if (tmp_ret == 1) { + tmp_ptr = file_path; + } + + if (tmp_ptr == NULL) { + return -1; + } + + device_fd = open(tmp_ptr, O_RDWR | O_SYNC); + if (device_fd < 0) { + LOGE("%s: open file \"%s\" error(%s).\n", "TV", file_name, + strerror(errno)); + return -1; + } + + lseek(device_fd, offset, SEEK_SET); + write(device_fd, data_buf, nsize); + fsync(device_fd); + + close(device_fd); + device_fd = -1; + + return 0; +} + +static int RealRWData(RWDataInfo *data_info) +{ + int i = 0, file_off = 0; + char file_name[256] = { '\0' }; + + memset(file_name, '\0', 256); + GetFilePathCFG(data_info->path_cfg_name, file_name); +#if 0 + LOGD("%s, file_name is %s.\n", __FUNCTION__, file_name); +#endif + if (strlen(file_name) == 0) { + LOGE("%s, length of file_name is 0!!!\n", "TV"); + return -2; + } + + if (data_info->rw_off < 0) { + LOGE("%s, data_info->rw_off (%d) is less than 0!!!\n", "TV", + data_info->rw_off); + return -1; + } + + if (data_info->rw_off + data_info->rw_size > data_info->max_size) { + LOGE( + "%s, data_info->rw_off + data_info->rw_size (%d) is more than data_info->max_size(%d) !!!\n", + "TV", data_info->rw_off + data_info->rw_size, + data_info->max_size); + return -1; + } + + file_off = GetFileOffsetCFG(data_info->off_cfg_name); + if (file_off < 0) { + LOGE("%s, file_off (%d) is less than 0!!!\n", "TV", file_off); + return -1; + } + + file_off += data_info->rw_off; + + if (data_info->op_cb(file_name, file_off, data_info->rw_size, + (unsigned char *) data_info->data_buf) < 0) { + return -1; + } + + return 0; +} + +static int HandleRWData(RWDataInfo *data_info) +{ + int i = 0, tmp_ret = 0; + int *tmp_iptr = NULL; + unsigned char *tmp_cptr = NULL; + RWDataInfo tmpInfo; + + if (data_info == NULL) { + return -1; + } + + tmpInfo = *data_info; + + if (data_info->data_type == CC_DATA_TYPE_INT) { + tmp_cptr = new unsigned char[data_info->rw_size]; + if (tmp_cptr != NULL) { + tmpInfo.data_buf = tmp_cptr; + + if (tmpInfo.op_type == CC_OP_TYPE_SAVE) { + tmp_iptr = (int *) data_info->data_buf; + for (i = 0; i < data_info->rw_size; i++) { + tmp_cptr[i] = tmp_iptr[i]; + } + + tmp_ret |= RealRWData(&tmpInfo); + } else { + tmp_ret |= RealRWData(&tmpInfo); + + tmp_iptr = (int *) data_info->data_buf; + for (i = 0; i < data_info->rw_size; i++) { + tmp_iptr[i] = tmp_cptr[i]; + } + } + + delete tmp_cptr; + tmp_cptr = NULL; + + return tmp_ret; + } + } + + return RealRWData(&tmpInfo); +} + +static int GetRGBOGOFromFile(int rd_off, int rd_size, + unsigned char data_buf[]) +{ + RWDataInfo tmpInfo; + + tmpInfo.op_type = CC_OP_TYPE_READ; + tmpInfo.data_type = CC_DATA_TYPE_CHAR; + tmpInfo.max_size = SSM_CR_RGBOGO_LEN + SSM_CR_RGBOGO_CHKSUM_LEN; + tmpInfo.rw_off = rd_off; + tmpInfo.rw_size = rd_size; + tmpInfo.data_buf = data_buf; + tmpInfo.path_cfg_name = (char *) CS_RGBOGO_FILE_PATH_CFG; + tmpInfo.off_cfg_name = (char *) CS_RGBOGO_FILE_OFFSET_CFG; + tmpInfo.op_cb = ReadDataFromFile; + + return HandleRWData(&tmpInfo); +} + +static int SaveRGBOGOToFile(int wr_off, int wr_size, unsigned char data_buf[]) +{ + RWDataInfo tmpInfo; + + tmpInfo.op_type = CC_OP_TYPE_SAVE; + tmpInfo.data_type = CC_DATA_TYPE_CHAR; + tmpInfo.max_size = SSM_CR_RGBOGO_LEN + SSM_CR_RGBOGO_CHKSUM_LEN; + tmpInfo.rw_off = wr_off; + tmpInfo.rw_size = wr_size; + tmpInfo.data_buf = data_buf; + tmpInfo.path_cfg_name = (char *) CS_RGBOGO_FILE_PATH_CFG; + tmpInfo.off_cfg_name = (char *) CS_RGBOGO_FILE_OFFSET_CFG; + tmpInfo.op_cb = SaveDataToFile; + + return HandleRWData(&tmpInfo); +} + +static int GetAudioNoLinePointsDataFromFile(int rd_off, int rd_size, + unsigned char data_buf[]) +{ + RWDataInfo tmpInfo; + + tmpInfo.op_type = CC_OP_TYPE_READ; + tmpInfo.data_type = CC_DATA_TYPE_CHAR; + tmpInfo.max_size = 256; + tmpInfo.rw_off = rd_off; + tmpInfo.rw_size = rd_size; + tmpInfo.data_buf = data_buf; + tmpInfo.path_cfg_name = (char *) CS_AUDIO_NOLINEPOINTS_FILE_PATH_CFG; + tmpInfo.off_cfg_name = (char *) CS_AUDIO_NOLINEPOINTS_FILE_OFFSET_CFG; + tmpInfo.op_cb = ReadDataFromFile; + + return HandleRWData(&tmpInfo); +} + +static int SaveAudioNoLinePointsDataToFile(int wr_off, int wr_size, + unsigned char data_buf[]) +{ + RWDataInfo tmpInfo; + + tmpInfo.op_type = CC_OP_TYPE_SAVE; + tmpInfo.data_type = CC_DATA_TYPE_CHAR; + tmpInfo.max_size = 256; + tmpInfo.rw_off = wr_off; + tmpInfo.rw_size = wr_size; + tmpInfo.data_buf = data_buf; + tmpInfo.path_cfg_name = (char *) CS_AUDIO_NOLINEPOINTS_FILE_PATH_CFG; + tmpInfo.off_cfg_name = (char *) CS_AUDIO_NOLINEPOINTS_FILE_OFFSET_CFG; + tmpInfo.op_cb = SaveDataToFile; + + return HandleRWData(&tmpInfo); +} + +static int GetHDCPKeyFromFile(int rd_off, int rd_size, + unsigned char data_buf[]) +{ + RWDataInfo tmpInfo; + + tmpInfo.op_type = CC_OP_TYPE_READ; + tmpInfo.data_type = CC_DATA_TYPE_CHAR; + tmpInfo.max_size = CC_HDCP_KEY_TOTAL_SIZE; + tmpInfo.rw_off = rd_off; + tmpInfo.rw_size = rd_size; + tmpInfo.data_buf = data_buf; + tmpInfo.path_cfg_name = (char *) CS_HDCP_KEY_FILE_PATH_CFG; + tmpInfo.off_cfg_name = (char *) CS_HDCP_KEY_FILE_OFFSET_CFG; + tmpInfo.op_cb = ReadDataFromFile; + + return HandleRWData(&tmpInfo); +} + +static int SaveHDCPKeyToFile(int wr_off, int wr_size, + unsigned char data_buf[]) +{ + RWDataInfo tmpInfo; + + tmpInfo.op_type = CC_OP_TYPE_SAVE; + tmpInfo.data_type = CC_DATA_TYPE_CHAR; + tmpInfo.max_size = CC_HDCP_KEY_TOTAL_SIZE; + tmpInfo.rw_off = wr_off; + tmpInfo.rw_size = wr_size; + tmpInfo.data_buf = data_buf; + tmpInfo.path_cfg_name = (char *) CS_HDCP_KEY_FILE_PATH_CFG; + tmpInfo.off_cfg_name = (char *) CS_HDCP_KEY_FILE_OFFSET_CFG; + tmpInfo.op_cb = SaveDataToFile; + + return HandleRWData(&tmpInfo); +} + +static int GetHDMIEdidFromFile(int rd_off, int rd_size, int port, + unsigned char data_buf[]) +{ + RWDataInfo tmpInfo; + + tmpInfo.op_type = CC_OP_TYPE_READ; + tmpInfo.data_type = CC_DATA_TYPE_CHAR; + tmpInfo.max_size = SSM_HDMI_EDID_SIZE; + tmpInfo.rw_off = rd_off; + tmpInfo.rw_size = rd_size; + tmpInfo.data_buf = data_buf; + switch (port) { + case 1: + tmpInfo.path_cfg_name = (char *) CS_HDMI_PORT1_EDID_FILE_PATH_CFG; + break; + case 2: + tmpInfo.path_cfg_name = (char *) CS_HDMI_PORT2_EDID_FILE_PATH_CFG; + break; + case 3: + tmpInfo.path_cfg_name = (char *) CS_HDMI_PORT3_EDID_FILE_PATH_CFG; + break; + default: + LOGE("%s, port is error, =%d\n", "TV", port); + tmpInfo.path_cfg_name = (char *) CS_HDMI_EDID_FILE_PATH_CFG; + break; + } + tmpInfo.off_cfg_name = (char *) CS_HDMI_EDID_FILE_OFFSET_CFG; + tmpInfo.op_cb = ReadDataFromFile; + + return HandleRWData(&tmpInfo); +} + +/**************************** end critical data op functions ****************************/ diff --git a/tvapi/libtv/tvsetting/TvKeyData.h b/tvapi/libtv/tvsetting/TvKeyData.h new file mode 100644 index 0000000..aa7e514 --- a/dev/null +++ b/tvapi/libtv/tvsetting/TvKeyData.h @@ -0,0 +1,62 @@ +#ifndef __TV_KEY_DATA_H__ +#define __TV_KEY_DATA_H__ + +#include <pthread.h> +#include <stdint.h> + +#include "../tv/CTvLog.h" +#define LOG_TAG "TvKeyData" + +#define SSM_CR_RGBOGO_LEN (256) +#define SSM_CR_RGBOGO_CHKSUM_LEN (2) +#define SSM_HDMI_PORT_MAX (3) +#define SSM_HDMI_EDID_SIZE (256) + +#define CS_KEY_DATA_NAME_DEV_PATH "/sys/class/aml_keys/aml_keys/key_name" +#define CS_KEY_DATA_READ_DEV_PATH "/sys/class/aml_keys/aml_keys/key_read" +#define CS_KEY_DATA_WRITE_DEV_PATH "/sys/class/aml_keys/aml_keys/key_write" + +#define CS_MAC_KEY_NAME "mac" +#define CS_BARCODE_KEY_NAME "usid" +#define CS_RX_HDCP_KEY_NAME "rxhdcp20" +#define CS_PROJECT_ID_KEY_NAME "projid" + +int ReadKeyData(const char *key_name, unsigned char data_buf[]); +int WriteKeyData(const char *key_name, int wr_size, char data_buf[]); + +int KeyData_SaveProjectID(int rw_val); +int KeyData_ReadProjectID(); + +int KeyData_GetMacAddressDataLen(); +int KeyData_ReadMacAddress(unsigned char data_buf[]); +int KeyData_SaveMacAddress(unsigned char data_buf[]); + +int KeyData_GetBarCodeDataLen(); +int KeyData_ReadBarCode(unsigned char data_buf[]); +int KeyData_SaveBarCode(unsigned char data_buf[]); + +int SSMReadHDCPKey(unsigned char hdcp_key_buf[]); +int SSMSaveHDCPKey(unsigned char hdcp_key_buf[]); +int SSMSetHDCPKey(); +int SSMGetHDCPKeyDataLen(); +int SSMRefreshHDCPKey(); + + +int SSMReadHDMIEdid(int port, unsigned char hdmi_edid_buf[]); +int SSMSetHDMIEdid(int port); + +int SSMSaveRGBOGOValue(int offset, int size, unsigned char data_buf[]); +int SSMReadRGBOGOValue(int offset, int size, unsigned char data_buf[]); + +int SSMReadAudioNoLinePoints(int offset, int size, unsigned char tmp_buf[]); +int SSMSaveAudioNoLinePoints(int offset, int size, unsigned char tmp_buf[]); + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif + +#endif //__TV_KEY_DATA_H__ diff --git a/tvapi/libtv/tvsetting/audio_cfg.cpp b/tvapi/libtv/tvsetting/audio_cfg.cpp new file mode 100644 index 0000000..93e9e9e --- a/dev/null +++ b/tvapi/libtv/tvsetting/audio_cfg.cpp @@ -0,0 +1,1853 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <android/log.h> +#include <cutils/properties.h> + +#include "../tvsetting/CTvSetting.h" +#include "../tvconfig/tvconfig.h" +#include "audio_cfg.h" + +#define LOG_TAG "audio_cfg" +#include "CTvLog.h" + +#define CS_AUDIO_AMP_MASTER_NOLINE_SWITCH_CFG_NAME "audio.amp.master.noline.switch" +#define CS_AUDIO_AMP_MASTER_NOLINE_POINT_CNT_CFG_NAME "audio.amp.master.noline.point.cnt" +#define CS_AUDIO_AMP_MASTER_NOLINE_POINT_IND_BUF_CFG_NAME "audio.amp.master.noline.point.ind.buf" +#define CS_AUDIO_AMP_MASTER_NOLINE_POINT_DATA_DEF_BUF_CFG_NAME "audio.amp.master.noline.point.data.defbuf" +#define CS_AUDIO_AMP_MASTER_NOLINE_POINT_IND_DEF_BUF_CFG_NAME "audio.amp.master.noline.point.ind.defbuf" +#define CS_AUDIO_AMP_MASTER_NOLINE_POINT_DATA_TV_BUF_CFG_NAME "audio.amp.master.noline.point.data.tv" +#define CS_AUDIO_AMP_MASTER_NOLINE_POINT_DATA_AV_BUF_CFG_NAME "audio.amp.master.noline.point.data.av" +#define CS_AUDIO_AMP_MASTER_NOLINE_POINT_DATA_COMP_BUF_CFG_NAME "audio.amp.master.noline.point.data.comp" +#define CS_AUDIO_AMP_MASTER_NOLINE_POINT_DATA_HDMI_BUF_CFG_NAME "audio.amp.master.noline.point.data.hdmi" +#define CS_AUDIO_AMP_MASTER_NOLINE_POINT_DATA_VGA_BUF_CFG_NAME "audio.amp.master.noline.point.data.vga" +#define CS_AUDIO_AMP_MASTER_NOLINE_POINT_DATA_MPEG_BUF_CFG_NAME "audio.amp.master.noline.point.data.mpeg" + +#define CS_AUDIO_AMP_SUPPERBASS_NOLINE_SWITCH_CFG_NAME "audio.amp.supperbass.noline.switch" +#define CS_AUDIO_AMP_SUPPERBASS_NOLINE_POINT_CNT_CFG_NAME "audio.amp.supperbass.noline.point.cnt" +#define CS_AUDIO_AMP_SUPPERBASS_NOLINE_POINT_IND_BUF_CFG_NAME "audio.amp.supperbass.noline.point.ind.buf" +#define CS_AUDIO_AMP_SUPPERBASS_NOLINE_POINT_DATA_DEF_BUF_CFG_NAME "audio.amp.supperbass.noline.point.data.defbuf" +#define CS_AUDIO_AMP_SUPPERBASS_NOLINE_POINT_IND_DEF_BUF_CFG_NAME "audio.amp.supperbass.noline.point.ind.defbuf" + +#define CS_AUDIO_AMP_BALANCE_EXCHG_CFG_NAME "audio.amp.balance.exchg" + +#define CS_EQ_MOUDLE_DISABLE_CFG_NAME "audio.eq.module.disable" +#define CS_EQ_USING_ANDROID_CFG_NAME "audio.eq.using.android" +#define CS_EQ_PRESETBUF_CFG_NAME "audio.eq.presetbuf" +#define CS_EQ_GAIN_RANGE_CFG_NAME "audio.eq.gain.range" +#define CS_EQ_UI_GAIN_RANGE_CFG_NAME "audio.eq.uigain.range" +#define CS_EQ_AMP_MASTER_GAIN_CFG_NAME "audio.eq.ampmaster.gain" +#define CS_EQ_AMP_SUPPERBASS_GAIN_CFG_NAME "audio.eq.ampsupperbass.gain" + +#define CS_AUDIO_AMP_MAINVOL_TV_LUTBUF_CFG_NAME "audio.amp.mainvol.tv.lutbuf" +#define CS_AUDIO_AMP_MAINVOL_AV_LUTBUF_CFG_NAME "audio.amp.mainvol.av.lutbuf" +#define CS_AUDIO_AMP_MAINVOL_COMP_LUTBUF_CFG_NAME "audio.amp.mainvol.comp.lutbuf" +#define CS_AUDIO_AMP_MAINVOL_HDMI_LUTBUF_CFG_NAME "audio.amp.mainvol.hdmi.lutbuf" +#define CS_AUDIO_AMP_MAINVOL_VGA_LUTBUF_CFG_NAME "audio.amp.mainvol.vga.lutbuf" +#define CS_AUDIO_AMP_MAINVOL_MPEG_LUTBUF_CFG_NAME "audio.amp.mainvol.mpeg.lutbuf" + +#define CS_AUDIO_AMP_SUPPERBASSVOL_TV_LUTBUF_CFG_NAME "audio.amp.supbassvol.tv.lutbuf" +#define CS_AUDIO_AMP_SUPPERBASSVOL_AV_LUTBUF_CFG_NAME "audio.amp.supbassvol.av.lutbuf" +#define CS_AUDIO_AMP_SUPPERBASSVOL_COMP_LUTBUF_CFG_NAME "audio.amp.supbassvol.comp.lutbuf" +#define CS_AUDIO_AMP_SUPPERBASSVOL_HDMI_LUTBUF_CFG_NAME "audio.amp.supbassvol.hdmi.lutbuf" +#define CS_AUDIO_AMP_SUPPERBASSVOL_VGA_LUTBUF_CFG_NAME "audio.amp.supbassvol.vga.lutbuf" +#define CS_AUDIO_AMP_SUPPERBASSVOL_MPEG_LUTBUF_CFG_NAME "audio.amp.supbassvol.mpeg.lutbuf" + +#define CS_SRS_MOUDLE_DISABLE_CFG_NAME "audio.srs.module.disable" +#define CS_SRS_SOURROUND_DISABLE_CFG_NAME "audio.srs.sourround.disable" +#define CS_SRS_TRUBASS_DISABLE_CFG_NAME "audio.srs.trubass.disable" +#define CS_SRS_DIALOGCLARITY_DISABLE_CFG_NAME "audio.srs.dialogclarity.disable" +#define CS_SRS_SOURROUND_GAIN_CFG_NAME "audio.srs.sourround.gain" +#define CS_SRS_SOURROUND_AMP_MASTER_GAIN_CFG_NAME "audio.srs.sourround.ampmaster.gain" +#define CS_SRS_SOURROUND_AMP_SUPPERBASS_GAIN_CFG_NAME "audio.srs.sourround.ampsupperbass.gain" +#define CS_SRS_TRUBASS_ONLY_GAIN_CFG_NAME "audio.srs.trubass.only.gain" +#define CS_SRS_TRUBASS_ONLY_AMP_MASTER_GAIN_CFG_NAME "audio.srs.trubass.only.ampmaster.gain" +#define CS_SRS_TRUBASS_ONLY_AMP_SUPPERBASS_GAIN_CFG_NAME "audio.srs.trubass.only.ampsupperbass.gain" +#define CS_SRS_DIALOGCLARITY_ONLY_GAIN_CFG_NAME "audio.srs.dialogclarity.only.gain" +#define CS_SRS_DIALOGCLARITY_ONLY_AMP_MASTER_GAIN_CFG_NAME "audio.srs.dialogclarity.only.ampmaster.gain" +#define CS_SRS_DIALOGCLARITY_ONLY_AMP_SUPPERBASS_GAIN_CFG_NAME "audio.srs.dialogclarity.only.ampsupperbass.gain" +#define CS_SRS_DIALOGCLARITY_ONLY_DEFINITION_GAIN_CFG_NAME "audio.srs.dialogclarity.only.definition.gain" +#define CS_SRS_TRUBASS_DIALOGCLARITY_TRUBASS_GAIN_CFG_NAME "audio.srs.turbass.dialogclarity.trubass.gain" +#define CS_SRS_TRUBASS_DIALOGCLARITY_DIALOGCLARITY_GAIN_CFG_NAME "audio.srs.turbass.dialogclarity.dialogclarity.gain" +#define CS_SRS_TRUBASS_DIALOGCLARITY_DEFINITION_GAIN_CFG_NAME "audio.srs.turbass.dialogclarity.definition.gain" +#define CS_SRS_TRUBASS_DIALOGCLARITY_AMP_MASTER_GAIN_CFG_NAME "audio.srs.turbass.dialogclarity.ampmaster.gain" +#define CS_SRS_TRUBASS_DIALOGCLARITY_AMP_SUPPERBASS_GAIN_CFG_NAME "audio.srs.turbass.dialogclarity.ampsupperbass.gain" +#define CS_SRS_SUPPERBASS_ON_TRUBASS_SPEAKER_SIZE_CFG_NAME "audio.srs.supperbasson.turbass.speakersize" +#define CS_SRS_SUPPERBASS_OFF_TRUBASS_SPEAKER_SIZE_CFG_NAME "audio.srs.supperbassoff.turbass.speakersize" + +#define CS_AUDIO_DUMP_DATA_ENABLE_CFG_NAME "audio.dump.data.en" +#define CS_KEY_MUTE_CFG_NAME "audio.mute.keymute" +#define CS_AVOUT_INIT_MUTE_CFG_NAME "audio.avout.init.mute" +#define CS_SUPPERBASS_MODULE_DISABLE_CFG_NAME "audio.supperbass.module.disable" +#define CS_SUPPERBASS_SWITCH_DISABLE_CFG_NAME "audio.supperbass.switch.disable" +#define CS_DVI_SUPPORT_ENABLE_CFG_NAME "audio.dvi.support.enable" +#define CS_SRC_INPUT_TV_LINEIN_VOL_CFG_NAME "audio.srcinput.linein.tv.vol" +#define CS_SRC_INPUT_AV_LINEIN_VOL_CFG_NAME "audio.srcinput.linein.av.vol" +#define CS_SRC_INPUT_COMP_LINEIN_VOL_CFG_NAME "audio.srcinput.linein.comp.vol" +#define CS_SRC_INPUT_HDMI_LINEIN_VOL_CFG_NAME "audio.srcinput.linein.hdmi.vol" +#define CS_SRC_INPUT_VGA_LINEIN_VOL_CFG_NAME "audio.srcinput.linein.vga.vol" +#define CS_SRC_INPUT_MPEG_LINEIN_VOL_CFG_NAME "audio.srcinput.linein.mpeg.vol" +#define CS_SRC_INPUT_TV_LINEOUT_VOL_CFG_NAME "audio.srcinput.lineout.tv.vol" +#define CS_SRC_INPUT_AV_LINEOUT_VOL_CFG_NAME "audio.srcinput.lineout.av.vol" +#define CS_SRC_INPUT_COMP_LINEOUT_VOL_CFG_NAME "audio.srcinput.lineout.comp.vol" +#define CS_SRC_INPUT_HDMI_LINEOUT_VOL_CFG_NAME "audio.srcinput.lineout.hdmi.vol" +#define CS_SRC_INPUT_VGA_LINEOUT_VOL_CFG_NAME "audio.srcinput.lineout.vga.vol" +#define CS_SRC_INPUT_MPEG_LINEOUT_VOL_CFG_NAME "audio.srcinput.lineout.mpeg.vol" +#define CS_SRC_INPUT_MPEG_LINEOUT_VOL_CFG_NAME_OLD "audio.srcinput.lineout.vol" + +#define CS_AMP_MAINVOL_LUTBUF_COMPENSATION_TV_CFG_NAME "audio.amp.mainvol.lutbuf.compensation.tv" +#define CS_AMP_MAINVOL_LUTBUF_COMPENSATION_AV_CFG_NAME "audio.amp.mainvol.lutbuf.compensation.av" +#define CS_AMP_MAINVOL_LUTBUF_COMPENSATION_COMP_CFG_NAME "audio.amp.mainvol.lutbuf.compensation.comp" +#define CS_AMP_MAINVOL_LUTBUF_COMPENSATION_HDMI_CFG_NAME "audio.amp.mainvol.lutbuf.compensation.hdmi" +#define CS_AMP_MAINVOL_LUTBUF_COMPENSATION_VGA_CFG_NAME "audio.amp.mainvol.lutbuf.compensation.vga" +#define CS_AMP_MAINVOL_LUTBUF_COMPENSATION_MPEG_CFG_NAME "audio.amp.mainvol.lutbuf.compensation.mpeg" +#define CS_AMP_MAINVOL_LUTBUF_COMPENSATION_DTV_CFG_NAME "audio.amp.mainvol.lutbuf.compensation.dtv" + +#define CS_AUDIO_NOISE_GATE_ENABLE_CFG_NAME "audio.noise.gate.enable" +#define CS_AUDIO_NOISE_GATE_THRESHOLD_CFG_NAME "audio.noise.gate.threshold" +#define CS_AUDIO_NOISE_GATE_UPPER_BOUND_CFG_NAME "audio.noise.gate.upper.bound" + +#define CS_DISABLE_RESET_SYSTEM_FRAMESIZE_CFG_NAME "audio.reset.system.framesize.disable" +#define CS_AUDIO_SYSTEM_FRAMESIZE_CFG_NAME "audio.reset.system.framesize" + +#define CS_AUDIO_ARCHITECTURE_TYPE_CFG_NAME "audio.architecture.type" +#define CS_AUDIO_RESAMPLE_TYPE_CFG_NAME "audio.resample.type" + + +#define CC_MAX_SUP_LUT_CFG_INDEX (32) + +static int gMasterNoLinePointsIndexBuffer[CC_NO_LINE_POINTS_MAX_CNT] = { -1 }; +static int gMasterNoLinePointsDefDataBuffer[CC_NO_LINE_POINTS_MAX_CNT] = { -1 }; +static int gMasterNoLinePointsDefIndexBuffer[CC_NO_LINE_POINTS_MAX_CNT] = { -1 }; + +static int gSupperBassNoLinePointsIndexBuffer[CC_NO_LINE_POINTS_MAX_CNT] = +{ -1 }; +static int gSupperBassNoLinePointsDataBuffer[CC_NO_LINE_POINTS_MAX_CNT] = { -1 }; +static int gSupperBassNoLinePointsDefDataBuffer[CC_NO_LINE_POINTS_MAX_CNT] = { + -1 +}; +static int gSupperBassNoLinePointsDefIndexBuffer[CC_NO_LINE_POINTS_MAX_CNT] = { + -1 +}; + +static int gTVMasterNoLinePointsDataBuffer[CC_NO_LINE_POINTS_MAX_CNT] = { -1 }; +static int gAVMasterNoLinePointsDataBuffer[CC_NO_LINE_POINTS_MAX_CNT] = { -1 }; +static int gCOMPMasterNoLinePointsDataBuffer[CC_NO_LINE_POINTS_MAX_CNT] = { -1 }; +static int gHDMIMasterNoLinePointsDataBuffer[CC_NO_LINE_POINTS_MAX_CNT] = { -1 }; +static int gVGAMasterNoLinePointsDataBuffer[CC_NO_LINE_POINTS_MAX_CNT] = { -1 }; +static int gMPEGMasterNoLinePointsDataBuffer[CC_NO_LINE_POINTS_MAX_CNT] = { -1 }; +static int gHDMI4K2KMasterNoLinePointsDataBuffer[CC_NO_LINE_POINTS_MAX_CNT] = { + -1 +}; +static int gUSB4K2KMasterNoLinePointsDataBuffer[CC_NO_LINE_POINTS_MAX_CNT] = { + -1 +}; + +static int mTVMainVolumeDigitLutBuf_XX[CC_LUT_BUF_SIZE]; +static int mAVMainVolumeDigitLutBuf_XX[CC_LUT_BUF_SIZE]; +static int mCOMPMainVolumeDigitLutBuf_XX[CC_LUT_BUF_SIZE]; +static int mHDMIMainVolumeDigitLutBuf_XX[CC_LUT_BUF_SIZE]; +static int mVGAMainVolumeDigitLutBuf_XX[CC_LUT_BUF_SIZE]; +static int mMPEGMainVolumeDigitLutBuf_XX[CC_LUT_BUF_SIZE]; + +static int mTVSupperBassDigitLutBuf_XX[CC_LUT_BUF_SIZE]; +static int mAVSupperBassDigitLutBuf_XX[CC_LUT_BUF_SIZE]; +static int mCOMPSupperBassDigitLutBuf_XX[CC_LUT_BUF_SIZE]; +static int mHDMISupperBassDigitLutBuf_XX[CC_LUT_BUF_SIZE]; +static int mVGASupperBassDigitLutBuf_XX[CC_LUT_BUF_SIZE]; +static int mMPEGSupperBassDigitLutBuf_XX[CC_LUT_BUF_SIZE]; + +static int mEQPresetValueBuf_XX[CC_EQ_PRESET_BUF_SIZE]; +static int mEQPresetDefBuf[CC_EQ_PRESET_BUF_SIZE] = { + // + 50, 50, 50, 50, 50, 50, // SM_STD + 70, 60, 50, 60, 70, 50, // SM_MUSIC + 25, 50, 70, 66, 25, 50, // SM_NEWS + 75, 65, 50, 65, 75, 50, // SM_THEATER +}; + +static int GetAudioCfgData(const char *key_str, int *buf_item_count, int radix, + int data_buf[]) +{ + int cfg_item_count = 0; + char *token = NULL; + const char *strDelimit = ","; + const char *config_value; + char data_str[CC_CFG_VALUE_STR_MAX_LEN] = { 0 }; + + config_value = config_get_str("TV", key_str, "null"); + if (strcasecmp(config_value, "null") == 0) { + //LOGE("%s, can't get config \"%s\"!!!\n", "TV", key_str); + return -1; + } + + cfg_item_count = 0; + + memset((void *)data_str, 0, sizeof(data_str)); + strncpy(data_str, config_value, sizeof(data_str) - 1); + token = strtok(data_str, strDelimit); + while (token != NULL) { + if (cfg_item_count < *buf_item_count) { + data_buf[cfg_item_count] = strtol(token, NULL, radix); + + token = strtok(NULL, strDelimit); + cfg_item_count += 1; + } else { + LOGE("%s, we get data count more than desire count (%d)!!!\n", + __FUNCTION__ , *buf_item_count); + return -1; + } + } + + *buf_item_count = cfg_item_count; + + return 0; +} + +static int GetAudioCfgBufferData(const char *key_str, int *bufs_count, + int *buf_item_count, int radix, int data_buf[]) +{ + int cfg_item_count = 0, tmpTotalItemCount = 0; + char *token = NULL; + const char *strDelimit = ","; + const char *config_value; + char data_str[CC_CFG_VALUE_STR_MAX_LEN] = { 0 }; + + config_value = config_get_str("TV", key_str, "null"); + if (strcasecmp(config_value, "null") == 0) { + // LOGE("%s, can't get config \"%s\"!!!\n", "TV", key_str); + *bufs_count = 0; + *buf_item_count = 0; + return -1; + } + + tmpTotalItemCount = 0; + + memset((void *)data_str, 0, sizeof(data_str)); + strncpy(data_str, config_value, sizeof(data_str) - 1); + token = strtok(data_str, strDelimit); + while (token != NULL) { + if (cfg_item_count == 0) { + *bufs_count = strtol(token, NULL, radix); + } else if (cfg_item_count == 1) { + *buf_item_count = strtol(token, NULL, radix); + } else if (cfg_item_count >= 2) { + data_buf[tmpTotalItemCount] = strtol(token, NULL, radix); + tmpTotalItemCount += 1; + } + + token = strtok(NULL, strDelimit); + cfg_item_count += 1; + } + + if ((*bufs_count) * (*buf_item_count) != tmpTotalItemCount) { + LOGE("%s, get item count error!!! should be %d, real is %d.\n", + __FUNCTION__, (*bufs_count) * (*buf_item_count), + tmpTotalItemCount); + *bufs_count = 0; + *buf_item_count = 0; + return -1; + } + + return 0; +} + +static int GetAudioCfgSingleIntData(const char *key_str, int def_val) +{ + const char *config_value; + + config_value = config_get_str("TV", key_str, "null"); + + if (strcmp(config_value, "null") == 0) { + return def_val; + } + + return strtol(config_value, NULL, 10); +} + +template<typename T> +static int CheckNoLinePoints(int point_cnt, T points_buf[]) +{ + int i = 0, same_cnt = 0, tmp_direct = -1, error_flag = 0; + + if (point_cnt <= 1) { + LOGD("%s, point is less than 2.\n", __FUNCTION__); + return 0; + } + + for (i = 0; i < point_cnt - 1; i++) { + if (points_buf[i] < points_buf[i + 1]) { + if (tmp_direct == -1) { + tmp_direct = 0; + } else if (tmp_direct == 1) { + LOGD("%s, check have direct error.\n", __FUNCTION__); + return -1; + } + } else if (points_buf[i] > points_buf[i + 1]) { + if (tmp_direct == -1) { + tmp_direct = 1; + } else if (tmp_direct == 0) { + LOGD("%s, check have direct error.\n", __FUNCTION__); + return -1; + } + } else { + same_cnt += 1; + } + } + + if (same_cnt == i) { + LOGD("%s, check have same error.\n", __FUNCTION__); + return -1; + } + + LOGD("%s, check no error.\n", __FUNCTION__); + return 0; +} + +int *GetAudioAmplifierNoLinePointsIndexBuffer(int lut_buf_type, int get_type) +{ + if (lut_buf_type == CC_LUT_BUF_SUPPERBASS) { + return GetAudioAmplifierSupperBassNoLinePointsIndexBuffer(get_type); + } + + return NULL; +} + +int *GetAudioAmplifierNoLinePointsDataBuffer(int lut_buf_type, int get_type) +{ + if (lut_buf_type == CC_LUT_BUF_SUPPERBASS) { + return GetAudioAmplifierSupperBassNoLinePointsDataBuffer(get_type); + } + + return NULL; +} + +int GetAudioAmplifierMasterNoLineSwitchFlag() +{ + const char *config_value; + config_value = config_get_str("TV", + CS_AUDIO_AMP_MASTER_NOLINE_SWITCH_CFG_NAME, "null"); + + if (strcmp(config_value, "null") == 0) { + return 0; + } + + return strtol(config_value, NULL, 10); +} + +int GetAudioAmplifierSupperBassNoLineSwitchFlag() +{ + const char *config_value; + config_value = config_get_str("TV", + CS_AUDIO_AMP_SUPPERBASS_NOLINE_SWITCH_CFG_NAME, "null"); + + if (strcmp(config_value, "null") == 0) { + return 0; + } + + return strtol(config_value, NULL, 10); +} + +int GetAudioAmplifierMasterNoLinePointsCount() +{ + const char *config_value; + config_value = config_get_str("TV", + CS_AUDIO_AMP_MASTER_NOLINE_POINT_CNT_CFG_NAME, "null"); + + if (strcmp(config_value, "null") == 0) { + return 11; + } + + return strtol(config_value, NULL, 10); +} + +int GetAudioAmplifierSupperBassNoLinePointsCount() +{ + const char *config_value; + config_value = config_get_str("TV", + CS_AUDIO_AMP_SUPPERBASS_NOLINE_POINT_CNT_CFG_NAME, "null"); + + if (strcmp(config_value, "null") == 0) { + return 5; + } + + return strtol(config_value, NULL, 10); +} + +static int GetAudioAmplifierNoLinePointsBuffer(const char *key_str, + int buf_item_count, int data_buf[]) +{ + int i = 0, tmp_item_count = 0; + int tmp_buf[CC_NO_LINE_POINTS_MAX_CNT] = { 0 }; + + // if (data_buf[0] >= 0 && data_buf[0] <= 100) { + // LOGD("%s, we have get the index buffer.\n", "TV"); + // return 0; + // } + + tmp_item_count = buf_item_count; + if (GetAudioCfgData(key_str, &tmp_item_count, 10, tmp_buf) < 0) { + LOGE("%s, get index buffer data error, set default.\n", __FUNCTION__); + return -1; + } + + if (tmp_item_count != buf_item_count) { + LOGE( + "%s, get index buffer data error(buf item count error), set default.\n", + __FUNCTION__); + return -1; + } + + for (i = 0; i < buf_item_count; i++) { + data_buf[i] = tmp_buf[i]; + } + + return 0; +} + +int *GetAudioAmplifierSupperBassNoLinePointsIndexBuffer(int get_type) +{ + int buf_item_count = 0; + + buf_item_count = GetAudioAmplifierSupperBassNoLinePointsCount(); + if (GetAudioAmplifierNoLinePointsBuffer( + CS_AUDIO_AMP_SUPPERBASS_NOLINE_POINT_IND_BUF_CFG_NAME, + buf_item_count, gSupperBassNoLinePointsIndexBuffer) < 0) { + return GetAudioAmplifierSupperBassNoLinePointsDefIndexBuffer(); + } + + if (CheckNoLinePoints(buf_item_count, gSupperBassNoLinePointsIndexBuffer) + < 0) { + return GetAudioAmplifierSupperBassNoLinePointsDefIndexBuffer(); + } + + return gSupperBassNoLinePointsIndexBuffer; +} + +int *GetAudioAmplifierMasterNoLinePointsDataBuffer(int get_type) +{ + int i = 0, buf_item_count = 0, tmp_offset = 0; + int *tmpPtr = NULL; + unsigned char tmp_buf[CC_NO_LINE_POINTS_MAX_CNT] = { 0 }; + + buf_item_count = GetAudioAmplifierMasterNoLinePointsCount(); + + if (get_type == CC_GET_LUT_TV) { + tmpPtr = gTVMasterNoLinePointsDataBuffer; + tmp_offset = get_type * buf_item_count; + } else if (get_type == CC_GET_LUT_AV) { + tmpPtr = gAVMasterNoLinePointsDataBuffer; + tmp_offset = get_type * buf_item_count; + } else if (get_type == CC_GET_LUT_COMP) { + tmpPtr = gCOMPMasterNoLinePointsDataBuffer; + tmp_offset = get_type * buf_item_count; + } else if (get_type == CC_GET_LUT_HDMI) { + tmpPtr = gHDMIMasterNoLinePointsDataBuffer; + tmp_offset = get_type * buf_item_count; + } else if (get_type == CC_GET_LUT_VGA) { + tmpPtr = gVGAMasterNoLinePointsDataBuffer; + tmp_offset = get_type * buf_item_count; + } else if (get_type == CC_GET_LUT_MPEG) { + tmpPtr = gMPEGMasterNoLinePointsDataBuffer; + tmp_offset = get_type * buf_item_count; + } + + if (tmpPtr != NULL && tmpPtr[0] != -1) { + return tmpPtr; + } + + if (SSMReadAudioNoLinePoints(tmp_offset, buf_item_count, tmp_buf) < 0) { + return GetAudioAmplifierMasterNoLinePointsDefDataBuffer(get_type); + } + + if (CheckNoLinePoints(buf_item_count, tmp_buf) < 0) { + return GetAudioAmplifierMasterNoLinePointsDefDataBuffer(get_type); + } + + for (i = 0; i < buf_item_count; i++) { + tmpPtr[i] = tmp_buf[i]; + } + + return tmpPtr; +} + +int *GetAudioAmplifierSupperBassNoLinePointsDataBuffer(int get_type) +{ + int i = 0, buf_item_count = 0, tmp_offset = 0; + int *tmpPtr = NULL; + unsigned char tmp_buf[CC_NO_LINE_POINTS_MAX_CNT] = { 0 }; + + buf_item_count = GetAudioAmplifierSupperBassNoLinePointsCount(); + + tmpPtr = gSupperBassNoLinePointsDataBuffer; + if (tmpPtr != NULL && tmpPtr[0] != -1) { + return tmpPtr; + } + + tmp_offset = CC_GET_TYPE_CNT * GetAudioAmplifierMasterNoLinePointsCount(); + + if (SSMReadAudioNoLinePoints(tmp_offset, buf_item_count, tmp_buf) < 0) { + return GetAudioAmplifierSupperBassNoLinePointsDefDataBuffer(); + } + + if (CheckNoLinePoints(buf_item_count, tmp_buf) < 0) { + return GetAudioAmplifierSupperBassNoLinePointsDefDataBuffer(); + } + + for (i = 0; i < buf_item_count; i++) { + tmpPtr[i] = tmp_buf[i]; + } + + return tmpPtr; +} + +int *GetAudioAmplifierMasterNoLinePointsDefIndexBuffer() +{ + int i = 0, buf_item_count = 0; + + buf_item_count = GetAudioAmplifierMasterNoLinePointsCount(); + if (GetAudioAmplifierNoLinePointsBuffer( + CS_AUDIO_AMP_MASTER_NOLINE_POINT_IND_DEF_BUF_CFG_NAME, + buf_item_count, gMasterNoLinePointsDefIndexBuffer) < 0) { + gMasterNoLinePointsDefIndexBuffer[0] = 1; + + for (i = 1; i <= 10; i++) { + gMasterNoLinePointsDefIndexBuffer[i] = i * 10; + } + } + + if (CheckNoLinePoints(buf_item_count, gMasterNoLinePointsDefIndexBuffer) + < 0) { + gMasterNoLinePointsDefIndexBuffer[0] = 1; + + for (i = 1; i <= 10; i++) { + gMasterNoLinePointsDefIndexBuffer[i] = i * 10; + } + } + + return gMasterNoLinePointsDefIndexBuffer; +} + +int *GetAudioAmplifierSupperBassNoLinePointsDefIndexBuffer() +{ + int i = 0, buf_item_count = 0; + + buf_item_count = GetAudioAmplifierSupperBassNoLinePointsCount(); + if (GetAudioAmplifierNoLinePointsBuffer( + CS_AUDIO_AMP_SUPPERBASS_NOLINE_POINT_IND_DEF_BUF_CFG_NAME, + buf_item_count, gSupperBassNoLinePointsDefIndexBuffer) < 0) { + gSupperBassNoLinePointsDefIndexBuffer[0] = 1; + + for (i = 1; i <= 4; i++) { + gSupperBassNoLinePointsDefIndexBuffer[i] = i * 25; + } + } + + if (CheckNoLinePoints(buf_item_count, gSupperBassNoLinePointsDefIndexBuffer) + < 0) { + gSupperBassNoLinePointsDefIndexBuffer[0] = 1; + + for (i = 1; i <= 4; i++) { + gSupperBassNoLinePointsDefIndexBuffer[i] = i * 25; + } + } + + return gSupperBassNoLinePointsDefIndexBuffer; +} + +int *GetAudioAmplifierMasterNoLinePointsDefDataBuffer(int buf_type) +{ + int i = 0, buf_item_count = 0, point_buffer_flag = 0; + + buf_item_count = GetAudioAmplifierMasterNoLinePointsCount(); + + switch (buf_type) { + case CC_GET_LUT_TV: + point_buffer_flag = GetAudioAmplifierNoLinePointsBuffer( + CS_AUDIO_AMP_MASTER_NOLINE_POINT_DATA_TV_BUF_CFG_NAME, + buf_item_count, gMasterNoLinePointsDefDataBuffer); + break; + case CC_GET_LUT_AV: + point_buffer_flag = GetAudioAmplifierNoLinePointsBuffer( + CS_AUDIO_AMP_MASTER_NOLINE_POINT_DATA_AV_BUF_CFG_NAME, + buf_item_count, gMasterNoLinePointsDefDataBuffer); + break; + case CC_GET_LUT_COMP: + point_buffer_flag = GetAudioAmplifierNoLinePointsBuffer( + CS_AUDIO_AMP_MASTER_NOLINE_POINT_DATA_COMP_BUF_CFG_NAME, + buf_item_count, gMasterNoLinePointsDefDataBuffer); + break; + case CC_GET_LUT_HDMI: + point_buffer_flag = GetAudioAmplifierNoLinePointsBuffer( + CS_AUDIO_AMP_MASTER_NOLINE_POINT_DATA_HDMI_BUF_CFG_NAME, + buf_item_count, gMasterNoLinePointsDefDataBuffer); + break; + case CC_GET_LUT_VGA: + point_buffer_flag = GetAudioAmplifierNoLinePointsBuffer( + CS_AUDIO_AMP_MASTER_NOLINE_POINT_DATA_VGA_BUF_CFG_NAME, + buf_item_count, gMasterNoLinePointsDefDataBuffer); + break; + case CC_GET_LUT_MPEG: + point_buffer_flag = GetAudioAmplifierNoLinePointsBuffer( + CS_AUDIO_AMP_MASTER_NOLINE_POINT_DATA_MPEG_BUF_CFG_NAME, + buf_item_count, gMasterNoLinePointsDefDataBuffer); + break; + default: + point_buffer_flag = -1; + // LOGE("buffer type is wrong ,please check input Parameter !"); + break; + } + + if (point_buffer_flag < 0) { + for (i = 0; i < buf_item_count; i++) { + gMasterNoLinePointsDefDataBuffer[i] = 100 + i; + } + + return gMasterNoLinePointsDefDataBuffer; + } + + if (CheckNoLinePoints(buf_item_count, gMasterNoLinePointsDefDataBuffer) + < 0) { + for (i = 0; i < buf_item_count; i++) { + gMasterNoLinePointsDefDataBuffer[i] = 100 + i; + } + } + + return gMasterNoLinePointsDefDataBuffer; +} + +int *GetAudioAmplifierSupperBassNoLinePointsDefDataBuffer() +{ + int i = 0, buf_item_count = 0; + + buf_item_count = GetAudioAmplifierSupperBassNoLinePointsCount(); + if (GetAudioAmplifierNoLinePointsBuffer( + CS_AUDIO_AMP_SUPPERBASS_NOLINE_POINT_DATA_DEF_BUF_CFG_NAME, + buf_item_count, gSupperBassNoLinePointsDefDataBuffer) < 0) { + for (i = 0; i < buf_item_count; i++) { + gSupperBassNoLinePointsDefDataBuffer[i] = 100 + i; + } + } + + if (CheckNoLinePoints(buf_item_count, gSupperBassNoLinePointsDefDataBuffer) + < 0) { + for (i = 0; i < buf_item_count; i++) { + gSupperBassNoLinePointsDefDataBuffer[i] = 100 + i; + } + } + + return gSupperBassNoLinePointsDefDataBuffer; +} + +int GetAudioAmplifierBalanceExchangeCFG() +{ + const char *config_value; + config_value = config_get_str("TV", CS_AUDIO_AMP_BALANCE_EXCHG_CFG_NAME, + "null"); + if (strcmp(config_value, "null") == 0) { + return 0; //return 0 to disable balance exchange + } + + return strtol(config_value, NULL, 10); +} + +int GetAudioMainVolLutBufCFGIndexModifyEnable() +{ + const char *config_value; + + config_value = config_get_str("TV", "audio.amp.master.cfgindex.mod.en", + "null"); + + if (strcmp(config_value, "null") == 0) { + return 0; + } + + return strtoul(config_value, NULL, 10); +} + +int GetAudioMainVolLutBufNameModifyUbootenvCFG() +{ + char config_value[PROPERTY_VALUE_MAX]; + + memset(config_value, '\0', 32); + + property_get("ubootenv.var.ampindex", config_value, "null"); + if (strcasecmp(config_value, "null") == 0) { + return 0; + } + + return strtoul(config_value, NULL, 10); +} + +int GetAudioMainVolLutBufNameModifyFromUbootenv() +{ + const char *config_value; + + config_value = config_get_str("TV", + "audio.amp.mainvol.lutbufname.mod.ubootenv", "null"); + + if (strcmp(config_value, "null") == 0) { + return 0; + } + + return strtoul(config_value, NULL, 10); +} + +int GetAudioMainVolLutBufNameModifyEnableCFG() +{ + const char *config_value; + + config_value = config_get_str("TV", "audio.amp.mainvol.lutbufname.mod.en", + "null"); + + if (strcmp(config_value, "null") == 0) { + return 0; + } + + return strtoul(config_value, NULL, 10); +} + +int GetAudioMainVolLutBufNameCFG(int get_type, char name_buf[]) +{ + if (get_type == CC_GET_LUT_TV) { + strcpy(name_buf, "audio.amp.mainvol.tv.lb.name"); + } else if (get_type == CC_GET_LUT_AV) { + strcpy(name_buf, "audio.amp.mainvol.av.lb.name"); + } else if (get_type == CC_GET_LUT_COMP) { + strcpy(name_buf, "audio.amp.mainvol.comp.lb.name"); + } else if (get_type == CC_GET_LUT_HDMI) { + strcpy(name_buf, "audio.amp.mainvol.hdmi.lb.name"); + } else if (get_type == CC_GET_LUT_VGA) { + strcpy(name_buf, "audio.amp.mainvol.vga.lb.name"); + } else if (get_type == CC_GET_LUT_MPEG) { + strcpy(name_buf, "audio.amp.mainvol.mpeg.lb.name"); + } else if (get_type == CC_GET_LUT_HDMI_4K2K) { + strcpy(name_buf, "audio.amp.mainvol.hdmi4k2k.lb.name"); + } else if (get_type == CC_GET_LUT_USB_4K2K) { + strcpy(name_buf, "audio.amp.mainvol.usb4k2k.lb.name"); + } else { + return -1; + } + + return 0; +} + +static int GetAudioMainVolLutBufDataByModifyName(int get_type, + int *VolumeDigitLutBuf_XX) +{ + int i = 0, buf_count = 0, buf_item_count = 0; + char key_buf[128]; + const char *value_buf; + + memset(key_buf, '\0', 128); + + GetAudioMainVolLutBufNameCFG(get_type, key_buf); + + value_buf = config_get_str("TV", key_buf, (char *) ""); + + if (strcmp(value_buf, "") != 0) { + if (GetAudioCfgBufferData(value_buf, &buf_count, &buf_item_count, 10, + VolumeDigitLutBuf_XX) == 0) { + return 0; + } + } + + return -1; +} + +int *GetAudioAmplifierMasterVolumeLUTBufferPtr(int get_type, int audio_std) +{ + int buf_count = 0, buf_item_count = 0; + int name_en = GetAudioMainVolLutBufNameModifyEnableCFG(); + + if (name_en == 1) { + if (get_type == CC_GET_LUT_TV) { + if (GetAudioMainVolLutBufDataByModifyName(get_type, + mTVMainVolumeDigitLutBuf_XX) == 0) { + return mTVMainVolumeDigitLutBuf_XX; + } + } else if (get_type == CC_GET_LUT_AV) { + if (GetAudioMainVolLutBufDataByModifyName(get_type, + mAVMainVolumeDigitLutBuf_XX) == 0) { + return mAVMainVolumeDigitLutBuf_XX; + } + } else if (get_type == CC_GET_LUT_COMP) { + if (GetAudioMainVolLutBufDataByModifyName(get_type, + mCOMPMainVolumeDigitLutBuf_XX) == 0) { + return mCOMPMainVolumeDigitLutBuf_XX; + } + } else if (get_type == CC_GET_LUT_HDMI) { + if (GetAudioMainVolLutBufDataByModifyName(get_type, + mHDMIMainVolumeDigitLutBuf_XX) == 0) { + return mHDMIMainVolumeDigitLutBuf_XX; + } + } else if (get_type == CC_GET_LUT_VGA) { + if (GetAudioMainVolLutBufDataByModifyName(get_type, + mVGAMainVolumeDigitLutBuf_XX) == 0) { + return mVGAMainVolumeDigitLutBuf_XX; + } + } else if (get_type == CC_GET_LUT_MPEG) { + if (GetAudioMainVolLutBufDataByModifyName(get_type, + mMPEGMainVolumeDigitLutBuf_XX) == 0) { + return mMPEGMainVolumeDigitLutBuf_XX; + } + } + } else { + if (get_type == CC_GET_LUT_TV) { + if (GetAudioCfgBufferData(CS_AUDIO_AMP_MAINVOL_TV_LUTBUF_CFG_NAME, + &buf_count, &buf_item_count, 10, + mTVMainVolumeDigitLutBuf_XX) == 0) { + return mTVMainVolumeDigitLutBuf_XX; + } + } else if (get_type == CC_GET_LUT_AV) { + if (GetAudioCfgBufferData(CS_AUDIO_AMP_MAINVOL_AV_LUTBUF_CFG_NAME, + &buf_count, &buf_item_count, 10, + mAVMainVolumeDigitLutBuf_XX) == 0) { + return mAVMainVolumeDigitLutBuf_XX; + } + } else if (get_type == CC_GET_LUT_COMP) { + if (GetAudioCfgBufferData(CS_AUDIO_AMP_MAINVOL_COMP_LUTBUF_CFG_NAME, + &buf_count, &buf_item_count, 10, + mCOMPMainVolumeDigitLutBuf_XX) == 0) { + return mCOMPMainVolumeDigitLutBuf_XX; + } + } else if (get_type == CC_GET_LUT_HDMI) { + if (GetAudioCfgBufferData(CS_AUDIO_AMP_MAINVOL_HDMI_LUTBUF_CFG_NAME, + &buf_count, &buf_item_count, 10, + mHDMIMainVolumeDigitLutBuf_XX) == 0) { + return mHDMIMainVolumeDigitLutBuf_XX; + } + } else if (get_type == CC_GET_LUT_VGA) { + if (GetAudioCfgBufferData(CS_AUDIO_AMP_MAINVOL_VGA_LUTBUF_CFG_NAME, + &buf_count, &buf_item_count, 10, + mVGAMainVolumeDigitLutBuf_XX) == 0) { + return mVGAMainVolumeDigitLutBuf_XX; + } + } else if (get_type == CC_GET_LUT_MPEG) { + if (GetAudioCfgBufferData(CS_AUDIO_AMP_MAINVOL_MPEG_LUTBUF_CFG_NAME, + &buf_count, &buf_item_count, 10, + mMPEGMainVolumeDigitLutBuf_XX) == 0) { + return mMPEGMainVolumeDigitLutBuf_XX; + } + } + } + return NULL; +} + +int GetAudioSupperBassVolLutBufCFGIndexModifyEnable() +{ + const char *config_value; + config_value = config_get_str("TV", "audio.amp.supperbass.cfgindex.mod.en", + "null"); + //LOGD("%s, get audio.amp.supperbass.cfgindex.mod.en is %s \n", "TV", + // config_value); + + if (strcmp(config_value, "null") == 0) { + // LOGD( + // "%s, get config modify value \"%s\", return audio.amp.supperbass.cfgindex.mod.en.\n", + // "TV", config_value); + return 0; + } + + return strtoul(config_value, NULL, 10); +} + +int GetAudioSupperBassVolLutBufNameModifyEnableCFG() +{ + const char *config_value; + + config_value = config_get_str("TV", + "audio.amp.supbassvol.lutbufname.mod.en", "null"); + //LOGD("%s, audio.amp.supbassvol.lutbufname.mod.en is %s \n", "TV", + // config_value); + + if (strcmp(config_value, "null") == 0) { + // LOGD( + // "%s, get config enable value \"%s\", return 0 to not enable moidfy lut buffer name.\n", + // "TV", config_value); + return 0; + } + + return strtoul(config_value, NULL, 10); +} + +int GetAudioSupperBassVolLutBufNameCFG(int get_type, char name_buf[]) +{ + if (get_type == CC_GET_LUT_TV) { + strcpy(name_buf, "audio.amp.supbassvol.tv.lb.name"); + } else if (get_type == CC_GET_LUT_AV) { + strcpy(name_buf, "audio.amp.supbassvol.av.lb.name"); + } else if (get_type == CC_GET_LUT_COMP) { + strcpy(name_buf, "audio.amp.supbassvol.comp.lb.name"); + } else if (get_type == CC_GET_LUT_HDMI) { + strcpy(name_buf, "audio.amp.supbassvol.hdmi.lb.name"); + } else if (get_type == CC_GET_LUT_VGA) { + strcpy(name_buf, "audio.amp.supbassvol.vga.lb.name"); + } else if (get_type == CC_GET_LUT_MPEG) { + strcpy(name_buf, "audio.amp.supbassvol.mpeg.lb.name"); + } else if (get_type == CC_GET_LUT_HDMI_4K2K) { + strcpy(name_buf, "audio.amp.supbassvol.hdmi4k2k.lb.name"); + } else if (get_type == CC_GET_LUT_USB_4K2K) { + strcpy(name_buf, "audio.amp.supbassvol.usb4k2k.lb.name"); + } else { + return -1; + } + + return 0; +} + +static int GetAudioSupperBassByModifyName(int get_type, + int *VolumeDigitLutBuf_XX) +{ + int i = 0, buf_count = 0, buf_item_count = 0; + char key_buf[128]; + const char *value_buf; + + memset(key_buf, '\0', 128); + + GetAudioSupperBassVolLutBufNameCFG(get_type, key_buf); + + value_buf = config_get_str("TV", key_buf, (char *) ""); + //LOGD("%s, get_type = %d, key_buf = %s, value_buf = %s \n", "TV", + // get_type, key_buf, value_buf); + + if (strcmp(value_buf, "") != 0) { + if (GetAudioCfgBufferData(value_buf, &buf_count, &buf_item_count, 10, + VolumeDigitLutBuf_XX) == 0) { + return 0; + } + } + + return -1; +} + +int *GetAudioAmplifierSupperBassVolumeLUTBufferPtr(int get_type, + int audio_std) +{ + int buf_count = 0, buf_item_count = 0; + + int name_en = GetAudioSupperBassVolLutBufNameModifyEnableCFG(); + + if (name_en == 1) { + if (get_type == CC_GET_LUT_TV) { + if (GetAudioSupperBassByModifyName(get_type, + mTVSupperBassDigitLutBuf_XX) == 0) { + return mTVSupperBassDigitLutBuf_XX; + } + } else if (get_type == CC_GET_LUT_AV) { + if (GetAudioSupperBassByModifyName(get_type, + mAVSupperBassDigitLutBuf_XX) == 0) { + return mAVSupperBassDigitLutBuf_XX; + } + } else if (get_type == CC_GET_LUT_COMP) { + if (GetAudioSupperBassByModifyName(get_type, + mCOMPSupperBassDigitLutBuf_XX) == 0) { + return mCOMPSupperBassDigitLutBuf_XX; + } + } else if (get_type == CC_GET_LUT_HDMI) { + if (GetAudioSupperBassByModifyName(get_type, + mHDMISupperBassDigitLutBuf_XX) == 0) { + return mHDMISupperBassDigitLutBuf_XX; + } + } else if (get_type == CC_GET_LUT_VGA) { + if (GetAudioSupperBassByModifyName(get_type, + mVGASupperBassDigitLutBuf_XX) == 0) { + return mVGASupperBassDigitLutBuf_XX; + } + } else if (get_type == CC_GET_LUT_MPEG) { + if (GetAudioSupperBassByModifyName(get_type, + mMPEGSupperBassDigitLutBuf_XX) == 0) { + return mMPEGSupperBassDigitLutBuf_XX; + } + } + } else { + if (get_type == CC_GET_LUT_TV) { + if (GetAudioCfgBufferData( + CS_AUDIO_AMP_SUPPERBASSVOL_TV_LUTBUF_CFG_NAME, &buf_count, + &buf_item_count, 10, mTVSupperBassDigitLutBuf_XX) == 0) { + return mTVSupperBassDigitLutBuf_XX; + } + } else if (get_type == CC_GET_LUT_AV) { + if (GetAudioCfgBufferData( + CS_AUDIO_AMP_SUPPERBASSVOL_AV_LUTBUF_CFG_NAME, &buf_count, + &buf_item_count, 10, mAVSupperBassDigitLutBuf_XX) == 0) { + return mAVSupperBassDigitLutBuf_XX; + } + } else if (get_type == CC_GET_LUT_COMP) { + if (GetAudioCfgBufferData( + CS_AUDIO_AMP_SUPPERBASSVOL_COMP_LUTBUF_CFG_NAME, &buf_count, + &buf_item_count, 10, mCOMPSupperBassDigitLutBuf_XX) == 0) { + return mCOMPSupperBassDigitLutBuf_XX; + } + } else if (get_type == CC_GET_LUT_HDMI) { + if (GetAudioCfgBufferData( + CS_AUDIO_AMP_SUPPERBASSVOL_HDMI_LUTBUF_CFG_NAME, &buf_count, + &buf_item_count, 10, mHDMISupperBassDigitLutBuf_XX) == 0) { + return mHDMISupperBassDigitLutBuf_XX; + } + } else if (get_type == CC_GET_LUT_VGA) { + if (GetAudioCfgBufferData( + CS_AUDIO_AMP_SUPPERBASSVOL_VGA_LUTBUF_CFG_NAME, &buf_count, + &buf_item_count, 10, mVGASupperBassDigitLutBuf_XX) == 0) { + return mVGASupperBassDigitLutBuf_XX; + } + } else if (get_type == CC_GET_LUT_MPEG) { + if (GetAudioCfgBufferData( + CS_AUDIO_AMP_SUPPERBASSVOL_MPEG_LUTBUF_CFG_NAME, &buf_count, + &buf_item_count, 10, mMPEGSupperBassDigitLutBuf_XX) == 0) { + return mMPEGSupperBassDigitLutBuf_XX; + } + } + } + + return NULL; +} + +int *GetAudioEQPresetBufferPtr() +{ + int buf_count = 0, buf_item_count = 0; + int *tmpDataBufPtr = NULL; + + tmpDataBufPtr = mEQPresetValueBuf_XX; + + memset((void *) tmpDataBufPtr, 0, sizeof(int) * CC_EQ_PRESET_BUF_SIZE); + + if (GetAudioCfgBufferData(CS_EQ_PRESETBUF_CFG_NAME, &buf_count, + &buf_item_count, 10, tmpDataBufPtr) == 0) { + return tmpDataBufPtr; + } + + return mEQPresetDefBuf; +} + +int GetAudioDVISupportEnable() +{ + const char *config_value; + + config_value = config_get_str("TV", CS_DVI_SUPPORT_ENABLE_CFG_NAME, "null"); + + if (strcmp(config_value, "null") == 0) { + return 0; + } + + return strtoul(config_value, NULL, 10); +} + +int GetTvAudioCardID(char tv_card_id_buf[]) +{ + const char *value; + value = config_get_str("TV", "audio.tv.card.id", "null"); + //LOGD("%s, get card id is \"%s\".\n", "TV", tv_card_id_buf); + + strcpy(tv_card_id_buf, value); + if (strcmp(value, "null") == 0) { + strcpy(tv_card_id_buf, "0"); + // LOGD("%s, card id not config, we set to default \"%s\".\n", + // "TV", "0"); + } + + return 0; +} + +int GetTvAudioCardName(char tv_card_name_buf[]) +{ + const char *value; + value = config_get_str("TV", "audio.tv.card.name", "null"); + //LOGD("%s, get card name is \"%s\".\n", "TV", tv_card_name_buf); + + strcpy(tv_card_name_buf, value); + if (strcmp(value, "null") == 0) { + strcpy(tv_card_name_buf, "AMLSYNO9629"); + // LOGD("%s, card name not config, we set to default \"%s\".\n", + // "TV", "AML-M2"); + } + + return 0; +} + +int GetTvAudioCardNeedSet() +{ + const char *config_value; + + config_value = config_get_str("TV", "audio.tv.card.needset", "null"); + //LOGD("%s, get \"%s\" is \"%s\".\n", "TV", "audio.tv.card.needset", + // config_value); + + if (strcmp(config_value, "null") == 0) { + return 0; + } + + if (strtoul(config_value, NULL, 10) == 0) { + return 0; + } + + return 1; +} + +static int GetAudioEffectAmplifierGainCfg(const char *cfg_name, + int def_gain_val, int max_gain_val) +{ + int tmp_val; + const char *config_value; + + config_value = config_get_str("TV", cfg_name, "null"); + //LOGD("%s, get %s is \"%s\".\n", "TV", cfg_name, config_value); + + if (strcmp(config_value, "null") == 0) { + // LOGD( + // "%s, get config \"%s\" is \"%s\", return default audio effect amplifier gain value(%d).\n", + // "TV", cfg_name, config_value, def_gain_val); + return def_gain_val; + } + + tmp_val = strtoul(config_value, NULL, 10); + if (tmp_val < 0 || tmp_val > max_gain_val) { + // LOGD( + // "%s, get config \"%s\" is error, it(%d) should between %d and %d, return default audio effect amplifier gain value(%d)\n", + // "TV", cfg_name, tmp_val, 0, max_gain_val, def_gain_val); + tmp_val = def_gain_val; + } + + return tmp_val; +} + +int GetAudioSRSModuleDisableCFG() +{ + const char *config_value; + + config_value = config_get_str("TV", CS_SRS_MOUDLE_DISABLE_CFG_NAME, "null"); + + if (strcmp(config_value, "null") == 0) { + return 0; + } + + return strtoul(config_value, NULL, 10); +} + +int GetAudioSRSSourroundDisableCFG() +{ + const char *config_value; + + config_value = config_get_str("TV", CS_SRS_SOURROUND_DISABLE_CFG_NAME, + "null"); + + if (strcmp(config_value, "null") == 0) { + return 0; + } + + return strtoul(config_value, NULL, 10); +} + +int GetAudioSRSTrubassDisableCFG() +{ + const char *config_value; + + config_value = config_get_str("TV", CS_SRS_TRUBASS_DISABLE_CFG_NAME, + "null"); + + if (strcmp(config_value, "null") == 0) { + return 0; + } + + return strtoul(config_value, NULL, 10); +} + +int GetAudioSRSDialogClarityDisableCFG() +{ + const char *config_value; + + config_value = config_get_str("TV", CS_SRS_DIALOGCLARITY_DISABLE_CFG_NAME, + "null"); + + if (strcmp(config_value, "null") == 0) { + return 0; + } + + return strtoul(config_value, NULL, 10); +} + +static int GetAudioSRSGainCfg(const char *cfg_name, int def_gain_val) +{ + int tmp_val; + const char *config_value; + + config_value = config_get_str("TV", cfg_name, "null"); + //LOGD("%s, get %s is \"%s\".\n", "TV", cfg_name, config_value); + + if (strcmp(config_value, "null") == 0) { + // LOGD( + // "%s, get config \"%s\" is \"%s\", return -1 to use default gain value.\n", + // "TV", cfg_name, config_value); + return -1; + } + + tmp_val = strtoul(config_value, NULL, 10); + if (tmp_val < 0 || tmp_val > 100) { + tmp_val = def_gain_val; + // LOGD("%s, get config \"%s\" is error, we set it to %d\n", "TV", + // cfg_name, tmp_val); + } + + return tmp_val; +} + +static int GetAudioSRSAmplifierGainCfg(const char *cfg_name, int def_gain_val) +{ + return GetAudioEffectAmplifierGainCfg(cfg_name, def_gain_val, 24); +} + +static int GetAudioEQAmplifierGainCfg(const char *cfg_name, int def_gain_val) +{ + return GetAudioEffectAmplifierGainCfg(cfg_name, def_gain_val, 24); +} + +int GetAudioSRSSourroundGainCfg() +{ + return GetAudioSRSGainCfg(CS_SRS_SOURROUND_GAIN_CFG_NAME, + CC_SRS_SURROUND_GAIN_VAL); +} + +int GetAudioSRSSourroundAmplifierMasterGainCfg() +{ + return GetAudioSRSAmplifierGainCfg( + CS_SRS_SOURROUND_AMP_MASTER_GAIN_CFG_NAME, + CC_SRS_SURROUND_AMP_MASTER_GAIN_VAL); +} + +int GetAudioSRSSourroundAmplifierSupperBassGainCfg() +{ + return GetAudioSRSAmplifierGainCfg( + CS_SRS_SOURROUND_AMP_SUPPERBASS_GAIN_CFG_NAME, + CC_SRS_SURROUND_AMP_SUPPERBASS_GAIN_VAL); +} + +int GetAudioSRSTrubassOnlyGainCfg() +{ + return GetAudioSRSGainCfg(CS_SRS_TRUBASS_ONLY_GAIN_CFG_NAME, + CC_SRS_TRUBASS_ONLY_GAIN_VAL); +} + +int GetAudioSRSTrubassOnlyAmplifierMasterGainCfg() +{ + return GetAudioSRSAmplifierGainCfg( + CS_SRS_TRUBASS_ONLY_AMP_MASTER_GAIN_CFG_NAME, + CC_SRS_TRUBASS_ONLY_AMP_MASTER_GAIN_VAL); +} + +int GetAudioSRSTrubassOnlyAmplifierSupperBassGainCfg() +{ + return GetAudioSRSAmplifierGainCfg( + CS_SRS_TRUBASS_ONLY_AMP_SUPPERBASS_GAIN_CFG_NAME, + CC_SRS_TRUBASS_ONLY_AMP_SUPPERBASS_GAIN_VAL); +} + +int GetAudioSRSDialogClarityOnlyGainCfg() +{ + return GetAudioSRSGainCfg(CS_SRS_DIALOGCLARITY_ONLY_GAIN_CFG_NAME, + CC_SRS_DIALOGCLARITY_ONLY_GAIN_VAL); +} + +int GetAudioSRSDialogClarityOnlyAmplifierMasterGainCfg() +{ + return GetAudioSRSAmplifierGainCfg( + CS_SRS_DIALOGCLARITY_ONLY_AMP_MASTER_GAIN_CFG_NAME, + CC_SRS_DIALOGCLARITY_ONLY_AMP_MASTER_GAIN_VAL); +} + +int GetAudioSRSDialogClarityOnlyAmplifierSupperBassGainCfg() +{ + return GetAudioSRSAmplifierGainCfg( + CS_SRS_DIALOGCLARITY_ONLY_AMP_SUPPERBASS_GAIN_CFG_NAME, + CC_SRS_DIALOGCLARITY_ONLY_AMP_SUPPERBASS_GAIN_VAL); +} + +int GetAudioSRSDialogClarityOnlyDefinitionGainCfg() +{ + return GetAudioSRSGainCfg( + CS_SRS_DIALOGCLARITY_ONLY_DEFINITION_GAIN_CFG_NAME, + CC_SRS_DIALOGCLARITY_ONLY_DEFINITION_GAIN_VAL); +} + +int GetAudioSRSTrubassAndDialogClarityTrubassGainCfg() +{ + return GetAudioSRSGainCfg( + CS_SRS_TRUBASS_DIALOGCLARITY_TRUBASS_GAIN_CFG_NAME, + CC_SRS_TRUBASS_DIALOGCLARITY_TRUBASS_GAIN_VAL); +} + +int GetAudioSRSTrubassAndDialogClarityDialogClarityGainCfg() +{ + return GetAudioSRSGainCfg( + CS_SRS_TRUBASS_DIALOGCLARITY_DIALOGCLARITY_GAIN_CFG_NAME, + CC_SRS_TRUBASS_DIALOGCLARITY_DIALOGCLARITY_GAIN_VAL); +} + +int GetAudioSRSTrubassAndDialogClarityDefinitionGainCfg() +{ + return GetAudioSRSGainCfg( + CS_SRS_TRUBASS_DIALOGCLARITY_DEFINITION_GAIN_CFG_NAME, + CC_SRS_TRUBASS_DIALOGCLARITY_DEFINITION_GAIN_VAL); +} + +int GetAudioSRSTrubassAndDialogClarityAmplifierMasterGainCfg() +{ + return GetAudioSRSAmplifierGainCfg( + CS_SRS_TRUBASS_DIALOGCLARITY_AMP_MASTER_GAIN_CFG_NAME, + CC_SRS_TRUBASS_DIALOGCLARITY_AMP_MASTER_GAIN_VAL); +} + +int GetAudioSRSTrubassAndDialogClarityAmplifierSupperBassGainCfg() +{ + return GetAudioSRSAmplifierGainCfg( + CS_SRS_TRUBASS_DIALOGCLARITY_AMP_SUPPERBASS_GAIN_CFG_NAME, + CC_SRS_TRUBASS_DIALOGCLARITY_AMP_SUPPERBASS_GAIN_VAL); +} + +int GetAudioSRSSupperBassTrubassSpeakerSizeCfg(int get_flag) +{ + int tmp_val; + char cfg_name[128] = { 0 }; + const char *config_value; + + if (get_flag == 0) { + strcpy(cfg_name, CS_SRS_SUPPERBASS_OFF_TRUBASS_SPEAKER_SIZE_CFG_NAME); + } else { + strcpy(cfg_name, CS_SRS_SUPPERBASS_ON_TRUBASS_SPEAKER_SIZE_CFG_NAME); + } + + config_value = config_get_str("TV", cfg_name, "null"); + + if (strcmp(config_value, "null") == 0) { + return -1; + } + + tmp_val = strtoul(config_value, NULL, 10); + if (tmp_val < 0 || tmp_val > 7) { + tmp_val = -1; + } + + return tmp_val; +} + +int GetAudioEQAmplifierMasterAddGainCfg() +{ + return GetAudioEQAmplifierGainCfg(CS_EQ_AMP_MASTER_GAIN_CFG_NAME, + CC_EQ_AMP_MASTER_GAIN_VAL); +} + +int GetAudioEQAmplifierSupperBassAddGainCfg() +{ + return GetAudioEQAmplifierGainCfg(CS_EQ_AMP_SUPPERBASS_GAIN_CFG_NAME, + CC_EQ_AMP_SUPPERBASS_GAIN_VAL); +} + +int GetAudioEqModuleDisableCFG() +{ + const char *config_value; + + config_value = config_get_str("TV", CS_EQ_MOUDLE_DISABLE_CFG_NAME, "null"); + + if (strcmp(config_value, "null") == 0) { + return 0; + } + + return strtoul(config_value, NULL, 10); +} + +int GetAudioEqUsingAndroidCFG() +{ + const char *config_value; + + config_value = config_get_str("TV", CS_EQ_USING_ANDROID_CFG_NAME, "null"); + + if (strcmp(config_value, "null") == 0) { + return 0; + } + + return strtoul(config_value, NULL, 10); +} + +int GetAudioEQGainRangeCFG(int *min_val, int *max_val) +{ + int i = 0, buf_item_count = 0, tmp_item_count = 0; + int tmp_buf[16] = { 0 }; + + buf_item_count = 2; + tmp_item_count = buf_item_count; + if (GetAudioCfgData(CS_EQ_GAIN_RANGE_CFG_NAME, &tmp_item_count, 10, tmp_buf) + < 0) { + return -1; + } + + if (tmp_item_count != buf_item_count) { + return -1; + } + + *min_val = tmp_buf[0]; + *max_val = tmp_buf[1]; + + return 0; +} + +int GetAudioEQUIGainRangeCFG(int *min_val, int *max_val) +{ + int i = 0, buf_item_count = 0, tmp_item_count = 0; + int tmp_buf[16] = { 0 }; + + buf_item_count = 2; + tmp_item_count = buf_item_count; + if (GetAudioCfgData(CS_EQ_UI_GAIN_RANGE_CFG_NAME, &tmp_item_count, 10, + tmp_buf) < 0) { + return -1; + } + + if (tmp_item_count != buf_item_count) { + return -1; + } + + *min_val = tmp_buf[0]; + *max_val = tmp_buf[1]; + + return 0; +} + +int GetAudioDumpDataEnableFlagCfg() +{ + const char *config_value; + + config_value = config_get_str("TV", CS_AUDIO_DUMP_DATA_ENABLE_CFG_NAME, + "null"); + + if (strcmp(config_value, "null") == 0) { + return 0; + } + + return strtol(config_value, NULL, 10); +} + +int GetAudioKeyMuteCfg() +{ + const char *config_value; + + config_value = config_get_str("TV", CS_KEY_MUTE_CFG_NAME, "null"); + + if (strcmp(config_value, "null") == 0) { + return 0; + } + + return strtoul(config_value, NULL, 10); +} + +int GetAudioAVOutInitMuteStatusCFG() +{ + const char *config_value; + int status = 0; + + config_value = config_get_str("TV", CS_AVOUT_INIT_MUTE_CFG_NAME, "null"); + LOGD("%s, get %s is \"%s\".\n", __FUNCTION__, CS_AVOUT_INIT_MUTE_CFG_NAME, + config_value); + + if (strcmp(config_value, "enable") == 0) { + status = 1; + } else { + status = 0; + } + + return status; +} + +int GetAudioSupperBassModuleDisableCFG() +{ + const char *config_value; + + config_value = config_get_str("TV", CS_SUPPERBASS_MODULE_DISABLE_CFG_NAME, + "null"); + + if (strcmp(config_value, "null") == 0) { + return 0; + } + + return strtoul(config_value, NULL, 10); +} + +int GetAudioSupperBassSwitchDisableCFG() +{ + const char *config_value; + + config_value = config_get_str("TV", CS_SUPPERBASS_SWITCH_DISABLE_CFG_NAME, + "null"); + + if (strcmp(config_value, "null") == 0) { + return 0; + } + + return strtoul(config_value, NULL, 10); +} + +static int GetAudioSrcInputLineInVol(const char *cfg_str, int *l_vol, + int *r_vol) +{ + int buf_item_count = 2; + int data_buf[2] = { -1, -1 }; + + if (GetAudioCfgData(cfg_str, &buf_item_count, 10, data_buf) < 0) { + return -1; + } + + if (buf_item_count < 2) { + return -1; + } + + *l_vol = data_buf[0]; + *r_vol = data_buf[1]; + + return 0; +} + +int GetAudioSrcInputTVLineInVol(int *l_vol, int *r_vol) +{ + return GetAudioSrcInputLineInVol(CS_SRC_INPUT_TV_LINEIN_VOL_CFG_NAME, l_vol, + r_vol); +} + +int GetAudioSrcInputAVLineInVol(int *l_vol, int *r_vol) +{ + return GetAudioSrcInputLineInVol(CS_SRC_INPUT_AV_LINEIN_VOL_CFG_NAME, l_vol, + r_vol); +} + +int GetAudioSrcInputCOMPLineInVol(int *l_vol, int *r_vol) +{ + return GetAudioSrcInputLineInVol(CS_SRC_INPUT_COMP_LINEIN_VOL_CFG_NAME, + l_vol, r_vol); +} + +int GetAudioSrcInputHDMILineInVol(int *l_vol, int *r_vol) +{ + return GetAudioSrcInputLineInVol(CS_SRC_INPUT_HDMI_LINEIN_VOL_CFG_NAME, + l_vol, r_vol); +} + +int GetAudioSrcInputVGALineInVol(int *l_vol, int *r_vol) +{ + return GetAudioSrcInputLineInVol(CS_SRC_INPUT_VGA_LINEIN_VOL_CFG_NAME, + l_vol, r_vol); +} + +int GetAudioSrcInputMPEGLineInVol(int *l_vol, int *r_vol) +{ + return GetAudioSrcInputLineInVol(CS_SRC_INPUT_MPEG_LINEIN_VOL_CFG_NAME, + l_vol, r_vol); +} + +static int GetAudioSrcInputLineOutVol(const char *cfg_str, int *l_vol, + int *r_vol) +{ + int buf_item_count = 2; + int data_buf[2] = { -1, -1 }; + + if (GetAudioCfgData(cfg_str, &buf_item_count, 10, data_buf) < 0) { + return -1; + } + + if (buf_item_count < 2) { + return -1; + } + + *l_vol = data_buf[0]; + *r_vol = data_buf[1]; + + return 0; +} + +int GetAudioSrcInputTVLineOutVol(int *l_vol, int *r_vol) +{ + return GetAudioSrcInputLineOutVol(CS_SRC_INPUT_TV_LINEOUT_VOL_CFG_NAME, + l_vol, r_vol); +} + +int GetAudioSrcInputAVLineOutVol(int *l_vol, int *r_vol) +{ + return GetAudioSrcInputLineOutVol(CS_SRC_INPUT_AV_LINEOUT_VOL_CFG_NAME, + l_vol, r_vol); +} + +int GetAudioSrcInputCOMPLineOutVol(int *l_vol, int *r_vol) +{ + return GetAudioSrcInputLineOutVol(CS_SRC_INPUT_COMP_LINEOUT_VOL_CFG_NAME, + l_vol, r_vol); +} + +int GetAudioSrcInputHDMILineOutVol(int *l_vol, int *r_vol) +{ + return GetAudioSrcInputLineOutVol(CS_SRC_INPUT_HDMI_LINEOUT_VOL_CFG_NAME, + l_vol, r_vol); +} + +int GetAudioSrcInputVGALineOutVol(int *l_vol, int *r_vol) +{ + return GetAudioSrcInputLineOutVol(CS_SRC_INPUT_VGA_LINEOUT_VOL_CFG_NAME, + l_vol, r_vol); +} + +int GetAudioSrcInputMPEGLineOutVol(int *l_vol, int *r_vol) +{ + int tmp_val = 0; + const char *config_value; + + config_value = config_get_str("TV", + CS_SRC_INPUT_MPEG_LINEOUT_VOL_CFG_NAME_OLD, "null"); + + if (strcmp(config_value, "null") == 0) { + return GetAudioSrcInputLineOutVol( + CS_SRC_INPUT_MPEG_LINEOUT_VOL_CFG_NAME, l_vol, r_vol); + } + + tmp_val = strtol(config_value, NULL, 10); + + *l_vol = tmp_val; + *r_vol = tmp_val; + + return 0; +} + +int GetAudioWallEffectTypeCfg() +{ + return GetAudioCfgSingleIntData("audio.walleffect.type", 0); +} + +static int GetAudioMainVolumeLutBufCompensation(const char *cfg_str, + int *cfg_flag) +{ + const char *config_value; + + config_value = config_get_str("TV", cfg_str, "null"); + //LOGD("%s, get \"%s\" is \"%s\".\n", "TV", cfg_str, config_value); + + if (strcmp(config_value, "null") == 0) { + if (cfg_flag != NULL) { + *cfg_flag = 0; + } + + //LOGD( + // "%s, get config \"%s\" is \"%s\", return 0 to not compensation lut buffer.\n", + // "TV", cfg_str, config_value); + return 0; + } + + if (cfg_flag != NULL) { + *cfg_flag = 1; + } + + return strtol(config_value, NULL, 10); +} + +int GetAudioMainVolumeLutBufTVCompensation() +{ + return GetAudioMainVolumeLutBufCompensation( + CS_AMP_MAINVOL_LUTBUF_COMPENSATION_TV_CFG_NAME, NULL); +} + +int GetAudioMainVolumeLutBufAVCompensation() +{ + return GetAudioMainVolumeLutBufCompensation( + CS_AMP_MAINVOL_LUTBUF_COMPENSATION_AV_CFG_NAME, NULL); +} + +int GetAudioMainVolumeLutBufCOMPCompensation() +{ + return GetAudioMainVolumeLutBufCompensation( + CS_AMP_MAINVOL_LUTBUF_COMPENSATION_COMP_CFG_NAME, NULL); +} + +int GetAudioMainVolumeLutBufHDMICompensation() +{ + return GetAudioMainVolumeLutBufCompensation( + CS_AMP_MAINVOL_LUTBUF_COMPENSATION_HDMI_CFG_NAME, NULL); +} + +int GetAudioMainVolumeLutBufVGACompensation() +{ + return GetAudioMainVolumeLutBufCompensation( + CS_AMP_MAINVOL_LUTBUF_COMPENSATION_VGA_CFG_NAME, NULL); +} + +int GetAudioMainVolumeLutBufMPEGCompensation() +{ + int tmp_ret = 0, cfg_flag = 0; + + tmp_ret = GetAudioMainVolumeLutBufCompensation( + CS_AMP_MAINVOL_LUTBUF_COMPENSATION_MPEG_CFG_NAME, &cfg_flag); + + if (cfg_flag == 0) { + tmp_ret = GetAudioMainVolumeLutBufDTVCompensation(); + } + + return tmp_ret; +} + +int GetAudioMainVolumeLutBufDTVCompensation() +{ + return GetAudioMainVolumeLutBufCompensation( + CS_AMP_MAINVOL_LUTBUF_COMPENSATION_DTV_CFG_NAME, NULL); +} + +int GetAudioNoiseGateEnableCFG() +{ + const char *config_value; + + config_value = config_get_str("TV", CS_AUDIO_NOISE_GATE_ENABLE_CFG_NAME, + "null"); + + if (strcmp(config_value, "null") == 0) { + return 0; + } + + return strtoul(config_value, NULL, 10); +} + +int GetAudioNoiseGateUpperBoundCFG() +{ + const char *config_value; + + config_value = config_get_str("TV", + CS_AUDIO_NOISE_GATE_UPPER_BOUND_CFG_NAME, "254"); + + return strtol(config_value, NULL, 10); +} + +int GetAudioNoiseGateThresholdCFG() +{ + const char *config_value; + + config_value = config_get_str("TV", CS_AUDIO_NOISE_GATE_THRESHOLD_CFG_NAME, + "-1"); + + return strtol(config_value, NULL, 10); +} + +int GetDisableResetSystemFrameSize() +{ + const char *config_value; + config_value = config_get_str("TV", + CS_DISABLE_RESET_SYSTEM_FRAMESIZE_CFG_NAME, "null"); + + if (strcmp(config_value, "null") == 0) { + return 0; + } + + return strtoul(config_value, NULL, 10); +} + +static int gDisableResetSystemFrameSizeFlag = -1; +int GetDisableReset_System_framesizeCFG(void) +{ + if (gDisableResetSystemFrameSizeFlag == -1) { + const char *config_value; + + config_value = config_get_str("TV", CS_AUDIO_SYSTEM_FRAMESIZE_CFG_NAME, + "null"); + LOGD("%s, get %s is \"%s\".\n", + __FUNCTION__, CS_AUDIO_SYSTEM_FRAMESIZE_CFG_NAME, config_value); + + if (strcmp(config_value, "disable") == 0) { + gDisableResetSystemFrameSizeFlag = 0x55; + } else { + gDisableResetSystemFrameSizeFlag = 0; + } + } + + return gDisableResetSystemFrameSizeFlag; +} + +int GetAudioArchitectureTypeCFG() +{ + static int architecture_type = -1; + const char *config_value = NULL; + + if (architecture_type == -1) { + config_value = config_get_str ( "TV", CS_AUDIO_ARCHITECTURE_TYPE_CFG_NAME, "null" ); + if (strcasecmp(config_value, "null") == 0) { + architecture_type = CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_FBC; + } else if (strcasecmp(config_value, "t866_external_dac_offboard_fbc") == 0) { + architecture_type = CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_FBC; + } else if (strcasecmp(config_value, "t866_external_dac_offboard_customer_lib") == 0) { + architecture_type = CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_CUSTOMER_LIB; + } else if (strcasecmp(config_value, "t866_external_dac_offboard_digital") == 0) { + architecture_type = CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_DIGITAL; + } else if (strcasecmp(config_value, "t866_external_dac_onboard") == 0) { + architecture_type = CC_DAC_T866_EXTERNAL_DAC_ON_BOARD; + } else if (strcasecmp(config_value, "t866_iternal_dac") == 0) { + architecture_type = CC_DAC_T866_INTERNAL_DAC; + } else if (strcasecmp(config_value, "m6c") == 0) { + architecture_type = CC_DAC_M6C_EXTERNAL_DAC_ON_BOARD; + } else { + architecture_type = CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_FBC; + } + } + + return architecture_type; +} + +static int gAudioResampleType = -1; +int GetAudioResampleTypeCFG() +{ + char *token = NULL; + const char *strDelimit = ","; + const char *config_value = NULL; + char cfg_buf[1024]; + + if (gAudioResampleType == -1) { + gAudioResampleType = 0; + + config_value = config_get_str ( "TV", CS_AUDIO_RESAMPLE_TYPE_CFG_NAME, "null" ); + strncpy(cfg_buf, config_value, sizeof(cfg_buf)); + if (strcmp(cfg_buf, "") != 0) { + token = strtok(cfg_buf, strDelimit); + while (token != NULL) { + if (strcasecmp(token, "hw") == 0) { + gAudioResampleType |= CC_AUD_RESAMPLE_TYPE_HW; + } else if (strcasecmp(token, "sw") == 0) { + gAudioResampleType |= CC_AUD_RESAMPLE_TYPE_SW; + } + + token = strtok(NULL, strDelimit); + } + } else { + gAudioResampleType = CC_AUD_RESAMPLE_TYPE_SW; //if can't find config string, allow sw resample + } + } + + return gAudioResampleType; +} + +int GetamAudioDisableFlagCFG() +{ + static int am_audio_disable_flag = -1; + const char *config_value = NULL; + + if (am_audio_disable_flag == -1) { + config_value = config_get_str ( "TV", "audio.amaudio.disable", "null" ); + if (strcasecmp(config_value, "null") == 0 || strcasecmp(config_value, "false") == 0) { + am_audio_disable_flag = 0; + } else if (strcasecmp(config_value, "true") == 0) { + am_audio_disable_flag = 1; + } else { + am_audio_disable_flag = 0; + } + } + + return am_audio_disable_flag; +} + +int GetAudioFirstInitSetTypeCFG() +{ + const char *config_value; + config_value = config_get_str ( "TV", "audio.firstinitset.type", "null" ); + + if (strcmp(config_value, "null") == 0) { + return 0; + } + + return strtoul(config_value, NULL, 10); +} diff --git a/tvapi/libtv/tvsetting/audio_cfg.h b/tvapi/libtv/tvsetting/audio_cfg.h new file mode 100644 index 0000000..72f5145 --- a/dev/null +++ b/tvapi/libtv/tvsetting/audio_cfg.h @@ -0,0 +1,169 @@ +#ifndef __TV_AUDIO_CFG_H__ +#define __TV_AUDIO_CFG_H__ + +#include "../tvconfig/tvconfig.h" +#include "../tvutils/tvutils.h" + +#define CC_LUT_BUF_MASTER (0) +#define CC_LUT_BUF_SUPPERBASS (1) +#define CC_LUT_BUF_HEADSET (2) + +#define CC_LUT_BUF_SIZE (101) + +#define CC_EQ_PRESET_BUF_SIZE (24) + +#define CC_SUPPERBASS_ADD_SIZE (24) + +#define CC_NO_LINE_POINTS_MAX_CNT (101) + +#define CC_GET_LUT_TV (0) +#define CC_GET_LUT_AV (1) +#define CC_GET_LUT_COMP (2) +#define CC_GET_LUT_HDMI (3) +#define CC_GET_LUT_VGA (4) +#define CC_GET_LUT_MPEG (5) +#define CC_GET_LUT_HDMI_4K2K (6) +#define CC_GET_LUT_USB_4K2K (7) +#define CC_GET_TYPE_CNT (8) + +#define CC_CFG_NOLINE_CFG_SWITCH_IND (0) +#define CC_CFG_NOLINE_CFG_IND_IND (1) +#define CC_CFG_LUT_BUF_CFG_IND (2) +#define CC_CFG_EQ_CFG_IND (3) +#define CC_CFG_EQ_PRESET_BUF_IND (4) + +#define CC_SRS_SURROUND_GAIN_VAL (50) +#define CC_SRS_SURROUND_AMP_MASTER_GAIN_VAL (18) +#define CC_SRS_SURROUND_AMP_SUPPERBASS_GAIN_VAL (21) + +#define CC_SRS_TRUBASS_ONLY_GAIN_VAL (30) +#define CC_SRS_TRUBASS_ONLY_AMP_MASTER_GAIN_VAL (12) +#define CC_SRS_TRUBASS_ONLY_AMP_SUPPERBASS_GAIN_VAL (15) + +#define CC_SRS_DIALOGCLARITY_ONLY_GAIN_VAL (30) +#define CC_SRS_DIALOGCLARITY_ONLY_AMP_MASTER_GAIN_VAL (12) +#define CC_SRS_DIALOGCLARITY_ONLY_AMP_SUPPERBASS_GAIN_VAL (21) +#define CC_SRS_DIALOGCLARITY_ONLY_DEFINITION_GAIN_VAL (20) + +#define CC_SRS_TRUBASS_DIALOGCLARITY_TRUBASS_GAIN_VAL (28) +#define CC_SRS_TRUBASS_DIALOGCLARITY_DIALOGCLARITY_GAIN_VAL (20) +#define CC_SRS_TRUBASS_DIALOGCLARITY_DEFINITION_GAIN_VAL (5) + +#define CC_SRS_TRUBASS_DIALOGCLARITY_AMP_MASTER_GAIN_VAL (12) +#define CC_SRS_TRUBASS_DIALOGCLARITY_AMP_SUPPERBASS_GAIN_VAL (15) + +#define CC_EQ_AMP_MASTER_GAIN_VAL (0) +#define CC_EQ_AMP_SUPPERBASS_GAIN_VAL (0) + +#define CC_DAC_M6C_EXTERNAL_DAC_ON_BOARD (0) +#define CC_DAC_T866_EXTERNAL_DAC_ON_BOARD (1) +#define CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_FBC (2) +#define CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_CUSTOMER_LIB (3) +#define CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_DIGITAL (4) +#define CC_DAC_T866_INTERNAL_DAC (5) + +#define CC_AUD_RESAMPLE_TYPE_HW (1) +#define CC_AUD_RESAMPLE_TYPE_SW (2) + +extern int *GetAudioAmplifierNoLinePointsIndexBuffer(int lut_buf_type, + int get_type); +extern int *GetAudioAmplifierNoLinePointsDataBuffer(int lut_buf_type, + int get_type); + +extern int GetAudioAmplifierMasterNoLineSwitchFlag(); +extern int GetAudioAmplifierMasterNoLinePointsCount(); +extern int *GetAudioAmplifierMasterNoLinePointsDataBuffer(int get_type); +extern int *GetAudioAmplifierMasterNoLinePointsIndexBuffer(int get_type); +extern int *GetAudioAmplifierMasterNoLinePointsDefIndexBuffer(); +extern int *GetAudioAmplifierMasterNoLinePointsDefDataBuffer(int buf_type); + +extern int GetAudioAmplifierSupperBassNoLineSwitchFlag(); +extern int GetAudioAmplifierSupperBassNoLinePointsCount(); +extern int *GetAudioAmplifierSupperBassNoLinePointsDataBuffer(int get_type); +extern int *GetAudioAmplifierSupperBassNoLinePointsIndexBuffer(int get_type); +extern int *GetAudioAmplifierSupperBassNoLinePointsDefIndexBuffer(); +extern int *GetAudioAmplifierSupperBassNoLinePointsDefDataBuffer(); + +extern int GetAudioAmplifierBalanceExchangeCFG(); + +extern int GetAudioTrebleBassType(); +extern int *GetAudioAmplifierNoLinePointsBuffer(int get_type); +extern int GetAudioMainVolLutBufNameModifyFromUbootenv(); +extern int GetAudioMainVolLutBufNameModifyUbootenvCFG(); +extern int GetAudioMainVolLutBufNameModifyEnableCFG(); +extern int GetAudioMainVolLutBufNameCFG(int get_type, char name_buf[]); +extern int *GetAudioAmplifierMasterVolumeLUTBufferPtr(int get_type, + int audio_std); +extern int GetAudioSupperBassVolLutBufNameModifyEnableCFG(); +extern int GetAudioSupperBassVolLutBufNameCFG(int get_type, char name_buf[]); +extern int *GetAudioAmplifierSupperBassVolumeLUTBufferPtr(int get_type, + int audio_std); +extern int *GetAudioEQPresetBufferPtr(); +extern int GetAudioDVISupportEnable(); +extern int GetTvAudioCardID(char tv_card_id_buf[]); +extern int GetTvAudioCardName(char tv_card_name_buf[]); +extern int GetTvAudioCardNeedSet(); +extern int GetAudioSRSModuleDisableCFG(); +extern int GetAudioSRSSourroundDisableCFG(); +extern int GetAudioSRSTrubassDisableCFG(); +extern int GetAudioSRSDialogClarityDisableCFG(); +extern int GetAudioSRSSourroundGainCfg(); +extern int GetAudioSRSSourroundAmplifierMasterGainCfg(); +extern int GetAudioSRSSourroundAmplifierSupperBassGainCfg(); +extern int GetAudioSRSTrubassOnlyGainCfg(); +extern int GetAudioSRSTrubassOnlyAmplifierMasterGainCfg(); +extern int GetAudioSRSTrubassOnlyAmplifierSupperBassGainCfg(); +extern int GetAudioSRSDialogClarityOnlyGainCfg(); +extern int GetAudioSRSDialogClarityOnlyAmplifierMasterGainCfg(); +extern int GetAudioSRSDialogClarityOnlyAmplifierSupperBassGainCfg(); +extern int GetAudioSRSDialogClarityOnlyDefinitionGainCfg(); +extern int GetAudioSRSTrubassAndDialogClarityTrubassGainCfg(); +extern int GetAudioSRSTrubassAndDialogClarityDialogClarityGainCfg(); +extern int GetAudioSRSTrubassAndDialogClarityDefinitionGainCfg(); +extern int GetAudioSRSTrubassAndDialogClarityAmplifierMasterGainCfg(); +extern int GetAudioSRSTrubassAndDialogClarityAmplifierSupperBassGainCfg(); +extern int GetAudioSRSSupperBassTrubassSpeakerSizeCfg(int get_flag); +extern int GetAudioEQAmplifierMasterAddGainCfg(); +extern int GetAudioEQAmplifierSupperBassAddGainCfg(); +extern int GetAudioEqModuleDisableCFG(); +extern int GetAudioEqUsingAndroidCFG(); +extern int GetAudioEQGainRangeCFG(int *min_val, int *max_val); +extern int GetAudioEQUIGainRangeCFG(int *min_val, int *max_val); + +extern int GetAudioDumpDataEnableFlagCfg(); +extern int GetAudioKeyMuteCfg(); +extern int GetAudioAVOutInitMuteStatusCFG(); +extern int GetAudioSupperBassModuleDisableCFG(); +extern int GetAudioSupperBassSwitchDisableCFG(); +extern int GetAudioSrcInputTVLineInVol(int *l_vol, int *r_vol); +extern int GetAudioSrcInputAVLineInVol(int *l_vol, int *r_vol); +extern int GetAudioSrcInputCOMPLineInVol(int *l_vol, int *r_vol); +extern int GetAudioSrcInputHDMILineInVol(int *l_vol, int *r_vol); +extern int GetAudioSrcInputVGALineInVol(int *l_vol, int *r_vol); +extern int GetAudioSrcInputMPEGLineInVol(int *l_vol, int *r_vol); +extern int GetAudioSrcInputTVLineOutVol(int *l_vol, int *r_vol); +extern int GetAudioSrcInputAVLineOutVol(int *l_vol, int *r_vol); +extern int GetAudioSrcInputCOMPLineOutVol(int *l_vol, int *r_vol); +extern int GetAudioSrcInputHDMILineOutVol(int *l_vol, int *r_vol); +extern int GetAudioSrcInputVGALineOutVol(int *l_vol, int *r_vol); +extern int GetAudioSrcInputMPEGLineOutVol(int *l_vol, int *r_vol); +extern int GetAudioWallEffectTypeCfg(); +extern int GetAudioMainVolumeLutBufTVCompensation(); +extern int GetAudioMainVolumeLutBufAVCompensation(); +extern int GetAudioMainVolumeLutBufCOMPCompensation(); +extern int GetAudioMainVolumeLutBufHDMICompensation(); +extern int GetAudioMainVolumeLutBufVGACompensation(); +extern int GetAudioMainVolumeLutBufMPEGCompensation(); +extern int GetAudioMainVolumeLutBufDTVCompensation(); +extern int GetAudioNoiseGateEnableCFG(); +extern int GetAudioNoiseGateUpperBoundCFG(); +extern int GetAudioNoiseGateThresholdCFG(); +extern int GetDisableResetSystemFrameSize(); +extern int GetDisableReset_System_framesizeCFG(); + +extern int GetAudioArchitectureTypeCFG(); +extern int GetAudioResampleTypeCFG(); +extern int GetamAudioDisableFlagCFG(); +extern int GetAudioFirstInitSetTypeCFG(); + +#endif //__TV_AUDIO_CFG_H__ diff --git a/tvapi/libtv/tvutils/CCondition.h b/tvapi/libtv/tvutils/CCondition.h new file mode 100644 index 0000000..4313f71 --- a/dev/null +++ b/tvapi/libtv/tvutils/CCondition.h @@ -0,0 +1,91 @@ +/* +reference android api, just linux pthread +*/ + +#ifndef _TV_UTILS_CONDITION_H +#define _TV_UTILS_CONDITION_H + +#include <stdint.h> +#include <sys/types.h> +#include <time.h> +#include <pthread.h> +#include "CMutex.h" + +typedef long long nsecs_t; + +class CCondition +{ +public: + enum { + PRIVATE = 0, + SHARED = 1 + }; + + CCondition(); + CCondition(int type); + ~CCondition(); + // Wait on the condition variable. Lock the mutex before calling. + int wait(CMutex &mutex); + // same with relative timeout + int waitRelative(CMutex &mutex, long sec); + // Signal the condition variable, allowing one thread to continue. + void signal(); + // Signal the condition variable, allowing all threads to continue. + void broadcast(); + +private: + pthread_cond_t mCond; +}; + + + +// --------------------------------------------------------------------------- + +inline CCondition::CCondition() +{ + pthread_cond_init(&mCond, NULL); +} +inline CCondition::CCondition(int type) +{ + if (type == SHARED) { + pthread_condattr_t attr; + pthread_condattr_init(&attr); + pthread_condattr_setpshared(&attr, PTHREAD_PROCESS_SHARED); + pthread_cond_init(&mCond, &attr); + pthread_condattr_destroy(&attr); + } else { + pthread_cond_init(&mCond, NULL); + } +} +inline CCondition::~CCondition() +{ + pthread_cond_destroy(&mCond); +} +inline int CCondition::wait(CMutex &mutex) +{ + return -pthread_cond_wait(&mCond, &mutex.mMutex); +} +inline int CCondition::waitRelative(CMutex &mutex, long msec) +{ + struct timespec ts; + long _nanoSec = 1000000000; + int _sec = msec / 1000; + long _nsec = (msec - 1000 * _sec) * 1000000; + clock_gettime(CLOCK_REALTIME, &ts); + ts.tv_sec += _sec; + ts.tv_nsec += _nsec; + if (ts.tv_nsec > _nanoSec) { + ts.tv_nsec %= _nanoSec; + ts.tv_sec++; + } + return -pthread_cond_timedwait(&mCond, &mutex.mMutex, &ts); +} +inline void CCondition::signal() +{ + pthread_cond_signal(&mCond); +} +inline void CCondition::broadcast() +{ + pthread_cond_broadcast(&mCond); +} +#endif diff --git a/tvapi/libtv/tvutils/CFile.cpp b/tvapi/libtv/tvutils/CFile.cpp new file mode 100644 index 0000000..60bdcdf --- a/dev/null +++ b/tvapi/libtv/tvutils/CFile.cpp @@ -0,0 +1,191 @@ +#include "CFile.h" +#include "CTvLog.h" + +#ifdef LOG_TAG +#undef LOG_TAG +#define LOG_TAG "CFILE" +#endif + +CFile::CFile() +{ + mPath[0] = '\0'; + mFd = -1; +} + +CFile::~CFile() +{ + closeFile(); +} + +CFile::CFile(const char *path) +{ + strcpy(mPath, path); + mFd = -1; +} + +int CFile::openFile(const char *path) +{ + LOGD("openFile = %s", path); + + if (mFd < 0) { + if (path == NULL) { + if (strlen(mPath) <= 0) + return -1; + + mFd = open(mPath, O_RDWR);//读写模式打开 + if (mFd < 0) LOGD("open file(--%s) fail", mPath); + } else { + mFd = open(path, O_RDWR);//读写模式打开 + LOGD("open file(%s fd=%d) ", path, mFd); + strcpy(mPath, path); + } + } + + return mFd; +} + +int CFile::closeFile() +{ + if (mFd > 0) { + close(mFd); + mFd = -1; + } + return 0; +} + +int CFile::writeFile(const unsigned char *pData, int uLen) +{ + int ret = -1; + if (mFd > 0) + ret = write(mFd, pData, uLen); + + return ret; +} + +int CFile::readFile(const unsigned char *pBuf, int uLen) +{ + return 0; +} + +int CFile::copyTo(const char *dstPath) +{ + if (strlen(mPath) <= 0) + return -1; + int dstFd; + if (mFd == -1) { + if ((mFd = open(mPath, O_RDONLY)) == -1) { + LOGE("Open %s Error:%s/n", mPath, strerror(errno)); + return -1; + } + } + + if ((dstFd = open(dstPath, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR)) == -1) { + LOGE("Open %s Error:%s/n", dstPath, strerror(errno)); + } + + int bytes_read, bytes_write; + char buffer[BUFFER_SIZE]; + char *ptr; + int ret = 0; + while (bytes_read = read(mFd, buffer, BUFFER_SIZE)) { + /* 一个致命的错误发生了 */ + if ((bytes_read == -1) && (errno != EINTR)) { + ret = -1; + break; + } else if (bytes_read > 0) { + ptr = buffer; + while (bytes_write = write(dstFd, ptr, bytes_read)) { + /* 一个致命错误发生了 */ + if ((bytes_write == -1) && (errno != EINTR)) { + ret = -1; + break; + } + /* 写完了所有读的字节 */ + else if (bytes_write == bytes_read) { + ret = 0; + break; + } + /* 只写了一部分,继续写 */ + else if (bytes_write > 0) { + ptr += bytes_write; + bytes_read -= bytes_write; + } + } + /* 写的时候发生的致命错误 */ + if (bytes_write == -1) { + ret = -1; + break; + } + } + } + fsync(dstFd); + close(dstFd); + return ret; +} + + +int CFile::delFile(const char *path) +{ + if (strlen(path) <= 0) return -1; + if (unlink(path) != 0) { + LOGD("delete file(%s) err=%s", path, strerror(errno)); + return -1; + } + return 0; +} + +int CFile::delFile() +{ + if (strlen(mPath) <= 0) return -1; + if (unlink(mPath) != 0) { + LOGD("delete file(%s) err=%s", mPath, strerror(errno)); + return -1; + } + return 0; +} + + +int CFile::getFileAttrValue(const char *path) +{ + int value; + FILE *fp = fopen (path, "r+" ); + + if ( fp == NULL ) { + LOGE ( "Open %s error(%s)!\n", path, strerror ( errno ) ); + return -1; + } + fscanf ( fp, "%d", &value ); + fclose ( fp ); + return value; +} + +int CFile::setFileAttrValue(const char *path, int value) +{ + FILE *fp = fopen ( path, "w" ); + + if ( fp == NULL ) { + LOGW ( "Open %s error(%s)!\n", path, strerror ( errno ) ); + return -1; + } + fprintf ( fp, "%d", value ); + fclose ( fp ); + return 0; +} + +int CFile::getFileAttrStr(const char *path, char *str) +{ + return 0; +} + +int CFile::setFileAttrStr(const char *path, const char *str) +{ + FILE *fp = fopen ( path, "w" ); + + if ( fp == NULL ) { + LOGW ( "Open %s error(%s)!\n", path, strerror ( errno ) ); + return -1; + } + fprintf ( fp, "%s", str ); + fclose ( fp ); + return 0; +} diff --git a/tvapi/libtv/tvutils/CFile.h b/tvapi/libtv/tvutils/CFile.h new file mode 100644 index 0000000..bbb5266 --- a/dev/null +++ b/tvapi/libtv/tvutils/CFile.h @@ -0,0 +1,47 @@ +/* + * showbo +*/ +#ifndef C_FILE_H +#define C_FILE_H + +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <stdio.h> +#include <errno.h> + +#define CC_MAX_FILE_PATH_LEN (256) + +#define BUFFER_SIZE 1024 + +class CFile +{ +public: + CFile(const char *path); + CFile(); + virtual ~CFile(); + virtual int openFile(const char *path); + virtual int closeFile(); + virtual int writeFile(const unsigned char *pData, int uLen); + virtual int readFile(const unsigned char *pBuf, int uLen); + int copyTo(const char *dstPath); + static int delFile(const char *path); + static int getFileAttrValue(const char *path); + static int setFileAttrValue(const char *path, int value); + static int getFileAttrStr(const char *path, char *str); + static int setFileAttrStr(const char *path, const char *str); + int delFile(); + int flush(); + int seekTo(); + int seekToBegin(); + int seekToEnd(); + int getLength(); + int getFd() + { + return mFd; + }; +protected: + char mPath[CC_MAX_FILE_PATH_LEN]; + int mFd; +}; +#endif diff --git a/tvapi/libtv/tvutils/CHdmiCecCmd.cpp b/tvapi/libtv/tvutils/CHdmiCecCmd.cpp new file mode 100644 index 0000000..7a343b9 --- a/dev/null +++ b/tvapi/libtv/tvutils/CHdmiCecCmd.cpp @@ -0,0 +1,15 @@ +#include "CHdmiCecCmd.h" +CHdmiCec::CHdmiCec() +{ +} + +CHdmiCec::~CHdmiCec() +{ +} + +int CHdmiCec::readFile(unsigned char *pBuf, unsigned int uLen) +{ + int ret; + ret = read(mFd, pBuf, uLen); + return ret; +} diff --git a/tvapi/libtv/tvutils/CHdmiCecCmd.h b/tvapi/libtv/tvutils/CHdmiCecCmd.h new file mode 100644 index 0000000..00b31af --- a/dev/null +++ b/tvapi/libtv/tvutils/CHdmiCecCmd.h @@ -0,0 +1,10 @@ +#include "CFile.h" + +static const char *CEC_PATH = "/dev/aocec"; +class CHdmiCec: public CFile +{ +public: + CHdmiCec(); + ~CHdmiCec(); + int readFile(unsigned char *pBuf, unsigned int uLen); +}; diff --git a/tvapi/libtv/tvutils/CMsgQueue.cpp b/tvapi/libtv/tvutils/CMsgQueue.cpp new file mode 100644 index 0000000..16da460 --- a/dev/null +++ b/tvapi/libtv/tvutils/CMsgQueue.cpp @@ -0,0 +1,116 @@ +#include "CMsgQueue.h" +#include <CTvLog.h> +#include <utils/Timers.h> +CMessage::CMessage() +{ + mDelayMs = 0; + mWhenMs = 0; +} + +CMessage::~CMessage() +{ + +} + +CMsgQueueThread::CMsgQueueThread() +{ + +} + +CMsgQueueThread::~CMsgQueueThread() +{ + //请求退出处理线程,并阻塞 + requestExitAndWait(); +} + +nsecs_t CMsgQueueThread::getNowMs() +{ + return systemTime(SYSTEM_TIME_MONOTONIC) / 1000000; +} +void CMsgQueueThread::sendMsg(CMessage &msg) +{ + CMutex::Autolock _l(mLockQueue); + msg.mWhenMs = getNowMs() + msg.mDelayMs;// + + int i = 0; + while (i < m_v_msg.size() && m_v_msg[i].mWhenMs <= msg.mWhenMs) i++; //find the index that will insert(i) + m_v_msg.insertAt(msg, i);//insert at index i + CMessage msg1 = m_v_msg[0]; + LOGD("sendmsg now2 = %lld i = %d", getNowMs(), i); + LOGD("sendmsg now3 = %lld msg1 when = %lld", getNowMs(), msg1.mWhenMs); + // + //if(i == 0)// is empty or new whenMS is at index 0, low all ms in list. so ,need to wakeup loop, to get new delay time. + mGetMsgCondition.signal(); +} +//有个缺陷,只能根据消息类型移除,同类型消息会全部移除,但足够用了 +void CMsgQueueThread::removeMsg(CMessage &msg) +{ + CMutex::Autolock _l(mLockQueue); + int beforeSize = m_v_msg.size(); + for (int i = 0; i < m_v_msg.size(); i++) { + const CMessage &_msg = m_v_msg.itemAt(i); + if (_msg.mType == msg.mType) { + m_v_msg.removeAt(i); + } + } + //some msg removeed + if (beforeSize > m_v_msg.size()) + mGetMsgCondition.signal(); +} + +int CMsgQueueThread::startMsgQueue() +{ + CMutex::Autolock _l(mLockQueue); + this->run(); + return 0; +} + +bool CMsgQueueThread::threadLoop() +{ + int sleeptime = 100;//ms + + while (!exitPending()) { //requietexit() or requietexitWait() not call + mLockQueue.lock(); + while (m_v_msg.size() == 0) { //msg queue is empty + mGetMsgCondition.wait(mLockQueue);//first unlock,when return,lock again,so need,call unlock + } + mLockQueue.unlock(); + //get delay time + CMessage msg; + nsecs_t delayMs = 0, nowMS = 0; + do { //wait ,until , the lowest time msg's whentime is low nowtime, to go on + if (m_v_msg.size() <= 0) { + LOGD("msg size is 0, break"); + break; + } + mLockQueue.lock();//get msg ,first lock. + msg = m_v_msg[0];//get first + mLockQueue.unlock(); + + delayMs = msg.mWhenMs - getNowMs(); + LOGD("threadLoop now = %lld mswhen = %lld delayMs = %lld msg type = %d", getNowMs(), msg.mWhenMs, delayMs, msg.mType); + if (delayMs > 0) { + mLockQueue.lock();//get msg ,first lock. + int ret = mGetMsgCondition.waitRelative(mLockQueue, delayMs); + mLockQueue.unlock(); + LOGD("msg queue wait ret = %d", ret); + } else { + break; + } + } while (true); //msg[0], timeout + + if (m_v_msg.size() > 0) { + mLockQueue.lock();// + msg = m_v_msg[0]; + m_v_msg.removeAt(0); + mLockQueue.unlock();// + //handle it + handleMessage(msg); + } + + //usleep(sleeptime * 1000); + } + //exit + //return true, run again, return false,not run. + return false; +} diff --git a/tvapi/libtv/tvutils/CMsgQueue.h b/tvapi/libtv/tvutils/CMsgQueue.h new file mode 100644 index 0000000..774a910 --- a/dev/null +++ b/tvapi/libtv/tvutils/CMsgQueue.h @@ -0,0 +1,54 @@ +/* + * showboz + * 单(线程)消费者 + * 一个简单的MSG handler +*/ +#include "CThread.h" +#include <utils/Vector.h> +using namespace android; +#if !defined(_C_MSG_QUEUE_H) +#define _C_MSG_QUEUE_H + +class CMessage +{ +public: + CMessage(); + ~CMessage(); + nsecs_t mDelayMs;//delay times , MS + nsecs_t mWhenMs;//when, the msg will handle + int mType; + void *mpData; + unsigned char mpPara[2048]; +}; + +class CMsgQueueThread: public CThread +{ +public: + CMsgQueueThread(); + virtual ~CMsgQueueThread(); + int startMsgQueue(); + void sendMsg(CMessage &msg); + void removeMsg(CMessage &msg); +private: + bool threadLoop(); + nsecs_t getNowMs();//get system time , MS + virtual void handleMessage(CMessage &msg) = 0; + + // + Vector<CMessage> m_v_msg; + CCondition mGetMsgCondition; + CMutex mLockQueue; +}; + +/*class CHandler +{ + pubulic: + CHandler(CMsgQueueThread& msgQueue); + ~CHandler(); + void sendMsg(); + void removeMsg(); + private: + virtual void handleMessage(CMessage &msg); +};*/ + +#endif diff --git a/tvapi/libtv/tvutils/CMutex.h b/tvapi/libtv/tvutils/CMutex.h new file mode 100644 index 0000000..87e9a8e --- a/dev/null +++ b/tvapi/libtv/tvutils/CMutex.h @@ -0,0 +1,116 @@ +/* +reference android api, just linux pthread +*/ + +#ifndef _TV_UTILS_MUTEX_H +#define _TV_UTILS_MUTEX_H + +#include <stdint.h> +#include <sys/types.h> +#include <time.h> +#include <pthread.h> + +class CCondition; + +/* + * Simple mutex class. The implementation is system-dependent. + * + * The mutex must be unlocked by the thread that locked it. They are not + * recursive, i.e. the same thread can't lock it multiple times. + */ +class CMutex +{ +public: + enum { + PRIVATE = 0, + SHARED = 1 + }; + + CMutex(); + CMutex(const char *name); + CMutex(int type, const char *name = NULL); + ~CMutex(); + + // lock or unlock the mutex + int lock(); + void unlock(); + + // lock if possible; returns 0 on success, error otherwise + int tryLock(); + + // Manages the mutex automatically. It'll be locked when Autolock is + // constructed and released when Autolock goes out of scope. + class Autolock + { + public: + inline Autolock(CMutex &mutex) : mLock(mutex) + { + mLock.lock(); + } + inline Autolock(CMutex *mutex) : mLock(*mutex) + { + mLock.lock(); + } + inline ~Autolock() + { + mLock.unlock(); + } + private: + CMutex &mLock; + }; + +private: + friend class CCondition; + + // A mutex cannot be copied + CMutex(const CMutex &); + CMutex &operator = (const CMutex &); + + pthread_mutex_t mMutex; +}; + + + + + +inline CMutex::CMutex() +{ + pthread_mutex_init(&mMutex, NULL); +} +inline CMutex::CMutex(const char *name) +{ + pthread_mutex_init(&mMutex, NULL); +} +inline CMutex::CMutex(int type, const char *name) +{ + if (type == SHARED) { + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); + pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED); + pthread_mutex_init(&mMutex, &attr); + pthread_mutexattr_destroy(&attr); + } else { + pthread_mutex_init(&mMutex, NULL); + } +} +inline CMutex::~CMutex() +{ + pthread_mutex_destroy(&mMutex); +} +inline int CMutex::lock() +{ + return -pthread_mutex_lock(&mMutex); +} +inline void CMutex::unlock() +{ + pthread_mutex_unlock(&mMutex); +} +inline int CMutex::tryLock() +{ + return -pthread_mutex_trylock(&mMutex); +} + + +//typedef CMutex::Autolock AutoMutex; + +#endif diff --git a/tvapi/libtv/tvutils/CSerialCommunication.cpp b/tvapi/libtv/tvutils/CSerialCommunication.cpp new file mode 100644 index 0000000..b479aa7 --- a/dev/null +++ b/tvapi/libtv/tvutils/CSerialCommunication.cpp @@ -0,0 +1,126 @@ +#include <CTvLog.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <sys/prctl.h> +#include <fcntl.h> +#include <errno.h> + +#include <cutils/log.h> + +#include "CSerialCommunication.h" + +#ifdef LOG_TAG +#undef LOG_TAG +#define LOG_TAG "CSerialCommunication" +#endif + +CSerialCommunication::CSerialCommunication() +{ + int i = 0; + + mpObserver = NULL; + mState = STATE_STOPED; + + mFileName[0] = 0; + for (i = 0; i < CC_MAX_SERIAL_RD_BUF_LEN; i++) { + mDataBuf[i] = 0; + } +} + +CSerialCommunication::~CSerialCommunication() +{ + mSerialPort.CloseDevice(); +} + +int CSerialCommunication::OpenModule(int serial_dev_id) +{ + int tmp_ret = 0; + + if (mSerialPort.OpenDevice(serial_dev_id) < 0) { + return -1; + } + + return mSerialPort.setup_serial(); +} + +int CSerialCommunication::CloseModule() +{ + stop(); + mSerialPort.CloseDevice(); + return 0; +} + +int CSerialCommunication::start() +{ + if (mState == STATE_STOPED) { + this->run(); + } + + return 0; +} + +int CSerialCommunication::stop() +{ + requestExit(); + mState = STATE_STOPED; + + return 0; +} + +int CSerialCommunication::sendData(int data_len, unsigned char data_buf[]) +{ + mSerialPort.writeFile(data_buf, data_len); + return 0; +} + +bool CSerialCommunication::threadLoop() +{ + int rd_len = 0; + int thread_dly_tm = 100 * 1000; + + if (mpObserver == NULL) { + return false; + } + + if (mSerialPort.getFd() < 0) { + return false; + } + + if (mSerialPort.getDevId() < 0) { + return false; + } + + LOGD("%s, entering...\n", "TV"); + + prctl(PR_SET_NAME, (unsigned long)"CSerialCommunication thread loop"); + + mState = STATE_RUNNING; + + while (!exitPending()) { //requietexit() or requietexitWait() not call + memset(mDataBuf, 0, CC_MAX_SERIAL_RD_BUF_LEN); + rd_len = mSerialPort.readFile(mDataBuf, CC_MAX_SERIAL_RD_BUF_LEN); + if (rd_len <= 0) { + usleep(thread_dly_tm); + continue; + } + + LOGD("%s, rd_len = %d.\n", __FUNCTION__, rd_len); + + if (rd_len > CC_MAX_SERIAL_RD_BUF_LEN) { + rd_len = CC_MAX_SERIAL_RD_BUF_LEN; + } + + LOGD("%s, send data to java.", __FUNCTION__); + //send data to java + mpObserver->onSerialCommunication(mSerialPort.getDevId(), rd_len, mDataBuf); + + usleep(thread_dly_tm); + } + + mState = STATE_STOPED; + + LOGD("%s, exiting...\n", "TV"); + //return true, run again, return false,not run. + return false; +} diff --git a/tvapi/libtv/tvutils/CSerialCommunication.h b/tvapi/libtv/tvutils/CSerialCommunication.h new file mode 100644 index 0000000..15ae451 --- a/dev/null +++ b/tvapi/libtv/tvutils/CSerialCommunication.h @@ -0,0 +1,50 @@ +#ifndef __TV_SERIAL_COMMUNICATION_H__ +#define __TV_SERIAL_COMMUNICATION_H__ + +#include "CThread.h" +#include "CSerialPort.h" + +#define CC_MAX_SERIAL_RD_BUF_LEN (1200) + +class CSerialCommunication: public CThread +{ +public: + CSerialCommunication(); + ~CSerialCommunication(); + + int start(); + int stop(); + int OpenModule(int serial_dev_id); + int CloseModule(); + int sendData(int data_len, unsigned char data_buf[]); + + class ISerialCommunicationObserver + { + public: + ISerialCommunicationObserver() {}; + virtual ~ISerialCommunicationObserver() {}; + virtual void onSerialCommunication(int dev_id, int rd_len, unsigned char data_buf[]) {}; + }; + + void setObserver(ISerialCommunicationObserver *pOb) + { + mpObserver = pOb; + }; + +private: + bool threadLoop(); + + int mState; + ISerialCommunicationObserver *mpObserver; + CSerialPort mSerialPort; + + char mFileName[CC_MAX_FILE_PATH_LEN]; + unsigned char mDataBuf[CC_MAX_SERIAL_RD_BUF_LEN]; + + enum SerialCommunicationState { + STATE_STOPED = 0, + STATE_RUNNING, + }; +}; + +#endif //__TV_SERIAL_COMMUNICATION_H__ diff --git a/tvapi/libtv/tvutils/CSerialPort.cpp b/tvapi/libtv/tvutils/CSerialPort.cpp new file mode 100644 index 0000000..f634b04 --- a/dev/null +++ b/tvapi/libtv/tvutils/CSerialPort.cpp @@ -0,0 +1,357 @@ +#include "CSerialPort.h" +#include <pthread.h> +#include "CTvLog.h" +#include <stdio.h> +#include <unistd.h> +#include <stdlib.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <string.h> +#include <termios.h> +#include <errno.h> + +#include "../tvconfig/tvconfig.h" + +CSerialPort::CSerialPort() +{ + mDevId = -1; +} +//close it +CSerialPort::~CSerialPort() +{ +} + +int CSerialPort::OpenDevice(int serial_dev_id) +{ + int tmp_ret = 0; + const char *dev_file_name = NULL; + + if (getFd() < 0) { + if (serial_dev_id == SERIAL_A) { + dev_file_name = DEV_PATH_S0; + } else if (serial_dev_id == SERIAL_B) { + dev_file_name = DEV_PATH_S1; + } else if (serial_dev_id == SERIAL_C) { + dev_file_name = DEV_PATH_S2; + } + + if (dev_file_name != NULL) { + mDevId = serial_dev_id; + tmp_ret = openFile(dev_file_name); + } + } + + return tmp_ret; +} + +int CSerialPort::CloseDevice() +{ + mDevId = -1; + closeFile(); + + return 0; +} + +void CSerialPort::set_speed (int fd, int speed) +{ + int i; + int status; + struct termios Opt; + tcgetattr (fd, &Opt); + for (i = 0; i < sizeof (speed_arr) / sizeof (int); i++) { + if (speed == name_arr[i]) { + tcflush (fd, TCIOFLUSH); + cfsetispeed (&Opt, speed_arr[i]); + cfsetospeed (&Opt, speed_arr[i]); + status = tcsetattr (fd, TCSANOW, &Opt); + if (status != 0) { + perror ("tcsetattr fd1"); + return; + } + tcflush (fd, TCIOFLUSH); + } + } +} + +int CSerialPort::set_Parity (int fd, int databits, int stopbits, int parity) +{ + struct termios options; + if (tcgetattr (fd, &options) != 0) { + perror ("SetupSerial 1"); + return (0); + } + options.c_cflag &= ~CSIZE; + switch (databits) { + case 7: + options.c_cflag |= CS7; + break; + case 8: + options.c_cflag |= CS8; + break; + default: + fprintf (stderr, "Unsupported data size\n"); + return (0); + } + switch (parity) { + case 'n': + case 'N': + options.c_cflag &= ~PARENB; /* Clear parity enable */ + options.c_iflag &= ~INPCK; /* Enable parity checking */ + break; + case 'o': + case 'O': + options.c_cflag |= (PARODD | PARENB); + options.c_iflag |= INPCK; /* Disnable parity checking */ + break; + case 'e': + case 'E': + options.c_cflag |= PARENB; /* Enable parity */ + options.c_cflag &= ~PARODD; + options.c_iflag |= INPCK; /* Disnable parity checking */ + break; + case 'S': + case 's': /*as no parity */ + options.c_cflag &= ~PARENB; + options.c_cflag &= ~CSTOPB; + break; + default: + fprintf (stderr, "Unsupported parity\n"); + return (0); + } + + switch (stopbits) { + case 1: + options.c_cflag &= ~CSTOPB; + break; + case 2: + options.c_cflag |= CSTOPB; + break; + default: + fprintf (stderr, "Unsupported stop bits\n"); + return (0); + } + /* Set input parity option */ + if (parity != 'n') + options.c_iflag |= INPCK; + tcflush (fd, TCIFLUSH); + options.c_cc[VTIME] = 150; + options.c_cc[VMIN] = 0; /* Update the options and do it NOW */ + //qd to set raw mode, which is copied from web + options.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP + | INLCR | IGNCR | ICRNL | IXON); + options.c_oflag &= ~OPOST; + options.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN); + options.c_cflag &= ~(CSIZE | PARENB); + options.c_cflag |= CS8; + + if (tcsetattr (fd, TCSANOW, &options) != 0) { + perror ("SetupSerial 3"); + return (0); + } + return (1); +} + +int CSerialPort::setup_serial() +{ + set_speed(mFd, 115200); + set_Parity(mFd, 8, 1, 'N'); + return 0; +} + +int CSerialPort::set_opt(int speed, int db, int sb, char pb, int overtime, bool raw_mode) +{ + int i = 0; + struct termios old_cfg, new_cfg; + if (mFd <= 0) { + LOGE("not open dev, when set opt"); + return -1; + } + //first get it + if (tcgetattr(mFd, &old_cfg) != 0) { + LOGE("get serial attr error mFd = %d(%s)!\n", mFd, strerror(errno)); + return -1; + } + + //set speed + for (i = 0; i < sizeof(speed_arr) / sizeof(int); i++) { + if (speed == name_arr[i]) { + cfsetispeed(&new_cfg, speed_arr[i]); + cfsetospeed(&new_cfg, speed_arr[i]); + break; + } + } + + setdatabits(&new_cfg, db); + setstopbits(&new_cfg, sb); + setparity(&new_cfg, pb); + + + if (overtime >= 0) { + new_cfg.c_cc[VTIME] = overtime / 100; /* 设置超时 seconds*/ + new_cfg.c_cc[VMIN] = 0; /* Update the options and do it NOW */ + } + + if (raw_mode) { + cfmakeraw(&new_cfg); + } + + //clear + tcflush(mFd, TCIOFLUSH); + if (tcsetattr(mFd, TCSANOW, &new_cfg) < 0) { + LOGE("%s, set serial attr error(%s)!\n", "TV", strerror(errno)); + return -1; + } + //clear,let be avail + tcflush(mFd, TCIOFLUSH); + + return 0; +} + +int CSerialPort::writeFile(const unsigned char *pData, unsigned int uLen) +{ + unsigned int len; + len = write(mFd, pData, uLen); + if (len == uLen) { + return len; + } else { + tcflush(mFd, TCOFLUSH); + LOGE("write data failed and tcflush hComm\n"); + return -1; + } +} + +static int com_read_data(int hComm, unsigned char *pData, unsigned int uLen) +{ + char inbuff[uLen]; + char buff[uLen]; + char tempbuff[uLen]; + int i = 0, j = 0; + + memset(inbuff, '\0', uLen); + memset(buff, '\0', uLen); + memset(tempbuff, '\0', uLen); + + if (hComm < 0) { + return -1; + } + + char *p = inbuff; + + fd_set readset; + struct timeval tv; + int MaxFd = 0; + + unsigned int c = 0; + int z, k; + + do { + FD_ZERO(&readset); + FD_SET(hComm, &readset); + MaxFd = hComm + 1; + tv.tv_sec = 0; + tv.tv_usec = 100000; + do { + z = select(MaxFd, &readset, 0, 0, &tv); + } while (z == -1 && errno == EINTR); + + if (z == -1) { + hComm = -1; + break; + } + + if (z == 0) { + hComm = -1; + break; + } + + if (FD_ISSET(hComm, &readset)) { + z = read(hComm, buff, uLen - c); +#if 0 + for (k = 0; k < z; k++) { + LOGD("%s, inbuff[%d]:%02X", "TV", k, buff[k]); + } +#endif + c += z; + + if (z > 0) { + if (z < (signed int) uLen) { + buff[z + 1] = '\0'; + memcpy(p, buff, z); + p += z; + } else { + memcpy(inbuff, buff, z); + } + + memset(buff, '\0', uLen); + } else { + hComm = -1; + } + + if (c >= uLen) { + hComm = -1; + break; + } + } + } while (hComm >= 0); + + memcpy(pData, inbuff, c); + p = NULL; + return c; +} + +int CSerialPort::readFile(unsigned char *pBuf, unsigned int uLen) +{ + //using non-block mode + return com_read_data(mFd, pBuf, uLen); +} + +int CSerialPort::setdatabits(struct termios *s, int db) +{ + if (db == 5) { + s->c_cflag = (s->c_cflag & ~CSIZE) | (CS5 & CSIZE); + } else if (db == 6) { + s->c_cflag = (s->c_cflag & ~CSIZE) | (CS6 & CSIZE); + } else if (db == 7) { + s->c_cflag = (s->c_cflag & ~CSIZE) | (CS7 & CSIZE); + } else if (db == 8) { + s->c_cflag = (s->c_cflag & ~CSIZE) | (CS8 & CSIZE); + } else { + LOGE("Unsupported data size!\n"); + } + return 0; +} + +int CSerialPort::setstopbits(struct termios *s, int sb) +{ + if (sb == 1) { + s->c_cflag &= ~CSTOPB; + } else if (sb == 2) { + s->c_cflag |= CSTOPB; + } else { + LOGE("Unsupported stop bits!\n"); + } + return 0; +} + +int CSerialPort::setparity(struct termios *s, char pb) +{ + if (pb == 'n' || pb == 'N') { + s->c_cflag &= ~PARENB; /* Clear parity enable */ + s->c_cflag &= ~INPCK; /* Enable parity checking */ + } else if (pb == 'o' || pb == 'O') { + s->c_cflag |= (PARODD | PARENB); + s->c_cflag |= INPCK; /* Disable parity checking */ + } else if (pb == 'e' || pb == 'E') { + s->c_cflag |= PARENB; /* Enable parity */ + s->c_cflag &= ~PARODD; + s->c_iflag |= INPCK; /* Disable parity checking */ + } else if (pb == 's' || pb == 'S') { + s->c_cflag &= ~PARENB; + s->c_cflag &= ~CSTOPB; + s->c_cflag |= INPCK; /* Disable parity checking */ + } else { + LOGE("Unsupported parity!\n"); + } + return 0; +} diff --git a/tvapi/libtv/tvutils/CSerialPort.h b/tvapi/libtv/tvutils/CSerialPort.h new file mode 100644 index 0000000..6f77e73 --- a/dev/null +++ b/tvapi/libtv/tvutils/CSerialPort.h @@ -0,0 +1,55 @@ +#ifndef __CSERIAL_STREAM__ +#define __CSERIAL_STREAM__ +#include "CFile.h" +#include <stdio.h> +#include <unistd.h> +#include <stdlib.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <string.h> +#include <pthread.h> +#include <termios.h> +#include <errno.h> + + +static const int speed_arr[] = {B115200, B38400, B19200, B9600, B4800, B2400, B1200, B300, B38400, B19200, B9600, B4800, B2400, B1200, B300}; +static const int name_arr[] = { 115200, 38400, 19200, 9600, 4800, 2400, 1200, 300, 38400, 19200, 9600, 4800, 2400, 1200, 300}; +static const char *DEV_PATH_S0 = "/dev/ttyS0"; +static const char *DEV_PATH_S1 = "/dev/ttyS1"; +static const char *DEV_PATH_S2 = "/dev/ttyS2"; + +enum SerialDeviceID { + SERIAL_A = 0, + SERIAL_B, + SERIAL_C, +}; + +class CSerialPort: public CFile +{ +public: + CSerialPort(); + ~CSerialPort(); + + int OpenDevice(int serial_dev_id); + int CloseDevice(); + + int writeFile(const unsigned char *pData, unsigned int uLen); + int readFile(unsigned char *pBuf, unsigned int uLen); + int set_opt(int speed, int db, int sb, char pb, int overtime, bool raw_mode); + int setup_serial(); + int getDevId() + { + return mDevId; + }; + +private: + int setdatabits(struct termios *s, int db); + int setstopbits(struct termios *s, int sb); + int setparity(struct termios *s, char pb); + int set_Parity (int fd, int databits, int stopbits, int parity); + void set_speed (int fd, int speed); + + int mDevId; +}; +#endif diff --git a/tvapi/libtv/tvutils/CSqlite.cpp b/tvapi/libtv/tvutils/CSqlite.cpp new file mode 100644 index 0000000..f4e91fb --- a/dev/null +++ b/tvapi/libtv/tvutils/CSqlite.cpp @@ -0,0 +1,152 @@ +// +// +// amlogic 2015 +// +// @ Project : tv +// @ File Name : CSqlite +// @ Date : 2015-5 +// @ Author : +// +// +#include "CSqlite.h" +#ifdef LOG_TAG +#undef LOG_TAG +#define LOG_TAG "CSqlite" +#endif + +using namespace android; + +CSqlite::CSqlite() +{ + mHandle = NULL; +} + +CSqlite::~CSqlite() +{ + if (mHandle > 0) { + sqlite3_close(mHandle); + mHandle = NULL; + } +} +//完整性检测,检测数据库是否被破坏 +bool CSqlite::integrityCheck() +{ + char *err; + int rval = sqlite3_exec(mHandle, "PRAGMA integrity_check;", sqlite3_exec_callback, NULL, &err); + if (rval != SQLITE_OK) { + LOGD(" val = %d msg = %s!\n", rval, sqlite3_errmsg(mHandle)); + return false; + } else { + return true; + } + return true; +} +int CSqlite::sqlite3_exec_callback(void *data, int nColumn, char **colValues, char **colNames) +{ + LOGD("sqlite3_exec_callback--- nums = %d", nColumn); + for (int i = 0; i < nColumn; i++) { + LOGD("%s\t", colValues[i]); + } + LOGD("\n"); + + return 0; +} + +int CSqlite::openDb(const char *path) +{ + if (sqlite3_open(path, &mHandle) != SQLITE_OK) { + LOGD("open db(%s) error", path); + mHandle = NULL; + return -1; + } + return 0; +} + +int CSqlite::closeDb() +{ + int rval = 0; + if (mHandle != NULL) { + rval = sqlite3_close(mHandle); + mHandle = NULL; + } + return rval; +} +void CSqlite::setHandle(sqlite3 *h) +{ + mHandle = h; +} + +sqlite3 *CSqlite::getHandle() +{ + return mHandle; +} +int CSqlite::select(const char *sql, CSqlite::Cursor &c) +{ + int col, row; + char **pResult = NULL; + char *errmsg; + assert(mHandle && sql); + + if (strncmp(sql, "select", 6)) + return -1; + //LOGD("sql=%s", sql); + if (sqlite3_get_table(mHandle, sql, &pResult, &row, &col, &errmsg) != SQLITE_OK) { + LOGD("errmsg=%s", errmsg); + if (pResult != NULL) + sqlite3_free_table(pResult); + return -1; + } + + //LOGD("row=%d, col=%d", row, col); + c.Init(pResult, row, col); + return 0; +} + +void CSqlite::insert() +{ + +} + +bool CSqlite::exeSql(const char *sql) +{ + char *errmsg; + if (sql == NULL) return false; + if (sqlite3_exec(mHandle, sql, NULL, NULL, &errmsg) != SQLITE_OK) { + LOGD("exeSql=: %s error=%s", sql, errmsg ? errmsg : "Unknown"); + if (errmsg) + sqlite3_free(errmsg); + return false; + } + LOGD("sql=%s", sql); + return true; +} + +bool CSqlite::beginTransaction() +{ + return exeSql("begin;"); +} + +bool CSqlite::commitTransaction() +{ + return exeSql("commit;"); +} + +bool CSqlite::rollbackTransaction() +{ + return exeSql("rollback;"); +} + +void CSqlite::del() +{ + +} + +void CSqlite::update() +{ + +} + +void CSqlite::xxtable() +{ + +} diff --git a/tvapi/libtv/tvutils/CSqlite.h b/tvapi/libtv/tvutils/CSqlite.h new file mode 100644 index 0000000..6398e16 --- a/dev/null +++ b/tvapi/libtv/tvutils/CSqlite.h @@ -0,0 +1,186 @@ +// +// +// amlogic 2015 +// +// @ Project : tv +// @ File Name : CSqlite +// @ Date : 2015-5 +// @ Author : +// +// +#if !defined(_CSQLITE_H_) +#define _CSQLITE_H_ +#include <unistd.h> +#include <stdlib.h> +#include <utils/String8.h> +#include <utils/Vector.h> +#include <utils/RefBase.h> +#include "CTvLog.h" +#include <sqlite3.h> +using namespace android; +class CSqlite +{ +public: + class Cursor + { + public: + void Init(char **data, int cow, int col) + { + mData = data; + mCurRowIndex = 0; + mRowNums = cow; + mColNums = col; + mIsClosed = false; + } + Cursor() + { + mData = NULL; + mCurRowIndex = 0; + mRowNums = 0; + mColNums = 0; + mIsClosed = false; + } + + /*Cursor(Cursor& c) + { + data = c.data; + mCurRowIndex = 0; + mRowNums = c.mRowNums; + mColNums = c.mColNums; + mIsClosed = false; + } + + Cursor& operator = (const Cursor& c) + { + data = c.data; + mCurRowIndex = 0; + mRowNums = c.mRowNums; + mColNums = c.mColNums; + mIsClosed = false; + return *this; + }*/ + ~Cursor() + { + close(); + } + //Row nums + int getCount() + { + return mRowNums; + } + + int getPosition(); + + bool move(int offset); + + bool moveToPosition(int position); + + bool moveToFirst() + { + //LOGD("moveToFirst mRowNums = %d", mRowNums); + if (mRowNums <= 0) return false; + mCurRowIndex = 0; + return true; + } + + bool moveToLast(); + + bool moveToNext() + { + if (mCurRowIndex >= mRowNums - 1)return false; + mCurRowIndex++; + return true; + } + + bool moveToPrevious(); + + int getColumnIndex(const char *columnName) + { + int index = 0; + for (int i = 0; i < mColNums; i++) { + if (strcmp(columnName, mData[i]) == 0) + return index; + index++; + } + + return -1; + } + + //String getColumnName(int columnIndex); + //String[] getColumnNames(); + int getColumnCount(); + //字符串长度问题,弃用 + int getString(char *str, int columnIndex) + { + if (columnIndex >= mColNums || str == NULL) return -1; + strcpy(str, mData[mColNums * (mCurRowIndex + 1) + columnIndex]); + return 0; + } + //不限长度,依赖于String8 + String8 getString(int columnIndex) + { + if (columnIndex >= mColNums) return String8(""); + return String8(mData[mColNums * (mCurRowIndex + 1) + columnIndex]); + } + + int getInt(int columnIndex) + { + //if(columnIndex >= mColNums || str == NULL) return -1; + return atoi(mData[mColNums * (mCurRowIndex + 1) + columnIndex]); + } + unsigned long int getUInt(int columnIndex) + { + return strtoul(mData[mColNums * (mCurRowIndex + 1) + columnIndex], NULL, 10); + } + double getF(int columnIndex) + { + return atof(mData[mColNums * (mCurRowIndex + 1) + columnIndex]); + } + int getType(int columnIndex); + void close() + { + if (mData != NULL) + sqlite3_free_table(mData); + + mData = NULL; + mCurRowIndex = 0; + mRowNums = 0; + mIsClosed = true; + } + bool isClosed() + { + return mIsClosed; + } + private: + char **mData; + int mCurRowIndex; + int mRowNums; + int mColNums; + bool mIsClosed; + }; +public: + CSqlite(); + virtual ~CSqlite(); + int openDb(const char *path); + int closeDb(); + void setHandle(sqlite3 *h); + sqlite3 *getHandle(); + bool integrityCheck(); + int select(const char *sql, Cursor &); + bool exeSql(const char *sql); + void insert(); + void del(); + void update(); + void xxtable(); + bool beginTransaction(); + bool commitTransaction(); + bool rollbackTransaction(); + void dbsync() + { + sync(); + }; +private: + static int sqlite3_exec_callback(void *data, int nColumn, char **colValues, char **colNames); + sqlite3 *mHandle; +}; +#endif //CSQLITE diff --git a/tvapi/libtv/tvutils/CThread.cpp b/tvapi/libtv/tvutils/CThread.cpp new file mode 100644 index 0000000..16ebc30 --- a/dev/null +++ b/tvapi/libtv/tvutils/CThread.cpp @@ -0,0 +1,165 @@ +/* +reference android api, just linux pthread +*/ + +#include <stdio.h> +#include <stdlib.h> +#include <memory.h> +#include <errno.h> +#include <assert.h> +#include <unistd.h> + +#include <pthread.h> +#include <sched.h> +#include <sys/resource.h> + +#include "CThread.h" +#include <CTvLog.h> + +#include <sys/prctl.h> + +CThread::CThread() + : mThreadId(-1), + mLock("Thread::mLock"), + mExitPending(false), mRunning(false) +{ +} + +CThread::~CThread() +{ +} + +int CThread::readyToRun() +{ + return 0; +} + + +int CThread::run(const char *name, int priority, int stack) +{ + CMutex::Autolock _l(mLock); + + if (mRunning) { + // thread already started + return -1; + } + + mStatus = 0; + mExitPending = false; + mThreadId = -1; + mRunning = true; + + + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + + if (stack) { + pthread_attr_setstacksize(&attr, stack); + } + + int result = pthread_create(&mThreadId, &attr, + _threadLoop, this); + pthread_attr_destroy(&attr); + if (result != 0) { + LOGE("Thread create fail ret = %d (errno=%d)\n", + result, errno); + + mStatus = -1; // something happened! + mRunning = false; + mThreadId = -1; + return -1; + } + return 0; +} + +void *CThread::_threadLoop(void *user) +{ + CThread *const self = static_cast<CThread *>(user); + + bool first = true; + do { + bool result; + if (first) { + first = false; + self->mStatus = self->readyToRun(); + result = (self->mStatus == 0); + + if (result && !self->exitPending()) { + result = self->threadLoop(); + } + } else { + result = self->threadLoop(); + } + + + CMutex::Autolock _l(self->mLock); + if (result == false || self->mExitPending) { + self->mExitPending = true; + self->mRunning = false; + // clear thread ID so that requestExitAndWait() does not exit if + // called by a new thread using the same thread ID as this one. + self->mThreadId = -1; + // note that interested observers blocked in requestExitAndWait are + // awoken by broadcast, but blocked on mLock until break exits scope + self->mThreadExitedCondition.broadcast(); + break; + } + } while (true); + + return NULL; +} + +void CThread::requestExit() +{ + CMutex::Autolock _l(mLock); + mExitPending = true; +} + +int CThread::requestExitAndWait() +{ + CMutex::Autolock _l(mLock); + if (mThreadId == pthread_self()) { + ALOGW( + "Thread (this=%p): don't call waitForExit() from this " + "Thread object's thread. It's a guaranteed deadlock!", + this); + return -1; + } + + mExitPending = true; + + while (mRunning == true) { + mThreadExitedCondition.wait(mLock); + } + // This next line is probably not needed any more, but is being left for + // historical reference. Note that each interested party will clear flag. + mExitPending = false; + + return mStatus; +} + +int CThread::join() +{ + CMutex::Autolock _l(mLock); + if (mThreadId == pthread_self()) { + ALOGW( + "Thread (this=%p): don't call join() from this " + "Thread object's thread. It's a guaranteed deadlock!", + this); + + return -1; + } + + while (mRunning == true) { + mThreadExitedCondition.wait(mLock); + } + + return mStatus; +} + +bool CThread::exitPending() const +{ + CMutex::Autolock _l(mLock); + return mExitPending; +} diff --git a/tvapi/libtv/tvutils/CThread.h b/tvapi/libtv/tvutils/CThread.h new file mode 100644 index 0000000..38e8265 --- a/dev/null +++ b/tvapi/libtv/tvutils/CThread.h @@ -0,0 +1,62 @@ +/* +reference android api, just linux pthread +*/ + +#ifndef _TV_UTILS_THREAD_H +#define _TV_UTILS_THREAD_H + +#include <stdint.h> +#include <sys/types.h> +#include <time.h> +#include <pthread.h> +#include "CCondition.h" +#include "CMutex.h" + +class CThread +{ +public: + CThread(); + virtual ~CThread(); + + // Start the thread in threadLoop() which needs to be implemented. + virtual int run(const char *name = 0, + int priority = 0, + int stack = 0); + //request thread object to exit, asynchronous to exit. + virtual void requestExit(); + + // Good place to do one-time initializations + virtual int readyToRun(); + + // Call requestExit() and wait until this object's thread exits. + // BE VERY CAREFUL of deadlocks. In particular, it would be silly to call + // this function from this object's thread. Will return WOULD_BLOCK in + // that case. + int requestExitAndWait(); + + // Wait until this object's thread exits. Returns immediately if not yet running. + // Do not call from this object's thread; will return WOULD_BLOCK in that case. + int join(); +protected: + // exitPending() returns true if requestExit() has been called. + bool exitPending() const; + +private: + // Derived class must implement threadLoop(). The thread starts its life + // here. There are two ways of using the Thread object: + // 1) loop: if threadLoop() returns true, it will be called again if + // requestExit() wasn't called. + // 2) once: if threadLoop() returns false, the thread will exit upon return. + virtual bool threadLoop() = 0; + +private: + static void *_threadLoop(void *user); + pthread_t mThreadId; + mutable CMutex mLock; + CCondition mThreadExitedCondition; + int mStatus; + //note that all accesses of mExitPending and mRunning need to hold mLock + volatile bool mExitPending; + volatile bool mRunning; +}; +#endif diff --git a/tvapi/libtv/tvutils/CTvInput.cpp b/tvapi/libtv/tvutils/CTvInput.cpp new file mode 100644 index 0000000..4c460fd --- a/dev/null +++ b/tvapi/libtv/tvutils/CTvInput.cpp @@ -0,0 +1,156 @@ +#include "CTvInput.h" +#include <fcntl.h> +#include <CTvLog.h> +#include <utils/Timers.h> +#define LOG_TAG "FBC" +CTvInput::CTvInput() +{ + mKeyEventFd_IR = open(KEY_EVENT_0, O_RDWR); + mKeyEventFd = open(KEY_EVENT_1, O_RDWR); + if (mKeyEventFd < 0 || mKeyEventFd_IR < 0) { + LOGD( "could not open /dev/input/event1\n "); + return ; + } + mRepeatKeyCode = -1; + mRepeatKeydisTime = -1; + mWhenTimeRepeatKeyStartToSend = -1; + mTimeoutCount = 0; +} + +CTvInput::~CTvInput() +{ + close(mKeyEventFd); + close(mKeyEventFd_IR); +} + +void CTvInput::sendkeyEvent(const int &type, const int &code, const int &value) +{ + int ret; + struct input_event event; + + memset(&event, 0, sizeof(event)); + event.type = type; + event.code = code ; + event.value = value; + ret = write(mKeyEventFd, &event, sizeof(event)); + if (ret < sizeof(event)) { + LOGD("sendkeyEvent :write event failed, %s\n", strerror(errno)); + return ; + } +} + +void CTvInput::sendIRkeyEvent(const int &type, const int &code, const int &value) +{ + int ret; + struct input_event event; + + memset(&event, 0, sizeof(event)); + event.type = type; + event.code = code ; + event.value = value; + ret = write(mKeyEventFd_IR, &event, sizeof(event)); + if (ret < sizeof(event)) { + LOGD("sendIRkeyEvent :write event failed, %s\n", strerror(errno)); + return ; + } +} + +void CTvInput::sendkeyCode(const int &code) +{ + sendkeyEvent(1 , code, 1); //down + sendkeyEvent(0, 0, 0); //clear + sendkeyEvent(1 , code, 0); //up + sendkeyEvent(0, 0, 0); //clear +} + +void CTvInput::sendkeyCode_Up(const int &code) +{ + sendkeyEvent(1 , code, 0); //up + sendkeyEvent(0, 0, 0); //clear +} + +void CTvInput::sendkeyCode_Down(const int &code) +{ + sendkeyEvent(1 , code, 1); //down + sendkeyEvent(0, 0, 0); //clear +} +void CTvInput::sendIRkeyCode(const int &code) +{ + sendIRkeyEvent(1 , code, 1); //down + sendIRkeyEvent(0, 0, 0); //clear + sendIRkeyEvent(1 , code, 0); //up + sendIRkeyEvent(0, 0, 0); //clear +} + +void CTvInput::sendIRkeyCode_Up(const int &code) +{ + sendIRkeyEvent(1 , code, 0); //up + sendIRkeyEvent(0, 0, 0); //clear +} + +void CTvInput::sendIRkeyCode_Down(const int &code) +{ + sendIRkeyEvent(1 , code, 1); //down + sendIRkeyEvent(0, 0, 0); //clear +} + +nsecs_t CTvInput::getNowMs() +{ + return systemTime(SYSTEM_TIME_MONOTONIC) / 1000000; +} +void CTvInput::sendKeyRepeatStart(const int &code, int disTime, int repeatDisTime) +{ + CMutex::Autolock _l(mLock); + mTimeoutCount = 0; + mRepeatKeyCode = code; + mRepeatKeydisTime = disTime; + mWhenTimeRepeatKeyStartToSend = disTime + getNowMs(); + mRepeatKeyRepeateDisTime = repeatDisTime; + LOGD("sendKeyRepeatStart when = %lld", mWhenTimeRepeatKeyStartToSend); + mSendKeyCondition.signal(); +} + +void CTvInput::sendKeyRepeatStop() +{ + CMutex::Autolock _l(mLock); + mRepeatKeyCode = -1; + mRepeatKeydisTime = -1; +} + +bool CTvInput::threadLoop() +{ + int sleeptime = 100;//ms + + while (!exitPending()) { //requietexit() or requietexitWait() not call + LOGD("threadLoop0 when = %lld", mWhenTimeRepeatKeyStartToSend); + while (mRepeatKeyCode < 0 || mRepeatKeydisTime < 0) { //msg queue is empty + mLock.lock(); + mSendKeyCondition.wait(mLock);//first unlock,when return,lock again,so need,call unlock + mLock.unlock(); + } + LOGD("threadLoop1 when = %lld", mWhenTimeRepeatKeyStartToSend); + int disToSend = -1; + do { + disToSend = mWhenTimeRepeatKeyStartToSend - getNowMs(); + LOGD("dis when = %lld", disToSend); + if (disToSend <= 0) break; + + mLock.lock(); + mSendKeyCondition.waitRelative(mLock, disToSend);//first unlock,when return,lock again,so need,call unlock + mLock.unlock(); + } while (disToSend > 0); // + LOGD("threadLoop2 when = %lld ", mWhenTimeRepeatKeyStartToSend); + if (mTimeoutCount < 30) { + LOGD("mTimeoutCount = %d \n", mTimeoutCount); + + mTimeoutCount++; + sendkeyCode(mRepeatKeyCode); + } else { + LOGD("mTimeoutCount = %d,so stop sending long press msg.\n", mTimeoutCount); + } + usleep(mRepeatKeyRepeateDisTime * 1000); + } + //exit + //return true, run again, return false,not run. + return false; +}
\ No newline at end of file diff --git a/tvapi/libtv/tvutils/CTvInput.h b/tvapi/libtv/tvutils/CTvInput.h new file mode 100644 index 0000000..952befb --- a/dev/null +++ b/tvapi/libtv/tvutils/CTvInput.h @@ -0,0 +1,39 @@ +#ifndef _TV_INPUT_H +#define _TV_INPUT_H +#include <linux/input.h> +# +#include "CThread.h" +static const char *KEY_EVENT_0 = "/dev/input/event0"; +static const char *KEY_EVENT_1 = "/dev/input/event1"; +static const char *KEY_EVENT_2 = "/dev/input/event2"; +class CTvInput: public CThread +{ +public: + CTvInput(); + ~CTvInput(); + void sendkeyEvent(const int &type, const int &code, const int &value); + void sendIRkeyEvent(const int &type, const int &code, const int &value); + void sendkeyCode(const int &code); + void sendkeyCode_Up(const int &code); + void sendkeyCode_Down(const int &code); + void sendIRkeyCode(const int &code); + void sendIRkeyCode_Up(const int &code); + void sendIRkeyCode_Down(const int &code); + void sendKeyRepeatStart(const int &code, int disTime, int repeatDisTime);//ms + void sendKeyRepeatStop(); + nsecs_t getNowMs(); + +private: + bool threadLoop(); + + int mKeyEventFd; + int mKeyEventFd_IR; + CCondition mSendKeyCondition; + CMutex mLock; + int mRepeatKeyCode; + int mRepeatKeydisTime; + int mRepeatKeyRepeateDisTime; + int mTimeoutCount; + nsecs_t mWhenTimeRepeatKeyStartToSend; +}; +#endif diff --git a/tvapi/libtv/tvutils/serial_base.cpp b/tvapi/libtv/tvutils/serial_base.cpp new file mode 100644 index 0000000..8a5a98b --- a/dev/null +++ b/tvapi/libtv/tvutils/serial_base.cpp @@ -0,0 +1,466 @@ +#include <stdio.h> +#include <unistd.h> +#include <stdlib.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <string.h> +#include <pthread.h> +#include <termios.h> +#include <errno.h> + +#include <android/log.h> +#include <cutils/log.h> + +#include "serial_base.h" + +#define LOG_TAG "serial_base" +#include "CTvLog.h" + +#define CS_SERIAL_A_DEV_PATH "/dev/ttyS0" +#define CS_SERIAL_B_DEV_PATH "/dev/ttyS1" + +static int gSerialAHandle = -1; +static pthread_mutex_t serial_a_op_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t serial_a_r_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t serial_a_w_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t serial_a_speed_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t serial_a_parity_mutex = PTHREAD_MUTEX_INITIALIZER; + +static int gSerialBHandle = -1; +static pthread_mutex_t serial_b_op_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t serial_b_r_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t serial_b_w_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t serial_b_speed_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t serial_b_parity_mutex = PTHREAD_MUTEX_INITIALIZER; + +static int speed_arr[] = { B115200, B38400, B19200, B9600, B4800, B2400, B1200, B300, B38400, B19200, B9600, B4800, B2400, B1200, B300, }; +static int name_arr[] = { 115200, 38400, 19200, 9600, 4800, 2400, 1200, 300, 38400, 19200, 9600, 4800, 2400, 1200, 300, }; + +static int open_com_dev(int *dev_handle, char *dev_path) +{ + if (*dev_handle < 0) { + *dev_handle = open(dev_path, O_RDWR); + if (*dev_handle < 0) { + LOGE("%s, Can't Open Serial Port %s", "TV", dev_path); + } + } + + return *dev_handle; +} + +static int close_com_dev(int *dev_handle) +{ + if (*dev_handle >= 0) { + close(*dev_handle); + *dev_handle = -1; + } + + return 0; +} + +static __inline__ int cfsetdatabits(struct termios *s, int db) +{ + if (db == 5) { + s->c_cflag = (s->c_cflag & ~CSIZE) | (CS5 & CSIZE); + } else if (db == 6) { + s->c_cflag = (s->c_cflag & ~CSIZE) | (CS6 & CSIZE); + } else if (db == 7) { + s->c_cflag = (s->c_cflag & ~CSIZE) | (CS7 & CSIZE); + } else if (db == 8) { + s->c_cflag = (s->c_cflag & ~CSIZE) | (CS8 & CSIZE); + } else { + LOGE("%s, Unsupported data size!\n", "TV"); + } + + return 0; +} + +static __inline__ int cfsetstopbits(struct termios *s, int sb) +{ + if (sb == 1) { + s->c_cflag &= ~CSTOPB; + } else if (sb == 2) { + s->c_cflag |= CSTOPB; + } else { + LOGE("%s, Unsupported stop bits!\n", "TV"); + } + + return 0; +} + +static __inline__ int cfsetparity(struct termios *s, int pb) +{ + if (pb == 'n' || pb == 'N') { + s->c_cflag &= ~PARENB; /* Clear parity enable */ + s->c_cflag &= ~INPCK; /* Enable parity checking */ + } else if (pb == 'o' || pb == 'O') { + s->c_cflag |= (PARODD | PARENB); + s->c_cflag |= INPCK; /* Disable parity checking */ + } else if (pb == 'e' || pb == 'E') { + s->c_cflag |= PARENB; /* Enable parity */ + s->c_cflag &= ~PARODD; + s->c_iflag |= INPCK; /* Disable parity checking */ + } else if (pb == 's' || pb == 'S') { + s->c_cflag &= ~PARENB; + s->c_cflag &= ~CSTOPB; + s->c_cflag |= INPCK; /* Disable parity checking */ + } else { + LOGE("%s, Unsupported parity!\n", "TV"); + } + + return 0; +} + +static int gOriAttrGetFlag = 0; +static struct termios gOriAttrValue; +static __inline__ int com_get_attr(int fd, struct termios *s) +{ + if (gOriAttrGetFlag == 0) { + if (tcgetattr(fd, s) != 0) { + return -1; + } + + gOriAttrGetFlag = 1; + gOriAttrValue = *s; + } + + *s = gOriAttrValue; + + return 0; +} + +static int com_set_opt(int hComm, int speed, int db, int sb, int pb, int to, int raw_mode) +{ + int i = 0; + struct termios tmpOpt; + + if (com_get_attr(hComm, &tmpOpt) != 0) { + LOGE("%s, get serial attr error(%s)!\n", "TV", strerror(errno)); + return -1; + } + + for (i = 0; i < sizeof(speed_arr) / sizeof(int); i++) { + if (speed == name_arr[i]) { + cfsetispeed(&tmpOpt, speed_arr[i]); + cfsetospeed(&tmpOpt, speed_arr[i]); + break; + } + } + + cfsetdatabits(&tmpOpt, db); + cfsetstopbits(&tmpOpt, sb); + cfsetparity(&tmpOpt, pb); + + if (to >= 0) { + tmpOpt.c_cc[VTIME] = to; /* 设置超时15 seconds*/ + tmpOpt.c_cc[VMIN] = 0; /* Update the options and do it NOW */ + } + + if (raw_mode == 1) { + cfmakeraw(&tmpOpt); + } + + tcflush(hComm, TCIOFLUSH); + if (tcsetattr(hComm, TCSANOW, &tmpOpt) < 0) { + LOGE("%s, set serial attr error(%s)!\n", "TV", strerror(errno)); + return -1; + } + tcflush(hComm, TCIOFLUSH); + + return 0; +} + +static int com_write_data(int hComm, const unsigned char *pData, unsigned int uLen) +{ + unsigned int len; + + if (hComm < 0) { + return -1; + } + + if (pData == NULL) { + return -1; + } + + LOGD("%s, write %d bytes\n", "TV", uLen); + + len = write(hComm, pData, uLen); + if (len == uLen) { + LOGD("%s, write data success\n", "TV"); + return len; + } else { + tcflush(hComm, TCOFLUSH); + LOGE("%s, write data failed and tcflush hComm\n", "TV"); + return -1; + } +} + +static int com_read_data(int hComm, char *pData, unsigned int uLen) +{ + char inbuff[uLen]; + char buff[uLen]; + char tempbuff[uLen]; + int i = 0, j = 0; + + memset(inbuff, '\0', uLen); + memset(buff, '\0', uLen); + memset(tempbuff, '\0', uLen); + + if (hComm < 0) { + return -1; + } + + char *p = inbuff; + + fd_set readset; + struct timeval tv; + int MaxFd = 0; + + unsigned int c = 0; + int z, k; + + do { + FD_ZERO(&readset); + FD_SET(hComm, &readset); + MaxFd = hComm + 1; + tv.tv_sec = 0; + tv.tv_usec = 100000; + do { + z = select(MaxFd, &readset, 0, 0, &tv); + } while (z == -1 && errno == EINTR); + + if (z == -1) { + hComm = -1; + break; + } + + if (z == 0) { + hComm = -1; + break; + } + + if (FD_ISSET(hComm, &readset)) { + z = read(hComm, buff, uLen - c); +#if 0 + for (k = 0; k < z; k++) { + LOGD("%s, inbuff[%d]:%02X", "TV", k, buff[k]); + } +#endif + c += z; + + if (z > 0) { + if (z < (signed int) uLen) { + buff[z + 1] = '\0'; + memcpy(p, buff, z); + p += z; + } else { + memcpy(inbuff, buff, z); + } + + memset(buff, '\0', uLen); + } else { + hComm = -1; + } + + if (c >= uLen) { + hComm = -1; + break; + } + } + } while (hComm >= 0); + + memcpy(pData, inbuff, c); + p = NULL; + return c; +} + +int com_a_open_dev() +{ + int tmp_ret = 0; + + pthread_mutex_lock(&serial_a_op_mutex); + + tmp_ret = open_com_dev(&gSerialAHandle, CS_SERIAL_A_DEV_PATH); + + pthread_mutex_unlock(&serial_a_op_mutex); + + return tmp_ret; +} + +int com_b_open_dev() +{ + int tmp_ret = 0; + + pthread_mutex_lock(&serial_b_op_mutex); + + tmp_ret = open_com_dev(&gSerialBHandle, CS_SERIAL_B_DEV_PATH); + + pthread_mutex_unlock(&serial_b_op_mutex); + + return tmp_ret; +} + +int com_a_close_dev() +{ + int tmp_ret = 0; + + pthread_mutex_lock(&serial_a_op_mutex); + + tmp_ret = close_com_dev(&gSerialAHandle); + + pthread_mutex_unlock(&serial_a_op_mutex); + + return tmp_ret; +} + +int com_b_close_dev() +{ + int tmp_ret = 0; + + pthread_mutex_lock(&serial_b_op_mutex); + + tmp_ret = close_com_dev(&gSerialBHandle); + + pthread_mutex_unlock(&serial_b_op_mutex); + + return tmp_ret; +} + +int com_a_get_dev() +{ + int tmp_ret = 0; + + pthread_mutex_lock(&serial_a_op_mutex); + + tmp_ret = gSerialAHandle; + + pthread_mutex_unlock(&serial_a_op_mutex); + + return tmp_ret; +} + +int com_b_get_dev() +{ + int tmp_ret = 0; + + pthread_mutex_lock(&serial_b_op_mutex); + + tmp_ret = gSerialBHandle; + + pthread_mutex_unlock(&serial_b_op_mutex); + + return tmp_ret; +} + +int com_a_set_opt(int speed, int db, int sb, int pb, int to, int raw_mode) +{ + int tmp_ret = 0; + + pthread_mutex_lock(&serial_a_parity_mutex); + + if (com_a_get_dev() < 0) { + pthread_mutex_unlock(&serial_a_parity_mutex); + return -1; + } + + tmp_ret = com_set_opt(gSerialAHandle, speed, db, sb, pb, to, raw_mode); + + pthread_mutex_unlock(&serial_a_parity_mutex); + + return tmp_ret; +} + +int com_b_set_opt(int speed, int db, int sb, int pb, int to, int raw_mode) +{ + int tmp_ret = 0; + + pthread_mutex_lock(&serial_b_parity_mutex); + + if (com_b_get_dev() < 0) { + pthread_mutex_unlock(&serial_b_parity_mutex); + return -1; + } + + tmp_ret = com_set_opt(gSerialBHandle, speed, db, sb, pb, to, raw_mode); + + pthread_mutex_unlock(&serial_b_parity_mutex); + + return tmp_ret; +} + +int com_a_write_data(const unsigned char *pData, unsigned int uLen) +{ + int tmp_ret = 0; + + pthread_mutex_lock(&serial_a_w_mutex); + + if (com_a_get_dev() < 0) { + pthread_mutex_unlock(&serial_a_w_mutex); + return -1; + } + + LOGD("%s, write %d bytes\n", "TV", uLen); + + tmp_ret = com_write_data(gSerialAHandle, pData, uLen); + + pthread_mutex_unlock(&serial_a_w_mutex); + + return tmp_ret; +} + +int com_b_write_data(const unsigned char *pData, unsigned int uLen) +{ + int tmp_ret = 0; + + pthread_mutex_lock(&serial_b_w_mutex); + + if (com_b_get_dev() < 0) { + pthread_mutex_unlock(&serial_b_w_mutex); + return -1; + } + + LOGD("%s, write %d bytes\n", "TV", uLen); + + tmp_ret = com_write_data(gSerialBHandle, pData, uLen); + + pthread_mutex_unlock(&serial_b_w_mutex); + + return tmp_ret; +} + +int com_a_read_data(char *pData, unsigned int uLen) +{ + int tmp_ret = 0; + + pthread_mutex_lock(&serial_a_r_mutex); + + if (com_a_get_dev() < 0) { + pthread_mutex_unlock(&serial_a_r_mutex); + return -1; + } + + tmp_ret = com_read_data(gSerialAHandle, pData, uLen); + + pthread_mutex_unlock(&serial_a_r_mutex); + + return tmp_ret; +} + +int com_b_read_data(char *pData, unsigned int uLen) +{ + int tmp_ret = 0; + + pthread_mutex_lock(&serial_b_r_mutex); + + if (com_b_get_dev() < 0) { + pthread_mutex_unlock(&serial_b_r_mutex); + return -1; + } + + tmp_ret = com_read_data(gSerialBHandle, pData, uLen); + + pthread_mutex_unlock(&serial_b_r_mutex); + + return tmp_ret; +} diff --git a/tvapi/libtv/tvutils/serial_base.h b/tvapi/libtv/tvutils/serial_base.h new file mode 100644 index 0000000..145ca5a --- a/dev/null +++ b/tvapi/libtv/tvutils/serial_base.h @@ -0,0 +1,17 @@ +#ifndef __SERIAL_BASE_H__ +#define __SERIAL_BASE_H__ + +extern int com_a_open_dev(); +extern int com_b_open_dev(); +extern int com_a_close_dev(); +extern int com_b_close_dev(); +extern int com_a_get_dev(); +extern int com_b_get_dev(); +extern int com_a_set_opt(int speed, int db, int sb, int pb, int timeout, int raw_mode); +extern int com_b_set_opt(int speed, int db, int sb, int pb, int timeout, int raw_mode); +extern int com_a_write_data(const unsigned char *pData, unsigned int uLen); +extern int com_b_write_data(const unsigned char *pData, unsigned int uLen); +extern int com_a_read_data(char *pData, unsigned int uLen); +extern int com_b_read_data(char *pData, unsigned int uLen); + +#endif//__SERIAL_BASE_H__ diff --git a/tvapi/libtv/tvutils/serial_operate.cpp b/tvapi/libtv/tvutils/serial_operate.cpp new file mode 100644 index 0000000..c81357e --- a/dev/null +++ b/tvapi/libtv/tvutils/serial_operate.cpp @@ -0,0 +1,229 @@ +#include <stdio.h> +#include <unistd.h> +#include <stdlib.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <string.h> +#include <pthread.h> +#include <termios.h> +#include <errno.h> +#include <linux/hidraw.h> +#include <android/log.h> +#include <cutils/log.h> + +//#include "../TvService.h" +//#include "../include/tvcmd.h" +//#include "../tvconfig/tvconfig_api.h" +//#include "../tvconfig/tvconfig_logcfg.h" + +#include "serial_base.h" +#include "serial_operate.h" + +#ifdef LOG_TAG +#undef LOG_TAG +#define LOG_TAG "headset" +#endif +#include "CTvLog.h" + + +//****************************************************** +#ifndef HIDIOCSFEATURE +#define HIDIOCSFEATURE(len) _IOC(_IOC_WRITE|_IOC_READ, 'H', 0x06, len) +#define HIDIOCGFEATURE(len) _IOC(_IOC_WRITE|_IOC_READ, 'H', 0x07, len) +#endif +#define product_nid 0x00e0 +//#define product_nid 0x00e0 + +#define vendor_id 0x1A1D +#define ENDPOINT 3 + +#define EVENT_2_4G_HEADSET_ON 0 +#define EVENT_2_4G_HEADSET_OFF 1 + +CTv2d4GHeadSetDetect::CTv2d4GHeadSetDetect() +{ +} + +CTv2d4GHeadSetDetect::~CTv2d4GHeadSetDetect() +{ +} + +int CTv2d4GHeadSetDetect::startDetect() +{ + this->run(); + + return 0; +} + +bool CTv2d4GHeadSetDetect::threadLoop() +{ + int i = 0, rd_len = 0; + int thread_cmd_dly_tm = 1000 * 1000; + int tvThermal_cnt = 0, fd = 0; + char data[10] = "0"; + + LOGD("%s, entering...\n", __FUNCTION__); + + //SetSerialBThreadExecFlag(1); + + //********************************* + int hidraw_fd; + unsigned char buf[32]; + char phybuf[256]; + struct hidraw_devinfo info; + int read_size = 0; + bool debug = true; + char device[68]; + int HeadsetConnectState = false; + + int curdeviceID = -1; + for (int deviceID = 0; deviceID < 5; deviceID++) { + sprintf(device, "/dev/hidraw%d", deviceID); + LOGD(" thread device =%s ", device ); + if ((hidraw_fd = open(device, O_RDWR)) < 0 ) { + LOGD("cann't open path:%s!!!\n", device); + continue; + } + memset(phybuf, 0x0, 256); + LOGD("AAAAAAAAAAAAAA:%s!!!\n", device); + if (ioctl(hidraw_fd, HIDIOCGRAWINFO, &info) >= 0 && + ioctl(hidraw_fd, HIDIOCGRAWPHYS(256), phybuf) >= 0) { + LOGD("\t %d, product id = 0x%04x \n", __LINE__, info.product); + LOGD("\t %d, vendor id = 0x%04x \n", __LINE__, info.vendor); + int len = strlen(phybuf); + if (phybuf[len - 1] - '0' == ENDPOINT) { + if (info.vendor == vendor_id) { + curdeviceID = deviceID; + LOGD("\t product id = 0x%04x \n", info.product); + LOGD("\t vendor id = 0x%04x\n", info.vendor); + break; + } + } + } + close(hidraw_fd); + } + if (curdeviceID == -1) + return 0; + + sprintf(device, "/dev/hidraw%d", curdeviceID); + LOGD(" thread device =%s ", device ); + if ( (hidraw_fd = open(device, O_RDWR | O_NONBLOCK) ) < 0 ) { + printf("cann't open path:%s!!!\n", device); + return 0; + } + int checkvalue[300] ; + int countcheck = 0; + int count = 0; + int ritemcounts = 15; + //**************************************** + + while ( !exitPending() ) { //requietexit() or requietexitWait() not call + //loop codes + //LOGD("while 2.4G %s ", __FUNCTION__); + + memset(buf, 0x0, 32); + for (int ritem = 0; ritem < ritemcounts ; ritem++ ) { + read_size = read(hidraw_fd, buf, 32); + //for (int i = 0; i < 32; i++) + //ALOGD("read_size %d ", read_size); + if (debug) { + count ++; + if (count == 3000) { + LOGD("%02x %02x %02x %02x %02x %02x ", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]); + count = 0; + } + } + if (read_size < 0 ) { + + } + + checkvalue[countcheck] = buf[4] & 0x1f; + if (countcheck == 299) { + int checkcountvalue = 0; + for (int icheck = 0; icheck < countcheck ; icheck++ ) + checkcountvalue += checkvalue[icheck]; + // LOGD("checkcountvalue = %d",checkcountvalue); + if (checkcountvalue <= 5 * 4) { + if (HeadsetConnectState == true) { + if (debug) { + LOGD("headset connect false"); + LOGD("headset connect false"); + } + + mpObserver->onHeadSetDetect(0, 0); + //usleep(1000 * 200); + } + HeadsetConnectState = false; + } else if (checkcountvalue >= 200 * 4) { + if (HeadsetConnectState == false) { + if (debug) { + LOGD("headset connect true"); + LOGD("headset connect true"); + } + mpObserver->onHeadSetDetect(1, 0); + //usleep(1000 * 200); + } + HeadsetConnectState = true; + } + countcheck = 0; + } + countcheck ++; + + // bit 0: headset mic in/off; bit 1:headset on/off; bit 2: headphone on/off; bit 3: soundbar on/off ;bit 4: subwoofer on/off + /* else if (buf[4] & 0x1f) + { + if (HeadsetConnectState == false) + { + if (debug) + { + ALOGD("headset connect true"); + ALOGD("headset connect true"); + } + android::TvService::getIntance()->SendDtvStats(1,0,0,0,0,0); + //usleep(1000 * 200); + } + HeadsetConnectState = true; + } + else + { + if (HeadsetConnectState == true) + { + if (debug) + { + ALOGD("headset connect false"); + ALOGD("headset connect false"); + } + android::TvService::getIntance()->SendDtvStats(2,0,0,0,0,0); + //usleep(1000 * 200); + } + HeadsetConnectState = false; + }*/ + } + { + //added for fbc thermal setting + tvThermal_cnt++; + if (tvThermal_cnt == 300) { //60 sec + tvThermal_cnt = 0; + fd = open("/sys/class/thermal/thermal_zone0/temp", O_RDONLY); + if (fd < 0) { + LOGE("ERROR: failed to open file error: %d\n", errno); + } else { + read(fd, data, sizeof(data)); + close(fd); + LOGD("thermal temp data = %s ~~~~~~\n", data); + int x = 0; + x = atoi(data); + mpObserver->onThermalDetect(x); + LOGD("int data :%d\n", x); + } + } + } + usleep(1000 * 200); + } + //exit + //return true, run again, return false,not run. + return false; +} + + diff --git a/tvapi/libtv/tvutils/serial_operate.h b/tvapi/libtv/tvutils/serial_operate.h new file mode 100644 index 0000000..ef9fad6 --- a/dev/null +++ b/tvapi/libtv/tvutils/serial_operate.h @@ -0,0 +1,36 @@ +#ifndef __SERIAL_OPERATE_H__ +#define __SERIAL_OPERATE_H__ +#include "tvutils/CThread.h" + +class CTv2d4GHeadSetDetect: public CThread +{ + +public: + CTv2d4GHeadSetDetect(); + ~CTv2d4GHeadSetDetect(); + + int startDetect(); + + class IHeadSetObserver + { + public: + IHeadSetObserver() + {}; + virtual ~IHeadSetObserver() + {}; + virtual void onHeadSetDetect(int state, int para) {}; + virtual void onThermalDetect(int state) {}; + + }; + void setObserver ( IHeadSetObserver *pOb ) + { + mpObserver = pOb; + }; + +private: + bool threadLoop(); + IHeadSetObserver *mpObserver; + +}; + +#endif//__SERIAL_OPERATE_H__ diff --git a/tvapi/libtv/tvutils/tvutils.cpp b/tvapi/libtv/tvutils/tvutils.cpp new file mode 100644 index 0000000..157431d --- a/dev/null +++ b/tvapi/libtv/tvutils/tvutils.cpp @@ -0,0 +1,1912 @@ +#include <unistd.h> +#include <stdio.h> +#include <string.h> +#include <errno.h> +#include <unistd.h> +#include <sys/ioctl.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/socket.h> +#include <sys/un.h> +#include <fcntl.h> +#include <ctype.h> +#include <sys/prctl.h> +#include <stdlib.h> +#include <android/log.h> +#include <cutils/android_reboot.h> +#include "../tvconfig/tvconfig.h" +#include "../tvsetting/CTvSetting.h" +#include "../audio/audio_api.h" +#include "../tv/CFbcCommunication.h" +#include <cutils/properties.h> +#include <dirent.h> +using namespace android; + +#include "tvutils.h" + +#define LOG_TAG "LibTvMISC" +#include "CTvLog.h" + +#define CS_I2C_1_DEV_PATH "/dev/i2c-1" +#define CS_I2C_2_DEV_PATH "/dev/i2c-2" + +/* number of times a device address should be polled when not acknowledging */ +#define I2C_RETRIES 0x0701 + +/* set timeout in units of 10 ms */ +#define I2C_TIMEOUT 0x0702 + +/* NOTE: Slave address is 7 or 10 bits, but 10-bit addresses + * are NOT supported! (due to code brokenness) + */ + +/* Use this slave address */ +#define I2C_SLAVE 0x0703 + +/* Use this slave address, even if it is already in use by a driver! */ +#define I2C_SLAVE_FORCE 0x0706 + +#define I2C_TENBIT 0x0704 /* 0 for 7 bit addrs, != 0 for 10 bit */ +#define I2C_FUNCS 0x0705 /* Get the adapter functionality mask */ +#define I2C_RDWR 0x0707 /* Combined R/W transfer (one STOP only) */ +#define I2C_PEC 0x0708 /* != 0 to use PEC with SMBus */ +#define I2C_SMBUS 0x0720 /* SMBus transfer */ + +struct i2c_msg { + unsigned short addr; /* slave address */ + unsigned short flags; +#define I2C_M_TEN 0x0010 /* this is a ten bit chip address */ +#define I2C_M_WR 0x0000 /* write data, from master to slave */ +#define I2C_M_RD 0x0001 /* read data, from slave to master */ +#define I2C_M_NOSTART 0x4000 /* if I2C_FUNC_PROTOCOL_MANGLING */ +#define I2C_M_REV_DIR_ADDR 0x2000 /* if I2C_FUNC_PROTOCOL_MANGLING */ +#define I2C_M_IGNORE_NAK 0x1000 /* if I2C_FUNC_PROTOCOL_MANGLING */ +#define I2C_M_NO_RD_ACK 0x0800 /* if I2C_FUNC_PROTOCOL_MANGLING */ +#define I2C_M_RECV_LEN 0x0400 /* length will be first received byte */ + + unsigned short len; /* msg length */ + unsigned char *buf; /* pointer to msg data */ +}; + +struct i2c_rdwr_ioctl_data { + struct i2c_msg *msgs; + unsigned int nmsgs; +}; + +static volatile int mDreamPanelResumeLastBLFlag = 0; +static volatile int mDreamPanelDemoFlag = 0; + +static pthread_mutex_t dream_panel_resume_last_bl_flag_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t dream_panel_demo_flag_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t file_attr_control_flag_mutex = PTHREAD_MUTEX_INITIALIZER; + +static pthread_t UserPet_ThreadId = 0; +static unsigned char is_turnon_user_pet_thread = false; +static unsigned char is_user_pet_thread_start = false; +static unsigned int user_counter = 0; +static unsigned int user_pet_terminal = 1; + +static int iw_duty = 0; + +static int Miscioctl(const char *file_path, int request, ...) +{ + int fd = -1, tmp_ret = -1; + int bus_status = 0; + va_list ap; + void *arg; + + if (file_path == NULL) { + LOGE("%s, file path is NULL!!!\n", "TV"); + return -1; + } + + fd = open(file_path, O_RDWR); + if (fd < 0) { + LOGE("%s, Open %s ERROR(%s)!!\n", "TV", file_path, strerror(errno)); + return -1; + } + + va_start(ap, request); + arg = va_arg(ap, void *); + va_end(ap); + + tmp_ret = ioctl(fd, request, arg); + + close(fd); + fd = -1; + + return tmp_ret; +} + +int cfg_get_one_item(const char *key_str, const char *strDelimit, int item_index, char cfg_str[]) +{ + int cfg_item_ind = 0; + char *token = NULL; + const char *config_value; + char data_str[CC_CFG_VALUE_STR_MAX_LEN] = { 0 }; + + if (key_str == NULL) { + LOGE("%s, key_str's pointer is NULL.\n", "TV"); + return -1; + } + + if (cfg_str == NULL) { + LOGE("%s, cfg_str's pointer is NULL.\n", "TV"); + return -1; + } + + if (item_index < 0) { + LOGE("%s, item_index can't be less than 0.\n", "TV"); + return -1; + } + + config_value = config_get_str("TV", key_str, "null"); + if (strcasecmp(config_value, "null") == 0) { + cfg_str[0] = '\0'; + LOGE("%s, can't get config \"%s\"!!!\n", "TV", key_str); + return -1; + } + + cfg_item_ind = 0; + + memset((void *)data_str, 0, sizeof(data_str)); + strncpy(data_str, config_value, sizeof(data_str) - 1); + + token = strtok(data_str, strDelimit); + while (token != NULL) { + if (cfg_item_ind == item_index) { + strcpy(cfg_str, token); + break; + } + + token = strtok(NULL, strDelimit); + cfg_item_ind += 1; + } + + if (token == NULL) { + cfg_str[0] = '\0'; + return -1; + } + + return 0; +} + +int cfg_split(char *line_data, char *strDelimit, int *item_cnt, char **item_bufs) +{ + int i = 0, tmp_cnt = 0; + char *token = NULL; + + if (line_data == NULL) { + LOGE("%s, line_data is NULL", "TV"); + return -1; + } + + if (strDelimit == NULL) { + LOGE("%s, strDelimit is NULL", "TV"); + return -1; + } + + if (item_cnt == NULL) { + LOGE("%s, item_cnt is NULL", "TV"); + return -1; + } + + if (item_bufs == NULL) { + LOGE("%s, item_bufs is NULL", "TV"); + return -1; + } + + for (i = 0; i < *item_cnt; i++) { + item_bufs[i] = NULL; + } + + token = strtok(line_data, strDelimit); + + while (token != NULL) { + item_bufs[tmp_cnt] = token; + + token = strtok(NULL, strDelimit); + + tmp_cnt += 1; + if (tmp_cnt >= *item_cnt) { + break; + } + } + + *item_cnt = tmp_cnt; + + return 0; +} + +int ReadADCSpecialChannelValue(int adc_channel_num) +{ + FILE *fp = NULL; + int rd_data = 0; + char ch_sysfs_path[256] = { 0 }; + + if (adc_channel_num < CC_MIN_ADC_CHANNEL_VAL || adc_channel_num > CC_MAX_ADC_CHANNEL_VAL) { + LOGD("adc channel num must between %d and %d.", CC_MIN_ADC_CHANNEL_VAL, CC_MAX_ADC_CHANNEL_VAL); + return 0; + } + + sprintf(ch_sysfs_path, "/sys/class/saradc/saradc_ch%d", adc_channel_num); + + fp = fopen(ch_sysfs_path, "r"); + + if (fp == NULL) { + LOGE("open %s ERROR(%s)!!\n", ch_sysfs_path, strerror(errno)); + return 0; + } + + fscanf(fp, "%d", &rd_data); + + fclose(fp); + + return rd_data; +} + +int Tv_MiscRegs(const char *cmd) +{ + //#ifdef BRING_UP_DEBUG + FILE *fp = NULL; + fp = fopen("/sys/class/register/reg", "w"); + + if (fp != NULL && cmd != NULL) { + fprintf(fp, "%s", cmd); + } else { + LOGE("Open /sys/class/register/reg ERROR(%s)!!\n", strerror(errno)); + fclose(fp); + return -1; + } + fclose(fp); + //#endif + + return 0; +} + +int TvMisc_SetUserCounterTimeOut(int timeout) +{ + FILE *fp; + + fp = fopen("/sys/devices/platform/aml_wdt/user_pet_timeout", "w"); + + if (fp != NULL) { + fprintf(fp, "%d", timeout); + fclose(fp); + } else { + LOGE("=OSD CPP=> open /sys/devices/platform/aml_wdt/user_pet_timeout ERROR(%s)!!\n", strerror(errno)); + return -1; + } + return 0; +} + +int TvMisc_SetUserCounter(int count) +{ + FILE *fp; + + fp = fopen("/sys/module/aml_wdt/parameters/user_pet", "w"); + + if (fp != NULL) { + fprintf(fp, "%d", count); + fclose(fp); + } else { + LOGE("=OSD CPP=> open /sys/devices/platform/aml_wdt/user_pet ERROR(%s)!!\n", strerror(errno)); + return -1; + } + + fclose(fp); + + return 0; +} + +int TvMisc_SetUserPetResetEnable(int enable) +{ + FILE *fp; + + fp = fopen("/sys/module/aml_wdt/parameters/user_pet_reset_enable", "w"); + + if (fp != NULL) { + fprintf(fp, "%d", enable); + fclose(fp); + } else { + LOGE("=OSD CPP=> open /sys/devices/platform/aml_wdt/user_pet_reset_enable ERROR(%s)!!\n", strerror(errno)); + return -1; + } + + fclose(fp); + + return 0; +} + +int TvMisc_SetSystemPetResetEnable(int enable) +{ + FILE *fp; + + fp = fopen("/sys/devices/platform/aml_wdt/reset_enable", "w"); + + if (fp != NULL) { + fprintf(fp, "%d", enable); + fclose(fp); + } else { + LOGE("=OSD CPP=> open /sys/devices/platform/aml_wdt/reset_enable ERROR(%s)!!\n", strerror(errno)); + return -1; + } + + fclose(fp); + + return 0; +} + +int TvMisc_SetSystemPetEnable(int enable) +{ + FILE *fp; + + fp = fopen("/sys/devices/platform/aml_wdt/ping_enable", "w"); + + if (fp != NULL) { + fprintf(fp, "%d", enable); + fclose(fp); + } else { + LOGE("=OSD CPP=> open /sys/devices/platform/aml_wdt/ping_enable ERROR(%s)!!\n", strerror(errno)); + return -1; + } + + fclose(fp); + + return 0; +} + +int TvMisc_SetSystemPetCounterTimeOut(int timeout) +{ + FILE *fp; + + fp = fopen("/sys/devices/platform/aml_wdt/wdt_timeout", "w"); + + if (fp != NULL) { + fprintf(fp, "%d", timeout); + fclose(fp); + } else { + LOGE("=OSD CPP=> open /sys/devices/platform/aml_wdt/wdt_timeout ERROR(%s)!!\n", strerror(errno)); + return -1; + } + + fclose(fp); + + return 0; +} + +#define MEMERASE _IOW('M', 2, struct erase_info_user) +static int memerase(int fd, struct erase_info_user *erase) +{ + return (ioctl (fd, MEMERASE, erase)); +} + +#define CS_ATV_SOCKET_FILE_NAME "/dev/socket/datv_sock" + +static int setServer(const char *fileName) +{ + int ret = -1, sock = -1; + struct sockaddr_un srv_addr; + + sock = socket(PF_UNIX, SOCK_STREAM, 0); + if (sock < 0) { + LOGE("%s, socket create failed (errno = %d: %s).\n", "TV", errno, strerror(errno)); + return -1; + } + + //set server addr_param + srv_addr.sun_family = AF_UNIX; + strncpy(srv_addr.sun_path, CS_ATV_SOCKET_FILE_NAME, sizeof(srv_addr.sun_path) - 1); + unlink(CS_ATV_SOCKET_FILE_NAME); + + //bind sockfd & addr + ret = bind(sock, (struct sockaddr *) &srv_addr, sizeof(srv_addr)); + if (ret == -1) { + LOGE("%s, cannot bind server socket.\n", "TV"); + close(sock); + unlink(CS_ATV_SOCKET_FILE_NAME); + return -1; + } + + //listen sockfd + ret = listen(sock, 1); + if (ret == -1) { + LOGE("%s, cannot listen the client connect request.\n", "TV"); + close(sock); + unlink(CS_ATV_SOCKET_FILE_NAME); + return -1; + } + + return sock; +} + +static int acceptMessage(int listen_fd) +{ + int ret, com_fd; + socklen_t len; + struct sockaddr_un clt_addr; + + //have connect request use accept + len = sizeof(clt_addr); + com_fd = accept(listen_fd, (struct sockaddr *) &clt_addr, &len); + if (com_fd < 0) { + LOGE("%s, cannot accept client connect request.\n", "TV"); + close(listen_fd); + unlink(CS_ATV_SOCKET_FILE_NAME); + return -1; + } + + LOGD("%s, com_fd = %d\n", "TV", com_fd); + + return com_fd; +} + +static int parse_socket_message(char *msg_str, int *para_cnt, int para_buf[]) +{ + int para_count = 0, set_mode = 0; + char *token = NULL; + + set_mode = -1; + + token = strtok(msg_str, ","); + if (token != NULL) { + if (strcasecmp(token, "quit") == 0) { + set_mode = 0; + } else if (strcasecmp(token, "SetAudioVolumeCompensationVal") == 0) { + set_mode = 1; + } else if (strcasecmp(token, "set3dmode") == 0) { + set_mode = 2; + } else if (strcasecmp(token, "setdisplaymode") == 0) { + set_mode = 3; + } + } + + if (set_mode != 1 && set_mode != 2 && set_mode != 3) { + return set_mode; + } + + para_count = 0; + + token = strtok(NULL, ","); + while (token != NULL) { + para_buf[para_count] = strtol(token, NULL, 10); + para_count += 1; + + token = strtok(NULL, ","); + } + + *para_cnt = para_count; + + return set_mode; +} + +/*static void* socket_thread_entry(void *arg) +{ + int ret = 0, listen_fd = -1, com_fd = -1, rd_len = 0; + int para_count = 0, set_mode = 0; + int tmp_val = 0; + int para_buf[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; + static char recv_buf[1024]; + + listen_fd = setServer(CS_ATV_SOCKET_FILE_NAME); + chmod(CS_ATV_SOCKET_FILE_NAME, 0666); + prctl(PR_SET_NAME, (unsigned long) "datv.sock.thread"); + + if (listen_fd < 0) { + return NULL; + } + + while (1) { + com_fd = acceptMessage(listen_fd); + + if (com_fd >= 0) { + //read message from client + memset((void *) recv_buf, 0, sizeof(recv_buf)); + rd_len = read(com_fd, recv_buf, sizeof(recv_buf)); + LOGD("%s, message from client (%d)) : %s\n", "TV", rd_len, recv_buf); + + set_mode = parse_socket_message(recv_buf, ¶_count, para_buf); + if (set_mode == 0) { + LOGD("%s, receive quit message, starting to quit.\n", "TV"); + sprintf(recv_buf, "%s", "quiting now..."); + write(com_fd, recv_buf, strlen(recv_buf) + 1); + break; + } else if (set_mode == 1) { + ret = -1; + + if (para_count == 1) { + LOGD("%s, SetAudioVolumeCompensationVal value = %d\n", "TV", para_buf[0]); + + ret = SetAudioVolumeCompensationVal(para_buf[0]); + } else if (para_count == 2) { + LOGD("%s, SetAudioVolumeCompensationVal value = %d, type = %d\n", "TV", para_buf[0], para_buf[1]); + + ret = SetAudioVolumeCompensationVal(para_buf[0]); + + if (para_buf[1] == 1) { + tmp_val = GetAudioMasterVolume(); + ret |= SetAudioMasterVolume(tmp_val); + } + } + + sprintf(recv_buf, "%d", ret); + write(com_fd, recv_buf, strlen(recv_buf) + 1); + } else if (set_mode == 2) { + ret = -1; + + if (para_count == 1) { + LOGE("%s, mode = %d ------->\n", "TV", para_buf[0]); + + switch (para_buf[0]) { + case 4: //BT + ret = Tvin_Set3DFunction(MODE3D_BT); + break; + case 5: //LR + ret = Tvin_Set3DFunction(MODE3D_LR); + break; + case 8: // + ret = Tvin_Set3DFunction(MODE3D_DISABLE); + break; + case 0: + ret = Tvin_Set3DFunction(MODE3D_DISABLE); + break; + case 9: // + ret = Tvin_Set3DFunction(MODE3D_L_3D_TO_2D); + break; + } + if (ret == 0) { + LOGE("%s, sk_hdi_av_set_3d_mode return sucess.\n", "TV"); + } else { + LOGE("%s, sk_hdi_av_set_3d_mode return error(%d).\n", "TV", ret); + } + } + + sprintf(recv_buf, "%d", ret); + write(com_fd, recv_buf, strlen(recv_buf) + 1); + + } + + close(com_fd); + com_fd = -1; + } + } + + if (com_fd >= 0) { + close(com_fd); + com_fd = -1; + } + + if (listen_fd >= 0) { + close(listen_fd); + listen_fd = -1; + } + + unlink(CS_ATV_SOCKET_FILE_NAME); + + return NULL; +}*/ + +#if !defined(SUN_LEN) +#define SUN_LEN(su) (sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path)) +#endif + +static int connectToServer(char *file_name) +{ + int tmp_ret = 0, sock = -1; + struct sockaddr_un addr; + + if (file_name == NULL) { + LOGE("%s, file name is NULL\n", "TV"); + return -1; + } + + sock = socket(AF_UNIX, SOCK_STREAM, 0); + if (sock < 0) { + LOGE("%s, socket create failed (errno = %d: %s)\n", "TV", errno, strerror(errno)); + return -1; + } + + /* connect to socket; fails if file doesn't exist */ + strcpy(addr.sun_path, file_name); // max 108 bytes + addr.sun_family = AF_UNIX; + tmp_ret = connect(sock, (struct sockaddr *) &addr, SUN_LEN(&addr)); + if (tmp_ret < 0) { + // ENOENT means socket file doesn't exist + // ECONNREFUSED means socket exists but nobody is listening + LOGE("%s, AF_UNIX connect failed for '%s': %s\n", "TV", file_name, strerror(errno)); + close(sock); + return -1; + } + + return sock; +} + +static int realSendSocketMsg(char *file_name, char *msg_str, char recv_buf[]) +{ + int sock = -1, rd_len = 0; + char tmp_buf[1024]; + + if (file_name == NULL) { + LOGE("%s, file name is NULL\n", "TV"); + return -1; + } + + if (msg_str == NULL) { + LOGE("%s, msg string is NULL\n", "TV"); + return -1; + } + + LOGD("%s, message to server (%d)) : %s\n", "TV", strlen(msg_str), msg_str); + + sock = connectToServer(file_name); + + if (sock >= 0) { + write(sock, msg_str, strlen(msg_str) + 1); + + if (recv_buf == NULL) { + memset((void *) tmp_buf, 0, sizeof(tmp_buf)); + rd_len = read(sock, tmp_buf, sizeof(tmp_buf)); + LOGD("%s, message from server (%d)) : %s\n", "TV", rd_len, tmp_buf); + } else { + rd_len = read(sock, recv_buf, 1024); + LOGD("%s, message from server (%d)) : %s\n", "TV", rd_len, recv_buf); + } + + close(sock); + sock = -1; + + return 0; + } + + return -1; +} + +int I2C_WriteNbyte(int i2c_no, int dev_addr, int slave_addr, int len, unsigned char data_buf[]) +{ + int tmp_ret = 0; + struct i2c_rdwr_ioctl_data ctl_data; + struct i2c_msg msg; + unsigned char msg_buf[52]; + int device_fd = -1; + + memset((void *) msg_buf, 0, 52); + + msg_buf[0] = (unsigned char) (slave_addr >> 8); + msg_buf[1] = (unsigned char) (slave_addr & 0x00ff); + + if (data_buf == NULL) { + return -1; + } + + if (len < 50) { + memcpy((void *) &msg_buf[2], data_buf, len); + } else { + LOGE("I2C_WriteNbyte len(%d) > 50, error!\n", len); + return -1; + } + + msg.addr = dev_addr; + msg.flags = I2C_M_WR; + msg.len = 2 + len; + msg.buf = msg_buf; + ctl_data.nmsgs = 1; + ctl_data.msgs = &msg; + + if (i2c_no == 1) { + device_fd = open(CS_I2C_1_DEV_PATH, O_RDWR); + if (device_fd < 0) { + LOGE("%s, Open device file %S error: %s.\n", "TV", CS_I2C_1_DEV_PATH, strerror(errno)); + return -1; + } + } else if (i2c_no == 2) { + device_fd = open(CS_I2C_2_DEV_PATH, O_RDWR); + if (device_fd < 0) { + LOGE("%s, Open device file %S error: %s.\n", "TV", CS_I2C_2_DEV_PATH, strerror(errno)); + return -1; + } + } else { + LOGE("%s, invalid i2c no (%d).\n", "TV", i2c_no); + return -1; + } + + tmp_ret = ioctl(device_fd, I2C_RDWR, &ctl_data); + + usleep(10 * 1000); + if (device_fd >= 0) { + close(device_fd); + device_fd = -1; + } + return tmp_ret; +} + +int I2C_ReadNbyte(int i2c_no, int dev_addr, int slave_addr, int len, unsigned char data_buf[]) +{ + int tmp_ret = 0; + struct i2c_rdwr_ioctl_data ctl_data; + struct i2c_msg msg; + unsigned char msg_buf[52]; + int device_fd = -1; + + memset((void *) msg_buf, 0, 52); + + if (data_buf == NULL) { + return -1; + } + + if (len < 50) { + memcpy((void *) &msg_buf[2], data_buf, len); + } else { + LOGE("I2C_WriteNbyte len(%d) > 50, error!\n", len); + return -1; + } + + msg_buf[0] = (unsigned char) (slave_addr >> 8); + msg_buf[1] = (unsigned char) (slave_addr & 0x00ff); + msg.addr = dev_addr; + msg.flags = I2C_M_WR; + msg.len = 2; + msg.buf = msg_buf; + ctl_data.nmsgs = 1; + ctl_data.msgs = &msg; + + if (i2c_no == 1) { + device_fd = open(CS_I2C_1_DEV_PATH, O_RDWR); + if (device_fd < 0) { + LOGE("%s, Open device file %S error: %s.\n", "TV", CS_I2C_1_DEV_PATH, strerror(errno)); + return -1; + } + } else if (i2c_no == 2) { + device_fd = open(CS_I2C_2_DEV_PATH, O_RDWR); + if (device_fd < 0) { + LOGE("%s, Open device file %S error: %s.\n", "TV", CS_I2C_2_DEV_PATH, strerror(errno)); + return -1; + } + } else { + LOGE("%s, invalid i2c no (%d).\n", "TV", i2c_no); + return -1; + } + + tmp_ret = ioctl(device_fd, I2C_RDWR, &ctl_data); + + msg.addr = dev_addr; + msg.flags |= I2C_M_RD; + msg.len = len; + msg.buf = data_buf; + ctl_data.nmsgs = 1; + ctl_data.msgs = &msg; + + tmp_ret = ioctl(device_fd, I2C_RDWR, &ctl_data); + + usleep(10 * 1000); + + if (device_fd >= 0) { + close(device_fd); + device_fd = -1; + } + return tmp_ret; +} + +int SetFileAttrValue(const char *fp, const char value[]) +{ + int fd = -1, ret = -1; + + pthread_mutex_lock(&file_attr_control_flag_mutex); + + fd = open(fp, O_RDWR); + + if (fd < 0) { + LOGE("open %s ERROR(%s)!!\n", fp, strerror(errno)); + pthread_mutex_unlock(&file_attr_control_flag_mutex); + return -1; + } + + ret = write(fd, value, strlen(value)); + close(fd); + + pthread_mutex_unlock(&file_attr_control_flag_mutex); + return ret; +} + +int GetFileAttrIntValue(const char *fp) +{ + int fd = -1, ret = -1; + int temp = -1; + char temp_str[32]; + + memset(temp_str, 0, 32); + + fd = open(fp, O_RDWR); + + if (fd <= 0) { + LOGE("open %s ERROR(%s)!!\n", fp, strerror(errno)); + return -1; + } + + if (read(fd, temp_str, sizeof(temp_str)) > 0) { + if (sscanf(temp_str, "%d", &temp) >= 0) { + LOGD("%s -> get %s value =%d!\n", "TV", fp, temp); + close(fd); + return temp; + } else { + LOGE("%s -> get %s value error(%s)\n", "TV", fp, strerror(errno)); + close(fd); + return -1; + } + } + + close(fd); + return -1; +} + +int *GetFileAttrIntValueStr(const char *fp) +{ + int fd = -1, ret = -1; + static int temp[4]; + char temp_str[32]; + int i = 0; + char *p = NULL; + + memset(temp_str, 0, 32); + + fd = open(fp, O_RDWR); + + if (fd <= 0) { + LOGE("open %s ERROR(%s)!!\n", fp, strerror(errno)); + return NULL; + } + + if (read(fd, temp_str, sizeof(temp_str)) > 0) { + LOGD("%s,temp_str = %s\n", "TV", temp_str); + p = strtok(temp_str, " "); + while (p != NULL) { + sscanf(p, "%d", &temp[i]); + p = strtok(NULL, " "); + i = i + 1; + } + close(fd); + return temp; + } + + close(fd); + return NULL; +} + +int Get_Fixed_NonStandard(void) +{ + return GetFileAttrIntValue("/sys/module/tvin_afe/parameters/force_nostd"); +} + +//0-turn off +//1-force non-standard +//2-force normal +int Set_Fixed_NonStandard(int value) +{ + int fd = -1, ret = -1; + char set_vale[32]; + memset(set_vale, '\0', 32); + + sprintf(set_vale, "%d", value); + + fd = open("/sys/module/tvin_afe/parameters/force_nostd", O_RDWR); + + if (fd >= 0) { + ret = write(fd, set_vale, strlen(set_vale)); + } + + if (ret <= 0) { + LOGE("%s -> set /sys/module/tvin_afe/parameters/force_nostd error(%s)!\n", "TV", strerror(errno)); + } + + close(fd); + + return ret; +} + +static void *UserPet_TreadRun(void *data) +{ + while (is_turnon_user_pet_thread == true) { + if (is_user_pet_thread_start == true) { + usleep(1000 * 1000); + if (++user_counter == 0xffffffff) + user_counter = 1; + TvMisc_SetUserCounter(user_counter); + } else { + usleep(10000 * 1000); + } + } + if (user_pet_terminal == 1) { + user_counter = 0; + } else { + user_counter = 1; + } + TvMisc_SetUserCounter(user_counter); + return ((void *) 0); +} + +static int UserPet_CreateThread(void) +{ + int ret = 0; + pthread_attr_t attr; + struct sched_param param; + + is_turnon_user_pet_thread = true; + is_user_pet_thread_start = true; + + pthread_attr_init(&attr); + pthread_attr_setschedpolicy(&attr, SCHED_RR); + param.sched_priority = 1; + pthread_attr_setschedparam(&attr, ¶m); + ret = pthread_create(&UserPet_ThreadId, &attr, &UserPet_TreadRun, NULL); + pthread_attr_destroy(&attr); + return ret; +} + +static void UserPet_KillThread(void) +{ + int i = 0, dly = 600; + is_turnon_user_pet_thread = false; + is_user_pet_thread_start = false; + for (i = 0; i < 2; i++) { + usleep(dly * 1000); + } + pthread_join(UserPet_ThreadId, NULL); + UserPet_ThreadId = 0; + LOGD("%s, done.", "TV"); +} + +void TvMisc_EnableWDT(bool kernelpet_disable, unsigned int userpet_enable, unsigned int kernelpet_timeout, unsigned int userpet_timeout, unsigned int userpet_reset) +{ + TvMisc_SetSystemPetCounterTimeOut(kernelpet_timeout); + TvMisc_SetSystemPetEnable(1); + if (kernelpet_disable) { + TvMisc_SetSystemPetResetEnable(0); + } else { + TvMisc_SetSystemPetResetEnable(1); + } + if (userpet_enable) { + TvMisc_SetUserCounterTimeOut(userpet_timeout); + TvMisc_SetUserPetResetEnable(userpet_reset); + UserPet_CreateThread(); + } else { + TvMisc_SetUserCounter(0); + TvMisc_SetUserPetResetEnable(0); + } +} + +void TvMisc_DisableWDT(unsigned int userpet_enable) +{ + if (userpet_enable) { + user_pet_terminal = 0; + UserPet_KillThread(); + } +} + +static int get_hardware_info(char *hardware, unsigned int *revision) +{ + char data[1024]; + int fd, n; + char *x, *hw, *rev; + + fd = open("/proc/cpuinfo", O_RDONLY); + if (fd < 0) { + return -1; + } + + n = read(fd, data, 1023); + close(fd); + if (n < 0) { + return -1; + } + + data[n] = 0; + + if (hardware != NULL) { + hw = strstr(data, "\nHardware"); + + if (hw) { + x = strstr(hw, ": "); + if (x) { + x += 2; + n = 0; + while (*x && *x != '\n' && !isspace(*x)) { + hardware[n++] = tolower(*x); + x++; + if (n == 31) { + break; + } + } + + hardware[n] = 0; + } + } + } + + if (revision != NULL) { + rev = strstr(data, "\nRevision"); + + if (rev) { + x = strstr(rev, ": "); + if (x) { + *revision = strtoul(x + 2, 0, 16); + } + } + } + + return 0; +} + +int get_hardware_name(char *hardware) +{ + int tmp_ret = 0; + + if (hardware == NULL) { + return -1; + } + + tmp_ret = get_hardware_info(hardware, NULL); + if (tmp_ret < 0) { + hardware[0] = '\0'; + } + + return 0; +} + +/*---------------delete dir---------------*/ +int TvMisc_DeleteDirFiles(const char *strPath, int flag) +{ + int status; + char tmp[256]; + switch (flag) { + case 0: + sprintf(tmp, "rm -f %s", strPath); + LOGE("%s", tmp); + system(tmp); + break; + case 1: + sprintf(tmp, "cd %s", strPath); + LOGE("%s", tmp); + status = system(tmp); + if (status > 0 || status < 0) + return -1; + sprintf(tmp, "cd %s;rm -rf *", strPath); + system(tmp); + LOGE("%s", tmp); + break; + case 2: + sprintf(tmp, "rm -rf %s", strPath); + LOGE("%s", tmp); + system(tmp); + break; + } + return 0; +} +/*---------------delete dir end-----------*/ + +#ifndef NELEM +# define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0]))) +#endif + + +int Tv_Utils_CheckFs(void) +{ + FILE *f; + char mount_dev[256]; + char mount_dir[256]; + char mount_type[256]; + char mount_opts[256]; + int mount_freq; + int mount_passno; + int match; + int found_ro_fs = 0; + int data_status = 0; + int cache_status = 0; + int atv_status = 0; + int dtv_status = 0; + int param_status = 0; + int cool_reboot = 0; + int recovery_reboot = 0; + + f = fopen("/proc/mounts", "r"); + if (! f) { + /* If we can't read /proc/mounts, just give up */ + return 1; + } + + do { + match = fscanf(f, "%255s %255s %255s %255s %d %d\n", + mount_dev, mount_dir, mount_type, + mount_opts, &mount_freq, &mount_passno); + mount_dev[255] = 0; + mount_dir[255] = 0; + mount_type[255] = 0; + mount_opts[255] = 0; + if ((match == 6) && (!strncmp(mount_dev, "/dev/block", 10))) { + LOGD("%s, %s %s %s %s %d %d!", "TV", mount_dev, mount_dir, mount_type, mount_opts, mount_freq, mount_passno); + if (!strncmp(mount_dir, "/param", 6)) { + param_status |= 0x01; + } else if (!strncmp(mount_dir, "/atv", 4)) { + atv_status |= 0x01; + } else if (!strncmp(mount_dir, "/dtv", 4)) { + dtv_status |= 0x01; + } else if (!strncmp(mount_dir, "/data", 5)) { + data_status |= 0x01; + } else if (!strncmp(mount_dir, "/cache", 6)) { + cache_status |= 0x01; + } + if (strstr(mount_opts, "ro")) { + found_ro_fs += 1; + if (!strncmp(mount_dir, "/param", 6)) { + param_status |= 0x02; + } else if (!strncmp(mount_dir, "/atv", 4)) { + atv_status |= 0x02; + } else if (!strncmp(mount_dir, "/dtv", 4)) { + dtv_status |= 0x02; + } else if (!strncmp(mount_dir, "/data", 5)) { + data_status |= 0x02; + } else if (!strncmp(mount_dir, "/cache", 6)) { + cache_status |= 0x02; + } + } + } + } while (match != EOF); + + fclose(f); + + switch (param_status) { + case 0x03: + LOGW("%s, param partition is read-only!", "TV"); + break; + case 0x00: + LOGW("%s, param partition can not be mounted!", "TV"); + break; + default: + break; + } + switch (atv_status) { + case 0x03: + LOGW("%s, atv partition is read-only!", "TV"); + cool_reboot = 1; + //android_reboot(ANDROID_RB_RESTART2, 0, "cool_reboot"); + break; + case 0x00: + LOGW("%s, atv partition can not be mounted!", "TV"); + recovery_reboot = 1; + //android_reboot(ANDROID_RB_RESTART2, 0, "recovery"); + default: + break; + } + switch (dtv_status) { + case 0x03: + LOGW("%s, dtv partition is read-only!", "TV"); + //android_reboot(ANDROID_RB_RESTART2, 0, "cool_reboot"); + break; + case 0x00: + LOGW("%s, dtv partition can not be mounted!", "TV"); + //android_reboot(ANDROID_RB_RESTART2, 0, "recovery"); + default: + break; + } + switch (data_status) { + case 0x03: + LOGW("%s, data partition is read-only!", "TV"); + cool_reboot = 1; + //android_reboot(ANDROID_RB_RESTART2, 0, "cool_reboot"); + break; + case 0x00: + LOGW("%s, data partition can not be mounted!", "TV"); + recovery_reboot = 1; + //android_reboot(ANDROID_RB_RESTART2, 0, "recovery"); + break; + default: + break; + } + switch (cache_status) { + case 0x03: + LOGW("%s, cache partition is read-only!", "TV"); + cool_reboot = 1; + //android_reboot(ANDROID_RB_RESTART2, 0, "cool_reboot"); + break; + case 0x00: + LOGW("%s, cache partition can not be mounted!", "TV"); + recovery_reboot = 1; + //android_reboot(ANDROID_RB_RESTART2, 0, "recovery"); + break; + default: + break; + } + if (cool_reboot == 1) { + android_reboot(ANDROID_RB_RESTART2, 0, "cool_reboot"); + } + if (recovery_reboot == 1) { + android_reboot(ANDROID_RB_RESTART2, 0, "recovery"); + } + return found_ro_fs; +} + + +int Tv_Utils_SetFileAttrStr(const char *file_path, char val_str_buf[]) +{ + FILE *tmpfp = NULL; + + tmpfp = fopen(file_path, "w"); + if (tmpfp == NULL) { + LOGE("%s, write open file %s error(%s)!!!\n", "TV", file_path, strerror(errno)); + return -1; + } + + fputs(val_str_buf, tmpfp); + + fclose(tmpfp); + tmpfp = NULL; + + return 0; +} + +int Tv_Utils_GetFileAttrStr(const char *file_path, int buf_size, char val_str_buf[]) +{ + FILE *tmpfp = NULL; + + tmpfp = fopen(file_path, "r"); + if (tmpfp == NULL) { + LOGE("%s, read open file %s error(%s)!!!\n", "TV", file_path, strerror(errno)); + val_str_buf[0] = '\0'; + return -1; + } + + fgets(val_str_buf, buf_size, tmpfp); + + fclose(tmpfp); + tmpfp = NULL; + + return 0; +} + + +int Tv_Utils_IsFileExist(const char *file_name) +{ + struct stat tmp_st; + + return stat(file_name, &tmp_st); +} + +#define CC_EDID_SIZE (256) +#define CS_VGA_EDID_BUF_DATA_CFG_NAME "ssm.vga.edidbuf.data" +/* +static unsigned char customer_edid_buf[CC_EDID_SIZE + 4]; + +static unsigned char mDefHDMIEdidBuf[CC_EDID_SIZE] = { + //256 bytes + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x4d, 0x79, 0x02, 0x2c, 0x01, 0x01, 0x01, 0x01, //0x00~0x0F + 0x01, 0x15, 0x01, 0x03, 0x80, 0x85, 0x4b, 0x78, 0x0a, 0x0d, 0xc9, 0xa0, 0x57, 0x47, 0x98, 0x27, //0x10~0x1F + 0x12, 0x48, 0x4c, 0x21, 0x08, 0x00, 0x81, 0x80, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, //0x20~0x2F + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x3a, 0x80, 0x18, 0x71, 0x38, 0x2d, 0x40, 0x58, 0x2c, //0x30~0x3F + 0x45, 0x00, 0x30, 0xeb, 0x52, 0x00, 0x00, 0x1e, 0x01, 0x1d, 0x00, 0x72, 0x51, 0xd0, 0x1e, 0x20, //0x40~0x4F + 0x6e, 0x28, 0x55, 0x00, 0x30, 0xeb, 0x52, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x53, //0x50~0x5F + 0x6b, 0x79, 0x77, 0x6f, 0x72, 0x74, 0x68, 0x20, 0x54, 0x56, 0x0a, 0x20, 0x00, 0x00, 0x00, 0xfd, //0x60~0x6F + 0x00, 0x30, 0x3e, 0x0e, 0x46, 0x0f, 0x00, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x01, 0x3e, //0x70~0x7F + 0x02, 0x03, 0x38, 0xf0, 0x53, 0x1f, 0x10, 0x14, 0x05, 0x13, 0x04, 0x20, 0x22, 0x3c, 0x3e, 0x12, //0x80~0x8F + 0x16, 0x03, 0x07, 0x11, 0x15, 0x02, 0x06, 0x01, 0x23, 0x09, 0x07, 0x01, 0x83, 0x01, 0x00, 0x00, //0x90~0x9F + 0x78, 0x03, 0x0c, 0x00, 0x10, 0x00, 0x88, 0x3c, 0x2f, 0xd0, 0x8a, 0x01, 0x02, 0x03, 0x04, 0x01, //0xA0~0xAF + 0x40, 0x00, 0x7f, 0x20, 0x30, 0x70, 0x80, 0x90, 0x76, 0xe2, 0x00, 0xfb, 0x02, 0x3a, 0x80, 0xd0, //0xB0~0xBF + 0x72, 0x38, 0x2d, 0x40, 0x10, 0x2c, 0x45, 0x80, 0x30, 0xeb, 0x52, 0x00, 0x00, 0x1e, 0x01, 0x1d, //0xC0~0xCF + 0x00, 0xbc, 0x52, 0xd0, 0x1e, 0x20, 0xb8, 0x28, 0x55, 0x40, 0x30, 0xeb, 0x52, 0x00, 0x00, 0x1e, //0xD0~0xDF + 0x01, 0x1d, 0x80, 0xd0, 0x72, 0x1c, 0x16, 0x20, 0x10, 0x2c, 0x25, 0x80, 0x30, 0xeb, 0x52, 0x00, //0xE0~0xEF + 0x00, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf4, //0xF0~0xFF +}; +*/ +static unsigned char mVGAEdidDataBuf[CC_EDID_SIZE]; +void monitor_info_set_date ( unsigned char *edidbuf ) +{ + char prop_value[PROPERTY_VALUE_MAX]; + char tmp[4]; + struct tm *p; + int week = 0; + + memset ( prop_value, '\0', PROPERTY_VALUE_MAX ); + + property_get ( "ro.build.date.utc", prop_value, "VERSION_ERROR" ); + + time_t timep = atoi ( prop_value ); + + p = localtime ( &timep ); + + mktime ( p ); + + strftime ( prop_value, PROPERTY_VALUE_MAX, "%W.", p ); + + week = atoi ( prop_value ); + + edidbuf[16] = week; + edidbuf[17] = ( 1900 + p->tm_year ) - 1990; + + LOGD ( "###############%s##############", "TV" ); + LOGD ( "Week number is %d", week ); + LOGD ( "%d %02d %02d", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday ); + LOGD ( "###############%s##############", "TV" ); +} + + +void monitor_info_set_imagesize ( unsigned char *edidbuf ) +{ + //panel size info for edid: + //39' : max_horizontal = 86; max_vertical = 48; + //42' : max_horizontal = 93; max_vertical = 52; + //47' : max_horizontal = 104; max_vertical = 60; + //50' : max_horizontal = 110; max_vertical = 62; + //55' : max_horizontal = 121; max_vertical = 71; + int max_horizontal = 104; //47' + int max_vertical = 60; //47' + + edidbuf[21] = max_horizontal; + edidbuf[22] = max_vertical; + + LOGD ( "imagesize max_horizontal %d max_vertical %d", max_horizontal, max_vertical ); +} + + + +void monitor_info_name_init ( unsigned char *edidbuf ) +{ + int i = 0; + + for ( i = 90; i < 108; i++ ) { + edidbuf[i] = 0; + } + + edidbuf[93] = 252; +} + +void monitor_info_set_name ( unsigned char *edidbuf ) +{ + int i = 0; + int config_value_len; + const char *config_value; + unsigned char str_manufacturer_name[14]; + config_value = config_get_str ( "TV", "tvin.hdmiedid.name", "null" ); + + if ( strcmp ( config_value, "null" ) != 0 ) { + config_value_len = strlen ( config_value ); + + if ( config_value_len < 13 ) { + for ( i = 0; i < config_value_len; ++i ) { + str_manufacturer_name[i] = config_value[i]; + } + + for ( i = config_value_len; i < 13; ++i ) { + str_manufacturer_name[i] = ' '; + } + } else { + for ( i = 0; i < 13; ++i ) { + str_manufacturer_name[i] = config_value[i]; + } + } + + } + + for ( i = 0; i < 13; i++ ) { + edidbuf[95 + i] = str_manufacturer_name[i]; + } +} + +void monitor_info_edid_checksum ( unsigned char *edidbuf ) +{ + int sum = 0, i = 0; + + for ( i = 0; i < 127; i++ ) { + sum += edidbuf[i]; + } + + sum = ( 256 - ( sum % 256 ) ) % 256; + edidbuf[127] = sum; + + LOGD ( "checksum is 0x%x,so testBuf[127] = 0x%x", sum, edidbuf[127] ); +} + +int reboot_sys_by_fbc_edid_info() +{ + int ret = -1; + int fd = -1; + int edid_info_len = 256; + unsigned char fbc_edid_info[edid_info_len]; + int env_different_as_cur = 0; + char outputmode_prop_value[256]; + char lcd_reverse_prop_value[256]; + + LOGD("get edid info from fbc!"); + memset(outputmode_prop_value, '\0', 256); + memset(lcd_reverse_prop_value, '\0', 256); + property_get("ubootenv.var.outputmode", outputmode_prop_value, "null" ); + property_get("ubootenv.var.lcd_reverse", lcd_reverse_prop_value, "null" ); + + fd = open("/sys/class/amhdmitx/amhdmitx0/edid_info", O_RDWR); + if (fd < 0) { + LOGW("open edid node error\n"); + return -1; + } + ret = read(fd, fbc_edid_info, edid_info_len); + if (ret < 0) { + LOGW("read edid node error\n"); + return -1; + } + + if ((0xfb == fbc_edid_info[250]) && (0x0c == fbc_edid_info[251])) { + LOGD("RX is FBC!"); + // set outputmode env + ret = 0;//is Fbc + switch (fbc_edid_info[252] & 0x0f) { + case 0x0: + if (0 != strcmp(outputmode_prop_value, "1080p")) { + if (0 == env_different_as_cur) { + env_different_as_cur = 1; + } + property_set("ubootenv.var.outputmode", "1080p"); + } + break; + case 0x1: + if (0 != strcmp(outputmode_prop_value, "4k2k60hz420")) { + if (0 == env_different_as_cur) { + env_different_as_cur = 1; + } + property_set("ubootenv.var.outputmode", "4k2k60hz420"); + } + break; + case 0x2: + if (0 != strcmp(outputmode_prop_value, "1366*768")) { + if (0 == env_different_as_cur) { + env_different_as_cur = 1; + } + property_set("ubootenv.var.outputmode", "1366*768"); + } + break; + default: + break; + } + + // set RX 3D Info + //switch((fbc_edid_info[252]>>4)&0x0f) + + // set lcd_reverse env + switch (fbc_edid_info[253]) { + case 0x0: + if (0 != strcmp(lcd_reverse_prop_value, "0")) { + if (0 == env_different_as_cur) { + env_different_as_cur = 1; + } + property_set("ubootenv.var.lcd_reverse", "0"); + } + break; + case 0x1: + if (0 != strcmp(lcd_reverse_prop_value, "1")) { + if (0 == env_different_as_cur) { + env_different_as_cur = 1; + } + property_set("ubootenv.var.lcd_reverse", "1"); + } + break; + default: + break; + } + } + close(fd); + fd = -1; + //ret = -1; + if (1 == env_different_as_cur) { + LOGW("env change , reboot system\n"); + system("reboot"); + } + return ret; +} + +int reboot_sys_by_fbc_uart_panel_info() +{ + int ret = -1; + char outputmode_prop_value[256]; + char lcd_reverse_prop_value[256]; + CFbcCommunication *fbc = GetSingletonFBC(); + int env_different_as_cur = 0; + int panel_reverse = -1; + int panel_outputmode = -1; + + + char panel_model[64] = {0}; + + if (fbc == NULL) { + LOGE("there is no fbc!!!\n"); + return -1; + } + + fbc->cfbc_Get_FBC_Get_PANel_INFO(COMM_DEV_SERIAL, panel_model); + if (0 == panel_model[0]) { + LOGD("device is not fbc\n"); + return -1; + } + LOGD("device is fbc, get panel info from fbc!\n"); + memset(outputmode_prop_value, '\0', 256); + memset(lcd_reverse_prop_value, '\0', 256); + property_get("ubootenv.var.outputmode", outputmode_prop_value, "null" ); + property_get("ubootenv.var.lcd_reverse", lcd_reverse_prop_value, "null" ); + + fbc->cfbc_Get_FBC_PANEL_REVERSE(COMM_DEV_SERIAL, &panel_reverse); + fbc->cfbc_Get_FBC_PANEL_OUTPUT(COMM_DEV_SERIAL, &panel_outputmode); + LOGD("panel_reverse = %d, panel_outputmode = %d\n", panel_reverse, panel_outputmode); + LOGD("panel_output prop = %s, panel reverse prop = %s\n", outputmode_prop_value, lcd_reverse_prop_value); + switch (panel_outputmode) { + case 0x0: + if (0 != strcmp(outputmode_prop_value, "1080p")) { + LOGD("panel_output changed to 1080p\n"); + if (0 == env_different_as_cur) { + env_different_as_cur = 1; + } + property_set("ubootenv.var.outputmode", "1080p"); + } + break; + case 0x1: + if (0 != strcmp(outputmode_prop_value, "4k2k60hz420")) { + if (0 == env_different_as_cur) { + env_different_as_cur = 1; + } + property_set("ubootenv.var.outputmode", "4k2k60hz420"); + } + break; + case 0x2: + if (0 != strcmp(outputmode_prop_value, "1366*768")) { + if (0 == env_different_as_cur) { + env_different_as_cur = 1; + } + property_set("ubootenv.var.outputmode", "1366*768"); + } + break; + default: + break; + } + + // set RX 3D Info + //switch((fbc_edid_info[252]>>4)&0x0f) + + // set lcd_reverse env + switch (panel_reverse) { + case 0x0: + if (0 != strcmp(lcd_reverse_prop_value, "0")) { + LOGD("panel_reverse changed to 0\n"); + if (0 == env_different_as_cur) { + env_different_as_cur = 1; + } + property_set("ubootenv.var.lcd_reverse", "0"); + } + break; + case 0x1: + if (0 != strcmp(lcd_reverse_prop_value, "1")) { + if (0 == env_different_as_cur) { + env_different_as_cur = 1; + } + property_set("ubootenv.var.lcd_reverse", "1"); + } + break; + default: + break; + } + + ret = -1; + if (1 == env_different_as_cur) { + LOGW("env change , reboot system\n"); + system("reboot"); + } + return 0; +} + +static pid_t pidof(const char *name) +{ + DIR *dir; + struct dirent *ent; + char *endptr; + char tmp_buf[512]; + + if (!(dir = opendir("/proc"))) { + LOGE("%s, can't open /proc", __FUNCTION__, strerror(errno)); + return -1; + } + + while ((ent = readdir(dir)) != NULL) { + /* if endptr is not a null character, the directory is not + * entirely numeric, so ignore it */ + long lpid = strtol(ent->d_name, &endptr, 10); + if (*endptr != '\0') { + continue; + } + + /* try to open the cmdline file */ + snprintf(tmp_buf, sizeof(tmp_buf), "/proc/%ld/cmdline", lpid); + FILE *fp = fopen(tmp_buf, "r"); + + if (fp) { + if (fgets(tmp_buf, sizeof(tmp_buf), fp) != NULL) { + /* check the first token in the file, the program name */ + char *first = strtok(tmp_buf, " "); + if (!strcmp(first, name)) { + fclose(fp); + closedir(dir); + return (pid_t) lpid; + } + } + fclose(fp); + } + } + + closedir(dir); + return -1; +} + +int GetPlatformHaveFBCFlag() +{ + const char *config_value; + + config_value = config_get_str("TV", "platform.havefbc", "true"); + if (strcmp(config_value, "true") == 0) { + return 1; + } + + return 0; +} + +int GetPlatformHaveDDFlag() +{ + const char *config_value; + + config_value = config_get_str("TV", "platform.havedd", "null"); + if (strcmp(config_value, "true") == 0 || strcmp(config_value, "1") == 0) { + return 1; + } + + return 0; +} + +int GetPlatformProjectInfoSrc() +{ + const char *config_value; + + config_value = config_get_str("TV", "platform.projectinfo.src", "null"); + if (strcmp(config_value, "null") == 0 || strcmp(config_value, "prop") == 0) { + return 0; + } else if (strcmp(config_value, "emmckey") == 0) { + return 1; + } else if (strcmp(config_value, "fbc_ver") == 0) { + return 2; + } + + return 0; +} + +static unsigned int mCrc32Table[256]; + +static void initCrc32Table() +{ + int i, j; + unsigned int Crc; + for (i = 0; i < 256; i++) { + Crc = i; + for (j = 0; j < 8; j++) { + if (Crc & 1) + Crc = (Crc >> 1) ^ 0xEDB88320; + else + Crc >>= 1; + } + mCrc32Table[i] = Crc; + } +} + +unsigned int CalCRC32(unsigned int crc, const unsigned char *ptr, unsigned int buf_len) +{ + static const unsigned int s_crc32[16] = { 0, 0x1db71064, 0x3b6e20c8, 0x26d930ac, 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c, + 0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c + }; + unsigned int crcu32 = crc; + if (buf_len < 0) + return 0; + if (!ptr) return 0; + crcu32 = ~crcu32; + while (buf_len--) { + unsigned char b = *ptr++; + crcu32 = (crcu32 >> 4) ^ s_crc32[(crcu32 & 0xF) ^ (b & 0xF)]; + crcu32 = (crcu32 >> 4) ^ s_crc32[(crcu32 & 0xF) ^ (b >> 4)]; + } + return ~crcu32; +} + +#define CC_HEAD_CHKSUM_LEN (9) +#define CC_VERSION_LEN (5) + +static int check_projectinfo_data_valid(char *data_str, int chksum_head_len, int ver_len) +{ + int tmp_len = 0, tmp_ver = 0; + char *endp = NULL; + unsigned long src_chksum = 0, cal_chksum = 0; + char tmp_buf[129] = { 0 }; + + if (data_str != NULL) { + tmp_len = strlen(data_str); + if (tmp_len > chksum_head_len + ver_len) { + cal_chksum = CalCRC32(0, (unsigned char *)(data_str + chksum_head_len), tmp_len - chksum_head_len); + memcpy(tmp_buf, data_str, chksum_head_len); + tmp_buf[chksum_head_len] = 0; + src_chksum = strtoul(tmp_buf, &endp, 16); + if (cal_chksum == src_chksum) { + memcpy(tmp_buf, data_str + chksum_head_len, ver_len); + if ((tmp_buf[0] == 'v' || tmp_buf[0] == 'V') && isxdigit(tmp_buf[1]) && isxdigit(tmp_buf[2]) && isxdigit(tmp_buf[3])) { + tmp_ver = strtoul(tmp_buf + 1, &endp, 16); + if (tmp_ver <= 0) { + LOGD("%s, project_info data version error!!!\n", __FUNCTION__); + return -1; + } + } else { + LOGD("%s, project_info data version error!!!\n", __FUNCTION__); + return -1; + } + + return tmp_ver; + } else { + LOGD("%s, cal_chksum = %x\n", __FUNCTION__, (unsigned int)cal_chksum); + LOGD("%s, src_chksum = %x\n", __FUNCTION__, (unsigned int)src_chksum); + } + } + + LOGD("%s, project_info data error!!!\n", __FUNCTION__); + return -1; + } + + LOGD("%s, project_info data is NULL!!!\n", __FUNCTION__); + return -1; +} + +static int gFBCPrjInfoRDPass = 0; +static char gFBCPrjInfoBuf[1024] = {0}; + +static int GetProjectInfoOriData(char data_str[]) +{ + int tmp_val = 0; + int src_type = GetPlatformProjectInfoSrc(); + + if (src_type == 0) { + memset(data_str, '\0', sizeof(data_str)); + property_get("ubootenv.var.project_info", data_str, "null"); + if (strcmp(data_str, "null") == 0) { + LOGE("%s, get project info data error!!!\n", __FUNCTION__); + return -1; + } + + return 0; + } else if (src_type == 1) { + return -1; + } else if (src_type == 2) { + int i = 0, tmp_len = 0, tmp_val = 0, item_cnt = 0; + int tmp_rd_fail_flag = 0; + unsigned int cal_chksum = 0; + char sw_version[64]; + char build_time[64]; + char git_version[64]; + char git_branch[64]; + char build_name[64]; + char tmp_buf[512] = {0}; + + CFbcCommunication *fbcIns = GetSingletonFBC(); + if (fbcIns != NULL) { + if (gFBCPrjInfoRDPass == 0) { + memset((void *)gFBCPrjInfoBuf, 0, sizeof(gFBCPrjInfoBuf)); + } + + if (gFBCPrjInfoRDPass == 1) { + strcpy(data_str, gFBCPrjInfoBuf); + LOGD("%s, rd once just return, data_str = %s\n", __FUNCTION__, data_str); + return 0; + } + + if (fbcIns->cfbc_Get_FBC_MAINCODE_Version(COMM_DEV_SERIAL, sw_version, build_time, git_version, git_branch, build_name) == 0) { + if (sw_version[0] == '1' || sw_version[0] == '2') { + strcpy(build_name, "2"); + + strcpy(tmp_buf, "v001,fbc_"); + strcat(tmp_buf, build_name); + strcat(tmp_buf, ",4k2k60hz420,no_rev,"); + strcat(tmp_buf, "HV550QU2-305"); + strcat(tmp_buf, ",8o8w,0,0"); + cal_chksum = CalCRC32(0, (unsigned char *)tmp_buf, strlen(tmp_buf)); + sprintf(data_str, "%08x,%s", cal_chksum, tmp_buf); + LOGD("%s, data_str = %s\n", __FUNCTION__, data_str); + } else { + tmp_val = 0; + if (fbcIns->cfbc_Get_FBC_project_id(COMM_DEV_SERIAL, &tmp_val) == 0) { + sprintf(build_name, "fbc_%d", tmp_val); + } else { + tmp_rd_fail_flag = 1; + strcpy(build_name, "fbc_0"); + LOGD("%s, get project id from fbc error!!!\n", __FUNCTION__); + } + + strcpy(tmp_buf, "v001,"); + strcat(tmp_buf, build_name); + strcat(tmp_buf, ",4k2k60hz420,no_rev,"); + + memset(git_branch, 0, sizeof(git_branch)); + if (fbcIns->cfbc_Get_FBC_Get_PANel_INFO(COMM_DEV_SERIAL, git_branch) == 0) { + strcat(tmp_buf, git_branch); + } else { + tmp_rd_fail_flag = 1; + strcat(tmp_buf, build_name); + LOGD("%s, get panel info from fbc error!!!\n", __FUNCTION__); + } + + strcat(tmp_buf, ",8o8w,0,0"); + cal_chksum = CalCRC32(0, (unsigned char *)tmp_buf, strlen(tmp_buf)); + sprintf(data_str, "%08x,%s", cal_chksum, tmp_buf); + LOGD("%s, data_str = %s\n", __FUNCTION__, data_str); + + if (tmp_rd_fail_flag == 0) { + gFBCPrjInfoRDPass = 1; + strcpy(gFBCPrjInfoBuf, data_str); + } + } + + return 0; + } + + return -1; + } + } + + return -1; +} + +int GetProjectInfo(project_info_t *proj_info_ptr) +{ + int i = 0, tmp_ret = 0, tmp_val = 0, tmp_len = 0; + int item_cnt = 0, handle_prj_info_data_flag = 0; + char *token = NULL; + const char *strDelimit = ","; + char tmp_buf[1024] = { 0 }; + char data_str[1024] = { 0 }; + + if (GetProjectInfoOriData(data_str) < 0) { + return -1; + } + + memset((void *)proj_info_ptr->version, 0, CC_PROJECT_INFO_ITEM_MAX_LEN); + memset((void *)proj_info_ptr->panel_type, 0, CC_PROJECT_INFO_ITEM_MAX_LEN); + memset((void *)proj_info_ptr->panel_outputmode, 0, CC_PROJECT_INFO_ITEM_MAX_LEN); + memset((void *)proj_info_ptr->panel_rev, 0, CC_PROJECT_INFO_ITEM_MAX_LEN); + memset((void *)proj_info_ptr->panel_name, 0, CC_PROJECT_INFO_ITEM_MAX_LEN); + memset((void *)proj_info_ptr->amp_curve_name, 0, CC_PROJECT_INFO_ITEM_MAX_LEN); + + //check project info data is valid + handle_prj_info_data_flag = check_projectinfo_data_valid(data_str, CC_HEAD_CHKSUM_LEN, CC_VERSION_LEN); + + //handle project info data + if (handle_prj_info_data_flag > 0) { + item_cnt = 0; + memset((void *)tmp_buf, 0, sizeof(tmp_buf)); + strncpy(tmp_buf, data_str + CC_HEAD_CHKSUM_LEN, sizeof(tmp_buf) - 1); + if (handle_prj_info_data_flag == 1) { + token = strtok(tmp_buf, strDelimit); + while (token != NULL) { + if (item_cnt == 0) { + strncpy(proj_info_ptr->version, token, CC_PROJECT_INFO_ITEM_MAX_LEN - 1); + } else if (item_cnt == 1) { + strncpy(proj_info_ptr->panel_type, token, CC_PROJECT_INFO_ITEM_MAX_LEN - 1); + } else if (item_cnt == 2) { + strncpy(proj_info_ptr->panel_outputmode, token, CC_PROJECT_INFO_ITEM_MAX_LEN - 1); + } else if (item_cnt == 3) { + strncpy(proj_info_ptr->panel_rev, token, CC_PROJECT_INFO_ITEM_MAX_LEN - 1); + } else if (item_cnt == 4) { + strncpy(proj_info_ptr->panel_name, token, CC_PROJECT_INFO_ITEM_MAX_LEN - 1); + } else if (item_cnt == 5) { + strncpy(proj_info_ptr->amp_curve_name, token, CC_PROJECT_INFO_ITEM_MAX_LEN - 1); + } + + token = strtok(NULL, strDelimit); + item_cnt += 1; + } + } + + return 0; + } + + return -1; +}
\ No newline at end of file diff --git a/tvapi/libtv/tvutils/tvutils.h b/tvapi/libtv/tvutils/tvutils.h new file mode 100644 index 0000000..bea78ea --- a/dev/null +++ b/tvapi/libtv/tvutils/tvutils.h @@ -0,0 +1,119 @@ +#ifndef __TV_MISC_H__ +#define __TV_MISC_H__ + +#define CC_MIN_ADC_CHANNEL_VAL (0) +#define CC_MAX_ADC_CHANNEL_VAL (5) + +#define CC_I2C_BUS_ON (0) +#define CC_I2C_BUS_OFF (1) + +#define CPQDB_DB_SIZE_ID "tv.db.size.id" + +struct erase_info_user { + uint32_t start; + uint32_t length; +}; + +extern int *GetFileAttrIntValueStr(const char *fp); +extern int ReadADCSpecialChannelValue(int adc_channel_num); +extern int Tv_MiscRegs(const char *cmd); + +extern int TvMisc_SetUserCounterTimeOut(int timeout); +extern int TvMisc_SetUserCounter(int count); +extern int TvMisc_SetUserPetResetEnable(int enable); +extern int TvMisc_SetSystemPetResetEnable(int enable); +extern int TvMisc_SetSystemPetEnable(int enable); +extern int TvMisc_SetSystemPetCounter(int count); +extern void TvMisc_EnableWDT(bool kernelpet_disable, unsigned int userpet_enable, unsigned int kernelpet_timeout, unsigned int userpet_timeout, unsigned int userpet_reset); +extern void TvMisc_DisableWDT(unsigned int userpet_enable); +extern int I2C_WriteNbyte(int i2c_no, int dev_addr, int slave_addr, int len, unsigned char data_buf[]); +extern int I2C_ReadNbyte(int i2c_no, int dev_addr, int slave_addr, int len, unsigned char data_buf[]); +extern int GetTvDBDefineSize(); +extern int SetFileAttrValue(const char *fp, const char value[]); +extern int GetFileAttrIntValue(const char *fp); + +extern int Get_Fixed_NonStandard(void); +extern int Set_Fixed_NonStandard(int value); + +extern int get_hardware_name(char *hardware); + +extern int TvMisc_DeleteDirFiles(const char *strPath, int flag); + +extern int cfg_get_one_item(const char *key_str, const char *strDelimit, int item_index, char cfg_str[]); +extern int Tv_Utils_CheckFs(void); +extern int Tv_Utils_SetFileAttrStr(const char *file_path, char val_str_buf[]); +extern int Tv_Utils_GetFileAttrStr(const char *file_path, int buf_size, char val_str_buf[]); +extern int Tv_Utils_IsFileExist(const char *file_name); +extern void monitor_info_name_init ( unsigned char *edidbuf ); +extern void monitor_info_set_name ( unsigned char *edidbuf ); +extern void monitor_info_set_imagesize ( unsigned char *edidbuf ); +extern void monitor_info_edid_checksum ( unsigned char *edidbuf ); +extern int reboot_sys_by_fbc_edid_info(); +extern int reboot_sys_by_fbc_uart_panel_info(); +extern int GetPlatformHaveFBCFlag(); +extern int GetPlatformHaveDDFlag(); + +#define CC_PROJECT_INFO_ITEM_MAX_LEN (64) + +typedef struct project_info_s { + char version[CC_PROJECT_INFO_ITEM_MAX_LEN]; + char panel_type[CC_PROJECT_INFO_ITEM_MAX_LEN]; + char panel_outputmode[CC_PROJECT_INFO_ITEM_MAX_LEN]; + char panel_rev[CC_PROJECT_INFO_ITEM_MAX_LEN]; + char panel_name[CC_PROJECT_INFO_ITEM_MAX_LEN]; + char amp_curve_name[CC_PROJECT_INFO_ITEM_MAX_LEN]; +} project_info_t; + +extern unsigned int CalCRC32(unsigned int crc, const unsigned char *ptr, unsigned int buf_len); +extern int GetProjectInfo(project_info_t *proj_info_ptr); + +//extern void SSMRewriteEdidInfo ( unsigned char *edidbuf ); +//extern int HandleEdid ( int op_type, int op_direct, unsigned char edid_buf[], unsigned char def_buf[] ); +//extern int SSMSetHdmiEdid(); +#define AML_DBG_REGS_IOC_MAGIC 'R' + +typedef struct aml_debug_reg_s { + unsigned int addr; + unsigned int val; + unsigned char mode; +} aml_debug_reg_t; + +typedef struct aml_debug_bit_s { + unsigned int addr; + unsigned int val; + unsigned int start; + unsigned int len; +} aml_debug_bit_t; + +/*ioctl for reg*/ +#define AMLDBG_IOC_CBUS_REG_RD _IOR(AML_DBG_REGS_IOC_MAGIC, 0x01, struct aml_debug_reg_s) +#define AMLDBG_IOC_CBUS_REG_WR _IOW(AML_DBG_REGS_IOC_MAGIC, 0x02, struct aml_debug_reg_s) +#define AMLDBG_IOC_APB_REG_RD _IOR(AML_DBG_REGS_IOC_MAGIC, 0x03, struct aml_debug_reg_s) +#define AMLDBG_IOC_APB_REG_WR _IOW(AML_DBG_REGS_IOC_MAGIC, 0x04, struct aml_debug_reg_s) +#define AMLDBG_IOC_AXI_REG_RD _IOR(AML_DBG_REGS_IOC_MAGIC, 0x05, struct aml_debug_reg_s) +#define AMLDBG_IOC_AXI_REG_WR _IOW(AML_DBG_REGS_IOC_MAGIC, 0x06, struct aml_debug_reg_s) +#define AMLDBG_IOC_AHB_REG_RD _IOR(AML_DBG_REGS_IOC_MAGIC, 0x07, struct aml_debug_reg_s) +#define AMLDBG_IOC_AHB_REG_WR _IOW(AML_DBG_REGS_IOC_MAGIC, 0x08, struct aml_debug_reg_s) +#define AMLDBG_IOC_MPEG_REG_RD _IOR(AML_DBG_REGS_IOC_MAGIC, 0x09, struct aml_debug_reg_s) +#define AMLDBG_IOC_MPEG_REG_WR _IOW(AML_DBG_REGS_IOC_MAGIC, 0x0a, struct aml_debug_reg_s) + +/*ioctl for bit*/ +#define AMLDBG_IOC_CBUS_BIT_RD _IOR(AML_DBG_REGS_IOC_MAGIC, 0x21, aml_debug_bit_t) +#define AMLDBG_IOC_CBUS_BIT_WR _IOW(AML_DBG_REGS_IOC_MAGIC, 0x22, aml_debug_bit_t) +#define AMLDBG_IOC_APB_BIT_RD _IOR(AML_DBG_REGS_IOC_MAGIC, 0x23, aml_debug_bit_t) +#define AMLDBG_IOC_APB_BIT_WR _IOW(AML_DBG_REGS_IOC_MAGIC, 0x24, aml_debug_bit_t) +#define AMLDBG_IOC_AXI_BIT_RD _IOR(AML_DBG_REGS_IOC_MAGIC, 0x25, aml_debug_bit_t) +#define AMLDBG_IOC_AXI_BIT_WR _IOW(AML_DBG_REGS_IOC_MAGIC, 0x26, aml_debug_bit_t) +#define AMLDBG_IOC_AHB_BIT_RD _IOR(AML_DBG_REGS_IOC_MAGIC, 0x27, aml_debug_bit_t) +#define AMLDBG_IOC_AHB_BIT_WR _IOW(AML_DBG_REGS_IOC_MAGIC, 0x28, aml_debug_bit_t) +#define AMLDBG_IOC_MPEG_BIT_RD _IOR(AML_DBG_REGS_IOC_MAGIC, 0x29, aml_debug_bit_t) +#define AMLDBG_IOC_MPEG_BIT_WR _IOW(AML_DBG_REGS_IOC_MAGIC, 0x30, aml_debug_bit_t) + +/*ioctl for gamma*/ +#define AMLDBG_IOC_SGR_WR _IOW(AML_DBG_REGS_IOC_MAGIC, 0X15, int) +#define AMLDBG_IOC_SGG_WR _IOW(AML_DBG_REGS_IOC_MAGIC, 0X16, int) +#define AMLDBG_IOC_SGB_WR _IOW(AML_DBG_REGS_IOC_MAGIC, 0X17, int) + +#define AMLDBG_IOC_AAPB_REG_RD _IOR(AML_DBG_REGS_IOC_MAGIC, 0x18, struct aml_debug_reg_s) +#define AMLDBG_IOC_AAPB_REG_WR _IOW(AML_DBG_REGS_IOC_MAGIC, 0x19, struct aml_debug_reg_s) +#endif //__TV_MISC_H__ diff --git a/tvapi/libtv/tvutils/zepoll.cpp b/tvapi/libtv/tvutils/zepoll.cpp new file mode 100644 index 0000000..9f03568 --- a/dev/null +++ b/tvapi/libtv/tvutils/zepoll.cpp @@ -0,0 +1,88 @@ +#include "zepoll.h" + + +Epoll::Epoll(int _max, int maxevents): max(_max), + epoll_fd(-1), + epoll_timeout(0), + epoll_maxevents(maxevents), + backEvents(0) +{ + +} + +Epoll::~Epoll() +{ + if (isValid()) { + close(epoll_fd); + } + delete[] backEvents; +} + + +inline +bool Epoll::isValid() const +{ + return epoll_fd > 0; +} + +void Epoll::setTimeout(int timeout) +{ + epoll_timeout = timeout; +} + +inline +void Epoll::setMaxEvents(int maxevents) +{ + epoll_maxevents = maxevents; +} + +inline +const epoll_event *Epoll::events() const +{ + return backEvents; +} + + + +int Epoll::create() +{ + epoll_fd = ::epoll_create(max); + if (isValid()) { + backEvents = new epoll_event[epoll_maxevents]; + } + return epoll_fd; +} + +int Epoll::add(int fd, epoll_event *event) +{ + if (isValid()) { + return ::epoll_ctl(epoll_fd, ADD, fd, event); + } + return -1; + +} + +int Epoll::mod(int fd, epoll_event *event) +{ + if (isValid()) { + return ::epoll_ctl(epoll_fd, MOD, fd, event); + } + return -1; + +} + +int Epoll::del(int fd, epoll_event *event) +{ + if (isValid()) { + return ::epoll_ctl(epoll_fd, DEL, fd, event); + } + return -1; +} + +int Epoll::wait() +{ + if (isValid()) { + return ::epoll_wait(epoll_fd, backEvents, epoll_maxevents, epoll_timeout); + } + return -1; +} diff --git a/tvapi/libtv/tvutils/zepoll.h b/tvapi/libtv/tvutils/zepoll.h new file mode 100644 index 0000000..cf4ebac --- a/dev/null +++ b/tvapi/libtv/tvutils/zepoll.h @@ -0,0 +1,49 @@ + +#ifndef EPOLL_H +#define EPOLL_H + +#include <sys/epoll.h> +#include <unistd.h> + + +/** + * @brief The Epoll class 对epoll的封装 + */ +class Epoll +{ +public: + /** + * + */ + enum EPOLL_OP {ADD = EPOLL_CTL_ADD, MOD = EPOLL_CTL_MOD, DEL = EPOLL_CTL_DEL}; + /** + * 最大的连接数和最大的回传事件数 + */ + Epoll(int _max = 30, int maxevents = 20); + ~Epoll(); + int create(); + int add(int fd, epoll_event *event); + int mod(int fd, epoll_event *event); + int del(int fd, epoll_event *event); + void setTimeout(int timeout); + void setMaxEvents(int maxevents); + int wait(); + const epoll_event *events() const; + const epoll_event &operator[](int index) + { + return backEvents[index]; + } +private: + bool isValid() const; + int max; + int epoll_fd; + int epoll_timeout; + int epoll_maxevents; + epoll_event *backEvents; +}; + + + + +#endif //EPOLL_H + diff --git a/tvapi/libtv/version/version.cpp b/tvapi/libtv/version/version.cpp new file mode 100644 index 0000000..8e8e82a --- a/dev/null +++ b/tvapi/libtv/version/version.cpp @@ -0,0 +1,94 @@ +#include <stdio.h> +#include <string.h> +#include <android/log.h> + +#include "version.h" + +static char gitversionstr[256] = "N/A"; + +static int tvservice_version_info_init(void) +{ + static int info_is_inited = 0; + int dirty_num = 0; + + if (info_is_inited > 0) { + return 0; + } + info_is_inited++; + +#ifdef HAVE_VERSION_INFO + +#ifdef LIBTVSERVICE_GIT_UNCOMMIT_FILE_NUM +#if LIBTVSERVICE_GIT_UNCOMMIT_FILE_NUM>0 + dirty_num = LIBTVSERVICE_GIT_UNCOMMIT_FILE_NUM; +#endif +#endif + +#ifdef LIBTVSERVICE_GIT_VERSION + if (dirty_num > 0) { + snprintf(gitversionstr, 250, "%s-with-%d-dirty-files", LIBTVSERVICE_GIT_VERSION, dirty_num); + } else { + snprintf(gitversionstr, 250, "%s", LIBTVSERVICE_GIT_VERSION); + } +#endif + +#endif + + return 0; +} + +const char *tvservice_get_git_version_info(void) +{ + tvservice_version_info_init(); + return gitversionstr; +} + +const char *tvservice_get_last_chaned_time_info(void) +{ +#ifdef HAVE_VERSION_INFO +#ifdef LIBTVSERVICE_LAST_CHANGED + return LIBTVSERVICE_LAST_CHANGED; +#endif +#endif + return " Unknow "; +} + +const char *tvservice_get_git_branch_info(void) +{ +#ifdef HAVE_VERSION_INFO +#ifdef LIBTVSERVICE_GIT_BRANCH + return LIBTVSERVICE_GIT_BRANCH; +#endif +#endif + return " Unknow "; +} + +const char *tvservice_get_build_time_info(void) +{ +#ifdef HAVE_VERSION_INFO +#ifdef LIBTVSERVICE_BUILD_TIME + return LIBTVSERVICE_BUILD_TIME; +#endif +#endif + return " Unknow "; +} + +const char *tvservice_get_build_name_info(void) +{ +#ifdef HAVE_VERSION_INFO +#ifdef LIBTVSERVICE_BUILD_NAME + return LIBTVSERVICE_BUILD_NAME; +#endif +#endif + return " Unknow "; +} + +const char *tvservice_get_board_version_info(void) +{ +#ifdef HAVE_VERSION_INFO +#ifdef TVAPI_BOARD_VERSION + return TVAPI_BOARD_VERSION; +#endif +#endif + return " Unknow "; +} diff --git a/tvapi/libtv/version/version.h b/tvapi/libtv/version/version.h new file mode 100644 index 0000000..e3259cb --- a/dev/null +++ b/tvapi/libtv/version/version.h @@ -0,0 +1,11 @@ +#ifndef __LIBTVSERVICE_VERSION_H__ +#define __LIBTVSERVICE_VERSION_H__ + +extern const char *tvservice_get_git_version_info(void); +extern const char *tvservice_get_last_chaned_time_info(void); +extern const char *tvservice_get_git_branch_info(void); +extern const char *tvservice_get_build_time_info(void); +extern const char *tvservice_get_build_name_info(void); +extern const char *tvservice_get_board_version_info(void); + +#endif //__LIBTVSERVICE_VERSION_H__ diff --git a/tvapi/libtv/vpp/CPQdb.cpp b/tvapi/libtv/vpp/CPQdb.cpp new file mode 100644 index 0000000..e4a90ec --- a/dev/null +++ b/tvapi/libtv/vpp/CPQdb.cpp @@ -0,0 +1,1535 @@ +/* + * CPQdb.cpp + * + * Created on: 2011-12-13 + * Author: casey + * + * change 2015.04 + * showbo + */ + + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <sys/stat.h> +#include <errno.h> +#include "CPQdb.h" +#include "../tvutils/tvutils.h" +#include "../tvutils/tvutils.h" + +#if (PQ_NO_ANDROID == 0) +#include <android/log.h> + +#define LOG_TAG "CPQdb" +#include "CTvLog.h" +#endif + + +#if (PQ_NO_ANDROID == 1) +using namespace std; +#endif + +//#define CPQDB_DEBUG + +#define BRIGHTNESS_ID 0 +#define CONTRAST_ID 1 +#define SATURATION_ID 1 +#define HUE_ID 0 +#define SHARPNESS_ID 1 + +//static char *str_buf[256]; + +#define ID_FIELD "TableID" +#define NR_LEVEL_NAME "NRLevel" +#define CM_LEVEL_NAME "CMLevel" +#define LEVEL_NAME "Level" +#define ADC_SETTING "ADC_Settings" +#define CVD2_SETTING "CVD2_Settings" +#define PORT "Port" +#define FORMAT "Format" + + +#define CC_LINE_MAX_LEN (1024) + +#define LOG_TAG "CPQdb" +//#define CPQDB_DEBUG + +CPqData::CPqData() +{ + int i = 0, j = 0; + + for (i = 0; i < 15; i++) { + pq_bri_data[i].TotalNode = 0; + pq_bri_data[i].NodeValue = 0; + pq_bri_data[i].IndexValue = 0; + pq_bri_data[i].RegValue = 0; + pq_bri_data[i].step = 0; + + pq_con_data[i].TotalNode = 0; + pq_con_data[i].NodeValue = 0; + pq_con_data[i].IndexValue = 0; + pq_con_data[i].RegValue = 0; + pq_con_data[i].step = 0; + + pq_sat_data[i].TotalNode = 0; + pq_sat_data[i].NodeValue = 0; + pq_sat_data[i].IndexValue = 0; + pq_sat_data[i].RegValue = 0; + pq_sat_data[i].step = 0; + + pq_hue_data[i].TotalNode = 0; + pq_hue_data[i].NodeValue = 0; + pq_hue_data[i].IndexValue = 0; + pq_hue_data[i].RegValue = 0; + pq_hue_data[i].step = 0; + } + + for (i = 0; i < 10; i++) { + pq_sharpness_reg_data[i].length = 0; + for (j = 0; j < 50; j++) { + pq_sharpness_reg_data[i].reg_data[j].TotalNode = 0; + pq_sharpness_reg_data[i].reg_data[j].Value.type = 0; + pq_sharpness_reg_data[i].reg_data[j].Value.addr = 0; + pq_sharpness_reg_data[i].reg_data[j].Value.mask = 0; + pq_sharpness_reg_data[i].reg_data[j].Value.val = 0; + pq_sharpness_reg_data[i].reg_data[j].NodeValue = 0; + pq_sharpness_reg_data[i].reg_data[j].IndexValue = 0; + pq_sharpness_reg_data[i].reg_data[j].step = 0; + } + } +} + +CPqData::~CPqData() +{ +} + +int CPqData::openDB() +{ + int rval; + project_info_t tmp_info; + char *PARAM_PQ = "/param/pq.db"; + char SYSTEM_PQ[128] = {0}; + char tmp_buf[128] = {0}; + + strcpy(SYSTEM_PQ, "/system/etc/pq.db"); + + if (GetProjectInfo(&tmp_info) == 0) { + strcpy(tmp_buf, "/system/etc/"); + strcat(tmp_buf, tmp_info.panel_type); + strcat(tmp_buf, ".db"); + if (access(tmp_buf, 0) == 0) { + strncpy(SYSTEM_PQ, tmp_buf, sizeof(SYSTEM_PQ) - 1); + } + } + + if (access(PARAM_PQ, 0) < 0) { + CFile file(SYSTEM_PQ); + if (file.copyTo(PARAM_PQ) != 0) { + LOGE("%s, copy file \"%s\" to \"%s\" error", __FUNCTION__, SYSTEM_PQ, PARAM_PQ); + return -1; + } else { + LOGD("%s, copy file \"%s\" to \"%s\" ok", __FUNCTION__, SYSTEM_PQ, PARAM_PQ); + } + } + + closeDb(); + rval = openDb(PARAM_PQ); + + char *err; + bool isOk = integrityCheck(); + if (!isOk) { + CFile file ( SYSTEM_PQ ); + if ( file.copyTo ( PARAM_PQ ) != 0 ) { + LOGE ( "%s, copy file = %s , error", __FUNCTION__, SYSTEM_PQ ); + return -1; + } else { + closeDb(); + rval = openDb(PARAM_PQ); + LOGD ( "%s, copy file = %s , ok", __FUNCTION__, SYSTEM_PQ ); + } + } + return rval; +} + +int CPqData::getRegValues(tvin_port_t source, tvin_sig_fmt_t signal, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs) +{ + CSqlite::Cursor c_tablelist, c_reg_list; + int iOutRet = 0; + char sqlmaster[256]; + int mode = is2dOr3d;//Check2Dor3D(status, trans_fmt); + //first get table name + sprintf(sqlmaster, "select TableName from GeneralCommonTable where " + "TVIN_PORT = %d and " + "TVIN_SIG_FMT = %d and " + "TVIN_TRANS_FMT = %d ;", + source, signal, mode); + this->select(sqlmaster, c_tablelist); + int index_am_reg = 0; + if (c_tablelist.moveToFirst()) { //for table list + int index_tablename = c_tablelist.getColumnIndex("TableName"); + do { + sprintf(sqlmaster, "select RegType, RegAddr, RegMask, RegValue from %s;", c_tablelist.getString(index_tablename).string()); + this->select(sqlmaster, c_reg_list); + if (c_reg_list.moveToFirst()) { //reg list for each table + int index_type = 0;//c_reg_list.getColumnIndex("RegType"); + int index_addr = 1;//c_reg_list.getColumnIndex("RegAddr"); + int index_mask = 2;//c_reg_list.getColumnIndex("RegMask"); + int index_val = 3;//c_reg_list.getColumnIndex("RegValue"); + do { + regs->am_reg[index_am_reg].type = c_reg_list.getInt(index_type); + regs->am_reg[index_am_reg].addr = c_reg_list.getInt(index_addr); + regs->am_reg[index_am_reg].mask = c_reg_list.getInt(index_mask); + regs->am_reg[index_am_reg].val = c_reg_list.getInt(index_val); + index_am_reg++; + } while (c_reg_list.moveToNext()); + } + } while (c_tablelist.moveToNext()); + } + // + regs->length = index_am_reg; + LOGD("getRegValues length = %d", regs->length); + return index_am_reg; +} + +int CPqData::getRegValuesByValue(const char *name, const char *f_name, const char *f2_name, const int val, + const int val2, am_regs_t *regs) +{ + CSqlite::Cursor c_reg_list; + char sqlmaster[256]; + int rval = -1; + //first get table name + if ((strlen(f2_name) == 0) && (val2 == 0)) + sprintf(sqlmaster, "select RegType, RegAddr, RegMask, RegValue from %s where %s = %d;", name, f_name, val); + else + sprintf(sqlmaster, "select RegType, RegAddr, RegMask, RegValue from %s where %s = %d and %s = %d;", name, f_name, val, + f2_name, val2); + + rval = this->select(sqlmaster, c_reg_list); + int count = c_reg_list.getCount(); + if (count > 512) { + LOGD("getRegValuesByValue regs is too more, in pq.db count = %d", count); + return -1; + } + int index_am_reg = 0; + if (c_reg_list.moveToFirst()) { //reg list for each table + int index_type = 0;//c_reg_list.getColumnIndex("RegType"); + int index_addr = 1;//c_reg_list.getColumnIndex("RegAddr"); + int index_mask = 2;//c_reg_list.getColumnIndex("RegMask"); + int index_val = 3;//c_reg_list.getColumnIndex("RegValue"); + do { + regs->am_reg[index_am_reg].type = c_reg_list.getInt(index_type); + regs->am_reg[index_am_reg].addr = c_reg_list.getInt(index_addr); + regs->am_reg[index_am_reg].mask = c_reg_list.getInt(index_mask); + regs->am_reg[index_am_reg].val = c_reg_list.getInt(index_val); + index_am_reg++; + } while (c_reg_list.moveToNext()); + } else rval = -1; + // + regs->length = index_am_reg; + LOGD("getRegValuesByValue length = %d", regs->length); + return rval; +} + +int CPqData::getRegValuesByValue_long(const char *name, const char *f_name, const char *f2_name, const int val, const int val2, am_regs_t *regs, am_regs_t *regs_1) +{ + CSqlite::Cursor c_reg_list; + char sqlmaster[256]; + int rval = -1; + //first get table name + if ((strlen(f2_name) == 0) && (val2 == 0)) + sprintf(sqlmaster, "select RegType, RegAddr, RegMask, RegValue from %s where %s = %d;", name, f_name, val); + else + sprintf(sqlmaster, "select RegType, RegAddr, RegMask, RegValue from %s where %s = %d and %s = %d;", name, f_name, val, + f2_name, val2); + + rval = this->select(sqlmaster, c_reg_list); + + int index_am_reg = 0; + int count = c_reg_list.getCount(); + if (count > 1024) { + LOGD("getRegValuesByValue_long regs is too more, in pq.db count = %d", count); + return -1; + } + if (c_reg_list.moveToFirst()) { //reg list for each table + int index_type = 0;//c_reg_list.getColumnIndex("RegType"); + int index_addr = 1;//c_reg_list.getColumnIndex("RegAddr"); + int index_mask = 2;//c_reg_list.getColumnIndex("RegMask"); + int index_val = 3;//c_reg_list.getColumnIndex("RegValue"); + do { + if (index_am_reg < 512) { + regs->am_reg[index_am_reg].type = c_reg_list.getInt(index_type); + regs->am_reg[index_am_reg].addr = c_reg_list.getInt(index_addr); + regs->am_reg[index_am_reg].mask = c_reg_list.getInt(index_mask); + regs->am_reg[index_am_reg].val = c_reg_list.getInt(index_val); + } else if (index_am_reg >= 512 && index_am_reg < 1024) { + regs_1->am_reg[index_am_reg - 512].type = c_reg_list.getInt(index_type); + regs_1->am_reg[index_am_reg - 512].addr = c_reg_list.getInt(index_addr); + regs_1->am_reg[index_am_reg - 512].mask = c_reg_list.getInt(index_mask); + regs_1->am_reg[index_am_reg - 512].val = c_reg_list.getInt(index_val); + } else { + } + index_am_reg++; + } while (c_reg_list.moveToNext()); + } else rval = -1; + // + if (count < 512) { + regs->length = index_am_reg; + } else if (index_am_reg >= 512 && index_am_reg < 1024) { + regs->length = 512; + regs_1->length = index_am_reg - 512; + } + LOGD("getRegValuesByValue length = %d", index_am_reg); + return rval; +} +int CPqData::PQ_GetBaseColorParams(vpp_color_basemode_t basemode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs) +{ + CSqlite::Cursor c; + char sqlmaster[256]; + int mode = is2dOr3d;//Check2Dor3D(status, trans_fmt); + int rval = -1; + sprintf(sqlmaster, "select TableName from GeneralColormanagementTable where " + "TVIN_PORT = %d and " + "TVIN_SIG_FMT = %d and " + "TVIN_TRANS_FMT = %d ;", + source_port, sig_fmt, mode); + + this->select(sqlmaster, c); + + if (c.moveToFirst()) { + int index_TableName = 0;//c.getColumnIndex("TableName"); + rval = getRegValuesByValue(c.getString(index_TableName), CM_LEVEL_NAME, "", (int)basemode, 0, regs); + } + return rval; +} + +int CPqData::PQ_GetCM2Params(vpp_color_management2_t basemode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs) +{ + CSqlite::Cursor c; + char sqlmaster[256]; + int mode = is2dOr3d;//Check2Dor3D(status, trans_fmt); + int rval = -1; + if (source_port >= TVIN_PORT_CVBS0 && source_port <= TVIN_PORT_CVBS7) { + if (source_port != TVIN_PORT_CVBS3) { + source_port = TVIN_PORT_CVBS1; + } + } else if (source_port >= TVIN_PORT_HDMI0 && source_port <= TVIN_PORT_HDMI7) { + source_port = TVIN_PORT_HDMI0; + } else if (source_port > TVIN_PORT_DTV || source_port < TVIN_PORT_NULL) { + source_port = TVIN_PORT_MPEG0; + } + + if (sig_fmt >= TVIN_SIG_FMT_MAX) { + sig_fmt = TVIN_SIG_FMT_NULL; + } + + sprintf(sqlmaster, "select TableName from GeneralCM2Table where " + "TVIN_PORT = %d and " + "TVIN_SIG_FMT = %d and " + "TVIN_TRANS_FMT = %d ;", + source_port, sig_fmt, mode); + + rval = this->select(sqlmaster, c); + + if (c.moveToFirst()) { + int index_TableName = 0;//c.getColumnIndex("TableName"); + rval = getRegValuesByValue(c.getString(index_TableName), CM_LEVEL_NAME, "", (int)basemode, 0, regs); + } + return rval; +} + +int CPqData::PQ_GetNR2Params(vpp_noise_reduction2_mode_t nr_mode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs) +{ + CSqlite::Cursor c; + char sqlmaster[256]; + int mode = is2dOr3d;//Check2Dor3D(status, trans_fmt); + int rval = -1; + + if (source_port >= TVIN_PORT_CVBS0 && source_port <= TVIN_PORT_CVBS7) { + if (source_port != TVIN_PORT_CVBS3) { + source_port = TVIN_PORT_CVBS1; + } + } else if (source_port >= TVIN_PORT_HDMI0 && source_port <= TVIN_PORT_HDMI7) { + source_port = TVIN_PORT_HDMI0; + } else if (source_port > TVIN_PORT_DTV || source_port < TVIN_PORT_NULL) { + source_port = TVIN_PORT_MPEG0; + } + + sprintf(sqlmaster, "select TableName from GeneralNR2Table where " + "TVIN_PORT = %d and " + "TVIN_SIG_FMT = %d and " + "TVIN_TRANS_FMT = %d ;", + source_port, sig_fmt, mode); + + rval = this->select(sqlmaster, c); + + if (c.moveToFirst()) { + int index_TableName = 0;//c.getColumnIndex("TableName"); + rval = getRegValuesByValue(c.getString(index_TableName), LEVEL_NAME, "", (int)nr_mode, 0, regs); + } + return rval; +} + +int CPqData::PQ_GetXVYCCParams(vpp_xvycc_mode_t xvycc_mode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs, am_regs_t *regs_1) +{ + CSqlite::Cursor c; + char sqlmaster[256]; + int mode = is2dOr3d;//Check2Dor3D(status, trans_fmt); + int rval = -1; + + if (source_port >= TVIN_PORT_CVBS0 && source_port <= TVIN_PORT_CVBS7) { + if (source_port != TVIN_PORT_CVBS3) { + source_port = TVIN_PORT_CVBS1; + } + } else if (source_port >= TVIN_PORT_HDMI0 && source_port <= TVIN_PORT_HDMI7) { + source_port = TVIN_PORT_HDMI0; + } else if (source_port > TVIN_PORT_DTV || source_port < TVIN_PORT_NULL) { + source_port = TVIN_PORT_MPEG0; + } + + sprintf(sqlmaster, "select TableName from GeneralXVYCCTable where " + "TVIN_PORT = %d and " + "TVIN_SIG_FMT = %d and " + "TVIN_TRANS_FMT = %d ;", + source_port, sig_fmt, mode); + + rval = this->select(sqlmaster, c); + + if (c.moveToFirst()) { + int index_TableName = 0;//c.getColumnIndex("TableName"); + rval = getRegValuesByValue_long(c.getString(index_TableName), LEVEL_NAME, "", (int)xvycc_mode, 0, regs, regs_1); + } + return rval; +} + +int CPqData::PQ_GetMCDIParams(vpp_mcdi_mode_t mcdi_mode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs) +{ + CSqlite::Cursor c; + char sqlmaster[256]; + int mode = is2dOr3d;//Check2Dor3D(status, trans_fmt); + int rval = -1; + + if (source_port >= TVIN_PORT_CVBS0 && source_port <= TVIN_PORT_CVBS7) { + if (source_port != TVIN_PORT_CVBS3) { + source_port = TVIN_PORT_CVBS1; + } + } else if (source_port >= TVIN_PORT_HDMI0 && source_port <= TVIN_PORT_HDMI7) { + source_port = TVIN_PORT_HDMI0; + } else if (source_port > TVIN_PORT_DTV || source_port < TVIN_PORT_NULL) { + source_port = TVIN_PORT_MPEG0; + } + + sprintf(sqlmaster, "select TableName from GeneralMCDITable where " + "TVIN_PORT = %d and " + "TVIN_SIG_FMT = %d and " + "TVIN_TRANS_FMT = %d ;", + source_port, sig_fmt, mode); + + rval = this->select(sqlmaster, c); + + if (c.moveToFirst()) { + int index_TableName = 0;//c.getColumnIndex("TableName"); + rval = getRegValuesByValue(c.getString(index_TableName), LEVEL_NAME, "", (int)mcdi_mode, 0, regs); + } + return rval; +} + +int CPqData::PQ_GetColorTemperatureParams(vpp_color_temperature_mode_t Tempmode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt, + tcon_rgb_ogo_t *params) +{ + CSqlite::Cursor c; + char sqlmaster[256]; + + int rval = -1; + + //default + params->en = 1; + params->r_pre_offset = 0; + params->g_pre_offset = 0; + params->b_pre_offset = 0; + params->r_gain = 1024; + params->g_gain = 1024; + params->b_gain = 1024; + params->r_post_offset = 0; + params->g_post_offset = 0; + params->b_post_offset = 0; + + sprintf(sqlmaster, "select TableName from GeneralWhiteBalanceTable where " + "TVIN_PORT = %d and " + "TVIN_SIG_FMT = %d and " + "TVIN_TRANS_FMT = %d;", + source_port, sig_fmt, trans_fmt); + + rval = this->select(sqlmaster, c); + + if (c.moveToFirst()) { + int index_TableName = 0;//c.getColumnIndex("TableName"); + sprintf(sqlmaster, "select Enable, R_Pre_Offset, G_Pre_Offset, B_Pre_Offset, R_Gain, G_Gain, B_Gain, R_Post_Offset, G_Post_Offset, B_Post_Offset from %s where " + "Level = %d and def = 0;", c.getString(index_TableName).string(), (int)Tempmode); + + rval = this->select(sqlmaster, c); + + if (c.moveToFirst()) { + params->en = c.getInt(0);//index 0 + params->r_pre_offset = c.getInt(1); + params->g_pre_offset = c.getInt(2); + params->b_pre_offset = c.getInt(3); + params->r_gain = c.getInt(4); + params->g_gain = c.getInt(5); + params->b_gain = c.getInt(6); + params->r_post_offset = c.getInt(7); + params->g_post_offset = c.getInt(8); + params->b_post_offset = c.getInt(9);//index 9 + } + } + return rval; +} +int CPqData::PQ_SetColorTemperatureParams(vpp_color_temperature_mode_t Tempmode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt, + tcon_rgb_ogo_t params) +{ + CSqlite::Cursor c; + char sqlmaster[256]; + char sql[512]; + + int rval = -1; + + sprintf(sqlmaster, "select TableName from GeneralWhiteBalanceTable where " + "TVIN_PORT = %d and " + "TVIN_SIG_FMT = %d and " + "TVIN_TRANS_FMT = %d;", + source_port, sig_fmt, trans_fmt); + + rval = this->select(sqlmaster, c); + + if (c.moveToFirst()) { + int index_TableName = 0;//c.getColumnIndex("TableName"); + sprintf(sql, "update %s set Enable = %d, " + "R_Pre_Offset = %d, G_Pre_Offset = %d, B_Pre_Offset = %d, R_Gain = %d, G_Gain = %d, B_Gain = %d, " + "R_Post_Offset = %d, G_Post_Offset = %d, B_Post_Offset = %d where Level = %d and def = 0;", c.getString(index_TableName).string(), + params.en, params.r_pre_offset, params.g_pre_offset, params.b_pre_offset, params.r_gain, params.g_gain, + params.b_gain, params.r_post_offset, params.g_post_offset, params.b_post_offset, Tempmode); + + rval = this->exeSql(sql); + } + return rval; +} + +int CPqData::PQ_ResetAllColorTemperatureParams(void) +{ + CSqlite::Cursor c; + char sqlmaster[512]; + + int rval = -1; + + sprintf(sqlmaster, "select distinct TableName from GeneralWhiteBalanceTable ;"); + + rval = this->select(sqlmaster, c); + + if (c.moveToFirst()) { + int index_TableName = 0;//c.getColumnIndex("TableName"); + do { //delete + sprintf(sqlmaster, "delete from %s where def = 0;" + "insert into %s( Level , Enable , R_Pre_Offset, G_Pre_Offset, B_Pre_Offset, R_Gain, G_Gain, B_Gain, R_Post_Offset, G_Post_Offset, B_Post_Offset, def ) " + "select Level, Enable, R_Pre_Offset, G_Pre_Offset, B_Pre_Offset, R_Gain, G_Gain, B_Gain, R_Post_Offset, G_Post_Offset, B_Post_Offset, 0 from %s where def = 1;", + c.getString(index_TableName).string(), c.getString(index_TableName).string(), c.getString(index_TableName).string()); + rval = this->exeSql(sqlmaster); + } while (c.moveToNext()); + } + return rval; +} + +int CPqData::PQ_GetDNLPParams(tvin_port_t source_port, tvin_sig_fmt_t fmt, is_3d_type_t is2dOr3d, + tvin_trans_fmt_t trans_fmt, ve_dnlp_t *params, ve_dnlp_table_t *newParams, int *dnlpFlag) +{ + CSqlite::Cursor c; + char sqlmaster[256]; + int mode = is2dOr3d;//Check2Dor3D(status, trans_fmt); + int rval = -1; + //default + params->en = 0; + params->rt = VE_DNLP_RT_0S; + params->rl = VE_DNLP_RL_01; + params->black = VE_DNLP_EXT_00; + params->white = VE_DNLP_EXT_00; + + mode = is2dOr3d;//Check2Dor3D(status, trans_fmt);//(status << 16)|trans_fmt; + + sprintf(sqlmaster, "select TableName from GeneralDNLPTable where " + "TVIN_PORT = %d and " + "TVIN_SIG_FMT = %d and " + "TVIN_TRANS_FMT = %d ;", + source_port, fmt, mode); + + rval = this->select(sqlmaster, c); + + if (c.moveToFirst()) { + int index_TableName = 0;//c.getColumnIndex("TableName"); + sprintf(sqlmaster, "select value from %s ", c.getString(index_TableName).string()); + + rval = this->select(sqlmaster, c); + int count = c.getCount(); + if (count == 1) { + int val; + c.moveToFirst(); + val = c.getInt(0);//index 0 + *dnlpFlag = 0; + params->en = (val & 0xf0000000) >> 28; + params->rt = (ve_dnlp_rt_e)((val & 0x0f000000) >> 24); + params->rl = (ve_dnlp_rl_e)((val & 0x00ff0000) >> 16); + params->black = (ve_dnlp_ext_e)((val & 0x0000ff00) >> 8); + params->white = (ve_dnlp_ext_e)((val & 0x000000ff) >> 0); + } else if (count > 1) { + c.moveToFirst(); + c.moveToNext(); + *dnlpFlag = 1; + newParams->en = c.getInt(0); + c.moveToNext(); + newParams->method = c.getInt(0); + c.moveToNext(); + newParams->cliprate = c.getInt(0); + c.moveToNext(); + newParams->lowrange = c.getInt(0); + c.moveToNext(); + newParams->hghrange = c.getInt(0); + c.moveToNext(); + newParams->lowalpha = c.getInt(0); + c.moveToNext(); + newParams->midalpha = c.getInt(0); + c.moveToNext(); + newParams->hghalpha = c.getInt(0); + } + } + return rval; +} + +int CPqData::PQ_SetNoLineAllBrightnessParams(tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100) +{ + return SetNonlinearMapping(TVPQ_DATA_BRIGHTNESS, source_type, osd0, osd25, osd50, osd75, osd100); +} +int CPqData::PQ_GetNoLineAllBrightnessParams(tv_source_input_type_t source_type, int *osd0, int *osd25, int *osd50, int *osd75, int *osd100) +{ + int osdvalue[5] = {0}; + int rval; + rval = GetNonlinearMappingByOSDFac(TVPQ_DATA_BRIGHTNESS, source_type, osdvalue); + *osd0 = osdvalue[0]; + *osd25 = osdvalue[1]; + *osd50 = osdvalue[2]; + *osd75 = osdvalue[3]; + *osd100 = osdvalue[4]; + if (rval) { + LOGE("PQ_GetNoLineAllBrightnessParams Error %d\n", rval); + } + return rval; + +} + +int CPqData::PQ_GetBrightnessParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int *params) +{ + int val; + + GetNonlinearMapping(TVPQ_DATA_BRIGHTNESS, source_port, level, &val); + *params = CaculateLevelParam(pq_bri_data, bri_nodes, val); + return 0; + +} +int CPqData::PQ_SetBrightnessParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int params) +{ + return 0; +} + +int CPqData::PQ_SetNoLineAllContrastParams(tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100) +{ + return SetNonlinearMapping(TVPQ_DATA_CONTRAST, source_type, osd0, osd25, osd50, osd75, osd100); +} +int CPqData::PQ_GetNoLineAllContrastParams(tv_source_input_type_t source_type, int *osd0, int *osd25, int *osd50, int *osd75, int *osd100) +{ + int osdvalue[5] = {0}; + int rval; + rval = GetNonlinearMappingByOSDFac(TVPQ_DATA_CONTRAST, source_type, osdvalue); + *osd0 = osdvalue[0]; + *osd25 = osdvalue[1]; + *osd50 = osdvalue[2]; + *osd75 = osdvalue[3]; + *osd100 = osdvalue[4]; + if (rval) { + LOGE("PQ_GetNoLineAllContrastParams Error %d\n", rval); + } + return rval; +} + +int CPqData::PQ_GetContrastParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int *params) +{ + int val; + GetNonlinearMapping(TVPQ_DATA_CONTRAST, source_port, level, &val); + *params = CaculateLevelParam(pq_con_data, con_nodes, val); + return 0; +} +int CPqData::PQ_SetContrastParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int params) +{ + return 0; +} + +int CPqData::PQ_SetNoLineAllSaturationParams(tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100) +{ + return SetNonlinearMapping(TVPQ_DATA_SATURATION, source_type, osd0, osd25, osd50, osd75, osd100); +} +int CPqData::PQ_GetNoLineAllSaturationParams(tv_source_input_type_t source_type, int *osd0, int *osd25, int *osd50, int *osd75, int *osd100) +{ + int osdvalue[5] = {0}; + int rval; + rval = GetNonlinearMappingByOSDFac(TVPQ_DATA_SATURATION, source_type, osdvalue); + *osd0 = osdvalue[0]; + *osd25 = osdvalue[1]; + *osd50 = osdvalue[2]; + *osd75 = osdvalue[3]; + *osd100 = osdvalue[4]; + if (rval) { + LOGE("PQ_GetNoLineAllSaturationParams Error %d\n", rval); + } + return rval; +} + +int CPqData::PQ_GetSaturationParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int *params) +{ + int val; + GetNonlinearMapping(TVPQ_DATA_SATURATION, source_port, level, &val); + *params = CaculateLevelParam(pq_sat_data, sat_nodes, val); + return 0; +} +int CPqData::PQ_SetSaturationParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int params) +{ + return 0; +} + +int CPqData::PQ_SetNoLineAllHueParams(tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100) +{ + return SetNonlinearMapping(TVPQ_DATA_HUE, source_type, osd0, osd25, osd50, osd75, osd100); +} +int CPqData::PQ_GetNoLineAllHueParams(tv_source_input_type_t source_type, int *osd0, int *osd25, int *osd50, int *osd75, int *osd100) +{ + int osdvalue[5] = {0}; + int rval; + rval = GetNonlinearMappingByOSDFac(TVPQ_DATA_HUE, source_type, osdvalue); + *osd0 = osdvalue[0]; + *osd25 = osdvalue[1]; + *osd50 = osdvalue[2]; + *osd75 = osdvalue[3]; + *osd100 = osdvalue[4]; + if (rval) { + LOGE("PQ_GetNoLineAllHueParams Error %d\n", rval); + } + return rval; +} + +int CPqData::PQ_GetHueParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int *params) +{ + int val; + GetNonlinearMapping(TVPQ_DATA_HUE, source_port, level, &val); + *params = CaculateLevelParam(pq_hue_data, hue_nodes, val); + return 0; +} +int CPqData::PQ_SetHueParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int params) +{ + return 0; +} + +int CPqData::PQ_SetNoLineAllSharpnessParams(tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100) +{ + return SetNonlinearMapping(TVPQ_DATA_SHARPNESS, source_type, osd0, osd25, osd50, osd75, osd100); +} +int CPqData::PQ_GetNoLineAllSharpnessParams(tv_source_input_type_t source_type, int *osd0, int *osd25, int *osd50, int *osd75, int *osd100) +{ + int osdvalue[5] = {0}; + int rval; + rval = GetNonlinearMappingByOSDFac(TVPQ_DATA_SHARPNESS, source_type, osdvalue); + *osd0 = osdvalue[0]; + *osd25 = osdvalue[1]; + *osd50 = osdvalue[2]; + *osd75 = osdvalue[3]; + *osd100 = osdvalue[4]; + if (rval) { + LOGE("PQ_GetNoLineAllSharpnessParams Error %d\n", rval); + } + return rval; +} + +int CPqData::PQ_GetSharpnessParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, am_regs_t *regs) +{ + int val; + GetNonlinearMapping(TVPQ_DATA_SHARPNESS, source_port, level, &val); + LOGD("val = %d\n", val); + *regs = CaculateLevelRegsParam(pq_sharpness_reg_data, val); + return 0; +} +int CPqData::PQ_GetPLLParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, am_regs_t *regs) +{ + int ret = -1; + int i = 0; + + ret = getRegValuesByValue(ADC_SETTING, PORT, FORMAT, source_port, sig_fmt, regs); +#ifdef CPQDB_DEBUG + if (ret == 0) { + for (i = 0; i < regs->length; i++) { + LOGD("%s, =================================================", "TV"); + LOGD("%s, regData.am_reg[%d].type = %d", "TV", i, regs->am_reg[i].type); + LOGD("%s, regData.am_reg[%d].addr = %d", "TV", i, regs->am_reg[i].addr); + LOGD("%s, regData.am_reg[%d].mask = %d", "TV", i, regs->am_reg[i].mask); + LOGD("%s, regData.am_reg[%d].val = %d", "TV", i, regs->am_reg[i].val); + } + } +#endif + if (regs->am_reg[0].val == 0 && regs->am_reg[1].val == 0 && regs->am_reg[2].val == 0 && regs->am_reg[3].val == 0) { + LOGE("%s,db's value is all zeros, that's not OK!!!\n", "TV"); + return -1; + } + return ret; +} +int CPqData::PQ_GetCVD2Params(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, am_regs_t *regs) +{ + int ret = -1; + int i = 0; + ret = getRegValuesByValue(CVD2_SETTING, PORT, FORMAT, source_port, sig_fmt, regs); +#ifdef CPQDB_DEBUG + if (ret == 0) { + for (i = 0; i < regs->length; i++) { + LOGD("%s, =================================================", "TV"); + LOGD("%s, regData.am_reg[%d].type = %d", "TV", i, regs->am_reg[i].type); + LOGD("%s, regData.am_reg[%d].addr = %d", "TV", i, regs->am_reg[i].addr); + LOGD("%s, regData.am_reg[%d].mask = %d", "TV", i, regs->am_reg[i].mask); + LOGD("%s, regData.am_reg[%d].val = %d", "TV", i, regs->am_reg[i].val); + } + } +#endif + if (regs->am_reg[0].val == 0 && regs->am_reg[1].val == 0 && regs->am_reg[2].val == 0 && regs->am_reg[3].val == 0) { + LOGE("%s,db's value is all zeros, that's not OK!!!\n", "TV"); + return -1; + } + + return ret; +} +int CPqData::PQ_SetSharpnessParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, am_regs_t regs) +{ + return 0; +} + +int CPqData::PQ_SetNoLineAllVolumeParams(tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100) +{ + return SetNonlinearMapping(TVPQ_DATA_VOLUME, source_type, osd0, osd25, osd50, osd75, osd100); +} +int CPqData::PQ_GetNoLineAllVolumeParams(tv_source_input_type_t source_type, int *osd0, int *osd25, int *osd50, int *osd75, int *osd100) +{ + int osdvalue[5] = {0}; + int rval; + rval = GetNonlinearMappingByOSDFac(TVPQ_DATA_VOLUME, source_type, osdvalue); + *osd0 = osdvalue[0]; + *osd25 = osdvalue[1]; + *osd50 = osdvalue[2]; + *osd75 = osdvalue[3]; + *osd100 = osdvalue[4]; + if (rval) { + LOGE("PQ_GetNoLineAllSharpnessParams Error %d\n", rval); + } + return rval; +} + +int CPqData::PQ_SetVolumeParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int params) +{ + return 0; +} + + +int CPqData::PQ_ResetAllNoLineParams(void) +{ + int rval; + char sqlmaster[256]; + char *err = NULL; + + sprintf(sqlmaster, "delete from NonlinearMapping; " + "insert into NonlinearMapping(TVIN_PORT, Item_ID, Level, Value) select TVIN_PORT, Item_ID, Level, Value from NonlinearMapping_Default;"); + + rval = this->exeSql(sqlmaster); + return rval; +} + + +int CPqData::PQ_GetNoiseReductionParams(vpp_noise_reduction_mode_t nr_mode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int *params) +{ + CSqlite::Cursor c; + char sqlmaster[256]; + int mode = is2dOr3d;//Check2Dor3D(status, trans_fmt); + int rval = -1; + + sprintf(sqlmaster, "select TableName from GeneralNoiseReductionTable where " + "TVIN_PORT = %d and " + "TVIN_SIG_FMT = %d and " + "TVIN_TRANS_FMT = %d ;", + source_port, sig_fmt, mode); + + rval = this->select(sqlmaster, c); + + if (c.moveToFirst()) { + int index_TableName = 0;//c.getColumnIndex("TableName"); + sprintf(sqlmaster, "select NRValue from %s where NRLevel = %d;" , c.getString(index_TableName).string(), (int)nr_mode); + + rval = this->select(sqlmaster, c); + + if (c.moveToFirst()) { + *params = c.getInt(0); + } + } + return rval; +} + +int CPqData::PQ_SetNoiseReductionParams(vpp_noise_reduction_mode_t nr_mode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int *params) +{ + return 0; +} + +int CPqData::PQ_GetOverscanParams(tv_source_input_type_t source_type, tvin_sig_fmt_t fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, vpp_display_mode_t dmode, tvin_cutwin_t *cutwin_t) +{ + CSqlite::Cursor c; + char sqlmaster[256]; + int mode = is2dOr3d;//Check2Dor3D(status, trans_fmt); + int rval = -1; + + cutwin_t->hs = 0; + cutwin_t->he = 0; + cutwin_t->vs = 0; + cutwin_t->ve = 0; + + sprintf(sqlmaster, "select Hs, He, Vs, Ve from OVERSCAN where " + "TVIN_PORT = %d and " + "TVIN_SIG_FMT = %d and " + "TVIN_TRANS_FMT = %d ;", + source_type, fmt, mode); + + rval = this->select(sqlmaster, c); + + if (c.moveToFirst()) { + cutwin_t->hs = c.getInt(0); + cutwin_t->he = c.getInt(1); + cutwin_t->vs = c.getInt(2); + cutwin_t->ve = c.getInt(3); + } + return rval; +} +int CPqData::PQ_SetOverscanParams(tv_source_input_type_t source_type, tvin_sig_fmt_t fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, tvin_cutwin_t cutwin_t) +{ + CSqlite::Cursor c; + char sqlmaster[256]; + int mode = is2dOr3d;//Check2Dor3D(status, trans_fmt); + int rval = -1; + + sprintf(sqlmaster, "select * from OVERSCAN where TVIN_PORT = %d and TVIN_SIG_FMT = %d and TVIN_TRANS_FMT = %d;", source_type, fmt, mode); + + rval = this->select(sqlmaster, c); + + if (c.moveToFirst()) { + sprintf(sqlmaster, "update OVERSCAN set Hs = %d, He = %d, Vs = %d, Ve = %d where TVIN_PORT = %d and TVIN_SIG_FMT = %d and TVIN_TRANS_FMT = %d;", + cutwin_t.hs, cutwin_t.he, cutwin_t.vs, cutwin_t.ve, source_type, fmt, mode); + } else { + sprintf(sqlmaster, "Insert into OVERSCAN(TVIN_PORT, TVIN_SIG_FMT, TVIN_TRANS_FMT, Hs, He, Vs, Ve) values(%d, %d, %d ,%d ,%d, %d, %d);", + source_type, fmt, mode, cutwin_t.hs, cutwin_t.he, cutwin_t.vs, cutwin_t.ve); + } + rval = this->exeSql(sqlmaster); + + return rval; +} + +int CPqData::PQ_ResetAllOverscanParams(void) +{ + int rval; + char sqlmaster[256]; + + sprintf(sqlmaster, "delete from OVERSCAN; insert into OVERSCAN(TVIN_PORT, TVIN_SIG_FMT, TVIN_TRANS_FMT, hs, he, vs, ve) select TVIN_PORT, TVIN_SIG_FMT, TVIN_TRANS_FMT, hs, he, vs, ve from OVERSCAN_default;"); + rval = this->exeSql(sqlmaster); + + return rval; +} + +int CPqData::PQ_GetPQModeParams(tv_source_input_type_t source_type, vpp_picture_mode_t pq_mode, vpp_pq_para_t *params) +{ + CSqlite::Cursor c; + char sqlmaster[256]; + + int rval = -1; + + sprintf(sqlmaster, "select Brightness, Contrast, Saturation, Hue, Sharpness, Backlight, NR from Picture_Mode where " + "TVIN_PORT = %d and " + "Mode = %d ;", + source_type, pq_mode); + + rval = this->select(sqlmaster, c); + + if (c.moveToFirst()) { + params->brightness = c.getInt(0); + params->contrast = c.getInt(1); + params->saturation = c.getInt(2); + params->hue = c.getInt(3); + params->sharpness = c.getInt(4); + params->backlight = c.getInt(5); + params->nr = c.getInt(6); + } + return rval; +} +int CPqData::PQ_SetPQModeParams(tv_source_input_type_t source_type, vpp_picture_mode_t pq_mode, vpp_pq_para_t *params) +{ + int rval; + char sql[256]; + + sprintf(sql, "update Picture_Mode set Brightness = %d, Contrast = %d, Saturation = %d, Hue = %d, Sharpness = %d, Backlight = %d, NR= %d " + " where TVIN_PORT = %d and Mode = %d;", + params->brightness, params->contrast, params->saturation, + params->hue, params->sharpness, params->backlight, params->nr, + source_type, pq_mode); + rval = this->exeSql(sql); + return 0; +} + +int CPqData::PQ_SetPQModeParamsByName(const char *name, tv_source_input_type_t source_type, vpp_picture_mode_t pq_mode, vpp_pq_para_t *params) +{ + int rval; + char sql[256]; + + sprintf(sql, "insert into %s(TVIN_PORT, Mode, Brightness, Contrast, Saturation, Hue, Sharpness, Backlight, NR)" + " values(%d,%d,%d,%d,%d,%d,%d,%d,%d);", name, source_type, pq_mode, params->brightness, params->contrast, params->saturation, + params->hue, params->sharpness, params->backlight, params->nr); + + rval = this->exeSql(sql); + return 0; +} + +int CPqData::PQ_ResetAllPQModeParams(void) +{ + int rval; + char sqlmaster[256]; + + sprintf(sqlmaster, "delete from picture_mode; insert into picture_mode(TVIN_PORT, Mode, Brightness, Contrast, Saturation, Hue, Sharpness, Backlight, NR) select TVIN_PORT, Mode, Brightness, Contrast, Saturation, Hue, Sharpness, Backlight, NR from picture_mode_default;"); + + rval = this->exeSql(sqlmaster); + return rval; +} + +int CPqData::PQ_GetGammaSpecialTable(int gammaValue, const char *f_name, tcon_gamma_table_t *gamma_value) +{ + CSqlite::Cursor c; + char sqlmaster[256]; + int rval = -1; + + sprintf(sqlmaster, "select %s from GAMMA_%d", f_name, gammaValue); + + rval = this->select(sqlmaster, c); + + if (c.moveToFirst()) { + int index = 0; + do { + gamma_value->data[index] = c.getInt(0); + index++; + } while (c.moveToNext()); + } + return rval; +} + +int CPqData::PQ_GetGammaTableR(int panel_id, tvin_port_t source_port, tvin_sig_fmt_t fmt, tcon_gamma_table_t *gamma_r) +{ + return PQ_GetGammaTable(panel_id, source_port, fmt, "Red", gamma_r); +} + +int CPqData::PQ_GetGammaTableG(int panel_id, tvin_port_t source_port, tvin_sig_fmt_t fmt, tcon_gamma_table_t *gamma_g) +{ + return PQ_GetGammaTable(panel_id, source_port, fmt, "Green", gamma_g); +} + +int CPqData::PQ_GetGammaTableB(int panel_id, tvin_port_t source_port, tvin_sig_fmt_t fmt, tcon_gamma_table_t *gamma_b) +{ + return PQ_GetGammaTable(panel_id, source_port, fmt, "Blue", gamma_b); +} + +int CPqData::PQ_GetGammaTable(int panel_id, tvin_port_t source_port, tvin_sig_fmt_t fmt, const char *f_name, tcon_gamma_table_t *val) +{ + CSqlite::Cursor c; + char sqlmaster[256]; + + int rval = -1; + + sprintf(sqlmaster, "select TableName from GeneralGammaTable where " + "TVIN_PORT = %d and " + "TVIN_SIG_FMT = %d;", + source_port, fmt); + + rval = this->select(sqlmaster, c); + + if (c.moveToFirst()) { + int index_TableName = 0;//c.getColumnIndex("TableName"); + sprintf(sqlmaster, "select %s from %s;", f_name, c.getString(index_TableName).string()); + + rval = this->select(sqlmaster, c); + if (c.moveToFirst()) { + int index = 0; + do { + val->data[index] = c.getInt(0); + index++; + } while (c.moveToNext()); + } + } + return rval; +} + + +int CPqData::PQ_GetVGAAjustPara(tvin_sig_fmt_t vga_fmt, tvafe_vga_parm_t *adjparam) +{ + CSqlite::Cursor c; + char sqlmaster[256]; + int rval = -1; + + adjparam->clk_step = 0; + adjparam->phase = 0; + adjparam->hpos_step = 0; + adjparam->vpos_step = 0; + adjparam->vga_in_clean = 0; + + sprintf(sqlmaster, "select Clk, Phase, HPos, VPos, Vga_in_clean from VGA_AutoParams where TVIN_SIG_FMT = %d", vga_fmt); + + rval = this->select(sqlmaster, c); + + if (c.moveToFirst()) { + adjparam->clk_step = c.getInt(0); + adjparam->phase = c.getInt(1); + adjparam->hpos_step = c.getInt(2); + adjparam->vpos_step = c.getInt(3); + adjparam->vga_in_clean = c.getInt(4); + } + return rval; +} +int CPqData::PQ_SetVGAAjustPara(tvin_sig_fmt_t vga_fmt, tvafe_vga_parm_t adjparam) +{ + CSqlite::Cursor c; + char sql[256]; + int rval = -1; + + sprintf(sql, "select * from VGA_AutoParams where TVIN_SIG_FMT = %d;", vga_fmt); + + rval = this->select(sql, c); + + if (c.moveToFirst()) { + sprintf(sql, "Insert into VGA_AutoParams(TVIN_SIG_FMT, Clk, Phase, HPos, VPos, Vga_in_clean) values(%d, %d, %d ,%d ,%d, %d);", + vga_fmt, adjparam.clk_step, adjparam.phase, adjparam.hpos_step, adjparam.vpos_step, adjparam.vga_in_clean); + } else { + sprintf(sql, "update VGA_AutoParams set Clk = %d, Phase = %d, HPos = %d, VPos = %d, Vga_in_clean = %d where TVIN_SIG_FMT = %d;", + adjparam.clk_step, adjparam.phase, adjparam.hpos_step, adjparam.vpos_step, adjparam.vga_in_clean, vga_fmt); + } + rval = this->exeSql(sql); + return rval; +} + +int CPqData::CaculateLevelParam(tvpq_data_t *pq_data, int nodes, int level) +{ + int i; + + for (i = 0; i < nodes; i++) { + if (level < pq_data[i].IndexValue) { + break; + } + } + + if (i == 0) { + return pq_data[i].RegValue; + } else if (i == nodes) { + return pq_data[i - 1].RegValue; + } else { + return pq_data[i - 1].RegValue + (level - pq_data[i - 1].IndexValue) * pq_data[i - 1].step; + } +} + +am_regs_t CPqData::CaculateLevelRegsParam(tvpq_sharpness_regs_t *pq_regs, int level) +{ + am_regs_t regs; + int i; + + for (i = 0; i < sha_nodes; i++) { + if (level < pq_regs[i].reg_data[0].IndexValue) { + break; + } + } + + if (i == 0) { + regs.length = pq_regs[i].length; + for (int j = 0; j < pq_regs[i].length; j++) { + regs.am_reg[j].type = pq_regs[i].reg_data[j].Value.type; + regs.am_reg[j].addr = pq_regs[i].reg_data[j].Value.addr; + regs.am_reg[j].mask = pq_regs[i].reg_data[j].Value.mask; + regs.am_reg[j].val = pq_regs[i].reg_data[j].Value.val; + } + + } else if (i == sha_nodes) { + regs.length = pq_regs[i - 1].length; + for (int j = 0; j < pq_regs[i - 1].length; j++) { + regs.am_reg[j].type = pq_regs[i - 1].reg_data[j].Value.type; + regs.am_reg[j].addr = pq_regs[i - 1].reg_data[j].Value.addr; + regs.am_reg[j].mask = pq_regs[i - 1].reg_data[j].Value.mask; + regs.am_reg[j].val = pq_regs[i - 1].reg_data[j].Value.val; + } + } else { + regs.length = pq_regs[i - 1].length; + for (int j = 0; j < pq_regs[i - 1].length; j++) { + regs.am_reg[j].type = pq_regs[i - 1].reg_data[j].Value.type; + regs.am_reg[j].addr = pq_regs[i - 1].reg_data[j].Value.addr; + regs.am_reg[j].mask = pq_regs[i - 1].reg_data[j].Value.mask; + regs.am_reg[j].val = pq_regs[i - 1].reg_data[j].Value.val + (level - pq_regs[i - 1].reg_data[j].IndexValue) * pq_regs[i - 1].reg_data[j].step; + } + } + + return regs; +} + + +int CPqData::GetNonlinearMapping(tvpq_data_type_t data_type, tvin_port_t source_port, int level, int *params) +{ + CSqlite::Cursor c; + char sqlmaster[256]; + int rval = -1; + + tv_source_input_type_t type; + //showboz + type = CTvin::Tvin_SourcePortToSourceInputType(source_port);//??? + + sprintf(sqlmaster, "select Value from NonlinearMapping where " + "TVIN_PORT = %d and " + "Item_ID = %d and " + "Level = %d ;", + type, data_type, level); + + rval = this->select(sqlmaster, c); + + if (c.moveToFirst()) { + *params = c.getInt(0); + } + return rval; +} + +int CPqData::GetNonlinearMappingByOSDFac(tvpq_data_type_t data_type, tv_source_input_type_t source_type, int *params) +{ + CSqlite::Cursor c; + char sqlmaster[256]; + int rval = -1; + + sprintf(sqlmaster, "select Value from NonlinearMapping where " + "TVIN_PORT = %d and " + "Item_ID = %d and (" + "Level = 0 or Level = 25 or Level = 50 or Level = 75 or Level = 100);", + source_type, data_type); + + rval = this->select(sqlmaster, c); + + if (c.moveToFirst()) { + params[0] = c.getInt(0); + params[1] = c.getInt(1); + params[2] = c.getInt(2); + params[3] = c.getInt(3); + params[4] = c.getInt(4); + } + return rval; +} + +int CPqData::SetNonlinearMapping(tvpq_data_type_t data_type, tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100) +{ + + int rval; + char *err = NULL; + int osdvalue[101]; + double step[4]; + char sql[256]; + + step[0] = (osd25 - osd0) / 25.0; + step[1] = (osd50 - osd25) / 25.0; + step[2] = (osd75 - osd50) / 25.0; + step[3] = (osd100 - osd75) / 25.0; + + + for (int i = 0; i <= 100; i++) { + if (i == 0) { + osdvalue[i] = osd0; + } else if ((i > 0) && (i <= 25)) { + osdvalue[i] = osd0 + (int)(i * step[0]); + } else if ((i > 25) && (i <= 50)) { + osdvalue[i] = osd25 + (int)((i - 25) * step[1]); + } else if ((i > 50) && (i <= 75)) { + osdvalue[i] = osd50 + (int)((i - 50) * step[2]); + } else if ((i > 75) && (i <= 100)) { + osdvalue[i] = osd75 + (int)((i - 75) * step[3]); + } + sprintf(sql, "update NonLinearMapping set Value = %d where TVIN_PORT = %d and Item_ID = %d and Level = %d ;", osdvalue[i], source_type, data_type, i); + if (!(this->exeSql(sql))) { + return -1; + } + } + return 0; +} + +int CPqData::SetNonlinearMappingByName(const char *name, tvpq_data_type_t data_type, tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100) +{ + int rval; + char *err = NULL; + int osdvalue[101]; + double step[4]; + char sql[256]; + + step[0] = (osd25 - osd0) / 25.0; + step[1] = (osd50 - osd25) / 25.0; + step[2] = (osd75 - osd50) / 25.0; + step[3] = (osd100 - osd75) / 25.0; + + for (int i = 0; i <= 100; i++) { + if (i == 0) { + osdvalue[i] = osd0; + } else if ((i > 0) && (i <= 25)) { + osdvalue[i] = osd0 + (int)(i * step[0]); + } else if ((i > 25) && (i <= 50)) { + osdvalue[i] = osd25 + (int)((i - 25) * step[1]); + } else if ((i > 50) && (i <= 75)) { + osdvalue[i] = osd50 + (int)((i - 50) * step[2]); + } else if ((i > 75) && (i <= 100)) { + osdvalue[i] = osd75 + (int)((i - 75) * step[3]); + } + memset(sql, '\0', 256); + sprintf(sql, "insert into %s(TVIN_PORT, Item_ID, Level, Value) values(%d,%d,%d,%d);", name, source_type, data_type, i, osdvalue[i]); + if (!(this->exeSql(sql))) { + return -1; + } + } + return 0; +} + +int CPqData::LoadPQData(tvpq_data_type_t data_type, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int flag) +{ + CSqlite::Cursor c; + int rval; + char sqlmaster[256]; + int mode = is2dOr3d; + tvpq_data_t *pq_data = NULL; + int *pq_nodes = NULL; + + switch (data_type) { + case TVPQ_DATA_BRIGHTNESS: + sprintf(sqlmaster, "select TableName from GeneralContrastBrightnessTable where " + "TVIN_PORT = %d and " + "TVIN_SIG_FMT = %d and " + "TVIN_TRANS_FMT = %d and " + "%s = %d;", + source_port, sig_fmt, mode, ID_FIELD, BRIGHTNESS_ID); + pq_data = pq_bri_data; + pq_nodes = &bri_nodes; + break; + case TVPQ_DATA_CONTRAST: + sprintf(sqlmaster, "select TableName from GeneralContrastBrightnessTable where " + "TVIN_PORT = %d and " + "TVIN_SIG_FMT = %d and " + "TVIN_TRANS_FMT = %d and " + "%s = %d;", + source_port, sig_fmt, mode, ID_FIELD, CONTRAST_ID); + pq_data = pq_con_data; + pq_nodes = &con_nodes; + break; + case TVPQ_DATA_HUE: + sprintf(sqlmaster, "select TableName from GeneralSaturationHueTable where " + "TVIN_PORT = %d and " + "TVIN_SIG_FMT = %d and " + "TVIN_TRANS_FMT = %d and " + "%s = %d;", + source_port, sig_fmt, mode, ID_FIELD, HUE_ID); + pq_data = pq_hue_data; + pq_nodes = &hue_nodes; + break; + case TVPQ_DATA_SATURATION: + sprintf(sqlmaster, "select TableName from GeneralSaturationHueTable where " + "TVIN_PORT = %d and " + "TVIN_SIG_FMT = %d and " + "TVIN_TRANS_FMT = %d and " + "%s = %d;", + source_port, sig_fmt, mode, ID_FIELD, SATURATION_ID); + pq_data = pq_sat_data; + pq_nodes = &sat_nodes; + break; + case TVPQ_DATA_SHARPNESS: + //sprintf(sqlmaster, "select TableName from GeneralSharpnessTable where " + sprintf(sqlmaster, "select TableName from GeneralSharpnessG9Table where " + "TVIN_PORT = %d and " + "TVIN_SIG_FMT = %d and " + "TVIN_TRANS_FMT = %d and " + "%s = %d;", + source_port, sig_fmt, mode, ID_FIELD, SHARPNESS_ID); + pq_data = NULL; + pq_nodes = &sha_nodes; + break; + default: + break; + } + + rval = this->select(sqlmaster, c); + + if (c.moveToFirst()) { + switch (data_type) { + case TVPQ_DATA_BRIGHTNESS: + case TVPQ_DATA_CONTRAST: + case TVPQ_DATA_HUE: + case TVPQ_DATA_SATURATION: + sprintf(sqlmaster, "select TotalNode, NodeNumber, IndexValue, RegValue, StepUp from %s order by NodeNumber asc;", c.getString(0).string()); + break; + case TVPQ_DATA_SHARPNESS: + sprintf(sqlmaster, "select TotalNode, NodeNumber, RegType, RegAddr, RegMask, IndexValue, RegValue, StepUp from %s order by NodeNumber asc;", c.getString(0).string()); + break; + default: + break; + } + } + + rval = this->select(sqlmaster, c); + + if (c.moveToFirst()) { + if (data_type == TVPQ_DATA_SHARPNESS) { + *pq_nodes = c.getInt(0);//TotalNode? + int length = c.getCount() / (*pq_nodes); + int index = 0; + for (int i = 0; i < *pq_nodes; i++) { + pq_sharpness_reg_data[i].length = length; + } + do { + pq_sharpness_reg_data[index / length].reg_data[index % length].TotalNode = c.getInt(0); + pq_sharpness_reg_data[index / length].reg_data[index % length].NodeValue = c.getInt(1); + pq_sharpness_reg_data[index / length].reg_data[index % length].Value.type = c.getUInt(2); + pq_sharpness_reg_data[index / length].reg_data[index % length].Value.addr = c.getUInt(3); + pq_sharpness_reg_data[index / length].reg_data[index % length].Value.mask = c.getUInt(4); + pq_sharpness_reg_data[index / length].reg_data[index % length].IndexValue = c.getInt(5); + pq_sharpness_reg_data[index / length].reg_data[index % length].Value.val = c.getUInt(6); + pq_sharpness_reg_data[index / length].reg_data[index % length].step = c.getF(7); + index++; + } while (c.moveToNext()); + } else { + int index = 0; + do { + pq_data[index].TotalNode = c.getInt(0); + pq_data[index].NodeValue = c.getInt(1); + pq_data[index].IndexValue = c.getInt(2); + pq_data[index].RegValue = c.getInt(3); + pq_data[index].step = c.getF(4); + if (flag == 1) { + if (data_type == TVPQ_DATA_BRIGHTNESS) { + LOGD("%s, bri pq_data[%d].RegValue = %d\n", "TV", index, pq_data[index].RegValue); + pq_data[index].RegValue -= 64; + LOGD("%s, bri pq_data[%d].RegValue + 64 = %d\n", "TV", index, pq_data[index].RegValue); + } else if (data_type == TVPQ_DATA_CONTRAST) { + LOGD("%s, con pq_data[%d].RegValue = %d\n", "TV", index, pq_data[index].RegValue); + pq_data[index].RegValue += 64; + LOGD("%s, con pq_data[%d].RegValue + 64 = %d\n", "TV", index, pq_data[index].RegValue); + } + } + index++; + } while (c.moveToNext()); + *pq_nodes = index; + } + } + + return rval; +} + +int CPqData::LoadAllPQData(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int flag) +{ + int rval = -1; + rval = LoadPQData(TVPQ_DATA_BRIGHTNESS, source_port, sig_fmt, is2dOr3d, trans_fmt, flag); + if (rval) { + return rval; + } + rval = LoadPQData(TVPQ_DATA_CONTRAST, source_port, sig_fmt, is2dOr3d, trans_fmt, flag); + if (rval) { + return rval; + } + rval = LoadPQData(TVPQ_DATA_SATURATION, source_port, sig_fmt, is2dOr3d, trans_fmt, -1); + if (rval) { + return rval; + } + rval = LoadPQData(TVPQ_DATA_HUE, source_port, sig_fmt, is2dOr3d, trans_fmt, -1); + if (rval) { + return rval; + } + rval = LoadPQData(TVPQ_DATA_SHARPNESS, source_port, sig_fmt, is2dOr3d, trans_fmt, -1); + if (rval) { + return rval; + } + return rval; +} + +typedef enum initial_type_e { + TYPE_PMode = 0, + TYPE_PMode_Default, + TYPE_Nonlinear, + TYPE_NonLinear_Default, + TYPE_VGA_AUTO, + TYPE_OVERSCAN, +} initial_type_t; + +const char *Pmode_name[6] = { + "Picture_Mode", + "Picture_Mode_Default", + "NonlinearMapping", + "NonlinearMapping_Default", + "VGA_AutoParams", + "OVERSCAN" +}; + +void CPqData::initialTable(int type) +{ + vpp_pq_para_t pmode_default; + + pmode_default.backlight = 100; + pmode_default.brightness = 50; + pmode_default.contrast = 50; + pmode_default.hue = 50; + pmode_default.nr = 0; + pmode_default.saturation = 50; + pmode_default.sharpness = 50; + + + switch (type) { + case TYPE_PMode: + case TYPE_PMode_Default: + for (int i = 0; i < 6; i++ ) { + for (int j = 0; j < 4; j++) { + PQ_SetPQModeParamsByName(Pmode_name[type], (tv_source_input_type_t) i, (vpp_picture_mode_t)j, &pmode_default); + } + } + break; + case TYPE_Nonlinear: + case TYPE_NonLinear_Default: + for (int i = 0; i < 6; i++ ) { + for (int j = 0; j < 5; j++) { + SetNonlinearMappingByName(Pmode_name[type], (tvpq_data_type_t) j, (tv_source_input_type_t)i, 0, (int)255 / 4.0, (int)255 * 2 / 4.0, (int)255 * 3 / 4.0, 255); + } + } + break; + case TYPE_VGA_AUTO: + break; + case TYPE_OVERSCAN: + break; + } +} + +int CPqData::PQ_GetPhaseArray(am_phase_t *am_phase) +{ + CSqlite::Cursor c; + int iOutRet = 0; + char sqlmaster[256]; + sprintf(sqlmaster, "select Phase from Phase order by Format ASC; "); + + this->select(sqlmaster, c); + int nums = 0; + am_phase->length = c.getCount(); + if (c.moveToFirst()) { + do { + am_phase->phase[nums] = c.getInt(0);//col index is 0[Phase] + nums++; + } while (c.moveToNext()); + } + // + return nums; +} + diff --git a/tvapi/libtv/vpp/CPQdb.h b/tvapi/libtv/vpp/CPQdb.h new file mode 100644 index 0000000..f9c3cef --- a/dev/null +++ b/tvapi/libtv/vpp/CPQdb.h @@ -0,0 +1,161 @@ +/* + * CPQdb.h + * + * Created on: 2011-12-13 + * Author: casey + */ + +#ifndef CPQDB_H_ +#define CPQDB_H_ + +#define PQ_NO_ANDROID 0 + + +#if (PQ_NO_ANDROID == 1) +#include "sqlite3.h" +#else +#include "../../sqlite/dist/sqlite3.h" +#endif +#include "tvutils/CFile.h" +#include "../tvin/CTvin.h" +#include "CVpp.h" +#include "tvutils/CSqlite.h" + +typedef enum tvpq_data_type_e { + TVPQ_DATA_BRIGHTNESS, + TVPQ_DATA_CONTRAST, + TVPQ_DATA_SATURATION, + TVPQ_DATA_HUE, + TVPQ_DATA_SHARPNESS, + TVPQ_DATA_VOLUME, + + TVPQ_DATA_MAX, +} tvpq_data_type_t; + +typedef struct tvpq_data_s { + int TotalNode; + int NodeValue; + int IndexValue; + int RegValue; + double step; +} tvpq_data_t; + +typedef struct tvpq_sharpness_reg_s { + int TotalNode; + am_reg_t Value; + int NodeValue; + int IndexValue; + double step; +} tvpq_sharpness_reg_t; + +typedef struct tvpq_sharpness_regs_s { + int length; + tvpq_sharpness_reg_t reg_data[50]; +} tvpq_sharpness_regs_t; + +typedef struct tvpq_nonlinear_s { + int osd0; + int osd25; + int osd50; + int osd75; + int osd100; +} tvpq_nonlinear_t; + + +class CPqData: public CSqlite +{ +public: + CPqData(); + ~CPqData(); + int PQ_GetColorDemoParams(vpp_color_demomode_t demomode, void *params); + int PQ_GetBaseColorParams(vpp_color_basemode_t basemode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs); + int PQ_GetCM2Params(vpp_color_management2_t basemode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs); + int PQ_GetNR2Params(vpp_noise_reduction2_mode_t basemode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs); + int PQ_GetXVYCCParams(vpp_xvycc_mode_t xvycc_mode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs, am_regs_t *regs_1); + int PQ_GetMCDIParams(vpp_mcdi_mode_t mcdi_mode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs); + int PQ_ColorTemperatureRGBogo2Params(void *params, tcon_rgb_ogo_t rgb_ogo); + int PQ_ColorTemperatureParams2RGBogo(tcon_rgb_ogo_t *rgb_ogo, void *params); + int PQ_GetColorTemperatureParams(vpp_color_temperature_mode_t Tempmode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt, + tcon_rgb_ogo_t *params); + int PQ_SetColorTemperatureParams(vpp_color_temperature_mode_t Tempmode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt, + tcon_rgb_ogo_t params); + int PQ_ResetAllColorTemperatureParams(void); + int PQ_GetBacklightParams(tvin_port_t source_port, int level, int *params); + int PQ_SetBacklightParams(tvin_port_t source_port, int level, int params); + int PQ_SetNoLineAllBrightnessParams(tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100); + int PQ_GetNoLineAllBrightnessParams(tv_source_input_type_t source_type, int *osd0, int *osd25, int *osd50, int *osd75, int *osd100); + int PQ_GetBrightnessParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int *params); + int PQ_SetBrightnessParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int params); + int PQ_SetNoLineAllContrastParams(tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100); + int PQ_GetNoLineAllContrastParams(tv_source_input_type_t source_type, int *osd0, int *osd25, int *osd50, int *osd75, int *osd100); + int PQ_GetContrastParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int *params); + int PQ_SetContrastParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int params); + int PQ_SetNoLineAllSaturationParams(tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100); + int PQ_GetNoLineAllSaturationParams(tv_source_input_type_t source_type, int *osd0, int *osd25, int *osd50, int *osd75, int *osd100); + int PQ_GetSaturationParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int *params); + int PQ_SetSaturationParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int params); + int PQ_SetNoLineAllHueParams(tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100); + int PQ_GetNoLineAllHueParams(tv_source_input_type_t source_type, int *osd0, int *osd25, int *osd50, int *osd75, int *osd100); + int PQ_GetHueParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int *params); + int PQ_SetHueParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int params); + int PQ_SetNoLineAllSharpnessParams(tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100); + int PQ_GetNoLineAllSharpnessParams(tv_source_input_type_t source_type, int *osd0, int *osd25, int *osd50, int *osd75, int *osd100); + int PQ_GetSharpnessParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, am_regs_t *regs); + int PQ_SetSharpnessParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, am_regs_t regs); + int PQ_SetNoLineAllVolumeParams(tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100); + int PQ_GetNoLineAllVolumeParams(tv_source_input_type_t source_type, int *osd0, int *osd25, int *osd50, int *osd75, int *osd100); + int PQ_GetVolumeParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int *length, int *params); + int PQ_SetVolumeParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int params); + int PQ_ResetAllNoLineParams(void); + int PQ_GetNoiseReductionParams(vpp_noise_reduction_mode_t nr_mode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int *params); + int PQ_SetNoiseReductionParams(vpp_noise_reduction_mode_t nr_mode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int *params); + int PQ_GetDNLPParams(tvin_port_t source_port, tvin_sig_fmt_t fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, ve_dnlp_t *params, ve_dnlp_table_t *newParams, int *dnlpFlag); + int PQ_GetBlackExtParams(tv_source_input_type_t source_type, tvin_sig_fmt_t fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, ve_bext_t *params); + int PQ_GetOverscanParams(tv_source_input_type_t source_type, tvin_sig_fmt_t fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, vpp_display_mode_t dmode, tvin_cutwin_t *cutwin_t); + int PQ_SetOverscanParams(tv_source_input_type_t source_type, tvin_sig_fmt_t fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, tvin_cutwin_t cutwin_t); + int PQ_ResetAllOverscanParams(void); + int PQ_GetPQModeParams(tv_source_input_type_t source_type, vpp_picture_mode_t pq_mode, vpp_pq_para_t *params); + int PQ_SetPQModeParams(tv_source_input_type_t source_type, vpp_picture_mode_t pq_mode, vpp_pq_para_t *params); + int PQ_ResetAllPQModeParams(void); + int PQ_GetGammaTableR(int panel_id, tvin_port_t source_port, tvin_sig_fmt_t fmt, tcon_gamma_table_t *gamma_r); + int PQ_GetGammaTableG(int panel_id, tvin_port_t source_port, tvin_sig_fmt_t fmt, tcon_gamma_table_t *gamma_g); + int PQ_GetGammaTableB(int panel_id, tvin_port_t source_port, tvin_sig_fmt_t fmt, tcon_gamma_table_t *gamma_b); + int PQ_GetGammaSpecialTable(int gammaValue, const char *f_name, tcon_gamma_table_t *gamma_r); + int PQ_GetVGAAjustPara(tvin_sig_fmt_t vga_fmt, tvafe_vga_parm_t *adjparam); + int PQ_SetVGAAjustPara(tvin_sig_fmt_t vga_fmt, tvafe_vga_parm_t adjparam); + int PQ_GetPhaseArray(am_phase_t *am_phase); + int PQ_GetPLLParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, am_regs_t *regs); + int PQ_GetCVD2Params(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, am_regs_t *regs); + + int openDB(); + int closeDB(); + int getRegValues(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs); + int getRegValuesByValue(const char *name, const char *f_name, const char *f2_name, const int val, const int val2, am_regs_t *regs); + int getRegValuesByValue_long(const char *name, const char *f_name, const char *f2_name, const int val, const int val2, am_regs_t *regs, am_regs_t *regs_1); + int LoadAllPQData(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int flag); + void initialTable(int type); + void transferFixTable(); + +private: + int CaculateLevelParam(tvpq_data_t *pq_data, int nodes, int level); + am_regs_t CaculateLevelRegsParam(tvpq_sharpness_regs_t *pq_regs, int level); + int GetNonlinearMapping(tvpq_data_type_t data_type, tvin_port_t source_port, int level, int *params); + int GetNonlinearMappingByOSDFac(tvpq_data_type_t data_type, tv_source_input_type_t source_type, int *params); + int SetNonlinearMapping(tvpq_data_type_t data_type, tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100); + int LoadPQData(tvpq_data_type_t data_type, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int flag); + int PQ_GetGammaTable(int panel_id, tvin_port_t source_port, tvin_sig_fmt_t fmt, const char *f_name, tcon_gamma_table_t *val); + int SetNonlinearMappingByName(const char *name, tvpq_data_type_t data_type, tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100); + int PQ_SetPQModeParamsByName(const char *name, tv_source_input_type_t source_type, vpp_picture_mode_t pq_mode, vpp_pq_para_t *params); + + tvpq_data_t pq_bri_data[15]; + tvpq_data_t pq_con_data[15]; + tvpq_data_t pq_sat_data[15]; + tvpq_data_t pq_hue_data[15]; + tvpq_sharpness_regs_t pq_sharpness_reg_data[10]; + int bri_nodes; + int con_nodes; + int hue_nodes; + int sat_nodes; + int sha_nodes; +}; +#endif diff --git a/tvapi/libtv/vpp/CVpp.cpp b/tvapi/libtv/vpp/CVpp.cpp new file mode 100644 index 0000000..f7af190 --- a/dev/null +++ b/tvapi/libtv/vpp/CVpp.cpp @@ -0,0 +1,3711 @@ +#include "CVpp.h" +#include <CTvLog.h> +#include "../tvsetting/CTvSetting.h" +#include "../tvutils/tvutils.h" +#include <cutils/properties.h> +#include "CPQdb.h" +#include <math.h> +#include <stdio.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/ioctl.h> +#include <fcntl.h> +#include <string.h> +#include <pthread.h> +#include <errno.h> +#include <dlfcn.h> +#include "CTvLog.h" +#include "../tvconfig/tvconfig.h" +#include "CAv.h" + +#ifdef LOG_TAG +#undef LOG_TAG +#define LOG_TAG "CVpp" +#endif +CVpp::CVpp() +{ + vpp_amvideo_fd = -1; + vpp_amvideo_3d_fd = -1; + mpPqData = new CPqData(); +} + +CVpp::~CVpp() +{ + if (mpPqData != NULL) { + delete mpPqData; + mpPqData = NULL; + } +} + +int CVpp::Vpp_Init ( void ) +{ + if (mpPqData->openDB() ) { + LOGW ( "%s, open pq failed!", __FUNCTION__ ); + } else { + LOGD ( "%s, open pq success!", __FUNCTION__ ); + } + + int ret = -1; + int backlight = 100; + int offset_r = 0, offset_g = 0, offset_b = 0, gain_r = 1024, gain_g = 1024, gain_b = 1024; + + Vpp_GetVppConfig(); + + ret = VPP_OpenModule(); + backlight = Tv_GetBacklight ( SOURCE_TYPE_TV ); + + if ( mbVppCfg_backlight_init) { + backlight = ( backlight + 100 ) * 255 / 200; + + if ( backlight < 127 || backlight > 255 ) { + backlight = 255; + } + } + + Tv_SetBacklightWithoutSave ( backlight, SOURCE_TYPE_TV ); + + if ( SSMReadNonStandardValue() & 1 ) { + Set_Fixed_NonStandard ( 0 ); //close + } else { + Set_Fixed_NonStandard ( 2 ); //open + } + + Tv_LoadVppSettings ( SOURCE_TYPE_MPEG, TVIN_SIG_FMT_NULL, INDEX_2D, TVIN_TFMT_2D ); + + return ret; +} + +int CVpp::Vpp_Uninit ( void ) +{ + Vpp_ResetLastVppSettingsSourceType(); + VPP_CloseModule(); + mpPqData->closeDb(); + return 0; +} +CPqData *CVpp::getPqData() +{ + return mpPqData; +} + +int CVpp::VPP_OpenModule ( void ) +{ + + if ( vpp_amvideo_fd < 0 ) { + vpp_amvideo_fd = open ( VPP_DEV_PATH, O_RDWR ); + + LOGD ( "~~~open~~~##VPP_OpenModule##VPP_DEV_PATH : %s##" , VPP_DEV_PATH); + + if ( vpp_amvideo_fd < 0 ) { + LOGE ( "Open vpp module, error(%s)!\n", strerror ( errno ) ); + return -1; + } + } + + + if ( vpp_amvideo_3d_fd < 0 ) { + vpp_amvideo_3d_fd = open ( VPP_3D_DEV_PATH, O_RDWR ); + LOGD ( "~~~open~~~##VPP_OpenModule##VPP_3D_DEV_PATH : %s##" , VPP_3D_DEV_PATH); + + if ( vpp_amvideo_3d_fd < 0 ) { + LOGE ( "Open vpp 3d module, error(%s)!\n", strerror ( errno ) ); + return -1; + } + } + + return vpp_amvideo_fd; +} + +int CVpp::VPP_CloseModule ( void ) +{ + if ( vpp_amvideo_fd >= 0 ) { + close ( vpp_amvideo_fd ); + vpp_amvideo_fd = -1; + } + + + if ( vpp_amvideo_3d_fd >= 0 ) { + close ( vpp_amvideo_3d_fd ); + vpp_amvideo_3d_fd = -1; + } + + return 0; +} + + +int CVpp::VPP_DeviceIOCtl ( int request, ... ) +{ + int tmp_ret = -1; + va_list ap; + void *arg; + va_start ( ap, request ); + arg = va_arg ( ap, void * ); + va_end ( ap ); + tmp_ret = ioctl ( vpp_amvideo_fd, request, arg ); + return tmp_ret; +} + + +int CVpp::Vpp_LoadRegs ( am_regs_t regs ) +{ + int rt = VPP_DeviceIOCtl ( AMVECM_IOC_LOAD_REG, ®s ); + LOGD ( "~~~VPP_DeviceIOCtl~~~##Vpp_LoadRegs##AMVECM_IOC_LOAD_REG##" ); + + if ( rt < 0 ) { + LOGE ( "Vpp_LoadRegs, error(%s)!\n", strerror ( errno ) ); + } + + return rt; +} + +int CVpp::Tv_LoadVppSettings ( tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt ) +{ + int val = 0, ret = -1; + vpp_color_temperature_mode_t temp_mode = VPP_COLOR_TEMPERATURE_MODE_STANDARD; + vpp_picture_mode_t pqmode = VPP_PICTURE_MODE_STANDARD; + vpp_display_mode_t dispmode = VPP_DISPLAY_MODE_169; + vpp_noise_reduction_mode_t nr_mode = VPP_NOISE_REDUCTION_MODE_MID; + tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceType ( source_type ); + + if ( ( vpp_setting_last_source_type == source_type ) + && ( vpp_setting_last_sig_fmt == sig_fmt ) + /*&& ( vpp_setting_last_3d_status == status showbo mark)*/ + && ( vpp_setting_last_trans_fmt == trans_fmt ) ) { + return -1; + } + + nr_mode = Tv_GetNoiseReductionMode ( source_type ); + ret |= Vpp_SetNoiseReductionMode ( nr_mode, source_type , source_port, sig_fmt, is3d, trans_fmt); + ret |= Vpp_SetXVYCCMode( VPP_XVYCC_MODE_STANDARD, source_type, source_port, sig_fmt, is3d, trans_fmt ); + ret |= Vpp_SetMCDIMode( VPP_MCDI_MODE_STANDARD, source_type , source_port, sig_fmt, is3d, trans_fmt ); + + Vpp_LoadBasicRegs ( source_type, sig_fmt, is3d, trans_fmt ); + Vpp_LoadGamma ( source_type, sig_fmt ); + + ret |= Vpp_SetBaseColorMode ( Tv_GetBaseColorMode() , source_port, sig_fmt, is3d, trans_fmt); + + temp_mode = Tv_GetColorTemperature ( source_type ); + + if ( temp_mode == VPP_COLOR_TEMPERATURE_MODE_USER ) { + ret |= Vpp_SetColorTemperatureUser ( temp_mode, source_type ); + } else { + CheckColorTemperatureParamAlldata(TVIN_PORT_HDMI0, sig_fmt, trans_fmt); // check colortmp backup data + ret |= Vpp_SetColorTemperature ( temp_mode, source_type , source_port, sig_fmt, trans_fmt); + } + + pqmode = Tv_GetPQMode ( source_type ); + ret |= Vpp_SetPQMode ( pqmode, source_type , source_port, sig_fmt, is3d, trans_fmt); + + ret |= Tv_SetDNLP(source_type , source_port, sig_fmt, is3d, trans_fmt); + + vpp_setting_last_source_type = source_type; + vpp_setting_last_sig_fmt = sig_fmt; + //showbo mark vpp_setting_last_3d_status = status; + vpp_setting_last_trans_fmt = trans_fmt; + + return 0; +} + + + +int CVpp::Vpp_GetVppConfig ( void ) +{ + const char *config_value; + int cfg_item_count = 0; + char *token = NULL; + const char *strDelimit = ","; + char data_str[CC_CFG_VALUE_STR_MAX_LEN] = { 0 }; + + config_value = config_get_str ( "TV", "vpp.pqmode.depend.bklight", "null" ); + + if ( strcmp ( config_value, "enable" ) == 0 ) { + mbVppCfg_pqmode_depend_bklight = true; + } else { + mbVppCfg_pqmode_depend_bklight = false; + } + + config_value = config_get_str ( "TV", "vpp.color.temp.bysource", "enable" ); + + if ( strcmp ( config_value, "enable" ) == 0 ) { + mbVppCfg_colortemp_by_source = true; + } else { + mbVppCfg_colortemp_by_source = true; + } + + config_value = config_get_str ( "TV", "vpp.panoroma.switch", "null" ); + + if ( strcmp ( config_value, "enable" ) == 0 ) { + mbVppCfg_panorama_switch = true; + } else { + mbVppCfg_panorama_switch = false; + } + + config_value = config_get_str ( "TV", "vpp.backlight.reverse", "null" ); + + if ( strcmp ( config_value, "enable" ) == 0 ) { + mbVppCfg_backlight_reverse = true; + } else { + mbVppCfg_backlight_reverse = false; + } + + config_value = config_get_str ( "TV", "vpp.backlight.init", "null" ); + + if ( strcmp ( config_value, "enable" ) == 0 ) { + mbVppCfg_backlight_init = true; + } else { + mbVppCfg_backlight_init = false; + } + + config_value = config_get_str ( "TV", "vpp.pqwithout.hue", "null" ); + + if ( strcmp ( config_value, "enable" ) == 0 ) { + mbVppCfg_pqmode_without_hue = true; + } else { + mbVppCfg_pqmode_without_hue = false; + } + + config_value = config_get_str ( "TV", "vpp.hue.reverse", "null" ); + + if ( strcmp ( config_value, "enable" ) == 0 ) { + mbVppCfg_hue_reverse = true; + } else { + mbVppCfg_hue_reverse = false; + } + + config_value = config_get_str ( "TV", "vpp.gamma.onoff", "null" ); + + if ( strcmp ( config_value, "disable" ) == 0 ) { + mbVppCfg_gamma_onoff = true; + } else { + mbVppCfg_gamma_onoff = false; + } + + config_value = config_get_str ( "TV", "vpp.whitebalance.same_param", "null" ); + + if ( strcmp ( config_value, "enable" ) == 0 ) { + mbVppCfg_whitebalance_sameparam = true; + } else { + mbVppCfg_whitebalance_sameparam = false; + } + + config_value = config_get_str ( "TV", "vpp.new.cm", "disable" ); + + if ( strcmp ( config_value, "enable" ) == 0 ) { + mbVppCfg_new_cm = true; + } else { + mbVppCfg_new_cm = false; + } + + config_value = config_get_str ( "TV", "vpp.new.nr", "disable" ); + + if ( strcmp ( config_value, "enable" ) == 0 ) { + mbVppCfg_new_nr = true; + } else { + mbVppCfg_new_nr = false; + } + + return 0; +} + +int CVpp::Vpp_LoadBasicRegs ( tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt ) +{ + am_regs_t regs; + int ret = -1, rangeRet = -1, formatRet = -1, enableFlag = -1; + + if ( source_type == SOURCE_TYPE_HDMI ) { + rangeRet = GetFileAttrIntValue ( "/sys/module/tvin_hdmirx/parameters/rgb_quant_range" ); + formatRet = GetFileAttrIntValue ( "/sys/module/tvin_hdmirx/parameters/cur_colorspace" ); + + if ( rangeRet == LIMIT_RANGE && formatRet == RGB_FORMAT ) { + enableFlag = 1; + } + } + + tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceType ( source_type ); + + if ( mpPqData->getRegValues ( source_port, sig_fmt, is3d, trans_fmt, ®s ) > 0 ) { + if ( Vpp_LoadRegs ( regs ) < 0 ) { + LOGE ( "%s, Vpp_LoadRegs failed!\n", __FUNCTION__ ); + } else { + ret = 0; + } + } else { + LOGE ( "%s getRegValues failed!\n", "Vpp_LoadBasicRegs" ); + } + + if (mpPqData->LoadAllPQData ( source_port, sig_fmt, is3d, trans_fmt, enableFlag ) == 0 ) { + ret = 0; + } else { + LOGE ( "%s, getPQData failed!\n", "Vpp_LoadBasicRegs" ); + ret = -1; + } + + return ret; +} + + + +int CVpp::Vpp_ResetLastVppSettingsSourceType ( void ) +{ + vpp_setting_last_source_type = SOURCE_TYPE_MAX; + vpp_setting_last_sig_fmt = TVIN_SIG_FMT_MAX; + //showbo mark vpp_setting_last_3d_status = STATUS3D_MAX; + vpp_setting_last_trans_fmt = TVIN_TFMT_3D_MAX; + return 0; +} + +int CVpp::VPP3D_DeviceIOCtl ( int request, ... ) +{ + int tmp_ret = -1; + va_list ap; + void *arg; + + if ( vpp_amvideo_3d_fd >= 0 ) { + va_start ( ap, request ); + arg = va_arg ( ap, void * ); + va_end ( ap ); + + tmp_ret = ioctl ( vpp_amvideo_3d_fd, request, arg ); + return tmp_ret; + } + + return -1; +} + +int CVpp::Vpp_GetPQModeValue ( tv_source_input_type_t source_type, vpp_picture_mode_t pq_mode, vpp_pq_para_t *pq_para ) +{ + vpp_pq_para_t parms; + vpp_picture_mode_t real_pq_mode; + + if ( pq_para == NULL ) { + return -1; + } + + if (pq_mode == VPP_PICTURE_MODE_MOVIE) { + real_pq_mode = VPP_PICTURE_MODE_SOFT; + } else if (pq_mode == VPP_PICTURE_MODE_COLORFUL) { + real_pq_mode = VPP_PICTURE_MODE_BRIGHT; + } else { + real_pq_mode = pq_mode; + } + if ( mpPqData->PQ_GetPQModeParams ( source_type, real_pq_mode, pq_para ) == 0 ) { + if ( mbVppCfg_pqmode_without_hue) { + SSMReadHue ( source_type, & ( pq_para->hue ) ); + } + if (pq_mode == VPP_PICTURE_MODE_MOVIE) { + pq_para->brightness -= 10; + pq_para->contrast -= 10; + pq_para->saturation -= 10; + pq_para->sharpness -= 10; + } else if (pq_mode == VPP_PICTURE_MODE_COLORFUL) { + pq_para->brightness += 10; + pq_para->contrast += 10; + pq_para->saturation += 10; + pq_para->sharpness += 10; + } else {} + + } else { + LOGE ( "%s, PQ_GetPQModeParams failed!\n", "Vpp_GetPQModeValue" ); + return -1; + } + + return 0; +} + +int CVpp::Vpp_SetPQParams ( tv_source_input_type_t source_type, vpp_picture_mode_t pq_mode, vpp_pq_para_t pq_para , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt) +{ + int ret = 0, brightness = 50, contrast = 50, saturation = 50, hue = 50, sharnpess = 50; + am_regs_t regs; + int level; + + if ( pq_para.brightness >= 0 && pq_para.brightness <= 100 ) { + if ( mpPqData->PQ_GetBrightnessParams ( source_port, sig_fmt, is3d, trans_fmt, pq_para.brightness, &brightness ) == 0 ) { + } else { + LOGE ( "%s, PQ_GetBrightnessParams error!\n", "Vpp_SetPQParams" ); + } + + ret |= VPP_SetVideoBrightness ( brightness ); + } + + if ( pq_para.contrast >= 0 && pq_para.contrast <= 100 ) { + if ( mpPqData->PQ_GetContrastParams ( source_port, sig_fmt, is3d, trans_fmt, pq_para.contrast, &contrast ) == 0 ) { + } else { + LOGE ( "%s, PQ_GetBrightnessParams error!\n", "Vpp_SetPQParams" ); + } + + ret |= VPP_SetVideoContrast ( contrast ); + } + + if ( pq_para.saturation >= 0 && pq_para.saturation <= 100 ) { + if ( mpPqData->PQ_GetSaturationParams ( source_port, sig_fmt, is3d, trans_fmt, pq_para.saturation, &saturation ) == 0 ) { + + if ( mbVppCfg_hue_reverse) { + pq_para.hue = 100 - pq_para.hue; + } else { + pq_para.hue = pq_para.hue; + } + + if ( mpPqData->PQ_GetHueParams ( source_port, sig_fmt, is3d, trans_fmt, pq_para.hue, &hue ) == 0 ) { + if ( ( source_type == SOURCE_TYPE_TV || source_type == SOURCE_TYPE_AV ) + && ( sig_fmt == TVIN_SIG_FMT_CVBS_NTSC_M || sig_fmt == TVIN_SIG_FMT_CVBS_NTSC_443 ) ) { + } else { + hue = 0; + } + } else { + LOGE ( "%s, PQ_GetHueParams error!\n", "Vpp_SetPQParams" ); + } + } else { + LOGE ( "%s, PQ_GetSaturationParams error!\n", "Vpp_SetPQParams" ); + } + + ret |= VPP_SetVideoSaturationHue ( saturation, hue ); + } + + if ( pq_para.sharpness >= 0 && pq_para.sharpness <= 100) { + level = pq_para.sharpness; + + if ( mpPqData->PQ_GetSharpnessParams ( source_port, sig_fmt, is3d, trans_fmt, level, ®s ) == 0 ) { + if ( Vpp_LoadRegs ( regs ) < 0 ) { + LOGE ( "%s, PQ_GetSharpnessParams failed!\n", "Vpp_SetPQParams" ); + } + } else { + LOGE ( "%s, PQ_GetSharpnessParams failed!\n", "Vpp_SetPQParams" ); + } + } + + if (pq_mode == VPP_PICTURE_MODE_MOVIE) { + ret |= Tv_SetColorTemperature(VPP_COLOR_TEMPERATURE_MODE_WARM, source_type, 1); + } else if (pq_mode == VPP_PICTURE_MODE_COLORFUL) { + ret |= Tv_SetColorTemperature(VPP_COLOR_TEMPERATURE_MODE_COLD, source_type, 1); + } + + return ret; +} + +int CVpp::Vpp_SetPQMode ( vpp_picture_mode_t pq_mode, tv_source_input_type_t source_type , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt) +{ + vpp_pq_para_t pq_para; + int ret = -1; + + if ( pq_mode == VPP_PICTURE_MODE_USER ) { + ret = SSMReadBrightness ( source_type, &pq_para.brightness ); + ret = SSMReadContrast ( source_type, &pq_para.contrast ); + ret = SSMReadSaturation ( source_type, &pq_para.saturation ); + ret = SSMReadHue ( source_type, &pq_para.hue ); + ret = SSMReadSharpness ( source_type, &pq_para.sharpness ); + } /*else if (pq_mode == VPP_PICTURE_MODE_MOVIE) { + ret = Vpp_GetPQModeValue ( source_type, VPP_PICTURE_MODE_SOFT, &pq_para ); + pq_para.brightness -=10; + pq_para.contrast -=10; + pq_para.saturation -=10; + pq_para.sharpness -=10; + } else if (pq_mode == VPP_PICTURE_MODE_COLORFUL) { + ret = Vpp_GetPQModeValue ( source_type, VPP_PICTURE_MODE_BRIGHT, &pq_para ); + pq_para.brightness +=10; + pq_para.contrast +=10; + pq_para.saturation +=10; + pq_para.sharpness +=10; + }*/ else { + ret = Vpp_GetPQModeValue ( source_type, pq_mode, &pq_para ); + } + + ret |= Vpp_SetPQParams ( source_type, pq_mode, pq_para , source_port , sig_fmt , is3d , trans_fmt ); + + return ret; +} + +int CVpp::Tv_SavePQMode ( vpp_picture_mode_t pq_mode, tv_source_input_type_t source_type ) +{ + vpp_pq_para_t pq_para; + int ret = -1; + int tmp_pic_mode = 0; + + tmp_pic_mode = ( int ) pq_mode; + ret = SSMSavePictureMode ( source_type, tmp_pic_mode ); + return ret; +} + +int CVpp::Tv_SetPQMode ( vpp_picture_mode_t pq_mode, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt, is_3d_type_t is3d, int is_save ) +{ + tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceType ( source_type ); + + if ( 0 == Vpp_SetPQMode ( pq_mode, source_type , source_port , sig_fmt , is3d , trans_fmt) ) { + if ( is_save == 1 ) { + return Tv_SavePQMode ( pq_mode, source_type ); + } else { + return 0; + } + } + + LOGE ( "%s, failed!", "Tv_SetPQMode" ); + return -1; +} + +vpp_picture_mode_t CVpp::Tv_GetPQMode ( tv_source_input_type_t source_type ) +{ + vpp_picture_mode_t data = VPP_PICTURE_MODE_STANDARD; + int tmp_pic_mode = 0; + + + SSMReadPictureMode ( source_type, &tmp_pic_mode ); + data = ( vpp_picture_mode_t ) tmp_pic_mode; + + if ( data < VPP_PICTURE_MODE_STANDARD || data >= VPP_PICTURE_MODE_MAX ) { + data = VPP_PICTURE_MODE_STANDARD; + } + + return data; +} + +int CVpp::Vpp_SetColorDemoMode ( vpp_color_demomode_t demomode ) +{ + cm_regmap_t regmap; + unsigned long *temp_regmap; + int i = 0; + int tmp_demo_mode = 0; + vpp_display_mode_t displaymode = VPP_DISPLAY_MODE_MODE43; + + switch ( demomode ) { + case VPP_COLOR_DEMO_MODE_YOFF: + temp_regmap = DemoColorYOffRegMap; + break; + + case VPP_COLOR_DEMO_MODE_COFF: + temp_regmap = DemoColorCOffRegMap; + break; + + case VPP_COLOR_DEMO_MODE_GOFF: + temp_regmap = DemoColorGOffRegMap; + break; + + case VPP_COLOR_DEMO_MODE_MOFF: + temp_regmap = DemoColorMOffRegMap; + break; + + case VPP_COLOR_DEMO_MODE_ROFF: + temp_regmap = DemoColorROffRegMap; + break; + + case VPP_COLOR_DEMO_MODE_BOFF: + temp_regmap = DemoColorBOffRegMap; + break; + + case VPP_COLOR_DEMO_MODE_RGBOFF: + temp_regmap = DemoColorRGBOffRegMap; + break; + + case VPP_COLOR_DEMO_MODE_YMCOFF: + temp_regmap = DemoColorYMCOffRegMap; + break; + + case VPP_COLOR_DEMO_MODE_ALLOFF: + temp_regmap = DemoColorALLOffRegMap; + break; + + case VPP_COLOR_DEMO_MODE_ALLON: + default: + if ( displaymode == VPP_DISPLAY_MODE_MODE43 ) { + temp_regmap = DemoColorSplit4_3RegMap; + } else { + temp_regmap = DemoColorSplitRegMap; + } + + break; + } + + for ( i = 0; i < CM_REG_NUM; i++ ) { + regmap.reg[i] = temp_regmap[i]; + } + + if ( VPP_SetCMRegisterMap ( ®map ) == 0 ) { + tmp_demo_mode = demomode; + LOGD ( "%s, demomode[%d] success.", "Vpp_SetColorDemoMode", demomode ); + return 0; + } + + LOGE ( "%s, demomode[%d] failed.", "Vpp_SetColorDemoMode", demomode ); + return -1; +} + +int CVpp::Vpp_SetBaseColorMode ( vpp_color_basemode_t basemode , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt) +{ + int ret = -1; + am_regs_t regs; + LOGD ( "%s.\n", "Vpp_SetBaseColorMode" ); + + if ( mbVppCfg_new_cm) { + if ( mpPqData->PQ_GetCM2Params ( ( vpp_color_management2_t ) basemode, source_port, sig_fmt, is3d, trans_fmt, ®s ) == 0 ) { + ret = Vpp_LoadRegs ( regs ); + } else { + LOGE ( "PQ_GetCM2Params failed!\n" ); + } + } + + return ret; +} + +int CVpp::Vpp_SetColorTemperatureUser ( vpp_color_temperature_mode_t temp_mode, tv_source_input_type_t source_type ) +{ + tcon_rgb_ogo_t rgbogo; + unsigned int gain_r, gain_g, gain_b; + + if ( SSMReadRGBGainRStart ( 0, &gain_r ) != 0 ) { + return -1; + } + + rgbogo.r_gain = gain_r; + + if ( SSMReadRGBGainGStart ( 0, &gain_g ) != 0 ) { + return -1; + } + + rgbogo.g_gain = gain_g; + + if ( SSMReadRGBGainBStart ( 0, &gain_b ) != 0 ) { + return -1; + } + + rgbogo.b_gain = gain_b; + rgbogo.r_post_offset = 0; + rgbogo.r_pre_offset = 0; + rgbogo.g_post_offset = 0; + rgbogo.g_pre_offset = 0; + rgbogo.b_post_offset = 0; + rgbogo.b_pre_offset = 0; + + if ( VPP_SetRGBOGO ( &rgbogo ) == 0 ) { + return 0; + } + + LOGE ( "%s, source_type_user[%d] failed.", "Vpp_SetColorTemperatureUser", source_type ); + return -1; +} + +int CVpp::Vpp_SetColorTemperature ( vpp_color_temperature_mode_t Tempmode, tv_source_input_type_t source_type, tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt) +{ + tcon_rgb_ogo_t rgbogo, rgbPreOffset; + int ret = -1; + + if ( mbVppCfg_gamma_onoff) { + VPP_SetGammaOnOff ( 0 ); + } else { + VPP_SetGammaOnOff ( 1 ); + } + + GetColorTemperatureParams ( Tempmode, &rgbogo ); + + if ( VPP_SetRGBOGO ( &rgbogo ) == 0 ) { + return 0; + } + + LOGE ( "%s, source_type[%d] failed.", "Vpp_SetColorTemperature", source_type ); + return -1; +} + +int CVpp::Vpp_SetBrightness ( int value, tv_source_input_type_t source_type , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt ) +{ + int ret = -1; + int params; + int level; + + if ( value >= 0 && value <= 100) { + level = value; + LOGD ( "%s.\n", "Vpp_SetBrightness" ); + + if ( mpPqData->PQ_GetBrightnessParams ( source_port, sig_fmt, is3d, trans_fmt, level, ¶ms ) == 0 ) { + if ( VPP_SetVideoBrightness ( params ) == 0 ) { + return 0; + } + } else { + LOGE ( "%s, PQ_GetBrightnessParams failed!\n", "Vpp_SetBrightness" ); + } + } + + return ret; +} + +int CVpp::VPP_SetVideoBrightness ( int value ) +{ + FILE *fp = NULL; + + fp = fopen ( "/sys/class/amvecm/brightness", "w" ); + + LOGD ( "~~~fopen~~~##VPP_SetVideoBrightness##%s : %d ##" , "/sys/class/amvecm/brightness", value); + + if ( fp == NULL ) { + LOGE ( "Open /sys/class/amvecm/brightness error(%s)!\n", strerror ( errno ) ); + return -1; + } + + fprintf ( fp, "%d", value ); + fclose ( fp ); + fp = NULL; + + return 0; +} + +int CVpp::Tv_SetBrightness ( int value, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt, is_3d_type_t is3d, int is_save ) +{ + tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceType ( source_type ); + + if ( 0 == Vpp_SetBrightness ( value, source_type, source_port, sig_fmt, is3d, trans_fmt ) ) { + if ( is_save == 1 ) { + return SSMSaveBrightness ( source_type, value ); + } else { + return 0; + } + } else { + LOGE ( "%s, failed!", "Tv_SetBrightness" ); + return -1; + } + return 0; +} + +int CVpp::Tv_GetBrightness ( tv_source_input_type_t source_type ) +{ + int data = 50; + vpp_pq_para_t pq_para; + vpp_picture_mode_t pq_mode = Tv_GetPQMode ( source_type ); + + if ( pq_mode == VPP_PICTURE_MODE_USER ) { + SSMReadBrightness ( source_type, &data ); + } else { + if ( Vpp_GetPQModeValue ( source_type, pq_mode, &pq_para ) == 0 ) { + data = pq_para.brightness; + } + } + + if ( data < 0 || data > 100 ) { + data = 50; + } + + return data; +} + +int CVpp::Vpp_SetContrast ( int value, tv_source_input_type_t source_type , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt ) +{ + int ret = -1; + int params; + int level; + + if ( value >= 0 && value <= 100 ) { + level = value; + LOGD ( "%s.\n", "Vpp_SetContrast" ); + + if ( mpPqData->PQ_GetContrastParams ( source_port, sig_fmt, is3d, trans_fmt, level, ¶ms ) == 0 ) { + if ( VPP_SetVideoContrast ( params ) == 0 ) { + return 0; + } + } else { + LOGE ( "%s, PQ_GetContrastParams failed!\n", "Vpp_SetContrast" ); + } + } + + return ret; +} + +int CVpp::VPP_SetVideoContrast ( int value ) +{ + FILE *fp = NULL; + + fp = fopen ( "/sys/class/amvecm/contrast", "w" ); + LOGD ( "~~~fopen~~~##VPP_SetVideoContrast##%s : %d ##" , "/sys/class/amvecm/contrast", value); + + if ( fp == NULL ) { + LOGE ( "Open /sys/class/amvecm/contrast error(%s)!\n", strerror ( errno ) ); + return -1; + } + + fprintf ( fp, "%d", value ); + fclose ( fp ); + fp = NULL; + + return 0; +} + +int CVpp::Tv_SetContrast ( int value, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt, is_3d_type_t is3d, int is_save ) +{ + tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceType ( source_type ); + + if ( 0 == Vpp_SetContrast ( value, source_type, source_port, sig_fmt, is3d, trans_fmt ) ) { + if ( is_save == 1 ) { + return SSMSaveContrast ( source_type, value ); + } else { + return 0; + } + } else { + LOGE ( "%s, failed!", "Tv_SetContrast" ); + return -1; + } +} + +int CVpp::Tv_GetContrast ( tv_source_input_type_t source_type ) +{ + int data = 50; + vpp_pq_para_t pq_para; + vpp_picture_mode_t pq_mode = Tv_GetPQMode ( source_type ); + + if ( pq_mode == VPP_PICTURE_MODE_USER ) { + SSMReadContrast ( source_type, &data ); + } else { + if ( Vpp_GetPQModeValue ( source_type, pq_mode, &pq_para ) == 0 ) { + data = pq_para.contrast; + } + } + + if ( data < 0 || data > 100 ) { + data = 50; + } + + return data; +} + +int CVpp::Vpp_SetSaturation ( int value, tv_source_input_type_t source_type , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt ) +{ + int ret = -1; + int params; + int level; + int hue = 0; + + if ( value >= 0 && value <= 100) { + level = value; + + if ( mpPqData->PQ_GetSaturationParams ( source_port, sig_fmt, is3d, trans_fmt, level, ¶ms ) == 0 ) { + if ( VPP_SetVideoSaturationHue ( params, hue ) == 0 ) { + return 0; + } + } else { + } + } + + return ret; +} + +int CVpp::Tv_SetSaturation ( int value, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt, is_3d_type_t is3d, int is_save ) +{ + tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceType ( source_type ); + + if ( 0 == Vpp_SetSaturation ( value, source_type, source_port, sig_fmt, is3d, trans_fmt ) ) { + if ( is_save == 1 ) { + return SSMSaveSaturation ( source_type, value ); + } else { + return 0; + } + } else { + LOGE ( "%s, failed!", "Tv_SetSaturation" ); + return -1; + } +} + +int CVpp::Tv_GetSaturation ( tv_source_input_type_t source_type ) +{ + int data = 50; + vpp_pq_para_t pq_para; + vpp_picture_mode_t pq_mode = Tv_GetPQMode ( source_type ); + + if ( pq_mode == VPP_PICTURE_MODE_USER ) { + SSMReadSaturation ( source_type, &data ); + } else { + if ( Vpp_GetPQModeValue ( source_type, pq_mode, &pq_para ) == 0 ) { + data = pq_para.saturation; + } + } + + if ( data < 0 || data > 100 ) { + data = 50; + } + + return data; +} + +int CVpp::Vpp_SetHue ( int value, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, tvin_port_t source_port, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt ) +{ + int ret = -1; + int params, saturation_params; + int level, saturation_level; + + if ( value >= 0 && value <= 100 ) { + if ( mbVppCfg_hue_reverse) { + level = 100 - value; + } else { + level = value; + } + + if ( mpPqData->PQ_GetHueParams ( source_port, sig_fmt, is3d, trans_fmt, level, ¶ms ) == 0 ) { + saturation_level = Tv_GetSaturation ( source_type ); + + if ( mpPqData->PQ_GetSaturationParams ( source_port, sig_fmt, is3d, trans_fmt, saturation_level, &saturation_params ) == 0 ) { + } else { + saturation_params = -20; + } + + if ( VPP_SetVideoSaturationHue ( saturation_params, params ) == 0 ) { + return 0; + } + } else { + LOGE ( "PQ_GetHueParams failed!\n" ); + } + } + + return ret; +} + +int CVpp::Tv_SetHue ( int value, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt, is_3d_type_t is3d, int is_save ) +{ + tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceType ( source_type ); + + if ( 0 == Vpp_SetHue ( value, source_type, sig_fmt, source_port, is3d, trans_fmt ) ) { + if ( is_save == 1 ) { + return SSMSaveHue ( source_type, value ); + } else { + return 0; + } + } else { + LOGE ( "%s, failed!", "Tv_SetHue" ); + return -1; + } + + return 0; +} + +int CVpp::Tv_GetHue ( tv_source_input_type_t source_type ) +{ + int data = 50; + vpp_pq_para_t pq_para; + vpp_picture_mode_t pq_mode = Tv_GetPQMode ( source_type ); + + if ( pq_mode == VPP_PICTURE_MODE_USER ) { + SSMReadHue ( source_type, &data ); + } else { + if ( Vpp_GetPQModeValue ( source_type, pq_mode, &pq_para ) == 0 ) { + data = pq_para.hue; + } + } + + if ( data < 0 || data > 100 ) { + data = 50; + } + + return data; +} + + + +int CVpp::Vpp_SetSharpness ( int value, tv_source_input_type_t source_type , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt ) +{ + int ret = -1; + am_regs_t regs; + int level; + + if ( value >= 0 && value <= 100 ) { + level = value; + + if ( mpPqData->PQ_GetSharpnessParams ( source_port, sig_fmt, is3d, trans_fmt, level, ®s ) == 0 ) { + if ( Vpp_LoadRegs ( regs ) < 0 ) { + } else { + ret = 0; + } + } else { + } + } + + return ret; +} + +int CVpp::Tv_SetSharpness ( int value, tv_source_input_type_t source_type, int is_enable, is_3d_type_t is3d, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt, int is_save ) +{ + tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceType ( source_type ); + + if ( Vpp_SetSharpness ( value, source_type, source_port, sig_fmt, is3d, trans_fmt) < 0 ) { + LOGE ( "%s, failed!", "Tv_SetSharpness" ); + return -1; + } + + if ( is_save == 1 ) { + if ( is_enable ) { + return SSMSaveSharpness ( source_type, value ); + + } + } + + return 0; +} + +int CVpp::Tv_GetSharpness ( tv_source_input_type_t source_type ) +{ + int data = 50; + vpp_pq_para_t pq_para; + vpp_picture_mode_t pq_mode = Tv_GetPQMode ( source_type ); + + if ( pq_mode == VPP_PICTURE_MODE_USER ) { + SSMReadSharpness ( source_type, &data ); + } else { + if ( Vpp_GetPQModeValue ( source_type, pq_mode, &pq_para ) == 0 ) { + data = pq_para.sharpness; + } + } + + if ( data < 0 || data > 100 ) { + data = 50; + } + + LOGD ( "%s, data[%d].", "Tv_GetSharpness", data ); + return data; +} + +int CVpp::Tv_SetColorSpaceMode ( vpp_color_space_type_t colorSpace ) +{ + int ret = -1, fileRet = -1; + SSMSaveColorSpaceStart ( colorSpace ); + + switch ( colorSpace ) { + case VPP_COLOR_SPACE_RGB: + //marked by haifeng + // SetFileAttrValue ( "/sys/class/register/reg", "wc 0x1da1 0xc" ); + // SetFileAttrValue ( "/sys/class/register/reg", "wc 0x1d70 0x208" ); + // SetFileAttrValue ( "/sys/class/register/reg", "wc 0x1d71 0x74" ); + break; + + case VPP_COLOR_SPACE_YUV: + //marked by haifeng + // SetFileAttrValue ( "/sys/class/register/reg", "wc 0x1da1 0xe" ); + // SetFileAttrValue ( "/sys/class/register/reg", "wc 0x1d70 0x208" ); + // SetFileAttrValue ( "/sys/class/register/reg", "wc 0x1d71 0x76" ); + break; + + default: + break; + } + + return 0; +} + +int CVpp::Vpp_SetNoiseReductionMode ( vpp_noise_reduction_mode_t nr_mode, tv_source_input_type_t source_type , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt ) +{ + int ret = -1; + am_regs_t regs; + + if ( mbVppCfg_new_nr) { + if ( mpPqData->PQ_GetNR2Params ( ( vpp_noise_reduction2_mode_t ) nr_mode, source_port, sig_fmt, is3d, trans_fmt, ®s ) == 0 ) { + ret = Vpp_LoadRegs ( regs ); + } else { + LOGE ( "PQ_GetNR2Params failed!\n" ); + } + } + + return ret; +} + +int CVpp::Tv_SaveNoiseReductionMode ( vpp_noise_reduction_mode_t nr_mode, tv_source_input_type_t source_type ) +{ + int tmp_save_noisereduction_mode = ( int ) nr_mode; + return SSMSaveNoiseReduction ( source_type, tmp_save_noisereduction_mode ); +} + +int CVpp::Tv_SetNoiseReductionMode ( vpp_noise_reduction_mode_t nr_mode, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt, int is_save ) +{ + tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceType ( source_type ); + if ( 0 == Vpp_SetNoiseReductionMode ( nr_mode, source_type, source_port, sig_fmt, is3d, trans_fmt ) ) { + if ( is_save == 1 ) { + return Tv_SaveNoiseReductionMode ( nr_mode, source_type ); + } else { + return 0; + } + } + + LOGE ( "%s, failed!", __FUNCTION__ ); + return -1; +} + +vpp_noise_reduction_mode_t CVpp::Tv_GetNoiseReductionMode ( tv_source_input_type_t source_type ) +{ + vpp_noise_reduction_mode_t data = VPP_NOISE_REDUCTION_MODE_MID; + int tmp_nr_mode = 0; + + SSMReadNoiseReduction ( source_type, &tmp_nr_mode ); + data = ( vpp_noise_reduction_mode_t ) tmp_nr_mode; + + if ( data < VPP_NOISE_REDUCTION_MODE_OFF || data > VPP_NOISE_REDUCTION_MODE_AUTO ) { + data = VPP_NOISE_REDUCTION_MODE_MID; + } + + return data; +} + +int CVpp::Vpp_SetXVYCCMode ( vpp_xvycc_mode_t xvycc_mode, tv_source_input_type_t source_type, tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt ) +{ + int ret = -1; + am_regs_t regs, regs_1; + char prop_value[PROPERTY_VALUE_MAX]; + + memset ( prop_value, '\0', 16 ); + const char *config_value; + config_value = config_get_str ( "TV", "vpp.xvycc.switch_control", "null" ); + + if ( strcmp ( config_value, "enable" ) == 0 ) { + if ( mpPqData->PQ_GetXVYCCParams ( ( vpp_xvycc_mode_t ) xvycc_mode, source_port, sig_fmt, is3d, trans_fmt, ®s , ®s_1) == 0 ) { + ret = Vpp_LoadRegs ( regs ); + ret |= Vpp_LoadRegs ( regs_1 ); + } else { + LOGE ( "PQ_GetXVYCCParams failed!\n" ); + } + } else { + LOGE("disable xvycc!\n"); + } + return ret; +} + + +int CVpp::Vpp_SetMCDIMode ( vpp_mcdi_mode_t mcdi_mode, tv_source_input_type_t source_type , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt) +{ + int ret = -1; + am_regs_t regs; + + if ( mpPqData->PQ_GetMCDIParams ( ( vpp_mcdi_mode_t ) mcdi_mode, source_port, sig_fmt, is3d, trans_fmt, ®s ) == 0 ) { + ret = Vpp_LoadRegs ( regs ); + } else { + LOGE ( "PQ_GetMCDIParams failed!\n" ); + } + return ret; +} + + +int CVpp::Vpp_LoadGammaDefault ( tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt ) +{ + int ret = -1; + int panel_id = 0; + tcon_gamma_table_t gamma_r, gamma_g, gamma_b; + + tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceType ( source_type ); + + LOGD ( "Enter %s.\n", __FUNCTION__ ); + ret = mpPqData->PQ_GetGammaTableR ( panel_id, source_port, sig_fmt, &gamma_r ); + ret |= mpPqData->PQ_GetGammaTableG ( panel_id, source_port, sig_fmt, &gamma_g ); + ret |= mpPqData->PQ_GetGammaTableB ( panel_id, source_port, sig_fmt, &gamma_b ); + + if ( ret == 0 ) { + VPP_SetGammaTbl_R ( ( unsigned short * ) gamma_r.data ); + VPP_SetGammaTbl_G ( ( unsigned short * ) gamma_g.data ); + VPP_SetGammaTbl_B ( ( unsigned short * ) gamma_b.data ); + } else { + LOGE ( "%s, PQ_GetGammaTable failed!", __FUNCTION__ ); + } + + return ret; + +} + +int CVpp::Vpp_LoadGammaSpecial ( int gammaValue ) +{ + int ret = -1; + int panel_id = 0; + tcon_gamma_table_t gamma_r, gamma_g, gamma_b; + + LOGD ( "Enter %s.\n", __FUNCTION__ ); + ret = mpPqData->PQ_GetGammaSpecialTable ( gammaValue, "Red", &gamma_r ); + ret |= mpPqData->PQ_GetGammaSpecialTable ( gammaValue, "Green", &gamma_g ); + ret |= mpPqData->PQ_GetGammaSpecialTable ( gammaValue, "Blue", &gamma_b ); + + if ( ret == 0 ) { + VPP_SetGammaTbl_R ( ( unsigned short * ) gamma_r.data ); + VPP_SetGammaTbl_G ( ( unsigned short * ) gamma_g.data ); + VPP_SetGammaTbl_B ( ( unsigned short * ) gamma_b.data ); + } else { + LOGE ( "%s, PQ_GetGammaSpecialTable failed!", __FUNCTION__ ); + } + + return ret; + +} + +int CVpp::Vpp_LoadGamma ( tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt ) +{ + int gammaValue = 0, ret = -1; + + if ( SSMReadGammaValue ( &gammaValue ) < 0 ) { + LOGE ( "%s, SSMReadGammaValue ERROR, So Load Default GAMMA!\n", __FUNCTION__ ); + ret = Vpp_LoadGammaDefault ( source_type, sig_fmt ); + return -1; + } + + if ( gammaValue < -4 || gammaValue > 4 ) { + LOGE ( "%s, Gamma Value beyond the UI's range of -4 to 4 .\n", __FUNCTION__ ); + gammaValue = 0; + SSMSaveGammaValue ( gammaValue ); + } + + switch ( gammaValue ) { + case 0: + ret = Vpp_LoadGammaDefault ( source_type, sig_fmt ); + break; + + default: + ret = Vpp_LoadGammaSpecial ( gammaValue ); + break; + } + + return ret; +} + +/*int CVpp::Tv_SetGammaValue(int gammaValue) +{ + int ret = -1; + tvin_sig_fmt_t sig_fmt = TVIN_SIG_FMT_NULL; + tv_source_input_type_t source_type = SOURCE_TYPE_TV; + sig_fmt = Tvin_GetSigFormat(); + source_type = Tvin_GetSrcInputType(); + LOGD("%s, source_type = %d, sig_fmt = %d, gammaValue = %d\n", __FUNCTION__, (int)source_type, + (int)sig_fmt, gammaValue); + if (gammaValue >= -4 || gammaValue <= 4) { + switch (gammaValue) { + case 0: + ret = Vpp_LoadGammaDefault(source_type, sig_fmt); + break; + default: + ret = Vpp_LoadGammaSpecial(gammaValue); + break; + } + if (0 == ret) + ret = SSMSaveGammaValue(gammaValue); + } + return ret; +}*/ + +int CVpp::Tv_GetGammaValue() +{ + int gammaValue = 0; + + if ( SSMReadGammaValue ( &gammaValue ) < 0 ) { + LOGE ( "%s, SSMReadGammaValue ERROR!!!\n", __FUNCTION__ ); + return -1; + } + + return gammaValue; +} + +/*int CVpp::Tv_SetColorDemoMode ( vpp_color_demomode_t demomode ) +{ + tv_source_input_type_t source_type = Tvin_GetSrcInputType(); + tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceType ( source_type ); + tvin_sig_fmt_t sig_fmt = Tvin_GetSigFormat(); + is_3d_type_t is3d = Tvin_Get3DStatus(); + tvin_trans_fmt_t trans_fmt = Tvin_GetSigTransFormat(); + + return Tv_SetBaseColorMode ( VPP_COLOR_BASE_MODE_DEMO ,source_port,sig_fmt,status,trans_fmt); +}*/ + +vpp_color_demomode_t CVpp::Tv_GetColorDemoMode ( void ) +{ + vpp_color_demomode_t data = VPP_COLOR_DEMO_MODE_ALLON; + unsigned char tmp_demo_mode = 0; + SSMReadColorDemoMode ( &tmp_demo_mode ); + data = ( vpp_color_demomode_t ) tmp_demo_mode; + + if ( data < VPP_COLOR_DEMO_MODE_ALLON || data > VPP_COLOR_DEMO_MODE_ALLOFF ) { + data = VPP_COLOR_DEMO_MODE_ALLON; + } + + return data; +} + + +int CVpp::Tv_SetBaseColorModeWithoutSave ( vpp_color_basemode_t basemode , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt) +{ + int ret = -1; + am_regs_t regs; + + if ( mbVppCfg_new_cm) { + if ( mpPqData->PQ_GetCM2Params ( ( vpp_color_management2_t ) basemode, source_port, sig_fmt, is3d, trans_fmt, ®s ) == 0 ) { + ret = Vpp_LoadRegs ( regs ); + } else { + LOGE ( "PQ_GetCM2Params failed!\n" ); + } + } + + return ret; +} + +int CVpp::Tv_SaveBaseColorMode ( vpp_color_basemode_t basemode ) +{ + int ret = -1; + + if ( basemode == VPP_COLOR_BASE_MODE_DEMO ) { + ret = 0; + } else { + ret |= SSMSaveColorBaseMode ( basemode ); + } + + return ret; +} + +int CVpp::Tv_SetBaseColorMode ( vpp_color_basemode_t basemode , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt) +{ + if ( 0 == Tv_SetBaseColorModeWithoutSave ( basemode, source_port, sig_fmt, is3d, trans_fmt) ) { + return Tv_SaveBaseColorMode ( basemode ); + } else { + LOGE ( "Tv_SetBaseColorMode() Failed!!!" ); + return -1; + } + return 0; +} + +vpp_color_basemode_t CVpp::Tv_GetBaseColorMode ( void ) +{ + vpp_color_basemode_t data = VPP_COLOR_BASE_MODE_OFF; + unsigned char tmp_base_mode = 0; + SSMReadColorBaseMode ( &tmp_base_mode ); + data = ( vpp_color_basemode_t ) tmp_base_mode; + + if ( data < VPP_COLOR_BASE_MODE_OFF || data >= VPP_COLOR_BASE_MODE_MAX ) { + data = VPP_COLOR_BASE_MODE_OPTIMIZE; + } + + return data; +} + +int CVpp::Tv_SetColorTempWithoutSave ( vpp_color_temperature_mode_t Tempmode, tv_source_input_type_t source_type ) +{ + tcon_rgb_ogo_t rgbogo; + int ret = -1; + + if ( mbVppCfg_whitebalance_sameparam) { + source_type = SOURCE_TYPE_TV; //set all source share to use one group + } + + if ( mbVppCfg_gamma_onoff) { + VPP_SetGammaOnOff ( 0 ); + } else { + VPP_SetGammaOnOff ( 1 ); + } + + GetColorTemperatureParams ( Tempmode, &rgbogo ); + + return VPP_SetRGBOGO ( &rgbogo ); + +} + +int CVpp::Tv_SaveColorTemp ( vpp_color_temperature_mode_t Tempmode, tv_source_input_type_t source_type ) +{ + int ret = -1; + int tmp_temp_mode = 0; + tcon_rgb_ogo_t rgbogo; + + if ( mbVppCfg_whitebalance_sameparam) { + source_type = SOURCE_TYPE_TV; //set all source share to use one group + } + + GetColorTemperatureParams ( Tempmode, &rgbogo ); + + if ( Tempmode < VPP_COLOR_TEMPERATURE_MODE_USER ) { + ret = SSMSaveRGBGainRStart ( 0, rgbogo.r_gain ); + ret |= SSMSaveRGBGainGStart ( 0, rgbogo.g_gain ); + ret |= SSMSaveRGBGainBStart ( 0, rgbogo.b_gain ); + } + + tmp_temp_mode = ( int ) Tempmode; + + if ( mbVppCfg_colortemp_by_source) { + ret |= SSMSaveColorTemperature ( ( int ) source_type, tmp_temp_mode ); + } else { + ret |= SSMSaveColorTemperature ( 0, tmp_temp_mode ); + } + + return ret; +} + +int CVpp::Tv_SetColorTemperature ( vpp_color_temperature_mode_t Tempmode, tv_source_input_type_t source_type, int is_save ) +{ + if ( Tv_SetColorTempWithoutSave ( Tempmode, source_type ) < 0 ) { + LOGE ( "%s, failed!", __FUNCTION__ ); + return -1; + } else { + if ( is_save == 1 ) { + return Tv_SaveColorTemp ( Tempmode, source_type ); + } else { + return 0; + } + } +} + +vpp_color_temperature_mode_t CVpp::Tv_GetColorTemperature ( tv_source_input_type_t source_type ) +{ + vpp_color_temperature_mode_t data = VPP_COLOR_TEMPERATURE_MODE_STANDARD; + int tmp_temp_mode = 0; + + if ( mbVppCfg_colortemp_by_source) { + SSMReadColorTemperature ( ( int ) source_type, &tmp_temp_mode ); + } else { + SSMReadColorTemperature ( 0, &tmp_temp_mode ); + } + + data = ( vpp_color_temperature_mode_t ) tmp_temp_mode; + + if ( data < VPP_COLOR_TEMPERATURE_MODE_STANDARD || data > VPP_COLOR_TEMPERATURE_MODE_USER ) { + data = VPP_COLOR_TEMPERATURE_MODE_STANDARD; + } + + return data; +} + +int CVpp::VPP_SetNonLinearFactor ( int value ) +{ + FILE *fp = NULL; + + fp = fopen ( "/sys/class/video/nonlinear_factor", "w" ); + LOGD ( "~~~fopen~~~##VPP_SetNonLinearFactor##%s : %d ##" , "/sys/class/video/nonlinear_factor", value); + + if ( fp == NULL ) { + LOGE ( "Open /sys/class/video/nonlinear_factor error(%s)!\n", strerror ( errno ) ); + return -1; + } + + fprintf ( fp, "%d", value ); + + fclose ( fp ); + fp = NULL; + + return 0; +} + +vpp_display_mode_t CVpp::Tv_GetDisplayMode ( tv_source_input_type_t source_type ) +{ + vpp_display_mode_t data = VPP_DISPLAY_MODE_169; + int tmp_dis_mode = 0; + + SSMReadDisplayMode ( source_type, &tmp_dis_mode ); + data = ( vpp_display_mode_t ) tmp_dis_mode; + + return data; +} + + + +int CVpp::Tv_SetBacklightWithoutSave ( int value, tv_source_input_type_t source_type ) +{ + int backlight_value, backlight_reverse = 0; + int ret = -1; + int tmp_pic_mode = 0; + + source_type = SOURCE_TYPE_TV; + + if ( value < 0 || value > 100 ) { + value = 100; + } + + if ( mbVppCfg_backlight_reverse) { + backlight_value = ( 100 - value ) * 255 / 100; + } else { + backlight_value = value * 255 / 100; + } + + return VPP_SetBackLightLevel ( backlight_value ); +} + +int CVpp::VPP_SetBackLightLevel ( int value ) +{ + FILE *fp = NULL; + const char *config_value; + + config_value = config_get_str ( "TV", "vpp.backlight.built_in_ctrl", "null" ); + + if ( strcmp ( config_value, "enable" ) == 0 ) { + fp = fopen ( "/sys/class/backlight/aml-bl/brightness", "w" ); + LOGD ( "~~~fopen~~~##VPP_SetBackLightLevel##%s : %d ##" , "/sys/class/backlight/aml-bl/brightness", value); + + if ( fp == NULL ) { + LOGE ( "Open /sys/class/backlight/aml-bl/brightness error(%s)!\n", strerror ( errno ) ); + return -1; + } + + fprintf ( fp, "%d", value ); + + fclose ( fp ); + fp = NULL; + + return 0; + } else { + // TODO : control the backlight through the CEC. + + return 0; + } +} + +int CVpp::Tv_SetBacklight ( int value, tv_source_input_type_t source_type, int is_save ) +{ + if ( Tv_SetBacklightWithoutSave ( value, source_type ) < 0 ) { + LOGE ( "%s, failed !", __FUNCTION__ ); + return -1; + } + + if ( is_save == 1 ) { + return Tv_SaveBacklight ( value, source_type ); + } else { + return 0; + } +} + +int CVpp::Tv_GetBacklight ( tv_source_input_type_t source_type ) +{ + int data = 0; + vpp_pq_para_t pq_para; + + if ( mbVppCfg_pqmode_depend_bklight) { + vpp_picture_mode_t pq_mode = Tv_GetPQMode ( source_type ); + + if ( pq_mode == VPP_PICTURE_MODE_USER ) { + SSMReadBackLightVal ( source_type, &data ); + } else { + Vpp_GetPQModeValue ( source_type, pq_mode, &pq_para ); + data = pq_para.backlight; + } + } else { + source_type = SOURCE_TYPE_TV; + SSMReadBackLightVal ( source_type, &data ); + } + + if ( data < 0 || data > 100 ) { + data = 100; + } + + return data; +} + +int CVpp::Tv_SaveBacklight ( int value, tv_source_input_type_t source_type ) +{ + int backlight_value, backlight_reverse = 0; + int ret = -1; + int tmp_pic_mode = 0; + + if ( !mbVppCfg_pqmode_depend_bklight ) { + source_type = SOURCE_TYPE_TV; + } + + if ( value < 0 || value > 100 ) { + value = 100; + } + + ret = SSMSaveBackLightVal ( source_type, value ); + + + return ret; +} + +int CVpp::Tv_SetDNLP ( tv_source_input_type_t source_type, tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt ) +{ + unsigned int dnlp_switch = 0; + + int ret = -1; + int dnlpFlag = -1; + ve_dnlp_t dnlp; + ve_dnlp_table_t newdnlp; + + dnlp_switch = 1; + + + if ( mpPqData->PQ_GetDNLPParams ( source_port, sig_fmt, is3d, trans_fmt, &dnlp, &newdnlp, &dnlpFlag ) == 0 ) { + newdnlp.en = dnlp_switch; + LOGE ( "PQ_GetDNLPParams ok!\n" ); + LOGE ( "newdnlp.en:%d,newdnlp.method:%d,newdnlp.cliprate:%d,newdnlp.lowrange:%d,newdnlp.hghrange:%d,newdnlp.lowalpha:%d,newdnlp.midalpha:%d,newdnlp.hghalpha:%d\n", + newdnlp.en, newdnlp.method, newdnlp.cliprate, newdnlp.lowrange, newdnlp.hghrange, newdnlp.lowalpha, newdnlp.midalpha, newdnlp.hghalpha); + VPP_SetVENewDNLP ( &newdnlp ); + SetFileAttrValue ( "/sys/module/am_vecm/parameters/dnlp_en", "1" ); + ret = 1; + } else { + LOGE ( "mpPqData->PQ_GetDNLPParams failed!\n" ); + } + + return ret; +} + +int CVpp::VPP_SetVEDNLP ( const struct ve_dnlp_s *pDNLP ) +{ + int rt = VPP_DeviceIOCtl ( AMVECM_IOC_VE_DNLP, pDNLP ); + LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetVEDNLP##AMVECM_IOC_VE_DNLP##" ); + + if ( rt < 0 ) { + LOGE ( "Vpp_api_SetVEDNLP, error(%s)!\n", strerror ( errno ) ); + } + + return rt; +} + +int CVpp::VPP_SetVENewDNLP ( const ve_dnlp_table_t *pDNLP ) +{ + int rt = VPP_DeviceIOCtl ( AMVECM_IOC_VE_NEW_DNLP, pDNLP ); + LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetVENewDNLP##AMVECM_IOC_VE_NEW_DNLP##" ); + + if ( rt < 0 ) { + LOGE ( "VPP_SetVENewDNLP, error(%s)!\n", strerror ( errno ) ); + } + + return rt; +} + +int CVpp::Tv_SetDnlp_OFF ( void ) +{ + if ( Vpp_SetDnlpOff() < 0 ) { + LOGE ( "%s failed.\n", __FUNCTION__ ); + return -1; + } else { + LOGE ( "%s success.\n", __FUNCTION__ ); + SSMSaveDnlpStart ( 1 ); //save dnlp status to e2rom + return 0; + } +} +int CVpp::Tv_SetDnlp_ON ( void ) +{ + if ( Vpp_SetDnlpOn() < 0 ) { + LOGE ( "%s failed.\n", __FUNCTION__ ); + return -1; + } else { + LOGE ( "%s success.\n", __FUNCTION__ ); + SSMSaveDnlpStart ( 0 ); //save dnlp status to e2rom + return 0; + } +} + +int CVpp::Vpp_SetDnlpOff ( void ) +{ + //According linux driver to modify the AMSTREAM_IOC_VE_DNLP_DIS to the AMVECM_IOC_VE_DNLP_DIS. + //int rt = VPP_DeviceIOCtl(AMSTREAM_IOC_VE_DNLP_DIS); + int rt = VPP_DeviceIOCtl ( AMVECM_IOC_VE_DNLP_DIS ); + LOGD ( "~~~VPP_DeviceIOCtl~~~##Vpp_SetDnlpOff##AMVECM_IOC_VE_DNLP_DIS##" ); + + if ( rt < 0 ) { + LOGE ( "Vpp_SetDnlpOff, error(%s)!\n", strerror ( errno ) ); + } + + return rt; +} + +int CVpp::Vpp_SetDnlpOn ( void ) +{ + //According linux driver to modify the AMSTREAM_IOC_VE_DNLP_DIS to the AMVECM_IOC_VE_DNLP_DIS. + //int rt = VPP_DeviceIOCtl(AMSTREAM_IOC_VE_DNLP_EN); + int rt = VPP_DeviceIOCtl ( AMVECM_IOC_VE_DNLP_EN ); + LOGD ( "~~~VPP_DeviceIOCtl~~~##Vpp_SetDnlpOn##AMVECM_IOC_VE_DNLP_EN##" ); + + if ( rt < 0 ) { + LOGE ( "Vpp_SetDnlpOn, error(%s)!\n", strerror ( errno ) ); + } + + return rt; +} +int CVpp::Tv_GetDnlp_Status() +{ + unsigned char status = 0; + SSMReadDnlpStart ( &status ); + LOGD ( "%s, %d.", __FUNCTION__, status ); + return status; +} + +int CVpp::VPP_SetRGBOGO ( const struct tcon_rgb_ogo_s *rgbogo ) +{ + int rt = VPP_DeviceIOCtl ( AMVECM_IOC_S_RGB_OGO, rgbogo ); + LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetRGBOGO##AMVECM_IOC_S_RGB_OGO##" ); + usleep ( 50 * 1000 ); + + if ( rt < 0 ) { + LOGE ( "Vpp_api_SetRGBOGO, error(%s)!\n", strerror ( errno ) ); + } + + return rt; +} + +int CVpp::VPP_GetRGBOGO ( const struct tcon_rgb_ogo_s *rgbogo ) +{ + int rt = VPP_DeviceIOCtl ( AMVECM_IOC_G_RGB_OGO, rgbogo ); + LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_GetRGBOGO##AMVECM_IOC_G_RGB_OGO##" ); + + if ( rt < 0 ) { + LOGE ( "Vpp_api_GetRGBOGO, error(%s)!\n", strerror ( errno ) ); + } + + return rt; +} + +int CVpp::Tv_SetRGBOGO_PostOffset(int rgb, int offset) +{ + tcon_rgb_ogo_t rgbogo; + + if ( VPP_GetRGBOGO ( &rgbogo ) < 0 ) return -1; + switch (rgb) { + case 0://r + rgbogo.r_post_offset = offset; + break; + case 1://g + rgbogo.g_post_offset = offset; + break; + case 2://b + rgbogo.b_post_offset = offset; + break; + default: + break; + } + if ( VPP_SetRGBOGO ( &rgbogo ) != 0 ) return -1; + int ret = 0; + switch (rgb) { + case 0: + ret = SSMSaveRGBPostOffsetRStart ( 0, offset); + break; + case 1: + ret = SSMSaveRGBPostOffsetGStart ( 0, offset); + break; + case 2: + ret = SSMSaveRGBPostOffsetBStart ( 0, offset); + break; + default: + break; + } + return ret; +} + +int CVpp::Tv_SetRGBOGO_Gain(int rgb, int gain) +{ + tcon_rgb_ogo_t rgbogo; + + if ( VPP_GetRGBOGO ( &rgbogo ) < 0 ) return -1; + + switch (rgb) { + case 0://r + rgbogo.r_gain = gain; + break; + case 1://g + rgbogo.g_gain = gain; + break; + case 2://b + rgbogo.b_gain = gain; + break; + default: + break; + } + + if ( VPP_SetRGBOGO ( &rgbogo ) != 0 ) return -1; + + int ret = 0; + switch (rgb) { + case 0: + ret = SSMSaveRGBGainRStart ( 0, gain); + break; + case 1: + ret = SSMSaveRGBGainGStart ( 0, gain); + break; + case 2: + ret = SSMSaveRGBGainBStart ( 0, gain); + break; + default: + break; + } + + return ret; +} + +int CVpp::Tv_GetRGBOGO_PostOffset ( int rgb ) +{ + int offset = 0; + int ret = 0; + switch (rgb) { + case 0: + ret = SSMReadRGBPostOffsetRStart ( 0, &offset ) ; + break; + case 1: + ret = SSMReadRGBPostOffsetGStart ( 0, &offset ) ; + break; + case 2: + ret = SSMReadRGBPostOffsetBStart ( 0, &offset ) ; + break; + default: + break; + } + + if ( offset < -1024 || offset > 1023 ) { + offset = 0; + } + + return offset; +} + +int CVpp::Tv_GetRGBOGO_Gain ( int rgb ) +{ + unsigned int gain = 0; + + int ret = 0; + switch (rgb) { + case 0: + ret = SSMReadRGBGainRStart ( 0, &gain ) ; + break; + case 1: + ret = SSMReadRGBGainGStart ( 0, &gain ) ; + break; + case 2: + ret = SSMReadRGBGainBStart ( 0, &gain ) ; + break; + default: + break; + } + + if ( /*gain_r < 0 || */gain > 2047 ) { + gain = 1024; + } + + return gain; +} + +//RGB GAIN:0~255 <-----> 512~1536 +int CVpp::Tv_RGBGainValueSSMToRisterMapping ( int gainValue ) //0~255 +{ + int mapValue = 0; + + if ( gainValue < 0 || gainValue > 255 ) { + mapValue = 1024; + } else { + if ( gainValue == 255 ) { + mapValue = 1536; + } else { + mapValue = 512 + gainValue * ( 1536 - 512 ) / 256; + } + } + + return mapValue;//512~1536 +} + +//RGB OFFSET:-128~127 <-----> -512~512 +int CVpp::Tv_RGBOffsetValueSSMToRisterMapping ( int offsetValue ) //-128~127 +{ + int mapValue = 0; + + if ( offsetValue < -128 || offsetValue > 127 ) { + offsetValue = 0; + } + + if ( offsetValue == 127 ) { + mapValue = 512; + } else { + mapValue = 1024 * offsetValue / 256; + } + + return mapValue;//-512~512 +} + +int CVpp::Tv_FactorySetPQMode_Brightness ( int source_type, int pq_mode, int brightness ) +{ + int ret = -1; + vpp_pq_para_t pq_para; + + if ( mpPqData->PQ_GetPQModeParams ( ( tv_source_input_type_t ) source_type, ( vpp_picture_mode_t ) pq_mode, &pq_para ) == 0 ) { + pq_para.brightness = brightness; + + if ( mpPqData->PQ_SetPQModeParams ( ( tv_source_input_type_t ) source_type, ( vpp_picture_mode_t ) pq_mode, &pq_para ) == 0 ) { + ret = 0; + } else { + ret = 1; + } + } else { + ret = -1; + } + + return ret; +} + +int CVpp::Tv_FactoryGetPQMode_Brightness ( int source_type, int pq_mode ) +{ + vpp_pq_para_t pq_para; + + if ( mpPqData->PQ_GetPQModeParams ( ( tv_source_input_type_t ) source_type, ( vpp_picture_mode_t ) pq_mode, &pq_para ) != 0 ) { + return -1; + } + + return pq_para.brightness; +} + + +int CVpp::Tv_FactorySetPQMode_Contrast ( int source_type, int pq_mode, int contrast ) +{ + int ret = -1; + vpp_pq_para_t pq_para; + + if ( mpPqData->PQ_GetPQModeParams ( ( tv_source_input_type_t ) source_type, ( vpp_picture_mode_t ) pq_mode, &pq_para ) == 0 ) { + pq_para.contrast = contrast; + + if ( mpPqData->PQ_SetPQModeParams ( ( tv_source_input_type_t ) source_type, ( vpp_picture_mode_t ) pq_mode, &pq_para ) == 0 ) { + ret = 0; + } else { + ret = 1; + } + } else { + ret = -1; + } + + return ret; +} + +int CVpp::Tv_FactoryGetPQMode_Contrast ( int source_type, int pq_mode ) +{ + vpp_pq_para_t pq_para; + + if ( mpPqData->PQ_GetPQModeParams ( ( tv_source_input_type_t ) source_type, ( vpp_picture_mode_t ) pq_mode, &pq_para ) != 0 ) { + return -1; + } + + return pq_para.contrast; +} + +int CVpp::Tv_FactorySetPQMode_Saturation ( int source_type, int pq_mode, int saturation ) +{ + int ret = -1; + vpp_pq_para_t pq_para; + + if ( mpPqData->PQ_GetPQModeParams ( ( tv_source_input_type_t ) source_type, ( vpp_picture_mode_t ) pq_mode, &pq_para ) == 0 ) { + pq_para.saturation = saturation; + + if ( mpPqData->PQ_SetPQModeParams ( ( tv_source_input_type_t ) source_type, ( vpp_picture_mode_t ) pq_mode, &pq_para ) == 0 ) { + ret = 0; + } else { + ret = 1; + } + } else { + ret = -1; + } + + return ret; +} + +int CVpp::Tv_FactoryGetPQMode_Saturation ( int source_type, int pq_mode ) +{ + vpp_pq_para_t pq_para; + + if ( mpPqData->PQ_GetPQModeParams ( ( tv_source_input_type_t ) source_type, ( vpp_picture_mode_t ) pq_mode, &pq_para ) != 0 ) { + return -1; + } + + return pq_para.saturation; +} + +int CVpp::Tv_FactorySetPQMode_Hue ( int source_type, int pq_mode, int hue ) +{ + int ret = -1; + vpp_pq_para_t pq_para; + + if ( mpPqData->PQ_GetPQModeParams ( ( tv_source_input_type_t ) source_type, ( vpp_picture_mode_t ) pq_mode, &pq_para ) == 0 ) { + pq_para.hue = hue; + + if ( mpPqData->PQ_SetPQModeParams ( ( tv_source_input_type_t ) source_type, ( vpp_picture_mode_t ) pq_mode, &pq_para ) == 0 ) { + ret = 0; + } else { + ret = 1; + } + } else { + ret = -1; + } + + return ret; +} + +int CVpp::Tv_FactoryGetPQMode_Hue ( int source_type, int pq_mode ) +{ + vpp_pq_para_t pq_para; + + if ( mpPqData->PQ_GetPQModeParams ( ( tv_source_input_type_t ) source_type, ( vpp_picture_mode_t ) pq_mode, &pq_para ) != 0 ) { + return -1; + } + + return pq_para.hue; +} + +int CVpp::Tv_FactorySetPQMode_Sharpness ( int source_type, int pq_mode, int sharpness ) +{ + int ret = -1; + vpp_pq_para_t pq_para; + + if ( mpPqData->PQ_GetPQModeParams ( ( tv_source_input_type_t ) source_type, ( vpp_picture_mode_t ) pq_mode, &pq_para ) == 0 ) { + pq_para.sharpness = sharpness; + + if ( mpPqData->PQ_SetPQModeParams ( ( tv_source_input_type_t ) source_type, ( vpp_picture_mode_t ) pq_mode, &pq_para ) == 0 ) { + ret = 0; + } else { + ret = 1; + } + } else { + ret = -1; + } + + return ret; +} + +int CVpp::Tv_FactoryGetPQMode_Sharpness ( int source_type, int pq_mode ) +{ + vpp_pq_para_t pq_para; + + if ( mpPqData->PQ_GetPQModeParams ( ( tv_source_input_type_t ) source_type, ( vpp_picture_mode_t ) pq_mode, &pq_para ) != 0 ) { + return -1; + } + + return pq_para.sharpness; +} + +unsigned short CVpp::CalColorTemperatureParamsChecksum ( void ) +{ + unsigned char data_buf[SSM_CR_RGBOGO_LEN]; + unsigned short sum = 0; + int cnt; + USUC usuc; + + SSMReadRGBOGOValue ( 0, SSM_CR_RGBOGO_LEN, data_buf ); + + for ( cnt = 0; cnt < SSM_CR_RGBOGO_LEN; cnt++ ) { + sum += data_buf[cnt]; + } + + //checksum = 0xff - sum % 0xff; + + LOGD ( "%s, sum = 0x%X.\n", __FUNCTION__, sum ); + + return sum; +} + +int CVpp::SetColorTempParamsChecksum ( void ) +{ + int ret = 0; + USUC usuc; + + usuc.s = CalColorTemperatureParamsChecksum(); + + LOGD ( "%s, sum = 0x%X.\n", __FUNCTION__, usuc.s ); + + ret |= SSMSaveRGBOGOValue ( SSM_CR_RGBOGO_LEN, SSM_CR_RGBOGO_CHKSUM_LEN, usuc.c ); + + return ret; +} +unsigned short CVpp::GetColorTempParamsChecksum ( void ) +{ + USUC usuc; + + SSMReadRGBOGOValue ( SSM_CR_RGBOGO_LEN, SSM_CR_RGBOGO_CHKSUM_LEN, usuc.c ); + + LOGD ( "%s, sum = 0x%X.\n", __FUNCTION__, usuc.s ); + + return usuc.s; + +} + +int CVpp::CheckTempDataLable ( void ) +{ + USUC usuc; + USUC ret; + + SSMReadRGBOGOValue ( SSM_CR_RGBOGO_LEN - 2, 2, ret.c ); + + usuc.c[0] = 0x55; + usuc.c[1] = 0xAA; + + if ( ( usuc.c[0] == ret.c[0] ) && ( usuc.c[1] == ret.c[1] ) ) { + LOGD ( "%s, lable ok.\n", __FUNCTION__ ); + return 1; + } else { + LOGD ( "%s, lable error.\n", "TV" ); + return 0; + } +} + +int CVpp::SetTempDataLable ( void ) +{ + USUC usuc; + int ret = 0; + + usuc.c[0] = 0x55; + usuc.c[1] = 0xAA; + + ret = SSMSaveRGBOGOValue ( SSM_CR_RGBOGO_LEN - 2, 2, usuc.c ); + + return ret; +} + +int CVpp::GetColorTemperatureParams ( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t *params ) +{ + // CheckColorTemperatureParamAlldata(source_port,sig_fmt,trans_fmt); + + return ReadColorTemperatureParams ( Tempmode, params ); +} + +int CVpp::ReadColorTemperatureParams ( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t *params ) +{ + SUC suc; + USUC usuc; + int ret = 0; + + if ( VPP_COLOR_TEMPERATURE_MODE_STANDARD == Tempmode ) { //standard + ret |= SSMReadRGBOGOValue ( 0, 2, usuc.c ); + params->en = usuc.s; + + ret |= SSMReadRGBOGOValue ( 2, 2, suc.c ); + params->r_pre_offset = suc.s; + + ret |= SSMReadRGBOGOValue ( 4, 2, suc.c ); + params->g_pre_offset = suc.s; + + ret |= SSMReadRGBOGOValue ( 6, 2, suc.c ); + params->b_pre_offset = suc.s; + + ret |= SSMReadRGBOGOValue ( 8, 2, usuc.c ); + params->r_gain = usuc.s; + + ret |= SSMReadRGBOGOValue ( 10, 2, usuc.c ); + params->g_gain = usuc.s; + + ret |= SSMReadRGBOGOValue ( 12, 2, usuc.c ); + params->b_gain = usuc.s; + + ret |= SSMReadRGBOGOValue ( 14, 2, suc.c ); + params->r_post_offset = suc.s; + + ret |= SSMReadRGBOGOValue ( 16, 2, suc.c ); + params->g_post_offset = suc.s; + + ret |= SSMReadRGBOGOValue ( 18, 2, suc.c ); + params->b_post_offset = suc.s; + } else if ( VPP_COLOR_TEMPERATURE_MODE_WARM == Tempmode ) { //warm + ret |= SSMReadRGBOGOValue ( 20, 2, usuc.c ); + params->en = usuc.s; + + ret |= SSMReadRGBOGOValue ( 22, 2, suc.c ); + params->r_pre_offset = suc.s; + + ret |= SSMReadRGBOGOValue ( 24, 2, suc.c ); + params->g_pre_offset = suc.s; + + ret |= SSMReadRGBOGOValue ( 26, 2, suc.c ); + params->b_pre_offset = suc.s; + + ret |= SSMReadRGBOGOValue ( 28, 2, usuc.c ); + params->r_gain = usuc.s; + ret |= SSMReadRGBOGOValue ( 30, 2, usuc.c ); + params->g_gain = usuc.s; + + ret |= SSMReadRGBOGOValue ( 32, 2, usuc.c ); + params->b_gain = usuc.s; + + ret |= SSMReadRGBOGOValue ( 34, 2, suc.c ); + params->r_post_offset = suc.s; + + ret |= SSMReadRGBOGOValue ( 36, 2, suc.c ); + params->g_post_offset = suc.s; + + ret |= SSMReadRGBOGOValue ( 38, 2, suc.c ); + params->b_post_offset = suc.s; + } else if ( VPP_COLOR_TEMPERATURE_MODE_COLD == Tempmode ) { //cool + ret |= SSMReadRGBOGOValue ( 40, 2, usuc.c ); + params->en = usuc.s; + + ret |= SSMReadRGBOGOValue ( 42, 2, suc.c ); + params->r_pre_offset = suc.s; + + ret |= SSMReadRGBOGOValue ( 44, 2, suc.c ); + params->g_pre_offset = suc.s; + + ret |= SSMReadRGBOGOValue ( 46, 2, suc.c ); + params->b_pre_offset = suc.s; + + ret |= SSMReadRGBOGOValue ( 48, 2, usuc.c ); + params->r_gain = usuc.s; + ret |= SSMReadRGBOGOValue ( 50, 2, usuc.c ); + params->g_gain = usuc.s; + + ret |= SSMReadRGBOGOValue ( 52, 2, usuc.c ); + params->b_gain = usuc.s; + ret |= SSMReadRGBOGOValue ( 54, 2, suc.c ); + params->r_post_offset = suc.s; + + ret |= SSMReadRGBOGOValue ( 56, 2, suc.c ); + params->g_post_offset = suc.s; + + ret |= SSMReadRGBOGOValue ( 58, 2, suc.c ); + params->b_post_offset = suc.s; + } + + LOGD ( "%s, rgain[%d], ggain[%d],bgain[%d],roffset[%d],goffset[%d],boffset[%d]\n", __FUNCTION__, params->r_gain, params->g_gain, + params->b_gain, params->r_post_offset, params->g_post_offset, params->b_post_offset ); + + return ret; +} + +int CVpp::SetColorTemperatureParams ( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t params ) +{ + // CheckColorTemperatureParamAlldata(source_port,sig_fmt,trans_fmt); + + SaveColorTemperatureParams ( Tempmode, params ); + SetColorTempParamsChecksum(); + + return 0; +} + +int CVpp::SaveColorTemperatureParams ( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t params ) +{ + SUC suc; + USUC usuc; + int ret = 0; + + if ( VPP_COLOR_TEMPERATURE_MODE_STANDARD == Tempmode ) { //standard + usuc.s = params.en; + ret |= SSMSaveRGBOGOValue ( 0, 2, usuc.c ); + + suc.s = params.r_pre_offset; + ret |= SSMSaveRGBOGOValue ( 2, 2, suc.c ); + + suc.s = params.g_pre_offset; + ret |= SSMSaveRGBOGOValue ( 4, 2, suc.c ); + + suc.s = params.b_pre_offset; + ret |= SSMSaveRGBOGOValue ( 6, 2, suc.c ); + + usuc.s = params.r_gain; + ret |= SSMSaveRGBOGOValue ( 8, 2, usuc.c ); + + usuc.s = params.g_gain; + ret |= SSMSaveRGBOGOValue ( 10, 2, usuc.c ); + + usuc.s = params.b_gain; + ret |= SSMSaveRGBOGOValue ( 12, 2, usuc.c ); + + suc.s = params.r_post_offset; + ret |= SSMSaveRGBOGOValue ( 14, 2, suc.c ); + + suc.s = params.g_post_offset; + ret |= SSMSaveRGBOGOValue ( 16, 2, suc.c ); + + suc.s = params.b_post_offset; + ret |= SSMSaveRGBOGOValue ( 18, 2, suc.c ); + } else if ( VPP_COLOR_TEMPERATURE_MODE_WARM == Tempmode ) { //warm + usuc.s = params.en; + ret |= SSMSaveRGBOGOValue ( 20, 2, usuc.c ); + + suc.s = params.r_pre_offset; + ret |= SSMSaveRGBOGOValue ( 22, 2, suc.c ); + + suc.s = params.g_pre_offset; + ret |= SSMSaveRGBOGOValue ( 24, 2, suc.c ); + suc.s = params.b_pre_offset; + ret |= SSMSaveRGBOGOValue ( 26, 2, suc.c ); + + usuc.s = params.r_gain; + ret |= SSMSaveRGBOGOValue ( 28, 2, usuc.c ); + + usuc.s = params.g_gain; + ret |= SSMSaveRGBOGOValue ( 30, 2, usuc.c ); + + usuc.s = params.b_gain; + ret |= SSMSaveRGBOGOValue ( 32, 2, usuc.c ); + + suc.s = params.r_post_offset; + ret |= SSMSaveRGBOGOValue ( 34, 2, suc.c ); + + suc.s = params.g_post_offset; + ret |= SSMSaveRGBOGOValue ( 36, 2, suc.c ); + + suc.s = params.b_post_offset; + ret |= SSMSaveRGBOGOValue ( 38, 2, suc.c ); + } else if ( VPP_COLOR_TEMPERATURE_MODE_COLD == Tempmode ) { //cool + usuc.s = params.en; + ret |= SSMSaveRGBOGOValue ( 40, 2, usuc.c ); + + suc.s = params.r_pre_offset; + ret |= SSMSaveRGBOGOValue ( 42, 2, suc.c ); + + suc.s = params.g_pre_offset; + ret |= SSMSaveRGBOGOValue ( 44, 2, suc.c ); + + suc.s = params.b_pre_offset; + ret |= SSMSaveRGBOGOValue ( 46, 2, suc.c ); + + usuc.s = params.r_gain; + ret |= SSMSaveRGBOGOValue ( 48, 2, usuc.c ); + + usuc.s = params.g_gain; + ret |= SSMSaveRGBOGOValue ( 50, 2, usuc.c ); + + usuc.s = params.b_gain; + ret |= SSMSaveRGBOGOValue ( 52, 2, usuc.c ); + + suc.s = params.r_post_offset; + ret |= SSMSaveRGBOGOValue ( 54, 2, suc.c ); + + suc.s = params.g_post_offset; + ret |= SSMSaveRGBOGOValue ( 56, 2, suc.c ); + + suc.s = params.b_post_offset; + ret |= SSMSaveRGBOGOValue ( 58, 2, suc.c ); + } + + LOGD ( "%s, rgain[%d], ggain[%d],bgain[%d],roffset[%d],goffset[%d],boffset[%d]\n", __FUNCTION__, params.r_gain, params.g_gain, + params.b_gain, params.r_post_offset, params.g_post_offset, params.b_post_offset ); + return ret; +} + +int CVpp::CheckColorTemperatureParams ( void ) +{ + int i = 0; + tcon_rgb_ogo_t rgbogo; + + for ( i = 0; i < 3; i++ ) { + ReadColorTemperatureParams ( ( vpp_color_temperature_mode_t ) i, &rgbogo ); + + if ( rgbogo.r_gain > 2047 || rgbogo.b_gain > 2047 || rgbogo.g_gain > 2047 + || rgbogo.r_gain < 0 || rgbogo.b_gain < 0 || rgbogo.g_gain < 0 ) { + if ( rgbogo.r_post_offset > 1023 || rgbogo.g_post_offset > 1023 || rgbogo.b_post_offset > 1023 + || rgbogo.r_post_offset < -1024 || rgbogo.g_post_offset < -1024 || rgbogo.b_post_offset < -1024 ) { + return 0; + } + } + } + + return 1; +} + +int CVpp::RestoeColorTemperatureParamsFromDB ( tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt ) +{ + int i = 0; + tcon_rgb_ogo_t rgbogo; + + LOGD ( "%s, restore color temperature params from DB.\n", __FUNCTION__ ); + + for ( i = 0; i < 3; i++ ) { + mpPqData->PQ_GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) i, source_port, sig_fmt, trans_fmt, &rgbogo ); + SaveColorTemperatureParams ( ( vpp_color_temperature_mode_t ) i, rgbogo ); + } + + SetColorTempParamsChecksum(); + + return 0; +} + +int CVpp::CheckColorTemperatureParamAlldata ( tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt ) +{ + if ( CheckTempDataLable() && ( CalColorTemperatureParamsChecksum() == GetColorTempParamsChecksum() ) ) { + LOGD ( "%s, color temperature param lable & checksum ok.\n", __FUNCTION__ ); + + if ( CheckColorTemperatureParams() == 0 ) { + LOGD ( "%s, color temperature params check failed.\n", __FUNCTION__ ); + RestoeColorTemperatureParamsFromDB(source_port, sig_fmt, trans_fmt); + } + } else { + LOGD ( "%s, color temperature param data error.\n", __FUNCTION__ ); + + SetTempDataLable(); + RestoeColorTemperatureParamsFromDB(source_port, sig_fmt, trans_fmt); + } + + return 0; +} + +int CVpp::Tv_FactorySetColorTemp_Rgain ( int source_type, int colortemp_mode, int rgain ) +{ + tcon_rgb_ogo_t rgbogo; + + GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, &rgbogo ); + rgbogo.r_gain = rgain; + LOGD ( "%s, source_type[%d], colortemp_mode[%d], rgain[%d].", __FUNCTION__, source_type, colortemp_mode, rgain ); + rgbogo.en = 1; + + if ( VPP_SetRGBOGO ( &rgbogo ) == 0 ) { + return 0; + } + + return -1; +} + +int CVpp::Tv_FactorySaveColorTemp_Rgain ( int source_type, int colortemp_mode, int rgain ) +{ + tcon_rgb_ogo_t rgbogo; + + if ( 0 == GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, &rgbogo ) ) { + rgbogo.r_gain = rgain; + return SetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, rgbogo ); + } + + LOGE ( "Tv_FactorySaveColorTemp_Rgain error!\n" ); + return -1; +} + +int CVpp::Tv_FactoryGetColorTemp_Rgain ( int source_type, int colortemp_mode ) +{ + tcon_rgb_ogo_t rgbogo; + + if ( 0 == GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, &rgbogo ) ) { + return rgbogo.r_gain; + } + + LOGE ( "Tv_FactoryGetColorTemp_Rgain error!\n" ); + return -1; +} + +int CVpp::Tv_FactorySetColorTemp_Ggain ( int source_type, int colortemp_mode, int ggain ) +{ + tcon_rgb_ogo_t rgbogo; + + GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, &rgbogo ); + rgbogo.g_gain = ggain; + LOGD ( "%s, source_type[%d], colortemp_mode[%d], ggain[%d].", __FUNCTION__, source_type, colortemp_mode, ggain ); + rgbogo.en = 1; + + if ( VPP_SetRGBOGO ( &rgbogo ) == 0 ) { + return 0; + } + + return -1; +} + +int CVpp::Tv_FactorySaveColorTemp_Ggain ( int source_type, int colortemp_mode, int ggain ) +{ + tcon_rgb_ogo_t rgbogo; + + if ( 0 == GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, &rgbogo ) ) { + rgbogo.g_gain = ggain; + return SetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, rgbogo ); + } + + LOGE ( "Tv_FactorySaveColorTemp_Ggain error!\n" ); + return -1; +} + +int CVpp::Tv_FactoryGetColorTemp_Ggain ( int source_type, int colortemp_mode ) +{ + tcon_rgb_ogo_t rgbogo; + + if ( 0 == GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, &rgbogo ) ) { + return rgbogo.g_gain; + } + + LOGE ( "Tv_FactoryGetColorTemp_Ggain error!\n" ); + return -1; +} + +int CVpp::Tv_FactorySetColorTemp_Bgain ( int source_type, int colortemp_mode, int bgain ) +{ + tcon_rgb_ogo_t rgbogo; + + GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, &rgbogo ); + rgbogo.b_gain = bgain; + LOGD ( "%s, source_type[%d], colortemp_mode[%d], bgain[%d].", __FUNCTION__, source_type, colortemp_mode, bgain ); + rgbogo.en = 1; + + if ( VPP_SetRGBOGO ( &rgbogo ) == 0 ) { + return 0; + } + + return -1; +} + +int CVpp::Tv_FactorySaveColorTemp_Bgain ( int source_type, int colortemp_mode, int bgain ) +{ + tcon_rgb_ogo_t rgbogo; + + if ( 0 == GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, &rgbogo ) ) { + rgbogo.b_gain = bgain; + return SetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, rgbogo ); + } + + LOGE ( "Tv_FactorySaveColorTemp_Bgain error!\n" ); + return -1; +} + +int CVpp::Tv_FactoryGetColorTemp_Bgain ( int source_type, int colortemp_mode ) +{ + tcon_rgb_ogo_t rgbogo; + + if ( 0 == GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, &rgbogo ) ) { + return rgbogo.b_gain; + } + + LOGE ( "Tv_FactoryGetColorTemp_Bgain error!\n" ); + return -1; +} + +int CVpp::Tv_FactorySetColorTemp_Roffset ( int source_type, int colortemp_mode, int roffset ) +{ + tcon_rgb_ogo_t rgbogo; + + GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, &rgbogo ); + rgbogo.r_post_offset = roffset; + LOGD ( "%s, source_type[%d], colortemp_mode[%d], r_post_offset[%d].", __FUNCTION__, source_type, colortemp_mode, roffset ); + rgbogo.en = 1; + + if ( VPP_SetRGBOGO ( &rgbogo ) == 0 ) { + return 0; + } + + return -1; +} + +int CVpp::Tv_FactorySaveColorTemp_Roffset ( int source_type, int colortemp_mode, int roffset ) +{ + tcon_rgb_ogo_t rgbogo; + + if ( 0 == GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, &rgbogo ) ) { + rgbogo.r_post_offset = roffset; + return SetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, rgbogo ); + } + + LOGE ( "Tv_FactorySaveColorTemp_Roffset error!\n" ); + return -1; +} + +int CVpp::Tv_FactoryGetColorTemp_Roffset ( int source_type, int colortemp_mode ) +{ + tcon_rgb_ogo_t rgbogo; + + if ( 0 == GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, &rgbogo ) ) { + return rgbogo.r_post_offset; + } + + LOGE ( "Tv_FactoryGetColorTemp_Roffset error!\n" ); + return -1; +} + +int CVpp::Tv_FactorySetColorTemp_Goffset ( int source_type, int colortemp_mode, int goffset ) +{ + tcon_rgb_ogo_t rgbogo; + + GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, &rgbogo ); + rgbogo.g_post_offset = goffset; + LOGD ( "%s, source_type[%d], colortemp_mode[%d], g_post_offset[%d].", __FUNCTION__, source_type, colortemp_mode, goffset ); + rgbogo.en = 1; + + if ( VPP_SetRGBOGO ( &rgbogo ) == 0 ) { + return 0; + } + + return -1; +} + +int CVpp::Tv_FactorySaveColorTemp_Goffset ( int source_type, int colortemp_mode, int goffset ) +{ + tcon_rgb_ogo_t rgbogo; + + if ( 0 == GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, &rgbogo ) ) { + rgbogo.g_post_offset = goffset; + return SetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, rgbogo ); + } + + LOGE ( "Tv_FactorySaveColorTemp_Goffset error!\n" ); + return -1; +} + +int CVpp::Tv_FactoryGetColorTemp_Goffset ( int source_type, int colortemp_mode ) +{ + tcon_rgb_ogo_t rgbogo; + + if ( 0 == GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, &rgbogo ) ) { + return rgbogo.g_post_offset; + } + + LOGE ( "Tv_FactoryGetColorTemp_Goffset error!\n" ); + return -1; +} + +int CVpp::Tv_FactorySetColorTemp_Boffset ( int source_type, int colortemp_mode, int boffset ) +{ + tcon_rgb_ogo_t rgbogo; + + GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, &rgbogo ); + rgbogo.b_post_offset = boffset; + LOGD ( "%s, source_type[%d], colortemp_mode[%d], b_post_offset[%d].", __FUNCTION__, source_type, colortemp_mode, boffset ); + rgbogo.en = 1; + + if ( VPP_SetRGBOGO ( &rgbogo ) == 0 ) { + return 0; + } + + return -1; +} + +int CVpp::Tv_FactorySaveColorTemp_Boffset ( int source_type, int colortemp_mode, int boffset ) +{ + tcon_rgb_ogo_t rgbogo; + + if ( 0 == GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, &rgbogo ) ) { + rgbogo.b_post_offset = boffset; + return SetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, rgbogo ); + } + + LOGE ( "Tv_FactorySaveColorTemp_Boffset error!\n" ); + return -1; +} + +int CVpp::Tv_FactoryGetColorTemp_Boffset ( int source_type, int colortemp_mode ) +{ + tcon_rgb_ogo_t rgbogo; + + if ( 0 == GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, &rgbogo ) ) { + return rgbogo.b_post_offset; + } + + LOGE ( "Tv_FactoryGetColorTemp_Boffset error!\n" ); + return -1; +} + +int CVpp::Tv_FactoryGetTestPattern ( void ) +{ + unsigned char data = VPP_TEST_PATTERN_NONE; + SSMReadTestPattern ( &data ); + return data; +} + +int CVpp::Tv_FactoryResetPQMode ( void ) +{ + mpPqData->PQ_ResetAllPQModeParams(); + return 0; +} + +int CVpp::Tv_FactoryResetNonlinear ( void ) +{ + mpPqData->PQ_ResetAllNoLineParams(); + return 0; +} + +int CVpp::Tv_FactoryResetColorTemp ( void ) +{ + mpPqData->PQ_ResetAllColorTemperatureParams(); + return 0; +} + +int CVpp::Tv_FactorySetParamsDefault ( void ) +{ + Tv_FactoryResetPQMode(); + Tv_FactoryResetNonlinear(); + Tv_FactoryResetColorTemp(); + mpPqData->PQ_ResetAllOverscanParams(); + return 0; +} + +int CVpp::Tv_FactorySetDDRSSC ( int step ) +{ + int ret = -1; + + switch ( step ) { + case 1: + // ret = Tv_MiscRegs ( "wc 0x14e6 0x0000ac86" ); + break; + + case 2: + // ret = Tv_MiscRegs ( "wc 0x14e6 0x0000ac85" ); + break; + + case 3: + // ret = Tv_MiscRegs ( "wc 0x14e6 0x0000ac75" ); + break; + + case 4: + // ret = Tv_MiscRegs ( "wc 0x14e6 0x0000ac65" ); + break; + + case 5: + // ret = Tv_MiscRegs ( "wc 0x14e6 0x0000acb3" ); + break; + + case 0: + default: + // ret = Tv_MiscRegs ( "wc 0x14e6 0x0000ac24" ); + break; + } + + if ( ret < 0 ) { + return -1; + } + + return SSMSaveDDRSSC ( step ); +} + +int CVpp::Tv_FactoryGetDDRSSC ( void ) +{ + unsigned char data = 0; + SSMReadDDRSSC ( &data ); + return data; +} + +int CVpp::Tv_FactorySetLVDSSSC ( int step ) +{ + int ret = -1; + + switch ( step ) { + case 1: + // ret = Tv_MiscRegs ( "wc 0x109e 0x4d625012" ); + // ret |= Tv_MiscRegs ( "wc 0x109f 0x36130" ); + break; + + case 2: + // ret = Tv_MiscRegs ( "wc 0x109e 0x2d425012" ); + // ret |= Tv_MiscRegs ( "wc 0x109f 0x36130" ); + break; + + case 3: + // ret = Tv_MiscRegs ( "wc 0x109e 0x1d425012" ); + // ret |= Tv_MiscRegs ( "wc 0x109f 0x36130" ); + break; + + case 4: + // ret = Tv_MiscRegs ( "wc 0x109e 0x0d125012" ); + // ret |= Tv_MiscRegs ( "wc 0x109f 0x36130" ); + break; + + case 5: + // ret = Tv_MiscRegs ( "wc 0x109e 0x0e425012" ); + // ret |= Tv_MiscRegs ( "wc 0x109f 0x36130" ); + break; + + case 0: + default: + // ret = Tv_MiscRegs ( "wc 0x109e 0x6d625012" ); + // ret |= Tv_MiscRegs ( "wc 0x109f 0x36130" ); + break; + } + + if ( ret < 0 ) { + return -1; + } + + return SSMSaveLVDSSSC ( step ); +} + +int CVpp::Tv_FactoryGetLVDSSSC ( void ) +{ + unsigned char data = 0; + SSMReadLVDSSSC ( &data ); + return data; +} + +noline_params_t CVpp::Tv_FactoryGetNolineParams ( int type, int source_type ) +{ + int ret = -1; + noline_params_t noline_params; + + memset ( &noline_params, 0, sizeof ( noline_params_t ) ); + + switch ( type ) { + case NOLINE_PARAMS_TYPE_BRIGHTNESS: + ret = mpPqData->PQ_GetNoLineAllBrightnessParams ( ( tv_source_input_type_t ) source_type, &noline_params.osd0, &noline_params.osd25, &noline_params.osd50, &noline_params.osd75, &noline_params.osd100 ); + + case NOLINE_PARAMS_TYPE_CONTRAST: + ret = mpPqData->PQ_GetNoLineAllContrastParams ( ( tv_source_input_type_t ) source_type, &noline_params.osd0, &noline_params.osd25, &noline_params.osd50, &noline_params.osd75, &noline_params.osd100 ); + + case NOLINE_PARAMS_TYPE_SATURATION: + ret = mpPqData->PQ_GetNoLineAllSaturationParams ( ( tv_source_input_type_t ) source_type, &noline_params.osd0, &noline_params.osd25, &noline_params.osd50, &noline_params.osd75, &noline_params.osd100 ); + + case NOLINE_PARAMS_TYPE_HUE: + ret = mpPqData->PQ_GetNoLineAllHueParams ( ( tv_source_input_type_t ) source_type, &noline_params.osd0, &noline_params.osd25, &noline_params.osd50, &noline_params.osd75, &noline_params.osd100 ); + + case NOLINE_PARAMS_TYPE_SHARPNESS: + ret = mpPqData->PQ_GetNoLineAllSharpnessParams ( ( tv_source_input_type_t ) source_type, &noline_params.osd0, &noline_params.osd25, &noline_params.osd50, &noline_params.osd75, &noline_params.osd100 ); + + case NOLINE_PARAMS_TYPE_VOLUME: + ret = mpPqData->PQ_GetNoLineAllVolumeParams ( ( tv_source_input_type_t ) source_type, &noline_params.osd0, &noline_params.osd25, &noline_params.osd50, &noline_params.osd75, &noline_params.osd100 ); + + default: + break; + } + + return noline_params; +} + +int CVpp::Tv_FactorySetNolineParams ( int type, int source_type, noline_params_t noline_params ) +{ + int ret = -1; + + switch ( type ) { + case NOLINE_PARAMS_TYPE_BRIGHTNESS: + ret = mpPqData->PQ_SetNoLineAllBrightnessParams ( ( tv_source_input_type_t ) source_type, noline_params.osd0, noline_params.osd25, noline_params.osd50, noline_params.osd75, noline_params.osd100 ); + break; + + case NOLINE_PARAMS_TYPE_CONTRAST: + ret = mpPqData->PQ_SetNoLineAllContrastParams ( ( tv_source_input_type_t ) source_type, noline_params.osd0, noline_params.osd25, noline_params.osd50, noline_params.osd75, noline_params.osd100 ); + break; + + case NOLINE_PARAMS_TYPE_SATURATION: + ret = mpPqData->PQ_SetNoLineAllSaturationParams ( ( tv_source_input_type_t ) source_type, noline_params.osd0, noline_params.osd25, noline_params.osd50, noline_params.osd75, noline_params.osd100 ); + + case NOLINE_PARAMS_TYPE_HUE: + ret = mpPqData->PQ_SetNoLineAllHueParams ( ( tv_source_input_type_t ) source_type, noline_params.osd0, noline_params.osd25, noline_params.osd50, noline_params.osd75, noline_params.osd100 ); + + case NOLINE_PARAMS_TYPE_SHARPNESS: + ret = mpPqData->PQ_SetNoLineAllSharpnessParams ( ( tv_source_input_type_t ) source_type, noline_params.osd0, noline_params.osd25, noline_params.osd50, noline_params.osd75, noline_params.osd100 ); + + case NOLINE_PARAMS_TYPE_VOLUME: + ret = mpPqData->PQ_SetNoLineAllVolumeParams ( ( tv_source_input_type_t ) source_type, noline_params.osd0, noline_params.osd25, noline_params.osd50, noline_params.osd75, noline_params.osd100 ); + + default: + break; + } + + return ret; +} + +int CVpp::Tv_FactorySetOverscan ( int source_type, int fmt, int status_3d, int trans_fmt, tvin_cutwin_t cutwin_t ) +{ + int ret = -1; + ret = mpPqData->PQ_SetOverscanParams ( ( tv_source_input_type_t ) source_type, ( tvin_sig_fmt_t ) fmt, INDEX_2D, ( tvin_trans_fmt_t ) trans_fmt, cutwin_t ); + + if ( ret == 0 ) { + } else { + LOGE ( "%s, PQ_SetOverscanParams fail.\n", __FUNCTION__ ); + } + return ret; +} + +tvin_cutwin_t CVpp::Tv_FactoryGetOverscan ( int source_type, int fmt, is_3d_type_t is3d, int trans_fmt ) +{ + int ret = -1; + tvin_cutwin_t cutwin_t; + memset ( &cutwin_t, 0, sizeof ( cutwin_t ) ); + + if ( trans_fmt < TVIN_TFMT_2D || trans_fmt > TVIN_TFMT_3D_LDGD ) { + return cutwin_t; + } + + ret = mpPqData->PQ_GetOverscanParams ( ( tv_source_input_type_t ) source_type, ( tvin_sig_fmt_t ) fmt, is3d, ( tvin_trans_fmt_t ) trans_fmt, VPP_DISPLAY_MODE_169, &cutwin_t ); + + if ( ret == 0 ) { + } else { + LOGE ( "%s, PQ_GetOverscanParams faild.\n", __FUNCTION__ ); + } + + return cutwin_t; +} + +int CVpp::Tv_FactorySetBacklightPWM_Frequency ( int freq ) +{ + LOGD("%s,Tv_FactorySetBacklightPWM_Frequency set freq %d .\n", __FUNCTION__, freq); + return 1; +} + +int CVpp::Tv_FactoryGetBacklightPWM_Frequency ( void ) +{ + int freq = 50; + LOGD("%s,Tv_FactoryGetBacklightPWM_Frequency set freq %d .\n", "TV", freq); + return freq; +} + +int CVpp::Tv_FactorySetBacklight_Switch_status ( int status ) +{ + LOGD("%s,Tv_FactorySetBacklight_Switch_status set status %d .\n", __FUNCTION__, status); + return 1; +} + +int CVpp::Tv_FactoryGetBacklight_Switch_status ( void ) +{ + int status = 1; + LOGD("%s,Tv_FactoryGetBacklight_Switch_status get status %d .\n", __FUNCTION__, status); + return status; +} + +int CVpp::Tv_FactorySetBacklightPWM_Duty ( int duty ) +{ + LOGD("%s,Tv_FactorySetBacklight_Switch_status set duty %d .\n", __FUNCTION__, duty); + return 1; +} + +int CVpp::Tv_FactoryGetBacklightPWM_Duty ( void ) +{ + int duty = 1; + LOGD("%s,Tv_FactoryGetBacklight_Switch_status get duty %d .\n", __FUNCTION__, duty); + return duty; +} + +int CVpp::Tv_FactorySetLVDS_ColorDepth ( int depth ) +{ + LOGD("%s,Tv_FactorySetLVDS_ColorDepth set depth %d .\n", "TV", depth); + return 1; +} + +int CVpp::Tv_FactoryGetLVDS_ColorDepth ( void ) +{ + int depth = 1; + LOGD("%s,Tv_FactorySetLVDS_ColorDepth get freq %d .\n", __FUNCTION__, depth); + return depth; +} + +int CVpp::Tv_FactorySetLVDS_ColorDither_status ( int status ) +{ + LOGD("%s,Tv_FactorySetLVDS_ColorDither_status set status %d .\n", __FUNCTION__, status); + return 1; +} + +int CVpp::Tv_FactoryGetLVDS_ColorDither_status ( void ) +{ + int status = 1; + LOGD("%s,Tv_FactoryGetLVDS_ColorDither_status get status %d .\n", __FUNCTION__, status); + return status; +} + +int CVpp::Tv_FactorySetLVDS_Mapping_status ( int status ) +{ + LOGD("%s,Tv_FactorySetLVDS_Mapping_status set status %d .\n", __FUNCTION__, status); + return 1; +} + +int CVpp::Tv_FactoryGetLVDS_Mapping_status ( void ) +{ + int status = 1; + LOGD("%s,Tv_FactoryGetLVDS_Mapping_status get status %d .\n", __FUNCTION__, status); + return status; +} + +int CVpp::Tv_FactorySetLVDS_PortSwap_status ( int status ) +{ + LOGD("%s,Tv_FactorySetLVDS_PortSwap_status set status %d .\n", __FUNCTION__, status); + return 1; +} + +int CVpp::Tv_FactoryGetLVDS_PortSwap_status ( void ) +{ + int status = 1; + LOGD("%s,Tv_FactoryGetLVDS_PortSwap_status get status %d .\n", __FUNCTION__, status); + return status; +} + +int CVpp::VPPSSMRestoreDefault() +{ + int i = 0, tmp_val = 0; + int tmp_panorama_nor = 0, tmp_panorama_full = 0; + int offset_r = 0, offset_g = 0, offset_b = 0, gain_r = 1024, gain_g = 1024, gain_b = 1024; + int8_t std_buf[6] = {0, 0, 0, 0, 0, 0}; + int8_t warm_buf[6] = {0, 0, -8, 0, 0, 0}; + int8_t cold_buf[6] = { -8, 0, 0, 0, 0, 0}; + SSMSaveColorDemoMode ( VPP_COLOR_DEMO_MODE_ALLON ); + SSMSaveColorBaseMode ( VPP_COLOR_BASE_MODE_OPTIMIZE ); + SSMSaveRGBGainRStart ( 0, gain_r ); + SSMSaveRGBGainGStart ( 0, gain_g ); + SSMSaveRGBGainBStart ( 0, gain_b ); + SSMSaveRGBPostOffsetRStart ( 0, offset_r ); + SSMSaveRGBPostOffsetGStart ( 0, offset_g ); + SSMSaveRGBPostOffsetBStart ( 0, offset_b ); + SSMSaveUserNatureLightSwitch ( 1 ); + SSMSaveGammaValue ( 0 ); + SSMSaveGraphyBacklight ( 100 ); + SSMSaveDBCStart ( 0 ); + SSMSaveDnlpStart ( 0 ); //0: ON,1: OFF,default is on + SSMSaveAPL ( 30 ); + SSMSaveAPL2 ( 30 ); + SSMSaveBD ( 30 ); + SSMSaveBP ( 30 ); + + SSMSaveFBCELECmodeVal(11); + SSMSaveFBCN360BackLightVal(10); + SSMSaveFBCN360ColorTempVal(1); // standard colortemp + + for ( i = 0; i < 6; i++ ) { + SSMSaveRGBValueStart ( i + VPP_COLOR_TEMPERATURE_MODE_STANDARD * 6 , std_buf[i] ); //0~5 + SSMSaveRGBValueStart ( i + VPP_COLOR_TEMPERATURE_MODE_WARM * 6, warm_buf[i] ); //6~11 + SSMSaveRGBValueStart ( i + VPP_COLOR_TEMPERATURE_MODE_COLD * 6, cold_buf[i] ); //12~17 + } + + for ( i = 0; i < SOURCE_TYPE_MAX; i++ ) { + if ( i == SOURCE_TYPE_HDMI ) { + SSMSaveColorSpaceStart ( VPP_COLOR_SPACE_AUTO ); + } + + tmp_val = VPP_COLOR_TEMPERATURE_MODE_STANDARD; + tmp_panorama_nor = VPP_PANORAMA_MODE_NORMAL; + tmp_panorama_full = VPP_PANORAMA_MODE_FULL; + + if ( i == SOURCE_TYPE_HDMI ) { + SSMSavePanoramaStart ( i, tmp_panorama_full ); + } else { + SSMSavePanoramaStart ( i, tmp_panorama_nor ); + } + + SSMSaveColorTemperature ( i, tmp_val ); + tmp_val = 50; + SSMSaveBrightness ( i, tmp_val ); + SSMSaveContrast ( i, tmp_val ); + SSMSaveSaturation ( i, tmp_val ); + SSMSaveHue ( i, tmp_val ); + SSMSaveSharpness ( i, tmp_val ); + tmp_val = VPP_PICTURE_MODE_STANDARD; + SSMSavePictureMode ( i, tmp_val ); + tmp_val = VPP_DISPLAY_MODE_169; + SSMSaveDisplayMode ( i, tmp_val ); + tmp_val = VPP_NOISE_REDUCTION_MODE_MID; + SSMSaveNoiseReduction ( i, tmp_val ); + tmp_val = 100; + SSMSaveBackLightVal ( i, tmp_val ); + } + + SSMSaveDDRSSC ( 0 ); + SSMSaveLVDSSSC ( 0 ); + return 0; +} + +int CVpp::VPPSSMFacRestoreDefault() +{ + return VPPSSMRestoreDefault(); +} + +int CVpp::Tv_SetRGBValue ( vpp_color_temperature_mode_t temp_mode, unsigned char data_buf[] ) +{ + int8_t r_gain = 0, b_gain = 0, g_gain = 0, r_offset = 0, g_offset = 0, b_offset = 0; + int ret = -1; + tcon_rgb_ogo_t rgbogo; + rgbogo.en = 1; + rgbogo.r_pre_offset = 0; + rgbogo.g_pre_offset = 0; + rgbogo.b_pre_offset = 0; + r_gain = data_buf[0]; + g_gain = data_buf[1]; + b_gain = data_buf[2]; + r_offset = data_buf[3]; + g_offset = data_buf[4]; + b_offset = data_buf[5]; + int mode = ( int ) temp_mode; + + switch ( mode ) { + case 1: + ret = SSMSaveRGBValueStart ( 0 + mode * 6, r_gain ); + ret |= SSMSaveRGBValueStart ( 1 + mode * 6, g_gain ); + ret |= SSMSaveRGBValueStart ( 2 + mode * 6, b_gain ); + ret |= SSMSaveRGBValueStart ( 3 + mode * 6, r_offset ); + ret |= SSMSaveRGBValueStart ( 4 + mode * 6, g_offset ); + ret |= SSMSaveRGBValueStart ( 5 + mode * 6, b_offset ); + break; + + case 2: + ret = SSMSaveRGBValueStart ( 0 + mode * 6, r_gain ); + ret |= SSMSaveRGBValueStart ( 1 + mode * 6, g_gain ); + ret |= SSMSaveRGBValueStart ( 2 + mode * 6, b_gain ); + ret |= SSMSaveRGBValueStart ( 3 + mode * 6, r_offset ); + ret |= SSMSaveRGBValueStart ( 4 + mode * 6, g_offset ); + ret |= SSMSaveRGBValueStart ( 5 + mode * 6, b_offset ); + break; + + case 0: + default: + ret = SSMSaveRGBValueStart ( 0, r_gain ); + ret |= SSMSaveRGBValueStart ( 1, g_gain ); + ret |= SSMSaveRGBValueStart ( 2, b_gain ); + ret |= SSMSaveRGBValueStart ( 3, r_offset ); + ret |= SSMSaveRGBValueStart ( 4, g_offset ); + ret |= SSMSaveRGBValueStart ( 5, b_offset ); + break; + } + + if ( ret == 0 ) { + rgbogo.r_gain = Tv_RGBGainValueSSMToRisterMapping ( r_gain + 128 ); + rgbogo.g_gain = Tv_RGBGainValueSSMToRisterMapping ( g_gain + 128 ); + rgbogo.b_gain = Tv_RGBGainValueSSMToRisterMapping ( b_gain + 128 ); + rgbogo.r_post_offset = Tv_RGBOffsetValueSSMToRisterMapping ( r_offset ); + rgbogo.g_post_offset = Tv_RGBOffsetValueSSMToRisterMapping ( g_offset ); + rgbogo.b_post_offset = Tv_RGBOffsetValueSSMToRisterMapping ( b_offset ); + ret |= VPP_SetRGBOGO ( &rgbogo ); + } + + return ret; +} + +int CVpp::Tv_GetRGBValue ( vpp_color_temperature_mode_t temp_mode, tcon_rgb_ogo_t *p_rgbogo ) +{ + int8_t r_gain = 0, b_gain = 0, g_gain = 0, r_offset = 0, g_offset = 0, b_offset = 0; + int ret = -1; + + p_rgbogo->en = 1; + p_rgbogo->r_pre_offset = 0; + p_rgbogo->g_pre_offset = 0; + p_rgbogo->b_pre_offset = 0; + p_rgbogo->r_gain = 0; + p_rgbogo->g_gain = 0; + p_rgbogo->b_gain = 0; + p_rgbogo->r_post_offset = 0; + p_rgbogo->g_post_offset = 0; + p_rgbogo->b_post_offset = 0; + int mode = ( int ) temp_mode; + + switch ( mode ) { + case 1: + ret = SSMReadRGBValueStart ( 0 + mode * 6, &r_gain ); + ret |= SSMReadRGBValueStart ( 1 + mode * 6, &g_gain ); + ret |= SSMReadRGBValueStart ( 2 + mode * 6, &b_gain ); + ret |= SSMReadRGBValueStart ( 3 + mode * 6, &r_offset ); + ret |= SSMReadRGBValueStart ( 4 + mode * 6, &g_offset ); + ret |= SSMReadRGBValueStart ( 5 + mode * 6, &b_offset ); + break; + + case 2: + ret = SSMReadRGBValueStart ( 0 + mode * 6, &r_gain ); + ret |= SSMReadRGBValueStart ( 1 + mode * 6, &g_gain ); + ret |= SSMReadRGBValueStart ( 2 + mode * 6, &b_gain ); + ret |= SSMReadRGBValueStart ( 3 + mode * 6, &r_offset ); + ret |= SSMReadRGBValueStart ( 4 + mode * 6, &g_offset ); + ret |= SSMReadRGBValueStart ( 5 + mode * 6, &b_offset ); + break; + + case 0: + default: + ret = SSMReadRGBValueStart ( 0, &r_gain ); + ret |= SSMReadRGBValueStart ( 1, &g_gain ); + ret |= SSMReadRGBValueStart ( 2, &b_gain ); + ret |= SSMReadRGBValueStart ( 3, &r_offset ); + ret |= SSMReadRGBValueStart ( 4, &g_offset ); + ret |= SSMReadRGBValueStart ( 5, &b_offset ); + break; + } + + p_rgbogo->r_gain = r_gain + 128; //r_gain:-128~127 + p_rgbogo->g_gain = g_gain + 128; + p_rgbogo->b_gain = b_gain + 128; + p_rgbogo->r_post_offset = r_offset; + p_rgbogo->g_post_offset = g_offset; + p_rgbogo->b_post_offset = b_offset; + + return ret; +} + +#define PI 3.14159265358979 +void CVpp::video_set_saturation_hue ( signed char saturation, signed char hue, signed long *mab ) +{ + signed short ma = ( signed short ) ( cos ( ( float ) hue * PI / 128.0 ) * ( ( float ) saturation / 128.0 + 1.0 ) * 256.0 ); + signed short mb = ( signed short ) ( sin ( ( float ) hue * PI / 128.0 ) * ( ( float ) saturation / 128.0 + 1.0 ) * 256.0 ); + + if ( ma > 511 ) { + ma = 511; + } + + if ( ma < -512 ) { + ma = -512; + } + + if ( mb > 511 ) { + mb = 511; + } + + if ( mb < -512 ) { + mb = -512; + } + + *mab = ( ( ma & 0x3ff ) << 16 ) | ( mb & 0x3ff ); +} + +void CVpp::video_get_saturation_hue ( signed char *sat, signed char *hue, signed long *mab ) +{ + signed long temp = *mab; + signed int ma = ( signed int ) ( ( temp << 6 ) >> 22 ); + signed int mb = ( signed int ) ( ( temp << 22 ) >> 22 ); + signed int sat16 = ( signed int ) ( ( sqrt ( ( ( float ) ma * ( float ) ma + ( float ) mb * ( float ) mb ) / 65536.0 ) - 1.0 ) * 128.0 ); + signed int hue16 = ( signed int ) ( atan ( ( float ) mb / ( float ) ma ) * 128.0 / PI ); + + if ( sat16 > 127 ) { + sat16 = 127; + } + + if ( sat16 < -128 ) { + sat16 = -128; + } + + if ( hue16 > 127 ) { + hue16 = 127; + } + + if ( hue16 < -128 ) { + hue16 = -128; + } + + *sat = ( signed char ) sat16; + *hue = ( signed char ) hue16; +} + +int CVpp::VPP_SetVideoSaturationHue ( int satVal, int hueVal ) +{ + FILE *fp = NULL; + signed long temp; + + fp = fopen ( "/sys/class/amvecm/saturation_hue", "w" ); + LOGD ( "~~~fopen~~~##VPP_SetVideoSaturationHue##%s : %d %d##" , "/sys/class/amvecm/saturation_hue", satVal, hueVal); + + if ( fp == NULL ) { + LOGE ( "Open /sys/class/amvecm/saturation_hue error(%s)!\n", strerror ( errno ) ); + return -1; + } + + video_set_saturation_hue ( satVal, hueVal, &temp ); + fprintf ( fp, "0x%lx", temp ); + + fclose ( fp ); + fp = NULL; + + return 0; +} + +int CVpp::VPP_SetVideoSaturation ( int saturation ) +{ + FILE *fp = NULL; + + fp = fopen ( "/sys/class/amvecm/saturation_hue", "w" ); + LOGD ( "~~~fopen~~~##VPP_SetVideoSaturation##%s : %d ##" , "/sys/class/amvecm/saturation_hue", saturation); + + if ( fp == NULL ) { + LOGE ( "Open /sys/class/amvecm/saturation_hue error(%s)!\n", strerror ( errno ) ); + return -1; + } + + fprintf ( fp, "0x%x", saturation ); + + fclose ( fp ); + fp = NULL; + + return 0; +} + +int CVpp::VPP_SetVideoHue ( int hue ) +{ + FILE *fp = NULL; + + fp = fopen ( "/sys/class/amvecm/saturation_hue", "w" ); + LOGD ( "~~~fopen~~~##VPP_SetVideoHue##%s : %d ##" , "/sys/class/amvecm/saturation_hue", hue); + + if ( fp == NULL ) { + LOGE ( "Open /sys/class/amvecm/saturation_hue error(%s)!\n", strerror ( errno ) ); + return -1; + } + + fprintf ( fp, "0x%x", hue ); + + fclose ( fp ); + fp = NULL; + return 0; +} + +int CVpp::VPP_SetGammaTbl_R ( unsigned short red[256] ) +{ + struct tcon_gamma_table_s Redtbl; + int rt = -1, i = 0; + + for ( i = 0; i < 256; i++ ) { + Redtbl.data[i] = red[i]; + } + + rt = VPP_DeviceIOCtl ( AMVECM_IOC_GAMMA_TABLE_R, &Redtbl ); + LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetGammaTbl_R##AMVECM_IOC_GAMMA_TABLE_R##" ); + + if ( rt < 0 ) { + LOGE ( "Vpp_api_SetGammaTbl_R, error(%s)!\n", strerror ( errno ) ); + } + + return rt; +} + +int CVpp::VPP_SetGammaTbl_G ( unsigned short green[256] ) +{ + struct tcon_gamma_table_s Greentbl; + int rt = -1, i = 0; + + for ( i = 0; i < 256; i++ ) { + Greentbl.data[i] = green[i]; + } + + rt = VPP_DeviceIOCtl ( AMVECM_IOC_GAMMA_TABLE_G, &Greentbl ); + LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetGammaTbl_G##AMVECM_IOC_GAMMA_TABLE_G##" ); + + if ( rt < 0 ) { + LOGE ( "Vpp_api_SetGammaTbl_R, error(%s)!\n", strerror ( errno ) ); + } + + return rt; +} + +int CVpp::VPP_SetGammaTbl_B ( unsigned short blue[256] ) +{ + struct tcon_gamma_table_s Bluetbl; + int rt = -1, i = 0; + + for ( i = 0; i < 256; i++ ) { + Bluetbl.data[i] = blue[i]; + } + + rt = VPP_DeviceIOCtl ( AMVECM_IOC_GAMMA_TABLE_B, &Bluetbl ); + LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetGammaTbl_B##AMVECM_IOC_GAMMA_TABLE_B##" ); + + if ( rt < 0 ) { + LOGE ( "Vpp_api_SetGammaTbl_R, error(%s)!\n", strerror ( errno ) ); + } + + return rt; +} + +int CVpp::VPP_SetGammaOnOff ( unsigned char onoff ) +{ + int rt = -1; + + if ( onoff == 1 ) { + rt = VPP_DeviceIOCtl ( AMVECM_IOC_GAMMA_TABLE_EN ); + LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetGammaOnOff##AMVECM_IOC_GAMMA_TABLE_EN##" ); + } + + if ( onoff == 0 ) { + rt = VPP_DeviceIOCtl ( AMVECM_IOC_GAMMA_TABLE_DIS ); + LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetGammaOnOff##AMVECM_IOC_GAMMA_TABLE_DIS##" ); + } + + if ( rt < 0 ) { + LOGE ( "Vpp_api_SetGammaOnOff, error(%s)!\n", strerror ( errno ) ); + } + + return rt; +} + +int CVpp::VPP_SetGrayPattern(int value) +{ + + FILE *fp = NULL; + if (value < 0) { + value = 0; + } else if (value > 255) { + value = 255; + } + value = value << 16 | 0x8080; + + fp = fopen ( "/sys/class/video/test_screen", "w" ); + LOGD ( "~~~fopen~~~##VPP_SetGrayPattern##%s : %x ##" , "/sys/class/video/test_screen", value); + + if ( fp == NULL ) { + LOGE ( "Open /sys/classs/video/test_screen error(%s)!\n", strerror ( errno ) ); + return -1; + } + + fprintf ( fp, "0x%x", value ); + fclose ( fp ); + fp = NULL; + + return 0; +} + +int CVpp::VPP_GetGrayPattern() +{ + FILE *fp = NULL; + int value; + fp = fopen ( "/sys/class/video/test_screen", "r+" ); + + LOGD ( "~~~fopen~~~##VPP_GetGrayPattern##%s ##" , "/sys/class/video/test_screen"); + + if ( fp == NULL ) { + LOGE ( "Open /sys/class/video/test_screen error(%s)!\n", strerror ( errno ) ); + return -1; + } + + fscanf ( fp, "%d", &value ); + fclose ( fp ); + fp = NULL; + if (value < 0) { + return 0; + } else { + value = value >> 16; + if (value > 255) { + value = 255; + } + return value; + } + +} + +int CVpp::VPP_SetVideoNoiseReduction ( int value ) +{ + FILE *fp = NULL; + + fp = fopen ( "/sys/class/deinterlace/di0/parameters", "w" ); + LOGD ( "~~~fopen~~~##VPP_SetVideoNoiseReduction##%s : %d ##" , "/sys/class/deinterlace/di0/parameters", value); + + if ( fp == NULL ) { + LOGE ( "Open /sys/class/deinterlace/di0/parameters ERROR(%s)!!\n", strerror ( errno ) ); + return -1; + } + + fprintf ( fp, "noise_reduction_level=%x", value ); + fclose ( fp ); + fp = NULL; + + return 0; +} + +int CVpp::VPP_SetDeinterlaceMode ( int value ) +{ + FILE *fp = NULL; + + fp = fopen ( "/sys/module/deinterlace/parameters/deinterlace_mode", "w" ); + LOGD ( "~~~fopen~~~##VPP_SetDeinterlaceMode##%s : %d ##" , "/sys/module/deinterlace/parameters/deinterlace_mode", value); + + if ( fp == NULL ) { + LOGE ( "Open /sys/module/deinterlace/parameters/deinterlace_mode error(%s)!\n", strerror ( errno ) ); + return -1; + } + + fprintf ( fp, "%d", value ); + + fclose ( fp ); + fp = NULL; + + return 0; +} + +int CVpp::Tv_GetHistogram_AVE ( void ) +{ + ve_hist_t hist; + hist.sum = 0; + hist.height = 0; + hist.width = 0; + hist.ave = 0; + + if ( Vpp_GetAVGHistogram ( &hist ) == 0 ) { + LOGD ( "%s: %d.\n", __FUNCTION__, hist.ave ); + } else { + LOGE ( "%s failed.\n", __FUNCTION__ ); + } + + return hist.ave; +} + +int CVpp::Vpp_GetAVGHistogram ( struct ve_hist_s *hist ) +{ + //int rt = VPP_DeviceIOCtl(AMSTREAM_IOC_G_HIST_AVG, hist); + int rt = VPP_DeviceIOCtl ( AMVECM_IOC_G_HIST_AVG, hist ); + LOGD ( "~~~VPP_DeviceIOCtl~~~##Vpp_GetAVGHistogram##AMVECM_IOC_G_HIST_AVG##" ); + + if ( rt < 0 ) { + LOGE ( "Vpp_GetAVGHistogram, error(%s)!\n", strerror ( errno ) ); + } + + return rt; +} + + +int CVpp::VPP_SetVEBlackExtension ( const struct ve_bext_s *pBExt ) +{ + int rt = VPP_DeviceIOCtl ( AMSTREAM_IOC_VE_BEXT, pBExt ); + LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetVEBlackExtension##AMSTREAM_IOC_VE_BEXT##" ); + + if ( rt < 0 ) { + LOGE ( "Vpp_api_SetVEBlackExtension, error(%s)!\n", strerror ( errno ) ); + } + + return rt; +} + +tvin_cutwin_t CVpp::Tv_GetOverscan ( tv_source_input_type_t source_type, tvin_sig_fmt_t fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt ) +{ + int ret = -1; + char tmp_buf[16]; + tvin_cutwin_t cutwin_t; + memset ( &cutwin_t, 0, sizeof ( cutwin_t ) ); + + if ( trans_fmt < TVIN_TFMT_2D || trans_fmt > TVIN_TFMT_3D_LDGD ) { + return cutwin_t; + } + + if (source_type == SOURCE_TYPE_DTV) { + tmp_buf[0] = 0; + ret = 0; + if ((ret |= cfg_get_one_item("vpp.overscan.dtv", ",", 0, tmp_buf)) == 0) { + cutwin_t.vs = strtol(tmp_buf, NULL, 10); + } + if ((ret |= cfg_get_one_item("vpp.overscan.dtv", ",", 1, tmp_buf)) == 0) { + cutwin_t.hs = strtol(tmp_buf, NULL, 10); + } + if ((ret |= cfg_get_one_item("vpp.overscan.dtv", ",", 2, tmp_buf)) == 0) { + cutwin_t.ve = strtol(tmp_buf, NULL, 10); + } + if ((ret |= cfg_get_one_item("vpp.overscan.dtv", ",", 3, tmp_buf)) == 0) { + cutwin_t.he = strtol(tmp_buf, NULL, 10); + } + + if (ret < 0) { + cutwin_t.vs = 12; + cutwin_t.hs = 27; + cutwin_t.ve = 10; + cutwin_t.he = 24; + } + return cutwin_t; + } + + vpp_display_mode_t scrmode = Tv_GetDisplayMode ( source_type ); + ret = mpPqData->PQ_GetOverscanParams ( source_type, fmt, is3d, trans_fmt, scrmode, &cutwin_t ); + + if ( ret != 0 ) { + LOGW ( "%s, PQ_GetOverscanParams faild.\n", __FUNCTION__ ); + + if ( source_type == SOURCE_TYPE_TV ) { + if ( fmt == TVIN_SIG_FMT_CVBS_NTSC_M + || fmt == TVIN_SIG_FMT_CVBS_NTSC_443 ) { + cutwin_t.hs = 30; + cutwin_t.he = 720 - 30 - 1; + cutwin_t.vs = 2; + cutwin_t.ve = 240 - 2 - 1; + } else if ( fmt >= TVIN_SIG_FMT_CVBS_PAL_I && fmt <= TVIN_SIG_FMT_CVBS_SECAM ) { + cutwin_t.hs = 32; + cutwin_t.he = 720 - 32 - 1; + cutwin_t.vs = 6; + cutwin_t.ve = 288 - 8 - 1; + } + } + } + + return cutwin_t; +} + +int CVpp::VPP_SetVideoCrop ( int Voffset0, int Hoffset0, int Voffset1, int Hoffset1 ) +{ + int fd = -1; + char set_str[32]; + + fd = open ( "/sys/class/video/crop", O_RDWR ); + + LOGD ( "~~~open~~~##VPP_SetVideoCrop##%s : %d %d %d %d##" , "/sys/class/video/crop", Voffset0, Hoffset0, Voffset1, Hoffset1); + + if ( fd < 0 ) { + LOGE ( "Open /sys/class/video/crop error(%s)!\n", strerror ( errno ) ); + return -1; + } + + memset ( set_str, 0, 32 ); + sprintf ( set_str, "%d %d %d %d", Voffset0, Hoffset0, Voffset1, Hoffset1 ); + write ( fd, set_str, strlen ( set_str ) ); + close ( fd ); + + return 0; +} + +int CVpp::VPP_SetVESharpness ( const struct ve_hsvs_s *pHSVS ) +{ + int rt = VPP_DeviceIOCtl ( AMSTREAM_IOC_VE_HSVS, pHSVS ); + LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetVESharpness##AMSTREAM_IOC_VE_HSVS##" ); + + if ( rt < 0 ) { + LOGE ( "Vpp_api_SetVESharpness, error(%s)!\n", strerror ( errno ) ); + } + + return rt; +} + +int CVpp::VPP_SetVEChromaCoring ( const struct ve_ccor_s *pCCor ) +{ + int rt = VPP_DeviceIOCtl ( AMSTREAM_IOC_VE_CCOR, pCCor ); + LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetVEChromaCoring##AMSTREAM_IOC_VE_CCOR##" ); + + if ( rt < 0 ) { + LOGE ( "Vpp_api_SetVEChromaCoring, error(%s)!\n", strerror ( errno ) ); + } + + return rt; +} + +int CVpp::VPP_SetVEBlueEnh ( const struct ve_benh_s *pBEnh ) +{ + int rt = VPP_DeviceIOCtl ( AMSTREAM_IOC_VE_BENH, pBEnh ); + LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetVEBlueEnh##AMSTREAM_IOC_VE_BENH##" ); + + if ( rt < 0 ) { + LOGE ( "Vpp_api_SetVEBlueEnh, error(%s)!\n", strerror ( errno ) ); + } + + return rt; +} + +int CVpp::VPP_SetVEDemo ( const struct ve_demo_s *pDemo ) +{ + int rt = VPP_DeviceIOCtl ( AMSTREAM_IOC_VE_DEMO, pDemo ); + LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetVEDemo##AMSTREAM_IOC_VE_DEMO##" ); + + if ( rt < 0 ) { + LOGE ( "Vpp_api_SetVEDemo, error(%s)!\n", strerror ( errno ) ); + } + + return rt; +} + +int CVpp::VPP_SetVERegisterMap ( const struct ve_regmap_s *pRegMap ) +{ + int rt = VPP_DeviceIOCtl ( AMSTREAM_IOC_VE_REGMAP, pRegMap ); + LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetVERegisterMap##AMSTREAM_IOC_VE_REGMAP##" ); + + if ( rt < 0 ) { + LOGE ( "Vpp_api_SetVERegisterMap, error(%s)!\n", strerror ( errno ) ); + } + + return rt; +} + +int CVpp::VPP_SetVEDebug ( const unsigned long long *pLData ) +{ + int rt = VPP_DeviceIOCtl ( AMSTREAM_IOC_VE_DEBUG, pLData ); + LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetVEDebug##AMSTREAM_IOC_VE_DEBUG##" ); + + if ( rt < 0 ) { + LOGE ( "Vpp_api_SetVEDebug, error(%s)!\n", strerror ( errno ) ); + } + + return rt; +} + +int CVpp::VPP_SetCMRegion ( const struct cm_region_s *pRegion ) +{ + int rt = VPP_DeviceIOCtl ( AMSTREAM_IOC_CM_REGION, pRegion ); + LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetCMRegion##AMSTREAM_IOC_CM_REGION##" ); + + if ( rt < 0 ) { + LOGE ( "Vpp_api_SetCMRegion, error(%s)!\n", strerror ( errno ) ); + } + + return rt; +} + +int CVpp::VPP_SetCMTopLayer ( const struct cm_top_s *pTop ) +{ + int rt = VPP_DeviceIOCtl ( AMSTREAM_IOC_CM_TOP, pTop ); + LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetCMTopLayer##AMSTREAM_IOC_CM_TOP##" ); + + if ( rt < 0 ) { + LOGE ( "Vpp_api_SetCMTopLayer, error(%s)!\n", strerror ( errno ) ); + } + + return rt; +} + +int CVpp::VPP_SetCMDemo ( const struct cm_demo_s *pDemo ) +{ + int rt = VPP_DeviceIOCtl ( AMSTREAM_IOC_CM_DEMO, pDemo ); + LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetCMDemo##AMSTREAM_IOC_CM_DEMO##" ); + + if ( rt < 0 ) { + LOGE ( "Vpp_api_SetCMDemo, error(%s)!\n", strerror ( errno ) ); + } + + return rt; +} + +int CVpp::VPP_SetCMRegisterMap ( struct cm_regmap_s *pRegMap ) +{ + int rt = VPP_DeviceIOCtl ( AMSTREAM_IOC_CM_REGMAP, pRegMap ); + LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetCMRegisterMap##AMSTREAM_IOC_CM_REGMAP##" ); + + if ( rt < 0 ) { + LOGE ( "Vpp_api_SetCMRegisterMap, error(%s)!\n", strerror ( errno ) ); + } + + return rt; +} + +int CVpp::VPP_SetCMDebug ( const unsigned long long *pLData ) +{ + int rt = VPP_DeviceIOCtl ( AMSTREAM_IOC_CM_DEBUG, pLData ); + LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetCMDebug##AMSTREAM_IOC_CM_DEBUG##" ); + + if ( rt < 0 ) { + LOGE ( "=VPP CPP=> set cm debug, error (%s)", strerror ( errno ) ); + } + + return rt; +} + +int CVpp::VPP_SetAVSyncEnable ( const unsigned int enable ) +{ + int rt = VPP_DeviceIOCtl ( AMSTREAM_IOC_SYNCENABLE, enable ); + LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetAVSyncEnable##AMSTREAM_IOC_SYNCENABLE##" ); + + if ( rt < 0 ) { + LOGE ( "Vpp_api_SetAVSyncEnable, error(%s)!\n", strerror ( errno ) ); + } + + return rt; +} diff --git a/tvapi/libtv/vpp/CVpp.h b/tvapi/libtv/vpp/CVpp.h new file mode 100644 index 0000000..abf865d --- a/dev/null +++ b/tvapi/libtv/vpp/CVpp.h @@ -0,0 +1,438 @@ +#ifndef _C_VPP_H +#define _C_VPP_H +#include "amstream.h" +#include "cm.h" +#include "amvecm.h" +#include "pqdata.h" +#include "../tvin/CTvin.h" +#define GLOBAL_OGO_FORMAT_FLAG 0x6688 +#define DEFAULT_RANGE 0 +#define LIMIT_RANGE 1 +#define FULL_RANGE 2 +#define RGB_FORMAT 0 +#define YCbCr_422_FORMAT 1 +#define YCbCr_444_FORMAT 2 +#define PQ_USER_DATA_FROM_E2P 0 +#define PQ_USER_DATA_FROM_DB 1 + +#define VPP_DEV_PATH "/dev/amvecm" +#define VPP_3D_DEV_PATH "/dev/amvideo" + +#define MODE_VPP_3D_DISABLE 0x00000000 +#define MODE_VPP_3D_ENABLE 0x00000001 +#define MODE_VPP_3D_AUTO 0x00000002 +#define MODE_VPP_3D_LR 0x00000004 +#define MODE_VPP_3D_TB 0x00000008 +#define MODE_VPP_3D_LA 0x00000010 +#define MODE_VPP_3D_FA 0x00000020 +#define MODE_VPP_3D_LR_SWITCH 0x00000100 +#define MODE_VPP_3D_TO_2D_L 0x00000200 +#define MODE_VPP_3D_TO_2D_R 0x00000400 + +typedef union tag_suc { + short s; + unsigned char c[2]; +} SUC; + +typedef union tag_usuc { + unsigned short s; + unsigned char c[2]; +} USUC; + +typedef enum is_3d_type_e { + INDEX_3D_INVALID = -1, + INDEX_2D = 0, + INDEX_3D = 1, +} is_3d_type_t; + +typedef enum vpp_panorama_mode_e { + VPP_PANORAMA_MODE_FULL, + VPP_PANORAMA_MODE_NORMAL, + VPP_PANORAMA_MODE_MAX, +} vpp_panorama_mode_t; + +typedef enum vpp_color_space_type_e { + VPP_COLOR_SPACE_AUTO, + VPP_COLOR_SPACE_YUV, + VPP_COLOR_SPACE_RGB, +} vpp_color_space_type_t; + +typedef enum vpp_display_mode_e { + VPP_DISPLAY_MODE_169, + VPP_DISPLAY_MODE_PERSON, + VPP_DISPLAY_MODE_MOVIE, + VPP_DISPLAY_MODE_CAPTION, + VPP_DISPLAY_MODE_MODE43, + VPP_DISPLAY_MODE_FULL, + VPP_DISPLAY_MODE_NORMAL, + VPP_DISPLAY_MODE_NOSCALEUP, + VPP_DISPLAY_MODE_CROP_FULL, + VPP_DISPLAY_MODE_CROP, + VPP_DISPLAY_MODE_ZOOM, + VPP_DISPLAY_MODE_FULL_REAL,//add for N360 by haifeng.liu + VPP_DISPLAY_MODE_MAX, +} vpp_display_mode_t; + +typedef enum vpp_color_demomode_e { + VPP_COLOR_DEMO_MODE_ALLON, + VPP_COLOR_DEMO_MODE_YOFF, + VPP_COLOR_DEMO_MODE_COFF, + VPP_COLOR_DEMO_MODE_GOFF, + VPP_COLOR_DEMO_MODE_MOFF, + VPP_COLOR_DEMO_MODE_ROFF, + VPP_COLOR_DEMO_MODE_BOFF, + VPP_COLOR_DEMO_MODE_RGBOFF, + VPP_COLOR_DEMO_MODE_YMCOFF, + VPP_COLOR_DEMO_MODE_ALLOFF, + VPP_COLOR_DEMO_MODE_MAX, +} vpp_color_demomode_t; + +typedef enum vpp_color_basemode_e { + VPP_COLOR_BASE_MODE_OFF, + VPP_COLOR_BASE_MODE_OPTIMIZE, + VPP_COLOR_BASE_MODE_ENHANCE, + VPP_COLOR_BASE_MODE_DEMO, + VPP_COLOR_BASE_MODE_MAX, +} vpp_color_basemode_t; + +typedef enum vpp_color_management2_e { + VPP_COLOR_MANAGEMENT2_MODE_OFF, + VPP_COLOR_MANAGEMENT2_MODE_OPTIMIZE, + VPP_COLOR_MANAGEMENT2_MODE_ENHANCE, + VPP_COLOR_MANAGEMENT2_MODE_DEMO, + VPP_COLOR_MANAGEMENT2_MODE_MAX, +} vpp_color_management2_t; + +typedef enum vpp_noise_reduction2_mode_e { + VPP_NOISE_REDUCTION2_MODE_OFF, + VPP_NOISE_REDUCTION2_MODE_LOW, + VPP_NOISE_REDUCTION2_MODE_MID, + VPP_NOISE_REDUCTION2_MODE_HIGH, + VPP_NOISE_REDUCTION2_MODE_AUTO, + VPP_NOISE_REDUCTION2_MODE_MAX, +} vpp_noise_reduction2_mode_t; +typedef enum vpp_xvycc_mode_e { + VPP_XVYCC_MODE_OFF, + VPP_XVYCC_MODE_STANDARD, + VPP_XVYCC_MODE_ENHANCE, + VPP_XVYCC_MODE_MAX, +} vpp_xvycc_mode_t; + +typedef enum vpp_mcdi_mode_e { + VPP_MCDI_MODE_OFF, + VPP_MCDI_MODE_STANDARD, + VPP_MCDI_MODE_ENHANCE, + VPP_MCDI_MODE_MAX, +} vpp_mcdi_mode_t; + +typedef enum vpp_picture_mode_e { + VPP_PICTURE_MODE_STANDARD, + VPP_PICTURE_MODE_BRIGHT, + VPP_PICTURE_MODE_SOFT, + VPP_PICTURE_MODE_USER, + VPP_PICTURE_MODE_MOVIE, + VPP_PICTURE_MODE_COLORFUL, + VPP_PICTURE_MODE_MAX, +} vpp_picture_mode_t; + +typedef enum vpp_color_temperature_mode_e { + VPP_COLOR_TEMPERATURE_MODE_STANDARD, + VPP_COLOR_TEMPERATURE_MODE_WARM, + VPP_COLOR_TEMPERATURE_MODE_COLD, + VPP_COLOR_TEMPERATURE_MODE_USER, + VPP_COLOR_TEMPERATURE_MODE_MAX, +} vpp_color_temperature_mode_t; + +typedef enum vpp_noise_reduction_mode_e { + VPP_NOISE_REDUCTION_MODE_OFF, + VPP_NOISE_REDUCTION_MODE_LOW, + VPP_NOISE_REDUCTION_MODE_MID, + VPP_NOISE_REDUCTION_MODE_HIGH, + VPP_NOISE_REDUCTION_MODE_AUTO, + VPP_NOISE_REDUCTION_MODE_MAX, +} vpp_noise_reduction_mode_t; + +typedef enum vpp_test_pattern_e { + VPP_TEST_PATTERN_NONE, + VPP_TEST_PATTERN_RED, + VPP_TEST_PATTERN_GREEN, + VPP_TEST_PATTERN_BLUE, + VPP_TEST_PATTERN_WHITE, + VPP_TEST_PATTERN_BLACK, + VPP_TEST_PATTERN_MAX, +} vpp_test_pattern_e; + +typedef struct vpp_pq_para_s { + int brightness; + int contrast; + int saturation; + int hue; + int sharpness; + int backlight; + int nr; +} vpp_pq_para_t; + +typedef enum noline_params_type_e { + NOLINE_PARAMS_TYPE_BRIGHTNESS, + NOLINE_PARAMS_TYPE_CONTRAST, + NOLINE_PARAMS_TYPE_SATURATION, + NOLINE_PARAMS_TYPE_HUE, + NOLINE_PARAMS_TYPE_SHARPNESS, + NOLINE_PARAMS_TYPE_VOLUME, + NOLINE_PARAMS_TYPE_BACKLIGHT, + NOLINE_PARAMS_TYPE_MAX, +} noline_params_type_t; + +typedef struct noline_params_s { + int osd0; + int osd25; + int osd50; + int osd75; + int osd100; +} noline_params_t; + +typedef enum vpp_dream_panel_e { + VPP_DREAM_PANEL_OFF, + VPP_DREAM_PANEL_LIGHT, + VPP_DREAM_PANEL_SCENE, + VPP_DREAM_PANEL_FULL, + VPP_DREAM_PANEL_DEMO, + VPP_DREAM_PANEL_MAX, +} vpp_dream_panel_t; + +class CPqData; + +class CVpp +{ +public: + CVpp(); + ~CVpp(); + int Vpp_Init ( void ); + int Vpp_Uninit ( void ); + CPqData *getPqData(); + int Vpp_ResetLastVppSettingsSourceType ( void ); + int Vpp_SetColorDemoMode ( vpp_color_demomode_t demomode ); + int Vpp_SetBaseColorMode ( vpp_color_basemode_t basemode , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt); + int Vpp_SetColorTemperatureUser ( vpp_color_temperature_mode_t temp_mode, tv_source_input_type_t source_type ); + int Vpp_SetColorTemperature ( vpp_color_temperature_mode_t Tempmode, tv_source_input_type_t source_type, tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt); + int Vpp_SetBrightness ( int value, tv_source_input_type_t source_type , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt ); + int Vpp_SetContrast ( int value, tv_source_input_type_t source_type , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt ); + int Vpp_SetSaturation ( int value, tv_source_input_type_t source_type , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt ); + int Vpp_SetHue ( int value, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, tvin_port_t source_port, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt ); + int Vpp_SetSharpness ( int value, tv_source_input_type_t source_type , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt ); + int Vpp_SetPQMode ( vpp_picture_mode_t pq_mode, tv_source_input_type_t source_type, tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt ); + int Vpp_SetNoiseReductionMode ( vpp_noise_reduction_mode_t nr_mode, tv_source_input_type_t source_type , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt ); + int Vpp_SetXVYCCMode ( vpp_xvycc_mode_t xvycc_mode, tv_source_input_type_t source_type, tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt ); + int Vpp_SetMCDIMode ( vpp_mcdi_mode_t mcdi_mode, tv_source_input_type_t source_type , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt); + int Vpp_SetZoom ( int value ); + int Vpp_LoadBasicRegs ( tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt ); + int VppRegisterInterface(); + int Tv_RGBGainValueSSMToRisterMapping ( int gainValue ); + int Tv_RGBOffsetValueSSMToRisterMapping ( int gainValue ); + int Tv_SetRGBValue ( vpp_color_temperature_mode_t temp_mode, unsigned char data_buf[] ); + int Tv_GetRGBValue ( vpp_color_temperature_mode_t temp_mode, tcon_rgb_ogo_t *p_rgbogo ); + int Tv_SetColorSpaceMode ( vpp_color_space_type_t colorSpace ); + //int Tv_SetGammaValue(int gammaValue); + int Tv_GetGammaValue(); + //int Tv_SetColorDemoMode ( vpp_color_demomode_t demomode ); + vpp_color_demomode_t Tv_GetColorDemoMode ( void ); + + int Tv_SetBaseColorMode ( vpp_color_basemode_t basemode , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt); + vpp_color_basemode_t Tv_GetBaseColorMode ( void ); + int Tv_SetBaseColorModeWithoutSave ( vpp_color_basemode_t basemode , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt); + int Tv_SaveBaseColorMode ( vpp_color_basemode_t basemode ); + int Tv_SetColorTemperature ( vpp_color_temperature_mode_t Tempmode, tv_source_input_type_t source_type, int is_save ); + vpp_color_temperature_mode_t Tv_GetColorTemperature ( tv_source_input_type_t source_type ); + int Tv_SetColorTempWithoutSave ( vpp_color_temperature_mode_t Tempmode, tv_source_input_type_t source_type ); + int Tv_SaveColorTemp ( vpp_color_temperature_mode_t Tempmode, tv_source_input_type_t source_type ); + int Tv_SetBrightness ( int value, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt, is_3d_type_t is3d, int is_save ); + int Tv_GetBrightness ( tv_source_input_type_t source_type ); + int Tv_SetContrast ( int value, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt, is_3d_type_t is3d, int is_save ); + int Tv_GetContrast ( tv_source_input_type_t source_type ); + int Tv_SetSaturation ( int value, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt, is_3d_type_t is3d, int is_save ); + int Tv_GetSaturation ( tv_source_input_type_t source_type ); + int Tv_SetHue ( int value, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt, is_3d_type_t is3d, int is_save ); + int Tv_GetHue ( tv_source_input_type_t source_type ); + int Tv_SetSharpness ( int value, tv_source_input_type_t source_type, int is_enable, is_3d_type_t is3d, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt, int is_save ); + int Tv_GetSharpness ( tv_source_input_type_t source_type ); + int Tv_SetBacklight ( int value, tv_source_input_type_t source_type, int is_save ); + int Tv_GetBacklight ( tv_source_input_type_t source_type ); + int Tv_SetBacklightWithoutSave ( int value, tv_source_input_type_t source_type ); + int Tv_SaveBacklight ( int value, tv_source_input_type_t source_type ); + int Tv_SetPQMode ( vpp_picture_mode_t pq_mode, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt, is_3d_type_t is3d, int is_save ); + vpp_picture_mode_t Tv_GetPQMode ( tv_source_input_type_t source_type ); + int Tv_SavePQMode ( vpp_picture_mode_t pq_mode, tv_source_input_type_t source_type ); + int Tv_SetDisplayMode ( vpp_display_mode_t display_mode, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, int is_save ); + vpp_display_mode_t Tv_GetDisplayMode ( tv_source_input_type_t source_type ); + int Tv_SaveNoiseReductionMode ( vpp_noise_reduction_mode_t nr_mode, tv_source_input_type_t source_type ); + int Tv_SetNoiseReductionMode ( vpp_noise_reduction_mode_t nr_mode, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt, int is_save ); + vpp_noise_reduction_mode_t Tv_GetNoiseReductionMode ( tv_source_input_type_t source_type ); + int Tv_SetRGBOGO_PostOffset(int rgb, int offset); + int Tv_SetRGBOGO_Gain(int rgb, int gain); + int Tv_GetRGBOGO_PostOffset ( int rgb ); + int Tv_GetRGBOGO_Gain( int rgb ); + int Tv_SetDNLP ( tv_source_input_type_t source_type, tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt ); + int Tv_LoadVppSettings ( tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt ); + //int Tv_SetVppParamDefault(void); + + + int Tv_FactorySetPQMode_Brightness ( int source_type, int pq_mode, int brightness ); + int Tv_FactoryGetPQMode_Brightness ( int source_type, int pq_mode ); + int Tv_FactorySetPQMode_Contrast ( int source_type, int pq_mode, int contrast ); + int Tv_FactoryGetPQMode_Contrast ( int source_type, int pq_mode ); + int Tv_FactorySetPQMode_Saturation ( int source_type, int pq_mode, int saturation ); + int Tv_FactoryGetPQMode_Saturation ( int source_type, int pq_mode ); + int Tv_FactorySetPQMode_Hue ( int source_type, int pq_mode, int hue ); + int Tv_FactoryGetPQMode_Hue ( int source_type, int pq_mode ); + int Tv_FactorySetPQMode_Sharpness ( int source_type, int pq_mode, int sharpness ); + int Tv_FactoryGetPQMode_Sharpness ( int source_type, int pq_mode ); + int Tv_FactorySetColorTemp_Rgain ( int source_type, int colortemp_mode, int rgain ); + int Tv_FactorySaveColorTemp_Rgain ( int source_type, int colortemp_mode, int rgain ); + int Tv_FactoryGetColorTemp_Rgain ( int source_type, int colortemp_mode ); + int Tv_FactorySetColorTemp_Ggain ( int source_type, int colortemp_mode, int ggain ); + int Tv_FactorySaveColorTemp_Ggain ( int source_type, int colortemp_mode, int ggain ); + int Tv_FactoryGetColorTemp_Ggain ( int source_type, int colortemp_mode ); + int Tv_FactorySetColorTemp_Bgain ( int source_type, int colortemp_mode, int bgain ); + int Tv_FactorySaveColorTemp_Bgain ( int source_type, int colortemp_mode, int bgain ); + int Tv_FactoryGetColorTemp_Bgain ( int source_type, int colortemp_mode ); + int Tv_FactorySetColorTemp_Roffset ( int source_type, int colortemp_mode, int roffset ); + int Tv_FactorySaveColorTemp_Roffset ( int source_type, int colortemp_mode, int roffset ); + int Tv_FactoryGetColorTemp_Roffset ( int source_type, int colortemp_mode ); + int Tv_FactorySetColorTemp_Goffset ( int source_type, int colortemp_mode, int goffset ); + int Tv_FactorySaveColorTemp_Goffset ( int source_type, int colortemp_mode, int goffset ); + int Tv_FactoryGetColorTemp_Goffset ( int source_type, int colortemp_mode ); + int Tv_FactorySetColorTemp_Boffset ( int source_type, int colortemp_mode, int boffset ); + int Tv_FactorySaveColorTemp_Boffset ( int source_type, int colortemp_mode, int boffset ); + int Tv_FactoryGetColorTemp_Boffset ( int source_type, int colortemp_mode ); + //int Tv_FactorySaveRGBDatatoAllSrc ( int source_type, int colortemp_mode ); + int Tv_FactoryGetTestPattern ( void ); + int Tv_FactoryResetPQMode ( void ); + int TV_FactoryResetNonlinear ( void ); + int Tv_FactoryResetColorTemp ( void ); + int Tv_FactorySetParamsDefault ( void ); + int Tv_FactorySetDDRSSC ( int step ); + int Tv_FactoryGetDDRSSC(); + int Tv_FactorySetLVDSSSC ( int step ); + int Tv_FactoryGetLVDSSSC(); + int Tv_FactorySetNolineParams ( int type, int source_type, noline_params_t noline_params ); + noline_params_t Tv_FactoryGetNolineParams ( int type, int source_type ); + int Tv_FactorySetOverscan ( int source_type, int fmt, int status_3d, int trans_fmt, tvin_cutwin_t cutwin_t ); + tvin_cutwin_t Tv_FactoryGetOverscan ( int source_type, int fmt, is_3d_type_t is3d, int trans_fmt ); + int Tv_FactorySetBacklightPWM_Frequency(int freq); + int Tv_FactoryGetBacklightPWM_Frequency ( void ); + int Tv_FactorySetBacklight_Switch_status ( int status ); + int Tv_FactoryGetBacklight_Switch_status ( void ); + int Tv_FactorySetBacklightPWM_Duty ( int duty ); + int Tv_FactoryGetBacklightPWM_Duty ( void ); + int Tv_FactorySetLVDS_ColorDepth ( int depth ); + int Tv_FactoryGetLVDS_ColorDepth ( void ); + int Tv_FactorySetLVDS_ColorDither_status ( int status ); + int Tv_FactoryGetLVDS_ColorDither_status ( void ); + int Tv_FactorySetLVDS_Mapping_status ( int status ); + int Tv_FactoryGetLVDS_Mapping_status ( void ); + int Tv_FactorySetLVDS_PortSwap_status ( int status ); + int Tv_FactoryGetLVDS_PortSwap_status ( void ); + + int VPPSSMRestoreDefault(); + int VPPSSMFacRestoreDefault(); + + + int Tv_GetHistogram_AVE(); + int Tv_SetDnlp_OFF(); + int Tv_SetDnlp_ON ( void ); + int Tv_GetDnlp_Status(); + + int GetColorTemperatureParams ( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t *params ); + int ReadColorTemperatureParams ( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t *params ); + int SetColorTemperatureParams ( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t params ); + int SaveColorTemperatureParams ( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t params ); + unsigned short CalColorTemperatureParamsChecksum ( void ); + int SetColorTempParamsChecksum ( void ); + unsigned short GetColorTempParamsChecksum ( void ); + int CheckTempDataLable ( void ); + int SetTempDataLable ( void ); + int CheckColorTemperatureParams ( void ); + int RestoeColorTemperatureParamsFromDB ( tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt ); + int CheckColorTemperatureParamAlldata ( tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt ); + void Tvin_SetVideoScreenColorType ( int type ); + int Vpp_GetVppConfig(); + int Vpp_GetPQModeValue ( tv_source_input_type_t, vpp_picture_mode_t, vpp_pq_para_t * ); + int Vpp_SetPQParams ( tv_source_input_type_t source_type, vpp_picture_mode_t pq_mode, vpp_pq_para_t pq_para , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt); + + int Vpp_LoadGammaDefault ( tv_source_input_type_t, tvin_sig_fmt_t ); + int Vpp_LoadGammaSpecial ( int ); + int Vpp_LoadGamma ( tv_source_input_type_t, tvin_sig_fmt_t ); + int Tv_FactoryResetNonlinear(); + tvin_cutwin_t Tv_GetOverscan ( tv_source_input_type_t source_type, tvin_sig_fmt_t fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt ); + static is_3d_type_t Check2Dor3D ( is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt ); + //api + int VPP_SetVEBlackExtension ( const struct ve_bext_s *pBExt ); + int VPP_SetVideoCrop ( int Voffset0, int Hoffset0, int Voffset1, int Hoffset1 ); + int VPP_SetNonLinearFactor ( int value ); + int VPP_SetGrayPattern(int value); + int VPP_GetGrayPattern(); +private: + // + int VPP_OpenModule ( void ); + int VPP_CloseModule ( void ); + int VPP_SetVideoBrightness ( int value ); + int VPP_SetVideoContrast ( int value ); + int VPP_SetVideoSaturationHue ( int satVal, int hueVal ); + int VPP_SetCMRegisterMap ( struct cm_regmap_s *pRegMap ); + int Vpp_LoadRegs ( am_regs_t regs ); + int VPP_SetRGBOGO ( const struct tcon_rgb_ogo_s *rgbogo ); + int VPP_GetRGBOGO ( const struct tcon_rgb_ogo_s *rgbogo ); + int VPP_SetGammaOnOff ( unsigned char onoff ); + int VPP_SetGammaTbl_R ( unsigned short red[256] ); + int VPP_SetGammaTbl_G ( unsigned short green[256] ); + int VPP_SetGammaTbl_B ( unsigned short blue[256] ); + void video_set_saturation_hue ( signed char saturation, signed char hue, signed long *mab ); + void video_get_saturation_hue ( signed char *sat, signed char *hue, signed long *mab ); + int VPP_SetBackLightLevel ( int value ); + int VPP_SetVEDNLP ( const struct ve_dnlp_s *pDNLP ); + int VPP_SetVENewDNLP ( const ve_dnlp_table_t *pDNLP ); + int Vpp_GetAVGHistogram ( struct ve_hist_s *hist ); + int Vpp_SetDnlpOff ( void ); + int Vpp_SetDnlpOn ( void ); + int VPP_SetVESharpness ( const ve_hsvs_s * ); + int VPP_SetVEChromaCoring ( const ve_ccor_s * ); + int VPP_SetVEBlueEnh ( const ve_benh_s * ); + int VPP_SetVEDemo ( const ve_demo_s * ); + int VPP_SetVERegisterMap ( const ve_regmap_s * ); + int VPP_SetVEDebug ( const long long unsigned int * ); + int VPP_SetCMRegion ( const cm_region_s * ); + int VPP_SetCMTopLayer ( const cm_top_s * ); + int VPP_SetCMDemo ( const cm_demo_s * ); + + int VPP_DeviceIOCtl ( int request, ... ); + int VPP3D_DeviceIOCtl ( int, ... ); + int VPP_SetCMDebug ( const long long unsigned int * ); + int VPP_SetAVSyncEnable ( unsigned int ); + int VPP_SetVideoNoiseReduction ( int ); + int VPP_SetVideoSaturation ( int ); + int VPP_SetVideoHue ( int ); + int VPP_SetDeinterlaceMode ( int ); + + + tv_source_input_type_t vpp_setting_last_source_type; + tvin_sig_fmt_t vpp_setting_last_sig_fmt; + tvin_trans_fmt_t vpp_setting_last_trans_fmt; + //cfg + bool mbVppCfg_backlight_reverse; + bool mbVppCfg_backlight_init; + bool mbVppCfg_pqmode_without_hue; + bool mbVppCfg_hue_reverse; + bool mbVppCfg_gamma_onoff; + bool mbVppCfg_whitebalance_sameparam; + bool mbVppCfg_new_cm; + bool mbVppCfg_new_nr; + bool mbVppCfg_panorama_switch; + bool mbVppCfg_pqmode_depend_bklight; + bool mbVppCfg_colortemp_by_source; + + CPqData *mpPqData; + + int vpp_amvideo_fd; + int vpp_amvideo_3d_fd; +}; +#endif diff --git a/tvapi/libtv/vpp/pqdata.cpp b/tvapi/libtv/vpp/pqdata.cpp new file mode 100644 index 0000000..a005245 --- a/dev/null +++ b/tvapi/libtv/vpp/pqdata.cpp @@ -0,0 +1,143 @@ +#include "pqdata.h" + +//vpp +unsigned long DemoColorYOffRegMap[CM_REG_NUM] = { + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x80ff807f, 0x00800800, 0x00001000, 0x1077f010, + 0xf077ff10, 0x7777ff10, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x80700124, 0x00000000, +}; +//vpp +unsigned long DemoColorCOffRegMap[CM_REG_NUM] = { + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x80ff807f, 0x00802800, + 0x00001000, 0x1077f010, 0xf077ff10, 0x7777ff10, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x80700124, 0x00000000, +}; + +unsigned long DemoColorGOffRegMap[CM_REG_NUM] = { + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x80ff807f, 0x00801800, 0x00001000, + 0x1077f010, 0xf077ff10, 0x7777ff10, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x80700124, 0x00000000, +}; + +unsigned long DemoColorMOffRegMap[CM_REG_NUM] = { + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x80ff807f, 0x00804800, 0x00001000, 0x1077f010, 0xf077ff10, + 0x7777ff10, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x80700124, 0x00000000, +}; + +unsigned long DemoColorROffRegMap[CM_REG_NUM] = { + 0x80ff807f, 0x00805800, 0x00001000, 0x1077f010, 0xf077ff10, + 0x7777ff10, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x80700124, 0x00000000, +}; + +unsigned long DemoColorBOffRegMap[CM_REG_NUM] = { + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x80ff807f, + 0x00803800, 0x00001000, 0x1077f010, 0xf077ff10, 0x7777ff10, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x80700124, 0x00000000 +}; + +unsigned long DemoColorRGBOffRegMap[CM_REG_NUM] = { + 0x80ff807f, 0x00805800, 0x00001000, 0x1077f010, 0xf077ff10, + 0x7777ff10, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x80ff807f, 0x00801800, 0x00001000, + 0x1077f010, 0xf077ff10, 0x7777ff10, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x80ff807f, + 0x00803800, 0x00001000, 0x1077f010, 0xf077ff10, 0x7777ff10, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x80700124, 0x00000000, +}; + +unsigned long DemoColorYMCOffRegMap[CM_REG_NUM] = { + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x80ff807f, 0x00800800, 0x00001000, 0x1077f010, + 0xf077ff10, 0x7777ff10, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x80ff807f, 0x00802800, + 0x00001000, 0x1077f010, 0xf077ff10, 0x7777ff10, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x80ff807f, 0x00804800, 0x00001000, 0x1077f010, 0xf077ff10, + 0x7777ff10, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x80700124, 0x00000000, +}; + +unsigned long DemoColorALLOffRegMap[CM_REG_NUM] = { + 0x81ff8080, 0x00805800, 0x00001000, 0x0077ff00, 0xff77ff00, + 0x7777ff00, 0x80ff8080, 0x00800800, 0x00001000, 0x0077ff00, + 0xff77ff00, 0x7777ff00, 0x80ff8080, 0x00a01800, 0x00000ccd, + 0x0077ff00, 0xff77ff00, 0x7777ff00, 0x80ff8080, 0x00ff2800, + 0x00000800, 0x0077ff00, 0xff77ff00, 0x7777ff00, 0x80ff8080, + 0x00ff3c00, 0x00000800, 0x0077ff00, 0xff77ff00, 0x7777ff00, + 0x80ff8080, 0x00ff4c00, 0x00000800, 0x0077ff00, 0x00000000, + 0x7777ff00, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xff77ff00, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x80700124, 0x00000000, +}; + +unsigned long DemoColorSplit4_3RegMap[CM_REG_NUM] = { + 0x8A58821E, 0x00525911, 0x000018FA, 0x1033E010, 0xE033F50A, 0x3333E010, + 0x8A3F8A14, 0x002803BB, 0x00003333, 0x1033E010, 0xE033F50A, 0x3333E010, + 0x8A6C8A24, 0x00130911, 0x00006BCA, 0x1033E010, 0xE033F50A, 0x3333E010, + 0x8AA48A50, 0x00440BBB, 0x00001E1E, 0x1033E010, 0xE033F50A, 0x3333E010, + 0x8ACC8221, 0x00AA1488, 0x00000C0C, 0x1033E010, 0xE033F50A, 0x3333E010, + 0x8AF48A24, 0x00632A22, 0x000014B0, 0x1033E010, 0xE033F50A, 0x3333E010, + 0x8AFF8A4C, 0x008536EE, 0x00000F66, 0x1033E010, 0xE033F50A, 0x3333E010, + 0x8AC68244, 0x00854800, 0x00000F66, 0x1033E010, 0xE033F50A, 0x3333E010, + 0x8492D024, 0x81000000 +}; + +unsigned long DemoColorSplitRegMap[CM_REG_NUM] = { + 0x8A58821E, 0x00525911, 0x000018FA, 0x1033E010, 0xE033F50A, 0x3333E010, + 0x8A3F8A14, 0x002803BB, 0x00003333, 0x1033E010, 0xE033F50A, 0x3333E010, + 0x8A6C8A24, 0x00130911, 0x00006BCA, 0x1033E010, 0xE033F50A, 0x3333E010, + 0x8AA48A50, 0x00440BBB, 0x00001E1E, 0x1033E010, 0xE033F50A, 0x3333E010, + 0x8ACC8221, 0x00AA1488, 0x00000C0C, 0x1033E010, 0xE033F50A, 0x3333E010, + 0x8AF48A24, 0x00632A22, 0x000014B0, 0x1033E010, 0xE033F50A, 0x3333E010, + 0x8AFF8A4C, 0x008536EE, 0x00000F66, 0x1033E010, 0xE033F50A, 0x3333E010, + 0x8AC68244, 0x00854800, 0x00000F66, 0x1033E010, 0xE033F50A, 0x3333E010, + 0x8493C024, 0x81000000 +}; diff --git a/tvapi/libtv/vpp/pqdata.h b/tvapi/libtv/vpp/pqdata.h new file mode 100644 index 0000000..0821ae7 --- a/dev/null +++ b/tvapi/libtv/vpp/pqdata.h @@ -0,0 +1,30 @@ +#ifndef _PQDATA_H_ +#define _PQDATA_H_ + + +#define CM_REG_NUM 50 +#define PQ_TOTAL_STEP 101 +#define GAMMA_TABLE_NUM 256 + +extern unsigned long DemoColorYOffRegMap[CM_REG_NUM]; + +extern unsigned long DemoColorCOffRegMap[CM_REG_NUM]; + +extern unsigned long DemoColorGOffRegMap[CM_REG_NUM]; + +extern unsigned long DemoColorMOffRegMap[CM_REG_NUM]; + +extern unsigned long DemoColorROffRegMap[CM_REG_NUM]; + +extern unsigned long DemoColorBOffRegMap[CM_REG_NUM]; + +extern unsigned long DemoColorRGBOffRegMap[CM_REG_NUM]; + +extern unsigned long DemoColorYMCOffRegMap[CM_REG_NUM]; + +extern unsigned long DemoColorALLOffRegMap[CM_REG_NUM]; + +extern unsigned long DemoColorSplit4_3RegMap[CM_REG_NUM]; + +extern unsigned long DemoColorSplitRegMap[CM_REG_NUM]; +#endif diff --git a/tvapi/script/setenv.sh b/tvapi/script/setenv.sh new file mode 100644 index 0000000..4c5e271 --- a/dev/null +++ b/tvapi/script/setenv.sh @@ -0,0 +1,54 @@ +#!/bin/bash +function usage () { + echo "Usage:" + echo " run the script in tvapi top directory" + echo " source ./script/setenv.sh ----> default for ref board if not args" + echo " source ./script/setenv.sh ref_n300 -----> for ref n310 866 + 101" + echo " source ./script/setenv.sh skyworth_n310 -----> for skyworth n310 866 + 101" +} +CONFIG_VERSION="v1" +PWDPATH=$(pwd) + +echo "PWD=" +echo $PWDPATH + +if [ $# -lt 1 ] || [ $1 = ref_n300 ]; then + echo "for ref board" + export TVAPI_TARGET_BOARD_VERSION="REF_N300" + CONFIG_NAME="ref_n300" + usage + # return +fi + + + +if [ $# -ge 1 ] && [ $1 = skyworth_n310 ] ; then + echo "skyworth_n310---------------------" + CONFIG_NAME=$1 + export TVAPI_TARGET_BOARD_VERSION="SKYWORTH_N310" +fi + + +CONFIG_FILE=$PWDPATH/build/include/xxxconfig.h +if [ -f "$CONFIG_FILE" ]; then +rm $CONFIG_FILE +fi + + +PROJECT_PATH=${PWDPATH}/libtv/projects/${CONFIG_NAME}_${CONFIG_VERSION} +echo $PROJECT_PATH + +TARGET_CONFIG_FILE="${CONFIG_NAME}_${CONFIG_VERSION}.h" + +echo $CONFIG_NAME + +if [ ! -f "${PROJECT_PATH}/${TARGET_CONFIG_FILE}" ]; then + echo "TARGET_CONFIG_FILE=${TARGET_CONFIG_FILE} is not exist" + return +fi + + + +cat << EOF >> $CONFIG_FILE +#include <${CONFIG_NAME}_${CONFIG_VERSION}/$TARGET_CONFIG_FILE> +EOF diff --git a/tvapi/tvtests/Android.mk b/tvapi/tvtests/Android.mk new file mode 100644 index 0000000..649f08c --- a/dev/null +++ b/tvapi/tvtests/Android.mk @@ -0,0 +1,49 @@ +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_SRC_FILES:= \ + android_tvtest.cpp + +LOCAL_SHARED_LIBRARIES := \ + libcutils \ + libutils \ + libbinder \ + libtvbinder \ + libnativehelper \ + libandroid_runtime \ + liblog + +LOCAL_C_INCLUDES += \ + bionic/libc/include \ + $(LOCAL_PATH)/../ \ + $(LOCAL_PATH)/../android + +LOCAL_MODULE:= tvtest + +include $(BUILD_EXECUTABLE) + + +include $(CLEAR_VARS) + +LOCAL_SRC_FILES:= \ + comm_test.cpp + +LOCAL_SHARED_LIBRARIES := \ + libcutils \ + libutils \ + libbinder \ + libtvbinder \ + libnativehelper \ + libandroid_runtime \ + liblog \ + libtv + +LOCAL_C_INCLUDES += \ + bionic/libc/include \ + $(LOCAL_PATH)/../ \ + $(LOCAL_PATH)/../libtv\ + $(LOCAL_PATH)/../android + +LOCAL_MODULE:= comm_test + +include $(BUILD_EXECUTABLE) diff --git a/tvapi/tvtests/android_tvtest.cpp b/tvapi/tvtests/android_tvtest.cpp new file mode 100644 index 0000000..6a6d8e2 --- a/dev/null +++ b/tvapi/tvtests/android_tvtest.cpp @@ -0,0 +1,33 @@ +#define LOG_TAG "Tv-JNI" + +#include <utils/Log.h> +#include <include/Tv.h> +#include <binder/IMemory.h> +#include <binder/Parcel.h> + +using namespace android; + + +void usage(char *processname) +{ + fprintf(stderr, "Usage: %s <cmd num> [arg1]... [argn]\n", processname); + return; +} + + +int main(int argc, char **argv) +{ + if (argc < 2) + usage(argv[0]); + sp<Tv> tv = Tv::connect(); + int cmd = atoi(argv[1]); + int arg1 = atoi(argv[2]); + //send cmd + Parcel p, r; + p.writeInt32(cmd); + p.writeInt32(arg1); + tv->processCmd(p, &r); + //exit + tv.clear(); + return 0; +} diff --git a/tvapi/tvtests/comm_test.cpp b/tvapi/tvtests/comm_test.cpp new file mode 100644 index 0000000..c719cc1 --- a/dev/null +++ b/tvapi/tvtests/comm_test.cpp @@ -0,0 +1,33 @@ +#include <tv/CFbcCommunication.h> +#include "tv/CTvLog.h" + +void usage(char *processname) +{ + fprintf(stderr, "Usage: %s <cmd num> [arg1]... [argn]\n", processname); + return; +} + + +int main(int argc, char **argv) +{ + int cmd, go = 1; + LOGD("---------------0------------------------"); + CFbcCommunication fbc; + LOGD("---------------1-------------------------"); + fbc.run(); + LOGD("------------------2----------------------"); + + while (go) { + scanf("%d", &cmd); + switch (cmd) { + case 1: + go = 0; + fbc.closeAll(); + break; + case 2: + break; + default: + break; + } + } +} diff --git a/tvapi/tvtests/ssm_test.cpp b/tvapi/tvtests/ssm_test.cpp new file mode 100644 index 0000000..5ed4110 --- a/dev/null +++ b/tvapi/tvtests/ssm_test.cpp @@ -0,0 +1,210 @@ +#include <stdio.h> +#include <unistd.h> +#include <string.h> +#include <fcntl.h> +#include <errno.h> +#include <android/log.h> + +#include "ssm_api.h" + +#define LOG_TAG "ssm_test" +#include "CTvLog.h" + +// The follow is R/W test struct declare. +// The size of it is 11 when it aligned with 1 Byte +// and is 16 when it aligned with 4 Bytes. +// You should use the 1 Byte aligned mode when R/W ssm by using struct. + +#if 1 // memory aligned with 1 Bytes +typedef struct tagS_TEST_STRUCT { + char tmp_ch0; + char tmp_ch1; + int tmp_val0; + unsigned char tmp_ch2; + unsigned char tmp_ch3; + unsigned char tmp_ch4; + short tmp_short0; +} __attribute__((packed)) S_TEST_STRUCT; +#else // memory aligned with 4 Bytes +typedef struct tagS_TEST_STRUCT { + char tmp_ch0; + char tmp_ch1; + int tmp_val0; + unsigned char tmp_ch2; + unsigned char tmp_ch3; + unsigned char tmp_ch4; + short tmp_short0; +} S_TEST_STRUCT; +#endif + +static void TestRWOneByte(int tmp_rw_offset, int tmp_w_val, unsigned char tmp_w_ch); +static void TestRWNBytes(int tmp_rw_offset); +static void TestRWOneStruct(int tmp_rw_offset); + +int main() +{ + TestRWOneByte(0, 1, -1); + TestRWOneByte(1, 2, -2); + TestRWOneByte(30, 3, -3); + TestRWOneByte(31, -1, 1); + TestRWOneByte(32, -2, 2); + TestRWOneByte(33, -3, 3); + + TestRWNBytes(31); + + TestRWOneStruct(0); +} + +static void TestRWOneByte(int tmp_rw_offset, int tmp_w_val, unsigned char tmp_w_ch) +{ + int tmp_r_val = 0; + unsigned char tmp_r_ch = 0; + + LOGD("\n\n"); + LOGD("**************Test R/W One Byte **************\n\n"); + + LOGD("tmp_rw_offset = %d.\n", tmp_rw_offset); + + SSMWriteOneByte(tmp_rw_offset, tmp_w_ch); + SSMReadOneByte(tmp_rw_offset, &tmp_r_ch); + LOGD("tmp_w_ch = %d, tmp_r_ch = %d.\n", tmp_w_ch, tmp_r_ch); + + SSMWriteOneByte(tmp_rw_offset, tmp_w_val); + SSMReadOneByte(tmp_rw_offset, &tmp_r_val); + LOGD("tmp_w_val = %d, tmp_r_val = %d.\n", tmp_w_val, tmp_r_val); +} + +static void TestRWNBytes(int tmp_rw_offset) +{ + int i = 0, tmp_op_buf_size = 0; + int device_size = 0, tmp_w_page_size = 0, tmp_r_page_size = 0; + int *tmp_op_int_w_buf = NULL, *tmp_op_int_r_buf = NULL; + unsigned char *tmp_op_char_w_buf = NULL, *tmp_op_char_r_buf = NULL; + + LOGD("\n\n"); + LOGD("**************Test R/W N Bytes **************\n\n"); + + SSMGetDeviceTotalSize(&device_size); + SSMGetDeviceWritePageSize(&tmp_w_page_size); + SSMGetDeviceReadPageSize(&tmp_r_page_size); + + if (tmp_w_page_size < tmp_r_page_size) { + tmp_op_buf_size = tmp_w_page_size * 2 / 3; + } else if (tmp_r_page_size < tmp_w_page_size) { + tmp_op_buf_size = tmp_r_page_size * 2 / 3; + } else { + tmp_op_buf_size = tmp_w_page_size; + } + + if (tmp_op_buf_size > device_size) { + tmp_op_buf_size = device_size; + } + + if (tmp_op_buf_size > 0) { + LOGD("tmp_rw_offset = %d.\n", tmp_rw_offset); + + tmp_op_char_w_buf = new unsigned char[tmp_op_buf_size]; + if (tmp_op_char_w_buf != NULL) { + tmp_op_char_r_buf = new unsigned char[tmp_op_buf_size]; + if (tmp_op_char_r_buf != NULL) { + for (i = 0; i < tmp_op_buf_size; i++) { + tmp_op_char_w_buf[i] = (tmp_op_buf_size / 2) - i; + LOGD("tmp_op_char_w_buf[%d] = %d\n", i, tmp_op_char_w_buf[i]); + } + SSMWriteNTypes(tmp_rw_offset, tmp_op_buf_size, tmp_op_char_w_buf); + + for (i = 0; i < tmp_op_buf_size; i++) { + tmp_op_char_r_buf[i] = 0; + } + SSMReadNTypes(tmp_rw_offset, tmp_op_buf_size, tmp_op_char_r_buf); + + for (i = 0; i < tmp_op_buf_size; i++) { + LOGD("tmp_op_char_r_buf[%d] = %d\n", i, tmp_op_char_r_buf[i]); + } + + delete tmp_op_char_r_buf; + tmp_op_char_r_buf = NULL; + } + + delete tmp_op_char_w_buf; + tmp_op_char_w_buf = NULL; + } + + tmp_op_int_w_buf = new int[tmp_op_buf_size]; + if (tmp_op_int_w_buf != NULL) { + tmp_op_int_r_buf = new int[tmp_op_buf_size]; + if (tmp_op_int_r_buf != NULL) { + for (i = 0; i < tmp_op_buf_size; i++) { + tmp_op_int_w_buf[i] = (tmp_op_buf_size / 2) - i; + LOGD("tmp_op_int_w_buf[%d] = %d\n", i, tmp_op_int_w_buf[i]); + } + SSMWriteNTypes(tmp_rw_offset, tmp_op_buf_size, tmp_op_int_w_buf); + + for (i = 0; i < tmp_op_buf_size; i++) { + tmp_op_int_r_buf[i] = 0; + } + SSMReadNTypes(tmp_rw_offset, tmp_op_buf_size, tmp_op_int_r_buf); + + for (i = 0; i < tmp_op_buf_size; i++) { + LOGD("tmp_op_int_r_buf[%d] = %d\n", i, tmp_op_int_r_buf[i]); + } + + delete tmp_op_int_r_buf; + tmp_op_int_r_buf = NULL; + } + + delete tmp_op_int_w_buf; + tmp_op_int_w_buf = NULL; + } + } +} + +static void TestRWOneStruct(int tmp_rw_offset) +{ + S_TEST_STRUCT TestWriteStruct, TestReadStruct; + + LOGD("\n\n"); + LOGD("**************Test R/W One Struct **************\n\n"); + + LOGD("tmp_rw_offset = %d.\n", tmp_rw_offset); + + TestWriteStruct.tmp_ch0 = -9; + TestWriteStruct.tmp_ch1 = -8; + TestWriteStruct.tmp_val0 = 9; + TestWriteStruct.tmp_ch2 = 255; + TestWriteStruct.tmp_ch3 = 254; + TestWriteStruct.tmp_ch4 = 250; + TestWriteStruct.tmp_short0 = -9; + + SSMWriteNTypes(tmp_rw_offset, sizeof(S_TEST_STRUCT), (unsigned char *) &TestWriteStruct); + + LOGD("\n\n"); + LOGD("write struct length = %d.\n", sizeof(S_TEST_STRUCT)); + LOGD("TestWriteStruct.tmp_ch0 = %d.\n", TestWriteStruct.tmp_ch0); + LOGD("TestWriteStruct.tmp_ch1 = %d.\n", TestWriteStruct.tmp_ch1); + LOGD("TestWriteStruct.tmp_val0 = %d.\n", TestWriteStruct.tmp_val0); + LOGD("TestWriteStruct.tmp_ch2 = %d.\n", TestWriteStruct.tmp_ch2); + LOGD("TestWriteStruct.tmp_ch3 = %d.\n", TestWriteStruct.tmp_ch3); + LOGD("TestWriteStruct.tmp_ch4 = %d.\n", TestWriteStruct.tmp_ch4); + LOGD("TestWriteStruct.tmp_short0 = %d.\n", TestWriteStruct.tmp_short0); + + TestReadStruct.tmp_ch0 = 0; + TestReadStruct.tmp_ch1 = 0; + TestReadStruct.tmp_val0 = 0; + TestReadStruct.tmp_ch2 = 0; + TestReadStruct.tmp_ch3 = 0; + TestWriteStruct.tmp_ch4 = 0; + TestWriteStruct.tmp_short0 = 0; + + SSMReadNTypes(tmp_rw_offset, sizeof(S_TEST_STRUCT), (unsigned char *) &TestReadStruct); + + LOGD("\n\n"); + LOGD("read struct length = %d.\n", sizeof(S_TEST_STRUCT)); + LOGD("TestReadStruct.tmp_ch0 = %d.\n", TestReadStruct.tmp_ch0); + LOGD("TestReadStruct.tmp_ch1 = %d.\n", TestReadStruct.tmp_ch1); + LOGD("TestReadStruct.tmp_val0 = %d.\n", TestReadStruct.tmp_val0); + LOGD("TestReadStruct.tmp_ch2 = %d.\n", TestReadStruct.tmp_ch2); + LOGD("TestReadStruct.tmp_ch3 = %d.\n", TestReadStruct.tmp_ch3); + LOGD("TestReadStruct.tmp_ch4 = %d.\n", TestReadStruct.tmp_ch4); + LOGD("TestReadStruct.tmp_short0 = %d.\n", TestReadStruct.tmp_short0); +} diff --git a/tvapi/tvtests/tvconfig_test.cpp b/tvapi/tvtests/tvconfig_test.cpp new file mode 100644 index 0000000..ea90dd7 --- a/dev/null +++ b/tvapi/tvtests/tvconfig_test.cpp @@ -0,0 +1,427 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <android/log.h> + +#include "tvconfig_core.h" +#include "tvconfig.h" + +#define LOG_TAG "tvconfig_test" +#include "CTvLog.h" + +static int GetAudioAmplifierBiquadsDataBuffer00(int *biquad_count, int *biquad_item_count, int biquad_data_buf[]); +static int GetAudioAmplifierBiquadsDataBuffer01(int *biquad_count, int *biquad_item_count, int biquad_data_buf[]); + +static int GetTvAudioCardID(char tv_card_id_buf[]); +static int GetTvAudioCardName(char tv_card_name_buf[]); + +static int ATVGetFacRestoreChanInfo(int *chan_cnt, int *item_cnt, int chan_data_buf[]); + +static void PrintGPIOCfgData(int cfg_info_item_count, GPIOCFGInfo cfg_info_buf[]); +static int GetAudioAnalogAmplifierMuteGPIOCFG(char gpio_grp_str[], int *mute_gpio_addr, int *mute_on_val, int *mute_off_val); +static int GetAudioHeadSetMuteGPIOCFG(char gpio_grp_str[], int *mute_gpio_addr, int *mute_on_val, int *mute_off_val); +static int GetAudioAVOutMuteGPIOCFG(char gpio_grp_str[], int *mute_gpio_addr, int *mute_on_val, int *mute_off_val); +static int GetWriteProtectGPIOCFG(char gpio_grp_str[], int *protect_gpio_addr, int *protect_on_val, int *protect_off_val); + +typedef struct tagTvServerInfo { + int power_on_off_channel; + int last_source_select; + int system_language; +} TvServerInfo; + +int main(int argc, char **argv) +{ + int i, j; + char key_buf[CC_CFG_KEY_STR_MAX_LEN]; + char cfg_buf[CC_CFG_VALUE_STR_MAX_LEN]; + + config_set_log_level (CC_LOG_LEVEL_ALL); + + config_init((char *) "tvconfig.conf"); + + strcpy(key_buf, "media.amplayer.enable-acodecs"); + config_get(key_buf, cfg_buf, (char *) ""); + LOGD("file(%s)'s function(%s), key string \"%s\", value string \"%s\".\n", __FILE__, "TV", key_buf, cfg_buf); + + strcpy(key_buf, "media.amplayer.enable-acodecs"); + strcpy(cfg_buf, "shorthoho"); + config_set(key_buf, cfg_buf); + + strcpy(key_buf, "media.amplayer.enable-acodecs"); + config_get(key_buf, cfg_buf, (char *) ""); + LOGD("file(%s)'s function(%s), key string \"%s\", value string \"%s\".\n", __FILE__, "TV", key_buf, cfg_buf); + + strcpy(key_buf, "media.amplayer.enable-acodecs"); + config_get(key_buf, cfg_buf, (char *) ""); + LOGD("file(%s)'s function(%s), key string \"%s\", value string \"%s\".\n", __FILE__, "TV", key_buf, cfg_buf); + + strcpy(key_buf, "media.amplayer.enable-acodecs"); + strcpy(cfg_buf, "asf,wav,aac,mp3,m4a,ape,flac,alac,hohoho"); + config_set(key_buf, cfg_buf); + + strcpy(key_buf, "media.amplayer.enable-acodecs"); + config_get(key_buf, cfg_buf, (char *) ""); + LOGD("file(%s)'s function(%s), key string \"%s\", value string \"%s\".\n", __FILE__, "TV", key_buf, cfg_buf); + + strcpy(key_buf, "shoufu.zhao.test"); + config_get(key_buf, cfg_buf, (char *) ""); + LOGD("file(%s)'s function(%s), key string \"%s\", value string \"%s\".\n", __FILE__, "TV", key_buf, cfg_buf); + + strcpy(key_buf, "shoufu.zhao.test"); + strcpy(cfg_buf, "test hohoho"); + config_set(key_buf, cfg_buf); + + strcpy(key_buf, "shoufu.zhao.test"); + config_get(key_buf, cfg_buf, (char *) ""); + LOGD("file(%s)'s function(%s), key string \"%s\", value string \"%s\".\n", __FILE__, "TV", key_buf, cfg_buf); + + int biquad_count = 0, biquad_item_count = 0; + int biquad_data_buf00[128] = { 0 }; + int biquad_data_buf01[128] = { 0 }; + + GetAudioAmplifierBiquadsDataBuffer00(&biquad_count, &biquad_item_count, biquad_data_buf00); + for (i = 0; i < biquad_count; i++) { + for (j = 0; j < biquad_item_count; j++) { + LOGD("0x%x\n", biquad_data_buf00[i * biquad_item_count + j]); + } + + LOGD("\n"); + } + + GetAudioAmplifierBiquadsDataBuffer01(&biquad_count, &biquad_item_count, biquad_data_buf01); + for (i = 0; i < biquad_count; i++) { + for (j = 0; j < biquad_item_count; j++) { + LOGD("0x%x\n", biquad_data_buf01[i * biquad_item_count + j]); + } + + LOGD("\n"); + } + + char tv_card_id_buf[64] = { 0 }; + char tv_card_name_buf[64] = { 0 }; + + GetTvAudioCardID(tv_card_id_buf); + + GetTvAudioCardName(tv_card_name_buf); + + printf("tvservice log cfg value = %d\n", config_log_cfg_get(CC_LOG_MODULE_TVSERVICE)); + printf("vpp log cfg value = %d\n", config_log_cfg_get(CC_LOG_MODULE_VPP)); + + int chan_cnt = 0, item_cnt = 0; + int chan_data_buf[256] = { 0 }; + + ATVGetFacRestoreChanInfo(&chan_cnt, &item_cnt, chan_data_buf); + + for (i = 0; i < chan_cnt; i++) { + for (j = 0; j < item_cnt; j++) { + LOGD("%d\n", chan_data_buf[i * item_cnt + j]); + } + + LOGD("\n"); + } + + char gpio_grp_str[32] = { 0 }; + int gpio_addr, gpio_on_val; + + int cfg_info_item_count = 0; + GPIOCFGInfo cfg_info_buf[64]; + + if (cfg_get_one_gpio_data("audio.avout.mute.gpio", gpio_grp_str, &gpio_addr, &gpio_on_val) == 0) { + cfg_info_item_count = 1; + + strcpy(cfg_info_buf[0].gpio_grp_str, gpio_grp_str); + cfg_info_buf[0].gpio_addr = gpio_addr; + cfg_info_buf[0].gpio_val = gpio_on_val; + + PrintGPIOCfgData(cfg_info_item_count, &cfg_info_buf[0]); + } + + if (cfg_get_gpio_data("audio.avout.mute.gpio", &cfg_info_item_count, cfg_info_buf) == 0) { + PrintGPIOCfgData(cfg_info_item_count, cfg_info_buf); + } + + cfg_info_item_count = 64; + if (cfg_get_gpio_data("audio.initaudio.gpioctl", &cfg_info_item_count, cfg_info_buf) == 0) { + PrintGPIOCfgData(cfg_info_item_count, cfg_info_buf); + } + + char tmp_buf[32] = { 0 }; + int mute_gpio_addr, mute_on_gpio_val, mute_off_gpio_val; + + if (GetAudioAnalogAmplifierMuteGPIOCFG(gpio_grp_str, &mute_gpio_addr, &mute_on_gpio_val, &mute_off_gpio_val) == 0) { + sprintf(tmp_buf, "w %s %d %d", gpio_grp_str, mute_gpio_addr, mute_on_gpio_val); + LOGD("%s, mute on write command %s\n", "GetAudioAnalogAmplifierMuteGPIOCFG", tmp_buf); + + sprintf(tmp_buf, "w %s %d %d", gpio_grp_str, mute_gpio_addr, mute_off_gpio_val); + LOGD("%s, mute off write command %s\n", "GetAudioAnalogAmplifierMuteGPIOCFG", tmp_buf); + } + + if (GetAudioHeadSetMuteGPIOCFG(gpio_grp_str, &mute_gpio_addr, &mute_on_gpio_val, &mute_off_gpio_val) == 0) { + sprintf(tmp_buf, "w %s %d %d", gpio_grp_str, mute_gpio_addr, mute_on_gpio_val); + LOGD("%s, mute on write command %s\n", "GetAudioHeadSetMuteGPIOCFG", tmp_buf); + + sprintf(tmp_buf, "w %s %d %d", gpio_grp_str, mute_gpio_addr, mute_off_gpio_val); + LOGD("%s, mute off write command %s\n", "GetAudioHeadSetMuteGPIOCFG", tmp_buf); + } + + if (GetAudioAVOutMuteGPIOCFG(gpio_grp_str, &mute_gpio_addr, &mute_on_gpio_val, &mute_off_gpio_val) == 0) { + sprintf(tmp_buf, "w %s %d %d", gpio_grp_str, mute_gpio_addr, mute_on_gpio_val); + LOGD("%s, mute on write command %s\n", "GetAudioAVOutMuteGPIOCFG", tmp_buf); + + sprintf(tmp_buf, "w %s %d %d", gpio_grp_str, mute_gpio_addr, mute_off_gpio_val); + LOGD("%s, mute off write command %s\n", "GetAudioAVOutMuteGPIOCFG", tmp_buf); + } + + if (GetWriteProtectGPIOCFG(gpio_grp_str, &mute_gpio_addr, &mute_on_gpio_val, &mute_off_gpio_val) == 0) { + sprintf(tmp_buf, "w %s %d %d", gpio_grp_str, mute_gpio_addr, mute_on_gpio_val); + LOGD("%s, protect on write command %s\n", "GetWriteProtectGPIOCFG", tmp_buf); + + sprintf(tmp_buf, "w %s %d %d", gpio_grp_str, mute_gpio_addr, mute_off_gpio_val); + LOGD("%s, protect off write command %s\n", "GetWriteProtectGPIOCFG", tmp_buf); + } + + tmpInfo.power_on_off_channel = 0; + tmpInfo.last_source_select = 0; + tmpInfo.system_language = 1; + + for (i = 0; i < 12; i++) { + tmpInfo.last_source_select = i; + } + + char item_buf[128] = { 0 }; + + for (i = 0; i < 16; i++) { + cfg_get_one_item("misc.lastselsrc.show.cfg", i, item_buf); + LOGD("item %d = %s\n", i, item_buf); + } + + config_uninit(); + + LOGD("file(%s)'s function(%s) exiting.\n", __FILE__, "TV"); + return 0; +} + +static int RealGetAudioAmplifierBiquadsDataBuffer(const char *key_str, int *biquad_count, int *biquad_item_count, int biquad_data_buf[]) +{ + int cfg_item_count = 0, tmpTotalItemCount = 0; + char *token = NULL; + const char *strDelimit = ","; + char prop_value[CC_CFG_VALUE_STR_MAX_LEN]; + + memset(prop_value, '\0', CC_CFG_VALUE_STR_MAX_LEN); + + config_get(key_str, prop_value, "null"); + if (strcasecmp(prop_value, "null") == 0) { + LOGE("%s, can't get config \"%s\"!!!\n", "TV", key_str); + *biquad_count = 0; + *biquad_item_count = 0; + return -1; + } + + tmpTotalItemCount = 0; + + token = strtok(prop_value, strDelimit); + while (token != NULL) { + if (cfg_item_count == 0) { + *biquad_count = strtoul(token, NULL, 16); + } else if (cfg_item_count == 1) { + *biquad_item_count = strtoul(token, NULL, 16); + } else if (cfg_item_count >= 2) { + biquad_data_buf[tmpTotalItemCount] = strtoul(token, NULL, 16); + tmpTotalItemCount += 1; + } + + token = strtok(NULL, strDelimit); + cfg_item_count += 1; + } + + if ((*biquad_count) * (*biquad_item_count) != tmpTotalItemCount) { + LOGE("%s, get item count error!!! should be %d, real is %d.\n", "TV", (*biquad_count) * (*biquad_item_count), tmpTotalItemCount); + *biquad_count = 0; + *biquad_item_count = 0; + return -1; + } + + LOGD("%s, biquad count = %d, biquad item count = %d.\n", "TV", *biquad_count, *biquad_item_count); + + return 0; +} + +static int GetAudioAmplifierBiquadsDataBuffer00(int *biquad_count, int *biquad_item_count, int biquad_data_buf[]) +{ + return RealGetAudioAmplifierBiquadsDataBuffer("audio.amplifier.biquad00.data", biquad_count, biquad_item_count, biquad_data_buf); +} + +static int GetAudioAmplifierBiquadsDataBuffer01(int *biquad_count, int *biquad_item_count, int biquad_data_buf[]) +{ + return RealGetAudioAmplifierBiquadsDataBuffer("audio.amplifier.biquad01.data", biquad_count, biquad_item_count, biquad_data_buf); +} + +static int GetTvAudioCardID(char tv_card_id_buf[]) +{ + config_get("audio.tv.card.id", tv_card_id_buf, "null"); + LOGD("%s, get card id is \"%s\".\n", "TV", tv_card_id_buf); + + if (strcmp(tv_card_id_buf, "null") == 0) { + strcpy(tv_card_id_buf, "hw:AMLM2"); + LOGD("%s, card id not config, we set to default \"%s\".\n", "TV", "hw:AMLM2"); + } + + return 0; +} + +static int GetTvAudioCardName(char tv_card_name_buf[]) +{ + config_get("audio.tv.card.name", tv_card_name_buf, "null"); + LOGD("%s, get card name is \"%s\".\n", "TV", tv_card_name_buf); + + if (strcmp(tv_card_name_buf, "null") == 0) { + strcpy(tv_card_name_buf, "AML-M2"); + LOGD("%s, card name not config, we set to default \"%s\".\n", "TV", "AML-M2"); + } + + return 0; +} + +static int ATVGetFacRestoreChanInfo(int *chan_cnt, int *item_cnt, int chan_data_buf[]) +{ + int cfg_item_count = 0, tmpTotalItemCount = 0; + char *token = NULL; + const char *strDelimit = ","; + const char *key_str = "atv.fac.defchaninfo"; + char prop_value[CC_CFG_VALUE_STR_MAX_LEN]; + + memset(prop_value, '\0', CC_CFG_VALUE_STR_MAX_LEN); + + config_get(key_str, prop_value, "null"); + if (strcasecmp(prop_value, "null") == 0) { + LOGE("%s, can't get config \"%s\"!!!\n", "TV", key_str); + *chan_cnt = 0; + *item_cnt = 0; + return -1; + } + + tmpTotalItemCount = 0; + + token = strtok(prop_value, strDelimit); + while (token != NULL) { + if (cfg_item_count == 0) { + *chan_cnt = strtoul(token, NULL, 10); + } else if (cfg_item_count == 1) { + *item_cnt = strtoul(token, NULL, 10); + } else if (cfg_item_count >= 2) { + chan_data_buf[tmpTotalItemCount] = strtoul(token, NULL, 10); + tmpTotalItemCount += 1; + } + + token = strtok(NULL, strDelimit); + cfg_item_count += 1; + } + + if ((*chan_cnt) * (*item_cnt) != tmpTotalItemCount) { + LOGE("%s, get item count error!!! should be %d, real is %d.\n", "TV", (*chan_cnt) * (*item_cnt), tmpTotalItemCount); + *chan_cnt = 0; + *item_cnt = 0; + return -1; + } + + LOGD("%s, channel count = %d, channel item count = %d.\n", "TV", *chan_cnt, *item_cnt); + + return 0; +} + +static void PrintGPIOCfgData(int cfg_info_item_count, GPIOCFGInfo cfg_info_buf[]) +{ + int i = 0; + + LOGD("%s, cfg_info_item_count = %d\n", "TV", cfg_info_item_count); + + for (i = 0; i < cfg_info_item_count; i++) { + LOGD("%s, %s %d %d %d\n", "TV", cfg_info_buf[i].gpio_grp_str, cfg_info_buf[i].gpio_addr, cfg_info_buf[i].gpio_val, !cfg_info_buf[i].gpio_val); + } + + LOGD("\n"); +} + +static int GetWriteProtectGPIOCFG(char gpio_grp_str[], int *protect_gpio_addr, int *protect_on_val, int *protect_off_val) +{ + if (cfg_get_one_gpio_data("ssm.writeprotect.gpio", gpio_grp_str, protect_gpio_addr, protect_on_val) < 0) { + return -1; + } + + *protect_off_val = !(*protect_on_val); + + return 0; +} + +#define CC_AMPLIFIER_ANALOG_MUTE_GPIO_CFG_NAME "audio.amp.analog.mute.gpio" +#define CC_HEADSET_MUTE_GPIO_CFG_NAME "audio.headset.mute.gpio" +#define CC_AVOUT_MUTE_GPIO_CFG_NAME "audio.avout.mute.gpio" + +static int GetAudioAnalogAmplifierMuteGPIOCFG(char gpio_grp_str[], int *mute_gpio_addr, int *mute_on_val, int *mute_off_val) +{ + if (cfg_get_one_gpio_data(CC_AMPLIFIER_ANALOG_MUTE_GPIO_CFG_NAME, gpio_grp_str, mute_gpio_addr, mute_on_val) < 0) { + return -1; + } + + *mute_off_val = !(*mute_on_val); + + return 0; +} + +static int GetAudioHeadSetMuteGPIOCFG(char gpio_grp_str[], int *mute_gpio_addr, int *mute_on_val, int *mute_off_val) +{ + if (cfg_get_one_gpio_data(CC_HEADSET_MUTE_GPIO_CFG_NAME, gpio_grp_str, mute_gpio_addr, mute_on_val) < 0) { + return -1; + } + + *mute_off_val = !(*mute_on_val); + + return 0; +} + +static int GetAudioAVOutMuteGPIOCFG(char gpio_grp_str[], int *mute_gpio_addr, int *mute_on_val, int *mute_off_val) +{ + if (cfg_get_one_gpio_data(CC_AVOUT_MUTE_GPIO_CFG_NAME, gpio_grp_str, mute_gpio_addr, mute_on_val) < 0) { + return -1; + } + + //Some projects has been volume production. They may not use the newest code, so we do compatible for old config. + //old config 69,0,1 + //new config x,69,0 + + if (gpio_grp_str[0] != 'x' || gpio_grp_str[0] != 'b' || gpio_grp_str[0] != 'd') { + *mute_gpio_addr = strtol(gpio_grp_str, NULL, 10); + gpio_grp_str[0] = 'x'; + gpio_grp_str[1] = '\0'; + *mute_off_val = *mute_on_val; + *mute_on_val = !(*mute_off_val); + } else { + *mute_off_val = !(*mute_on_val); + } + + return 0; +} + +#define PROPERTY_VALUE_MAX (92) + +typedef enum tvin_source_input_e { + SOURCE_TV, + SOURCE_AV1, + SOURCE_AV2, + SOURCE_YPBPR1, + SOURCE_YPBPR2, + SOURCE_HDMI1, + SOURCE_HDMI2, + SOURCE_HDMI3, + SOURCE_VGA, + SOURCE_MPEG, + SOURCE_DTV, + SOURCE_MAX, +} tv_source_input_t; + +static int property_set(const char *key_value, char *prop_value) +{ + LOGD("%s, %s = %s\n", "TV", key_value, prop_value); + return 0; +} |