PsychError FONTSFonts(void) { PsychGenericScriptType *nativeStructArray; int arrayIndex, numFonts; PsychFontStructType **fontPointerList, *fontElement; //all sub functions should have these two lines PsychPushHelp(useString, synopsisString, seeAlsoString); if(PsychIsGiveHelp()){PsychGiveHelp();return(PsychError_none);}; //check for required and superfluous arguments PsychErrorExit(PsychCapNumOutputArgs(1)); PsychErrorExit(PsychCapNumInputArgs(0)); //build a list of pointers to all the the font records in the font list, then hand the list of pointers to PsychCopyFontRecordsToNativeStructArray() //to get a native struct array of font records and return it to the scripting environment. arrayIndex=0; numFonts=PsychGetFontListLength(); fontPointerList=(PsychFontStructType**)malloc(numFonts * sizeof(PsychFontStructType*)); for(fontElement=PsychGetFontListHead();fontElement;fontElement=fontElement->next) fontPointerList[arrayIndex++]=fontElement; PsychCopyFontRecordsToNativeStructArray(numFonts, fontPointerList, &nativeStructArray); free((void*)fontPointerList); PsychAssignOutStructArray(1, FALSE, nativeStructArray); return(PsychError_none); }
PsychError SCREENCloseMovie(void) { int moviehandle = -1; // All sub functions should have these two lines PsychPushHelp(useString, synopsisString, seeAlsoString); if(PsychIsGiveHelp()) {PsychGiveHelp(); return(PsychError_none);}; PsychErrorExit(PsychCapNumInputArgs(1)); // Max. 1 input args. PsychErrorExit(PsychRequireNumInputArgs(1)); // Min. 1 input args required. PsychErrorExit(PsychCapNumOutputArgs(0)); // No output args. // Get the window record from the window record argument and get info from the window record //PsychAllocInWindowRecordArg(kPsychUseDefaultArgPosition, TRUE, &windowRecord); // Get the movie handle: PsychCopyInIntegerArg(1, TRUE, &moviehandle); if (moviehandle==-1) { PsychErrorExitMsg(PsychError_user, "CloseMovie called without valid handle to a movie object."); } // Try to delete the movie object, releasing all associated ressources: PsychDeleteMovie(moviehandle); return(PsychError_none); }
PsychError PSYCHHIDGiveMeReports(void) { PsychGenericScriptType *outErr; const char *fieldNames[] = {"n", "name", "description"}; char *name = "", *description = ""; long error = 0; int deviceIndex; int reportBytes = 1024; PsychPushHelp(useString,synopsisString,seeAlsoString); if (PsychIsGiveHelp()) { PsychGiveHelp(); return(PsychError_none); }; PsychErrorExit(PsychCapNumOutputArgs(2)); PsychErrorExit(PsychCapNumInputArgs(2)); PsychCopyInIntegerArg(1,TRUE,&deviceIndex); PsychCopyInIntegerArg(2,false,&reportBytes); PsychHIDVerifyInit(); // Returns 1st return argument 'reports': error = GiveMeReports(deviceIndex,reportBytes); // PsychHIDReceiveReports.c // Return 2nd return argument 'err' struct: PsychHIDErrors(NULL, error, &name, &description); PsychAllocOutStructArray(2, kPsychArgOptional, -1, 3, fieldNames, &outErr); PsychSetStructArrayStringElement("name", 0, name, outErr); PsychSetStructArrayStringElement("description", 0, description, outErr); PsychSetStructArrayDoubleElement("n", 0, (double) error, outErr); return(PsychError_none); }
PsychError PSYCHHIDKbCheck(void) { int deviceIndex; int m, n, p; double *scanList = NULL; psych_bool isDeviceSpecified; PsychPushHelp(useString, synopsisString, seeAlsoString); if(PsychIsGiveHelp()){PsychGiveHelp();return(PsychError_none);}; PsychErrorExit(PsychCapNumOutputArgs(3)); PsychErrorExit(PsychCapNumInputArgs(2)); // Choose the device index and its record isDeviceSpecified=PsychCopyInIntegerArg(1, FALSE, &deviceIndex); if (!isDeviceSpecified) { // set the keyboard or keypad device to be the first keyboard device or, if no keyboard, the first keypad deviceIndex = INT_MAX; } // Optional 2nd argument 'scanlist' provided? if (PsychAllocInDoubleMatArg(2, FALSE, &m, &n, &p, &scanList)) { // Yep. Matching size? if (p!=1 || m * n != 256) PsychErrorExitMsg(PsychError_user, "Provided 'scanList' parameter is not a vector of 256 doubles, as required!"); } return(PsychHIDOSKbCheck(deviceIndex, scanList)); }
PsychError SCREENTexturizeOffscreenWindows(void) { PsychWindowRecordType **windowRecordArray; int i, numWindows; //all subfunctions should have these two lines. PsychPushHelp(useString, synopsisString, seeAlsoString); if(PsychIsGiveHelp()){PsychGiveHelp();return(PsychError_none);}; //check for superfluous or missing arguments PsychErrorExit(PsychCapNumInputArgs(0)); PsychErrorExit(PsychRequireNumInputArgs(0)); PsychCreateVolatileWindowRecordPointerList(&numWindows, &windowRecordArray); for(i=0;i<numWindows;i++){ if(PsychIsOffscreenWindow(windowRecordArray[i])){ PsychUpdateTargetWindowFromTargetDisplay(windowRecordArray[i]); PsychAllocateTexture(windowRecordArray[i]); PsychBindTexture(windowRecordArray[i]); PsychUpdateTexture(windowRecordArray[i]); } } PsychDestroyVolatileWindowRecordPointerList(windowRecordArray); return(PsychError_none); }
PsychError SCREENglLoadIdentity(void) { // If you change useString then also change the corresponding synopsis string in ScreenSynopsis.c static char useString[] = "Screen('glLoadIdentity', windowPtr);"; static char synopsisString[] = "Reset an OpenGL matrix to its default identity setting. " "See <http://www.opengl.org/documentation/red_book_1.0/> Chapter 4 for detailed information."; static char seeAlsoString[] = ""; PsychWindowRecordType *windowRecord; //all sub functions should have these two lines PsychPushHelp(useString, synopsisString,seeAlsoString); if(PsychIsGiveHelp()){PsychGiveHelp();return(PsychError_none);}; //check for superfluous arguments PsychErrorExit(PsychCapNumInputArgs(1)); // The maximum number of inputs PsychErrorExit(PsychRequireNumInputArgs(1)); // Number of required inputs. PsychErrorExit(PsychCapNumOutputArgs(0)); // The maximum number of outputs //get the window record from the window record argument and get info from the window record PsychAllocInWindowRecordArg(kPsychUseDefaultArgPosition, TRUE, &windowRecord); // Switch to windows OpenGL context: PsychSetGLContext(windowRecord); // Execute it: glLoadIdentity(); PsychTestForGLErrors(); //All psychfunctions require this. return(PsychError_none); }
PsychError SCREENFinalizeMovie(void) { static char useString[] = "Screen('FinalizeMovie', moviePtr);"; static char synopsisString[] = "Finish creating a new movie file with handle 'moviePtr' and store it to filesystem.\n"; static char seeAlsoString[] = "CreateMovie AddFrameToMovie CloseMovie PlayMovie GetMovieImage GetMovieTimeIndex SetMovieTimeIndex"; int moviehandle = -1; // All sub functions should have these two lines PsychPushHelp(useString, synopsisString, seeAlsoString); if(PsychIsGiveHelp()) {PsychGiveHelp(); return(PsychError_none);}; PsychErrorExit(PsychCapNumInputArgs(1)); // Max. 3 input args. PsychErrorExit(PsychRequireNumInputArgs(1)); // Min. 2 input args required. PsychErrorExit(PsychCapNumOutputArgs(0)); // Max. 1 output args. // Get the moviehandle: PsychCopyInIntegerArg(1, kPsychArgRequired, &moviehandle); // Finalize the movie: if (!PsychFinalizeNewMovieFile(moviehandle)) { PsychErrorExitMsg(PsychError_user, "FinalizeMovie failed for reason mentioned above."); } return(PsychError_none); }
PsychError GESTALTGestalt(void) { char *selectorCString; OSType selectorConstant; CFStringRef selectorCFString; OSErr callError; long responseLong, i; PsychNativeBooleanType *responseArray; psych_bool returnResponse; PsychErrorExit(PsychCapNumOutputArgs(1)); PsychErrorExit(PsychCapNumInputArgs(1)); PsychAllocInCharArg(1, kPsychArgRequired, &selectorCString); if( strlen(selectorCString) != 4) PsychErrorExitMsg(PsychError_user, "The selector code must be a four-character string"); selectorCFString=CFStringCreateWithCString (NULL, selectorCString, kCFStringEncodingUTF8); selectorConstant= UTGetOSTypeFromString(selectorCFString); callError= Gestalt(selectorConstant, &responseLong); CFRelease(selectorCFString); if(callError) PsychCopyOutDoubleArg(1, kPsychArgOptional, (double)callError); else{ returnResponse=PsychAllocOutBooleanMatArg(1, kPsychArgOptional, 1, 32, 1, &responseArray); if(returnResponse){ for(i=0;i<32;i++){ if(1<<i & responseLong) responseArray[31-i]=TRUE; else responseArray[31-i]=FALSE; } } } return(PsychError_none); }
PsychError SCREENPixelSize(void) { int screenNumber; double depth; PsychWindowRecordType *windowRecord; //all sub functions should have these two lines PsychPushHelp(useString, synopsisString, seeAlsoString); if(PsychIsGiveHelp()){PsychGiveHelp();return(PsychError_none);}; //check to see if the user supplied superfluous arguments PsychErrorExit(PsychCapNumOutputArgs(1)); PsychErrorExit(PsychCapNumInputArgs(1)); //get specified screen number. if(PsychIsScreenNumberArg(1)){ PsychCopyInScreenNumberArg(1, TRUE, &screenNumber); depth=(double)PsychGetScreenDepthValue(screenNumber); }else if(PsychIsWindowIndexArg(1)){ PsychAllocInWindowRecordArg(1,TRUE,&windowRecord); depth=(double)windowRecord->depth; }else PsychErrorExit(PsychError_invalidNumdex); //Allocate a return matrix and load it with the depth values. PsychCopyOutDoubleArg(1, FALSE, depth); return(PsychError_none); }
PsychError EyelinkGetTrackerVersion(void) { int iVersion=0; char strVersion[40]="unknown tracker type"; //all sub functions should have these two lines PsychPushHelp(useString, synopsisString, seeAlsoString); if(PsychIsGiveHelp()){PsychGiveHelp();return(PsychError_none);}; //check to see if the user supplied superfluous arguments PsychErrorExit(PsychCapNumInputArgs(0)); PsychErrorExit(PsychRequireNumInputArgs(0)); PsychErrorExit(PsychCapNumOutputArgs(2)); // // Verify eyelink is up and running // EyelinkSystemIsConnected(); // EyelinkSystemIsInitialized(); iVersion = eyelink_get_tracker_version(strVersion); // mexPrintf("Tracker Version: '%s'\n", strVersion ); PsychCopyOutDoubleArg(1, TRUE, iVersion); PsychCopyOutCharArg(2, FALSE, strVersion); return(PsychError_none); }
PsychError SCREENSetMouseHelper(void) { int screenNumber; int xPos, yPos; int deviceIdx = -1; int detachFromMouse = 0; //all subfunctions should have these two lines. PsychPushHelp(useString, synopsisString, seeAlsoString); if(PsychIsGiveHelp()){PsychGiveHelp();return(PsychError_none);}; PsychErrorExit(PsychCapNumInputArgs(5)); //The maximum number of inputs PsychErrorExit(PsychCapNumOutputArgs(0)); //The maximum number of outputs PsychCopyInScreenNumberArg(1, TRUE, &screenNumber); PsychCopyInIntegerArg(2,TRUE, &xPos); PsychCopyInIntegerArg(3,TRUE, &yPos); PsychCopyInIntegerArg(4,FALSE, &deviceIdx); PsychCopyInIntegerArg(5,FALSE, &detachFromMouse); // Position the cursor. On OSX this will also automatically attach it // to mouse movement: PsychPositionCursor(screenNumber, xPos, yPos, deviceIdx); #if PSYCH_SYSTEM == PSYCH_OSX if (detachFromMouse) CGAssociateMouseAndMouseCursorPosition(false); #endif return(PsychError_none); }
PsychError PSYCHHIDKbTriggerWait(void) { int deviceIndex; int numScankeys; int* scanKeys; PsychPushHelp(useString, synopsisString, seeAlsoString); if(PsychIsGiveHelp()){PsychGiveHelp();return(PsychError_none);}; PsychErrorExit(PsychCapNumOutputArgs(1)); PsychErrorExit(PsychCapNumInputArgs(2)); //Specify trigger key code and the deviceNumber of the keyboard or keypad to scan. // Identify the mandatory trigger array: if (!PsychAllocInIntegerListArg(1, TRUE, &numScankeys, &scanKeys)){ PsychErrorExitMsg(PsychError_user, "Keycode is required."); } // Get optional deviceIndex: if (!PsychCopyInIntegerArg(2, FALSE, &deviceIndex)) deviceIndex = -1; // Execute: PsychHIDOSKbTriggerWait(deviceIndex, numScankeys, scanKeys); return(PsychError_none); }
PsychError EyelinkCurrentMode(void) { int iMode = 0; // Add help strings PsychPushHelp(useString, synopsisString, seeAlsoString); // Output help if asked if(PsychIsGiveHelp()) { PsychGiveHelp(); return(PsychError_none); } // Check arguments PsychErrorExit(PsychCapNumInputArgs(0)); PsychErrorExit(PsychRequireNumInputArgs(0)); PsychErrorExit(PsychCapNumOutputArgs(1)); // Verify eyelink is up and running EyelinkSystemIsConnected(); EyelinkSystemIsInitialized(); iMode = eyelink_current_mode(); // Assign output arg PsychCopyOutDoubleArg(1, TRUE, iMode); return(PsychError_none); }
PsychError IOPORTVerbosity(void) { static char useString[] = "oldlevel = IOPort('Verbosity' [,level]);"; static char synopsisString[] = "Set level of verbosity for error/warning/status messages. 'level' optional, new level " "of verbosity. 'oldlevel' is the old level of verbosity. The following levels are " "supported: 0 = Shut up. 1 = Print errors, 2 = Print also warnings, 3 = Print also some info, " "4 = Print more useful info (default), >5 = Be very verbose (mostly for debugging the driver itself). "; static char seeAlsoString[] = ""; int level= -1; // Setup online help: PsychPushHelp(useString, synopsisString, seeAlsoString); if(PsychIsGiveHelp()) {PsychGiveHelp(); return(PsychError_none); }; PsychErrorExit(PsychCapNumInputArgs(1)); // The maximum number of inputs PsychErrorExit(PsychRequireNumInputArgs(0)); // The required number of inputs PsychErrorExit(PsychCapNumOutputArgs(1)); // The maximum number of outputs PsychCopyInIntegerArg(1, kPsychArgOptional, &level); if (level < -1) PsychErrorExitMsg(PsychError_user, "Invalid level of verbosity provided. Valid are levels of zero and greater."); // Return current/old level: PsychCopyOutDoubleArg(1, kPsychArgOptional, (double) verbosity); // Set new level, if one was provided: if (level > -1) verbosity = level; return(PsychError_none); }
// Close given port. PsychError IOPORTClose(void) { static char useString[] = "IOPort('Close', handle);"; static char synopsisString[] = "Close a I/O port device 'handle'. This works for all device types.\n"; static char seeAlsoString[] = "'CloseAll'"; int handle; // Setup online help: PsychPushHelp(useString, synopsisString, seeAlsoString); if(PsychIsGiveHelp()) {PsychGiveHelp(); return(PsychError_none); }; PsychErrorExit(PsychCapNumInputArgs(1)); // The maximum number of inputs PsychErrorExit(PsychRequireNumInputArgs(1)); // The required number of inputs PsychErrorExit(PsychCapNumOutputArgs(0)); // The maximum number of outputs // Get handle: PsychCopyInIntegerArg(1, kPsychArgRequired, &handle); // Close associated port: PsychCloseIOPort(handle); return(PsychError_none); }
// Open a serial port on a serial port device: PsychError IOPORTConfigureSerialPort(void) { static char useString[] = "IOPort('ConfigureSerialPort', handle, configString);"; static char synopsisString[] = "(Re-)Configure a serial port device, specified by 'handle'.\n" "The string 'configString' is a string with pairs of paramName=paramValue " "tokens, separated by a delimiter, e.g., a space. It allows to specify specific " "values 'paramValue' to specific serial port parameters 'paramName'. Not all " "parameters are supported by all operating systems, and all settings have reasonable " "defaults. Settings unknown to a specific operating system are ignored.\n\n" "See the help of 'OpenSerialPort' for possible settings."; static char seeAlsoString[] = "'OpenSerialPort'"; char* configString = NULL; PsychSerialDeviceRecord* device = NULL; int handle; // Setup online help: PsychPushHelp(useString, synopsisString, seeAlsoString); if(PsychIsGiveHelp()) {PsychGiveHelp(); return(PsychError_none); }; PsychErrorExit(PsychCapNumInputArgs(2)); // The maximum number of inputs PsychErrorExit(PsychRequireNumInputArgs(2)); // The required number of inputs PsychErrorExit(PsychCapNumOutputArgs(0)); // The maximum number of outputs // Get required portSpec: PsychCopyInIntegerArg(1, kPsychArgRequired, &handle); // Get the configString: PsychAllocInCharArg(2, kPsychArgRequired, &configString); // Return return value of configuration call: return(PsychIOOSConfigureSerialPort(PsychGetPortIORecord(handle)->device, configString)); }
PsychError SCREENFrameArc(void) { // If you change useString then also change the corresponding synopsis string in ScreenSynopsis.c static char useString[] = "Screen('FrameArc',windowPtr,[color],[rect],startAngle,arcAngle, [penWidth], [penHeight], [penMode])"; // 1 2 3 4 5 6 7 8 static char synopsisString[] = "Draw an arc inscribed within the rect. 'color' is the clut index (scalar " "or [r g b] triplet) that you want to poke into each pixel; default produces " "black with the standard CLUT for this window's pixelSize. Default 'rect' is " "entire window. Angles are measured clockwise from vertical. 'penWidth' and " "'penHeight' are the width and height of the pen to use. On OS-X, penWidth must " "equal penHeight and the 'penMode' argument is currently ignored."; static char seeAlsoString[] = "DrawArc FillArc"; //all sub functions should have these two lines PsychPushHelp(useString, synopsisString,seeAlsoString); if(PsychIsGiveHelp()){PsychGiveHelp();return(PsychError_none);}; //check for superfluous arguments PsychErrorExit(PsychCapNumInputArgs(8)); //The maximum number of inputs PsychErrorExit(PsychRequireNumInputArgs(3)); //The minimum number of inputs PsychErrorExit(PsychCapNumOutputArgs(0)); //The maximum number of outputs // Render arc of type 2 - Just the outline with penWidth. PsychRenderArc(2); return(PsychError_none); }
PsychError SCREENFillArc(void) { // If you change useString then also change the corresponding synopsis string in ScreenSynopsis.c static char useString[] = "Screen('FillArc',windowPtr,[color],[rect],startAngle,arcAngle)"; // 1 2 3 4 5 static char synopsisString[] = "Draw a filled arc inscribed within the rect. 'color' is the clut index (scalar " "or [r g b a] triplet) that you want to poke into each pixel; default produces " "black with the standard CLUT for this window's pixelSize. Default 'rect' is " "entire window. Angles are measured clockwise from vertical."; static char seeAlsoString[] = "DrawArc FrameArc"; //all sub functions should have these two lines PsychPushHelp(useString, synopsisString,seeAlsoString); if(PsychIsGiveHelp()){PsychGiveHelp();return(PsychError_none);}; //check for superfluous arguments PsychErrorExit(PsychCapNumInputArgs(5)); //The maximum number of inputs PsychErrorExit(PsychRequireNumInputArgs(3)); //The minimum number of inputs PsychErrorExit(PsychCapNumOutputArgs(0)); //The maximum number of outputs // Render arc of type 3 - Filled arc. PsychRenderArc(3); return(PsychError_none); }
PsychError SCREENStopVideoCapture(void) { int capturehandle = -1; int dropped; // All sub functions should have these two lines PsychPushHelp(useString, synopsisString, seeAlsoString); if(PsychIsGiveHelp()) {PsychGiveHelp(); return(PsychError_none);}; PsychErrorExit(PsychCapNumInputArgs(1)); // Max. 1 input args. PsychErrorExit(PsychRequireNumInputArgs(1)); // Min. 1 input args required. PsychErrorExit(PsychCapNumOutputArgs(1)); // One output arg. // Get the handle: PsychCopyInIntegerArg(1, TRUE, &capturehandle); if (capturehandle==-1) { PsychErrorExitMsg(PsychError_user, "StopVideoCapture called without valid handle to a capture object."); } // Try to stop capture: dropped = PsychVideoCaptureRate(capturehandle, 0, 0, NULL); PsychCopyOutDoubleArg(1, FALSE, dropped); // Ready! return(PsychError_none); }
PsychError SCREENGetOpenGLDrawMode(void) { static char useString[] = "[targetwindow, IsOpenGLRendering] = Screen('GetOpenGLDrawMode');"; static char synopsisString[] = "Return information about current OpenGL rendering state.\n" "'targetwindow' is the window handle of the window that is currently enabled for " "drawing. That is, the last window a Screen drawing command was drawing to, or " "the window which is the current target for OpenGL rendering commands.\n" "'IsOpenGLRendering' if equal to zero, then normal 2D Screen drawing is active. " "If greater than zero, then Matlab OpenGL drawing is active, ie. a Screen('BeginOpenGL'); " "command was executed and OpenGL code can draw into 'targetwindow'. "; static char seeAlsoString[] = "BeginOpenGL EndOpenGL SetOpenGLTexture GetOpenGLTexture moglcore"; PsychWindowRecordType *windowRecord; //all sub functions should have these two lines PsychPushHelp(useString, synopsisString,seeAlsoString); if(PsychIsGiveHelp()){PsychGiveHelp();return(PsychError_none);}; //check for superfluous arguments PsychErrorExit(PsychCapNumInputArgs(0)); // The maximum number of inputs PsychErrorExit(PsychRequireNumInputArgs(0)); // Number of required inputs. PsychErrorExit(PsychCapNumOutputArgs(2)); // The maximum number of outputs windowRecord = PsychGetDrawingTarget(); // Return window handle of currently active drawing target window: PsychCopyOutDoubleArg(1, FALSE, (double) ((windowRecord) ? windowRecord->windowIndex : 0)); // Return draw mode: OpenGL userspace rendering or Screen() internal rendering? PsychCopyOutDoubleArg(2, FALSE, (double) PsychIsUserspaceRendering()); // Ready: return(PsychError_none); }
PsychError PSYCHHIDReceiveReportsStop(void) { long error=0; int deviceIndex; mxArray **outErr; PsychPushHelp(useString,synopsisString,seeAlsoString); if(PsychIsGiveHelp()){PsychGiveHelp();return(PsychError_none);}; PsychErrorExit(PsychCapNumOutputArgs(1)); PsychErrorExit(PsychCapNumInputArgs(1)); PsychCopyInIntegerArg(1,TRUE,&deviceIndex); error=ReceiveReportsStop(deviceIndex); outErr=PsychGetOutArgMxPtr(1); if(outErr!=NULL){ char *name="",*description=""; const char *fieldNames[]={"n", "name", "description"}; mxArray *fieldValue; PsychHIDErrors(NULL, error,&name,&description); // Get error name and description, if available. *outErr=mxCreateStructMatrix(1,1,3,fieldNames); fieldValue=mxCreateString(name); if(fieldValue==NULL)PrintfExit("Couldn't allocate \"err\"."); mxSetField(*outErr,0,"name",fieldValue); fieldValue=mxCreateString(description); if(fieldValue==NULL)PrintfExit("Couldn't allocate \"err\"."); mxSetField(*outErr,0,"description",fieldValue); fieldValue=mxCreateDoubleMatrix(1,1,mxREAL); if(fieldValue==NULL)PrintfExit("Couldn't allocate \"err\"."); *mxGetPr(fieldValue)=(double)error; mxSetField(*outErr,0,"n",fieldValue); } return(PsychError_none); }
PsychError COCOAEVENTBRIDGEListenForChars(void) { psych_bool loadBundleError, charAvail; int numKeypresses; //all subfunctions should have these two lines. PsychPushHelp(useString, synopsisString, seeAlsoString); if(PsychIsGiveHelp()){PsychGiveHelp();return(PsychError_none);}; loadBundleError=LoadCocoaBundle(); if(loadBundleError) PsychErrorExitMsg(PsychError_internal, "Failed to load the cocoa bundle."); //check to see if the user supplied superfluous arguments PsychErrorExit(PsychCapNumOutputArgs(1)); PsychErrorExit(PsychCapNumInputArgs(0)); //Open the window. OpenGetCharWindow() and MakeGetCharWindowInvisible() only act once if called repeatedly. OpenGetCharWindow(); #ifndef DEBUG_USE_VISIBLE_WINDOW MakeGetCharWindowInvisible(); #endif StartKeyGathering(); MakeKeyWindow(); return(PsychError_none); }
PsychError PSYCHHIDKbQueueStop(void) { PsychPushHelp(useString, synopsisString, seeAlsoString); if(PsychIsGiveHelp()){PsychGiveHelp();return(PsychError_none);}; PsychErrorExit(PsychCapNumOutputArgs(0)); PsychErrorExit(PsychCapNumInputArgs(0)); if(!hidDataRef){ PsychErrorExitMsg(PsychError_user, "Queue has not been created."); } { IOHIDQueueInterface **queue=(hidDataRef->hidQueueInterface); if(!queue){ PsychErrorExitMsg(PsychError_user, "Queue has not been created."); } { // Stop the queue HRESULT result = (*queue)->stop(queue); if (kIOReturnSuccess != result){ PsychErrorExitMsg(PsychError_system, "Failed to stop event queues."); } } } return(PsychError_none); }
PsychError SCREENTextStyle(void) { boolean doSetStyle; PsychWindowRecordType *windowRecord; int oldTextStyle, newTextStyle; //all subfunctions should have these two lines. PsychPushHelp(useString, synopsisString, seeAlsoString); if(PsychIsGiveHelp()){PsychGiveHelp();return(PsychError_none);}; //check for valid number of arguments PsychErrorExit(PsychRequireNumInputArgs(1)); PsychErrorExit(PsychCapNumInputArgs(2)); PsychErrorExit(PsychCapNumOutputArgs(1)); //Get the window record PsychAllocInWindowRecordArg(kPsychUseDefaultArgPosition, TRUE, &windowRecord); //Save the old text size value and return it. oldTextStyle=windowRecord->textAttributes.textStyle; PsychCopyOutDoubleArg(1, FALSE, (double)oldTextStyle); //Fetch and set the new size if it is specified. doSetStyle= PsychCopyInIntegerArg(2, FALSE, &newTextStyle); if(doSetStyle) windowRecord->textAttributes.textStyle=newTextStyle; return(PsychError_none); }
PsychError WAITSECSYieldSecs(void) { static char useString[] = "[realWakeupTimeSecs] = WaitSecs('YieldSecs', waitPeriodSecs);"; // 1 static char synopsisString[] = "Wait for at least \"waitPeriodSecs\", don't care if it takes a few milliseconds longer. " "Optionally, return the real wakeup time \"realWakeupTimeSecs\".\n" "This call is useful if you want your code to release the cpu for a few milliseconds, " "e.g., to avoid overloading the cpu in a spinning loop, and you don't care if the " "wait takes a few msecs longer than specified. If you do care, use one of the other " "WaitSecs() variants! The other variants emphasize accuracy of timed waits, even if " "this causes a high load on the processor.\n"; static char seeAlsoString[] = ""; double waitPeriodSecs; double now; //all sub functions should have these two lines PsychPushHelp(useString, synopsisString,seeAlsoString); if(PsychIsGiveHelp()){PsychGiveHelp();return(PsychError_none);}; //check to see if the user supplied superfluous arguments PsychErrorExit(PsychCapNumOutputArgs(1)); PsychErrorExit(PsychCapNumInputArgs(1)); PsychCopyInDoubleArg(1,TRUE,&waitPeriodSecs); PsychYieldIntervalSeconds(waitPeriodSecs); // Return current system time at end of sleep: PsychGetAdjustedPrecisionTimerSeconds(&now); PsychCopyOutDoubleArg(1, FALSE, now); return(PsychError_none); }
PsychError COCOAEVENTBRIDGEPathToBundle(void) { Boolean isNewArgThereFlag; int newNameLength; char *tempBundleFilePathNameStr, *localBundleFilePathNameStr; //all subfunctions should have these two lines. PsychPushHelp(useString, synopsisString, seeAlsoString); if(PsychIsGiveHelp()){PsychGiveHelp();return(PsychError_none);}; //check to see if the user supplied superfluous arguments PsychErrorExit(PsychCapNumOutputArgs(1)); PsychErrorExit(PsychCapNumInputArgs(1)); //first copy out the old path GetPathToBundleString(&localBundleFilePathNameStr); PsychCopyOutCharArg(1, kPsychArgOptional, localBundleFilePathNameStr); //read in and retain the new name. It arrives in a temporary variable isNewArgThereFlag=PsychAllocInCharArg(1, kPsychArgOptional, &tempBundleFilePathNameStr); if(isNewArgThereFlag){ newNameLength=strlen(tempBundleFilePathNameStr); if(bundleFilePathNameStr != NULL) free((void*)bundleFilePathNameStr); bundleFilePathNameStr=(char*)malloc(sizeof(char) * (newNameLength + 1)); strncpy(bundleFilePathNameStr, tempBundleFilePathNameStr, newNameLength + 1); } return(PsychError_none); }
PsychError SCREENRect(void) { PsychWindowRecordType *windowRecord; int screenNumber; PsychRectType rect; //all sub functions should have these two lines PsychPushHelp(useString, synopsisString,seeAlsoString); if(PsychIsGiveHelp()){PsychGiveHelp();return(PsychError_none);}; //check for superfluous arguments PsychErrorExit(PsychCapNumInputArgs(1)); //The maximum number of inputs PsychErrorExit(PsychRequireNumInputArgs(1)); //Insist that the argument be present. PsychErrorExit(PsychCapNumOutputArgs(1)); //The maximum number of outputs if(PsychIsScreenNumberArg(1)){ PsychCopyInScreenNumberArg(1, TRUE, &screenNumber); PsychGetScreenRect(screenNumber, rect); PsychCopyOutRectArg(1, FALSE, rect); }else if(PsychIsWindowIndexArg(1)){ PsychAllocInWindowRecordArg(1, TRUE, &windowRecord); PsychOSProcessEvents(windowRecord, 0); PsychCopyOutRectArg(1,FALSE, windowRecord->clientrect); }else PsychErrorExitMsg(PsychError_user, "Argument was recognized as neither a window index nor a screen pointer"); return(PsychError_none); }
// M$-Windows implementation of Screen('Computer'): This is very rudimentary for now. // We only report the operating sytem type (="Windows") and MAC-Address, but don't report any more useful // information. MAC query does not work yet - We do not have the neccessary libraries to compile the code :( PsychError SCREENComputer(void) { // Info struct for queries to OS: OSVERSIONINFO osvi; char versionString[256]; // const char *majorStructFieldNames[]={"macintosh", "windows", "osx" ,"linux", "kern", "hw", "processUserLongName", // "processUserShortName", "consoleUserName", "machineName", "localHostName", "location", "MACAddress", "system" }; const char *majorStructFieldNames[]={"macintosh", "windows", "osx" ,"linux", "system", "IsVistaClass", "gstreamer", "supported"}; const char *kernStructFieldNames[]={"ostype", "osrelease", "osrevision", "version","hostname"}; const char *hwStructFieldNames[]={"machine", "model", "ncpu", "physmem", "usermem", "busfreq", "cpufreq"}; int numMajorStructDimensions=1, numKernStructDimensions=1, numHwStructDimensions=1; int numMajorStructFieldNames=8, numKernStructFieldNames=5, numHwStructFieldNames=7; PsychGenericScriptType *majorStruct; //all subfunctions should have these two lines PsychPushHelp(useString, synopsisString, seeAlsoString); if(PsychIsGiveHelp()){PsychGiveHelp();return(PsychError_none);}; PsychErrorExit(PsychCapNumOutputArgs(1)); PsychErrorExit(PsychCapNumInputArgs(0)); //fill the major struct PsychAllocOutStructArray(1, FALSE, numMajorStructDimensions, numMajorStructFieldNames, majorStructFieldNames, &majorStruct); PsychSetStructArrayDoubleElement("macintosh", 0, 0, majorStruct); PsychSetStructArrayDoubleElement("windows", 0, 1, majorStruct); PsychSetStructArrayDoubleElement("linux", 0, 0, majorStruct); PsychSetStructArrayDoubleElement("osx", 0, 0, majorStruct); // Official support status: PsychSetStructArrayStringElement("supported", 0, (char*) PsychSupportStatus(), majorStruct); // GStreamer availability and rough version: #if defined(PTB_USE_GSTREAMER) #if GST_CHECK_VERSION(1,0,0) PsychSetStructArrayDoubleElement("gstreamer", 0, 1 * 10000 + 0 * 100 + 0, majorStruct); #else PsychSetStructArrayDoubleElement("gstreamer", 0, 0 * 10000 + 10 * 100 + 0, majorStruct); #endif #else PsychSetStructArrayDoubleElement("gstreamer", 0, 0, majorStruct); #endif // Query info about Windows version: versionString[0]=0; memset(&osvi, 0, sizeof(OSVERSIONINFO)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&osvi); // Convert into string with major.minor.buildnumber - Name of service packs (max 128 chars) etc.: // Versions to products: 6.1 = Windows-7, 6.0 = Vista, 5.2 = Windows Server 2003, 5.1 = WindowsXP, 5.0 = Windows 2000, 4.x = NT sprintf(versionString, "NT-%i.%i.%i - %s", osvi.dwMajorVersion, osvi.dwMinorVersion, osvi.dwBuildNumber, (char*) osvi.szCSDVersion); PsychSetStructArrayStringElement("system", 0, versionString, majorStruct); PsychSetStructArrayDoubleElement("IsVistaClass", 0, (PsychIsMSVista() ? 1 : 0), majorStruct); return(PsychError_none); }
PsychError SCREENglPoint(void) { PsychColorType color; double *xPosition, *yPosition, dotSize; PsychWindowRecordType *windowRecord; int whiteValue; psych_bool isArgThere; //all sub functions should have these two lines PsychPushHelp(useString, synopsisString,seeAlsoString); if(PsychIsGiveHelp()){PsychGiveHelp();return(PsychError_none);}; //check for superfluous arguments PsychErrorExit(PsychCapNumInputArgs(5)); //The maximum number of inputs PsychErrorExit(PsychCapNumOutputArgs(0)); //The maximum number of outputs //get the window record from the window record argument and get info from the window record PsychAllocInWindowRecordArg(kPsychUseDefaultArgPosition, TRUE, &windowRecord); //Get the color argument or use the default, then coerce to the form determened by the window depth. isArgThere=PsychCopyInColorArg(kPsychUseDefaultArgPosition, FALSE, &color); if(!isArgThere){ whiteValue=PsychGetWhiteValueFromWindow(windowRecord); PsychLoadColorStruct(&color, kPsychIndexColor, whiteValue ); //index mode will coerce to any other. } PsychCoerceColorMode( &color); //get the x and y position values. PsychAllocInDoubleArg(3, TRUE, &xPosition); PsychAllocInDoubleArg(4, TRUE, &yPosition); dotSize=1; //set the default PsychCopyInDoubleArg(5, FALSE, &dotSize); // Enable this windowRecords framebuffer as current drawingtarget: PsychSetDrawingTarget(windowRecord); // Set default draw shader: PsychSetShader(windowRecord, -1); PsychUpdateAlphaBlendingFactorLazily(windowRecord); PsychSetGLColor(&color, windowRecord); glEnable(GL_POINT_SMOOTH); glPointSize((float)dotSize); glBegin(GL_POINTS); glVertex2d( (GLdouble)*xPosition, *yPosition); glEnd(); glDisable(GL_POINT_SMOOTH); glPointSize(1); // Mark end of drawing op. This is needed for single buffered drawing: PsychFlushGL(windowRecord); //All psychfunctions require this. return(PsychError_none); }
PsychError SCREENgluDisk(void) { PsychColorType color; double *xPosition, *yPosition, dotSize; PsychWindowRecordType *windowRecord; int depthValue, whiteValue, colorPlaneSize, numColorPlanes; boolean isArgThere; GLUquadricObj *diskQuadric; //all sub functions should have these two lines PsychPushHelp(useString, synopsisString,seeAlsoString); if(PsychIsGiveHelp()){PsychGiveHelp();return(PsychError_none);}; //check for superfluous arguments PsychErrorExit(PsychCapNumInputArgs(5)); //The maximum number of inputs PsychErrorExit(PsychCapNumOutputArgs(0)); //The maximum number of outputs //get the window record from the window record argument and get info from the window record PsychAllocInWindowRecordArg(kPsychUseDefaultArgPosition, TRUE, &windowRecord); //Get the depth from the window, we need this to interpret the color argument. depthValue=PsychGetWindowDepthValueFromWindowRecord(windowRecord); numColorPlanes=PsychGetNumPlanesFromDepthValue(depthValue); colorPlaneSize=PsychGetColorSizeFromDepthValue(depthValue); //Get the color argument or use the default, then coerce to the form determened by the window depth. isArgThere=PsychCopyInColorArg(kPsychUseDefaultArgPosition, FALSE, &color); if(!isArgThere){ whiteValue=PsychGetWhiteValueFromDepthValue(depthValue); PsychLoadColorStruct(&color, kPsychIndexColor, whiteValue ); //index mode will coerce to any other. } PsychCoerceColorModeFromSizes(numColorPlanes, colorPlaneSize, &color); //get the x and y position values. PsychAllocInDoubleArg(3, TRUE, &xPosition); PsychAllocInDoubleArg(4, TRUE, &yPosition); dotSize=1; //set the default PsychCopyInDoubleArg(5, FALSE, &dotSize); //Set the color and draw the rect. Note that all GL drawing commands should be sandwiched between PsychSetGLContext(windowRecord); PsychUpdateAlphaBlendingFactorLazily(windowRecord); PsychSetGLColor(&color, depthValue); glPushMatrix(); glTranslated(*xPosition,*yPosition,0); diskQuadric=gluNewQuadric(); gluDisk(diskQuadric, 0, dotSize, 30, 30); gluDeleteQuadric(diskQuadric); glPopMatrix(); //PsychGLRect(rect); PsychFlushGL(windowRecord); //OS X: This does nothing if we are multi buffered, otherwise it glFlushes //All psychfunctions require this. return(PsychError_none); }