private void MakeUpDot(bool isError = true) { if (isError) { var errorDot = mPrevDot.Clone(); errorDot.DotType = DotTypes.PEN_ERROR; Callback.onErrorDetected(this, ErrorType.MissingPenUp, PenDownTime, errorDot, null); } var udot = mPrevDot.Clone(); udot.DotType = DotTypes.PEN_UP; ProcessDot(udot); }
public void Clone_Dot_ReturnsNewDotWithSameValues() { var dot = new Dot(); Dot newDot = dot.Clone(); Assume.That(newDot, Is.Not.SameAs(dot)); Assume.That(newDot.Value, Is.EqualTo(dot.Value)); Assume.That(newDot.Active, Is.EqualTo(dot.Active)); Assume.That(newDot.Chain, Is.EqualTo(dot.Chain)); Assume.That(newDot.Closed, Is.EqualTo(dot.Closed)); Assume.That(newDot.ChainValue, Is.EqualTo(dot.ChainValue)); }
public Triangle(Dot A, Dot B, Dot C) { this.A = (Dot)A.Clone(); this.B = (Dot)B.Clone(); this.C = (Dot)C.Clone(); }
private void ParsePacket(IPacket pk) { switch ((Cmd)pk.Cmd) { case Cmd.A_DotData: { long time = pk.GetByteToInt(); int x = pk.GetShort(); int y = pk.GetShort(); int fx = pk.GetByteToInt(); int fy = pk.GetByteToInt(); int force = pk.GetByteToInt(); long timeLong = mPrevDotTime + time; if (!IsStartWithDown || timeLong < 10000) { System.Console.WriteLine("[PenCommCore] this stroke start with middle dot."); return; } Dot.Builder builder = new Dot.Builder(); builder.owner(mOwnerId) .section(mSectionId) .note(mNoteId) .page(mPageId) .timestamp(timeLong) .coord(x, fx, y, fy) .force(force) .color(mCurrentColor); if (IsPrevDotDown) { // 펜업의 경우 시작 도트로 저장 builder.dotType(DotTypes.PEN_DOWN); IsPrevDotDown = false; } else { // 펜업이 아닌 경우 미들 도트로 저장 builder.dotType(DotTypes.PEN_MOVE); } Dot dot = builder.Build(); ProcessDot(dot); mPrevDot = dot; mPrevDotTime = timeLong; IsBeforeMiddle = true; } break; case Cmd.A_DotUpDownDataNew: case Cmd.A_DotUpDownData: { long updownTime = pk.GetLong(); int updown = pk.GetByteToInt(); byte[] cbyte = pk.GetBytes(3); mCurrentColor = ByteConverter.ByteToInt(new byte[] { cbyte[2], cbyte[1], cbyte[0], (byte)0xFF }); if (updown == 0x00) { // 펜 다운 일 경우 Start Dot의 timestamp 설정 mPrevDotTime = updownTime; IsPrevDotDown = true; IsStartWithDown = true; //Callback.onUpDown( this, false ); } else if (updown == 0x01) { if (mPrevDot != null) { var udot = mPrevDot.Clone(); udot.DotType = DotTypes.PEN_UP; ProcessDot(udot); } IsStartWithDown = false; } IsBeforeMiddle = false; mPrevDot = null; } break; case Cmd.A_DotIDChange: // 미들도트 중에 페이지가 바뀐다면 강제로 펜업을 만들어 준다. if (IsBeforeMiddle) { var audot = mPrevDot.Clone(); audot.DotType = DotTypes.PEN_UP; ProcessDot(audot); } byte[] rb = pk.GetBytes(4); mSectionId = (int)(rb[3] & 0xFF); mOwnerId = ByteConverter.ByteToInt(new byte[] { rb[0], rb[1], rb[2], (byte)0x00 }); mNoteId = pk.GetInt(); mPageId = pk.GetInt(); IsPrevDotDown = true; break; case Cmd.A_PenOnState: pk.Move(8); int STATUS = pk.GetByteToInt(); int FORCE_MAX = pk.GetByteToInt(); string SW_VER = pk.GetString(5); if (STATUS == 0x00) { SendPenOnOffData(); Clean(); } else if (STATUS == 0x01) { Reset(); SendPenOnOffData(); SendRTCData(); needToInputDefaultPassword = true; Callback.onConnected(this, FORCE_MAX, SW_VER); } break; case Cmd.A_RTCsetResponse: break; case Cmd.A_PenStatusResponse: if (!Authenticated) { Authenticated = true; needToInputDefaultPassword = false; Callback.onPenAuthenticated(this); } pk.Move(2); int stat_timezone = pk.GetInt(); long stat_timetick = pk.GetLong(); int stat_forcemax = pk.GetByteToInt(); int stat_battery = pk.GetByteToInt(); int stat_usedmem = pk.GetByteToInt(); int stat_pencolor = pk.GetInt(); bool stat_autopower = pk.GetByteToInt() == 2 ? false : true; bool stat_accel = pk.GetByteToInt() == 2 ? false : true; bool stat_hovermode = pk.GetByteToInt() == 2 ? false : true; bool stat_beep = pk.GetByteToInt() == 2 ? false : true; short stat_autoshutdowntime = pk.GetShort(); short stat_pensensitivity = pk.GetShort(); string model_name = string.Empty; if (pk.CheckMoreData()) { int model_name_length = pk.GetByte(); model_name = pk.GetString(model_name_length); } Callback.onReceivedPenStatus(this, stat_timezone, stat_timetick, stat_forcemax, stat_battery, stat_usedmem, stat_pencolor, stat_autopower, stat_accel, stat_hovermode, stat_beep, stat_autoshutdowntime, stat_pensensitivity, model_name); break; // 오프라인 데이터 크기,갯수 전송 case Cmd.A_OfflineDataInfo: mOfflineTotalFileCount = pk.GetInt(); mOfflineTotalDataSize = pk.GetInt(); System.Console.WriteLine("[PenCommCore] A_OfflineDataInfo : {0}, {1}", mOfflineTotalFileCount, mOfflineTotalDataSize); Callback.onStartOfflineDownload(this); IsStartOfflineTask = true; break; // 오프라인 전송 최종 결과 응답 case Cmd.A_OfflineResultResponse: int result = pk.GetByteToInt(); //System.Console.WriteLine( "[PenCommCore] A_OfflineDataResponse : {0}", result ); IsStartOfflineTask = false; Callback.onFinishedOfflineDownload(this, result == 0x00 ? false : true); mOfflineworker.onFinishDownload(); mOfflineRcvDataSize = 0; break; // 오프라인 파일 정보 case Cmd.A_OfflineFileInfo: mOfflineFileName = pk.GetString(128); mOfflineFileSize = pk.GetInt(); mOfflinePacketCount = pk.GetShort(); mOfflinePacketSize = pk.GetShort(); System.Console.WriteLine("[PenCommCore] offline file transfer is started ( name : " + mOfflineFileName + ", size : " + mOfflineFileSize + ", packet_qty : " + mOfflinePacketCount + ", packet_size : " + mOfflinePacketSize + " )"); mOfflineDataBuilder = null; mOfflineDataBuilder = new OfflineDataSerializer(mOfflineFileName, mOfflinePacketCount, mOfflineFileName.Contains(".zip") ? true : false); SendOfflineInfoResponse(); break; // 오프라인 파일 조각 전송 case Cmd.A_OfflineChunk: int index = pk.GetShort(); // 체크섬 필드 byte cs = pk.GetByte(); // 체크섬 계산 byte calcChecksum = pk.GetChecksum(); // 오프라인 데이터 byte[] data = pk.GetBytes(); // 체크섬이 틀리거나, 카운트, 사이즈 정보가 맞지 않으면 버린다. if (cs == calcChecksum && mOfflinePacketCount > index && mOfflinePacketSize >= data.Length) { mOfflineDataBuilder.Put(data, index); // 만약 Chunk를 다 받았다면 offline data를 처리한다. if (mOfflinePacketCount == mOfflineDataBuilder.chunks.Count) { string output = mOfflineDataBuilder.MakeFile(); if (output != null) { SendOfflineChunkResponse((short)index); mOfflineworker.onCreateFile(mOfflineDataBuilder.sectionId, mOfflineDataBuilder.ownerId, mOfflineDataBuilder.noteId, output); } mOfflineDataBuilder = null; } else { SendOfflineChunkResponse((short)index); } mOfflineRcvDataSize += data.Length; if (mOfflineTotalDataSize > 0) { System.Console.WriteLine("[PenCommCore] mOfflineRcvDataSize : " + mOfflineRcvDataSize); Callback.onUpdateOfflineDownload(this, mOfflineTotalDataSize, mOfflineRcvDataSize); } } else { System.Console.WriteLine("[PenCommCore] offline data file verification failed ( index : " + index + " )"); } break; case Cmd.A_UsingNoteNotifyResponse: //System.Console.WriteLine( "[PenCommCore] CMD.A_UsingNoteNotifyResponse" ); break; case Cmd.A_OfflineNoteListResponse: { int status = pk.GetByteToInt(); byte[] rxb = pk.GetBytes(4); int section = (int)(rxb[3] & 0xFF); int owner = ByteConverter.ByteToInt(new byte[] { rxb[0], rxb[1], rxb[2], (byte)0x00 }); int noteCnt = pk.GetByteToInt(); for (int i = 0; i < noteCnt; i++) { int note = pk.GetInt(); mOfflineNotes.Add(new OfflineDataInfo(section, owner, note)); } if (status == 0x01) { OfflineDataInfo[] array = mOfflineNotes.ToArray(); Callback.onOfflineDataList(this, array); mOfflineNotes.Clear(); } else { Callback.onOfflineDataList(this, new OfflineDataInfo[0]); } } break; case Cmd.A_OfflineDataRemoveResponse: //System.Console.WriteLine( "[PenCommCore] CMD.A_OfflineDataRemoveResponse" ); break; case Cmd.A_PasswordRequest: { int countRetry = pk.GetByteToInt(); int countReset = pk.GetByteToInt(); System.Console.WriteLine("[PenCommCore] A_PasswordRequest ( " + countRetry + " / " + countReset + " )"); if (needToInputDefaultPassword) { _ReqInputPassword(DEFAULT_PASSWORD); needToInputDefaultPassword = false; } else { Callback.onPenPasswordRequest(this, countRetry, countReset); } } break; case Cmd.A_PasswordSetResponse: { int setResult = pk.GetByteToInt(); //System.Console.WriteLine( "[PenCommCore] A_PasswordSetResponse => " + setResult ); if (setResult == 0x00) { needToInputDefaultPassword = true; } Callback.onPenPasswordSetUpResponse(this, setResult == 0x00 ? true : false); } break; case Cmd.A_PenSensitivityResponse: case Cmd.A_AutoShutdownTimeResponse: case Cmd.A_AutoPowerOnResponse: case Cmd.A_BeepSetResponse: case Cmd.A_PenColorSetResponse: ResPenSetup((Cmd)pk.Cmd, pk.GetByteToInt() == 0x01); break; case Cmd.A_PenSWUpgradeRequest: short idx = pk.GetShort(); ResponseChunkRequest(idx); break; case Cmd.A_PenSWUpgradeStatus: { int upgStatus = pk.GetByteToInt(); if (upgStatus == 0x02) { return; } Callback.onReceivedFirmwareUpdateResult(this, upgStatus == 0x01); mFwChunk = null; } break; } }