/decrypt/cam.c
https://bitbucket.org/a84/gs_public/ · C · 114 lines · 91 code · 20 blank · 3 comment · 23 complexity · 63a7737899632b9efb7bb344f2a4e434 MD5 · raw file
- /*
- * Author: Andrey Dyldin <and@cesbo.com>
- */
- #include <stdio.h>
- #include <unistd.h>
- #include <string.h>
- #include <signal.h>
- #include <syscall.h>
- #include "newcamd.h"
- #include "camd35.h"
- #include "cam.h"
- #include "../getstream.h"
- #include "../config.h"
- int cam_login(cam_t *cam) {
- if(cam->loginOk == -1) return 0;
- cam->loginOk = -1;
- int ret = cam->login(cam);
- if(ret > 0) cam->loginOk = 1;
- else cam->loginOk = 0;
- return ret;
- }
- void cam_logout(cam_t *cam) {
- cam->logout(cam);
- cam_packet_t tmp;
- while(fifo_pop(cam->packet_buffer, &tmp) > 0);
- cam->loginOk = 0;
- }
- void *cam_thread(void *arg) {
- cam_t *cam = (cam_t *)arg;
- #ifdef DEBUG
- pid_t tid = (pid_t) syscall (SYS_gettid);
- printf("[cam:%d] thread = %d\n", cam->id, tid);
- #endif
- pthread_mutex_init(&cam->mutex, NULL);
- cam_login(cam);
- while(cam->main_loop) {
- if(cam->loginOk < 0) {
- usleep(500);
- continue;
- }
- else if(cam->loginOk == 0) {
- cam_logout(cam);
- sleep(2);
- cam_login(cam);
- continue;
- }
- cam_packet_t packet;
- if(fifo_pop(cam->packet_buffer, &packet) != sizeof(cam_packet_t)) {
- usleep(500);
- continue;
- }
- cam->send_packet(cam, &packet);
- }
- pthread_exit(NULL);
- }
- void cam_add_packet(cam_t *cam, cam_packet_t *packet) {
- if(!cam || !packet || !cam->sys || cam->loginOk <= 0) return;
- pthread_mutex_lock(&cam->mutex);
- int fifo_ret = fifo_push(cam->packet_buffer, packet);
- pthread_mutex_unlock(&cam->mutex);
- if(fifo_ret != sizeof(cam_packet_t)) {
- struct config_s *config = (struct config_s *)cam->config;
- monitor_send_msg(config->monitor
- , "[cam:%d] buffer %s [drop packet pnr:%d]"
- , cam->id, (fifo_ret==-2)?"overflow":"collision", packet->prg_id);
- }
- }
- int cam_init(cam_t *cam) {
- if(!cam) return 0;
- int ret = 0;
- cam->packet_buffer = fifo_init(cam->fifo_size, sizeof(cam_packet_t));
- switch(cam->type) {
- case CAM_CAMD35: ret = camd35_init(cam); break;
- case CAM_NEWCAMD: ret = newcamd_init(cam); break;
- default: break;
- }
- if(ret > 0) {
- cam->main_loop = 1;
- pthread_create(&cam->thread, NULL, cam_thread, cam);
- pthread_detach(cam->thread);
- }
- return ret;
- }
- void cam_destroy(cam_t *cam) {
- if(!cam) return;
- pthread_kill(cam->thread, SIGINT);
- cam->logout(cam);
- switch(cam->type) {
- case CAM_CAMD35: camd35_destroy(cam); break;
- case CAM_NEWCAMD: newcamd_destroy(cam); break;
- default: break;
- }
- fifo_destroy(cam->packet_buffer);
- }