From c4b623ab158f00e8a8aeb4f956ac4fa7b4378a2d Mon Sep 17 00:00:00 2001 From: Ron Sluiter Date: Mon, 17 Jul 2000 18:43:40 +0000 Subject: [PATCH] - Support for driver specific axis names. - Support command string record separator. - Send axis name with send_msg(). - Remove command line terminator from motor_send(). --- motorApp/MotorSrc/motordrvCom.c | 106 +++++++++++++++++++++++--------- 1 file changed, 77 insertions(+), 29 deletions(-) diff --git a/motorApp/MotorSrc/motordrvCom.c b/motorApp/MotorSrc/motordrvCom.c index 8c4c90af..952e504f 100644 --- a/motorApp/MotorSrc/motordrvCom.c +++ b/motorApp/MotorSrc/motordrvCom.c @@ -3,9 +3,9 @@ FILENAME... motordrvCom.c USAGE... This file contains driver functions that are common to all motor record driver modules. -Version: $Revision: 1.3 $ +Version: $Revision: 1.4 $ Modified By: $Author: sluiter $ -Last Modified: $Date: 2000-06-14 15:11:37 $ +Last Modified: $Date: 2000-07-17 18:43:40 $ */ /* @@ -75,8 +75,6 @@ static void process_messages(struct driver_table *tabptr, ULONG tick); static struct mess_node *get_head_node(struct driver_table *tabptr); static struct mess_node *motor_malloc(struct circ_queue *freelistptr, FAST_LOCK *lockptr); -char oms_trans_axis[] = {'X', 'Y', 'Z', 'T', 'U', 'V', 'R', 'S'}; - /* * FUNCION... motor_task() @@ -173,8 +171,8 @@ int motor_task(int scan_rate, int msw_tab_ptr, int lsw_tab_ptr, int a4, int a5, static int query_axis(int card, struct driver_table *tabptr, ULONG tick) { - int index; struct controller *brdptr; + int index; brdptr = (*tabptr->card_array)[card]; @@ -211,7 +209,27 @@ static int query_axis(int card, struct driver_table *tabptr, ULONG tick) mess_ret->status = motor_motion->status; mess_ret->type = motor_motion->type; - if (motor_motion->status & RA_OVERTRAVEL || + if (motor_motion->status & RA_DONE && motor_motion->type == MOTION && + (strlen(motor_motion->message) != NULL)) + { + char axis_name; + + if (tabptr->axis_names == NULL) + axis_name = NULL; + else + axis_name = tabptr->axis_names[index]; + + mess_ret->status &= ~RA_DONE; /* Hide DONE from record. */ + /* Send backlash command to controller. */ + (*tabptr->sendmsg) (card, motor_motion->message, axis_name); + if (brdptr->cmnd_response == ON) + { + char inbuf[MAX_MSG_SIZE]; + (*tabptr->getmsg) (card, inbuf, 1); + } + motor_motion->message[0] = NULL; + } + else if (motor_motion->status & RA_OVERTRAVEL || motor_motion->status & RA_DONE || motor_motion->status & RA_PROBLEM) { @@ -241,23 +259,35 @@ static void process_messages(struct driver_table *tabptr, ULONG tick) while ((node = get_head_node(tabptr))) { - if ((node->card >= 0 && node->card < *tabptr->cardcnt_ptr) && - (*tabptr->card_array)[node->card] && - (node->signal >= 0 && node->signal < (*tabptr->card_array)[node->card]->total_axis)) + int card, axis; + + card = node->card; + axis = node->signal; + + if ((card >= 0 && card < *tabptr->cardcnt_ptr) && + (*tabptr->card_array)[card] && + (axis >= 0 && axis < (*tabptr->card_array)[card]->total_axis)) { struct mess_info *motor_info; struct controller *brdptr; + char *head, *tail, inbuf[MAX_MSG_SIZE], outbuf[MAX_MSG_SIZE]; + char axis_name; - motor_info = &((*tabptr->card_array)[node->card]->motor_info[node->signal]); + if (tabptr->axis_names == NULL) + axis_name = NULL; + else + axis_name = tabptr->axis_names[axis]; + + motor_info = &((*tabptr->card_array)[card]->motor_info[axis]); motor_motion = motor_info->motor_motion; - brdptr = (*tabptr->card_array)[node->card]; + brdptr = (*tabptr->card_array)[card]; switch (node->type) { case VELOCITY: - (*tabptr->sendmsg) (node->card, node->message, (char) NULL); + (*tabptr->sendmsg) (card, node->message, axis_name); if (brdptr->cmnd_response == ON) - (*tabptr->getmsg) (node->card, node->message, 1); + (*tabptr->getmsg) (card, inbuf, 1); /* * this is tricky - another motion is here there is a very @@ -273,27 +303,46 @@ static void process_messages(struct driver_table *tabptr, ULONG tick) */ if (!motor_motion) /* if NULL */ - (*tabptr->card_array)[node->card]->motor_in_motion++; + (*tabptr->card_array)[card]->motor_in_motion++; else motor_free(motor_motion, tabptr); - SET_MM_ON(*tabptr->any_inmotion_ptr, node->card); + SET_MM_ON(*tabptr->any_inmotion_ptr, card); motor_info->motor_motion = node; motor_info->status_delay = tick; break; case MOTION: - (*tabptr->sendmsg) (node->card, node->message, (char) NULL); + head = node->message; + /* Search for ASCII record separator (IS2) = /x1E. */ + tail = strchr(head, '\x1E'); + if (tail == NULL) + { + strcpy(outbuf, head); + /* Empty "message" signals query_axis() there are no more messages. */ + *head = NULL; + } + else + { + int size = tail - head; /* Copy 1st command to local buffer. */ + strncpy(outbuf, head, size); + outbuf[size] = NULL; + + strcpy(head, ++tail); /* Move 2nd command to front of message buffer. */ + if ((tail = strchr(head, '\x1E')) != NULL) + *tail = NULL; /* Remove record separator from buffer. */ + } + (*tabptr->sendmsg) (card, outbuf, axis_name); if (brdptr->cmnd_response == ON) - (*tabptr->getmsg) (node->card, node->message, 1); + (*tabptr->getmsg) (card, inbuf, 1); /* this is tricky - see velocity comment */ if (!motor_motion) /* if NULL */ - (*tabptr->card_array)[node->card]->motor_in_motion++; + (*tabptr->card_array)[card]->motor_in_motion++; else motor_free(motor_motion, tabptr); - SET_MM_ON(*tabptr->any_inmotion_ptr, node->card); + SET_MM_ON(*tabptr->any_inmotion_ptr, card); motor_info->no_motion_count = 0; motor_info->motor_motion = node; motor_info->status_delay = tick; @@ -308,8 +357,8 @@ static void process_messages(struct driver_table *tabptr, ULONG tick) taskDelay((int) (2 - delay)); /* 2 RTOS tick delay. */ if (tabptr->strtstat != NULL) - (*tabptr->strtstat) (node->card); - (*tabptr->setstat) (node->card, node->signal); + (*tabptr->strtstat) (card); + (*tabptr->setstat) (card, axis); node->position = motor_info->position; node->encoder_position = motor_info->encoder_position; @@ -331,16 +380,18 @@ static void process_messages(struct driver_table *tabptr, ULONG tick) break; case MOVE_TERM: - (*tabptr->sendmsg) (node->card, node->message, (char) NULL); + if (motor_motion != NULL) + motor_motion->message[0] = NULL; /* Clear 2nd command from buffer. */ + (*tabptr->sendmsg) (card, node->message, axis_name); if (brdptr->cmnd_response == ON) - (*tabptr->getmsg) (node->card, node->message, 1); + (*tabptr->getmsg) (card, inbuf, 1); motor_free(node, tabptr); /* free message buffer */ break; default: - (*tabptr->sendmsg) (node->card, node->message, (char) NULL); + (*tabptr->sendmsg) (card, node->message, axis_name); if (brdptr->cmnd_response == ON) - (*tabptr->getmsg) (node->card, node->message, 1); + (*tabptr->getmsg) (card, inbuf, 1); motor_free(node, tabptr); /* free message buffer */ motor_info->status_delay = tick; break; @@ -396,7 +447,7 @@ static struct mess_node *get_head_node(struct driver_table *tabptr) * Insert new node at tail of queue. */ -int motor_send(struct mess_node *u_msg, struct driver_table *tabptr, char *cmnd_line_terminator) +int motor_send(struct mess_node *u_msg, struct driver_table *tabptr) { struct mess_node *new_message; struct circ_queue *qptr; @@ -428,8 +479,6 @@ int motor_send(struct mess_node *u_msg, struct driver_table *tabptr, char *cmnd_ return (-1); } - strcat(new_message->message, cmnd_line_terminator); - FASTLOCK(tabptr->quelockptr); qptr = tabptr->queptr; if (qptr->tail) @@ -511,7 +560,6 @@ int motor_card_info(int card, MOTOR_CARD_QUERY * cq, struct driver_table *tabptr { cq->total_axis = brdptr->total_axis; cq->card_name = brdptr->ident; - cq->axis_names = oms_trans_axis; } else cq->total_axis = 0;