static void emove_client_write_task_code(emove_client_write_task_args *args) { ulapi_task_struct *task; int id; int period_nsecs; enum {OUTBUF_SIZE = 1024}; char outbuf[OUTBUF_SIZE]; int nchars; nist_kitting::emove_stat emove_stat; task = args->task; id = args->id; period_nsecs = args->period_nsecs; free(args); while (true) { ros::spinOnce(); ulapi_mutex_take(&emove_stat_mutex); emove_stat = emove_stat_buf; ulapi_mutex_give(&emove_stat_mutex); /* uint8 type uint8 serial_number uint8 state uint8 status uint8 heartbeat float32 period float32 cycle float32 duration extern char *kitting_cmd_to_string(int s); extern char *rcs_state_to_string(int s); extern char *rcs_status_to_string(int s); */ ulapi_snprintf(outbuf, sizeof(outbuf), "%s %d %s %s %d %s %s %s\n", kitting_cmd_to_string(emove_stat.stat.type), emove_stat.stat.serial_number, rcs_state_to_string(emove_stat.stat.state), rcs_status_to_string(emove_stat.stat.status), emove_stat.stat.heartbeat, emove_stat.name.c_str(), emove_stat.line.c_str(), emove_stat.crcl.c_str()); outbuf[sizeof(outbuf)-1] = 0; nchars = ulapi_socket_write(id, outbuf, strlen(outbuf)); if (nchars <= 0) break; ulapi_wait(period_nsecs); } ulapi_socket_close(id); if (debug) printf("emove client write handler %d done\n", id); ulapi_task_delete(task); return; }
void client_code(void *args) { void *client_task; ulapi_integer client_id; client_db_struct *client_db_ptr; ulapi_integer debug; enum {BUFFERLEN = 256}; char inbuf[BUFFERLEN]; char outbuf[BUFFERLEN]; ulapi_integer nchars; int number; int lastnumber = 0; client_task = ((client_args *) args)->client_task; client_id = ((client_args *) args)->client_id; client_db_ptr = ((client_args *) args)->client_db_ptr; debug = ((client_args *) args)->debug; free(args); /* The client thread asks for an update every second, blocks until it gets a response, prints it, and loops again. */ for (;;) { ulapi_mutex_take(client_db_ptr->mutex); number = client_db_ptr->number; ulapi_mutex_give(client_db_ptr->mutex); if (number != lastnumber) { ulapi_snprintf(outbuf, sizeof(outbuf), "write %d", number); lastnumber = number; } else { ulapi_snprintf(outbuf, sizeof(outbuf), "read"); } ulapi_socket_write(client_id, outbuf, strlen(outbuf)+1); nchars = ulapi_socket_read(client_id, inbuf, sizeof(inbuf)-1); if (-1 == nchars) { if (debug) printf("connection closed\n"); break; } if (0 == nchars) { if (debug) printf("end of file\n"); break; } inbuf[nchars] = 0; /* Parse and handle the message here as your application requires. */ printf("%s\n", inbuf); ulapi_wait(1000000000); } ulapi_socket_close(client_id); }