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

📄 seset.c

📁 功能丰富的串口通讯程序
💻 C
字号:
/* * This file is part of the Seyon, Copyright (c) 1992-1993 by Muhammad M. * Saggaf. All rights reserved. * * See the file COPYING (1-COPYING) or the manual page seyon(1) for a full * statement of rights and permissions for this program.*/#include <math.h>#include <X11/Intrinsic.h>#include <X11/StringDefs.h>#include <X11/Xaw/Toggle.h>#include <X11/Xaw/Dialog.h>#include "seyon.h"#include "SeDecl.h"extern int      param_pipe[2];int             DetNewlineTrMode(),                ToggleNewlineMode(),                SetIStrip(),                ToggleDelMode(),                ToggleMetaKeyTr(),                ToggleXOffMode(),                ToggleRtsctsMode(),                ToggleZmodemAutoDownload(),                ToggleIdleGuard(),                MenuSetGetBaud(),                MenuSetGetCSize(),                MenuSetGetParity(),                MenuSetGetStopBits(),                MenuSetGetParamSCut(),                MenuSetGetNewlineTrMode();void            UpdateToggleSettings(),                UpdateStates(),                SetGetRadioVal(),                SetDoGetRadioVal(),                SetGetValue(),                SetDoGetValue();int             SetBaud(),                SetPort();int             newlineTrMode;struct _setToggle {  Widget          widget;  char           *name;  int             state;  int            (*call_back)();};struct _setRadio {  String          name;  String          button[10];  int             activeIndex;  int             (*call_back)();};struct _setValue {  char           *name;  char            value[SM_BUF];                  int(*call_back)();};static struct _setToggle set_toggle[] ={  {NULL, "stripHighBit", 0, SetIStrip},  {NULL, "del", 0, ToggleDelMode},  {NULL, "meta_tr", 0, ToggleMetaKeyTr},  {NULL, "xoff", 0, ToggleXOffMode},  {NULL, "rtscts", 0, ToggleRtsctsMode},  {NULL, "autozm", 0, ToggleZmodemAutoDownload},  {NULL, "idle", 0, ToggleIdleGuard},  {NULL, NULL, 0, NULL}};static struct _setRadio setRadio[] ={  {"baud", {"300", "1200", "2400", "4800", "9600", "19200", "38400",#if USE_NONSTD_BAUD    "57600", "115200",#endif    NULL}, 1, MenuSetGetBaud},  {"bits", {"5", "6", "7", "8", NULL}, 1, MenuSetGetCSize},  {"parity", {"none", "odd", "even", NULL}, 1, MenuSetGetParity},  {"stopBits", {"1", "2", NULL}, 1, MenuSetGetStopBits},  {"cut", {"8n1", "7e1", "other", NULL}, 1, MenuSetGetParamSCut},  {"nl_tr", {"nl", "cr", "cr_lf", NULL}, 1, MenuSetGetNewlineTrMode},  {NULL, {NULL}, 0, NULL}};static struct _setValue set_value[] ={  {"port", "", SetPort},  {NULL, "", NULL}};struct _setRadio *curRadObjPtr;struct _setValue *curValObjPtr;voidTopSet(w)     Widget          w;{  Widget          popup,                  mBox,                  uBox,                  lBox;  struct _setToggle *tptr;  struct _setRadio *rPtr;  struct _setValue *vptr;  ErrorIfBusy()  tptr = set_toggle;  tptr->state = qres.stripHighBit; tptr++;  tptr->state = qres.backspaceTranslation; tptr++;  tptr->state = qres.metaKeyTranslation; tptr++;  tptr->state = qres.xonxoffFlowControl; tptr++;  tptr->state = qres.rtsctsFlowControl; tptr++;  tptr->state = qres.autoZmodem; tptr++;  tptr->state = qres.idleGuard; tptr++;  popup = SeAddPopup("set", w);  mBox = AddPaned("mBox", popup);  uBox = AddBox("uBox", mBox);  lBox = AddBox("lBox", mBox);  for (tptr = set_toggle; tptr->name != NULL; tptr++) {    tptr->widget = SeAddToggleWCD(tptr->name, uBox, UpdateToggleSettings,								  (XtPointer)(tptr->call_back));    SeSetUnsetToggle(tptr->widget, tptr->state);  }  for (rPtr = setRadio; rPtr->name != NULL; rPtr++)    SeAddButtonWCD(rPtr->name, uBox, SetGetRadioVal, (XtPointer) rPtr);  for (vptr = set_value; vptr->name != NULL; vptr++)    SeAddButtonWCD(vptr->name, uBox, SetGetValue, (XtPointer) vptr);  SeAddButtonWCD("dismiss", lBox, DestroyShellCallBack, (XtPointer) mBox);  XtPopup(popup, XtGrabExclusive);}voidSetGetRadioVal(widget, client_data)     Widget          widget;     XtPointer       client_data;{  struct _setRadio *rPtr = (struct _setRadio*)client_data;  rPtr->activeIndex = (*rPtr->call_back)(-1);  SePopupRadio(rPtr->name, widget, rPtr->button, rPtr->activeIndex,			   SetDoGetRadioVal, (XtPointer)rPtr);}voidSetDoGetRadioVal(widget, client_data)     Widget          widget;     XtPointer       client_data;{  int   TerminalRefreshParameters();  struct _setRadio *rPtr = (struct _setRadio *)client_data;  Boolean         state;  XtVaGetValues(widget, XtNradioData, &(rPtr->activeIndex), XtNstate,		&state, NULL);  /* The callback routine is called both when the widget is set or unset,	 so we make sure we do nothing if the widget is unset */  if (state == False)    return;  (void)(*rPtr->call_back) (rPtr->activeIndex);  TerminalRefreshParameters();  SeyonMessage("Parameter Change Performed");}voidSetGetValue(widget, client_data)     Widget          widget;     XtPointer       client_data;{  struct _setValue *vptr;  vptr = set_value;  strcpy(vptr->value, modem_port);  vptr++;  curValObjPtr = (vptr = (struct _setValue *)client_data);  SePopupDialogGetStringE("set_value", widget, SetDoGetValue,			  client_data, vptr->value, True);}voidSetDoGetValue(widget, client_data)     Widget          widget;     XtPointer       client_data;{  int   TerminalRefreshParameters();  Widget          dialog = XtParent(widget);  struct _setValue *vptr = (struct _setValue *)client_data;  str_stripspc_copy(vptr->value, XawDialogGetValueString(dialog));  DestroyShell(dialog);  (void)(*vptr->call_back) (vptr->value);  RestartTerminal();  SeyonMessage("Parameter Change Performed");}voidsetVal_action_ok(widget)     Widget          widget;{  SetDoGetValue(widget, (XtPointer) curValObjPtr);}voidUpdateToggleSettings(widget, clientData)     Widget          widget;     XtPointer       clientData;{  int   TerminalRefreshParameters();  /* We have to complicate things a bit to avoid the danger of the case     SeGetTog.. = True = -1. One should not assume True = 1*/  ((void (*)())clientData)(SeGetToggleState(widget) ? 1 : 0);  TerminalRefreshParameters();  SeyonMessage("Parameter Change Performed");}intSetIStrip(state)	 int state;{  qres.stripHighBit = (Boolean)state;  return MdmSetGetIStrip(state);}intToggleDelMode(){  toggle_flag(&(qres.backspaceTranslation));  return 0;}intToggleMetaKeyTr(){  toggle_flag(&(qres.metaKeyTranslation));  return 0;}intToggleXOffMode(){  toggle_flag(&(qres.xonxoffFlowControl));  xc_setflow();  return 0;}intToggleRtsctsMode(){  toggle_flag(&(qres.rtsctsFlowControl));  set_rtscts();  return 0;}intToggleZmodemAutoDownload(){  toggle_flag(&(qres.autoZmodem));  return 0;}intToggleIdleGuard(){  toggle_flag(&(qres.idleGuard));  IdleGuard();  return 0;}intDetNewlineTrMode(keyword)     String          keyword;{  char            kw[SM_BUF];  if ((keyword == NULL) || (*keyword == '\0')) {    SeError("missing newlineTranslation keyword");    return -1;  }  str_stripspc_copy(kw, keyword);  lc_word(kw);  if (strcmp(kw, "nl") == 0)    return 1;  else if (strcmp(kw, "cr") == 0)    return 2;  else if (strcmp(kw, "cr/lf") == 0)    return 3;  else {    SeErrorF("illigal newlineTranslation keyword: %s", keyword, "", "");    return -1;  }}voidSetNewlineTrMode(keyword)     String          keyword;{  if ((newlineTrMode = DetNewlineTrMode(keyword)) < 0)    newlineTrMode = 2;}intMenuSetGetNewlineTrMode(trMode)     int             trMode;{  if (trMode != -1)    newlineTrMode = trMode;  return newlineTrMode;}voidSetScrNewlineTrMode(){  getword();  if (word[0] == '\0') {    SeError("'set newlineTranslation' must specify translation mode");    eof_flag++;    return;  }  SetNewlineTrMode(word);}intMenuSetGetBaud(baudIndex)     int             baudIndex;{  return MdmSetGetBaud(baudIndex);}intMenuSetGetCSize(bitsIndex)     int             bitsIndex;{  return MdmSetGetCSize(bitsIndex == -1 ? bitsIndex :			bitsIndex + 4) - 4;}intMenuSetGetParity(parityIndex)     int             parityIndex;{  return MdmSetGetParity(parityIndex == -1 ? parityIndex :			 parityIndex - 1) + 1;}intMenuSetGetStopBits(bitsIndex)     int             bitsIndex;{  return MdmSetGetStopBits(bitsIndex);}intMenuSetGetParamSCut(paramIndex)     int             paramIndex;{  int             bits,                  parity,                  stopBits;  if (paramIndex == -1) {    bits = MdmSetGetCSize(-1);    parity = MdmSetGetParity(-1);    stopBits = MdmSetGetStopBits(-1);    if (bits == 8 && parity == 0 && stopBits == 1)      return 1;    else if (bits == 7 && parity == 2 && stopBits == 1)      return 2;    else      return 3;  }  if (paramIndex == 1) {    MdmSetGetCSize(8);    MdmSetGetParity(0);    MdmSetGetStopBits(1);  }  else if (paramIndex == 2) {    MdmSetGetCSize(7);    MdmSetGetParity(2);    MdmSetGetStopBits(1);  }  return paramIndex;}intSetBaud(baud)     String          baud;{  if (mbaud(baud) < 0) {    SeErrorF("unsupported baud rate %s", baud, "", "");    return False;  }  return True;}intSetPort(port)     String          port;{  int             retStatus,	              reopRetStatus;  String          oldPort = XtNewString(mport(NULL));  unlock_tty();  CloseModem();  if ((retStatus = OpenModem(port)) < 0) {	ShowOpenModemErrMsg(port, retStatus);	if ((reopRetStatus = OpenModem(oldPort)) < 0)	  {ShowOpenModemErrMsg(oldPort, reopRetStatus);	  SeError(FmtString("Could not re-open old modem device %s", oldPort, "", 						""));}  }  XtFree(oldPort);  return retStatus;}void            s_set_xoff(),                s_set_baud(),                set_port(),                s_set_cr(),                ScrSetIStrip(),                s_set_del(),                set_meta_tr(),                s_set_rtscts(),                s_set_autozm(),                SetScrIdleGuardMode(),                ScrSetCSize(),                ScrSetParity(),                ScrSetStopBits();struct kw       setlist[] ={  {"stripHighBit", ScrSetIStrip},  {"bits", ScrSetCSize},  {"parity", ScrSetParity},  {"stopBits", ScrSetStopBits},  {"newlineTranslation", SetScrNewlineTrMode},  {"del", s_set_del},  {"meta_tr", set_meta_tr},  {"xoff", s_set_xoff},  {"rtscts", s_set_rtscts},  {"autozm", s_set_autozm},  {"idleGuard", SetScrIdleGuardMode},  {"baud", s_set_baud},  {"port", set_port},  {NULL, NULL}};voids_set(){  struct kw      *ptr;  GETTEST_ARG("set");/*  lc_word(word);*/  for (ptr = setlist; ptr->keyword != NULL; ptr++)    if (strcmp(ptr->keyword, word) == 0)      {(*ptr->rtn)(); return;}  SeErrorF("Invalid set keyword `%s'", word, "", "");  eof_flag++;}voids_set_cr(){  set_onoff(&(qres.newlineTranslation));}voidScrSetIStrip(){  Boolean tmpSetFlag;  set_onoff(&tmpSetFlag);  SetIStrip(tmpSetFlag ? 1 : 0);}voids_set_del(){  set_onoff(&(qres.backspaceTranslation));}voidset_meta_tr(){  set_onoff(&(qres.metaKeyTranslation));}voids_set_xoff(){  set_onoff(&(qres.xonxoffFlowControl));  xc_setflow();}voids_set_rtscts(){  set_onoff(&(qres.rtsctsFlowControl));  set_rtscts();}voids_set_autozm(){  set_onoff(&(qres.autoZmodem));}voidSetScrIdleGuardMode(){  set_onoff(&(qres.idleGuard));  IdleGuard();}voidset_onoff(flag)     Boolean        *flag;{  String          keyWord = XtNewString(word);  getword();  lc_word(word);  if (strcmp(word, "on") == 0) *flag = True;  else if (strcmp(word, "off") == 0) *flag = False;  else {    SeErrorF("Argument `%s' to keyword `%s' is neither on nor off", 			 word, keyWord, "");    eof_flag++;  }  if (keyWord) XtFree(keyWord);}#define ScrGetArg(msg) \{ \  getword(); \  if (word[0] == '\0') { \    SeError(msg); \    eof_flag++; \    return; \  } \}voidScrSetCSize(){  ScrGetArg("set bits: missing argument");  MdmSetGetCSize(atoi(word));}voidScrSetParity(){  ScrGetArg("set parity: missing argument");  MdmSetGetParity(atoi(word));}voidScrSetStopBits(){  ScrGetArg("set stopBits: missing argument");  MdmSetGetStopBits(atoi(word));}voids_set_baud(){  getword();  if (word[0] == '\0') {    SeError("'set baud' must specify baud rate");    eof_flag++;    return;  }  if (SetBaud(word) == False)    eof_flag++;}voidset_port(){  SeNotice("/sp/ Sorry, \"set port\" is not supported in this release");  return;  getword();  if (word[0] == '\0') {    SeError("'set port' must specify modem device");    eof_flag++;    return;  }  if (SetPort(word) == False)    eof_flag++;}struct param {  Boolean         autoZmodem;  Boolean         idleGuard;  Boolean         stripHighBit;  Boolean         backspaceTranslation;  Boolean         metaKeyTranslation;  Boolean         xonxoffFlowControl;  Boolean         rtsctsFlowControl;  int             newlineTrMode;};intPutParameters(destination)	 int *destination;{  struct param    param;  int             writeRetStatus;  param.idleGuard = qres.idleGuard;  param.stripHighBit = qres.stripHighBit;  param.backspaceTranslation = qres.backspaceTranslation;  param.metaKeyTranslation = qres.metaKeyTranslation;  param.xonxoffFlowControl = qres.xonxoffFlowControl;  param.rtsctsFlowControl = qres.rtsctsFlowControl;  param.autoZmodem = qres.autoZmodem;  param.newlineTrMode = newlineTrMode;  if ((writeRetStatus = write(destination[1], (char*)&param, sizeof(param)))	  == -1)    SePError("Could not write to pipe");    return writeRetStatus;}voidGetParameters(clientData, source)	 XtPointer  clientData;	 int       *source;{  struct param    param;  if (read(source[0], (char*)&param, sizeof(param)) == -1)	SePError("Could not read from pipe");  qres.idleGuard = param.idleGuard;  qres.stripHighBit = param.stripHighBit;  qres.backspaceTranslation = param.backspaceTranslation;  qres.metaKeyTranslation = param.metaKeyTranslation;  qres.xonxoffFlowControl = param.xonxoffFlowControl;  qres.rtsctsFlowControl = param.rtsctsFlowControl;  qres.autoZmodem = param.autoZmodem;  newlineTrMode = param.newlineTrMode;  get_modem_attr();}

⌨️ 快捷键说明

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