Skip to content

Commit

Permalink
set snap to URL
Browse files Browse the repository at this point in the history
  • Loading branch information
pianist committed Mar 24, 2024
1 parent 92d338c commit f85d8ca
Show file tree
Hide file tree
Showing 10 changed files with 143 additions and 12 deletions.
8 changes: 4 additions & 4 deletions bewagramd/call_button.c
Original file line number Diff line number Diff line change
Expand Up @@ -215,12 +215,12 @@ void* playmusic_play_th_proc(void* p)
extern evcurl_processor_t* g_evcurl_proc;
extern struct DaemonConfig g_dcfg;

static void test_req_cb(evcurl_req_result_t* res)
static void test_req_cb(evcurl_req_result_t* res, void *src_req_data)
{
log_info("Req tst DONE: %d\n", res->result);
log_info(" effective URL: %s\n", res->effective_url);
log_info("Req tst DONE: %d", res->result);
log_info(" effective URL: %s", res->effective_url);
log_info(" %ld\n", res->response_code);
log_info(" Content-Type: %s\n", res->content_type ? res->content_type : "(none)");
log_info(" Content-Type: %s", res->content_type ? res->content_type : "(none)");
}

static void call_button_cb(int gpio_num, char state)
Expand Down
1 change: 1 addition & 0 deletions bewagramd/cfg.c
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ static int __cfg_daemon_read_keyval_cb_snap(const char* k, const char* v)
KEYVAL_PARAM_UL_dec("width", __current_dc->snap.width)
KEYVAL_PARAM_UL_dec("height", __current_dc->snap.height)
KEYVAL_PARAM_ENUM("vpss_chn", __current_dc->snap.vpss_chn, cfg_daemon_vals_vpss_chn);
KEYVAL_PARAM_COPY_STR("http_PUT_snap_url", __current_dc->snap.http_PUT_snap_url, 256);

snprintf(__cfg_daemon_error_key, 256, "%s", k);
return CFG_PROC_KEY_BAD;
Expand Down
1 change: 1 addition & 0 deletions bewagramd/cfg.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ struct SnapConfig {
unsigned width;
unsigned height;
enum VPSS_CHN_E vpss_chn;
char http_PUT_snap_url[256];
};

