Project

General

Profile

Statistics
| Revision:

root / trunk / code / projects / colonet / server / vision / shmimgserve.cpp @ 1428

History | View | Annotate | Download (1.79 KB)

1 939 rcahoon
#include "shmimgserve.h"
2
3
#include <stdio.h>
4
#include <string.h>
5
#include <stdlib.h>
6
7
#include <errno.h>
8
9
#include <sys/types.h>
10
#include <sys/shm.h>
11
12
#include "php_sysvsem.h"
13
14
#define DEBUG 0
15
16
#if DEBUG
17
#define dbg_printf(...)   printf(__VA_ARGS__)
18
#else
19
#define dbg_printf(...)
20
#endif
21
22
int write_JPEG_to_mem (unsigned char *storage, int length, IplImage *_img, int quality);
23
24
static sysvsem *sem;
25
static int shm_id;
26
27
int sendImage(IplImage *image)
28
{
29
  dbg_printf("Send image\n");
30
31
        if (sem->sem_acquire())
32
        {
33
                dbg_printf("Semaphore acquired\n");
34
35
                unsigned char *p = (unsigned char *)shmat(shm_id, NULL, 0);
36
                if (p!=(void *)-1)
37
                {
38
                        dbg_printf("Memory mapped at %p\n", p);
39
40
                        int len = write_JPEG_to_mem (p+4, 150000-4, image, JPEG_QUALITY);
41
42
                        int i;
43
                        int length = len;
44
                        dbg_printf("%d\n", length);
45
                        for(i=0; i < 4; i++)
46
                        {
47
                                char digit = (char)(length & 0xff);
48
                                length >>= 8;
49
                                memcpy(p+i, &digit, sizeof(char));
50
                        }
51
52
                        dbg_printf("Memory copied\n");
53
54
                        sem->sem_release();
55
                        dbg_printf("Semaphore released\n");
56
57
                        shmdt(p);
58
                  dbg_printf("Memory detached\n");
59
                }
60
        }
61
62
  if (errno!=0)
63
  {
64
    int errnum = errno;
65
    errno = 0;
66
67
    fprintf(stderr, "error %d %s\n", errnum, strerror(errnum));
68
    return errnum;
69
  }
70
71
  return 0;
72
}
73
74
int openShM()
75
{
76
        shm_id = shmget(0x40305163, 150000, IPC_CREAT | 0666);
77
        if (shm_id > 0)
78
                dbg_printf("Shared memory opened\n");
79
        else
80
        {
81
                fprintf(stderr, "Error opening shared memory\n");
82
                return -1;
83
        }
84
85
  sem = new (std::nothrow)sysvsem(0x40309999);
86
  if (sem)
87
                dbg_printf("Semaphore opened\n");
88
        else
89
        {
90
                fprintf(stderr, "Error opening semaphore\n");
91
                return -2;
92
        }
93
}
94
95
void releaseShM()
96
{
97
  sem->sem_remove();
98
        delete sem;
99
        dbg_printf("Semaphore deleted\n");
100
101
  shmctl(shm_id, IPC_RMID, NULL);
102
  dbg_printf("Memory marked for deletion\n");
103
}