source: flair-src/tags/latest/lib/FlairIpc/src/unexported/ipc_send.h

Last change on this file was 397, checked in by Sanahuja Guillaume, 9 months ago

add ipc lib

  • Property svn:eol-style set to native
File size: 4.3 KB
Line 
1/**
2 * \file ipc_send.h
3 * \brief definition de classe
4 * \author {
5 *                      Sébastien Ambroziak
6 *                      Paul Sauvage
7 *                      }
8 * \version 0.1
9 * \date 5 novembre 2020
10 *
11 * Definitions de la classe IpcSender ainsi que ses méthodes.
12 * Cette classe permet d'envoyer des structures ou des liste de structure par ipc
13 *
14 * La classe IpcSender utilise une template à 2 paramètres, T et N
15 *      le paramètre T correspond au type de donnée que le sender doit pouvoir envoyer
16 *      le paramètre N correspond au nombre d'élément du tableau d'élément de type T à envoyer
17 *              si N = 0 la fonction send() prend en paramètre et envoi une structure de type T
18 *              si N > 0 la fonction send() prend en paramètre et envoi un tableau de N éléments de type T
19 *
20* Le constructeur utilise 2 paramètres:
21 *  Une chaîne de caractère contenant le nom du fichier ipc vers lequel écrire les données
22 *  Un entier correspond au numéro de canal Ipc
23 *
24 */
25
26#ifndef IPC_SEND
27#define IPC_SEND
28
29#include "ipc_base.h"
30
31#include <functional>
32#include <memory>
33#include <stdio.h>
34
35#include <sys/ipc.h>
36#include <sys/msg.h>
37#include <sys/time.h>
38
39#include <string>
40#include <cstring>
41#include <errno.h>
42
43using namespace std;
44using namespace ipc::type;
45
46class IpcSenderBase {
47        public:
48                IpcSenderBase(const char* ipc_name, int proj_id=65) {
49                        cout << "IpcReceiver on " << ipc_name << endl;
50                        system("mkdir -p /tmp/ipc");
51                        system("chmod 777 /tmp/ipc");
52
53                        string pathname = string("/tmp/ipc/") + string(ipc_name);
54                        string command = string("> ") + pathname;
55                        system(command.c_str());
56                       
57                        command = string("chmod 666 ") + pathname;
58                        system(command.c_str());
59
60                        key_t ipc_key = ftok(pathname.c_str(), proj_id); //crete unique key
61                        cout << "ipc key " << ipc_key << endl << endl;
62                        _queue_id = msgget(ipc_key, 0666 | IPC_CREAT); //create message queue and return id
63                }
64                ~IpcSenderBase() {
65                        msgctl(_queue_id, IPC_RMID, NULL); //destroy the message queue.
66                }
67       
68        protected:
69                int _queue_id;
70
71};
72
73template <typename T>
74class IpcSender : IpcSenderBase {
75        public:
76                IpcSender(const char* ipc_name, int proj_id=65, bool auto_refresh = true): IpcSenderBase(ipc_name, proj_id), _auto_refresh(auto_refresh) {}
77                ~IpcSender() = default;
78
79                void send(){
80                        if(_auto_refresh) refreshTime();
81                        if (msgsnd(_queue_id, &_message, sizeof(_message.data), IPC_NOWAIT) < 0) //send message
82                        {
83                                //std::cout << "Erreur envoi message" << std::endl;
84                        }
85                }
86
87                void send(T value)
88                {
89                        _message.data.value = value;
90                        send();
91                }
92
93                timestamp getTimestamp(){
94                        return _message.data.stamp;
95                }
96
97                timestamp refreshTime(){
98                        _message.time_now();
99                        return _message.data.stamp;
100                }
101
102                T getValue(){return _message.data.value;}
103
104                void setValue(T value){_message.data.value = value;}
105
106                void setTimestamp(timestamp stamp){_message.data.stamp = stamp;}
107                void setTimestamp(int32_t sec, uint32_t nanosec){
108                        _message.data.stamp.sec = sec;
109                        _message.data.stamp.nanosec = nanosec;
110                }
111
112        protected:
113                bool _auto_refresh;
114                ipc_message<T> _message;
115};
116
117
118template <typename T>
119class IpcSenderTab : IpcSenderBase {
120        public:
121                IpcSenderTab(size_t N, const char* ipc_name, int proj_id=65, bool auto_refresh = true): IpcSenderBase(ipc_name, proj_id), _N(N), _auto_refresh(auto_refresh){
122                        _message = (ipc_tab<T>*) malloc(sizeof(ipc_tab<T>) + sizeof(T)*(N-1));
123                        _message->msg_type = 1;
124                }
125                ~IpcSenderTab() = default;
126
127                void send(T* values){
128                        memcpy(_message->data.values, values, sizeof(T)*_N);
129                        send();
130                }
131
132                void send(){
133                        if(_auto_refresh) refreshTime();
134                        if (msgsnd(_queue_id, _message, sizeof(T)*_N + sizeof(_message->data), IPC_NOWAIT) < 0) //send message
135                        {
136                                //cout << errno << endl;
137                        }
138                }
139
140                void setTimestamp(timestamp stamp){_message->data.stamp = stamp;}
141                void setTimestamp(int32_t sec, uint32_t nanosec){
142                        _message->data.stamp.sec = sec;
143                        _message->data.stamp.nanosec = nanosec;
144                }
145
146                timestamp getTimestamp(){
147                        return _message->data.stamp;
148                }
149
150                timestamp refreshTime(){
151                        _message->time_now();
152                        return _message->data.stamp;
153                }
154
155                void setValue(T value, size_t index){
156                        if(index < _N){
157                                _message->data.values[index] = value;
158                        }
159                }
160
161                void setAll(T value) {
162                        for (size_t i = 0; i < _N; i++)
163                        {
164                                _message->data.values[i] = value;
165                        }
166                }
167
168                size_t getN() const {return _N;}
169
170        protected:
171                size_t _N;
172                bool _auto_refresh;
173                ipc_tab<T>* _message;
174               
175};
176
177
178#endif
Note: See TracBrowser for help on using the repository browser.