struct DaemonConfig {
Expand Down
2 changes: 1 addition & 1 deletion bewagramd/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ int main(int argc, char** argv)
evcurl_destroy(g_evcurl_proc);
g_evcurl_proc = 0;

done_snap_machine(&g_dcfg);
done_snap_machine(loop, &g_dcfg);
hitiny_MPI_VENC_Done();

hitiny_MPI_SYS_Done();
Expand Down
53 changes: 52 additions & 1 deletion bewagramd/snap.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include "snap.h"
#include "aux/logger.h"
#include <evcurl/evcurl.h>
#include <hitiny/hitiny_venc.h>
#include <hitiny/hitiny_sys.h>
#include <stdlib.h>
Expand Down Expand Up @@ -44,6 +45,26 @@ static int init_snap_machine_checkcfg(const struct DaemonConfig* dc)

ev_io venc_snap_ev_io;

extern evcurl_processor_t* g_evcurl_proc;
extern struct DaemonConfig g_dcfg;

static void PUT_snap_req_end_cb(evcurl_req_result_t* res, void* src_req_data)
{
log_info("PUT snap Req DONE: %d\n", res->result);
struct evcurl_upload_req_s* put_req = (struct evcurl_upload_req_s*)src_req_data;
log_info(" upload data sz was %u\n", put_req->sz_buf);
log_info(" effective URL: %s\n", res->effective_url);
log_info(" %ld\n", res->response_code);
log_info(" Content-Type: %s\n", res->content_type ? res->content_type : "(none)");

if (!res->sz_body) return;

log_info("\n\n%.*s\n--------------------------------------------------------------\n", (int)res->sz_body, (const char*)res->body);

free(put_req->buf);
free(put_req);
}

static void __venc_snap_cb(struct ev_loop *loop, ev_io* _w, int revents)
{
log_info("event on fd = VENC: 0x%x ()", revents);
Expand All @@ -56,6 +77,34 @@ static void __venc_snap_cb(struct ev_loop *loop, ev_io* _w, int revents)
stStream.pstPack = (VENC_PACK_S*)malloc(sizeof(VENC_PACK_S) * stStat.u32CurPacks);
stStream.u32PackCount = stStat.u32CurPacks;
hitiny_MPI_VENC_GetStream(SNAP_VENC_CHN_ID, &stStream, HI_FALSE);

struct evcurl_upload_req_s* upload_data = (struct evcurl_upload_req_s*)malloc(sizeof(struct evcurl_upload_req_s));
upload_data->sz_buf = 0;
for (unsigned iii = 0; iii < stStream.u32PackCount; iii++)
{
VENC_PACK_S* pstData = &(stStream.pstPack[iii]);
upload_data->sz_buf += pstData->u32Len[0];
upload_data->sz_buf += pstData->u32Len[1];
}

upload_data->buf = malloc(upload_data->sz_buf);
upload_data->ptr = upload_data->buf;

for (unsigned iii = 0; iii < stStream.u32PackCount; iii++)
{
VENC_PACK_S* pstData = &(stStream.pstPack[iii]);
memcpy(upload_data->ptr, pstData->pu8Addr[0], pstData->u32Len[0]);
upload_data->ptr += pstData->u32Len[0];
memcpy(upload_data->ptr, pstData->pu8Addr[1], pstData->u32Len[1]);
upload_data->ptr += pstData->u32Len[1];
}

upload_data->ptr = upload_data->buf;
upload_data->url = g_dcfg.snap.http_PUT_snap_url;
evcurl_new_UPLOAD(g_evcurl_proc, upload_data, PUT_snap_req_end_cb);

log_info("%u from 0x%x to 0x%x", upload_data->sz_buf, upload_data->buf, upload_data->ptr);

hitiny_MPI_VENC_ReleaseStream(SNAP_VENC_CHN_ID, &stStream);
free(stStream.pstPack);
stStream.pstPack = NULL;
Expand Down Expand Up @@ -139,8 +188,10 @@ void snap_machine_TAKE()
hitiny_MPI_VENC_StartRecvPic(SNAP_VENC_CHN_ID);
}

int done_snap_machine(const struct DaemonConfig* dc)
int done_snap_machine(struct ev_loop* loop, const struct DaemonConfig* dc)
{
ev_io_stop(loop, &venc_snap_ev_io);

hitiny_MPI_VENC_StopRecvPic(SNAP_VENC_CHN_ID);
hitiny_sys_unbind_VPSS_GROUP(0, (int)dc->snap.vpss_chn, SNAP_VENC_GRP_ID);
hitiny_MPI_VENC_UnRegisterChn(SNAP_VENC_CHN_ID);
Expand Down
2 changes: 1 addition & 1 deletion bewagramd/snap.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
#include <ev.h>

int init_snap_machine(struct ev_loop* loop, const struct DaemonConfig* dc);
int done_snap_machine(const struct DaemonConfig* dc);
int done_snap_machine(struct ev_loop* loop, const struct DaemonConfig* dc);

void snap_machine_TAKE();

Expand Down
57 changes: 56 additions & 1 deletion evcurl/evcurl.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ typedef struct evcurl_http_req_info_s
CURL* easy;
evcurl_processor_t* mp;
evcurl_req_done_cb finish_cb;
void* src_req_data;
evcurl_req_result_t result;
} evcurl_http_req_info_t;

Expand Down Expand Up @@ -43,7 +44,7 @@ static void evcurl_check_multi_info(evcurl_processor_t *mp)


conn->result.result = msg->data.result;
if (conn->finish_cb) conn->finish_cb(&conn->result);
if (conn->finish_cb) conn->finish_cb(&conn->result, conn->src_req_data);

curl_multi_remove_handle(mp->multi, easy);
curl_easy_cleanup(easy);
Expand Down Expand Up @@ -230,3 +231,57 @@ CURLMcode evcurl_new_http_GET(evcurl_processor_t *mp, char *url, evcurl_req_done
return rc;
}

static size_t __upload_data_read_cb(char *buffer, size_t size, size_t nitems, void *userdata)
{
evcurl_upload_req_t* req = (evcurl_upload_req_t*)userdata;

size_t cpy_sz = size * nitems;
size_t cpy_left = req->sz_buf - ((char*)req->ptr - (char*)req->buf);

if (cpy_left < cpy_sz) cpy_sz = cpy_left;

memcpy(buffer, req->ptr, cpy_sz);
req->ptr = (char*)req->ptr + cpy_sz;

return cpy_sz;
}

CURLMcode evcurl_new_UPLOAD(evcurl_processor_t *mp, evcurl_upload_req_t* req, evcurl_req_done_cb _finish_cb)
{
evcurl_http_req_info_t *conn;
CURLMcode rc;

conn = calloc(1, sizeof(evcurl_http_req_info_t));

conn->easy = curl_easy_init();
if (!conn->easy) return CURLM_OUT_OF_MEMORY;

conn->mp = mp;
conn->finish_cb = _finish_cb;
conn->src_req_data = req;

curl_easy_setopt(conn->easy, CURLOPT_URL, req->url);

curl_easy_setopt(conn->easy, CURLOPT_FOLLOWLOCATION, 1);
curl_easy_setopt(conn->easy, CURLOPT_MAXREDIRS, 3);

curl_easy_setopt(conn->easy, CURLOPT_TIMEOUT, 30);
curl_easy_setopt(conn->easy, CURLOPT_CONNECTTIMEOUT, 5);

curl_easy_setopt(conn->easy, CURLOPT_UPLOAD, 1L);
curl_easy_setopt(conn->easy, CURLOPT_INFILESIZE, req->sz_buf);
curl_easy_setopt(conn->easy, CURLOPT_READFUNCTION, __upload_data_read_cb);

req->ptr = req->buf; // start READ from buf
curl_easy_setopt(conn->easy, CURLOPT_READDATA, req);

curl_easy_setopt(conn->easy, CURLOPT_WRITEFUNCTION, __simple_body_write_cb);
curl_easy_setopt(conn->easy, CURLOPT_WRITEDATA, conn);

curl_easy_setopt(conn->easy, CURLOPT_PRIVATE, conn);

rc = curl_multi_add_handle(mp->multi, conn->easy);
return rc;
}


5 changes: 3 additions & 2 deletions evcurl/evcurl.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ typedef struct evcurl_req_result_s
size_t sz_body;
} evcurl_req_result_t;

typedef void (*evcurl_req_done_cb)(evcurl_req_result_t* res);
typedef void (*evcurl_req_done_cb)(evcurl_req_result_t* res, void* src_req_data);

CURLMcode evcurl_new_http_GET(evcurl_processor_t *mp, char *url, evcurl_req_done_cb _finish_cb);

Expand All @@ -43,9 +43,10 @@ typedef struct evcurl_upload_req_s

void* buf;
size_t sz_buf;
void* ptr;
} evcurl_upload_req_t;

CURLMcode evcurl_new_UPLOAD(evcurl_processor_t *mp, const evcurl_upload_req_t* req, evcurl_req_done_cb _finish_cb);
CURLMcode evcurl_new_UPLOAD(evcurl_processor_t *mp, evcurl_upload_req_t* req, evcurl_req_done_cb _finish_cb);

#endif //__evcurl_h__

2 changes: 1 addition & 1 deletion evgpio/evgpio.c
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ int evgpio_watcher_init(struct ev_loop* loop, int gpio_num, evgpio_watcher_cb _c
int buf_len = snprintf(buf, 8, "%d", gpio_num);
if (buf_len <= 0) return -1;

snprintf(filename, MAX_PATH_LEN, "/sys/class/gpio/export", gpio_num);
snprintf(filename, MAX_PATH_LEN, "/sys/class/gpio/export");
fd = open(filename, O_WRONLY);
if (fd < 0)
{
Expand Down
24 changes: 23 additions & 1 deletion tests/test_evcurl.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#include <evcurl/evcurl.h>

void req_end_cb(evcurl_req_result_t* res)
void req_end_cb(evcurl_req_result_t* res, void* src_req_data)
{
printf("Req DONE: %d\n", res->result);
printf(" effective URL: %s\n", res->effective_url);
Expand All @@ -12,6 +12,20 @@ void req_end_cb(evcurl_req_result_t* res)
printf("\n\n%.*s\n--------------------------------------------------------------\n", (int)res->sz_body, (const char*)res->body);
}

void PUT_req_end_cb(evcurl_req_result_t* res, void* src_req_data)
{
printf("PUT Req DONE: %d\n", res->result);
struct evcurl_upload_req_s* put_req = (struct evcurl_upload_req_s*)src_req_data;
printf(" upload data sz was %u\n", put_req->sz_buf);
printf(" effective URL: %s\n", res->effective_url);
printf(" %ld\n", res->response_code);
printf(" Content-Type: %s\n", res->content_type ? res->content_type : "(none)");

if (!res->sz_body) return;

printf("\n\n%.*s\n--------------------------------------------------------------\n", (int)res->sz_body, (const char*)res->body);
}


int main(int argc, char **argv)
{
Expand All @@ -23,6 +37,14 @@ int main(int argc, char **argv)
evcurl_new_http_GET(_p, "http://192.168.88.222/", req_end_cb);
evcurl_new_http_GET(_p, "https://example.com/", req_end_cb);

struct evcurl_upload_req_s put_req;
memset(&put_req, 0, sizeof(struct evcurl_upload_req_s));
put_req.buf = "qweqweqwe";
put_req.sz_buf = 9;
put_req.ptr = put_req.buf;
put_req.url = "http://example.com/upload";
evcurl_new_UPLOAD(_p, &put_req, PUT_req_end_cb);

ev_loop(_p->loop, 0);

evcurl_destroy(_p);
Expand Down

0 comments on commit f85d8ca

Please sign in to comment.