This is ViscaController.m in view mode; [Download] [Up]
/* Generated by Interface Builder */ #import "ViscaController.h" #import <appkit/Application.h> #import <appkit/Form.h> #import <appkit/TextField.h> #import <appkit/Button.h> #import <appkit/PopUpList.h> #import <appkit/Panel.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 ); visca = [[VISCA alloc] init]; [visca setPort: (char *) [portText stringValue]]; [visca open]; [visca setAddressBroadcastFrom: 0]; [visca setWhenNow]; [visca v_address]; checkTE = DPSAddTimedEntry(0.1, &checkSelf, self, NX_MODALRESPTHRESHOLD); clockAuto = positionAuto = modeAuto = NO; [self clockAuto: self]; [self positionAuto: self]; [self modeAuto: self]; [self perform: @selector( deviceInquiry: ) with: self afterDelay: 100 cancelPrevious: YES]; [self perform: @selector( channelInquiry: ) with: self afterDelay: 110 cancelPrevious: YES]; [self perform: @selector( editControlInquiry: ) with: self afterDelay: 120 cancelPrevious: YES]; [self perform: @selector( mediaInquiry: ) with: self afterDelay: 130 cancelPrevious: YES]; [self perform: @selector( inputSelectionInquiry: ) with: self afterDelay: 130 cancelPrevious: YES]; [self perform: @selector( configureInquiry: ) with: self afterDelay: 130 cancelPrevious: YES]; searchType = CT_HMS; 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 >= 100) { if( [visca copyCompletionMessage: completionMessage] >= 6 ) { sprintf(time, "%02X:%02X:%02X:%02X%01X", completionMessage[0], completionMessage[1], completionMessage[2], completionMessage[3], completionMessage[4], completionMessage[5]); [timeField setStringValue:time]; } } return self; } - clockAuto: sender { if( sender == clockRateText) { if( positionAuto) { DPSRemoveTimedEntry(clockTE); clockTE = DPSAddTimedEntry( [clockRateText doubleValue], &checkClock, self, NX_MODALRESPTHRESHOLD); } return self; } if( [clockAutoButton state]) { if( !clockAuto ) { clockTE = DPSAddTimedEntry( [clockRateText doubleValue], &checkClock, self, NX_MODALRESPTHRESHOLD); clockAuto = YES; } } else { if( clockAuto ) { DPSRemoveTimedEntry(clockTE); clockAuto = NO; } } 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 >= 100) { 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; } - positionAuto: sender { if( sender == positionRateText) { if( positionAuto) { DPSRemoveTimedEntry( positionTE); positionTE = DPSAddTimedEntry( [positionRateText doubleValue], &checkPosition, self, NX_MODALRESPTHRESHOLD); } return self; } if( [positionAutoButton state]) { if( !positionAuto ) { positionTE = DPSAddTimedEntry( [positionRateText doubleValue], &checkPosition, self, NX_MODALRESPTHRESHOLD); positionAuto = YES; } } else { if( positionAuto ) { DPSRemoveTimedEntry(positionTE); positionAuto = NO; } } return self; } - deviceInquiry: sender { int reply, len; unsigned char completionMessage[128]; static char dev[20]; reply = [visca md_interfaceInquiry: INQ_DEVICETYPE]; if( reply >= 100) { 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; } - channelInquiry: sender { int reply, len; unsigned char completionMessage[128]; static char channel[20]; reply = [visca md_channelInquiry]; if( reply >= 100) { len = [visca copyCompletionMessage: completionMessage]; sprintf(channel, "%01X%01X%01X", completionMessage[0], completionMessage[1], completionMessage[2]); [channelField setStringValue:channel]; } return self; } - editControlInquiry: sender { int reply, len; unsigned char completionMessage[128]; static char control[20]; reply = [visca md_editControlInquiry]; if( reply >= 100) { len = [visca copyCompletionMessage: completionMessage]; sprintf(control, completionMessage[0] == 0x00 ? "None" : "Type 1 Capability"); [editControlField setStringValue:control]; } return self; } - mediaInquiry: sender { int reply, len; unsigned char completionMessage[128]; static char media1[60], media2[60], *tmp1, *tmp2, *tmp3, *tmp4, *tmp5, *tmp6; reply = [visca md_mediaInquiry]; if( reply >= 100) { len = [visca copyCompletionMessage: completionMessage]; switch( completionMessage[0] ) { case 0x01: tmp1 = "8mm"; break; case 0x02: tmp1 = "VHS"; break; case 0x03: tmp1 = "S-VHS"; break; case 0x41: tmp1 = "Hi-8"; break; case 0x42: tmp1 = "S-VHS"; break; case 0x43: tmp1 = "ED-Beta"; break; default: tmp1 = "Unknown"; break; } switch( completionMessage[1] ) { case 0x01: tmp2 = "SP"; break; case 0x02: tmp2 = "LP"; break; case 0x03: tmp2 = "EP"; break; default: tmp2 = "Unknown"; break; } if( completionMessage[2] & 0x08 ) // bit 3 tmp3 = "High Grade"; else tmp3 = "Standard Grade"; if( completionMessage[2] & 0x04 ) // bit 2 tmp4 = "Thick"; else tmp4 = "Thin"; if( completionMessage[2] & 0x02 ) // bit 1 tmp5 = "ME"; else tmp5 = "MP"; if( completionMessage[2] & 0x01 ) // bit 0 tmp6 = " Playback Only"; else tmp6 = "Recordable"; sprintf(media1, "%s, %s, %s", tmp1, tmp2, tmp3); sprintf(media2, "%s, %s, %s", tmp4, tmp5, tmp6); [mediaField1 setStringValue: media1]; [mediaField2 setStringValue: media2]; } return self; } - inputSelectionInquiry: sender { int reply, len; unsigned char completionMessage[128]; static char output[20]; static char *type[8] = { "Unrecognized", // 0 "Tuner", // 1 "Unrecognized", // 2 "Line", // 3 "Unrecognized", // 4 "Unrecognized", // 5 "Unrecognized", // 6 "Other"}; // 7 reply = [visca md_inputSelectInquiry]; if( reply >= 100) { len = [visca copyCompletionMessage: completionMessage]; sprintf(output, "Video == %s; Audio == %s", type[ completionMessage[0]], type[ completionMessage[1]]); [inputSelectionField setStringValue:output]; } return self; } - configureInquiry: sender; { int reply, len; unsigned char completionMessage[128]; static char output[60], *tmp1; reply = [visca md_configureInquiry]; if( reply >= 100) { len = [visca copyCompletionMessage: completionMessage]; switch( completionMessage[2] ) { case 0x00: tmp1 = "None"; break; case 0x01: tmp1 = "Synchronous"; break; case 0x02: tmp1 = "F500"; break; default: tmp1 = "Unknown"; break; } sprintf(output, "%02X fps; %s; %s", completionMessage[0], completionMessage[1] == 0x01 ? "NTSC" : "Unknown", tmp1); [configureField setStringValue:output]; } return self; } - modeInquiry: sender { int reply; unsigned char completionMessage[128]; static char mode[20]; reply = [visca md_modeInquiry]; [self disableFlushWindow]; [stopButton setState: NO]; [rewindButton setState: NO]; [fastForwardButton setState: NO]; [ejectButton setState: NO]; [pauseButton setState: NO]; [playButton setState: NO]; [recordButton setState: NO]; if( reply >= 100) { [visca copyCompletionMessage: completionMessage]; switch( completionMessage[0] ) { case 0x00: sprintf(mode, "Stop"); [stopButton setState: YES]; break; case 0x02: sprintf(mode, "Stop -- tape top"); [stopButton setState: YES]; break; case 0x04: sprintf(mode, "Stop -- tape end"); [stopButton setState: YES]; break; case 0x06: sprintf(mode, "Stop -- emergency"); [stopButton setState: YES]; break; case 0x08: sprintf(mode, "Fast Forward"); [fastForwardButton setState: YES]; break; case 0x10: sprintf(mode, "Rewind"); [rewindButton setState: YES]; break; case 0x18: sprintf(mode, "Eject"); [ejectButton setState: YES]; break; case 0x20: sprintf(mode, "Slow 2"); [playButton setState: YES]; [pauseButton setState: YES]; break; case 0x24: sprintf(mode, "Pause"); [playButton setState: YES]; [pauseButton setState: YES]; break; case 0x28: sprintf(mode, "Play"); [playButton setState: YES]; break; case 0x2E: sprintf(mode, "Cue"); [playButton setState: YES]; [fastForwardButton setState: YES]; break; case 0x3E: sprintf(mode, "Review"); [playButton setState: YES]; [rewindButton setState: YES]; break; case 0x48: sprintf(mode, "Record"); [recordButton setState: YES]; break; default: sprintf(mode, "Unrecognized: %02X", completionMessage[0]); } [modeText setStringValue: mode]; } reply = [visca md_powerInquiry]; if( reply >= 100 ) { [visca copyCompletionMessage: completionMessage]; switch( completionMessage[0] ) { case 0x02: [powerButton setState: YES]; break; case 0x03: [powerButton setState: NO]; break; default: fprintf(stderr,"Unrecognized power " "setting %d\n", completionMessage[0]); break; } } [self reenableFlushWindow]; [self flushWindowIfNeeded]; return self; } - modeAuto: sender { if( sender == modeRateText ) { if( modeAuto) { DPSRemoveTimedEntry(modeTE); modeTE = DPSAddTimedEntry( [modeRateText doubleValue], &checkMode, self, NX_MODALRESPTHRESHOLD); } return self; } if( [modeAutoButton state]) { if( !modeAuto ) { modeTE = DPSAddTimedEntry( [modeRateText doubleValue], &checkMode, self, NX_MODALRESPTHRESHOLD); modeAuto = YES; } } else { if( modeAuto ) { DPSRemoveTimedEntry(modeTE); clockAuto = NO; } } return self; } - deviceChanged: sender { return self; } - pause:sender { [sender setState: YES]; [visca md_modeControl_1: MC1_PAUSE]; return self; } - eject:sender { [sender setState: YES]; [visca md_modeControl_1: MC1_EJECT]; return self; } - play:sender { [sender setState: YES]; [visca md_modeControl_1: MC1_PLAY]; return self; } - stop:sender { [sender setState: YES]; [visca md_modeControl_1: MC1_STOP]; return self; } - power:sender { [visca md_power: [sender state] ? POWER_ON: POWER_OFF]; return self; } - record:sender { [sender setState: YES]; [visca md_modeControl_1: MC1_RECORD]; return self; } - fast_forward:sender { [sender setState: YES]; [visca md_modeControl_1: MC1_FAST_FORWARD]; return self; } - rewind:sender { [sender setState: YES]; [visca md_modeControl_1: MC1_REWIND]; return self; } - search: sender { union counterType pos; pos.hmsf.hh = bcd( [searchFields intValueAt: 0] ); pos.hmsf.mm = bcd( [searchFields intValueAt: 1] ); pos.hmsf.ss = bcd( [searchFields intValueAt: 2] ); pos.hmsf.ff = bcd( [searchFields intValueAt: 3] );; [visca md_search:searchType counter: &pos]; return self; } - searchTypeChanged: sender { switch( [[sender selectedCell] tag] ) { case 0: // Top-Mid-end fprintf(stderr,"search -- tme\n"); searchType = CT_TME; break; case 1: // hms fprintf(stderr,"search -- hms\n"); searchType = CT_HMS; break; case 2: // hmsf fprintf(stderr,"search -- hmsf\n"); searchType = CT_HMSF; break; case 3: // time-code fprintf(stderr,"search -- timecode\n"); searchType = CT_TIMECODE; break; default: NXRunAlertPanel("Not recognized", "Search " "tag no recognized. Contacter developer", "OK", NULL, NULL); break; } return self; } - 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; } - 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; } sprintf(warnMessage,"Error %02Xh in socket %d ==> %s\n", errorCode, [visca socket], errorMessage); NXRunAlertPanel( "Error occured", warnMessage, "OK", NULL, NULL); return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.