Add chage remote app
[apps/agl-service-windowmanager.git] / src / window_manager.hpp
index 712edec..9e710ce 100644 (file)
@@ -27,6 +27,8 @@
 #include "request.hpp"
 #include "wm_error.hpp"
 #include "wm_layer_control.hpp"
+#include "wm_connection.hpp"
+#include "low_can_client.hpp"
 extern "C"
 {
 #include <afb/afb-binding.h>
@@ -131,9 +133,38 @@ struct id_allocator
 struct TmpClient
 {
     std::string   appid;
-    unsigned layer;
+    unsigned pid;
 };
 
+struct TmpService
+{
+    std::string appid;  // Used to search who create service surface
+    std::string dest;   // Used to attach service to destination application
+    std::string service;// The name of service surface
+    std::string uuid;   // uuid
+    TmpService(const std::string& app, const std::string& dst,
+               const std::string& svc, const std::string& uuid)
+    : appid(app), dest(dst), service(svc), uuid(uuid) {}
+};
+
+struct CarInfo
+{
+    CarInfo()
+        : parking_brake_stt(true),
+          accel_pedal_stt(false),
+          accel_pedal_pos(0.0),
+          running_stt(false),
+          headlamp_stt(false),
+          lightstatus_brake_stt(true)
+    {};
+
+    bool parking_brake_stt;
+    bool accel_pedal_stt;
+    double accel_pedal_pos;
+    bool running_stt;
+    bool headlamp_stt;
+    bool lightstatus_brake_stt;
+};
 
 class WindowManager
 {
@@ -156,45 +187,90 @@ class WindowManager
 
         Event_ScreenUpdated,
 
+        Event_Handshake,
+
+        Event_HeadlampOff,
+        Event_HeadlampOn,
+
+        Event_ParkingBrakeOff,
+        Event_ParkingBrakeOn,
+
+        Event_LightstatusBrakeOff,
+        Event_LightstatusBrakeOn,
+
+        Event_CarStop,
+        Event_CarRun,
+
         Event_Error,
 
         Event_Val_Max = Event_Error,
     };
 
+    enum WM_Mode
+    {
+        Mode_Standalone = 0,
+        Mode_Connection,
+    };
+
     explicit WindowManager();
     ~WindowManager() = default;
-
     WindowManager(WindowManager const &) = delete;
     WindowManager &operator=(WindowManager const &) = delete;
     WindowManager(WindowManager &&) = delete;
     WindowManager &operator=(WindowManager &&) = delete;
 
     int init();
+    void sendHandshake();
+    void setSubscribed(bool flg);
 
     result<int> api_request_surface(char const *appid, char const *role);
     char const *api_request_surface(char const *appid, char const *role, char const *ivi_id);
+    bool api_set_role(char const *appid, char const *role);
     void api_activate_window(char const *appid, char const *role, char const *drawing_area, const reply_func &reply);
+    void api_activate_surface_for_slave(char const *appid, char const *drawing_name,
+                                        char const *drawing_area, const reply_func &reply);
+    void api_activate_surface_to_master(char const *appid, char const *drawing_name,
+                                        char const *drawing_area, const reply_func &reply);
     void api_deactivate_window(char const *appid, char const *role, const reply_func &reply);
+    void api_deactivate_surface_for_slave(char const *appid, char const *drawing_name,
+                                          const reply_func &reply);
+    void api_deactivate_surface_to_master(char const *appid, char const *drawing_name,
+                                          const reply_func &reply);
     void api_enddraw(char const *appid, char const *role);
     int  api_subscribe(afb_req req, int event_id);
+    void api_handshake();
+    void api_enddraw_for_remote(char const *appid, char const *drawing_name);
+    bool api_client_set_render_order(const char *appid, const std::vector<std::string> &render_order);
+    std::string api_client_attach_service_surface(const char* appid, const char* dest, const char* service_surface);
+    json_object* api_get_area_list();
+    void api_change_area_size(ChangeAreaReq &areas);
     result<json_object *> api_get_display_info();
     result<json_object *> api_get_area_info(char const *role);
-    void api_ping();
+    result<json_object *> api_get_car_info(char const *label);
+    void send_event(const std::string& evname);
     void send_event(const std::string& evname, const std::string& role);
     void send_event(const std::string& evname, const std::string& role, const std::string& area, int x, int y, int w, int h);
 
     // Events from the compositor we are interested in
-    void surface_created(unsigned surface_id);
+    void surface_created(unsigned pid, unsigned surface_id);
     void surface_removed(unsigned surface_id);
 
     void removeClient(const std::string &appid);
     void exceptionProcessForTransition();
     const char* convertRoleOldToNew(char const *role);
 
+    void analyzeReceivedEvent(const char *event, struct json_object *object);
+
+
     // Do not use this function
     void timerHandler();
     void startTransitionWrapper(std::vector<WMAction> &actions);
     void processError(WMError error);
+    void processForRemoteRequest(json_object *data);
+    std::string searchApp(unsigned pid, unsigned ppid, unsigned surface, json_object* resp);
+    void storeSurface(const std::string& appid, unsigned ppid, unsigned surface);
+
+    WMConnection wmcon;
 
   private:
     // WM Events to clients
@@ -206,11 +282,24 @@ class WindowManager
     void emit_visible(const std::string& role, bool is_visible);
     void emit_invisible(const std::string& role);
     void emit_visible(const std::string& role);
+    void emitHeadlampOff();
+    void emitHeadlampOn();
+    void emitParkingBrakeOff();
+    void emitParkingBrakeOn();
+    void emitLightstatusBrakeOff();
+    void emitLightstatusBrakeOn();
+    void emitCarStop();
+    void emitCarRun();
 
     WMError setRequest(const std::string &appid, const std::string &role, const std::string &area,
                              Task task, unsigned *req_num);
+    WMError setRequest(Task task, unsigned* req_num);
+    WMError setRequestForSlave(const std::string& appid, const std::string &role,
+                               const std::string &area, Task task, unsigned* req_num);
     WMError checkPolicy(unsigned req_num);
+    WMError checkPolicyForSlave(unsigned req_num);
     WMError startTransition(unsigned req_num);
+    void transitionCarState(TaskCarState task);
 
     WMError doEndDraw(unsigned req_num);
     void    emitScreenUpdated(unsigned req_num);
@@ -219,23 +308,34 @@ class WindowManager
     void stopTimer();
     void processNextRequest();
 
-    int loadOldRoleDb();
+    int loadOldRolesConfigFile();
+
+    int saveLastModeData(unsigned req_num);
+
+    Task convertCanSignalToCarStateTask(const char *signal_name);
+    void inputCarStateTask(Task task);
 
     const char *check_surface_exist(const char *role);
 
   private:
     std::map<std::string, struct afb_event> map_afb_event;
-    std::unordered_map<std::string, struct rect> area2size;
     std::unordered_map<std::string, std::string> roleold2new;
     std::unordered_map<std::string, std::string> rolenew2old;
     std::shared_ptr<LayerControl> lc;
+
+    LowCanClient lcc;
+    CarInfo crr_car_info;
+
     PMWrapper pmw;
     rect_map area_info;
     struct id_allocator id_alloc;
 
+    bool subscribed;
+
     // ID allocation and proxy methods for lookup
     std::unordered_map<unsigned, struct TmpClient> tmp_surface2app;
-    static const char* kDefaultOldRoleDb;
+    std::vector<struct TmpService> tmp_services;
+    static const char* kDefaultOldRolesConfig;
 };
 
 } // namespace wm