void main( int argc, char** argv) { //struct Position Pos; int Ix; strcpy( ConfigFile, "config.dat"); Parity = NoneParity; DataBits = 8; StopBits = 1; CalledByGuideFlag = No; KeepGoingFlag = No; ReadSlewFlag = No; StartScrollFlag = No; /* if '-k' and '-s' (after full init): slew to Ra, Dec in slew.dat and keep going, exiting when desired, writing slew_out.dat file; if '-k' (before full init): (no slew.dat), keep going until centered on init position, write slew_out.dat file and exit; if '-s': slew to Ra, Dec in slew.dat and exit, writing slew_out.dat file; if no '-k' and no '-s': write slew_out.dat file and exit; if -c, then use following string as configuration file name, ie scope.exe -c config.dat will result in config.dat being used if -x, then use following string as scroll file name, and execute scroll file upon program startup, ie scope.exe -x nan.scr will cause nan.scr to be loaded and started */ /* argv[0] is name of executing program */ for( Ix = 1; Ix < argc; Ix++) if( argv[Ix][0] == '-') if( strcmpi( &argv[Ix][1], "GUIDE") == 0) CalledByGuideFlag = Yes; else if( argv[Ix][1] == 'k') KeepGoingFlag = Yes; else if( argv[Ix][1] == 's') ReadSlewFlag = Yes; else if( (argv[Ix][1] == 'c' || argv[Ix][1] == 'C') && Ix < argc-1) strcpy( ConfigFile, argv[Ix+1]); else if( (argv[Ix][1] == 'x' || argv[Ix][1] == 'X') && Ix < argc-1) { strcpy( ScrollFilename, argv[Ix+1]); StartScrollFlag = Yes; } InitCommonVars(); ReadConfig(); /* Pos.Ra = Pos.Dec = 0; applyCorrectionsFromDataFileCoordYearToEpochNow(&Pos); printf("\n%f %f %f %f %f %f %f %f", Pos.Precession.A*RadToArcsec, Pos.Precession.Z*RadToArcsec, Pos.Nutation.A*RadToArcsec, Pos.Nutation.Z*RadToArcsec, Pos.AnnualAberration.A*RadToArcsec, Pos.AnnualAberration.Z*RadToArcsec, Pos.Ra*RadToArcsec, Pos.Dec*RadToArcsec); ContMsgRoutine(); */ /* HsRecFile = fopen( HsRecFilename, "w"); if( HsRecFile == NULL) BadExit( strcat( "Could not create ", HsRecFilename)); HsRecIx = 0; */ /* InitTimes( DisplayOpeningMsgs, Tz, DST, LongitudeDeg); InitConvert(); TestConvert(); getch(); TestAltAltAzTrack(); */ if( DisplayOpeningMsgs) { printf( "\nCopyright BBAstroDesigns Inc. 2009\n"); printf( "\nLIMITED WARRANTY This software is provided ``as is'' and any express or"); printf( "\nimplied warranties, including, but not limited to, the implied warranties"); printf( "\nof merchantability and fitness for a particular purpose are disclaimed."); printf( "\nIn no event shall BBAstroDesigns be liable for any direct, indirect,"); printf( "\nincidental, special, exemplary, nor consequential damages (including, but"); printf( "\nnot limited to, procurement of substitute goods or services, loss of use,"); printf( "\ndate, or profits, or business interruption) however caused and on any"); printf( "\ntheory of liability, whether in contract, strict liability, or tort"); printf( "\n(including negligence or otherwise) arising in any way out of the use of"); printf( "\nthis software, even if advised of the possibility of such damage.\n"); printf( "\nThis software licensed under the GNU GENERAL PUBLIC LICENSE. You may"); printf( "\ndistribute this software per the GNU GPL. See the enclosed gpl.txt.\n\n"); ContMsgRoutine(); } if( DisplayOpeningMsgs) printf( "\ncalled by guide: %d, keep_going: %d, read slew.dat file %d", CalledByGuideFlag, KeepGoingFlag, ReadSlewFlag); /* if( strcmpi( TestString, "TestSerial") == 0) { InitSerial( EncoderComPort, EncoderBaudRate, Parity, DataBits, StopBits); TestSerial( EncoderComPort); CloseSerial( EncoderComPort); } */ /* else if( strcmpi( TestString, "TestVideo") == 0) { InitVideo( DisplayOpeningMsgs); TestVideo(); } */ /* else if( strcmpi( TestString, "TestATimes") == 0) { InitTimes( DisplayOpeningMsgs, Tz, DST, LongitudeDeg); TestTimes(); } */ /* else if( strcmpi( TestString, "TestParallelPort") == 0) { InitPPort(); TestPPort(); ClosePPort(); } */ /* else if( strcmpi( TestString, "TestRefract") == 0) { InitRefract(); TestRefract(); } */ /* else if( strcmpi( TestString, "TestMouse") == 0) { TestMouse(); } */ /* else if( strcmpi( TestString, "TestEncoders") == 0) { InitSerial( EncoderComPort, EncoderBaudRate, Parity, DataBits, StopBits); InitEncoders(); TestEncoders(); CloseSerial( EncoderComPort); } */ /* else if( strcmpi( TestString, "TestHandpad") == 0) { InitPPort(); InitializeHandpad(); TestHandpad(); ClosePPort(); } */ /* else if( strcmpi( TestString, "TestConversion") == 0) { InitTimes( DisplayOpeningMsgs, Tz, DST, LongitudeDeg); InitConvert(); TestConvert(); } */ /* else if( strcmpi( TestString, "TestAltOffset") == 0) { InitTimes( DisplayOpeningMsgs, Tz, DST, LongitudeDeg); InitConvert(); TestAltOffset(); } */ /* else if( strcmpi( TestString, "TestIACA") == 0) { InitTimes( DisplayOpeningMsgs, Tz, DST, LongitudeDeg); TestIACA(); InitIACA(); } */ /* else if( strcmpi( TestString, "WritePWMValues") == 0) { InitTimes( DisplayOpeningMsgs, Tz, DST, LongitudeDeg); InitVideo( DisplayOpeningMsgs); InitPPort(); InitMotors(); WritePWMValues(); CloseSteppers(); ClosePPort(); } else */ { if( strcmpi( TestString, "NoTest") != 0 && strcmpi( TestString, "PreloadGuidexx.dat") != 0 && strcmpi( TestString, "Track") != 0) { if( DisplayOpeningMsgs) printf( "\nsetting unrecognized TestString to 'NoTest'"); strcpy( TestString, "NoTest"); } InitSerial( EncoderComPort, EncoderBaudRate, Parity, DataBits, StopBits); InitEncoders(); InitMouseControl(); InitTimes( DisplayOpeningMsgs, Tz, DST, LongitudeDeg); InitVideo( DisplayOpeningMsgs); InitPPort(); InitializeHandpad(); InitMotors(); InitConvert(); InitRefract(); InitPEC(); InitGuide(); if( strcmpi( TestString, "PreloadGuidexx.dat") == 0) { LoadGuideAlts(); LoadGuideAzs(); } InitIACA(); InitLX200Input(); InitHPEvent(); if( !CalledByGuideFlag || (CalledByGuideFlag && (KeepGoingFlag || ReadSlewFlag))) { InitKBEvent(); if( ReadSlewFlag) InputEquatSlewDat(); if( StartScrollFlag) LoadScrollFileFromFile(); if( strcmpi( TestString, "Track") == 0) Start2MotorTrackWithDefaultValues(); while( !QuitFlag) { SequentialTaskController(); /* GrandTourFlag used to flag next object: set in ProcessHPEventsModeSwitch() */ if( GrandTourLoaded && GrandTourFlag) ProcessGrandTour(); else if( ScrollLoaded && ScrollFlag) ProcessScroll(); else if( HPPolarAlignLoaded && HPPolarAlignFlag) ProcessHPPolarAlign(); else { if( UseMouseFlag && ProcessMouseEvent()) ; else if( KeyStroke) ProcessKBEvents(); else ProcessHPEvents(); } } CloseKBEvent(); if( DisplayOpeningMsgs) { AskAndWriteConfig(); WriteLogFile(); } } CloseSteppers(); ClosePPort(); CloseEncoderResetLogFile(); CloseSerial( EncoderComPort); CloseSerial( LX200ComPort); if( CalledByGuideFlag) WriteAltazSlewOutFile(); CloseMouseControl(); } /* for( Ix = 0; Ix < HsRecSize; Ix++) fprintf( HsRecFile, "%8ld %8ld\n", HsRec[Ix].A, HsRec[Ix].Z); // first position is index 0 fprintf( HsRecFile, " last entry in circular queue at position %d", HsRecIx); fclose( HsRecFile); */ }
void UIScrollView::Input(UIEvent *currentTouch) { // if(currentTouch->tapCount == 2 && currentTouch->phase == UIControlTouch::PHASE_BEGAN) // { // float32 targetScale; // if(zoomScale < maxScale) // { // //zoom in // targetScale = maxScale; // } // else // { // targetScale = minScale; // } // LinearAnimation<float32> * scaleAnimation = new LinearAnimation<float32>(this, &zoomScale, targetScale, 0.5f, // Interpolation::EASY_IN_EASY_OUT); // scaleAnimation->Start(0); // // // { // float32 multScale = targetScale/zoomScale; // // if(targetScale < zoomScale) // { // LinearAnimation<float32> * xAnim = new LinearAnimation<float32>(this, &scrollOrigin.x, scrollZero.x, 0.5f, Interpolation::EASY_IN_EASY_OUT); // LinearAnimation<float32> * yAnim = new LinearAnimation<float32>(this, &scrollOrigin.y, scrollZero.y, 0.5f, Interpolation::EASY_IN_EASY_OUT); // xAnim->Start(1); // yAnim->Start(2); // } // else // { // Point2f adjPoint = Point2f(currentTouch->point.x*multScale, currentTouch->point.y*multScale); // Point2f delta = Point2f(adjPoint.x - currentTouch->point.x, adjPoint.y - currentTouch->point.y); // // LinearAnimation<float32> * xAnim = new LinearAnimation<float32>(this, &scrollOrigin.x, scrollOrigin.x-delta.x, 0.5f, Interpolation::EASY_IN_EASY_OUT); // LinearAnimation<float32> * yAnim = new LinearAnimation<float32>(this, &scrollOrigin.y, scrollOrigin.y-delta.y, 0.5f, Interpolation::EASY_IN_EASY_OUT); // // xAnim->Start(1); // yAnim->Start(2); // } // } // } // int32 saveState = state; Vector<UIEvent> touches = UIControlSystem::Instance()->GetAllInputs(); if(1 == touches.size()) { bool spaceIsPressed = InputSystem::Instance()->GetKeyboard()->IsKeyPressed(DVKEY_SPACE); // bool spaceIsPressed = false; if(!spaceIsPressed) { for(List<UIControl*>::iterator it = childs.begin(); it != childs.end(); ++it) { (*it)->Input(currentTouch); } return; } switch(currentTouch->phase) { case UIEvent::PHASE_BEGAN: { scrollTouch = *currentTouch; Vector2 start = currentTouch->point; StartScroll(start); // init scrolling speed parameters scrollPixelsPerSecond = 0.0f; scrollStartTime = currentTouch->timestamp;//to avoid cast from uint64 to float64 SystemTimer::Instance()->AbsoluteMS(); touchStartTime = SystemTimer::Instance()->AbsoluteMS(); state = STATE_SCROLL; clickStartPosition = start; } break; case UIEvent::PHASE_DRAG: { if(state == STATE_SCROLL) { if(currentTouch->tid == scrollTouch.tid) { // scrolling speed get parameters float64 scrollCurrentTime = currentTouch->timestamp;//SystemTimer::Instance()->AbsoluteMS(); Vector2 scrollPrevPosition = scrollCurrentPosition; // perform scrolling ProcessScroll(currentTouch->point); // calculate scrolling speed float64 tmp = scrollCurrentTime; if(fabs(scrollCurrentTime - scrollStartTime) < 1e-9) { tmp += .1f; } Vector2 lineLength = scrollCurrentPosition - scrollPrevPosition; scrollPixelsPerSecond = (float32)((float64)lineLength.Length() / (tmp - scrollStartTime)); scrollStartTime = scrollCurrentTime; ///NSLog(@"pps:%f\n", scrollPixelsPerSecond); } } } break; case UIEvent::PHASE_ENDED: { if(state == STATE_SCROLL) { if(currentTouch->tid == scrollTouch.tid) { Vector2 scrollPrevPos = lastMousePositions[(positionIndex - 3) & (MAX_MOUSE_POSITIONS - 1)]; Vector2 currentTouchPos = currentTouch->point; deccelerationSpeed = Vector2(currentTouchPos.x, currentTouchPos.y); deccelerationSpeed.x -= scrollPrevPos.x; deccelerationSpeed.y -= scrollPrevPos.y; float32 deccelerationSpeedLen = sqrtf(deccelerationSpeed.x * deccelerationSpeed.x + deccelerationSpeed.y * deccelerationSpeed.y); if (deccelerationSpeedLen >= 0.00001f) { deccelerationSpeed.x /= deccelerationSpeedLen; deccelerationSpeed.y /= deccelerationSpeedLen; } else { deccelerationSpeed.x = 0.0f; deccelerationSpeed.y = 0.0f; } //Logger::Debug("Dcs: %f, %f\n", deccelerationSpeed.x, deccelerationSpeed.y); EndScroll(); //scrollTouch = 0; if(scrollStartMovement) { state = STATE_DECCELERATION; } clickEndPosition = currentTouchPos; } if(touchStartTime) { touchStartTime = 0; PerformScroll(); } // float32 clickLen = LineLength(clickStartPosition, clickEndPosition); // if (clickLen < SCROLL_BEGIN_PIXELS) // { // clickEndPosition.x -= (scrollOrigin.x); // clickEndPosition.y -= (scrollOrigin.y); // // clickEndPosition.x /= zoomScale; // clickEndPosition.y /= zoomScale; // // UIControlTouch modifiedTouch = *currentTouch; // modifiedTouch.point = clickEndPosition; // // ScrollTouch(&modifiedTouch); // } } } break; } } else if(2 == touches.size()) { switch(currentTouch->phase) { case UIEvent::PHASE_BEGAN: { if (state == STATE_SCROLL) { EndScroll(); //scrollTouch = 0; } // init zoom parameters state = STATE_ZOOM; zoomTouches[0] = touches[0]; zoomTouches[1] = touches[1]; zoomStartPositions[0] = zoomTouches[0].point; zoomStartPositions[1] = zoomTouches[1].point; prevZoomScale = zoomScale; // save current scale to perform scaling in zoom mode } break; case UIEvent::PHASE_DRAG: if(state == STATE_ZOOM) { zoomTouches[0] = touches[0]; zoomTouches[1] = touches[1]; zoomCurrentPositions[0] = zoomTouches[0].point; zoomCurrentPositions[1] = zoomTouches[1].point; float initialDistance = sqrtf( (zoomStartPositions[0].x - zoomStartPositions[1].x) * (zoomStartPositions[0].x - zoomStartPositions[1].x) + (zoomStartPositions[0].y - zoomStartPositions[1].y) * (zoomStartPositions[0].y - zoomStartPositions[1].y)); float currentDistance = sqrtf( (zoomCurrentPositions[0].x - zoomCurrentPositions[1].x) * (zoomCurrentPositions[0].x - zoomCurrentPositions[1].x) + (zoomCurrentPositions[0].y - zoomCurrentPositions[1].y) * (zoomCurrentPositions[0].y - zoomCurrentPositions[1].y)); float32 saveZoomScale = zoomScale; float32 changeCoeff = initialDistance/currentDistance; float32 newScale = prevZoomScale * ((1.f - changeCoeff)/2.5f + 1.f); //float32 changeCoeff = currentDistance/initialDistance; //float32 newScale = prevZoomScale * changeCoeff * changeCoeff; if(newScale > maxScale)newScale = maxScale; if(newScale < minScale)newScale = minScale; SetScale(newScale); Vector2 center = Vector2((zoomStartPositions[0].x + zoomStartPositions[1].x) / 2, (zoomStartPositions[0].y + zoomStartPositions[1].y) / 2); Vector2 scaleVectorOriginal = Vector2(center.x - scrollOrigin.x, center.y - scrollOrigin.y); Vector2 scaleVectorNew = scaleVectorOriginal; scaleVectorNew.x *= zoomScale / saveZoomScale; scaleVectorNew.y *= zoomScale / saveZoomScale; scaleVectorNew.x -= scaleVectorOriginal.x; scaleVectorNew.y -= scaleVectorOriginal.y; scrollOrigin.x -= scaleVectorNew.x; scrollOrigin.y -= scaleVectorNew.y; } break; case UIEvent::PHASE_ENDED: { Vector<UIEvent>::iterator it = touches.begin(); bool zoomToScroll = false; for(; it != touches.end(); ++it) { if((*it).phase == UIEvent::PHASE_DRAG) { zoomToScroll = true; scrollTouch = *it; } } if(zoomToScroll) { //scrollTouch = *it; Vector2 start = scrollTouch.point; StartScroll(start); state = STATE_SCROLL; //zoomTouches[0] = 0; //zoomTouches[1] = 0; } else { if (state != STATE_DECCELERATION) { state = STATE_NONE; } } } break; } } // if (saveState == state) // { // Logger::Debug("event: %d prevState: %d resultState: %d - alltouches: %d", currentTouch->phase, saveState, state, touches.size()); // }else // Logger::Debug("CHANGED: event: %d prevState: %d resultState: %d - alltouches: %d", currentTouch->phase, saveState, state, touches.size()); }