#include "standard.h"#include "channel.h"#include "clock.h"#include "input.h"Go to the source code of this file.
Defines | |
| #define | MAX_RAND 2147483647 |
| #define | BUFSIZE 65536 |
Functions | |
| void | apply_errors (byte *data, channel *chan) |
| int | channel_write_indication (channel *one) |
| int | channel_write (channel *one, byte m) |
| int | channel_read_indication (channel *one) |
| byte | channel_read (channel *one) |
| channel * | new_channel (char *name) |
| void | close_channel (channel *c) |
Variables | |
| int | debug |
|
|
Definition at line 18 of file channel.c. Referenced by new_channel(). |
|
|
|
|
||||||||||||
|
Definition at line 21 of file channel.c. References channel::bit_count, channel::bit_error_rate, byte, data, debug, channel::error, error(), channel::error_count, channel::error_file, channel::error_offset, channel::file_open, channel::filename, channel::label, and warn(). Referenced by channel_read(). 00022 {
00023 int i, j, count=0, num_bits;
00024 float r;
00025 float ber;
00026 byte b=*data;
00027
00028 chan->bit_count += 8;
00029
00030 if (chan->error==NoErrors)
00031 return;
00032
00033 if (chan->error == Random) {
00034 if (chan->bit_error_rate == 0.0)
00035 return;
00036
00037 if ((chan->bit_count/8) >= chan->error_offset) {
00038 for (j=0; j<8; j++) {
00039 r = (float) random() / MAX_RAND;
00040 if (r < chan->bit_error_rate) {
00041 b ^= (1 << j);
00042 count++;
00043 chan->error_count++;
00044 if (debug >= 2)
00045 printf("apply_errors() r=%e, bit %d flipped. \n", r, j);
00046 }
00047 }
00048 }
00049 else
00050 if (debug>=4) printf("apply_errors() - not applying errors yet\n");
00051 }
00052
00053 else if (chan->error == File) {
00054 if (chan->filename==NULL) {
00055 warn("apply_errors","channel's error file name is NULL");
00056 return;
00057 }
00058 if ((chan->bit_count/8) > chan->error_offset) {
00059 if (!chan->file_open) {
00060 chan->error_file = fopen(chan->filename,"r");
00061 if (chan->error_file == NULL) {
00062 error("apply_errors","Can't open error file");
00063 }
00064 chan->file_open = 1;
00065 }
00066
00067 for (j=0; j<8; j++) {
00068 if (feof(chan->error_file))
00069 fseek(chan->error_file, 0, 0);
00070 if (fgetc(chan->error_file)=='1') {
00071 b ^= (1 << j);
00072 count++;
00073 chan->error_count++;
00074 if (debug >= 4)
00075 printf("apply_errors() bit %d flipped\n", j);
00076 }
00077 }
00078 }
00079 else
00080 if (debug>=4) printf("apply_errors() - not applying errors yet\n");
00081 }
00082 if (debug >= 4) {
00083 printf("apply_errors() [%s] Applied %d errors to byte\n",
00084 chan->label, count);
00085 }
00086 if (debug >= 1) {
00087 printf("apply_errors() [%s] Errors %d / %d bits (BER %e)\n",
00088 chan->label,
00089 chan->error_count, chan->bit_count,
00090 (float) chan->error_count / chan->bit_count);
00091 }
00092
00093
00094 /* copy modified byte back to *data. cheezy way of doing this. */
00095
00096 *data = b;
00097
00098 /*
00099 * Figure out the BER for this packet and log it.
00100 */
00101
00102
00103 /* ber = (float) count / (float) num_bits;
00104 log_ber(ber, 0); */
00105
00106 return;
00107 }
|
|
|
Definition at line 161 of file channel.c. References apply_errors(), bread(), byte, channel::pdus, and channel::read_count. Referenced by demultiplex(). 00165 {
00166 static byte b;
00167
00168 bread(one->pdus, &b);
00169
00170 apply_errors(&b, one);
00171
00172 one->read_count++;
00173
00174 return(b);
00175 }
|
|
|
Definition at line 140 of file channel.c. References blevel(), get_clock(), channel::pdus, channel::read_count, channel::transmission_delay, and channel::transmission_speed. Referenced by demultiplex(). 00150 {
00151 /* long int pos = ((get_clock() * one->transmission_speed) / 8000) - one->transmission_delay; */
00152 long int allowed = ((get_clock() - one->transmission_delay) * one->transmission_speed) / 8000;
00153
00154 if (blevel(one->pdus) > 0)
00155 return (one->read_count < allowed);
00156 else
00157 return 0;
00158 }
|
|
||||||||||||
|
Definition at line 128 of file channel.c. References bwrite(), channel::pdus, and channel::write_count. Referenced by multiplex(). 00134 {
00135 bwrite(one->pdus, &m);
00136 one->write_count++;
00137 }
|
|
|
Definition at line 110 of file channel.c. References get_clock(), channel::transmission_speed, and channel::write_count. Referenced by multiplex(). 00120 {
00121 /* int level = (one->transmission_speed * one->transmission_delay) / 8000; */
00122 long int allowed = (one->transmission_speed * get_clock()) / 8000;
00123
00124 return (one->write_count < allowed);
00125 }
|
|
|
Definition at line 205 of file channel.c. References channel::bit_count, closebuffer(), channel::error_count, channel::error_file, channel::label, and channel::pdus. Referenced by cleanup(). 00206 {
00207 if (debug) {
00208 fprintf(stdout,"Channel %s:\n",c->label);
00209 fprintf(stdout,"Number of errors: %d\nNumber of bits: %d\n",c->error_count,
00210 c->bit_count);
00211 fprintf(stdout,"BER: %f\n", (float) c->error_count/c->bit_count);
00212 }
00213 if (c->error_file!=NULL)
00214 fclose(c->error_file);
00215 closebuffer(c->pdus);
00216 free(c);
00217 }
|
|
|
Definition at line 178 of file channel.c. References channel::bit_count, channel::bit_error_rate, BUFSIZE, byte, DEF_CHANNEL_FILE, channel::error, error(), channel::error_count, channel::error_file, channel::error_offset, channel::file_open, channel::filename, channel::label, mkbuffer(), channel::pdus, channel::read_count, channel::transmission_delay, channel::transmission_speed, and channel::write_count. Referenced by start_config(). 00179 {
00180 char s[256];
00181 int x;
00182
00183 channel *one = malloc(sizeof(channel));
00184 if (one != NULL) {
00185 strcpy(one->label, name);
00186 one->transmission_speed = DEF_CHANNEL_SPEED;
00187 one->transmission_delay = DEF_CHANNEL_DELAY;
00188 one->error = DEF_CHANNEL_ERROR;
00189 one->bit_error_rate = DEF_CHANNEL_BER;
00190 strcpy(one->filename, DEF_CHANNEL_FILE);
00191 one->pdus = mkbuffer(BUFSIZE, sizeof(byte));
00192 one->error_count = 0;
00193 one->bit_count = 0;
00194 one->write_count=0;
00195 one->read_count=0;
00196 one->error_offset=0;
00197 one->file_open=0;
00198 one->error_file=NULL;
00199 }
00200 else
00201 error("new_channel","Can't malloc new channel");
00202 return (one);
00203 }
|
|
|
|
1.3.9.1