// Update a ptz device void ptz_update(ptz_t *ptz) { // Update the device subscription if (rtk_menuitem_ischecked(ptz->subscribe_item)) { if (!ptz->proxy->info.subscribed) if (playerc_ptz_subscribe(ptz->proxy, PLAYER_OPEN_MODE) != 0) PRINT_ERR1("libplayerc error: %s", playerc_error_str()); } else { if (ptz->proxy->info.subscribed) if (playerc_ptz_unsubscribe(ptz->proxy) != 0) PRINT_ERR1("libplayerc error: %s", playerc_error_str()); } rtk_menuitem_check(ptz->subscribe_item, ptz->proxy->info.subscribed); // Draw in the ptz scan if it has been changed. if (ptz->proxy->info.subscribed) { if (ptz->proxy->info.datatime != ptz->datatime) ptz_draw(ptz); ptz->datatime = ptz->proxy->info.datatime; } else { rtk_fig_show(ptz->data_fig, 0); rtk_fig_show(ptz->data_fig_tilt, 0); } // Move the ptz if (ptz->proxy->info.subscribed && rtk_menuitem_ischecked(ptz->command_item)) { rtk_fig_show(ptz->cmd_fig, 1); rtk_fig_show(ptz->cmd_fig_tilt, 1); ptz_move(ptz); } else { rtk_fig_show(ptz->cmd_fig, 0); rtk_fig_show(ptz->cmd_fig_tilt, 0); } }
// Destroy a ptz device void ptz_destroy(ptz_t *ptz) { // Destroy figures rtk_fig_destroy(ptz->cmd_fig); rtk_fig_destroy(ptz->data_fig); rtk_fig_destroy(ptz->cmd_fig_tilt); rtk_fig_destroy(ptz->data_fig_tilt); // Destroy menu items rtk_menuitem_destroy(ptz->command_item); rtk_menuitem_destroy(ptz->subscribe_item); rtk_menu_destroy(ptz->menu); // Unsubscribe/destroy the proxy if (ptz->proxy->info.subscribed) playerc_ptz_unsubscribe(ptz->proxy); playerc_ptz_destroy(ptz->proxy); free(ptz->drivername); free(ptz); }
// Basic ptz test int test_ptz(playerc_client_t *client, int index) { int t; void *rdevice; playerc_ptz_t *device; double period; printf("device [ptz] index [%d]\n", index); device = playerc_ptz_create(client, index); TEST("subscribing (read)"); if (0 == playerc_ptz_subscribe(device, PLAYER_OPEN_MODE)) PASS(); else FAIL(); period = 10 / M_PI * 2; for (t = 0; t < 20; t++) { TEST1("reading data (attempt %d)", t); do rdevice = playerc_client_read(client); while (rdevice == client); if (rdevice == device) { PASS(); printf("ptz: [%d %d %d]\n", (int) (device->pan * 180 / M_PI), (int) (device->tilt * 180 / M_PI), (int) (device->zoom * 180 / M_PI)); } else { FAIL(); break; } TEST1("writing data (attempt %d)", t); if (playerc_ptz_set(device, sin(t / period) * M_PI / 2, sin(t / period) * M_PI / 3, (1 - t / 20.0) * M_PI) != 0) { FAIL(); break; } PASS(); } TEST1("writing data (attempt %d)", t); if (playerc_ptz_set(device, 0, 0, M_PI) != 0) FAIL(); else PASS(); TEST("unsubscribing"); if (playerc_ptz_unsubscribe(device) == 0) PASS(); else FAIL(); playerc_ptz_destroy(device); return 0; }