This is Mux.m in view mode; [Download] [Up]
#import "Mux.h"
#ifdef MuxInspector
@implementation Mux
/*
* Accept changes in the FIFO selector. The This sets the FIFO size
* by selecting between 1, 4, 8 or 14 bytes of Threshold.
*/
- enterFIFO : sender
{
char buf[20];
char name[20];
IOReturn ret;
int port = [ [sender selectedCell] tag] >> 4;
FIFOIndex[port] = [ [sender selectedCell] tag] & 0xF;
sprintf (name, "IOFIFO%u", port);
ret = [devMaster setIntValues : &FIFOIndex[port]
forParameter : name
objectNumber : myTag
count : 1];
sprintf (buf, "%u", FIFOIndex[port]);
sprintf (name, "FIFO %u", port);
if (ret != IO_R_SUCCESS) {
NXLogError ("Couldn't set value for %s dynamically", name);
}
[ table insertKey : name value : buf];
return self;
}
/*
* Accept changes in the # Port selector
*/
- enterSelection : sender
{
NXRect ViewSize;
# if (defined(DEBUG))
IOLog ("- enterSelection : %x\n", [[sender selectedCell] tag]) ;
# endif
portIndex = [ [sender selectedCell] tag];
# if (defined(DEBUG))
IOLog ("unsetHexIntFromStringPort: %d\n", portIndex + (muxIndex != 0));
# endif
[ self unsetHexIntFromStringPort : portIndex + (muxIndex != 0)
key : IO_PORT_RANGES_KEY ];
# if (defined(DEBUG))
IOLog ("portIndex > 0\n");
# endif
/*
* Alter the auxiliary multiplexor window size accordingly
*/
if (portIndex > 0) {
if (multiPanel == nil) {
# if (defined(DEBUG))
IOLog ("NXApp loadNibSection\n");
# endif
if ([NXApp loadNibSection : "Multiplexed.nib"
owner : self
withNames : NO]) {
portIndex = 0;
return nil; /* Load failed */
}
[ [multiPanel contentView] getFrame : &originalViewSize];
[ [muxInspector contentView] getFrame : &ViewSize];
[multiPanel moveTopLeftTo : NX_X(&ViewSize)+NX_WIDTH(&ViewSize)
: NX_Y(&ViewSize)+NX_HEIGHT(&ViewSize)
-NX_HEIGHT(&originalViewSize)];
}
# if (defined(DEBUG))
IOLog ("sizeWindow : %d : %d\n",
NX_WIDTH(&originalViewSize),
NX_HEIGHT(&originalViewSize)*portIndex/8);
# endif
[multiPanel sizeWindow : NX_WIDTH(&originalViewSize)
: NX_HEIGHT(&originalViewSize)*portIndex/8];
} else if (multiPanel != nil) {
[multiPanel sizeWindow : 0:0];
}
if (multiPanel != nil)
[multiPanel flushWindow];
portRangeLength = portIndex + 1;
return self;
}
/*
* accept changes in the Size display selector.
*/
- enterSize : sender
{
int port = [ [sender selectedCell] tag] >> 2;
sizeIndex[port] = [ [sender selectedCell] tag] & 0x3;
[self displaySize : port];
return self;
}
/*
* Accept pushbutton - commands for the Buffer Size selector
*/
- minusBuffer : sender
{
int i;
int port = [ [sender selectedCell] tag];
# if (defined(DEBUG))
IOLog ("minusBuffer sizeIndex[%d] = %d\n", port, sizeIndex[port]) ;
# endif
switch (sizeIndex[port]) {
case 0:
for (i = 16; i > 0; --i) if (sizeBuffer[port] > (1 << i)) {
sizeBuffer[port] = 1 << i;
break;
}
[self setBufferSize : port];
break;
case 1:
hiwatBuffer[0] -= (hiwatBuffer[0] - lowatBuffer[0]) / 2;
[self setBufferHiwat : port];
break;
case 2:
lowatBuffer[0] /= 2;
[self setBufferLowat : port];
break;
}
[self displaySize : port];
return self;
}
- plusBuffer : sender
{
int i;
int port = [ [sender selectedCell] tag];
switch (sizeIndex[port]) {
case 0:
for (i = 0; i < 16; ++i) if (sizeBuffer[port] < (1 << i)) {
sizeBuffer[port] = 1 << i;
break;
}
[self setBufferSize : port];
break;
case 1:
hiwatBuffer[port] += (sizeBuffer[port] - hiwatBuffer[port]) / 2;
[self setBufferHiwat : port];
break;
case 2:
lowatBuffer[port] += (hiwatBuffer[port] - lowatBuffer[port]) / 2;
[self setBufferLowat : port];
break;
}
[self displaySize : port];
return self;
}
/*
* Set the Size directly from the window
*/
- setSize : sender
{ unsigned i = atoi ([sender stringValue]);
int port = [ [sender selectedCell] tag];
if (i >= 65536)
i = 65535;
switch (sizeIndex[port]) {
case 0:
if (i <= hiwatBuffer[port]) {
hiwatBuffer[port] = i - 1;
[self setBufferHiwat : port];
}
if (lowatBuffer[port] <= hiwatBuffer[port]) {
lowatBuffer[port] = hiwatBuffer[port] - 1;
[self setBufferLowat : port];
}
sizeBuffer[port] = i;
[self setBufferSize : port];
break;
case 1:
if (i <= lowatBuffer[port])
i = lowatBuffer[port] + 1;
if (hiwatBuffer[port] >= sizeBuffer[port]) {
sizeBuffer[port] = hiwatBuffer[port] + 1;
[self setBufferSize : port];
}
hiwatBuffer[port] = i;
[self setBufferHiwat : port];
break;
case 2:
if (i >= hiwatBuffer[port])
i = hiwatBuffer[port] - 1;
lowatBuffer[port] = i;
[self setBufferLowat : port];
break;
}
[self displaySize : port];
return self;
}
- setBufferSize : (int)port
{ char buf[20];
char name[80];
IOReturn ret;
sprintf (name, "IOBufferSize%u", port);
# if (defined(DEBUG))
IOLog ("setIntValues : %d forParameter : \"%s\"\n", sizeBuffer[port],
name) ;
# endif
ret = [devMaster setIntValues : &sizeBuffer[port]
forParameter : name
objectNumber : myTag
count : 1];
sprintf (name, "Buffer Size %u", port);
if (ret != IO_R_SUCCESS) {
NXLogError ("Couldn't set value for %s dynamically", name);
}
sprintf (buf, "%u", sizeBuffer[port]);
return [ table insertKey : name value : buf];
}
- setBufferHiwat : (int)port
{ char buf[20];
char name[80];
IOReturn ret;
sprintf (name, "IOBufferHiwater%u", port);
ret = [devMaster setIntValues : &hiwatBuffer[port]
forParameter : name
objectNumber : myTag
count : 1];
sprintf (buf, "%u", hiwatBuffer[port]);
sprintf (name, "RTS High Water %u", port);
if (ret != IO_R_SUCCESS) {
NXLogError ("Couldn't set value for %s dynamically", name);
}
return [ table insertKey : name value : buf];
}
- setBufferLowat : (int)port
{ char buf[20];
char name[80];
IOReturn ret;
sprintf (name, "IOBufferLowater%u", port);
ret = [devMaster setIntValues : &hiwatBuffer[port]
forParameter : name
objectNumber : myTag
count : 1];
sprintf (buf, "%u", lowatBuffer[port]);
sprintf (name, "RTS Low Water %u", port);
if (ret != IO_R_SUCCESS) {
NXLogError ("Couldn't set value for %s dynamically", name);
}
return [ table insertKey : name value : buf];
}
- displaySize : (int)port
{ char buffer[80];
if (port == portIndex)
port = 8;
switch (sizeIndex[port]) {
case 0:
sprintf (buffer, "%u", sizeBuffer[port]);
break;
case 1:
sprintf (buffer, "%u", hiwatBuffer[port]);
break;
case 2:
sprintf (buffer, "%u", lowatBuffer[port]);
break;
}
switch (port) {
case 0:
[muxInspector setStringValue : buffer];
break;
case 1:
[port1Size setStringValue : buffer];
break;
case 2:
[port2Size setStringValue : buffer];
break;
case 3:
[port3Size setStringValue : buffer];
break;
case 4:
[port4Size setStringValue : buffer];
break;
case 5:
[port5Size setStringValue : buffer];
break;
case 6:
[port6Size setStringValue : buffer];
break;
case 7:
[port7Size setStringValue : buffer];
break;
case 8:
sprintf (buffer, "%u bytes", muxIndex);
[port8Size setStringValue : buffer];
}
return self;
}
- enterMultiplexorStyle : sender
{
int i;
muxIndex = [ [sender selectedCell] tag];
if (muxIndex == 0) {
[ muxAddressSelector setEnabled : 0 ];
[ muxAddressMinusButton setEnabled : 0 ];
[ muxAddressPlusButton setEnabled : 0 ];
[ self unsetHexIntFromStringPort : portIndex key : IO_PORT_RANGES_KEY ];
}
else {
[ muxAddressSelector setEnabled : 1 ];
[ muxAddressMinusButton setEnabled : 1 ];
[ muxAddressPlusButton setEnabled : 1 ];
[ self displaySize : 8 ];
[ self getHexIntFromStringPort : portIndex
key : IO_PORT_RANGES_KEY argument : &i];
[ self setHexIntFromStringPort : portIndex
key : IO_PORT_RANGES_KEY argument : i];
}
return self;
}
- minusAddress : sender;
{
int i;
int port = [ [sender selectedCell] tag];
if (port == 8)
port = portIndex + 1;
[self getHexIntFromStringPort : port key : IO_PORT_RANGES_KEY argument : &i];
if (port == (portIndex + 1)) {
i -= muxIndex;
if (muxIndex == 1)
i &= 0x3FF;
else
i &= 0x3FE;
} else {
i -= 8;
i &= 0x3F8;
}
[self setHexIntFromStringPort : port key : IO_PORT_RANGES_KEY argument : i];
[self displayAddress : port];
return self;
}
- plusAddress : sender;
{
int i;
int port = [ [sender selectedCell] tag];
if (port == 8)
port = portIndex + 1 ;
[self getHexIntFromStringPort : port key : IO_PORT_RANGES_KEY argument : &i];
if (port == (portIndex + 1)) {
i += muxIndex;
if (muxIndex == 1)
i &= 0x3FF;
else
i &= 0x3FE;
} else {
i += 8;
i &= 0x3F8;
}
[self setHexIntFromStringPort : port key : IO_PORT_RANGES_KEY argument : i];
[self displayAddress : port];
return self;
}
- displayAddress : (int)port
{ int i;
char buffer[32];
[self getHexIntFromStringPort : port key : IO_PORT_RANGES_KEY argument : &i];
if (port == portIndex)
port = 8;
sprintf (buffer, "0x%x", i);
switch (port) {
case 0:
[port0Address setStringValue : buffer];
break;
case 1:
[port1Address setStringValue : buffer];
break;
case 2:
[port2Address setStringValue : buffer];
break;
case 3:
[port3Address setStringValue : buffer];
break;
case 4:
[port4Address setStringValue : buffer];
break;
case 5:
[port5Address setStringValue : buffer];
break;
case 6:
[port6Address setStringValue : buffer];
break;
case 7:
[port7Address setStringValue : buffer];
break;
case 8:
[port8Address setStringValue : buffer];
}
return self;
}
- (int)getUnsignedIntFromString : (char *)key
argument : (unsigned int *)val
{ char const * cp;
cp = [ table valueForStringKey : key ];
if (cp) {
*val = atoi (cp);
return (YES);
}
return (NO);
}
/*
* Read the indexed value from the String in Hex
*/
- (int)getHexIntFromStringPort : (int)port
key : (char *)key
argument : (unsigned int *)val
{ char const * cp;
int i, c;
cp = [ table valueForStringKey : key];
i = 0;
while ((i < port) && (*cp)) {
while ((c = *cp) && (c != ' '))
++cp;
while (*cp == ' ')
++cp;
++i;
}
if ((*cp != '0') && (*++cp != 'x')) {
*val = 0x110 + (port * 8);
return (YES);
}
i = 0;
while ((c = *++cp)
&& (((0 <= (c -= '0')) && (c <= 9))
|| ((10 <= (c -= 'A' - '0' - 10)) && (c <= 15))
|| ((10 <= (c -= 'a' - 'A')) && (c <= 15)))) {
i <<= 16;
i += c;
}
*val = i;
return (YES);
}
- unsetHexIntFromStringPort : (int)port
key : (char *)key
{
char * cp;
char * buf;
int c, i;
# if (defined(DEBUG))
IOLog ("- unsetHexIntFromStringPort : %d key : \"%s\"\n", port, key) ;
# endif
cp = buf = (char *)[ table valueForStringKey : key];
# if (defined(DEBUG))
IOLog ("[ table valueForStringKey : \"%s\"] = \"%s\"\n", key, buf);
# endif
i = 0;
while (i < port) {
if ((cp == NULL) || (*cp == '\0'))
break ;
while ((c = *cp) && (c != ' '))
++cp;
if (++i < port)
break ;
while (*cp == ' ')
++cp;
}
if (cp)
*cp = '\0';
# if (defined(DEBUG))
IOLog ("table insertKey : \"%s\" value : \"%s\"\n", key, buf) ;
# endif
return [ table insertKey : key value : (buf == NULL) ? "" : buf];
}
- setHexIntFromStringPort : (int)port
key : (char *)key
argument : (int)val
{ char buffer[BUFSIZ];
char * cp;
char * tp;
int i, c;
cp = (char *)[ table valueForStringKey : key];
tp = buffer;
i = 0;
while (i < port) {
if ((c = *cp) == '\0') {
sprintf (tp, "0x%x-0x%x ", 0x110 + (8 * i), 0x110 + (8 * i) + 7);
tp += strlen (tp);
} else {
while ((c = *tp++ = *cp) && (c != ' '))
++cp;
while (*cp == ' ')
++cp;
}
++i;
}
sprintf (tp, "0x%x-0x%x ", val, val
+ ((port == 8) ? (portIndex - 1) : 7));
tp += strlen (tp);
while ((c = *cp) && (c != ' '))
++cp;
while (*cp == ' ')
++cp;
(void)strcpy (tp, cp);
return [ table insertKey : key value : buffer ];
}
- loadMainNibFile
{
char buffer[MAXPATHLEN];
static NXBundle * myBundle;
IOLog ("- loadMainNibFile\n");
[super loadMainNibFile];
if (myBundle)
return self ;
IOLog ("[NXBundle bundleForClass : [self class]]\n") ;
myBundle = [NXBundle bundleForClass : [self class]];
IOLog ("[myBundle getPath ...]\n") ;
if (![myBundle getPath : buffer
forResource : MuxDeviceName
ofType : "nib"]) {
NXLogError ("Couldn't find inspector nib");
[self free];
return nil;
}
IOLog ("[NXApp loadNibFile \"%s\"...]\n", buffer);
if (![NXApp loadNibFile : buffer owner : self withNames : NO]) {
NXLogError ("Couldn't load inspector nib");
[self free];
return nil;
}
IOLog ("[self setAccessoryView]\n") ;
[self setAccessoryView: [self inspectionView]];
return self;
}
- free
{
[devMaster free];
return [super free];
}
- setTable : (NXStringTable *)instance
{
int i;
IOReturn ret;
IOString kind;
char buf[32];
# if (defined(DEBUG))
IOLog ("- setTable\n");
# endif
table = instance;
/*
* Set up the IODeviceMaster object to talk to the driver
*/
# if (defined(DEBUG))
IOLog ("[IODeviceMaster new]\n") ;
# endif
devMaster = [IODeviceMaster new];
sprintf (buf, "%s%s", MuxDeviceName,
[ table valueForStringKey : "Instance"]);
(void)strcpy (kind, MuxDeviceKind) ;
ret = [devMaster lookUpByDeviceName : buf
objectNumber : &myTag
deviceKind : &kind];
if (ret != IO_R_SUCCESS) {
/*
* We might not be loaded, so just log the error
*/
NXLogError("Couldn't find %s device: error %d\n", buf, ret);
}
/*
* Initialize the various values from the device.
*/
/* [IODeviceInspector setNumInterrupts : 1
numChannels : 0
portRangeLength : NTTY + 1
memoryRangeLength : 0]; */
for (i = 0; i < NTTY; ++i) {
/* Set the receive buffer size */
(void)sprintf (buf, "Buffer Size %u", i);
if ((([self getUnsignedIntFromString : buf
argument : &sizeBuffer[i]] == NO)
&& ([self getUnsignedIntFromString : "Buffer Size"
argument : &sizeBuffer[i]] == NO))
|| (sizeBuffer[i] > 65535))
sizeBuffer[i] = DOUBLE_BUFFER;
# if (defined(DEBUG))
IOLog ("sizeBuffer[%d] = %d\n", i, sizeBuffer[i]);
# endif
/* Set the RTS Low Water Mark */
(void)sprintf (buf, "RTS Low Water %u", i);
if ((([self getUnsignedIntFromString : buf
argument : &lowatBuffer[i]] == NO)
&& ([self getUnsignedIntFromString : "RTS Low Water"
argument : &lowatBuffer[i]] == NO))
|| (lowatBuffer[i] > (sizeBuffer[i] - 2)))
lowatBuffer[i] = sizeBuffer[i] / 3;
/* Set the RTS High Water Mark */
(void)sprintf (buf, "RTS High Water %u", i);
if ((([self getUnsignedIntFromString : buf
argument : &hiwatBuffer[i]] == NO)
&& ([self getUnsignedIntFromString : "RTS High Water"
argument : &hiwatBuffer[i]] == NO))
|| (hiwatBuffer[i] > (sizeBuffer[i] - 2))
|| (hiwatBuffer[i] <= lowatBuffer[i]))
hiwatBuffer[i] = (lowatBuffer[i] + sizeBuffer[i]) / 2;
/* Set the FIFO Water Mark */
(void)sprintf (buf, "FIFO %u", i);
if ((([self getUnsignedIntFromString : buf
argument : &FIFOIndex[i]] == NO)
&& ([self getUnsignedIntFromString : "FIFO"
argument : &FIFOIndex[i]] == NO))
|| ((FIFOIndex[i] != 1) && (FIFOIndex[i] != 4)
&& (FIFOIndex[i] != 8) && (FIFOIndex[i] != 14))) {
# if (FIFO_TRIGGER) == (FIFO_TRIGGER_14)
FIFOIndex[i] = 14;
# elif (FIFO_TRIGGER) == (FIFO_TRIGGER_8)
FIFOIndex[i] = 8;
# elif (FIFO_TRIGGER) == (FIFO_TRIGGER_4)
FIFOIndex[i] = 4;
# elif (FIFO_TRIGGER) == (FIFO_TRIGGER_1)
FIFOIndex[i] = 1;
# else
FIFOIndex[i] = 14;
# endif
}
}
for (i = 0; i < NTTY; ++i) {
[self displaySize : i];
[self displayAddress : i];
}
[ self displaySize : 8 ];
[ self displayAddress : 8 ];
return self;
}
- (View *)inspectionView
{
return muxInspector;
}
- resourcesChanged : (IOResources *)rsrc
{
return self;
}
#ifdef STANDALONE
- rangeDidChange : sender
{
return self;
}
- setNumInterrupts : (int)numInterrupts
numChannels : (int)numChannels
portRangeLength : (int)numPorts
memoryRangeLength : (int)numAddresses
{
return self;
}
/*
* Provide some abilities to create a standalone program model
*/
void main ()
{ NXApp = [Application new];
[NXApp init];
if ([NXApp loadNibSection : "Mux.nib"
owner : NXApp
withNames : NO])
[NXApp run];
[NXApp free];
exit (0);
}
#endif
@end
#endif
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.