hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#if CONFIG_DBSERVER
#include "../utils/log.h"
#include "json-c/json.h"
#include "dbus_signal.h"
#include "isp_func.h"
#include <gdbus.h>
 
#define ISPSERVER "rockchip.ispserver"
#define ISPSERVER_PATH "/"
#define ISPSERVER_INTERFACE ISPSERVER ".server"
 
#define ISP_STATUS_CMD                                            \
  "{ \"status\": \"%d\" }"                                                     \
 
static DBusConnection *g_isp_conn = NULL;
static int manage_init_flag = 0;
extern rk_aiq_working_mode_t gc_hdr_mode;
 
static gboolean signal_ispchanged(DBusConnection *conn, char *interface, char *json_str)
{
    DBusMessage *signal;
    DBusMessageIter iter;
 
    if (interface == NULL)
        return FALSE;
 
    signal = dbus_message_new_signal(ISPSERVER_PATH,
                                     interface, "IspStatusChanged");
    if (!signal)
        return FALSE;
 
    dbus_message_iter_init_append(signal, &iter);
    dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &json_str);
 
    dbus_connection_send(conn, signal, NULL);
    dbus_message_unref(signal);
 
    return TRUE;
}
 
static int isp_signal_send(int status) {
  char j_str[128] = {0};
  sprintf(j_str, ISP_STATUS_CMD, status);
  LOG_INFO("isp status: %d\n", status);
  signal_ispchanged(g_isp_conn, ISPSERVER_INTERFACE, j_str);
  return 0;
}
 
static DBusMessage *get_dump_exposure_info(DBusConnection *conn,
                                           DBusMessage *msg, void *data) {
  const char *sender;
  char *interface;
  char str[128] = {'\0'};
  DBusMessage *reply;
  DBusMessageIter array;
  dbus_bool_t onoff;
  LOG_DEBUG("get_dump_exposure_info\n");
 
  sender = dbus_message_get_sender(msg);
  dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &interface,
                        DBUS_TYPE_INVALID);
 
  Uapi_ExpQueryInfo_t stExpInfo;
  rk_aiq_wb_cct_t stCCT;
  exposure_info_get(&stExpInfo, &stCCT);
  if (gc_hdr_mode == RK_AIQ_WORKING_MODE_NORMAL) {
    sprintf(str, "M:%.0f-%.1f LM:%.1f CT:%.1f",
            stExpInfo.CurExpInfo.LinearExp.exp_real_params.integration_time *
                1000 * 1000,
            stExpInfo.CurExpInfo.LinearExp.exp_real_params.analog_gain,
            stExpInfo.MeanLuma, stCCT.CCT);
  } else {
    sprintf(str, "S:%.0f-%.1f M:%.0f-%.1f L:%.0f-%.1f SLM:%.1f MLM:%.1f "
                 "LLM:%.1f CT:%.1f",
            stExpInfo.CurExpInfo.HdrExp[0].exp_real_params.integration_time *
                1000 * 1000,
            stExpInfo.CurExpInfo.HdrExp[0].exp_real_params.analog_gain,
            stExpInfo.CurExpInfo.HdrExp[1].exp_real_params.integration_time *
                1000 * 1000,
            stExpInfo.CurExpInfo.HdrExp[1].exp_real_params.analog_gain,
            stExpInfo.CurExpInfo.HdrExp[2].exp_real_params.integration_time *
                1000 * 1000,
            stExpInfo.CurExpInfo.HdrExp[2].exp_real_params.analog_gain,
            stExpInfo.HdrMeanLuma[0], stExpInfo.HdrMeanLuma[1],
            stExpInfo.HdrMeanLuma[2], stCCT.CCT);
  }
  LOG_DEBUG("isp exposure dump: %s\n", str);
 
  reply = dbus_message_new_method_return(msg);
  if (!reply)
    return NULL;
  dbus_message_iter_init_append(reply, &array);
  const char *str_const = (const char *)&str;
  dbus_message_iter_append_basic(&array, DBUS_TYPE_STRING,
                                 &str_const); // must const
 
  return reply;
}
 
static DBusMessage *sendTurnoffSignal(DBusConnection *conn,
                             DBusMessage *msg, void *data)
{
    isp_signal_send(2);
    LOG_INFO("sendTurnoffSignal\n");
    return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
}
 
static const GDBusMethodTable server_methods[] = {
    {GDBUS_METHOD("GetDumpExposureInfo", NULL, GDBUS_ARGS({"str", "s"}),
                  get_dump_exposure_info)},
    {
      GDBUS_ASYNC_METHOD("SendTurnoffIspSignal",
      NULL, NULL, sendTurnoffSignal)
    },
    {},
};
 
static const GDBusSignalTable server_signals[] = {
    {
        GDBUS_SIGNAL("IspStatusChanged",
        GDBUS_ARGS({ "json", "s" }))
    },
    { },
};
 
void manage_init(void) {
  if (manage_init_flag)
    return;
  manage_init_flag = 1;
  LOG_INFO("manage_init\n");
  DBusError err;
  DBusConnection *connection;
 
  dbus_error_init(&err);
#if CONFIG_CALLFUNC
  LOG_INFO("register NULL dbus conn\n");
  connection = g_dbus_setup_bus(DBUS_BUS_SYSTEM, NULL, &err);
#else
  LOG_INFO("register %s dbus conn\n", ISPSERVER);
  connection = g_dbus_setup_bus(DBUS_BUS_SYSTEM, ISPSERVER, &err);
#endif
  if (!connection) {
    LOG_ERROR("connect fail\n");
    return;
  }
  g_isp_conn = connection;
  g_dbus_register_interface(g_isp_conn, "/", ISPSERVER_INTERFACE,
                            server_methods, server_signals, NULL, NULL, NULL);
  if (dbus_error_is_set(&err)) {
    LOG_ERROR("Error: %s\n", err.message);
  }
  int ret = isp_status_sender_register(&isp_signal_send);
  if (ret) {
    LOG_ERROR("isp_status_sender_register Error: %d\n", ret);
  }
}
 
#endif