2 * Copyright (c) 2018 Samsung Electronics Co., Ltd.
4 * Licensed under the Flora License, Version 1.1 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://floralicense.org/license/
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #ifndef MESSAGE_COMMAND_C
18 #define MESSAGE_COMMAND_C
22 #include "messages/message_command.h"
23 #include "messages/macros.h"
25 static int _message_command_serialze_vcall(message_t *msg, writer_t *writer)
27 message_command_t *command_msg = container_of(msg, message_command_t, base);
28 return message_command_serialize(command_msg, writer);
31 static int _message_command_deserialize_vcall(message_t *msg, reader_t *reader)
33 message_command_t *command_msg = container_of(msg, message_command_t, base);
34 return message_command_deserialize(command_msg, reader);
37 static void _message_command_destroy_vcall(message_t *msg)
39 message_command_t *command_msg = container_of(msg, message_command_t, base);
40 message_command_destroy(command_msg);
43 void message_command_init(message_command_t *message)
45 message_base_init(&message->base);
47 message_set_type(&message->base, MESSAGE_COMMAND);
49 message->base.vtable.serialize = _message_command_serialze_vcall;
50 message->base.vtable.deserialize = _message_command_deserialize_vcall;
51 message->base.vtable.destroy = _message_command_destroy_vcall;
53 memset(&message->command, 0x0, sizeof(command_s));
56 void message_command_destroy(message_command_t *message)
58 message_base_destroy(&message->base);
61 static int _camera_command_deserialize(command_s *cmd, reader_t *reader)
63 int32_t elevation, azimuth;
66 err |= reader_read_int32(reader, &elevation);
67 err |= reader_read_int32(reader, &azimuth);
71 cmd->data.camera_position.camera_elevation = elevation;
72 cmd->data.camera_position.camera_azimuth = azimuth;
77 static int _drive_command_deserialize(command_s *cmd, reader_t *reader)
83 err |= reader_read_int32(reader, &speed);
84 err |= reader_read_int32(reader, &dir);
88 cmd->data.steering.speed = speed;
89 cmd->data.steering.direction = dir;
94 static int _drive_and_camera_command_deserialize(command_s *cmd, reader_t *reader)
98 int32_t elevation, azimuth;
101 err |= reader_read_int32(reader, &speed);
102 err |= reader_read_int32(reader, &dir);
103 err |= reader_read_int32(reader, &elevation);
104 err |= reader_read_int32(reader, &azimuth);
108 cmd->data.steering_and_camera.speed = speed;
109 cmd->data.steering_and_camera.direction = dir;
110 cmd->data.steering_and_camera.camera_elevation = elevation;
111 cmd->data.steering_and_camera.camera_azimuth = azimuth;
116 static int _command_deserialize(command_s *cmd, reader_t *reader)
120 if (reader_read_int32(reader, &type)) {
127 case COMMAND_TYPE_DRIVE:
128 return _drive_command_deserialize(cmd, reader);
129 case COMMAND_TYPE_CAMERA:
130 return _camera_command_deserialize(cmd, reader);
132 case COMMAND_TYPE_DRIVE_AND_CAMERA:
133 return _drive_and_camera_command_deserialize(cmd, reader);
135 case COMMAND_TYPE_NONE:
142 static int _camera_command_serialize(command_s *cmd, writer_t *writer)
144 int32_t elevation = cmd->data.camera_position.camera_elevation;
145 int32_t azimuth = cmd->data.camera_position.camera_azimuth;
148 err |= writer_write_int32(writer, elevation);
149 err |= writer_write_int32(writer, azimuth);
154 static int _drive_command_serialize(command_s *cmd, writer_t *writer)
156 int32_t speed = cmd->data.steering.speed;
157 int32_t dir = cmd->data.steering.direction;
160 err |= writer_write_int32(writer, speed);
161 err |= writer_write_int32(writer, dir);
166 static int _drive_and_camera_command_serialize(command_s *cmd, writer_t *writer)
168 int32_t speed = cmd->data.steering_and_camera.speed;
169 int32_t dir = cmd->data.steering_and_camera.direction;
170 int32_t elevation = cmd->data.steering_and_camera.camera_elevation;
171 int32_t azimuth = cmd->data.steering_and_camera.camera_azimuth;
174 err |= writer_write_int32(writer, speed);
175 err |= writer_write_int32(writer, dir);
176 err |= writer_write_int32(writer, elevation);
177 err |= writer_write_int32(writer, azimuth);
182 static int _command_serialize(command_s *cmd, writer_t *writer)
184 int32_t type = cmd->type;
186 if (writer_write_int32(writer, type)) {
191 case COMMAND_TYPE_DRIVE:
192 return _drive_command_serialize(cmd, writer);
193 case COMMAND_TYPE_CAMERA:
194 return _camera_command_serialize(cmd, writer);
196 case COMMAND_TYPE_DRIVE_AND_CAMERA:
197 return _drive_and_camera_command_serialize(cmd, writer);
199 case COMMAND_TYPE_NONE:
206 int message_command_deserialize(message_command_t *message, reader_t *reader)
210 err |= message_base_deserialize(&message->base, reader);
211 err |= _command_deserialize(&message->command, reader);
216 int message_command_serialize(message_command_t *message, writer_t *writer)
220 err |= message_base_serialize(&message->base, writer);
221 err |= _command_serialize(&message->command, writer);
226 const command_s *message_command_get_command(message_command_t *message)
228 return &message->command;
231 void message_command_set_command(message_command_t *message, const command_s *cmd)
233 memcpy(&message->command, cmd, sizeof(command_s));
236 #endif /* end of include guard: MESSAGE_COMMAND_C */