/decrypt/cam.c

https://bitbucket.org/a84/gs_public/ · C · 114 lines · 91 code · 20 blank · 3 comment · 23 complexity · 63a7737899632b9efb7bb344f2a4e434 MD5 · raw file

  1. /*
  2. * Author: Andrey Dyldin <and@cesbo.com>
  3. */
  4. #include <stdio.h>
  5. #include <unistd.h>
  6. #include <string.h>
  7. #include <signal.h>
  8. #include <syscall.h>
  9. #include "newcamd.h"
  10. #include "camd35.h"
  11. #include "cam.h"
  12. #include "../getstream.h"
  13. #include "../config.h"
  14. int cam_login(cam_t *cam) {
  15. if(cam->loginOk == -1) return 0;
  16. cam->loginOk = -1;
  17. int ret = cam->login(cam);
  18. if(ret > 0) cam->loginOk = 1;
  19. else cam->loginOk = 0;
  20. return ret;
  21. }
  22. void cam_logout(cam_t *cam) {
  23. cam->logout(cam);
  24. cam_packet_t tmp;
  25. while(fifo_pop(cam->packet_buffer, &tmp) > 0);
  26. cam->loginOk = 0;
  27. }
  28. void *cam_thread(void *arg) {
  29. cam_t *cam = (cam_t *)arg;
  30. #ifdef DEBUG
  31. pid_t tid = (pid_t) syscall (SYS_gettid);
  32. printf("[cam:%d] thread = %d\n", cam->id, tid);
  33. #endif
  34. pthread_mutex_init(&cam->mutex, NULL);
  35. cam_login(cam);
  36. while(cam->main_loop) {
  37. if(cam->loginOk < 0) {
  38. usleep(500);
  39. continue;
  40. }
  41. else if(cam->loginOk == 0) {
  42. cam_logout(cam);
  43. sleep(2);
  44. cam_login(cam);
  45. continue;
  46. }
  47. cam_packet_t packet;
  48. if(fifo_pop(cam->packet_buffer, &packet) != sizeof(cam_packet_t)) {
  49. usleep(500);
  50. continue;
  51. }
  52. cam->send_packet(cam, &packet);
  53. }
  54. pthread_exit(NULL);
  55. }
  56. void cam_add_packet(cam_t *cam, cam_packet_t *packet) {
  57. if(!cam || !packet || !cam->sys || cam->loginOk <= 0) return;
  58. pthread_mutex_lock(&cam->mutex);
  59. int fifo_ret = fifo_push(cam->packet_buffer, packet);
  60. pthread_mutex_unlock(&cam->mutex);
  61. if(fifo_ret != sizeof(cam_packet_t)) {
  62. struct config_s *config = (struct config_s *)cam->config;
  63. monitor_send_msg(config->monitor
  64. , "[cam:%d] buffer %s [drop packet pnr:%d]"
  65. , cam->id, (fifo_ret==-2)?"overflow":"collision", packet->prg_id);
  66. }
  67. }
  68. int cam_init(cam_t *cam) {
  69. if(!cam) return 0;
  70. int ret = 0;
  71. cam->packet_buffer = fifo_init(cam->fifo_size, sizeof(cam_packet_t));
  72. switch(cam->type) {
  73. case CAM_CAMD35: ret = camd35_init(cam); break;
  74. case CAM_NEWCAMD: ret = newcamd_init(cam); break;
  75. default: break;
  76. }
  77. if(ret > 0) {
  78. cam->main_loop = 1;
  79. pthread_create(&cam->thread, NULL, cam_thread, cam);
  80. pthread_detach(cam->thread);
  81. }
  82. return ret;
  83. }
  84. void cam_destroy(cam_t *cam) {
  85. if(!cam) return;
  86. pthread_kill(cam->thread, SIGINT);
  87. cam->logout(cam);
  88. switch(cam->type) {
  89. case CAM_CAMD35: camd35_destroy(cam); break;
  90. case CAM_NEWCAMD: newcamd_destroy(cam); break;
  91. default: break;
  92. }
  93. fifo_destroy(cam->packet_buffer);
  94. }