/* * Copyright (c) 1995, 1996 Gunther Schadow. All rights reserved. * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* only for sprintf(3) */ #ifdef DEBUG # ifdef LOGLEVEL # undef LOGLEVEL # endif # define LOGLEVEL L_JUNK #else # ifndef LOGLEVEL # define LOGLEVEL L_MESG # endif #endif /* admission number bed care unit date of birth adt event code first name patient id last name sex date of admission current severity diagnosis attending MD discharge disposition */ void usage() { cerr << "usage: hpadt [-0] options ... service host" << endl << "\twhere options are:" << endl << "\t-0 no default settings" << endl << "\t-a admission number" << endl << "\t-b bed" << endl << "\t-c care unit" << endl << "\t-d date of birth" << endl << "\t-e adt event number" << endl << "\t-f first name" << endl << "\t-i patient id" << endl << "\t-n last name" << endl << "\t-s sex" << endl << "\t-A date of admission" << endl << "\t-C current severity" << endl << "\t-D diagnosis" << endl << "\t-M attending MD" << endl << "\t-X discharge disposition" << endl; exit(1); } main(int argc, char *argv[]) { int c; char *admission_number = NULL; char *bed = NULL; char *care_unit = NULL; char *date_of_birth = NULL; char *adt_event_code = NULL; char *first_name = NULL; char *patient_id = NULL; char *last_name = NULL; char *sex = NULL; char *date_of_admission = NULL; char *current_severity = NULL; char *diagnosis = NULL; char *attending_MD = NULL; char *discharge_disposition = NULL; /* default settings */ bool no_defaults = false; if(strcmp(argv[1], "-0") != 0) { no_defaults = false; admission_number = "1"; bed = "601-1"; care_unit = "060_IOP"; date_of_birth = "01/01/1970"; adt_event_code = "A01"; first_name = "John"; patient_id = "1"; last_name = "Doe"; sex = "M"; date_of_admission = "6/19/1995"; current_severity = NULL; diagnosis = NULL; attending_MD = NULL; discharge_disposition = "OTHER"; } else { no_defaults = true; argv++; } while ( ( c = getopt(argc, argv, "0a:b:c:d:e:f:i:n:s:A:C:D:M:") ) != FAIL ) { switch(c) { case 'a': admission_number = optarg ; break; case 'b': bed = optarg; break; case 'c': care_unit = optarg; break; case 'd': date_of_birth = optarg; break; case 'e': adt_event_code = optarg; break; case 'f': first_name = optarg; break; case 'i': patient_id = optarg; break; case 'n': last_name = optarg; break; case 's': sex = optarg; break; case 'A': date_of_admission = optarg; break; case 'C': current_severity = optarg; break; case 'D': diagnosis = optarg; break; case 'M': attending_MD = optarg; break; case 'X': discharge_disposition = optarg; break; default: usage(); break; } } if((argc - optind) <= 1) usage(); char *service = argv[optind++]; char *address = argv[optind++]; iosockinet server(sockbuf::sock_stream); log_init(argv[0], "hpadt.log", "test"); log_level(LOGLEVEL); lprintf(L_MESG, "hl7 adt client startup"); /* Prepare Segments */ /* MSH segment */ MSHseg msh; msh.setSenApp("hl7client"); msh.setSenFac("test"); msh.setRecApp("ADT"); msh.setRecFac(NULL); TStyp ts; ts.set(); msh.setDateTimeOfMes(ts); msh.setProId(ProIdCode::Pro); msh.setVerId(VerIdCode::_2_1val); char xanbuf[20]; sprintf(xanbuf,"REQ%05u", (u_int)getpid()); msh.setMesConTrolId(xanbuf); /* EVN segment */ EVNseg evn; evn.setDateTimeOfEvent(ts); /* PID segment */ PIDseg pid; PNtyp pn; pn.setFamName(last_name); pn.setGivenName(first_name); pid.setPatName(pn); repfield rck; CKtyp ck; ck.setIdNum(IDtyp(admission_number)); /* patient_id */ ck.setCheckDigit((long)cdmod((const char *)ck.IdNum, 10)); ck.setCheckDigitSch(CheckDigitSchCode::M10val); rck[0] = ck; pid.setPatIdIntId(rck); /* PV1 segment */ PV1seg pv1; pv1.setPatClass(PatClassCode::Inp); ZLtyp zl; zl.setNurseUnit(care_unit); zl.setBed(bed); pv1.setAssPatLoc(zl); pv1.setDisDis(discharge_disposition); /* ZDM segment */ ZDMseg zdm; zdm.setZdm1(last_name); zdm.setZdm2(first_name); zdm.setZdm3(patient_id); zdm.setZdm4(admission_number); zdm.setZdm5(sex); zdm.setZdm6(date_of_birth); zdm.setZdm7(date_of_admission); zdm.setZdm8(attending_MD); zdm.setZdm9(diagnosis); zdm.setZdm10(current_severity); /* Assemble Message */ HL7Message* adt; switch(atoi(adt_event_code)) { case 1: { ADT_A01msg *adtx = new ADT_A01msg; adtx->setMesHea(msh); adtx->setEventType(evn); adtx->setPatIde(pid); adtx->setPatVisit(pv1); adtx->setHpConFigDem(zdm); adt = adtx; } break; case 2: { ADT_A02msg *adtx = new ADT_A02msg; adtx->setMesHea(msh); adtx->setEventType(evn); adtx->setPatIde(pid); adtx->setPatVisit(pv1); adtx->setHpConFigDem(zdm); adt = adtx; } break; case 3: { ADT_A03msg *adtx = new ADT_A03msg; adtx->setMesHea(msh); adtx->setEventType(evn); adtx->setPatIde(pid); adtx->setPatVisit(pv1); adtx->setHpConFigDem(zdm); adt = adtx; } break; case 8: { ADT_A08msg *adtx = new ADT_A08msg; adtx->setMesHea(msh); adtx->setEventType(evn); adtx->setPatIde(pid); adtx->setPatVisit(pv1); adtx->setHpConFigDem(zdm); adt = adtx; } break; case 11: { ADT_A11msg *adtx = new ADT_A11msg; adtx->setMesHea(msh); adtx->setEventType(evn); adtx->setPatIde(pid); adtx->setPatVisit(pv1); adtx->setHpConFigDem(zdm); adt = adtx; } break; case 12: { ADT_A12msg *adtx = new ADT_A12msg; adtx->setMesHea(msh); adtx->setEventType(evn); adtx->setPatIde(pid); adtx->setPatVisit(pv1); adtx->setHpConFigDem(zdm); adt = adtx; } break; case 13: { ADT_A13msg *adtx = new ADT_A13msg; adtx->setMesHea(msh); adtx->setEventType(evn); adtx->setPatIde(pid); adtx->setPatVisit(pv1); adtx->setHpConFigDem(zdm); adt = adtx; } break; default: cerr << "adt event number must be one of 1-3, 8, 11-13" << endl; exit(1); } xios cout_x(cout); /* Print message to be sent */ cout << hl7er; adt->output(cout); cout << endl; /* Connect server */ cout << "trying " << service << '%' << address << endl; server->connect(address,service,"tcp"); cout << server->localport() << '%' << server->localhost() << " connected to " << server->peerport() << '%' << server->peerhost() << endl; lprintf(L_MESG,"connection made to %d%%%s", server->peerport(), server->peerhost()); xios server_io_x(server); server << server->localhost() << (char)2 << hl7er; server.flush(); adt->output(server); delete adt; server.flush(); server->shutdown(sockbuf::shut_write); server.clear(); /* Read ACK Message */ ACKmsg ack; ack.input(server); cout << hl7er << ack << endl; return 0; }