FuJuntang
2022-07-06 e5cff5a3ef373a5090f45cd1dfb0b85d9c851d5d
service/ptz/ptz.c
@@ -2,6 +2,7 @@
#include <stdlib.h>
#include <unistd.h>
#include <semaphore.h>
#include <string.h>
#include <pthread.h>
#include <signal.h>
#include <errno.h>
@@ -22,9 +23,9 @@
  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;
}
@@ -35,14 +36,17 @@
  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) {
@@ -51,10 +55,15 @@
    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);
}
@@ -76,7 +85,7 @@
    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);
@@ -93,7 +102,7 @@
        timer_destroy(gPtzDevs->timer_id);
        free(gPtzDevs->profilesToken);
        free(gPtzDevs->profiles);
        free(gPtzDevs);
@@ -194,70 +203,20 @@
}
/*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*/
@@ -355,7 +314,7 @@
  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);
@@ -364,7 +323,7 @@
  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");
@@ -614,7 +573,7 @@
    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);
@@ -628,7 +587,7 @@
    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);
@@ -660,7 +619,7 @@
    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);
@@ -668,7 +627,7 @@
    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;
@@ -693,7 +652,7 @@
    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);
@@ -705,7 +664,7 @@
    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);
@@ -863,7 +822,7 @@
    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);
@@ -875,7 +834,7 @@
    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);
@@ -953,7 +912,7 @@
}
/*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;
@@ -961,34 +920,61 @@
  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) {
@@ -1007,7 +993,7 @@
  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);
@@ -1020,7 +1006,7 @@
    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;
    }
@@ -1039,7 +1025,7 @@
    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");
@@ -1055,7 +1041,7 @@
    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);
@@ -1072,7 +1058,7 @@
    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;