bool IMI::FlashRead(Port &port, void *buffer, unsigned address, unsigned size) { if (!_connected) return false; if (size == 0) return true; const TMsg *pMsg = SendRet(port, MSG_FLASH, 0, 0, MSG_FLASH, -1, IMICOMM_BIGPARAM1(address), IMICOMM_BIGPARAM2(address), size, 300, 2); if (pMsg == NULL || size != pMsg->parameter3) return false; return RLEDecompress((IMIBYTE*)buffer, pMsg->payload, pMsg->payloadSize, size); }
/** * @brief Sends task declaration * * @param d Device handle * @param decl Task declaration data * @param errBufSize The size of the buffer for error string * @param errBuf The buffer for error string * * @return Operation status */ bool CDevIMI::DeclarationWrite(PDeviceDescriptor_t d, const Declaration_t &decl, unsigned errBufSize, TCHAR errBuf[]) { if(!_connected) { // LKTOKEN _@M1411_ = "Device not connected!" _sntprintf(errBuf, errBufSize, _T("%s"), gettext(_T("_@M1411_"))); return false; } TDeclaration imiDecl; memset(&imiDecl, 0, sizeof(imiDecl)); // idecl.date ignored - will be set by FR unicode2usascii(decl.PilotName, imiDecl.header.plt, sizeof(imiDecl.header.plt)); // decl.header.db1Year = year; decl.header.db1Month = month; decl.header.db1Day = day; unicode2usascii(decl.AircraftType, imiDecl.header.gty, sizeof(imiDecl.header.gty)); unicode2usascii(decl.AircraftRego, imiDecl.header.gid, sizeof(imiDecl.header.gid)); unicode2usascii(decl.CompetitionID, imiDecl.header.cid, sizeof(imiDecl.header.cid)); unicode2usascii(decl.CompetitionClass, imiDecl.header.ccl, sizeof(imiDecl.header.ccl)); // strncpy(decl.header.clb, idecl.clb, sizeof(decl.header.clb)); // strncpy(decl.header.sit, idecl.sit, sizeof(decl.header.sit)); // strncpy(decl.header.cm2, idecl.cm2, sizeof(decl.header.cm2)); // decl.header.db2Year = year; decl.header.db2Month = month; decl.header.db2Day = day; TCHAR tskName[IMIDECL_TASK_NAME_LENGTH]; TaskFileName(IMIDECL_TASK_NAME_LENGTH, tskName); unicode2usascii(tskName, imiDecl.header.tskName, sizeof(imiDecl.header.tskName)); // decl.header.tskYear = year; decl.header.tskMonth = month; decl.header.tskDay = day; // decl.header.tskNumber = MIN(9999, idecl.tskNumber); IMIWaypoint(decl, 0, imiDecl.wp[0]); for(int i=0; i<decl.num_waypoints; i++) IMIWaypoint(decl, i + 1, imiDecl.wp[i + 1]); IMIWaypoint(decl, decl.num_waypoints + 1, imiDecl.wp[decl.num_waypoints + 1]); // send declaration for current task const TMsg *msg = SendRet(d, errBufSize, errBuf, MSG_DECLARATION, &imiDecl, sizeof(imiDecl), MSG_ACK_SUCCESS, 0, static_cast<IMIBYTE>(-1)); if(!msg && errBuf[0] == '\0') { // LKTOKEN _@M1415_ = "Declaration not accepted!" _sntprintf(errBuf, errBufSize, _T("%s"), gettext(_T("_@M1415_"))); } return msg; }
bool IMI::ReadFlightList(Port &port, RecordedFlightList &flight_list, OperationEnvironment &env) { flight_list.clear(); if (!_connected) return false; IMIWORD address = 0, addressStop = 0xFFFF; IMIBYTE count = 1, totalCount = 0; for (;; count++) { const TMsg *pMsg = SendRet(port, env, MSG_FLIGHT_INFO, nullptr, 0, MSG_FLIGHT_INFO, -1, totalCount, address, addressStop, 200, 6); if (pMsg == nullptr) break; totalCount = pMsg->parameter1; address = pMsg->parameter2; addressStop = pMsg->parameter3; for (unsigned i = 0; i < pMsg->payloadSize / sizeof(IMI::FlightInfo); i++) { const IMI::FlightInfo *fi = ((const IMI::FlightInfo*)pMsg->payload) + i; RecordedFlightInfo &ifi = flight_list.append(); BrokenDateTime start = ConvertToDateTime(fi->start); ifi.date = start; ifi.start_time = start; ifi.end_time = ConvertToDateTime(fi->finish); ifi.internal.imi = fi->address; } if (pMsg->payloadSize == 0 || address == 0xFFFF) return true; } return false; }
bool IMI::DeclarationWrite(Port &port, const Declaration &decl, OperationEnvironment &env) { if (!_connected) return false; TDeclaration imiDecl; memset(&imiDecl, 0, sizeof(imiDecl)); // idecl.date ignored - will be set by FR ConvertToChar(decl.pilot_name, imiDecl.header.plt, sizeof(imiDecl.header.plt)); ConvertToChar(decl.aircraft_type, imiDecl.header.gty, sizeof(imiDecl.header.gty)); ConvertToChar(decl.aircraft_registration, imiDecl.header.gid, sizeof(imiDecl.header.gid)); ConvertToChar(decl.competition_id, imiDecl.header.cid, sizeof(imiDecl.header.cid)); ConvertToChar(_T("XCSOARTASK"), imiDecl.header.tskName, sizeof(imiDecl.header.tskName)); ConvertWaypoint(decl.turnpoints[0].waypoint, imiDecl.wp[0]); unsigned size = decl.Size(); for (unsigned i = 0; i < size; i++) { ConvertWaypoint(decl.turnpoints[i].waypoint, imiDecl.wp[i + 1]); ConvertOZ(decl.turnpoints[i], i == 0, i == size - 1, imiDecl.wp[i + 1]); } ConvertWaypoint(decl.turnpoints[size - 1].waypoint, imiDecl.wp[size + 1]); // send declaration for current task return SendRet(port, env, MSG_DECLARATION, &imiDecl, sizeof(imiDecl), MSG_ACK_SUCCESS, 0, -1) != nullptr; }