⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tkstripchart.c

📁 rtpmon-1.0a7.tar.gz for UNIX like
💻 C
📖 第 1 页 / 共 3 页
字号:
/* * tkStripchart.c -- * *      This module implements "Stripchart" widgets for the Tk *      toolkit. * * Copyright 1992 Regents of the University of Victoria, Wellington, NZ. * This code is derived from the tkScale widget. * Copyright 1990 Regents of the University of California. * Permission to use, copy, modify, and distribute this * software and its documentation for any purpose and without * fee is hereby granted, provided that the above copyright * notice appear in all copies.  The University of California * makes no representations about the suitability of this * software for any purpose.  It is provided "as is" without * express or implied warranty. * *  BUGS: *   sometimes the callback procedure doesn't work (????) *    (it can often be made to work by setting a (different) value and *     restarting the callback procedure.) * *  CHANGES: *   would be nicer having tick interval instead of numticks. * */#include <stdio.h>#include <string.h>#include <math.h>#include "tk.h"#if TK_MINOR_VERSION<1#define Tk_Cursor Cursor#endif#define BLACK		"Black"#define WHITE		"White"#define GRAY		"#b0b0b0"#define BISQUE1		"#ffe4c4"#define MAROON		"#b03060"#ifndef TRUE#define TRUE 1#endif#ifndef FALSE#define FALSE 0#endif/* *  Default stripchart configuration values */#define DEF_STRIPCHART_BG_COLOR            BISQUE1#define DEF_STRIPCHART_STRIP_COLOR         BLACK#define DEF_STRIPCHART_TEXT_COLOR          BLACK#define DEF_STRIPCHART_TICK_COLOR          GRAY#define DEF_STRIPCHART_CURSOR              0#define ALT_STRIPCHART_BG_COLOR            MAROON#define ALT_STRIPCHART_STRIP_COLOR         WHITE#define ALT_STRIPCHART_TEXT_COLOR          WHITE#define ALT_STRIPCHART_TICK_COLOR          GRAY/* * for monochrome displays */#define DEF_STRIPCHART_BG_MONO             WHITE#define DEF_STRIPCHART_STRIP_MONO          BLACK#define DEF_STRIPCHART_TEXT_MONO           BLACK#define DEF_STRIPCHART_TICK_MONO           BLACK#define ALT_STRIPCHART_BG_MONO             BLACK#define ALT_STRIPCHART_STRIP_MONO          WHITE#define ALT_STRIPCHART_TEXT_MONO           WHITE#define ALT_STRIPCHART_TICK_MONO           WHITE#define DEF_STRIPCHART_NUMSTRIPS           "40"#define DEF_STRIPCHART_NUMTICKS            "11"#define DEF_STRIPCHART_BORDER_WIDTH        "3"#define DEF_STRIPCHART_FONT                "*-Helvetica-Bold-R-Normal-*-120-*"#define DEF_STRIPCHART_MINVALUE            "0"#define DEF_STRIPCHART_MAXVALUE            "1000"#define DEF_STRIPCHART_CALLBACK_INTERVAL   "500"#define DEF_STRIPCHART_TITLE               0#define DEF_STRIPCHART_HEIGHT              "80"#define DEF_STRIPCHART_RELIEF              "flat"#define DEF_STRIPCHART_TICK_INTERVAL       "50"#define DEF_STRIPCHART_WIDTH               "1"#define DEF_STRIPCHART_STRIPBORDERWIDTH    "0"#define DEF_STRIPCHART_STRIPRELIEF         "flat"#define DEF_STRIPCHART_SHOWTICKS           "true"#define DEF_STRIPCHART_AUTOSCALE           "0"#define DEF_STRIPCHART_HTICKS              "0"#define DEF_USERBITS                       "0"#define DEF_USERDATA                       0#define DEF_GUARANTEE_DRAW                 "false"#define  MAX_STRIPS              100#define  MAX_TICKS               40#define  PADDING                 2#define  hasatitle(d)            (((d)->title != NULL) && \                                  ((d)->title[0] != '\0'))#ifndef abs#define  abs(x)                  ( (x) < 0 ? -(x) : (x) )#endif/* * A data structure of the following type is kept for each * Stripchart that currently exists for this process: */typedef struct strip_struct Stripchart;struct strip_struct {	Tk_Window tkwin;	/* Window that embodies the Stripchart.  NULL				 * means that the window has been destroyed				 * but the data structures haven't yet been				 * cleaned up.*/	Tcl_Interp *interp;	/* Interpreter associated with widget.  Used				 * to delete widget command.  */	Tk_Uid screenName;	/* If this window isn't a toplevel window				 * then this is NULL;  otherwise it gives the				 * name of the screen on which window is				 * displayed. */	Tk_3DBorder border;	/* Structure used to draw 3-D border and				 * background. */	int borderWidth;	/* Width of 3-D border (if any). */	int relief;		/* 3-d effect: TK_RELIEF_RAISED etc. */	Tk_Cursor cursor;	/* Current cursor for window, or None. */	Tk_3DBorder stripBorder;/* Structure used to draw the strips */	int stripBorderWidth;	int stripRelief;	int strip_width;	/* width of a strip */	int max_height;		/* maximum height of a strip */	int num_strips;		/* the number of strips */	int stripstodisplay;	/* how many of the num_strips should be				 * displayed. */	int num_ticks;		/* the number of ticks to display */	double *value;		/* the data to be displayed in strip form. */	double min_value;	double max_value;	double data_min;	double data_max;	int scrollrequired;	int guarantee_draw;	int grow_up;	XFontStruct *fontPtr;	/* Information about text font, or NULL. */	XColor *textColorPtr;	/* Color for drawing text. */	GC textGC;		/* GC for drawing text. */	XColor *tickColorPtr;	/* Color for drawing ticks. */	GC tickGC;		/* GC for drawing ticks. */	int showticks;	int autoscale;	int hticks;	int lasthtick;	/*	 * call back stuff	 */	Tk_TimerToken timer;	/* tk timer used by callback */	char *command;		/* Command used for callback. Malloc'ed. */	char *rescale_command;	/* Command invoked on autorescale. Malloc'ed. */	int continue_callback;	/* boolean flag used to terminate the				 * callback */	unsigned long interval;	/* interval (mS) between callbacks */	double (*callback_func)(Tcl_Interp* interp, Stripchart* stripPtr);			        /* Function to be invoked on callback. */	char *title;		/* Label to display above of stripchart; NULL				 * means don't display a title.  Malloc'ed. */	int displaybits;	/* Various flags;  see below for definitions. */	int userbits;	char *userdata;	/*	 * Alternative colour scheme	 */	Tk_3DBorder altborder;	/* Structure used to draw border  */	Tk_3DBorder altstripBorder;/* structure used to draw strip  */	XColor *a_textColor;	/* alternative text color         */	XColor *a_tickColor;	/* alternative tick color         */};/* * displaybits for Stripcharts: * * REDRAW_PENDING:              Non-zero means a DoWhenIdle handler *                              has already been queued to redraw *                              this window. * CLEAR_NEEDED:                Need to clear the window when redrawing. * DISPLAY_TITLE:               Draw the title, if there is one. * DISPLAY_STRIPS:              Draw the strips. * DISPLAY_BORDER:              Draw the border. * DISPLAY_TICKS:               Draw the ticks. * DISPLAY_ALL:                 Display everything. */#define   REDRAW_PENDING		1#define   CLEAR_NEEDED	        	2#define   DISPLAY_TITLE                 4#define   DISPLAY_STRIPS                8#define   DISPLAY_BORDER               16#define   DISPLAY_TICKS                32#define   DISPLAY_ALL                  (DISPLAY_TITLE | DISPLAY_STRIPS | \					DISPLAY_BORDER | DISPLAY_TICKS)static Tk_ConfigSpec configSpecs[] ={	{TK_CONFIG_BORDER, "-altbackground", "altbackground", "Background",	 ALT_STRIPCHART_BG_COLOR, Tk_Offset(Stripchart, altborder),	 TK_CONFIG_COLOR_ONLY},	{TK_CONFIG_BORDER, "-altbackground", "altbackground", "Background",	 ALT_STRIPCHART_BG_MONO, Tk_Offset(Stripchart, altborder),	 TK_CONFIG_MONO_ONLY},	{TK_CONFIG_BORDER, "-altstripcolor", "altstripcolor",	 "Foreground", ALT_STRIPCHART_STRIP_COLOR,	 Tk_Offset(Stripchart, altstripBorder), TK_CONFIG_COLOR_ONLY},	{TK_CONFIG_BORDER, "-altstripcolor", "altstripcolor",	 "Foreground", ALT_STRIPCHART_STRIP_MONO,	 Tk_Offset(Stripchart, altstripBorder), TK_CONFIG_MONO_ONLY},	{TK_CONFIG_COLOR, "-alttextcolor", "textcolor", "Foreground",	 ALT_STRIPCHART_TEXT_COLOR, Tk_Offset(Stripchart, a_textColor),	 TK_CONFIG_COLOR_ONLY},	{TK_CONFIG_COLOR, "-alttextcolor", "textcolor", "Foreground",	 ALT_STRIPCHART_TEXT_MONO, Tk_Offset(Stripchart, a_textColor),	 TK_CONFIG_MONO_ONLY},	{TK_CONFIG_COLOR, "-alttickcolor", "tickcolor", "Foreground",	 ALT_STRIPCHART_TICK_COLOR, Tk_Offset(Stripchart, a_tickColor),	 TK_CONFIG_COLOR_ONLY},	{TK_CONFIG_COLOR, "-alttickcolor", "tickcolor", "Foreground",	 ALT_STRIPCHART_TICK_MONO, Tk_Offset(Stripchart, a_tickColor),	 TK_CONFIG_MONO_ONLY},	{TK_CONFIG_BORDER, "-background", "background", "Background",	 DEF_STRIPCHART_BG_COLOR, Tk_Offset(Stripchart, border),	 TK_CONFIG_COLOR_ONLY},	{TK_CONFIG_BORDER, "-background", "background", "Background",	 DEF_STRIPCHART_BG_MONO, Tk_Offset(Stripchart, border),	 TK_CONFIG_MONO_ONLY},	{TK_CONFIG_SYNONYM, "-bd", "borderWidth", 0, 0, 0, 0},	{TK_CONFIG_SYNONYM, "-bg", "background", 0, 0, 0, 0},	{TK_CONFIG_INT, "-borderwidth", "borderWidth", "BorderWidth",	 DEF_STRIPCHART_BORDER_WIDTH, Tk_Offset(Stripchart, borderWidth), 0},	{TK_CONFIG_STRING, "-command", "command", "Command",	 0, Tk_Offset(Stripchart, command), 0},	{TK_CONFIG_STRING, "-rescale_command", "rescale_command", "RescaleCommand",	 0, Tk_Offset(Stripchart, rescale_command), 0},	{TK_CONFIG_ACTIVE_CURSOR, "-cursor", "cursor", "Cursor",	 DEF_STRIPCHART_CURSOR, Tk_Offset(Stripchart, cursor),	 TK_CONFIG_NULL_OK},	{TK_CONFIG_STRING, "-data", "data", "Data",	 DEF_USERDATA, Tk_Offset(Stripchart, userdata), 0},	{TK_CONFIG_SYNONYM, "-fg", "stripcolor", 0,	 0, 0, 0},	{TK_CONFIG_FONT, "-font", "font", "Font",	 DEF_STRIPCHART_FONT, Tk_Offset(Stripchart, fontPtr),	 0},	{TK_CONFIG_BOOLEAN, "-guaranteedrawing", "guaranteedrawing",	 "Guaranteedrawing", DEF_GUARANTEE_DRAW,	 Tk_Offset(Stripchart, guarantee_draw), 0},	{TK_CONFIG_INT, "-height", "height", "Height", DEF_STRIPCHART_HEIGHT,	 Tk_Offset(Stripchart, max_height), 0},	{TK_CONFIG_INT, "-interval", "interval", "Interval",      DEF_STRIPCHART_CALLBACK_INTERVAL, Tk_Offset(Stripchart, interval), 0},	{TK_CONFIG_DOUBLE, "-max", "max", "Max",	 DEF_STRIPCHART_MAXVALUE, Tk_Offset(Stripchart, max_value), 0},	{TK_CONFIG_DOUBLE, "-min", "min", "Min",	 DEF_STRIPCHART_MINVALUE, Tk_Offset(Stripchart, min_value), 0},	{TK_CONFIG_INT, "-numstrips", "numstrips", "Numstrips",	 DEF_STRIPCHART_NUMSTRIPS, Tk_Offset(Stripchart, num_strips), 0},	{TK_CONFIG_INT, "-numticks", "numticks", "Numticks",	 DEF_STRIPCHART_NUMTICKS, Tk_Offset(Stripchart, num_ticks), 0},	{TK_CONFIG_RELIEF, "-relief", "relief", "Relief",	 DEF_STRIPCHART_RELIEF, Tk_Offset(Stripchart, relief), 0},	{TK_CONFIG_BOOLEAN, "-showticks", "showticks", "Showticks",	 DEF_STRIPCHART_SHOWTICKS, Tk_Offset(Stripchart, showticks), 0},	{TK_CONFIG_INT, "-autoscale", "autoscale", "Autoscale",	 DEF_STRIPCHART_AUTOSCALE, Tk_Offset(Stripchart, autoscale), 0},	{TK_CONFIG_INT, "-hticks", "hticks", "Hticks",	 DEF_STRIPCHART_HTICKS, Tk_Offset(Stripchart, hticks), 0},	{TK_CONFIG_INT, "-stripborderwidth", "stripborderwidth",	 "Stripborderwidth", DEF_STRIPCHART_STRIPBORDERWIDTH,	 Tk_Offset(Stripchart, stripBorderWidth), 0},	{TK_CONFIG_BORDER, "-stripcolor", "stripcolor", "Stripcolor",	 DEF_STRIPCHART_STRIP_COLOR, Tk_Offset(Stripchart, stripBorder),	 TK_CONFIG_COLOR_ONLY},	{TK_CONFIG_BORDER, "-stripcolor", "stripcolor", "Stripcolor",	 DEF_STRIPCHART_STRIP_MONO, Tk_Offset(Stripchart, stripBorder),	 TK_CONFIG_MONO_ONLY},	{TK_CONFIG_RELIEF, "-striprelief", "striprelief", "Striprelief",	 DEF_STRIPCHART_STRIPRELIEF, Tk_Offset(Stripchart, stripRelief), 0},	{TK_CONFIG_INT, "-stripwidth", "stripwidth", "Stripwidth",	 DEF_STRIPCHART_WIDTH, Tk_Offset(Stripchart, strip_width), 0},	{TK_CONFIG_COLOR, "-textcolor", "textcolor", "Textcolor",	 DEF_STRIPCHART_TEXT_COLOR, Tk_Offset(Stripchart, textColorPtr),	 TK_CONFIG_COLOR_ONLY},	{TK_CONFIG_COLOR, "-textcolor", "textcolor", "Textcolor",	 DEF_STRIPCHART_TEXT_MONO, Tk_Offset(Stripchart, textColorPtr),	 TK_CONFIG_MONO_ONLY},	{TK_CONFIG_COLOR, "-tickcolor", "tickcolor", "Tickcolor",	 DEF_STRIPCHART_TICK_COLOR, Tk_Offset(Stripchart, tickColorPtr),	 TK_CONFIG_COLOR_ONLY},	{TK_CONFIG_COLOR, "-tickcolor", "tickcolor", "Tickcolor",	 DEF_STRIPCHART_TICK_MONO, Tk_Offset(Stripchart, tickColorPtr),	 TK_CONFIG_MONO_ONLY},	{TK_CONFIG_STRING, "-title", "title", "Title",	 DEF_STRIPCHART_TITLE, Tk_Offset(Stripchart, title), 0},	{TK_CONFIG_BOOLEAN, "-up", "up", "Up", "true",	 Tk_Offset(Stripchart, grow_up), 0},	{TK_CONFIG_INT, "-userbits", "userbits", "Userbits",	 DEF_USERBITS, Tk_Offset(Stripchart, userbits), 0},	{TK_CONFIG_INT, "-width", "width", "Width", DEF_STRIPCHART_WIDTH,	 Tk_Offset(Stripchart, strip_width), 0},	{TK_CONFIG_END, 0, 0, 0,	 0, 0, 0}};/* * Forward declarations for procedures defined later in this file: */static void Callback(Stripchart* StripchartPtr);static void ComputeStripchartGeometry(Stripchart* StripchartPtr);static int ConfigureStripchart(Tcl_Interp* interp, Stripchart* StripchartPtr,				int argc, char** argv, int flags);static void DestroyStripchart(ClientData clientData);static void DisplayStripchart(ClientData clientData);static void DrawStripi(Stripchart* StripchartPtr, int i);static void EventuallyRedrawStripchart(Stripchart* StripchartPtr,				       int displaybits);static void ReplaceColours(Stripchart* StripchartPtr, int argc, char** argv);static void ScrollStrips(Stripchart* StripchartPtr);static void StripchartEventProc(ClientData clientData, XEvent* eventPtr);static int StripchartWidgetCmd(ClientData clientData, Tcl_Interp* interp,				int argc, char** argv);static void SetStripchartValue(Stripchart* StripchartPtr, double value);static void SwapColours(Stripchart* StripchartPtr);/* *-------------------------------------------------------------- * * Tk_StripchartCmd -- * *      This procedure is invoked to process the "Stripchart" and *      "toplevel" Tcl commands.  See the user documentation for *      details on what it does. * * Results: *      A standard Tcl result. * * Side effects: *      See the user documentation. * *-------------------------------------------------------------- */intTk_StripchartCmd(ClientData clientData, Tcl_Interp *interp, int argc,		 char **argv) {	Tk_Window tkwin = (Tk_Window) clientData;	Tk_Window new;	register Stripchart *StripchartPtr;	if (argc < 2) {		Tcl_AppendResult(interp, "wrong # args: should be \"",			    argv[0], " pathName ?options?\"", 0);		return TCL_ERROR;	}	/*	 * Create the window.	 */	new = Tk_CreateWindowFromPath(interp, tkwin, argv[1], 0);	if (new == NULL)		return TCL_ERROR;	Tk_SetClass(new, "Stripchart");	StripchartPtr = (Stripchart*)calloc(1, sizeof(Stripchart));	StripchartPtr->tkwin = new;	StripchartPtr->interp = interp;	Tk_CreateEventHandler(StripchartPtr->tkwin,			      ExposureMask | StructureNotifyMask,			      StripchartEventProc, (ClientData) StripchartPtr);	Tcl_CreateCommand(interp, Tk_PathName(StripchartPtr->tkwin),

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -