diff options
Diffstat (limited to 'attic/servers/gpib_server_lin/src/scope_functions.c')
-rwxr-xr-x | attic/servers/gpib_server_lin/src/scope_functions.c | 516 |
1 files changed, 516 insertions, 0 deletions
diff --git a/attic/servers/gpib_server_lin/src/scope_functions.c b/attic/servers/gpib_server_lin/src/scope_functions.c new file mode 100755 index 0000000..8d35552 --- /dev/null +++ b/attic/servers/gpib_server_lin/src/scope_functions.c @@ -0,0 +1,516 @@ +/* + * Remote Laboratory Instrumentation Server + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * (c) 2009 Timothy Pearson + * Raptor Engineering + * http://www.raptorengineeringinc.com + */ + +#include <ctype.h> +#include <errno.h> +#include <stdio.h> +#include <unistd.h> +#include <stdlib.h> +#include <stdint.h> +#include <string.h> +#include <getopt.h> +#include <allegro.h> +#include "parameters.h" +#include "gpib_functions.h" +#include "gpib/ib.h" + +char falpha[1024]; +unsigned char scope_raw_screenshot_data[4194304]; + +unsigned long scopeScreenWidth (char * scopeType) { + if (strcmp("HP54600OS", scopeType) == 0) { + return 512; + } + else if (strcmp("TDS744AOS", scopeType) == 0) { + return 640; + } + else { + return 1; + } +} + +unsigned long scopeScreenHeight (char * scopeType) { + if (strcmp("HP54600OS", scopeType) == 0) { + return 280; + } + else if (strcmp("TDS744AOS", scopeType) == 0) { + return 480; + } + else { + return 1; + } +} + +unsigned long scopeScreenSize (char * scopeType) { + if (strcmp("HP54600OS", scopeType) == 0) { + return scopeScreenWidth(scopeType)*scopeScreenHeight(scopeType)*3; + } + else if (strcmp("TDS744AOS", scopeType) == 0) { + return scopeScreenWidth(scopeType)*scopeScreenHeight(scopeType)*3; + } + else { + return 1; + } +} + +int gpib_read_binblock(int ud, int max_num_bytes, char * scopeType) +{ + unsigned char segarray[4194304]; + long array_pointer; + long ai; + + int x; + int y; + + array_pointer = 0; + + #ifdef ENABLE_EXTRA_DEBUGGING + printf("[DEBG] Trying to read %i bytes from GPIB device...\n", max_num_bytes); + #endif + + ibtmo(ud, T30s); + ibeos(ud, 0x0); + + ai = gpib_read_array(ud, max_num_bytes, segarray); + if (ai == -1) { + return 1; + } + else { + if (strcmp("HP54600OS", scopeType) == 0) { + ai = 0; + for (x=0;x<scopeScreenWidth(scopeType);x++) { + for (y=0;y<scopeScreenHeight(scopeType);y++) { + if ((x & 0x7) == 0) scope_raw_screenshot_data[y+(x*scopeScreenHeight(scopeType))] = (segarray[((x >> 3)+(y*(560/8)))+17] & 0x80) << 0; + if ((x & 0x7) == 1) scope_raw_screenshot_data[y+(x*scopeScreenHeight(scopeType))] = (segarray[((x >> 3)+(y*(560/8)))+17] & 0x40) << 1; + if ((x & 0x7) == 2) scope_raw_screenshot_data[y+(x*scopeScreenHeight(scopeType))] = (segarray[((x >> 3)+(y*(560/8)))+17] & 0x20) << 2; + if ((x & 0x7) == 3) scope_raw_screenshot_data[y+(x*scopeScreenHeight(scopeType))] = (segarray[((x >> 3)+(y*(560/8)))+17] & 0x10) << 3; + if ((x & 0x7) == 4) scope_raw_screenshot_data[y+(x*scopeScreenHeight(scopeType))] = (segarray[((x >> 3)+(y*(560/8)))+17] & 0x08) << 4; + if ((x & 0x7) == 5) scope_raw_screenshot_data[y+(x*scopeScreenHeight(scopeType))] = (segarray[((x >> 3)+(y*(560/8)))+17] & 0x04) << 5; + if ((x & 0x7) == 6) scope_raw_screenshot_data[y+(x*scopeScreenHeight(scopeType))] = (segarray[((x >> 3)+(y*(560/8)))+17] & 0x02) << 6; + if ((x & 0x7) == 7) scope_raw_screenshot_data[y+(x*scopeScreenHeight(scopeType))] = (segarray[((x >> 3)+(y*(560/8)))+17] & 0x01) << 7; + if (scope_raw_screenshot_data[y+(x*scopeScreenHeight(scopeType))] == 0x0) scope_raw_screenshot_data[y+(x*scopeScreenHeight(scopeType))] = 255; + if (scope_raw_screenshot_data[y+(x*scopeScreenHeight(scopeType))] == 0x80) scope_raw_screenshot_data[y+(x*scopeScreenHeight(scopeType))] = 0; + } + } + } + else { + return 2; + } + } + + ibtmo(ud, T10s); + + #ifdef ENABLE_EXTRA_DEBUGGING + printf("[DEBG] Read %li bytes from GPIB device\n", array_pointer); + #endif + + return 0; +} + +int gpib_read_array(int ud, int max_num_bytes, unsigned char * segarray) +{ + int br; + + ibrd(ud, segarray, max_num_bytes-1); + br = ThreadIbcntl(); + + #ifdef ENABLE_EXTRA_DEBUGGING + printf("[DEBG] Number of bytes read from GPIB device: %li\n", br); + #endif + if ((ThreadIbsta() & ERR) && (br == 0)) { + return -1; + } + return br; +} + +int gpib_read_binary(int ud, int max_num_bytes) +{ + #ifdef ENABLE_EXTRA_DEBUGGING + printf("[DEBG] Trying to read %i bytes from GPIB device...\n", max_num_bytes); + #endif + + //ibrd(ud, scope_raw_screenshot_data, max_num_bytes-1); + system("rm -f /tmp/current_scope_screenshot.bmp"); + ibrdf(ud, "/tmp/current_scope_screenshot.bmp"); + #ifdef ENABLE_EXTRA_DEBUGGING + printf("[DEBG] Number of bytes read from GPIB device: %li\n", ThreadIbcntl()); + #endif + if (ThreadIbsta() & ERR) { + return -1; + } + return 0; +} + +int scope_get_screenshot_stage2(char * scopeType, int gpibDevice) { + long bytestosend; + int k; + int m; + + if ((strcmp("HP54600OS", scopeType) == 0) || (strcmp("TDS744AOS", scopeType) == 0)) { + printf("[INFO] Getting scope screenshot [Stage 2]\n\r"); + if (strcmp("HP54600OS", scopeType) == 0) { + if (gpib_read_binblock(gpibDevice, 19768, scopeType) == 0) { + return 0; + } + else { + return 1; + } + } + else if (strcmp("TDS744AOS", scopeType) == 0) { + gpib_read_binary(gpibDevice, scopeScreenSize(scopeType)); + + BITMAP *bmp; + PALETTE palette; + int bpp; + install_allegro(SYSTEM_AUTODETECT, &errno, atexit); + bmp = load_bmp("/tmp/current_scope_screenshot.bmp", palette); + if (!bmp) { + printf("[WARN] Unable to load screenshot bitmap\n\r"); + return 1; + } + set_palette(palette); + bpp = bitmap_color_depth(bmp); + #ifdef ENABLE_EXTRA_DEBUGGING + printf("[DEBG] Found BPP of %d\n\r", bpp); + #endif + bytestosend = 0; + for (m=0;m<scopeScreenWidth(scopeType);m++) { + for (k=0;k<scopeScreenHeight(scopeType);k++) { + scope_raw_screenshot_data[bytestosend] = getr_depth(bpp, getpixel(bmp, m, k)); + bytestosend = bytestosend + 1; + scope_raw_screenshot_data[bytestosend] = getg_depth(bpp, getpixel(bmp, m, k)); + bytestosend = bytestosend + 1; + scope_raw_screenshot_data[bytestosend] = getb_depth(bpp, getpixel(bmp, m, k)); + bytestosend = bytestosend + 1; + } + } + destroy_bitmap(bmp); + return 0; + } + } + return 1; +} + + +int scope_get_screenshot(char * scopeType, int gpibDevice) { + if ((strcmp("HP54600OS", scopeType) == 0) || (strcmp("TDS744AOS", scopeType) == 0)) { + printf("[INFO] Getting scope screenshot [Stage 1]\n\r"); + if (strcmp("HP54600OS", scopeType) == 0) { + sprintf(falpha,"PRINT?"); + #ifdef ENABLE_EXTRA_DEBUGGING + printf("[DEBG] Writing: %s\n\r", falpha); + #endif + if (gpib_write(gpibDevice, falpha) == 0) { + return 0; + } + else { + return 2; + } + } + else if (strcmp("TDS744AOS", scopeType) == 0) { + sprintf(falpha,"HARDCOPY:FORMAT BMPCOLOR"); + if (gpib_write(gpibDevice, falpha) == 0) { + #ifdef ENABLE_EXTRA_DEBUGGING + printf("[DEBG] Wrote: %s\n\r", falpha); + #endif + sprintf(falpha,"HARDCOPY:LAYOUT PORTRAIT"); + if (gpib_write(gpibDevice, falpha) == 0) { + #ifdef ENABLE_EXTRA_DEBUGGING + printf("[DEBG] Wrote: %s\n\r", falpha); + #endif + sprintf(falpha,"HARDCOPY:PALETTE HARDCOPY"); + if (gpib_write(gpibDevice, falpha) == 0) { + #ifdef ENABLE_EXTRA_DEBUGGING + printf("[DEBG] Wrote: %s\n\r", falpha); + #endif + sprintf(falpha,"HARDCOPY:PORT GPIB"); + if (gpib_write(gpibDevice, falpha) == 0) { + #ifdef ENABLE_EXTRA_DEBUGGING + printf("[DEBG] Wrote: %s\n\r", falpha); + #endif + sprintf(falpha,"HARDCOPY START"); + if (gpib_write(gpibDevice, falpha) == 0) { + #ifdef ENABLE_EXTRA_DEBUGGING + printf("[DEBG] Wrote: %s\n\r", falpha); + #endif + return 0; + } + } + } + } + } + } + } + return 1; +} + +int scope_set_timebase(float desired_timebase, char * scopeType, int gpibDevice) { + if ((strcmp("HP54600OS", scopeType) == 0) || (strcmp("TDS744AOS", scopeType) == 0)) { + printf("[INFO] Setting scope timebase to %E\n\r", desired_timebase); + if (strcmp("HP54600OS", scopeType) == 0) { + sprintf(falpha,"TIM:RANG %E", desired_timebase); + #ifdef ENABLE_EXTRA_DEBUGGING + printf("[DEBG] Writing: %s\n\r", falpha); + #endif + if (gpib_write(gpibDevice, falpha) == 0) { + return 0; + } + else { + return 2; + } + } + else if (strcmp("TDS744AOS", scopeType) == 0) { + sprintf(falpha,"HORIZONTAL:MAIN:SCALE %E", desired_timebase/10); + #ifdef ENABLE_EXTRA_DEBUGGING + printf("[DEBG] Writing: %s\n\r", falpha); + #endif + if (gpib_write(gpibDevice, falpha) == 0) { + return 0; + } + else { + return 2; + } + } + } + else { + return 1; + } +} + +int scope_set_volts_div(int desired_channel, float desired_volts, char * scopeType, int gpibDevice) { + if ((strcmp("HP54600OS", scopeType) == 0) || (strcmp("TDS744AOS", scopeType) == 0)) { + printf("[INFO] Setting scope volts/div on channel %d to %f\n\r", desired_channel, desired_volts/8); + if (strcmp("HP54600OS", scopeType) == 0) { + sprintf(falpha,"CHAN%d:RANG %E", desired_channel, desired_volts); + #ifdef ENABLE_EXTRA_DEBUGGING + printf("[DEBG] Writing: %s\n\r", falpha); + #endif + if (gpib_write(gpibDevice, falpha) == 0) { + return 0; + } + else { + return 2; + } + } + else if (strcmp("TDS744AOS", scopeType) == 0) { + sprintf(falpha,"CH%d:SCALE %f", desired_channel, desired_volts/8); + #ifdef ENABLE_EXTRA_DEBUGGING + printf("[DEBG] Writing: %s\n\r", falpha); + #endif + if (gpib_write(gpibDevice, falpha) == 0) { + return 0; + } + else { + return 2; + } + } + } + else { + return 1; + } +} + +int scope_set_acquisition(int status, char * scopeType, int gpibDevice) { + if ((strcmp("HP54600OS", scopeType) == 0) || (strcmp("TDS744AOS", scopeType) == 0)) { + printf("[INFO] Setting scope run status to %d\n\r", status); + if (strcmp("HP54600OS", scopeType) == 0) { + if (status == 0) { + sprintf(falpha,"STOP"); + } + else { + sprintf(falpha,"RUN"); + } + #ifdef ENABLE_EXTRA_DEBUGGING + printf("[DEBG] Writing: %s\n\r", falpha); + #endif + if (gpib_write(gpibDevice, falpha) == 0) { + return 0; + } + else { + return 2; + } + } + else if (strcmp("TDS744AOS", scopeType) == 0) { + sprintf(falpha,"ACQUIRE:STATE %d", status); + #ifdef ENABLE_EXTRA_DEBUGGING + printf("[DEBG] Writing: %s\n\r", falpha); + #endif + if (gpib_write(gpibDevice, falpha) == 0) { + return 0; + } + else { + return 2; + } + } + } + else { + return 1; + } +} + +int scope_set_channel_state(int desired_channel, int status, char * scopeType, int gpibDevice) { + if ((strcmp("HP54600OS", scopeType) == 0) || (strcmp("TDS744AOS", scopeType) == 0)) { + printf("[INFO] Setting channel %d state to %i\n\r", desired_channel, status); + if (strcmp("HP54600OS", scopeType) == 0) { + if (status == 0) { + sprintf(falpha,"BLAN CHAN%d", desired_channel); + } + else if (status == 1) { + sprintf(falpha,"VIEW CHAN%d", desired_channel); + } + else { + return 2; + } + #ifdef ENABLE_EXTRA_DEBUGGING + printf("[DEBG] Writing: %s\n\r", falpha); + #endif + if (gpib_write(gpibDevice, falpha) == 0) { + return 0; + } + else { + return 2; + } + } + else if (strcmp("TDS744AOS", scopeType) == 0) { + if (status == 0) { + sprintf(falpha,"SELECT:CH%d OFF", desired_channel); + } + else if (status == 1) { + sprintf(falpha,"SELECT:CH%d ON", desired_channel); + } + else { + return 2; + } + #ifdef ENABLE_EXTRA_DEBUGGING + printf("[DEBG] Writing: %s\n\r", falpha); + #endif + if (gpib_write(gpibDevice, falpha) == 0) { + return 0; + } + else { + return 2; + } + } + } + else { + return 1; + } +} + +int scope_set_trigger_channel(int desired_channel, char * scopeType, int gpibDevice) { + if ((strcmp("HP54600OS", scopeType) == 0) || (strcmp("TDS744AOS", scopeType) == 0)) { + printf("[INFO] Setting scope trigger channel to %d\n\r", desired_channel); + if (strcmp("HP54600OS", scopeType) == 0) { + sprintf(falpha,"TRIG:SOUR CHAN%d", desired_channel); + #ifdef ENABLE_EXTRA_DEBUGGING + printf("[DEBG] Writing: %s\n\r", falpha); + #endif + if (gpib_write(gpibDevice, falpha) == 0) { + return 0; + } + else { + return 2; + } + } + else if (strcmp("TDS744AOS", scopeType) == 0) { + sprintf(falpha,"TRIGGER:MAIN:EDGE:SOURCE CH%d", desired_channel); + #ifdef ENABLE_EXTRA_DEBUGGING + printf("[DEBG] Writing: %s\n\r", falpha); + #endif + if (gpib_write(gpibDevice, falpha) == 0) { + return 0; + } + else { + return 2; + } + } + } + else { + return 1; + } +} + +int scope_set_trigger_level(float desired_level, char * scopeType, int gpibDevice) { + if ((strcmp("HP54600OS", scopeType) == 0) || (strcmp("TDS744AOS", scopeType) == 0)) { + printf("[INFO] Setting scope trigger level to %f\n\r", desired_level); + if (strcmp("HP54600OS", scopeType) == 0) { + sprintf(falpha,"TRIG:LEV %E", desired_level); + #ifdef ENABLE_EXTRA_DEBUGGING + printf("[DEBG] Writing: %s\n\r", falpha); + #endif + if (gpib_write(gpibDevice, falpha) == 0) { + return 0; + } + else { + return 2; + } + } + else if (strcmp("TDS744AOS", scopeType) == 0) { + sprintf(falpha,"TRIGGER:MAIN:LEVEL %f", desired_level); + #ifdef ENABLE_EXTRA_DEBUGGING + printf("[DEBG] Writing: %s\n\r", falpha); + #endif + if (gpib_write(gpibDevice, falpha) == 0) { + return 0; + } + else { + return 2; + } + } + } + else { + return 1; + } +} + +int scope_set_channel_position(int desired_channel, float desired_level, char * scopeType, int gpibDevice) { + if ((strcmp("HP54600OS", scopeType) == 0) || (strcmp("TDS744AOS", scopeType) == 0)) { + printf("[INFO] Setting scope channel %d level to %f\n\r", desired_channel, desired_level); + if (strcmp("HP54600OS", scopeType) == 0) { + sprintf(falpha,"CHAN%d:OFFS %E", desired_channel, desired_level); + #ifdef ENABLE_EXTRA_DEBUGGING + printf("[DEBG] Writing: %s\n\r", falpha); + #endif + if (gpib_write(gpibDevice, falpha) == 0) { + return 0; + } + else { + return 2; + } + } + else if (strcmp("TDS744AOS", scopeType) == 0) { + sprintf(falpha,"CH%d:POSITION %f", desired_channel, desired_level); + #ifdef ENABLE_EXTRA_DEBUGGING + printf("[DEBG] Writing: %s\n\r", falpha); + #endif + if (gpib_write(gpibDevice, falpha) == 0) { + return 0; + } + else { + return 2; + } + } + } + else { + return 1; + } +} |