This is ViscaController.m in view mode; [Download] [Up]
/* Generated by Interface Builder */
#import "ViscaController.h"
#import "Controller.h"
#import <appkit/Application.h>
#import <appkit/Form.h>
#import <appkit/TextField.h>
#import <appkit/Button.h>
#import <libc.h>
@implementation ViscaController
void checkSelf(teNum, now, moi)
DPSTimedEntry teNum;
double now;
id moi;
{
[moi updateSelf];
return;
}
void checkClock(teNum, now, moi)
DPSTimedEntry teNum;
double now;
id moi;
{
[moi clockInquiry: moi];
return;
}
void checkPosition(teNum, now, moi)
DPSTimedEntry teNum;
double now;
id moi;
{
[moi positionInquiry: moi];
return;
}
void checkMode(teNum, now, moi)
DPSTimedEntry teNum;
double now;
id moi;
{
[moi modeInquiry: moi];
return;
}
unsigned char bcd( int val )
{
unsigned char tmp;
tmp = (val / 10) * 0x10 + (val % 10);
fprintf(stderr," BCDing %d == %02X\n", val, tmp);
return tmp;
}
- appDidInit: sender
{
warnUser = YES;
strcpy(errorMessage, ERRMSG_NOERROR );
fprintf(stderr,"ViscaController.m: appDidInit\n");
visca = [[VISCA alloc] init];
[NXApp initVars];
[visca setPort: (char *) "/dev/ttyb"];
[visca open];
[visca setAddressBroadcastFrom: 0];
[visca setWhenNow];
[visca v_address];
checkTE = DPSAddTimedEntry(0.25, &checkSelf, self,
NX_MODALRESPTHRESHOLD);
clockAuto = YES;
clockTE = DPSAddTimedEntry( 0.5, &checkClock,
self, NX_MODALRESPTHRESHOLD);
positionTE = DPSAddTimedEntry(0.1, &checkPosition,
self, NX_MODALRESPTHRESHOLD);
positionAuto = YES;
modeTE = DPSAddTimedEntry( 0.1, &checkMode,
self, NX_MODALRESPTHRESHOLD);
modeAuto = YES;
return self;
}
- free
{
fprintf(stderr, "Freeing!!!\n");
[visca close];
[visca free];
DPSRemoveTimedEntry(checkTE);
if( clockAuto )
DPSRemoveTimedEntry(clockTE);
return [super free];
}
- updateSelf
{
// [visca readStatus];
return self;
}
- clockInquiry: sender
{
int reply;
unsigned char completionMessage[128];
static char time[20];
reply = [visca md_interfaceInquiry: INQ_CLOCK];
if( reply == CMD_COMPLETION)
{
if( [visca copyCompletionMessage: completionMessage] >= 6 )
{
sprintf(time, "%02X:%02X:%02X",
completionMessage[0],
completionMessage[1],
completionMessage[2],
completionMessage[3]);
[timeField setStringValue:time];
}
}
return self;
}
- positionInquiry: sender
{
int reply, len;
unsigned char completionMessage[128];
static char counter[15];
static char clock[15];
reply = [visca md_positionInquiry];
if( reply == CMD_COMPLETION)
{
len = [visca copyCompletionMessage: completionMessage];
if( [visca copyCompletionMessage: completionMessage] >= 10 )
{
sprintf(counter, "%02X:%02X:%02X:%02X",
completionMessage[1],
completionMessage[2],
completionMessage[3],
completionMessage[4]);
[positionCounterText setStringValue:counter];
sprintf(clock, "%02X:%02X:%02X:%02X%01X",
completionMessage[5],
completionMessage[6],
completionMessage[7],
completionMessage[8],
completionMessage[9]);
[positionClockText setStringValue:clock];
}
}
return self;
}
- waitUntil:(struct ct_hmsf *) endFrame
{
int reply, len;
unsigned char cm[128];
static char counter[15];
double a, b;
b = endFrame->hh * 60 * 60 * 100.0 +
endFrame->mm * 60 * 100.0 +
endFrame->ss * 100.0 +
endFrame->ff;
a = -1.0;
do
{
reply = [visca md_positionInquiry];
if( reply == CMD_COMPLETION)
{
len = [visca copyCompletionMessage: cm];
if( [visca copyCompletionMessage: cm]
>= 10 )
{
fprintf(stderr, "Counter:=%02X:%02X:%02X:%02X",
cm[1], cm[2], cm[3], cm[4]);
[positionCounterText setStringValue:counter];
a = cm[1] * 60 * 60 *100 +
cm[2] * 60 * 100 +
cm[3] * 100 +
cm[4];
}
}
usleep(500);
} while( a != b);
return self;
}
- deviceInquiry: sender
{
int reply, len;
unsigned char completionMessage[128];
static char dev[20];
reply = [visca md_interfaceInquiry: INQ_DEVICETYPE];
if( reply == CMD_COMPLETION)
{
len = [visca copyCompletionMessage: completionMessage];
sprintf(dev, "%02X %02X, %02X %02X, %02X %02X",
completionMessage[0],
completionMessage[1],
completionMessage[2],
completionMessage[3],
completionMessage[4],
completionMessage[5]);
[deviceField setStringValue:dev];
}
return self;
}
- (int) modeInquiry: sender
{
int reply;
unsigned char completionMessage[128];
static char mode[20];
BOOL stop, rewind, ff, eject, pause, play, record;
reply = [visca md_modeInquiry];
fprintf(stderr," -- reply in modeInq is %02Xh\n", reply);
if( reply == CMD_COMPLETION)
{
[visca copyCompletionMessage: completionMessage];
if( completionMessage[1] != (unsigned char) 0xFF )
{
fprintf(stderr,"incomplete message %02Xh\n",
completionMessage[1]);
return -1;
}
stop = rewind = ff = eject = pause = play = record = NO;
switch( completionMessage[0] )
{
case MC1_STOP:
sprintf(mode, "Stop");
stop = YES;
break;
case MC1_FAST_FORWARD:
sprintf(mode, "Fast Forward");
ff = YES;
break;
case MC1_REWIND:
sprintf(mode, "Rewind");
rewind = YES;
break;
case MC1_EJECT:
sprintf(mode, "Eject");
eject = YES;
break;
case MC1_PAUSE:
sprintf(mode, "Pause");
play = pause = YES;
break;
case MC1_SLOW2:
sprintf(mode, "Slow2");
play = pause = YES;
break;
case MC1_SLOW1:
sprintf(mode, "Slow1");
play = pause = YES;
break;
case MC1_PLAY:
sprintf(mode, "Play");
play = YES;
break;
case MC1_FAST1:
sprintf(mode, "Fast1");
play = pause = YES;
break;
case MC1_FAST2:
sprintf(mode, "Fast2");
play = pause = YES;
break;
case MC1_SCAN:
sprintf(mode, "Cue");
play = ff = YES;
break;
case MC1_REVERSE_SLOW2:
sprintf(mode, "RevSlow2");
rewind = play = pause = YES;
break;
case MC1_REVERSE_SLOW1:
sprintf(mode, "RevSlow1");
rewind = play = pause = YES;
break;
case MC1_REVERSE_PLAY:
sprintf(mode, "ReversePlay");
rewind = play = YES;
break;
case MC1_REVERSE_FAST1:
sprintf(mode, "RevFast1");
rewind = play = pause = YES;
break;
case MC1_REVERSE_FAST2:
sprintf(mode, "RevFast2");
rewind = play = pause = YES;
break;
case MC1_REVERSE_SCAN:
sprintf(mode, "Review");
play = rewind = YES;
break;
case MC1_RECORD_PAUSE:
sprintf(mode, "RecordPause");
record = play = pause = YES;
break;
case MC1_RECORD:
sprintf(mode, "Record");
record = play = YES;
break;
default:
sprintf(mode, "Unrecognized: %02X",
completionMessage[0]);
break;
}
currentTransportMode = completionMessage[0];
[self disableFlushWindow];
[modeText setStringValue: mode];
[fastForwardButton setState: ff];
[stopButton setState: stop];
[recordButton setState: record];
[ejectButton setState: eject];
[rewindButton setState: rewind];
[pauseButton setState: pause];
[playButton setState: play];
[self reenableFlushWindow];
[self flushWindowIfNeeded];
}
else
sprintf(mode,"Command not completed, %02Xh\n",
reply);
fprintf(stderr,"Mode == %s \n", mode);
return reply;
}
- deviceChanged: sender
{
return self;
}
- pause:sender
{
currentTransportMode = MC1_PAUSE;
[visca md_modeControl_1: currentTransportMode];
return self;
}
- eject:sender
{
currentTransportMode = MC1_EJECT;
[visca md_modeControl_1: currentTransportMode];
return self;
}
- play:sender
{
currentTransportMode = MC1_PLAY;
[visca md_modeControl_1: currentTransportMode];
return self;
}
- stop:sender
{
currentTransportMode = MC1_STOP;
[visca md_modeControl_1: currentTransportMode];
return self;
}
- record:sender
{
currentTransportMode = MC1_RECORD;
[visca md_modeControl_1: currentTransportMode];
return self;
}
- fast_forward:sender
{
int desiredMode;
switch( currentTransportMode)
{
case MC1_REVERSE_PLAY:
desiredMode = MC1_PLAY;
break;
case MC1_PLAY:
desiredMode = MC1_FAST1;
break;
case MC1_FAST1:
desiredMode = MC1_FAST2;
break;
default:
desiredMode = MC1_FAST_FORWARD;
break;
}
fprintf(stderr,"Current ts = %02Xh, Desired ts = %02Xh\n",
currentTransportMode, desiredMode);
fprintf(stderr,"Executing: ret code = %02Xh\n",
[visca md_modeControl_1: desiredMode]);
usleep(10000000);
[self modeInquiry: self];
fprintf(stderr,"-- Current ts = %02Xh, Desired ts = %02Xh\n",
currentTransportMode, desiredMode);
if( desiredMode != currentTransportMode)
{
currentTransportMode = desiredMode;
[self fast_forward: sender];
}
return self;
}
- rewind:sender
{
int desiredMode;
switch( currentTransportMode)
{
case MC1_PLAY:
desiredMode = MC1_REVERSE_PLAY;
break;
case MC1_REVERSE_PLAY:
desiredMode = MC1_REVERSE_FAST1;
break;
case MC1_FAST1:
desiredMode = MC1_REVERSE_FAST2;
break;
default:
desiredMode = MC1_REWIND;
break;
}
[visca md_modeControl_1: desiredMode];
usleep(500);
[self modeInquiry: self];
if( desiredMode != currentTransportMode)
{
currentTransportMode = desiredMode;
[self rewind: sender];
}
return self;
}
- (int) search: (struct ct_hmsf *) search;
{
fprintf(stderr,"Searching %02x:%02x:%02x:%02x\n",
search->hh, search->mm, search->ss, search->ff);
status = [visca md_search:CT_HMS counter:
(union counterType *) search];
fprintf(stderr,"Search ended\n" );
return status;
}
- zoomIn: sender
{
status = [visca md_cameraZoom: (int) ZOOM_TELE];
if( status == CMD_ERROR )
return [self handleError];
else
return self;
}
- zoomOut: sender
{
status = [visca md_cameraZoom: (int) ZOOM_WIDE];
if( status == CMD_ERROR )
return [self handleError];
else
return self;
return self;
}
- focusNear: sender
{
status = [visca md_cameraFocus: (int) FOCUS_NEAR];
if( status == CMD_ERROR )
return [self handleError];
else
return self;
return self;
}
- focusFar: sender
{
status = [visca md_cameraFocus: (int) FOCUS_FAR];
if( status == CMD_ERROR )
return [self handleError];
else
return self;
}
- zoomFocusStop: sender
{
status = [visca md_cameraFocus: (int) FOCUS_STOP];
if( status == CMD_ERROR )
return [self handleError];
status = [visca md_cameraZoom: (int) ZOOM_STOP];
if( status == CMD_ERROR )
return [self handleError];
else
return self;
}
- frameForward: sender
{
status = [visca md_modeControl_2: MC2_FRAME_FORWARD];
if( status == CMD_ERROR )
return [self handleError];
else
return self;
}
- frameReverse: sender
{
status = [visca md_modeControl_2: MC2_FRAME_REVERSE];
if( status == CMD_ERROR )
return [self handleError];
else
return self;
}
- resetCounter: sender
{
status = [visca md_subControl: SC_COUNTER_RESET];
if( status == CMD_ERROR )
return [self handleError];
else
return self;
}
- realCounterMode: sender
{
status = [visca md_subControl: SC_REAL_COUNTER];
if( status == CMD_ERROR )
return [self handleError];
else
return self;
}
- relativeCounterMode: sender
{
status = [visca md_subControl: SC_RELATIVE_COUNTER];
if( status == CMD_ERROR )
return [self handleError];
else
return self;
}
- toggleAudio: sender
{
status = [visca md_subControl: SC_TOGGLE_AUDIO];
if( status == CMD_ERROR )
return [self handleError];
else
return self;
}
- toggleSpeed: sender
{
status = [visca md_subControl: SC_TOGGLE_SPEED];
if( status == CMD_ERROR )
return [self handleError];
else
return self;
}
- toggleDisplay: sender
{
status = [visca md_subControl: SC_TOGGLE_DISPLAY];
if( status == CMD_ERROR )
return [self handleError];
else
return self;
}
- cycleVideo: sender
{
status = [visca md_subControl: SC_CYCLE_VIDEO_IN];
if( status == CMD_ERROR )
return [self handleError];
else
return self;
}
- (BOOL) canBecomeMainWindow { return NO; }
- handleError
{
static char warnMessage[256];
if( status != CMD_ERROR )
return self;
errorCode = [visca errorCode];
fprintf(stderr,"handleError: Error code = %02Xh.\n",
errorCode);
switch( errorCode )
{
case 0x01:
strcpy(errorMessage,"Message len error");
break;
case 0x02:
strcpy(errorMessage,"Syntax error");
break;
case 0x03:
strcpy(errorMessage,"Command buffer full");
break;
case 0x04:
strcpy(errorMessage,"Command Cancelled");
break;
case 0x05:
strcpy(errorMessage,"No socket");
break;
case ERROR_POWER:
strcpy(errorMessage, ERRMSG_POWER);
break;
case ERROR_TIMEOUT:
strcpy(errorMessage, ERRMSG_TIMEOUT);
break;
case ERROR_SEARCH:
strcpy(errorMessage, ERRMSG_SEARCH);
break;
case ERROR_CONDITION:
strcpy(errorMessage, ERRMSG_CONDITION);
break;
case ERROR_CAMERAMODE:
strcpy(errorMessage, ERRMSG_CAMERAMODE);
break;
case ERROR_VCRMODE:
strcpy(errorMessage, ERRMSG_VCRMODE);
break;
case ERROR_COUNTERTYPE:
strcpy(errorMessage, ERRMSG_COUNTERTYPE);
break;
case ERROR_TUNER:
strcpy(errorMessage, ERRMSG_TUNER);
break;
case ERROR_EMERGENCYSTOP:
strcpy(errorMessage, ERRMSG_EMERGENCYSTOP);
break;
case ERROR_NOMEDIA:
strcpy(errorMessage, ERRMSG_NOMEDIA);
break;
}
fprintf(stderr,"Error %02Xh in socket %d ==> %s\n",
errorCode, socket, errorMessage);
sprintf(warnMessage,"Error %02Xh in socket %d ==> %s\n",
errorCode, socket, errorMessage);
NXRunAlertPanel( "Error occured", warnMessage, "OK", NULL, NULL);
return self;
}
- (unsigned short int) status { return status; };
- (unsigned short int) errorCode { return errorCode; };
- (char *) errorMessage { return errorMessage; };
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.