| | |
| | | #include <stdlib.h>
|
| | | #include <unistd.h>
|
| | | #include <semaphore.h>
|
| | | #include <string.h>
|
| | | #include <pthread.h>
|
| | | #include <signal.h>
|
| | | #include <errno.h>
|
| | |
| | | int ret;
|
| | |
|
| | | SOAP_ASSERT(DevData != NULL);
|
| | | SOAP_ASSERT(DevData->profilesToken != NULL);
|
| | | SOAP_ASSERT(DevData->profiles != NULL);
|
| | |
|
| | | ret = DevData->profilesToken->venc.Width;
|
| | | ret = DevData->profiles->venc.Width;
|
| | |
|
| | | return ret;
|
| | | }
|
| | |
| | | int ret;
|
| | |
|
| | | SOAP_ASSERT(DevData != NULL);
|
| | | SOAP_ASSERT(DevData->profilesToken != NULL);
|
| | | SOAP_ASSERT(DevData->profiles != NULL);
|
| | |
|
| | | ret = DevData->profilesToken->venc.Height;
|
| | | ret = DevData->profiles->venc.Height;
|
| | |
|
| | | return ret;
|
| | | }
|
| | |
|
| | | static void cb_probe(char *DeviceXAddr) {
|
| | |
|
| | | int len;
|
| | | char *pos_s, *pos_e;
|
| | |
|
| | | if (gPtzDevs == NULL) {
|
| | |
|
| | |
| | | SOAP_ASSERT(gPtzDevs != NULL);
|
| | |
|
| | | memset(gPtzDevs, 0x00, sizeof(PtzDevs));
|
| | |
|
| | | pos_s = strstr(DeviceXAddr, ADDR_PREFIX);
|
| | | pos_e = strstr(DeviceXAddr + strlen(ADDR_PREFIX), ADDR_LAST);
|
| | | len = pos_e - DeviceXAddr - strlen(ADDR_PREFIX);
|
| | | memcpy(gPtzDevs->ip, DeviceXAddr + strlen(ADDR_PREFIX), len);
|
| | | }
|
| | |
|
| | | proto_GetCapabilities(DeviceXAddr, &(gPtzDevs->capa), USERNAME, PASSWORD);
|
| | | proto_GetProfiles(gPtzDevs->capa.MediaXAddr, &(gPtzDevs->profilesToken), USERNAME, PASSWORD);
|
| | | proto_GetProfiles(gPtzDevs->capa.MediaXAddr, &(gPtzDevs->profiles), USERNAME, PASSWORD);
|
| | |
|
| | | }
|
| | |
|
| | |
| | | ret = sem_init(&(gPtzDevs->sem_tour), 0, 0);
|
| | | SOAP_ASSERT(ret == 0);
|
| | |
|
| | | timer_init(&(gPtzDevs->timer_id));
|
| | | timer_init(&(gPtzDevs->timer_id), ptz_timer_handler);
|
| | |
|
| | | gPtzDevs->dev_stat = DISABLE;
|
| | | pthread_mutex_init(&(gPtzDevs->node_mutex), NULL);
|
| | |
| | |
|
| | | timer_destroy(gPtzDevs->timer_id);
|
| | |
|
| | | free(gPtzDevs->profilesToken);
|
| | | free(gPtzDevs->profiles);
|
| | |
|
| | | free(gPtzDevs);
|
| | |
|
| | |
| | | }
|
| | |
|
| | | /*the timer process heandler*/
|
| | | static void timer_handler(union sigval para) {
|
| | | void ptz_timer_handler(union sigval para) {
|
| | |
|
| | | if (gPtzDevs != NULL) {
|
| | |
|
| | | pthread_mutex_lock(&(gPtzDevs->node_mutex));
|
| | |
|
| | | gPtzDevs->wt_stat = DISABLE;
|
| | |
|
| | | pthread_cond_signal(&(gPtzDevs->cond));
|
| | |
|
| | | pthread_mutex_unlock(&(gPtzDevs->node_mutex));
|
| | | }
|
| | |
|
| | | return;
|
| | | }
|
| | |
|
| | | static int timer_init(timer_t *timer_index) {
|
| | | struct sigevent event;
|
| | | timer_t timer;
|
| | | int ret;
|
| | |
|
| | | memset(&event, 0x00, sizeof(event));
|
| | | event.sigev_value.sival_int = ENABLE;
|
| | | event.sigev_value.sival_ptr = NULL;
|
| | | event.sigev_notify = SIGEV_THREAD;
|
| | | event.sigev_notify_function = timer_handler;
|
| | | |
| | | ret = timer_create(CLOCK_REALTIME, &event, &timer);
|
| | | if (ret) {
|
| | | return -1;
|
| | | }
|
| | |
|
| | | if (timer_index != NULL) {
|
| | | *timer_index = timer;
|
| | | }
|
| | |
|
| | | return 0;
|
| | | }
|
| | |
|
| | | static int timer_start(timer_t timer_index, int sec) {
|
| | | int ret;
|
| | | struct itimerspec ts;
|
| | |
|
| | | ts.it_interval.tv_sec = 0;
|
| | | ts.it_interval.tv_nsec = 0;
|
| | | ts.it_value.tv_sec = sec;
|
| | | ts.it_value.tv_nsec = 0;
|
| | | ret = timer_settime(timer_index, 0, &ts, NULL);
|
| | | if (ret) {
|
| | | return -1;
|
| | | }
|
| | |
|
| | | return ret;
|
| | | }
|
| | |
|
| | | static int timer_stop(timer_t timer_index) {
|
| | |
|
| | | int ret = timer_start(timer_index, 0);
|
| | |
|
| | | return ret;
|
| | | }
|
| | |
|
| | | static int timer_destroy(timer_t timer_index) {
|
| | | int ret;
|
| | |
|
| | | ret = timer_delete(timer_index);
|
| | | |
| | | return ret;
|
| | | }
|
| | |
|
| | | /*initialize the PTZ*/
|
| | |
| | | struct _tptz__GetStatusResponse *getStatusResponse = NULL;
|
| | |
|
| | | SOAP_ASSERT(DevData != NULL);
|
| | | SOAP_ASSERT(NULL != DevData->profilesToken);
|
| | | SOAP_ASSERT(NULL != DevData->profiles);
|
| | | SOAP_ASSERT(NULL != (soap = proto_soap_new(SOAP_SOCK_TIMEOUT)));
|
| | |
|
| | | getStatus = soap_new__tptz__GetStatus(soap, 1);
|
| | |
| | | strncpy(PTZXAddr, DevData->capa.PTZXAddr, PROTO_ADDRESS_SIZE);
|
| | | proto_SetAuthInfo(soap, username, passwd);
|
| | |
|
| | | getStatus->ProfileToken = DevData->profilesToken->token;
|
| | | getStatus->ProfileToken = DevData->profiles->token;
|
| | | result = soap_call___tptz__GetStatus(soap, PTZXAddr, NULL, getStatus, getStatusResponse);
|
| | | SOAP_CHECK_ERROR(result, soap, "proto_PTZ_GetStatus");
|
| | |
|
| | |
| | | char PTZXAddr[PROTO_ADDRESS_SIZE] = { 0x00 };
|
| | |
|
| | | SOAP_ASSERT(DevData != NULL);
|
| | | SOAP_ASSERT(NULL != DevData->profilesToken);
|
| | | SOAP_ASSERT(NULL != DevData->profiles);
|
| | | SOAP_ASSERT(NULL != (soap = proto_soap_new(SOAP_SOCK_TIMEOUT)));
|
| | |
|
| | | proto_PTZ_GetStatus(DevData, &pos_get, username, passwd);
|
| | |
| | |
|
| | | strncpy(PTZXAddr, DevData->capa.PTZXAddr, PROTO_ADDRESS_SIZE);
|
| | | proto_SetAuthInfo(soap, username, passwd);
|
| | | absMove->ProfileToken = DevData->profilesToken->token;
|
| | | absMove->ProfileToken = DevData->profiles->token;
|
| | |
|
| | | absMove->Position = soap_new_tt__PTZVector(soap, 1);
|
| | | absMove->Position->PanTilt = soap_new_tt__Vector2D(soap, 1);
|
| | |
| | | enum xsd__boolean xsd_false = xsd__boolean__false_;
|
| | |
|
| | | SOAP_ASSERT(DevData != NULL);
|
| | | SOAP_ASSERT(NULL != DevData->profilesToken);
|
| | | SOAP_ASSERT(NULL != DevData->profiles);
|
| | | SOAP_ASSERT(NULL != (soap = proto_soap_new(SOAP_SOCK_TIMEOUT)));
|
| | |
|
| | | struct _tptz__Stop *tptzStop = soap_new__tptz__Stop(soap, 1);
|
| | |
| | |
|
| | | strncpy(PTZXAddr, DevData->capa.PTZXAddr, PROTO_ADDRESS_SIZE);
|
| | | proto_SetAuthInfo(soap, username, passwd);
|
| | | tptzStop->ProfileToken = DevData->profilesToken->token;
|
| | | tptzStop->ProfileToken = DevData->profiles->token;
|
| | |
|
| | | tptzStop->PanTilt = &xsd_true;
|
| | | tptzStop->Zoom = &xsd_false;
|
| | |
| | | char PTZXAddr[PROTO_ADDRESS_SIZE] = { 0x00 };
|
| | |
|
| | | SOAP_ASSERT(DevData != NULL);
|
| | | SOAP_ASSERT(NULL != DevData->profilesToken);
|
| | | SOAP_ASSERT(NULL != DevData->profiles);
|
| | | SOAP_ASSERT(NULL != (soap = proto_soap_new(SOAP_SOCK_TIMEOUT)));
|
| | |
|
| | | struct _tptz__ContinuousMove* contMove = soap_new__tptz__ContinuousMove(soap, 1);
|
| | |
| | |
|
| | | strncpy(PTZXAddr, DevData->capa.PTZXAddr, PROTO_ADDRESS_SIZE);
|
| | | proto_SetAuthInfo(soap, username, passwd);
|
| | | contMove->ProfileToken = DevData->profilesToken->token;
|
| | | contMove->ProfileToken = DevData->profiles->token;
|
| | | contMove->Velocity = soap_new_tt__PTZSpeed(soap, 1);
|
| | | memset(contMove->Velocity, 0x00, sizeof(struct tt__PTZSpeed));
|
| | | contMove->Velocity->PanTilt = soap_new_tt__Vector2D(soap, 1);
|
| | |
| | | char PTZXAddr[PROTO_ADDRESS_SIZE] = { 0x00 };
|
| | |
|
| | | SOAP_ASSERT(DevData != NULL);
|
| | | SOAP_ASSERT(NULL != DevData->profilesToken);
|
| | | SOAP_ASSERT(NULL != DevData->profiles);
|
| | | SOAP_ASSERT(NULL != (soap = proto_soap_new(SOAP_SOCK_TIMEOUT)));
|
| | |
|
| | | pos_p = para_check(pos_p);
|
| | |
| | |
|
| | | strncpy(PTZXAddr, DevData->capa.PTZXAddr, PROTO_ADDRESS_SIZE);
|
| | | proto_SetAuthInfo(soap, username, passwd);
|
| | | relMove->ProfileToken = DevData->profilesToken->token;
|
| | | relMove->ProfileToken = DevData->profiles->token;
|
| | | relMove->Translation = (struct tt__PTZVector *)soap_malloc(soap, sizeof(struct tt__PTZVector));
|
| | | memset(relMove->Translation, 0x00, sizeof(struct tt__PTZVector));
|
| | | relMove->Translation->PanTilt = soap_new_tt__Vector2D(soap, 1);
|
| | |
| | | }
|
| | |
|
| | | /*set the focus-on functionality*/
|
| | | int proto_PTZ_ImagingSet(PtzDevs *DevData, float speed, const char *username, const char *passwd) {
|
| | | int proto_PTZ_ImagingSet(PtzDevs *DevData, enum PTZCMD cmd, float speed, const char *username, const char *passwd) {
|
| | | int result = 0;
|
| | | float speed_val;
|
| | | struct soap *soap = NULL;
|
| | |
| | | struct tt__ContinuousFocus *stContFocus = NULL;
|
| | | struct _timg__Move *stMoveReq = NULL;
|
| | | struct _timg__MoveResponse *stMoveRes = NULL;
|
| | | struct _timg__Stop *stStopReq = NULL;
|
| | | struct _timg__StopResponse *stStopRes = NULL;
|
| | |
|
| | | SOAP_ASSERT(NULL != DevData);
|
| | | SOAP_ASSERT(NULL != DevData->profilesToken);
|
| | | SOAP_ASSERT(NULL != DevData->profiles);
|
| | | SOAP_ASSERT(NULL != (soap = proto_soap_new(SOAP_SOCK_TIMEOUT)));
|
| | |
|
| | | stFocusMove = soap_new_tt__FocusMove(soap, 1);
|
| | | stContFocus = soap_new_tt__ContinuousFocus(soap, 1);
|
| | | |
| | | proto_SetAuthInfo(soap, username, passwd);
|
| | |
|
| | | |
| | | stMoveReq = soap_new__timg__Move(soap, 1);
|
| | | stMoveRes = soap_new__timg__MoveResponse(soap, 1);
|
| | |
|
| | | stStopReq = soap_new__timg__Stop(soap, 1);
|
| | | stStopRes = soap_new__timg__StopResponse(soap, 1);
|
| | |
|
| | | memset(stMoveReq, 0x00, sizeof(struct _timg__Move));
|
| | | memset(stMoveRes, 0x00, sizeof(struct _timg__MoveResponse));
|
| | |
|
| | | speed_val = pos_res_z(speed);
|
| | | memset(stStopReq, 0x00, sizeof(struct _timg__Stop));
|
| | | memset(stStopRes, 0x00, sizeof(struct _timg__StopResponse));
|
| | |
|
| | | stContFocus->Speed = speed_val;
|
| | | stMoveReq->Focus = stFocusMove;
|
| | | stMoveReq->Focus->Continuous = stContFocus;
|
| | |
|
| | | stMoveReq->VideoSourceToken = DevData->profiles->videoCfg.sourceToken;
|
| | | stStopReq->VideoSourceToken = DevData->profiles->videoCfg.sourceToken;
|
| | |
|
| | | proto_SetAuthInfo(soap, username, passwd);
|
| | |
|
| | | speed_val = pos_res_z(speed);
|
| | | switch(cmd) {
|
| | | case PTZ_CMD_FOCUS_IN:
|
| | | stContFocus->Speed = speed_val; |
| | | |
| | | break;
|
| | |
|
| | | case PTZ_CMD_FOCUS_OUT:
|
| | | stContFocus->Speed = speed_val * (-1);
|
| | | |
| | | break;
|
| | |
|
| | | default:
|
| | | result = soap_call___timg__Stop(soap, DevData->capa.MediaXAddr, NULL, stStopReq, stStopRes);
|
| | | SOAP_CHECK_ERROR(result, soap, "proto_PTZ_ImagingSet");
|
| | | |
| | | break;
|
| | | }
|
| | |
|
| | | stFocusMove->Continuous = stContFocus;
|
| | | stFocusMove->Absolute = NULL;
|
| | | stFocusMove->Relative = NULL;
|
| | |
|
| | | stMoveReq->Focus = stFocusMove;
|
| | | stMoveReq->VideoSourceToken = DevData->profilesToken->videoCfg.token;
|
| | |
|
| | | result = soap_call___timg__Move(soap, DevData->profilesToken->token, NULL, stMoveReq, stMoveRes);
|
| | | SOAP_CHECK_ERROR(result, soap, "proto_PTZ_FocusSet");
|
| | | result = soap_call___timg__Move(soap, DevData->capa.MediaXAddr, NULL, stMoveReq, stMoveRes);
|
| | | SOAP_CHECK_ERROR(result, soap, "proto_PTZ_ImagingSet");
|
| | |
|
| | | EXIT:
|
| | | if (NULL != soap) {
|
| | |
| | | char PTZXAddr[PROTO_ADDRESS_SIZE] = { 0x00 };
|
| | |
|
| | | SOAP_ASSERT(DevData != NULL);
|
| | | SOAP_ASSERT(NULL != DevData->profilesToken);
|
| | | SOAP_ASSERT(NULL != DevData->profiles);
|
| | | SOAP_ASSERT(NULL != (soap = proto_soap_new(SOAP_SOCK_TIMEOUT)));
|
| | |
|
| | | strncpy(PTZXAddr, DevData->capa.PTZXAddr, PROTO_ADDRESS_SIZE);
|
| | |
| | | memset(setPreset, 0x00, sizeof(struct _tptz__SetPreset));
|
| | | memset(setPresetRes, 0x00, sizeof(struct _tptz__SetPresetResponse));
|
| | |
|
| | | setPreset->ProfileToken = DevData->profilesToken->token;
|
| | | setPreset->ProfileToken = DevData->profiles->token;
|
| | | if (posName != NULL) {
|
| | | setPreset->PresetName = (char *)posName;
|
| | | }
|
| | |
| | | memset(getPresets, 0x00, sizeof(struct _tptz__GetPresets));
|
| | | memset(getPresetsRes, 0x00, sizeof(struct _tptz__GetPresetsResponse));
|
| | |
|
| | | getPresets->ProfileToken = DevData->profilesToken->token;
|
| | | getPresets->ProfileToken = DevData->profiles->token;
|
| | |
|
| | | result = soap_call___tptz__GetPresets(soap, PTZXAddr, NULL, getPresets, getPresetsRes);
|
| | | SOAP_CHECK_ERROR(result, soap, "proto_PTZPreset");
|
| | |
| | | memset(gotoPreset, 0x00, sizeof(struct _tptz__GotoPreset));
|
| | | memset(gotoPresetRes, 0x00, sizeof(struct _tptz__GotoPresetResponse));
|
| | |
|
| | | gotoPreset->ProfileToken = DevData->profilesToken->token;
|
| | | gotoPreset->ProfileToken = DevData->profiles->token;
|
| | |
|
| | | if (posToken != NULL) {
|
| | | sprintf(buf, "%d", *posToken);
|
| | |
| | | memset(rmPreset, 0x00, sizeof(struct _tptz__RemovePreset));
|
| | | memset(rmPresetRes, 0x00, sizeof(struct _tptz__RemovePresetResponse));
|
| | |
|
| | | rmPreset->ProfileToken = DevData->profilesToken->token;
|
| | | rmPreset->ProfileToken = DevData->profiles->token;
|
| | | if (posToken != NULL) {
|
| | | sprintf(buf, "%d", *posToken);
|
| | | rmPreset->PresetToken = buf;
|