/* * rigmatrix.c - Copyright (C) 2000-2012 Stephane Fillod * This program generates the supported rig matrix in HTML format. * The code is rather ugly since this is only a try out. * * * 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 2 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. * */ #include #include #include #include #include #include #include #include #include "misc.h" static setting_t bitmap_func, bitmap_level, bitmap_parm, bitmap_vfo_ops; int create_png_range(const freq_range_t rx_range_list[], const freq_range_t tx_range_list[], int num); int print_caps_sum(struct rig_caps *caps, void *data) { printf("%s%s" "%s%s", caps->rig_model, caps->model_name, caps->mfg_name, caps->version, rig_strstatus(caps->status)); switch (caps->rig_type & RIG_TYPE_MASK) { case RIG_TYPE_TRANSCEIVER: printf("Transceiver"); break; case RIG_TYPE_HANDHELD: printf("Handheld"); break; case RIG_TYPE_MOBILE: printf("Mobile"); break; case RIG_TYPE_RECEIVER: printf("Receiver"); break; case RIG_TYPE_PCRECEIVER: printf("PC Receiver"); break; case RIG_TYPE_SCANNER: printf("Scanner"); break; case RIG_TYPE_TRUNKSCANNER: printf("Trunking scanner"); break; case RIG_TYPE_COMPUTER: printf("Computer"); break; case RIG_TYPE_OTHER: printf("Other"); break; default: printf("Unknown"); } printf("range" "parms" "caps" "funcs" "funcs" "levels" "levels" "parms" "parms" "ops" "\n", caps->rig_model, caps->rig_model, caps->rig_model, caps->rig_model, caps->rig_model, caps->rig_model, caps->rig_model, caps->rig_model, caps->rig_model, caps->rig_model); return 1; /* !=0, we want them all ! */ } /* * IO params et al. */ int print_caps_parameters(struct rig_caps *caps, void *data) { printf("%s", caps->rig_model, caps->model_name); switch (caps->ptt_type) { case RIG_PTT_RIG: printf("rig"); break; case RIG_PTT_PARALLEL: printf("parallel"); break; case RIG_PTT_SERIAL_RTS: case RIG_PTT_SERIAL_DTR: printf("serial"); break; case RIG_PTT_NONE: printf("None"); break; default: printf("Unknown"); } printf(""); switch (caps->dcd_type) { case RIG_DCD_RIG: printf("rig"); break; case RIG_DCD_PARALLEL: printf("parallel"); break; case RIG_DCD_SERIAL_CTS: case RIG_DCD_SERIAL_DSR: printf("serial"); break; case RIG_DCD_NONE: printf("None"); break; default: printf("Unknown"); } printf(""); switch (caps->port_type) { case RIG_PORT_SERIAL: printf("serial"); break; case RIG_PORT_DEVICE: printf("device"); break; case RIG_PORT_NETWORK: printf("network"); break; case RIG_PORT_UDP_NETWORK: printf("UDP network"); break; case RIG_PORT_NONE: printf("None"); break; default: printf("Unknown"); } printf("%d%d%d%c%d%s", caps->serial_rate_min, caps->serial_rate_max, caps->serial_data_bits, caps->serial_parity == RIG_PARITY_NONE ? 'N' : caps->serial_parity == RIG_PARITY_ODD ? 'O' : caps->serial_parity == RIG_PARITY_EVEN ? 'E' : caps->serial_parity == RIG_PARITY_MARK ? 'M' : 'S', caps->serial_stop_bits, caps->serial_handshake == RIG_HANDSHAKE_NONE ? "none" : (caps->serial_handshake == RIG_HANDSHAKE_XONXOFF ? "XONXOFF" : "CTS/RTS")); printf("%dms%dms%dms%d\n", caps->write_delay, caps->post_write_delay, caps->timeout, caps->retry); return 1; } /* used by print_caps_caps and print_caps_level */ #define print_yn(fn) printf("%s", (fn) ? "Y":"N") /* * backend functions defined * * TODO: add new API calls! */ int print_caps_caps(struct rig_caps *caps, void *data) { printf("%s", caps->rig_model, caps->model_name); /* targetable_vfo is not a function, but a boolean */ print_yn(caps->targetable_vfo); print_yn(caps->set_freq); print_yn(caps->get_freq); print_yn(caps->set_mode); print_yn(caps->get_mode); print_yn(caps->set_vfo); print_yn(caps->get_vfo); print_yn(caps->set_ptt); print_yn(caps->get_ptt); print_yn(caps->get_dcd); print_yn(caps->set_rptr_shift); print_yn(caps->get_rptr_shift); print_yn(caps->set_rptr_offs); print_yn(caps->get_rptr_offs); print_yn(caps->set_split_freq); print_yn(caps->get_split_freq); print_yn(caps->set_split_vfo); print_yn(caps->get_split_vfo); print_yn(caps->set_ts); print_yn(caps->get_ts); print_yn(caps->set_ctcss_tone); print_yn(caps->get_ctcss_tone); print_yn(caps->set_dcs_code); print_yn(caps->get_dcs_code); print_yn(caps->set_powerstat); print_yn(caps->get_powerstat); print_yn(caps->set_trn); print_yn(caps->set_trn); print_yn(caps->decode_event); print_yn(caps->get_info); printf("\n"); return 1; } /* * Get/Set parm abilities */ int print_caps_parm(struct rig_caps *caps, void *data) { setting_t parm; int i; if (!data) { return 0; } parm = (*(int *)data) ? caps->has_set_parm : caps->has_get_parm; printf("%s", (*(int *)data) ? "set" : "get", caps->rig_model, caps->model_name); /* * bitmap_parm: only those who have a label */ for (i = 0; i < RIG_SETTING_MAX; i++) { if (rig_idx2setting(i) & bitmap_parm) { print_yn(parm & rig_idx2setting(i)); } } printf("\n"); return 1; } /* * VFO Ops capabilities */ int print_caps_vfo_ops(struct rig_caps *caps, void *data) { setting_t vfo_ops; int i; if (!data) { return 0; } // Only set for these vfo_ops = (*(int *)data) ? caps->vfo_ops : caps->vfo_ops; printf("%s", (*(int *)data) ? "op" : "op", caps->rig_model, caps->model_name); /* * bitmap_vfo_ops: only those who have a label */ for (i = 0; i < RIG_SETTING_MAX; i++) { if (rig_idx2setting(i) & bitmap_vfo_ops) { print_yn(vfo_ops & rig_idx2setting(i)); } } printf("\n"); return 1; } /* * Get/Set level abilities */ int print_caps_level(struct rig_caps *caps, void *data) { setting_t level; int i; if (!data) { return 0; } level = (*(int *)data) ? caps->has_set_level : caps->has_get_level; printf("%s", (*(int *)data) ? "set" : "get", caps->rig_model, caps->model_name); /* * bitmap_level: only those who have a label */ for (i = 0; i < 32; i++) { if (rig_idx2setting(i) & bitmap_level) { print_yn(level & rig_idx2setting(i)); } } printf("\n"); return 1; } /* * Get/Set func abilities */ int print_caps_func(struct rig_caps *caps, void *data) { setting_t func; int i; if (!data) { return 0; } func = (*(int *)data) ? caps->has_set_func : caps->has_get_func; printf("%s", (*(int *)data) ? "set" : "get", caps->rig_model, caps->model_name); /* * bitmap_func: only those who have a label */ for (i = 0; i < RIG_SETTING_MAX; i++) { if (rig_idx2setting(i) & bitmap_func) { print_yn(func & rig_idx2setting(i)); } } printf("\n"); return 1; } /* * inlined PNG graphics * * FIXME: default output pics is for region2: add region 1 too! */ int print_caps_range(struct rig_caps *caps, void *data) { create_png_range(caps->rx_range_list2, caps->tx_range_list2, caps->rig_model); printf("%s" "", caps->rig_model, caps->model_name, caps->rig_model); return 1; } #define RANGE_WIDTH 600 #define RANGE_HEIGHT 16 #define RANGE_MIDHEIGHT (RANGE_HEIGHT/2) #define RX_R 0 #define RX_G 255 #define RX_B 255 #define TX_R 0 #define TX_G 0 #define TX_B 255 #define HF_H 10 #define VHF_H 30 #define UHF_H 50 #define IM_LGD 21 static void draw_range(const freq_range_t range_list[], gdImagePtr im_rng, int h1, int h2, int rgb) { int i; for (i = 0; i < HAMLIB_FRQRANGESIZ; i++) { float start_pix, end_pix; if (range_list[i].startf == 0 && range_list[i].endf == 0) { break; } start_pix = range_list[i].startf; end_pix = range_list[i].endf; /* * HF */ if (range_list[i].startf < MHz(30)) { start_pix = start_pix / MHz(30) * RANGE_WIDTH; end_pix = end_pix / MHz(30) * RANGE_WIDTH; if (end_pix >= RANGE_WIDTH) { end_pix = RANGE_WIDTH - 1; } start_pix += IM_LGD; end_pix += IM_LGD; gdImageFilledRectangle(im_rng, start_pix, HF_H + h1, end_pix, HF_H + h2, rgb); } /* * VHF */ start_pix = range_list[i].startf; end_pix = range_list[i].endf; if ((range_list[i].startf > MHz(30) && range_list[i].startf < MHz(300)) || (range_list[i].startf < MHz(30) && range_list[i].endf > MHz(30))) { start_pix = (start_pix - MHz(30)) / MHz(300) * RANGE_WIDTH; end_pix = (end_pix - MHz(30)) / MHz(300) * RANGE_WIDTH; if (start_pix < 0) { start_pix = 0; } if (end_pix >= RANGE_WIDTH) { end_pix = RANGE_WIDTH - 1; } start_pix += IM_LGD; end_pix += IM_LGD; gdImageFilledRectangle(im_rng, start_pix, VHF_H + h1, end_pix, VHF_H + h2, rgb); } /* * UHF */ start_pix = range_list[i].startf; end_pix = range_list[i].endf; if ((range_list[i].startf > MHz(300) && range_list[i].startf < GHz(3)) || (range_list[i].startf < MHz(300) && range_list[i].endf > MHz(300))) { start_pix = (start_pix - MHz(300)) / GHz(3) * RANGE_WIDTH; end_pix = (end_pix - MHz(300)) / GHz(3) * RANGE_WIDTH; if (start_pix < 0) { start_pix = 0; } if (end_pix >= RANGE_WIDTH) { end_pix = RANGE_WIDTH - 1; } start_pix += IM_LGD; end_pix += IM_LGD; gdImageFilledRectangle(im_rng, start_pix, UHF_H + h1, end_pix, UHF_H + h2, rgb); } } } int create_png_range(const freq_range_t rx_range_list[], const freq_range_t tx_range_list[], int num) { FILE *out; /* Input and output images */ gdImagePtr im_rng; char rng_fname[128]; /* Color indexes */ #if 0 int white; #endif int black; int rx_rgb, tx_rgb; /* Create output image, x by y pixels. */ im_rng = gdImageCreate(RANGE_WIDTH + IM_LGD, UHF_H + RANGE_HEIGHT); /* First color allocated is background. */ // white = gdImageColorAllocate(im_rng, 255, 255, 255); gdImageColorAllocate(im_rng, 255, 255, 255); black = gdImageColorAllocate(im_rng, 0, 0, 0); #if 0 /* Set transparent color. */ gdImageColorTransparent(im_rng, white); #endif /* Try to load demoin.png and paste part of it into the output image. */ tx_rgb = gdImageColorAllocate(im_rng, TX_R, TX_G, TX_B); rx_rgb = gdImageColorAllocate(im_rng, RX_R, RX_G, RX_B); draw_range(rx_range_list, im_rng, 0, RANGE_MIDHEIGHT - 1, rx_rgb); draw_range(tx_range_list, im_rng, RANGE_MIDHEIGHT, RANGE_HEIGHT - 1, tx_rgb); gdImageRectangle(im_rng, IM_LGD, HF_H, IM_LGD + RANGE_WIDTH - 1, HF_H + RANGE_HEIGHT - 1, black); gdImageRectangle(im_rng, IM_LGD, VHF_H, IM_LGD + RANGE_WIDTH - 1, VHF_H + RANGE_HEIGHT - 1, black); gdImageRectangle(im_rng, IM_LGD, UHF_H, IM_LGD + RANGE_WIDTH - 1, UHF_H + RANGE_HEIGHT - 1, black); /* gdImageStringUp */ gdImageString(im_rng, gdFontSmall, 1, HF_H + 1, (unsigned char *) "HF", black); gdImageString(im_rng, gdFontSmall, 1, VHF_H + 1, (unsigned char *) "VHF", black); gdImageString(im_rng, gdFontSmall, 1, UHF_H + 1, (unsigned char *) "UHF", black); /* Make output image interlaced (allows "fade in" in some viewers, and in the latest web browsers) */ gdImageInterlace(im_rng, 1); snprintf(rng_fname, sizeof(rng_fname), "range%d.png", num); out = fopen(rng_fname, "wb"); /* Write PNG */ gdImagePng(im_rng, out); fclose(out); gdImageDestroy(im_rng); return 0; } int main(int argc, char *argv[]) { time_t gentime; int set_or_get; int i, nbytes, nbytes_total = 0; char *pbuf, prntbuf[4096]; rig_load_all_backends(); printf(""); printf("" "" "" "" "" "" "" "" "" "" "\n"); rig_list_foreach(print_caps_sum, NULL); printf("
ModelMfgVers.StatusTypeFreq. rangeParametersCapabilitiesGet funcSet funcGet levelSet levelGet parmSet parmVFO Ops
\n"); printf("

