في الإصدار 1.0 من نظام العرض الممتد (EVS) السابق، كانت أجهزة الكاميرا تعتبر أجهزة للقراءة فقط، وبالتالي، لم تكن هناك طريقة تمكّن لتغيير مَعلمات التحكّم في الكاميرا مثل التكبير أو التصغير أو السطوع.
ولأن هذا قد يقيد قدرة تطبيقات EVS، فإن الإصدار 1.1 الجديد من EVS
تقديم طرق جديدة وتمكين التطبيق من برمجة عدة كاميرات
مَعلمات التحكّم، والتي يتم تحديدها كلّها في enum CameraParam
:
/** * EVS Camera Parameter */ enum CameraParam : uint32_t { /** * The brightness of image frames */ BRIGHTNESS, /** * The contrast of image frames */ CONTRAST, /** * Automatic gain/exposure control */ AUTOGAIN, /** * Gain control */ GAIN, /** * Automatic Whitebalance */ AUTO_WHITE_BALANCE, /** * Manual white balance setting as a color temperature in Kelvin. */ WHITE_BALANCE_TEMPERATURE, /** * Image sharpness adjustment */ SHARPNESS, /** * Auto Exposure Control modes; auto, manual, shutter priority, or * aperture priority. */ AUTO_EXPOSURE, /** * Manual exposure time of the camera */ ABSOLUTE_EXPOSURE, /** * Set the focal point of the camera to the specified position. This * parameter may not be effective when auto focus is enabled. */ ABSOLUTE_FOCUS, /** * Enables continuous automatic focus adjustments. */ AUTO_FOCUS, /** * Specify the objective lens focal length as an absolute value. */ ABSOLUTE_ZOOM, };
يتم تعريف الطرق على النحو التالي:
/** * Requests to be a master client. * * When multiple clients subscribe to a single camera hardware and one of * them adjusts a camera parameter such as the contrast, it may disturb * other clients' operations. Therefore, the client must call this method * to be a master client. When it becomes a master, it can * change camera parameters until either it dies or explicitly gives up the * role. * * @return result EvsResult::OK if a master role is granted. * EvsResult::OWNERSHIP_LOST if there is already a * master client. */ setMaster() generates (EvsResult result); /** * Sets to be a master client forcibly. * * The client, which owns the display, has a high priority and can take over * a master role from other clients without the display. * * @param display IEvsDisplay handle. If this is valid, the calling client * is considered as the high priority client and therefore * it would take over a master role. * * @return result EvsResult::OK if a master role is granted. * EvsResult::OWNERSHIP_LOST if there is already a * master client with the display. */ forceMaster(IEvsDisplay display) generates (EvsResult result); /** * Retires from a master client role. * * @return result EvsResult::OK if this call is successful. * EvsResult::INVALID_ARG if the caller client is not a * master client. */ unsetMaster() generates (EvsResult result); /** * Retrieves a list of parameters this camera supports. * * @return params A list of CameraParam that this camera supports. */ getParameterList() generates (vec<CameraParam> params); /** * Requests a valid value range of a camera parameter * * @param id The identifier of camera parameter, CameraParam enum. * * @return min The lower bound of the valid parameter value range. * @return max The upper bound of the valid parameter value range. * @return step The resolution of values in valid range. */ getIntParameterRange(CameraParam id) generates (int32_t min, int32_t max, int32_t step); /** * Requests to set a camera parameter. * * @param id The identifier of camera parameter, * CameraParam enum. * value A desired parameter value. * @return result EvsResult::OK if it succeeds to set a parameter. * EvsResult::INVALID_ARG if either a requested * parameter is not supported or a given value is out * of bounds. * effectiveValue A programmed parameter value. This may differ * from what the client gives if, for example, the * driver does not support a target parameter. */ setIntParameter(CameraParam id, int32_t value) generates (EvsResult result, int32_t effectiveValue); /** * Retrieves a value of given camera parameter. * * @param id The identifier of camera parameter, CameraParam enum. * @return result EvsResult::OK if it succeeds to read a parameter. * EvsResult::INVALID_ARG if either a requested parameter is * not supported. * value A value of requested camera parameter. */ getIntParameter(CameraParam id) generates(EvsResult result, int32_t value);
تعرض الدالة getParameterList()
قائمة بالمعلمات
(تعداد CameraParam
) يمكن للعميل القراءة والكتابة (إذا كان العميل رئيسيًا)،
وتنقل getIntParameterRange()
نطاق القيمة الصالحين والدقة.
عندما يغيّر عميل رئيسي مَعلمة الكاميرا، تستعين جميع البرامج الأخرى على الكاميرا نفسها
الأجهزة من خلال تلقّي حدث PARAMETER_CHANGED
يحتوي على
معرّف المعلمة والقيمة الجديدة.
ملاحظة: قد يتعامل برنامج تشغيل أداة الاستشعار مع مَعلمات غير صالحة.
والقيم بشكل مختلف. قد يتم ببساطة عرض رمز خطأ أو اقتصاص القيمة في
نطاق صالح وتطبيقه. لذلك، تُرجع الطريقة setIntParameter()
قيمة فعّالة ويمكن للعميل استخدام هذه القيمة لتأكيد كيفية تنفيذ الطلب
التعامل معها.
طلب التحكيم بين برامج الكاميرا المتعدّدة
نظرًا لأن تصميم EVS السابق سمح لتطبيقات متعددة للاشتراك في جهاز كاميرا واحد، فيمكن لتطبيق واحد تعطيل عمليات التطبيقات الأخرى بتغيير معلمة الكاميرا. كذلك، قد يرغب العديد من العملاء في تعديل نفس المعلمة بشكل مختلف وبالتالي يتسبب في حدوث سلوك غير متوقع عند تشغيل خدمات الكاميرا.
لتجنُّب هذه المشاكل، يسمح مدير EVS بذلك العميل الرئيسي فقط.
لبرمجة معلمة الكاميرا. قبل محاولة ضبط أي معلمة للكاميرا، يستخدم البرنامج
يجب أن تصبح عميلاً رئيسيًا من خلال الاتصال بـ setMaster()
. إذا فشل ذلك، فهذا يعني أن هناك عميلًا رئيسيًا نشطًا بالفعل
على جهاز الكاميرا هذا. إلى أن يموت العميل الرئيسي الحالي أو بشكلٍ صريح
يمنح دورًا رئيسيًا من خلال unsetMaster()
، ولا يوجد عميل آخر
السماح بتغيير معلمة الكاميرا. عندما يرجع العميل الرئيسي امتيازه،
سيتم إرسال إشعار إلى جميع التطبيقات الأخرى من خلال حدث MASTER_RELEASED
.
العملاء ذوو الأولوية العالية
يتعامل مدير EVS مع العميل الذي يملك الشاشة ذات الأولوية ويسمح لها بسرقة دور رئيسي من محترف حالي. لأنّ EVS عرض ملكية الإعلان على الحداثة، يمكن حتى للعميل الجديد تولي العميل الحالي بالشاشة.
على العملاء ذوي الأولوية العالية الاتصال بالرقم IEvsCamera::forceMaster(sp<IEvsDisplay>& display)
للحصول على دور رئيسي. يفحص مدير EVS حالة شاشة عرض معينة
الاسم المعرِّف وإذا كانت حالته (وفقط إذا) صالحة
DisplayState::NOT_OPEN
أو DisplayState::DEAD
تستبدل الشريحة الرئيسية. يكون العميل، الذي يفقد ببساطة الدور الرئيسي،
تم الإخطار من خلال حدث MASTER_RELEASED
ويجب التعامل معها
هذا بشكل صحيح.