You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
359 lines
10 KiB
359 lines
10 KiB
/*.......1.........2.........3.........4.........5.........6.........7.........8
|
|
================================================================================
|
|
|
|
FILE adc_bridge/cfunc.mod
|
|
|
|
Public Domain
|
|
|
|
Georgia Tech Research Corporation
|
|
Atlanta, Georgia 30332
|
|
PROJECT A-8503-405
|
|
|
|
|
|
AUTHORS
|
|
|
|
6 June 1991 Jeffrey P. Murray
|
|
|
|
|
|
MODIFICATIONS
|
|
|
|
26 Sept 1991 Jeffrey P. Murray
|
|
|
|
|
|
SUMMARY
|
|
|
|
This file contains the functional description of the adc_bridge
|
|
code model.
|
|
|
|
|
|
INTERFACES
|
|
|
|
FILE ROUTINE CALLED
|
|
|
|
CM.c void *cm_analog_alloc()
|
|
void *cm_analog_get_ptr()
|
|
|
|
CMevt.c void *cm_event_alloc()
|
|
void *cm_event_get_ptr()
|
|
int cm_event_queue()
|
|
|
|
|
|
|
|
|
|
REFERENCED FILES
|
|
|
|
Inputs from and outputs to ARGS structure.
|
|
|
|
|
|
NON-STANDARD FEATURES
|
|
|
|
NONE
|
|
|
|
===============================================================================*/
|
|
|
|
/*=== INCLUDE FILES ====================*/
|
|
|
|
|
|
|
|
|
|
/*=== CONSTANTS ========================*/
|
|
|
|
|
|
|
|
|
|
/*=== MACROS ===========================*/
|
|
|
|
|
|
|
|
|
|
/*=== LOCAL VARIABLES & TYPEDEFS =======*/
|
|
|
|
|
|
|
|
|
|
/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*==============================================================================
|
|
|
|
FUNCTION cm_adc_bridge()
|
|
|
|
AUTHORS
|
|
|
|
6 June 1991 Jeffrey P. Murray
|
|
|
|
MODIFICATIONS
|
|
|
|
26 Sept 1991 Jeffrey P. Murray
|
|
|
|
SUMMARY
|
|
|
|
This function implements the adc_bridge code model.
|
|
|
|
INTERFACES
|
|
|
|
FILE ROUTINE CALLED
|
|
|
|
CM.c void *cm_analog_alloc()
|
|
void *cm_analog_get_ptr()
|
|
|
|
CMevt.c void *cm_event_alloc()
|
|
void *cm_event_get_ptr()
|
|
int cm_event_queue()
|
|
|
|
RETURNED VALUE
|
|
|
|
Returns inputs and outputs via ARGS structure.
|
|
|
|
GLOBAL VARIABLES
|
|
|
|
NONE
|
|
|
|
NON-STANDARD FEATURES
|
|
|
|
NONE
|
|
|
|
==============================================================================*/
|
|
|
|
/*=== CM_ADC_BRIDGE ROUTINE ===*/
|
|
|
|
/************************************************
|
|
* The following is the model for the *
|
|
* analog-to-digital nodebridge for the *
|
|
* ATESSE Version 2.0 system. *
|
|
* *
|
|
* Created 6/6/91 *
|
|
* Last Modified 7/26/91 J.P.Murray *
|
|
************************************************/
|
|
|
|
|
|
void cm_adc_bridge(ARGS)
|
|
|
|
{
|
|
double in_low, /* analog output value corresponding to '0'
|
|
digital input */
|
|
in_high, /* analog output value corresponding to '1'
|
|
digital input */
|
|
current_time, /* the current time value */
|
|
*in, /* base address of array holding all digital output
|
|
values plus their previous values */
|
|
*in_old; /* base address of array holding previous
|
|
output values */
|
|
|
|
|
|
int i, /* generic loop counter index */
|
|
size; /* number of input & output ports */
|
|
|
|
|
|
|
|
Digital_State_t *out, /* base address of array holding all input
|
|
values plus their previous values */
|
|
*out_old, /* base address of array holding previous
|
|
input values */
|
|
test; /* temp holding variable for digital states */
|
|
|
|
|
|
|
|
|
|
|
|
/* determine "width" of the node bridge... */
|
|
|
|
size = PORT_SIZE(in);
|
|
in_high = PARAM(in_high);
|
|
in_low = PARAM(in_low);
|
|
|
|
|
|
|
|
|
|
if (INIT) { /*** Test for INIT == TRUE. If so, allocate storage, etc. ***/
|
|
|
|
|
|
/* Allocate storage for inputs */
|
|
cm_analog_alloc(0, size * (int) sizeof(double));
|
|
|
|
/* Allocate storage for outputs */
|
|
cm_event_alloc(1, size * (int) sizeof(Digital_State_t));
|
|
|
|
/* Get analog addresses */
|
|
in = in_old = (double *) cm_analog_get_ptr(0,0);
|
|
|
|
/* Get discrete addresses */
|
|
out = out_old = (Digital_State_t *) cm_event_get_ptr(1,0);
|
|
}
|
|
|
|
else { /*** This is not an initialization pass...retrieve storage
|
|
addresses and calculate new outputs, if required. ***/
|
|
|
|
|
|
/** Retrieve previous values... **/
|
|
|
|
/* assign discrete addresses */
|
|
in = (double *) cm_analog_get_ptr(0,0);
|
|
in_old = (double *) cm_analog_get_ptr(0,1);
|
|
|
|
/* assign analog addresses */
|
|
out = (Digital_State_t *) cm_event_get_ptr(1,0);
|
|
out_old = (Digital_State_t *) cm_event_get_ptr(1,1);
|
|
|
|
}
|
|
|
|
|
|
/* read current input values */
|
|
for (i=0; i<size; i++) {
|
|
in[i] = INPUT(in[i]);
|
|
}
|
|
|
|
|
|
/*** If TIME == 0.0, bypass calculations ***/
|
|
if (0.0 != TIME) {
|
|
|
|
switch (CALL_TYPE) {
|
|
|
|
case ANALOG: /** analog call...check for breakpoint calls. **/
|
|
|
|
/* loop through all inputs... */
|
|
for (i=0; i<size; i++) {
|
|
|
|
if (in[i] <= in_low) { /* low output required */
|
|
|
|
test = ZERO;
|
|
|
|
if ( test != out_old[i] ) {
|
|
/* call for event breakpoint... */
|
|
current_time = TIME;
|
|
cm_event_queue(current_time);
|
|
}
|
|
else {
|
|
/* no change since last time */
|
|
}
|
|
|
|
}
|
|
else {
|
|
if (in[i] >= in_high) { /* high output required */
|
|
|
|
test = ONE;
|
|
|
|
if ( test != out_old[i] ) {
|
|
/* call for event breakpoint... */
|
|
current_time = TIME;
|
|
cm_event_queue(current_time);
|
|
}
|
|
else {
|
|
/* no change since last time */
|
|
}
|
|
|
|
}
|
|
else { /* unknown output required */
|
|
|
|
if ( UNKNOWN != out_old[i] ) {
|
|
|
|
/* call for event breakpoint... */
|
|
current_time = TIME;
|
|
cm_event_queue(current_time);
|
|
}
|
|
else {
|
|
/* no change since last time */
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case EVENT: /** discrete call...lots to do **/
|
|
|
|
/* loop through all inputs... */
|
|
for (i=0; i<size; i++) {
|
|
|
|
if (in[i] <= in_low) { /* low output required */
|
|
|
|
out[i] = ZERO;
|
|
|
|
if ( out[i] != out_old[i] ) {
|
|
/* post changed value */
|
|
OUTPUT_STATE(out[i]) = ZERO;
|
|
OUTPUT_DELAY(out[i]) = PARAM(fall_delay);
|
|
}
|
|
else {
|
|
/* no change since last time */
|
|
OUTPUT_CHANGED(out[i]) = FALSE;
|
|
}
|
|
|
|
}
|
|
else {
|
|
if (in[i] >= in_high) { /* high output required */
|
|
|
|
out[i] = ONE;
|
|
|
|
if ( out[i] != out_old[i] ) {
|
|
/* post changed value */
|
|
OUTPUT_STATE(out[i]) = ONE;
|
|
OUTPUT_DELAY(out[i]) = PARAM(rise_delay);
|
|
}
|
|
else {
|
|
/* no change since last time */
|
|
OUTPUT_CHANGED(out[i]) = FALSE;
|
|
}
|
|
|
|
}
|
|
else { /* unknown output required */
|
|
|
|
out[i] = UNKNOWN;
|
|
|
|
if ( UNKNOWN != out_old[i] ) {
|
|
|
|
/* post changed value */
|
|
OUTPUT_STATE(out[i]) = UNKNOWN;
|
|
|
|
switch (out_old[i]) {
|
|
case ONE:
|
|
OUTPUT_DELAY(out[i]) = PARAM(fall_delay);
|
|
break;
|
|
|
|
case ZERO:
|
|
OUTPUT_DELAY(out[i]) = PARAM(rise_delay);
|
|
break;
|
|
case UNKNOWN: /* should never get here! */
|
|
break;
|
|
}
|
|
}
|
|
else {
|
|
/* no change since last time */
|
|
OUTPUT_CHANGED(out[i]) = FALSE;
|
|
}
|
|
}
|
|
}
|
|
/* regardless, output the strength */
|
|
OUTPUT_STRENGTH(out[i]) = STRONG;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
else { /*** TIME == 0.0 => set outputs to input value... ***/
|
|
/* loop through all inputs... */
|
|
for (i=0; i<size; i++) {
|
|
|
|
if (in[i] <= in_low) { /* low output required */
|
|
OUTPUT_STATE(out[i]) = out[i] = ZERO;
|
|
}
|
|
else
|
|
if (in[i] >= in_high) { /* high output required */
|
|
OUTPUT_STATE(out[i]) = out[i] = ONE;
|
|
}
|
|
else {
|
|
OUTPUT_STATE(out[i]) = out[i] = UNKNOWN;
|
|
}
|
|
OUTPUT_STRENGTH(out[i]) = STRONG;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|