"); printf("\n"); printf("" "" "" "\n"); rig_list_foreach(print_caps_parameters, NULL); printf("
ModelPTTDCDPortSpeed minSpeed maxParm.HandshakeWrite delayPost delayTimeoutRetry
\n"); printf("

"); printf("\n"); printf("\n"); rig_list_foreach(print_caps_range, NULL); printf("
ModelFreq. range
\n"); printf("

"); printf("\n"); printf("" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "\n"); rig_list_foreach(print_caps_caps, NULL); printf("
ModelTarget VFOSet freqGet freqSet modeGet modeSet VFOGet VFOSet PTTGet PTTGet DCDSet rptr shiftGet rptr shiftSet rptr offsGet rptr offsSet split frqGet split frqSet splitGet splitSet tsGet tsSet CTCSSGet CTCSSSet DCSGet DCSSet Power StatGet Power StatSet trnGet trnDecodeGet info
\n"); printf("

"); bitmap_func = 0; prntbuf[0] = '\0'; pbuf = prntbuf; for (i = 0; i < RIG_SETTING_MAX; i++) { setting_t func = rig_idx2setting(i); const char *s = rig_strfunc(func); if (!s) { continue; } bitmap_func |= func; nbytes = strlen("") + strlen(s) + 1; nbytes_total += nbytes; pbuf += snprintf(pbuf, sizeof(pbuf) - nbytes_total, "%s", s); if (strlen(pbuf) > sizeof(pbuf) + nbytes) { printf("Buffer overflow in %s\n", __func__); } } printf("Has set func"); printf("\n"); printf("%s\n", prntbuf); set_or_get = 1; rig_list_foreach(print_caps_func, &set_or_get); printf("
Model
\n"); printf("

