This is VISCA.m in view mode; [Download] [Up]
//
// VISCA.m
//
// VISCA generic driver object library (phew)
// Version 1
//
// Copyright (c) 1991,1992 by Jiro Nakamura
// All Rights Reserved.
//
// Original Author: Jiro Nakamura
// Created: Dec 17, 1991
//
// RCS Information
// Revision Number-> $Revision: 1.2 $
// Last Revised-> $Date: 92/07/20 23:58:36 $
//
static char rcsid[]="$Id: VISCA.m,v 1.2 92/07/20 23:58:36 jiro Exp Locker: jiro $";
static char copyrightid[]="Copyright (C) 1991,1992 by Jiro Nakamura";
#import "VISCA.h"
#include <sgtty.h>
#import <stdio.h>
#import <libc.h>
#import <c.h>
#import <sys/ioctl.h>
#import <strings.h>
#define CAT_CODE 2 /* 2nd byte pos. */
int openPort( char *deviceName, int bps);
int closePort( int fd);
int nindex( unsigned char *s, unsigned char c, int n)
{
int tmp;
for( tmp = 0; tmp < n; tmp ++)
{
if( s[tmp] == c)
return tmp;
}
return -1;
}
@implementation VISCA
// Opening and closing the driver
- setPort: (char *) portName
{
strncpy( deviceName, portName, 30);
return self;
}
- setDelegate: d
{
delegate = d;
return self;
}
- open
{
#ifdef DEBUG
fprintf(stderr, "\nOpening <%s>\n", deviceName);
#endif
if( (fd = openPort( deviceName, B9600)) < 0)
{
perror( "openPort");
return nil;
}
inMessageCount = 0;
return self;
}
- close
{
if( closePort(fd) < 0)
{
perror("ClosePort: ");
return nil;
}
return self;
}
- readStatus
{
int readChars, tmp;
ioctl(fd, FIONREAD, &readChars);
if( readChars > 0 )
{
#ifdef DEBUG
fprintf(stderr,"%d characters ready to read\n",
readChars);
#endif
tmp = read( fd, inMessage + inMessageCount, readChars);
inMessageCount += tmp;
}
[self interpretStatus];
return self;
}
- interpretStatus
{
int count;
int sourceAddress, destinationAddress;
unsigned char message[128];
if( inMessageCount <= 0 )
return nil;
if( (count = nindex( inMessage, 0xff, inMessageCount)) < 0)
return nil;
#ifdef DEBUG
fprintf(stderr,"Interpreting status msg. InMesCount = %d\n",
inMessageCount);
#endif
if( count == 0)
{
if( inMessageCount > 0 )
inMessageCount -= 1;
return [self interpretStatus];
}
bcopy(inMessage, message, count+1);
inMessageCount -= count +1;
#ifdef DEBUG
fprintf(stderr,"We have complete message -- count = %d\n"
" -- Message body <", count);
for( tmp = 0; message[tmp] != (unsigned char) 0xFF; tmp++)
fprintf(stderr,"%02X ", (unsigned char) message[tmp]);
fprintf(stderr,">\n");
fprintf(stderr,"\n----- Analysis-------\n");
#endif
device = sourceAddress = (message[0] & 0x70) >> 4;
destinationAddress = message[0] & 0x0F;
#ifdef DEBUG
fprintf(stderr,"Source = %d, dest = %d\n", sourceAddress,
destinationAddress);
#endif
switch( message[1] & 0xF0)
{
case 0x00:
switch( message[1] )
{
case 0x01:
fprintf(stderr,"Format 1 message\n");
break;
case 0x02:
fprintf(stderr,"Format 2 message\n");
break;
case 0x03:
fprintf(stderr,"Format 3 message\n");
break;
case 0x04:
fprintf(stderr,"Format 4 message\n");
break;
}
break;
case 0x30:
switch( message[1] )
{
case 0x38:
fprintf(stderr,"Network change.\n");
break;
case 0x30:
fprintf(stderr,"Address request "
"from %d.\n",
message[2]);
break;
}
break;
case 0x20:
fprintf(stderr,"Cancel request from %d.\n",
message[1] & 0x0F);
socket = message[1] & 0x0F;
break;
case 0x40:
fprintf(stderr,"Acknowledge message from %d.\n",
message[1] & 0x0F);
socket = message[1] & 0x0F;
break;
case 0x50:
fprintf(stderr,"Completion message from %d.\n",
message[1] & 0x0F);
socket = message[1] & 0x0F;
break;
case 0x60:
fprintf(stderr,"Error message from %d: ",
message[1] & 0x0F);
socket = message[1] & 0x0F;
break;
default:
fprintf(stderr,"Unrecognized message header %02Xh\n\n",
message[1]);
break;
}
#ifdef DEBUG
fprintf(stderr,"-------------------\n\n");
#endif
if( inMessageCount > 0 )
[self interpretStatus];
return self;
}
- setAddressFrom: (int) frm to: (int) to
{
char nibble1, nibble2;
nibble1 = (0x08 | frm) & 0x0f;
nibble2 = to & 0x0f;
outMessage[0] = nibble1 << 4 | nibble2;
#ifdef DEBUG
fprintf(stderr, "Set Address, from = %1X, to = "
"%1X, out = %02Xh\n",
frm, to, outMessage[0] );
#endif
return self;
}
- setAddressBroadcastFrom: (int) frm
{
char nibble1, nibble2;
nibble1 = (0x08 | frm) & 0x0f;
nibble2 = 0x08;
outMessage[0] = nibble1 << 4 | nibble2;
#ifdef DEBUG
fprintf(stderr, "Set Broadcast Address, from = %1X, "
"out = %02Xh\n",
frm, outMessage[0] );
#endif
return self;
}
- setWhenNow
{
outMessage[1] = 0x01;
outMessage[2] = 0xFF; // cat code
headerSize = 3;
return self;
}
- setWhenClock: (struct ct_hmst *) value
{
outMessage[1] = 0x02;
outMessage[2] = 0xFF; // cat code
outMessage[3] = value->hh;
outMessage[4] = value->mm;
outMessage[5] = value->ss;
outMessage[6] = value->t1;
outMessage[6] = value->t2;
headerSize = 7;
return self;
}
- setWhenCounter: (union counterType *) value
counterType: (int) type
before: (BOOL) b
{
outMessage[1] = b ? 0x04 : 0x03;
outMessage[2] = 0xFF; // cat code
outMessage[3] = type;
outMessage[4] = value->bcd.d1;
outMessage[5] = value->bcd.d1;
outMessage[6] = value->bcd.d1;
outMessage[6] = value->bcd.d1;
headerSize = 7;
return self;
}
- (int) v_address
{
unsigned char message[4]; // use own since we will corrupt header
#ifdef DEBUG
fprintf(stderr,"V_address\n");
#endif
message[0] = outMessage[0];
message[1] = 0x30;
message[2] = 0x01;
message[3] = 0xFF;
return [self sendMessage: message size: 4];
}
- (int) md_interfaceInquiry: (int) type
{
unsigned char message[5]; // use own since we will corrupt header
#ifdef DEBUG
fprintf(stderr,"V_Interface Inquiry = %02Xh\n", type);
#endif
message[0] = outMessage[0];
message[1] = 0x09;
message[2] = 0x00;
message[3] = type;
message[4] = 0xFF;
return [self sendMessage: message size: 5];
}
- (int) md_power: (int) stat
{
#ifdef DEBUG
fprintf(stderr,"V_power: %s\n", stat == POWER_ON ? "ON" :
"OFF");
#endif
outMessage[CAT_CODE ] = 0x02;
outMessage[headerSize ] = 0x00;
outMessage[headerSize + 1] = stat;
outMessage[headerSize + 2] = 0xFF;
return [self sendMessage: outMessage size: headerSize + 3];
}
- (int) md_modeControl_1: (int) smode
{
#ifdef DEBUG
fprintf(stderr,"V_modecon1 = %02Xh\n", smode);
#endif
outMessage[CAT_CODE ] = 0x02;
outMessage[headerSize ] = 0x01;
outMessage[headerSize + 1] = smode;
outMessage[headerSize + 2] = 0xFF;
return [self sendMessage: outMessage size: headerSize + 3];
}
- (int) md_modeControl_2: (int) smode
{
#ifdef DEBUG
fprintf(stderr,"V_modecon2 = %02Xh\n", smode);
#endif
outMessage[CAT_CODE ] = 0x02;
outMessage[headerSize ] = 0x02;
outMessage[headerSize + 1] = smode;
outMessage[headerSize + 2] = 0xFF;
return [self sendMessage: outMessage size: headerSize + 3];
}
- (int) md_subControl: (int) smode
{
#ifdef DEBUG
fprintf(stderr,"V_subControl = %02Xh\n", smode);
#endif
outMessage[CAT_CODE ] = 0x02;
outMessage[headerSize ] = 0x10;
outMessage[headerSize + 1] = smode;
outMessage[headerSize + 2] = 0xFF;
return [self sendMessage: outMessage size: headerSize + 3];
}
- (int) md_search: (int) type counter: (union counterType *) ct
{
outMessage[CAT_CODE ] = 0x02;
outMessage[headerSize ] = 0x03;
outMessage[headerSize + 1] = type;
outMessage[headerSize + 2] = ct->bcd.d1;
outMessage[headerSize + 3] = ct->bcd.d2;
outMessage[headerSize + 4] = ct->bcd.d3;
outMessage[headerSize + 5] = ct->bcd.d4;
outMessage[headerSize + 6] = 0xFF;
switch( type)
{
case CT_TME:
outMessage[headerSize + 3] = 0;
outMessage[headerSize + 4] = 0;
case CT_HMS:
outMessage[headerSize + 5] = 0;
break;
}
return [self sendMessage: outMessage size: headerSize + 7];
}
- (int) md_cameraZoom: (int) zoomMode
{
#ifdef DEBUG
fprintf(stderr,"V_cameraZoom = %02Xh\n", zoomMode);
#endif
outMessage[CAT_CODE ] = 0x02;
outMessage[headerSize ] = 0x07;
outMessage[headerSize + 1] = zoomMode;
outMessage[headerSize + 2] = 0xFF;
return [self sendMessage: outMessage size: headerSize + 3];
}
- (int) md_cameraFocus: (int) focusMode
{
#ifdef DEBUG
fprintf(stderr,"V_cameraFocus = %02Xh\n", focusMode);
#endif
outMessage[CAT_CODE ] = 0x02;
outMessage[headerSize ] = 0x08;
outMessage[headerSize + 1] = focusMode;
outMessage[headerSize + 2] = 0xFF;
return [self sendMessage: outMessage size: headerSize + 3];
}
- (int) md_powerInquiry
{
unsigned char message[5]; // use own since we will corrupt header
#ifdef DEBUG
fprintf(stderr,"V_Power Inquiry\n");
#endif
message[0] = outMessage[0];
message[1] = 0x09;
message[2] = 0x02;
message[3] = 0x00;
message[4] = 0xFF;
return [self sendMessage: message size: 5];
}
- (int) md_modeInquiry
{
unsigned char message[5]; // use own since we will corrupt header
#ifdef DEBUG
fprintf(stderr,"V_Mode Inquiry\n");
#endif
message[0] = outMessage[0];
message[1] = 0x09;
message[2] = 0x02;
message[3] = 0x01;
message[4] = 0xFF;
return [self sendMessage: message size: 5];
}
- (int) md_channelInquiry
{
unsigned char message[5]; // use own since we will corrupt header
#ifdef DEBUG
fprintf(stderr,"V_Channel Inquiry\n");
#endif
message[0] = outMessage[0];
message[1] = 0x09;
message[2] = 0x02;
message[3] = 0x04;
message[4] = 0xFF;
return [self sendMessage: message size: 5];
}
- (int) md_editControlInquiry
{
unsigned char message[6]; // use own since we will corrupt header
#ifdef DEBUG
fprintf(stderr,"V_Edit Control Inquiry\n");
#endif
message[0] = outMessage[0];
message[1] = 0x09;
message[2] = 0x02;
message[3] = 0x05;
message[4] = 0x01;
message[5] = 0xFF;
return [self sendMessage: message size: 6];
}
- (int) md_mediaInquiry
{
unsigned char message[5]; // use own since we will corrupt header
#ifdef DEBUG
fprintf(stderr,"V_Media Inquiry\n");
#endif
message[0] = outMessage[0];
message[1] = 0x09;
message[2] = 0x02;
message[3] = 0x12;
message[4] = 0xFF;
return [self sendMessage: message size: 5];
}
- (int) md_inputSelectInquiry
{
unsigned char message[5]; // use own since we will corrupt header
#ifdef DEBUG
fprintf(stderr,"V_Media Inquiry\n");
#endif
message[0] = outMessage[0];
message[1] = 0x09;
message[2] = 0x02;
message[3] = 0x13;
message[4] = 0xFF;
return [self sendMessage: message size: 5];
}
- (int) md_configureInquiry
{
unsigned char message[5]; // use own since we will corrupt header
#ifdef DEBUG
fprintf(stderr,"V_Media Inquiry\n");
#endif
message[0] = outMessage[0];
message[1] = 0x09;
message[2] = 0x02;
message[3] = 0x120;
message[4] = 0xFF;
return [self sendMessage: message size: 5];
}
- (int) md_positionInquiry
{
unsigned char message[6]; // use own since we will corrupt header
#ifdef DEBUG
fprintf(stderr,"V_Position Inquiry\n");
#endif
message[0] = outMessage[0];
message[1] = 0x09;
message[2] = 0x02;
message[3] = 0x03;
message[4] = 0x10;
message[5] = 0xFF;
return [self sendMessage: message size: 6];
}
- (int) sendMessage: (unsigned char *) m size: (int) hs
{
unsigned char reply[128];
int replyCount;
if( write( fd, m, hs) < 0)
{
perror("sendMessage: ");
return -1;
}
replyCount =0;
do
{
read( fd, reply + replyCount, 1);
replyCount += 1;
}
while( reply[replyCount -1] != 0xFF );
device = (reply[0] & 0x70) >> 4;
socket = reply[1] & 0x0F;
errorCode = ERROR_NOERROR;
#ifdef DEBUG
fprintf(stderr, "=========Sending Message=======\n");
#endif
switch( reply[1] & 0xF0 )
{
case CMD_ACKNOWLEDGE:
#ifdef DEBUG
fprintf(stderr,"Reply: Acknowledged from %d.\n"
"========================\n\n",
socket);
#endif
return CMD_ACKNOWLEDGE;
case CMD_COMPLETION:
#ifdef DEBUG
fprintf(stderr,"Reply: Completed from %d.\n"
"========================\n\n",
socket);
#endif
bcopy( reply + 2, completionMessage, replyCount -2 );
completionMessageCount = replyCount - 2;
return CMD_COMPLETION;
case CMD_ERROR:
errorCode = reply[2];
#ifdef DEBUG
fprintf(stderr,"Error %d from socket %d.\n"
"==============================\n\n",
errorCode, socket);
#endif
return CMD_ERROR;
}
bcopy( reply, inMessage, replyCount);
inMessageCount += replyCount;
return -1;
}
- (int) copyCompletionMessage: (unsigned char *) buf;
{
bcopy( completionMessage, buf, completionMessageCount);
return completionMessageCount;
}
- (unsigned short int) errorCode { return errorCode; };
- (unsigned short int) socket { return socket; };
- (unsigned short int) device { return device; };
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.