41 #include <sys/socket.h>
42 #include <netinet/in.h>
45 #include <arpa/inet.h>
56 mbc_cmd2str(uint8_t cmd)
64 case ES_OK:
return "OK";
89 fprintf(stderr,
"unknown cmd (%lu) from peer\n", (
unsigned long)mbc->
cmd);
102 rc = recv(mbc->
sock, (
void *)&mbc->
cmd,
sizeof(mbc->
cmd),
104 if (rc !=
sizeof(mbc->
cmd)) {
105 fprintf(stderr,
"recv(cmd=%lu) failed\n", (
unsigned long)mbc->
cmd);
130 fprintf(stdout,
"cmd to peer: %lu (%s)\n",
131 (
unsigned long)mbc->
cmd, mbc_cmd2str(mbc->
cmd));
134 rc = send(mbc->
sock, (
const void *)&mbc->
cmd,
sizeof(mbc->
cmd),
136 if (rc !=
sizeof(mbc->
cmd)) {
137 fprintf(stderr,
"send(cmd=%lu) failed (%ld)\n", (
unsigned long)mbc->
cmd, (
long)rc);
149 unsigned long useconds = 100000;
152 fprintf(stderr,
"unable to create socket\n");
157 if (connect(mbc->
sock, addr, socklen) < 0) {
158 int save_errno = errno;
162 switch (save_errno) {
176 msg = strerror(save_errno);
177 fprintf(stderr,
"unable to connect to peer (%ld: %s)\n",
178 (
long)save_errno, msg);
204 struct sockaddr_in addr = { 0 };
207 fprintf(stderr,
"host must be defined\n");
212 fprintf(stderr,
"port must be defined\n");
218 return mbc_init(mbc, (
struct sockaddr *)&addr,
sizeof(addr));
229 struct sockaddr_un addr = { 0 };
232 fprintf(stderr,
"path must be defined\n");
238 return mbc_init(mbc, (
struct sockaddr *)&addr,
sizeof(addr));
246 mbc_destroy(
mbc_t *mbc)
249 if (mbc->
sock >= 0) {
263 unsigned labels,
unsigned *rotp,
unsigned accels)
288 mbc->
r_k_label = offset/
sizeof(uint32_t);
290 offset += 2*
sizeof(uint32_t);
293 mbc->
r_k_x = offset/
sizeof(double);
294 offset += 3*
sizeof(double);
304 fprintf(stderr,
"rotation must be defined for reference node\n");
309 offset += 3*
sizeof(double);
313 mbc->
r_k_r = offset/
sizeof(double);
314 offset += 9*
sizeof(double);
319 offset += 3*
sizeof(double);
323 fprintf(stderr,
"unknown rotation mode 0x%lx\n", (
unsigned long)*rotp);
327 mbc->
r_k_xp = offset/
sizeof(double);
328 offset += 3*
sizeof(double);
331 offset += 3*
sizeof(double);
334 mbc->
r_k_xpp = offset/
sizeof(double);
335 offset += 3*
sizeof(double);
338 offset += 3*
sizeof(double);
344 mbc->
r_d_label = offset/
sizeof(uint32_t);
346 offset += 2*
sizeof(uint32_t);
347 mbc->
d_size += 2*
sizeof(uint32_t);
350 mbc->
r_d_f = offset/
sizeof(double);
351 offset += 3*
sizeof(double);
352 mbc->
d_size += 3*
sizeof(double);
354 mbc->
r_d_m = offset/
sizeof(double);
355 offset += 3*
sizeof(double);
356 mbc->
d_size += 3*
sizeof(double);
379 fprintf(stdout,
"cmd from peer: %lu (%s)\n",
380 (
unsigned long)mbc->
mbc.
cmd, mbc_cmd2str(mbc->
mbc.
cmd));
384 fprintf(stdout,
"got ABORT from peer\n");
395 fprintf(stderr,
"recv(%lu) reference node failed (%ld)\n",
401 if (mbc->
nodes > 0) {
407 fprintf(stderr,
"recv(%lu) x, theta, xP, omega failed (%ld)\n",
451 fprintf(stderr,
"send(%lu) reference node failed (%ld)\n",
458 if (mbc->
nodes > 0) {
464 fprintf(stderr,
"send(%lu) nodes failed (%ld)\n",
490 unsigned labels,
unsigned rot,
unsigned accels)
500 fprintf(stderr,
"need at least 1 node or reference node data\n");
521 fprintf(stderr,
"unknown orientation parametrization 0x%lx in flags\n", (
unsigned long)rot);
533 if (mbc_rigid_init(&mbc->
mbcr, refnode, labels, &rot, accels)) {
552 if (mbc->
nodes > 0) {
591 if (mbc->
n_ptr == NULL) {
592 fprintf(stderr,
"nodal data malloc failed\n");
600 ptr += (nodes + nodes%2)*
sizeof(uint32_t);
603 mbc->
n_k_x = (
double *)ptr;
604 ptr += 3*
sizeof(double)*nodes;
611 mbc->
n_k_r = (
double *)ptr;
612 ptr += 9*
sizeof(double)*nodes;
617 ptr += 3*
sizeof(double)*nodes;
622 ptr += 3*
sizeof(double)*nodes;
626 mbc->
n_k_xp = (
double *)ptr;
627 ptr += 3*
sizeof(double)*nodes;
631 ptr += 3*
sizeof(double)*nodes;
636 ptr += 3*
sizeof(double)*nodes;
640 ptr += 3*
sizeof(double)*nodes;
646 ptr += (nodes + nodes%2)*
sizeof(uint32_t);
649 mbc->
n_d_f = (
double *)ptr;
650 ptr += 3*
sizeof(double)*nodes;
653 mbc->
n_d_m = (
double *)ptr;
654 ptr += 3*
sizeof(double)*nodes;
675 uint32_t *uint32_ptr;
676 char buf[
sizeof(uint32_t) +
sizeof(uint32_t)];
679 fprintf(stderr,
"need at least 1 node or reference node data\n");
684 fprintf(stderr,
"socket is not valid\n");
691 uint32_ptr = (uint32_t *)&buf[0];
692 uint32_ptr[0] =
MBC_F(mbc);
693 uint32_ptr[1] = mbc->
nodes;
695 rc = send(mbc->
mbc.
sock, (
const void *)buf,
sizeof(buf),
697 if (rc !=
sizeof(buf)) {
698 fprintf(stderr,
"send negotiate request failed (%ld)\n", (
long)rc);
707 fprintf(stdout,
"cmd from peer: %lu (%s)\n",
708 (
unsigned long)mbc->
mbc.
cmd, mbc_cmd2str(mbc->
mbc.
cmd));
713 fprintf(stdout,
"got ABORT from peer\n");
720 fprintf(stdout,
"unexpected cmd=%lu from peer\n", (
unsigned long)mbc->
mbc.
cmd);
731 uint32_t *uint32_ptr;
732 char buf[
sizeof(uint32_t) +
sizeof(uint32_t)];
743 fprintf(stdout,
"cmd from peer: %lu (%s)\n",
744 (
unsigned long)mbc->
mbc.
cmd, mbc_cmd2str(mbc->
mbc.
cmd));
752 fprintf(stdout,
"unexpected cmd=%lu from peer\n", (
unsigned long)mbc->
mbc.
cmd);
757 if (rc !=
sizeof(buf)) {
758 fprintf(stderr,
"recv negotiate request failed\n");
764 uint32_ptr = (uint32_t *)&buf[0];
786 if (uint32_ptr[1] != mbc->
nodes) {
826 return mbc_destroy((
mbc_t *)mbc);
849 fprintf(stdout,
"cmd from peer: %lu (%s)\n",
850 (
unsigned long)mbc->
mbc.
cmd, mbc_cmd2str(mbc->
mbc.
cmd));
854 fprintf(stdout,
"got ABORT from peer\n");
865 int save_errno = errno;
868 msg = strerror(save_errno);
869 fprintf(stderr,
"recv(%lu) reference node failed (%ld: %s)\n",
871 (
long)save_errno, msg);
875 fprintf(stderr,
"recv(%lu) reference node failed (%ld)\n",
881 if (mbc->
modes > 0) {
887 int save_errno = errno;
890 msg = strerror(save_errno);
891 fprintf(stderr,
"recv(%lu) q, qP failed (%ld: %s)\n",
893 (
long)save_errno, msg);
897 fprintf(stderr,
"recv(%lu) q, qP failed (%ld)\n",
941 int save_errno = errno;
944 msg = strerror(save_errno);
945 fprintf(stderr,
"send(%lu) reference node failed (%ld: %s)\n",
947 (
long)save_errno, msg);
951 fprintf(stderr,
"send(%lu) reference node failed (%ld)\n",
958 if (mbc->
modes > 0) {
964 int save_errno = errno;
967 msg = strerror(save_errno);
968 fprintf(stderr,
"send(%lu) modes failed (%ld: %s)\n",
970 (
long)save_errno, msg);
974 fprintf(stderr,
"send(%lu) modes failed (%ld)\n",
1007 fprintf(stderr,
"need at least 1 mode or reference node data\n");
1012 if (mbc_rigid_init(&mbc->
mbcr, refnode, 0, &rot, 0)) {
1017 if (mbc->
modes > 0) {
1038 uint32_t *uint32_ptr;
1039 char buf[
sizeof(uint32_t) +
sizeof(uint32_t)];
1042 fprintf(stderr,
"need at least 1 mode or reference node data\n");
1047 fprintf(stderr,
"socket is not valid\n");
1054 uint32_ptr = (uint32_t *)&buf[0];
1055 uint32_ptr[0] = (uint32_t)
MBC_F(mbc);
1056 uint32_ptr[1] = mbc->
modes;
1058 rc = send(mbc->
mbc.
sock, (
const void *)buf,
sizeof(buf),
1060 if (rc !=
sizeof(buf)) {
1061 fprintf(stderr,
"send negotiate request failed (%ld)\n", (
long)rc);
1070 fprintf(stdout,
"cmd from peer: %lu (%s)\n",
1071 (
unsigned long)mbc->
mbc.
cmd, mbc_cmd2str(mbc->
mbc.
cmd));
1076 fprintf(stdout,
"got ABORT from peer\n");
1083 fprintf(stdout,
"unexpected cmd=%lu from peer\n", (
unsigned long)mbc->
mbc.
cmd);
1094 uint32_t *uint32_ptr;
1095 char buf[
sizeof(uint32_t) +
sizeof(uint32_t)];
1104 fprintf(stdout,
"cmd from peer: %lu (%s)\n",
1105 (
unsigned long)mbc->
mbc.
cmd, mbc_cmd2str(mbc->
mbc.
cmd));
1113 fprintf(stdout,
"unexpected cmd=%lu from peer\n", (
unsigned long)mbc->
mbc.
cmd);
1118 if (rc !=
sizeof(buf)) {
1119 fprintf(stderr,
"recv negotiate request failed\n");
1125 uint32_ptr = (uint32_t *)&buf[0];
1137 if (uint32_ptr[1] != mbc->
modes) {
1165 return mbc_destroy((
mbc_t *)mbc);
#define MBC_F_LABELS(mbc)
int mbc_nodal_negotiate_response(mbc_nodal_t *mbc)
Unused.
#define MBC_M_DYNAMICS_SIZE(mbc)
int mbc_nodal_get_motion(mbc_nodal_t *mbc)
Get nodal motion from peer.
#define MBC_M_KINEMATICS_SIZE(mbc)
#define MBC_N_DYNAMICS(mbc)
nodal stuff (partially opaque).
#define MBC_F_SET_ROT_MAT(mbc)
int mbc_modal_destroy(mbc_modal_t *mbc)
Destroy modal data.
#define MBC_F_SET_REF_NODE(mbc)
int mbc_nodal_init(mbc_nodal_t *mbc, unsigned refnode, unsigned nodes, unsigned labels, unsigned rot, unsigned accels)
Initialize nodal data.
int mbc_modal_negotiate_response(mbc_modal_t *mbc)
Unused.
#define MBC_M_DYNAMICS(mbc)
#define MBC_N_DYNAMICS_SIZE(mbc)
#define MBC_F_SET_ROT_THETA(mbc)
#define MBC_R_KINEMATICS_SIZE(mbc)
#define MBC_F_ACCELS(mbc)
int mbdyn_make_inet_socket(struct sockaddr_in *name, const char *hostname, unsigned short int port, int dobind, int *perror)
#define MBC_F_SET_ACCELS(mbc)
#define MBC_N_KINEMATICS_SIZE(mbc)
int mbc_modal_negotiate_request(mbc_modal_t *mbc)
Negotiate modal data.
#define MBC_F_SET(mbc, f)
#define MBC_U_REF_NODE_ROT_2_ROT(u)
#define MBC_R_DYNAMICS(mbc)
int mbc_modal_init(mbc_modal_t *mbc, int refnode, unsigned modes)
Initialize modal data.
#define MBC_R_DYNAMICS_SIZE(mbc)
int mbc_put_cmd(mbc_t *mbc)
Opaque.
Connection data structure (partially opaque)
int mbc_nodal_put_forces(mbc_nodal_t *mbc, int last)
Put forces to peer.
int mbc_get_cmd(mbc_t *mbc)
Opaque.
int mbdyn_make_named_socket(struct sockaddr_un *name, const char *path, int dobind, int *perror)
#define MBC_R_KINEMATICS(mbc)
#define MBC_F_REF_NODE(mbc)
int mbc_unix_init(mbc_t *mbc, const char *path)
Initialize communication using "unix" socket.
int mbc_check_cmd(mbc_t *mbc)
Opaque.
int mbc_nodal_negotiate_request(mbc_nodal_t *mbc)
Negotiate nodal data.
#define MBC_U_ROT_2_REF_NODE_ROT(u)
int mbc_inet_init(mbc_t *mbc, const char *host, short unsigned port)
Initialize communication using "inet" socket.
#define MBC_F_SET_LABELS(mbc)
int mbc_modal_get_motion(mbc_modal_t *mbc)
Get modal motion from peer.
Nodal stuff (partially opaque).
Reference node (AKA "rigid") stuff (partially opaque).
static doublereal buf[BUFSIZE]
#define MBC_F_SET_ROT_EULER_123(mbc)
#define MBC_N_KINEMATICS(mbc)
int mbc_nodal_destroy(mbc_nodal_t *mbc)
Destroy nodal data.
int mbc_modal_put_forces(mbc_modal_t *mbc, int last)
Put forces to peer.
#define MBC_M_KINEMATICS(mbc)