"); printf("Has get func"); printf("\n"); printf("%s\n", prntbuf); set_or_get = 0; rig_list_foreach(print_caps_func, &set_or_get); printf("
Model
\n"); printf("

"); bitmap_level = 0; prntbuf[0] = '\0'; pbuf = prntbuf; for (i = 0; i < RIG_SETTING_MAX; i++) { setting_t level = rig_idx2setting(i); const char *s = rig_strlevel(level); if (!s) { continue; } bitmap_level |= level; nbytes = strlen("") + strlen(s) + 1; nbytes_total += nbytes; pbuf += snprintf(pbuf, sizeof(pbuf) - nbytes_total, "%s", s); if (strlen(pbuf) > sizeof(pbuf) + nbytes) { printf("Buffer overflow in %s\n", __func__); } } printf("Set level"); printf("\n"); printf("%s\n", prntbuf); set_or_get = 1; rig_list_foreach(print_caps_level, &set_or_get); printf("
Model
\n"); printf("

"); printf("Get level"); printf("\n"); printf("%s\n", prntbuf); set_or_get = 0; rig_list_foreach(print_caps_level, &set_or_get); printf("
Model
\n"); printf("

"); bitmap_parm = 0; prntbuf[0] = '\0'; pbuf = prntbuf; for (i = 0; i < RIG_SETTING_MAX; i++) { setting_t parm = rig_idx2setting(i); const char *s = rig_strparm(parm); if (!s) { continue; } bitmap_parm |= parm; nbytes = strlen("") + strlen(s) + 1; nbytes_total += nbytes; pbuf += snprintf(pbuf, sizeof(pbuf) - nbytes_total, "%s", s); if (strlen(pbuf) > sizeof(pbuf) + nbytes) { printf("Buffer overflow in %s\n", __func__); } } printf("Set parm"); printf("\n"); printf("%s\n", prntbuf); set_or_get = 1; rig_list_foreach(print_caps_parm, &set_or_get); printf("
Model
\n"); printf("

"); printf("Get parm"); printf("\n"); printf("%s\n", prntbuf); set_or_get = 0; rig_list_foreach(print_caps_parm, &set_or_get); printf("
Model
\n"); printf("

"); bitmap_vfo_ops = 0; prntbuf[0] = '\0'; pbuf = prntbuf; for (i = 0; i < RIG_SETTING_MAX; i++) { setting_t op = rig_idx2setting(i); const char *s = rig_strvfop(op); if (!s) { continue; } bitmap_vfo_ops |= op; nbytes = strlen("") + strlen(s) + 1; nbytes_total += nbytes; pbuf += snprintf(pbuf, sizeof(pbuf) - nbytes_total, "%s", s); if (strlen(pbuf) > sizeof(pbuf) + nbytes) { printf("Buffer overflow in %s\n", __func__); } } printf("VFO Ops"); printf("\n"); printf("%s\n", prntbuf); set_or_get = 0; rig_list_foreach(print_caps_vfo_ops, &set_or_get); printf("
Model
\n"); printf("

"); time(&gentime); printf("Rigmatrix generated %s\n", ctime(&gentime)); printf("\n"); return 0; }