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 |
|
---|
43 | using namespace std;
|
---|
44 | using namespace ipc::type;
|
---|
45 |
|
---|
46 | class 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 |
|
---|
73 | template <typename T>
|
---|
74 | class 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 |
|
---|
118 | template <typename T>
|
---|
119 | class 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 |
---|