Simplify adc_bridge, also removing excess white space.

This commit is contained in:
Giles Atkinson 2024-10-07 09:54:03 +01:00
parent 65fb8e245b
commit 5a53a2ecd2
1 changed files with 77 additions and 240 deletions

View File

@ -8,28 +8,21 @@ Public Domain
Georgia Tech Research Corporation
Atlanta, Georgia 30332
PROJECT A-8503-405
AUTHORS
AUTHORS
6 June 1991 Jeffrey P. Murray
MODIFICATIONS
MODIFICATIONS
26 Sept 1991 Jeffrey P. Murray
SUMMARY
This file contains the functional description of the adc_bridge
code model.
This file contains the functional description of the adc_bridge code model.
INTERFACES
INTERFACES
FILE ROUTINE CALLED
FILE ROUTINE CALLED
CM.c void *cm_analog_alloc()
void *cm_analog_get_ptr()
@ -37,67 +30,40 @@ INTERFACES
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
AUTHORS
6 June 1991 Jeffrey P. Murray
MODIFICATIONS
MODIFICATIONS
26 Sept 1991 Jeffrey P. Murray
SUMMARY
This function implements the adc_bridge code model.
INTERFACES
INTERFACES
FILE ROUTINE CALLED
FILE ROUTINE CALLED
CM.c void *cm_analog_alloc()
void *cm_analog_get_ptr()
@ -107,15 +73,12 @@ INTERFACES
int cm_event_queue()
RETURNED VALUE
Returns inputs and outputs via ARGS structure.
GLOBAL VARIABLES
NONE
NON-STANDARD FEATURES
NONE
==============================================================================*/
@ -131,231 +94,105 @@ NON-STANDARD FEATURES
* Last Modified 7/26/91 J.P.Murray *
************************************************/
void cm_adc_bridge(ARGS)
static Digital_State_t get_out_value(double in, double low, double high)
{
double in_low, /* analog output value corresponding to '0'
if (in >= high)
return ONE;
else if (in <= low)
return ZERO;
return UNKNOWN;
}
void cm_adc_bridge(ARGS)
{
double in_low, /* analog output value corresponding to '0'
digital input */
in_high, /* analog output value corresponding to '1'
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 */
int i, /* generic loop counter index */
size; /* number of input & output ports */
Digital_State_t *out, /* base address of array holding all input
Digital_State_t *out, /* base address of array holding all output
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);
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);
cm_event_alloc(0, size * (int) sizeof(Digital_State_t));
/* Get discrete addresses */
out = out_old = (Digital_State_t *) cm_event_get_ptr(1,0);
out = (Digital_State_t *) cm_event_get_ptr(0,0);
/* Ensure output on first call. */
for (i = 0; i < size; i++)
out[i] = UNKNOWN + 1;
return;
}
else { /*** This is not an initialization pass...retrieve storage
addresses and calculate new outputs, if required. ***/
/*** This is not an initialization pass...retrieve storage
addresses and calculate new outputs, if required. ***/
out = (Digital_State_t *) cm_event_get_ptr(0, 0);
/** 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) {
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 */
}
for (i = 0; i < size; i++) {
test = get_out_value(INPUT(in[i]), in_low, in_high);
if (test != out[i]) {
/* call for event breakpoint... */
cm_event_queue(TIME);
break;
}
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;
for (i = 0; i < size; i++) {
test = get_out_value(INPUT(in[i]), in_low, in_high);
if (test != out[i]) {
/* Post changed value. */
OUTPUT_STATE(out[i]) = test;
switch (test) {
case ZERO:
OUTPUT_DELAY(out[i]) = PARAM(fall_delay);
break;
case ONE:
OUTPUT_DELAY(out[i]) = PARAM(rise_delay);
break;
default:
if (out[i] == ZERO)
OUTPUT_DELAY(out[i]) = PARAM(rise_delay);
else
OUTPUT_DELAY(out[i]) = PARAM(fall_delay);
break;
}
out[i] = test;
/* Regardless, output the strength */
OUTPUT_STRENGTH(out[i]) = STRONG;
} 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;
default:
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;
}
}
}