// // ReliefIsPossible() - See if we can travel from Point "B" // to Point "C" in the allotted time. // BOOL ReliefIsPossible(long fromTRIPSrecordID, long fromNODESrecordID, long fromSGRPSERVICESrecordID, tod_t fromReliefTime, long toTRIPSrecordID, long toNODESrecordID, tod_t toReliefTime) { GetConnectionTimeDef GCTData; float distance; long travelTime, dwellTime; long startTime, endTime; long waitTime; long equivalentTravelTime; // // First things first - are the nodes equivalenced? // if(NodesEquivalent(fromNODESrecordID, toNODESrecordID, &equivalentTravelTime)) return(TRUE); // // Dynamic travels? // if(bUseDynamicTravels) { if(bUseCISPlan) { CISplanReliefConnect(&startTime, &endTime, &dwellTime, 0, fromNODESrecordID, toNODESrecordID, fromReliefTime, FALSE, fromSGRPSERVICESrecordID); travelTime = (endTime - startTime) + dwellTime; } else travelTime = GetDynamicTravelTime(TRUE, fromNODESrecordID, toNODESrecordID, fromSGRPSERVICESrecordID, toReliefTime, &waitTime); } // // Set up the GCTData structure for input into GetConnectionTime() // else { TRIPSKey0.recordID = fromTRIPSrecordID; btrieve(B_GETEQUAL, TMS_TRIPS, &TRIPS, &TRIPSKey0, 0); GCTData.fromNODESrecordID = fromNODESrecordID; GCTData.fromROUTESrecordID = TRIPS.standard.RGRPROUTESrecordID; GCTData.fromSERVICESrecordID = TRIPS.standard.SGRPSERVICESrecordID; GCTData.fromPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID; TRIPSKey0.recordID = toTRIPSrecordID; btrieve(B_GETEQUAL, TMS_TRIPS, &TRIPS, &TRIPSKey0, 0); GCTData.toNODESrecordID = toNODESrecordID; GCTData.toROUTESrecordID = TRIPS.standard.RGRPROUTESrecordID; GCTData.toSERVICESrecordID = TRIPS.standard.SGRPSERVICESrecordID; GCTData.toPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID; GCTData.timeOfDay = fromReliefTime; travelTime = GetConnectionTime(GCT_FLAG_TRAVELTIME, &GCTData, &distance); } // // Check 1: Is it a valid travel? // if(travelTime == NO_TIME) return(FALSE); // // Check 2: Return TRUE if he can make it, FALSE if he can't // return(fromReliefTime + travelTime <= toReliefTime); }
void wimaxcu_get_conn_time(WIMAX_API_DEVICE_ID_P p_device_id) { WIMAX_API_RET wmxStatus = WIMAX_API_RET_SUCCESS; WIMAX_API_CONNECTION_TIME connectionTime; wmxStatus = GetConnectionTime(p_device_id, &connectionTime); if (WIMAX_API_RET_SUCCESS != wmxStatus) { PrintWmxStatus(wmxStatus); return; } PrintConnectionTime(connectionTime); }
void CBlockProperties::OnClickList(NMHDR* pNMHDR, LRESULT* pResult) { float distance; char nodeName[NODES_ABBRNAME_LENGTH + 1]; long deadheadTime; int rcode2; int pos; POSITION position = pListCtrlLIST->GetFirstSelectedItemPosition(); // // Determine the selection(s) // if(position == NULL) { return; } // // Display the trip // LVCOLUMN LVC; int nItem = pListCtrlLIST->GetNextSelectedItem(position); int nI = pListCtrlLIST->GetItemData(nItem); // // Get the trip // TRIPSKey0.recordID = m_pRELIEFPOINTS[nI].TRIPSrecordID; btrieve(B_GETEQUAL, TMS_TRIPS, &TRIPS, &TRIPSKey0, 0); // // Show the route, service, direction, and pattern // char routeNumberAndName[ROUTES_NUMBER_LENGTH + 3 + ROUTES_NAME_LENGTH + 1]; char serviceName[SERVICES_NAME_LENGTH + 1]; char directionName[DIRECTIONS_LONGNAME_LENGTH + 1]; char patternName[PATTERNNAMES_NAME_LENGTH + 1]; ROUTESKey0.recordID = TRIPS.ROUTESrecordID; btrieve(B_GETEQUAL, TMS_ROUTES, &ROUTES, &ROUTESKey0, 0); strncpy(routeNumberAndName, ROUTES.number, ROUTES_NUMBER_LENGTH); trim(routeNumberAndName, ROUTES_NUMBER_LENGTH); strcat(routeNumberAndName, " - "); strncpy(tempString, ROUTES.name, ROUTES_NAME_LENGTH); trim(tempString, ROUTES_NAME_LENGTH); strcat(routeNumberAndName, tempString); SERVICESKey0.recordID = TRIPS.SERVICESrecordID; btrieve(B_GETEQUAL, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0); strncpy(serviceName, SERVICES.name, SERVICES_NAME_LENGTH); trim(serviceName, SERVICES_NAME_LENGTH); DIRECTIONSKey0.recordID = ROUTES.DIRECTIONSrecordID[TRIPS.directionIndex]; btrieve(B_GETEQUAL, TMS_DIRECTIONS, &DIRECTIONS, &DIRECTIONSKey0, 0); strncpy(directionName, DIRECTIONS.longName, DIRECTIONS_LONGNAME_LENGTH); trim(directionName, DIRECTIONS_LONGNAME_LENGTH); PATTERNNAMESKey0.recordID = TRIPS.PATTERNNAMESrecordID; btrieve(B_GETEQUAL, TMS_PATTERNNAMES, &PATTERNNAMES, &PATTERNNAMESKey0, 0); strncpy(patternName, PATTERNNAMES.name, PATTERNNAMES_NAME_LENGTH); trim(patternName, PATTERNNAMES_NAME_LENGTH); sprintf(tempString, "Trip info: %s %s %s on pattern %s", serviceName, directionName, routeNumberAndName, patternName); pStaticTRIPINFO->SetWindowText(tempString); // // Clear out the previous ListCtrl // pListCtrlTRIPDATA->DeleteAllItems(); CHeaderCtrl* pCtrl = pListCtrlTRIPDATA->GetHeaderCtrl(); if(pCtrl != NULL) { int nCount = pCtrl->GetItemCount(); for(nI = 0; nI < nCount; nI++) { pCtrl->DeleteItem(0); } } // // Set up the list control // GenerateTripDef GTResults; GetConnectionTimeDef GCTData; int numNodes = GenerateTrip(TRIPS.ROUTESrecordID, TRIPS.SERVICESrecordID, TRIPS.directionIndex, TRIPS.PATTERNNAMESrecordID, TRIPS.timeAtMLP, GENERATETRIP_FLAG_DISPLAYERRORS, >Results); pos = 0; // // Is this a pullout? // long POTime = NO_TIME; if(TRIPS.standard.POGNODESrecordID != NO_RECORD) { GCTData.fromPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID; GCTData.toPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID; GCTData.fromROUTESrecordID = TRIPS.ROUTESrecordID; GCTData.fromSERVICESrecordID = TRIPS.SERVICESrecordID; GCTData.toROUTESrecordID = TRIPS.ROUTESrecordID; GCTData.toSERVICESrecordID = TRIPS.SERVICESrecordID; GCTData.fromNODESrecordID = TRIPS.standard.POGNODESrecordID; GCTData.toNODESrecordID = GTResults.firstNODESrecordID; GCTData.timeOfDay = GTResults.firstNodeTime; deadheadTime = GetConnectionTime(GCT_FLAG_DEADHEADTIME, &GCTData, &distance); distance = (float)fabs((double)distance); if(deadheadTime != NO_TIME) { POTime = GTResults.firstNodeTime - deadheadTime; NODESKey0.recordID = TRIPS.standard.POGNODESrecordID; btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0); strncpy(nodeName, NODES.abbrName, NODES_ABBRNAME_LENGTH); trim(nodeName, NODES_ABBRNAME_LENGTH); LVC.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH; LVC.fmt = LVCFMT_LEFT; LVC.cx = 50; LVC.pszText = nodeName; pListCtrlTRIPDATA->InsertColumn(pos, &LVC); pos++; } } // // Set the header to the pattern of the trip // PATTERNSKey2.ROUTESrecordID = TRIPS.ROUTESrecordID; PATTERNSKey2.SERVICESrecordID = TRIPS.SERVICESrecordID; PATTERNSKey2.PATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID; PATTERNSKey2.directionIndex = TRIPS.directionIndex; PATTERNSKey2.nodeSequence = NO_RECORD; rcode2 = btrieve(B_GETGREATER, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2); while(rcode2 == 0 && PATTERNS.ROUTESrecordID == TRIPS.ROUTESrecordID && PATTERNS.SERVICESrecordID == TRIPS.SERVICESrecordID && PATTERNS.PATTERNNAMESrecordID == TRIPS.PATTERNNAMESrecordID && PATTERNS.directionIndex == TRIPS.directionIndex) { if(!(PATTERNS.flags & PATTERNS_FLAG_BUSSTOP)) { NODESKey0.recordID = PATTERNS.NODESrecordID; btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0); strncpy(nodeName, NODES.abbrName, NODES_ABBRNAME_LENGTH); trim(nodeName, NODES_ABBRNAME_LENGTH); LVC.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH; LVC.fmt = LVCFMT_LEFT; LVC.cx = 50; LVC.pszText = nodeName; pListCtrlTRIPDATA->InsertColumn(pos, &LVC); pos++; } rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2); } // // Is this a pull-in? // long PITime = NO_TIME; if(TRIPS.standard.PIGNODESrecordID != NO_RECORD) { GCTData.fromPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID; GCTData.toPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID; GCTData.fromROUTESrecordID = TRIPS.ROUTESrecordID; GCTData.fromSERVICESrecordID = TRIPS.SERVICESrecordID; GCTData.toROUTESrecordID = TRIPS.ROUTESrecordID; GCTData.toSERVICESrecordID = TRIPS.SERVICESrecordID; GCTData.fromNODESrecordID = GTResults.lastNODESrecordID; GCTData.toNODESrecordID = TRIPS.standard.PIGNODESrecordID; GCTData.timeOfDay = GTResults.lastNodeTime; deadheadTime = GetConnectionTime(GCT_FLAG_DEADHEADTIME, &GCTData, &distance); distance = (float)fabs((double)distance); if(deadheadTime != NO_TIME) { PITime = GTResults.lastNodeTime + deadheadTime; NODESKey0.recordID = TRIPS.standard.PIGNODESrecordID; btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0); strncpy(nodeName, NODES.abbrName, NODES_ABBRNAME_LENGTH); trim(nodeName, NODES_ABBRNAME_LENGTH); LVC.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH; LVC.fmt = LVCFMT_LEFT; LVC.cx = 50; LVC.pszText = nodeName; pListCtrlTRIPDATA->InsertColumn(pos, &LVC); } } // // Display the times // LVITEM LVI; LVI.iItem = 0; LVI.mask = LVIF_TEXT; pos = 0; // // POT? // if(POTime != NO_TIME) { LVI.iSubItem = pos; strcpy(tempString, Tchar(POTime)); LVI.pszText = tempString; pListCtrlTRIPDATA->InsertItem(&LVI); pos++; } // // Do the trip times // strcpy(tempString, Tchar(GTResults.tripTimes[0])); LVI.pszText = tempString; LVI.iSubItem = pos; if(pos == 0) pListCtrlTRIPDATA->InsertItem(&LVI); else { pListCtrlTRIPDATA->SetItem(&LVI); } pos++; for(nI = 1; nI < numNodes; nI++) { LVI.iSubItem = pos; strcpy(tempString, Tchar(GTResults.tripTimes[nI])); LVI.pszText = tempString; pListCtrlTRIPDATA->SetItem(&LVI); pos++; } // // PIT? // if(PITime != NO_TIME) { LVI.iSubItem = pos; strcpy(tempString, Tchar(PITime)); LVI.pszText = tempString; pListCtrlTRIPDATA->SetItem(&LVI); } *pResult = 0; }
BOOL FAR TMSRPT67(TMSRPTPassedDataDef *pPassedData) { NodesAndStopsDef NodesAndStops[TMSRPT67_MAXNODESANDSTOPS]; GetConnectionTimeDef GCTData; GenerateTripDef GTResults; BLOCKSDef *pTRIPSChunk; double prevLat, prevLon; HFILE hfOutputFile; HFILE hfErrorLog; float distanceToHere; float tripDistances[100]; float distance; struct tm tmED, tmUD, today; time_t EDmktime; time_t UDmktime; time_t now; BOOL bFound; BOOL bGotError; BOOL bFinishedOK; BOOL bBikeRack; BOOL bFirst; long SERVICESinEffect[TMSRPT66_MAXSERVICES]; long year, month, day; long serviceRecordID; long previousPattern; long timeAtStop; long absRecID; long stopFlags; long stopNumber; long assignedToNODESrecordID; long blockNumber; long fromNODESrecordID; long toNODESrecordID; long toTime; long fromTime; long dhd; long number; char outputString[1024]; char outputStringSave[1024]; char out2[1024]; char *ptr; char *pszReportName; char outputFileName[64]; char szServiceCode[SERVICES_NAME_LENGTH + 1]; char szTripCode[16]; int nI; int rcode2; int dayOfWeek; int numServices; int tripIndex; int numNodes; int seq; bFinishedOK = FALSE; // // Maintain the distance measure // distanceMeasureSave = distanceMeasure; distanceMeasure = PREFERENCES_MILES; // // Set up the trip planner // if(bUseDynamicTravels) { if(bUseCISPlan) { CISfree(); if(!CISbuild(FALSE, TRUE)) { goto done; } } else { rcode2 = btrieve(B_GETFIRST, TMS_SERVICES, &SERVICES, &SERVICESKey1, 1); while(rcode2 == 0) { serviceRecordID = SERVICES.recordID; InitTravelMatrix(serviceRecordID, TRUE); SERVICESKey0.recordID = serviceRecordID; btrieve(B_GETEQUAL, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0); btrieve(B_GETPOSITION, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0); btrieve(B_GETDIRECT, TMS_SERVICES, &SERVICES, &SERVICESKey1, 1); rcode2 = btrieve(B_GETNEXT, TMS_SERVICES, &SERVICES, &SERVICESKey1, 1); } } } // // Create the sub-folder for the output files and chdir into it // nI = (_mkdir(OUTPUT_FOLDER_NAME) == 0) ? TEXT_333 : TEXT_334; LoadString(hInst, nI, szFormatString, SZFORMATSTRING_LENGTH); sprintf(tempString, szFormatString, OUTPUT_FOLDER_NAME); MessageBeep(MB_ICONINFORMATION); MessageBox(NULL, tempString, TMS, MB_OK); chdir(OUTPUT_FOLDER_NAME); // // Open the error log and fire up the status bar // hfErrorLog = _lcreat("error.log", 0); if(hfErrorLog == HFILE_ERROR) { TMSError((HWND)NULL, MB_ICONSTOP, ERROR_226, (HANDLE)NULL); goto done; } bGotError = FALSE; pPassedData->nReportNumber = 66; for(nI = 0; nI < m_LastReport; nI++) { if(TMSRPT[nI].originalReportNumber == pPassedData->nReportNumber) { pszReportName = TMSRPT[nI].szReportName; StatusBarStart(hWndMain, TMSRPT[nI].szReportName); break; } } // // Get today's date // time(&now); today = *localtime(&now); // // ============================== // Service File - oci_service.csv // ============================== // if(StatusBarAbort()) { goto done; } strcpy(outputFileName, "oci_service.csv"); hfOutputFile = _lcreat(outputFileName, 0); if(hfOutputFile == HFILE_ERROR) { LoadString(hInst, ERROR_320, szFormatString, SZFORMATSTRING_LENGTH); sprintf(szarString, szFormatString, outputFileName); MessageBeep(MB_ICONSTOP); MessageBox(NULL, szarString, TMS, MB_OK | MB_ICONSTOP); goto done; } StatusBarText(outputFileName); // // Write out the header // strcpy(outputString, "\"ServiceCode\",\"Date\"\r\n"); _lwrite(hfOutputFile, outputString, strlen(outputString)); numServices = 0; // // Dump out the service day based on calendar days // // Effective date // GetYMD(effectiveDate, &year, &month, &day); memset(&tmED, 0x00, sizeof(tmED)); tmED.tm_mday = day; tmED.tm_mon = month - 1; tmED.tm_year = year - 1900; // // Until date // GetYMD(untilDate, &year, &month, &day); memset(&tmUD, 0x00, sizeof(tmUD)); tmUD.tm_mday = day; tmUD.tm_mon = month - 1; tmUD.tm_year = year - 1900; // // Start at the effective date and go to the until date // EDmktime = mktime(&tmED); if(EDmktime == (time_t)(-1)) { LoadString(hInst, ERROR_328, szFormatString, SZFORMATSTRING_LENGTH); sprintf(outputString, szFormatString, 1); _lwrite(hfErrorLog, outputString, strlen(outputString)); bGotError = TRUE; } else { UDmktime = mktime(&tmUD); while(EDmktime <= UDmktime) { if(StatusBarAbort()) { goto done; } dayOfWeek = (tmED.tm_wday == 0 ? 6 : tmED.tm_wday - 1); for(bFound = FALSE, nI = 0; nI < numServices; nI++) { if(ROSTERPARMS.serviceDays[dayOfWeek] == SERVICESinEffect[nI]) { bFound = TRUE; break; } } if(!bFound) { SERVICESinEffect[numServices] = ROSTERPARMS.serviceDays[dayOfWeek]; numServices++; } // // ServiceCode (SERVICES.recordID) // SERVICESKey0.recordID = ROSTERPARMS.serviceDays[dayOfWeek]; btrieve(B_GETEQUAL, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0); strncpy(tempString, SERVICES.name, SERVICES_NAME_LENGTH); trim(tempString, SERVICES_NAME_LENGTH); sprintf(szarString, "\"%s\",", tempString); strcpy(outputString, szarString); // // Date // sprintf(szarString, "\"%4ld%02ld%02ld\"\r\n", tmED.tm_year + 1900, tmED.tm_mon + 1, tmED.tm_mday); strcat(outputString, szarString); // // Write out the record // _lwrite(hfOutputFile, outputString, strlen(outputString)); // // Figure out the next day // tmED.tm_mday++; EDmktime = mktime(&tmED); if(EDmktime == (time_t)(-1)) { LoadString(hInst, ERROR_328, szFormatString, SZFORMATSTRING_LENGTH); sprintf(outputString, szFormatString, 1); _lwrite(hfErrorLog, outputString, strlen(outputString)); bGotError = TRUE; } } } // // Close the file // _lclose(hfOutputFile); // // ============================ // Routes File - oci_routes.csv // ============================ // if(StatusBarAbort()) { goto done; } strcpy(outputFileName, "oci_routes.csv"); hfOutputFile = _lcreat(outputFileName, 0); if(hfOutputFile == HFILE_ERROR) { LoadString(hInst, ERROR_320, szFormatString, SZFORMATSTRING_LENGTH); sprintf(szarString, szFormatString, outputFileName); MessageBeep(MB_ICONSTOP); MessageBox(NULL, szarString, TMS, MB_OK | MB_ICONSTOP); goto done; } StatusBarText(outputFileName); // // Write out the header // strcpy(outputString, "\"RouteCode\",\"RouteName\",\"DirectionCode\",\"DirectionName\",\"PatternCode\",\"PatternName\"\r\n"); _lwrite(hfOutputFile, outputString, strlen(outputString)); // // Traverse the Routes Table // rcode2 = btrieve(B_GETFIRST, TMS_ROUTES, &ROUTES, &ROUTESKey1, 1); while(rcode2 == 0) { if(StatusBarAbort()) { goto done; } // // Go through the directions // for(nI = 0; nI < 2; nI++) { if(ROUTES.DIRECTIONSrecordID[nI] == NO_RECORD) { continue; } // // RouteCode (ROUTES.number) // strncpy(tempString, ROUTES.number, ROUTES_NUMBER_LENGTH); trim(tempString, ROUTES_NUMBER_LENGTH); ptr = tempString; while(ptr && *ptr == ' ') { ptr++; } sprintf(szarString, "\"%s\",", ptr); strcpy(outputString, szarString); // // RouteName (ROUTES.name) // strncpy(tempString, ROUTES.name, ROUTES_NAME_LENGTH); trim(tempString, ROUTES_NAME_LENGTH); sprintf(szarString, "\"%s\",", tempString); strcat(outputString, szarString); // // DirectionCode (DIRECTIONS.abbrName) // DIRECTIONSKey0.recordID = ROUTES.DIRECTIONSrecordID[nI]; btrieve(B_GETEQUAL, TMS_DIRECTIONS, &DIRECTIONS, &DIRECTIONSKey0, 0); strncpy(tempString, DIRECTIONS.abbrName, DIRECTIONS_ABBRNAME_LENGTH); trim(tempString, DIRECTIONS_ABBRNAME_LENGTH); sprintf(szarString, "\"%s\",", tempString); strcat(outputString, szarString); // // DirectionName (DIRECTIONS.longName) // DIRECTIONSKey0.recordID = ROUTES.DIRECTIONSrecordID[nI]; btrieve(B_GETEQUAL, TMS_DIRECTIONS, &DIRECTIONS, &DIRECTIONSKey0, 0); strncpy(tempString, DIRECTIONS.longName, DIRECTIONS_LONGNAME_LENGTH); trim(tempString, DIRECTIONS_LONGNAME_LENGTH); sprintf(szarString, "\"%s\",", tempString); strcat(outputString, szarString); // // Cycle through the patterns for route/service/direction // strcpy(outputStringSave, outputString); rcode2 = btrieve(B_GETFIRST, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0); while(rcode2 == 0) { PATTERNSKey2.ROUTESrecordID = ROUTES.recordID; PATTERNSKey2.SERVICESrecordID = SERVICES.recordID; PATTERNSKey2.PATTERNNAMESrecordID = basePatternRecordID; PATTERNSKey2.directionIndex = nI; PATTERNSKey2.nodeSequence = NO_RECORD; previousPattern = NO_RECORD; rcode2 = btrieve(B_GETGREATER, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2); while(rcode2 == 0 && PATTERNS.ROUTESrecordID == ROUTES.recordID && PATTERNS.SERVICESrecordID == SERVICES.recordID && PATTERNS.directionIndex == nI) { if(PATTERNS.PATTERNNAMESrecordID != previousPattern) { // // PatternCode (SERVICES.recordID-PATTERNNAMES.recordID) // sprintf(szarString, "\"%ld-%ld\",", SERVICES.recordID, PATTERNS.PATTERNNAMESrecordID); strcat(outputString, szarString); // // PatternName (PATTERNNAMES.name) // PATTERNNAMESKey0.recordID = PATTERNS.PATTERNNAMESrecordID; btrieve(B_GETEQUAL, TMS_PATTERNNAMES, &PATTERNNAMES, &PATTERNNAMESKey0, 0); strncpy(tempString, PATTERNNAMES.name, PATTERNNAMES_NAME_LENGTH); trim(tempString, PATTERNNAMES_NAME_LENGTH); sprintf(szarString, "\"%s\"\r\n", tempString); strcat(outputString, szarString); // // Write out the record and get the next pattern // _lwrite(hfOutputFile, outputString, strlen(outputString)); strcpy(outputString, outputStringSave); previousPattern = PATTERNS.PATTERNNAMESrecordID; } rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2); } rcode2 = btrieve(B_GETNEXT, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0); } } // nI // // Get the next route // rcode2 = btrieve(B_GETNEXT, TMS_ROUTES, &ROUTES, &ROUTESKey1, 1); } // // Close the file // _lclose(hfOutputFile); // // ============================== // Bus Stops File - oci_stops.csv // ============================== // if(StatusBarAbort()) { goto done; } strcpy(outputFileName, "oci_stops.csv"); hfOutputFile = _lcreat(outputFileName, 0); if(hfOutputFile == HFILE_ERROR) { LoadString(hInst, ERROR_320, szFormatString, SZFORMATSTRING_LENGTH); sprintf(szarString, szFormatString, outputFileName); MessageBeep(MB_ICONSTOP); MessageBox(NULL, szarString, TMS, MB_OK | MB_ICONSTOP); goto done; } // // Write out the header // strcpy(outputString, "\"StopCode\",\"StopName\",\"Latitude\",\"Longitude\",\"Shelter\",\"Bench\",\"Accessible\",\"TimingPoint\"\r\n"); _lwrite(hfOutputFile, outputString, strlen(outputString)); StatusBarText(outputFileName); // // Get the list of nodes // // // Cycle through the Nodes Table to get associated stop numbers // rcode2 = btrieve(B_GETFIRST, TMS_NODES, &NODES, &NODESKey0, 0); numNodes = 0; while(rcode2 == 0) { if(!(NODES.flags & NODES_FLAG_STOP)) { NodesAndStops[numNodes].NODESrecordID = NODES.recordID; NodesAndStops[numNodes].StopNumber = NODES.number; NodesAndStops[numNodes].OutboundStopNumber = NODES.OBStopNumber; NodesAndStops[numNodes].InboundStopNumber = NODES.IBStopNumber; numNodes++; if(numNodes >= TMSRPT67_MAXNODESANDSTOPS) { MessageBeep(MB_ICONSTOP); MessageBox(NULL, "TMSRPT67_MAXNODESANDSTOPS Exceeded.\n\nPlease contact Schedule Masters, Inc. for help", TMS, MB_OK | MB_ICONSTOP); goto done; } } rcode2 = btrieve(B_GETNEXT, TMS_NODES, &NODES, &NODESKey0, 0); } // // Cycle through the Nodes Table // rcode2 = btrieve(B_GETFIRST, TMS_NODES, &NODES, &NODESKey0, 0); while(rcode2 == 0) { // // StopCode (NODES.number or NODES.abbrName) // if(NODES.flags & NODES_FLAG_STOP) { sprintf(szarString, "\"%04ld\",", NODES.number); } else { // strncpy(tempString, NODES.abbrName, NODES_ABBRNAME_LENGTH); // trim(tempString, NODES_ABBRNAME_LENGTH); // sprintf(szarString, "\"%s\",", tempString); if(nI == 0) { number = (NODES.OBStopNumber <= 0 ? NODES.number : NODES.OBStopNumber); } else { number = (NODES.IBStopNumber <= 0 ? NODES.number : NODES.IBStopNumber); } sprintf(szarString, "\"%04ld\",", number); } strcpy(outputString, szarString); // // StopName (NODES.intersection) // strncpy(tempString, NODES.intersection, NODES_INTERSECTION_LENGTH); trim(tempString, NODES_INTERSECTION_LENGTH); ptr = strstr(tempString, "&&"); if(ptr) { *ptr = 'a'; *(ptr + 1) = 't'; } sprintf(szarString, "\"%s\",", tempString); strcat(outputString, szarString); // // Latitude (NODES.latitude) // sprintf(tempString, "%12.6f", NODES.latitude); ptr = tempString; while(ptr && *ptr == ' ') { ptr++; } sprintf(szarString, "\"%s\",", ptr); strcat(outputString, szarString); // // Longitude (NODES.longitude) // sprintf(tempString, "%12.6f", NODES.longitude); ptr = tempString; while(ptr && *ptr == ' ') { ptr++; } sprintf(szarString, "\"%s\",", ptr); strcat(outputString, szarString); // // If this isn't a stop, look to see if we can find the stop in the Nodes Table // if(NODES.flags & NODES_FLAG_STOP) { stopFlags = NODES.stopFlags; } else { stopFlags = 0; stopNumber = NO_RECORD; if(NODES.number > 0) { stopNumber = NODES.number; } if(stopNumber == NO_RECORD && NODES.OBStopNumber > 0) { stopNumber = NODES.OBStopNumber; } if(stopNumber == NO_RECORD && NODES.IBStopNumber > 0) { stopNumber = NODES.IBStopNumber; } if(stopNumber != NO_RECORD) { btrieve(B_GETPOSITION, TMS_NODES, &absRecID, &NODESKey0, 0); rcode2 = btrieve(B_GETFIRST, TMS_NODES, &NODES, &NODESKey0, 0); while(rcode2 == 0) { if(NODES.flags & NODES_FLAG_STOP) { if(NODES.number == stopNumber) { stopFlags = NODES.stopFlags; break; } } rcode2 = btrieve(B_GETNEXT, TMS_NODES, &NODES, &NODESKey0, 0); } NODES.recordID = absRecID; btrieve(B_GETDIRECT, TMS_NODES, &NODES, &NODESKey0, 0); } } // // Shelter (item 12 from "Stop Flags.txt") // sprintf(tempString, (stopFlags & (1 << 12) ? "True" : "False")); sprintf(szarString, "\"%s\",", tempString); strcat(outputString, szarString); // // Bench (item 5 from "Stop Flags.txt") // sprintf(tempString, (stopFlags & (1 << 5) ? "True" : "False")); sprintf(szarString, "\"%s\",", tempString); strcat(outputString, szarString); // // Accessible (item 16 from "Stop Flags.txt") // sprintf(tempString, (stopFlags & (1 << 6) ? "True" : "False")); sprintf(szarString, "\"%s\",", tempString); strcat(outputString, szarString); // // Timing point? // if(!(NODES.flags & NODES_FLAG_STOP)) { bFound = TRUE; } else { bFound = FALSE; for(nI = 0; nI < numNodes; nI++) { if(NodesAndStops[nI].StopNumber == NODES.number || NodesAndStops[nI].OutboundStopNumber == NODES.number || NodesAndStops[nI].InboundStopNumber == NODES.number) { bFound = TRUE; break; } } } sprintf(tempString, (bFound ? "True" : "False")); sprintf(szarString, "\"%s\"\r\n", tempString); strcat(outputString, szarString); // // Write it out and get the next node // _lwrite(hfOutputFile, outputString, strlen(outputString)); rcode2 = btrieve(B_GETNEXT, TMS_NODES, &NODES, &NODESKey0, 0); } // // Close the file // _lclose(hfOutputFile); // // ==================================== // Bus Patterns File - oci_patterns.csv // ==================================== // if(StatusBarAbort()) { goto done; } strcpy(outputFileName, "oci_patterns.csv"); hfOutputFile = _lcreat(outputFileName, 0); if(hfOutputFile == HFILE_ERROR) { LoadString(hInst, ERROR_320, szFormatString, SZFORMATSTRING_LENGTH); sprintf(szarString, szFormatString, outputFileName); MessageBeep(MB_ICONSTOP); MessageBox(NULL, szarString, TMS, MB_OK | MB_ICONSTOP); goto done; } // // Write out the header // strcpy(outputString, "\"RouteCode\",\"DirectionCode\",\"PatternCode\",\"StopCode\",\"Sequence\"\r\n"); _lwrite(hfOutputFile, outputString, strlen(outputString)); StatusBarText(outputFileName); // // Traverse the Routes Table // rcode2 = btrieve(B_GETFIRST, TMS_ROUTES, &ROUTES, &ROUTESKey1, 1); while(rcode2 == 0) { if(StatusBarAbort()) { goto done; } for(nI = 0; nI < 2; nI++) { if(ROUTES.DIRECTIONSrecordID[nI] == NO_RECORD) { continue; } // // RouteCode (ROUTES.number) // strncpy(tempString, ROUTES.number, ROUTES_NUMBER_LENGTH); trim(tempString, ROUTES_NUMBER_LENGTH); ptr = tempString; while(ptr && *ptr == ' ') { ptr++; } sprintf(szarString, "\"%s\",", ptr); strcpy(outputString, szarString); // // DirectionCode (DIRECTIONS.abbrName) // DIRECTIONSKey0.recordID = ROUTES.DIRECTIONSrecordID[nI]; btrieve(B_GETEQUAL, TMS_DIRECTIONS, &DIRECTIONS, &DIRECTIONSKey0, 0); strncpy(tempString, DIRECTIONS.abbrName, DIRECTIONS_ABBRNAME_LENGTH); trim(tempString, DIRECTIONS_ABBRNAME_LENGTH); sprintf(szarString, "\"%s\",", tempString); strcat(outputString, szarString); // // Go through all the services // strcpy(outputStringSave, outputString); rcode2 = btrieve(B_GETFIRST, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0); while(rcode2 == 0) { // // Go through all the patterns // PATTERNSKey2.ROUTESrecordID = ROUTES.recordID; PATTERNSKey2.SERVICESrecordID = SERVICES.recordID; PATTERNSKey2.PATTERNNAMESrecordID = basePatternRecordID; PATTERNSKey2.directionIndex = nI; PATTERNSKey2.nodeSequence = -1; rcode2 = btrieve(B_GETGREATER, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2); previousPattern = NO_RECORD; while(rcode2 == 0 && PATTERNS.ROUTESrecordID == ROUTES.recordID && PATTERNS.SERVICESrecordID == SERVICES.recordID && PATTERNS.directionIndex == nI) { if(previousPattern != PATTERNS.PATTERNNAMESrecordID) { previousPattern = PATTERNS.PATTERNNAMESrecordID; seq = 1; } // // PatternCode (SERVICES.recordID-PATTERNS.PATTERNNAMESrecordID) // sprintf(szarString, "\"%ld-%ld\",", SERVICES.recordID, PATTERNS.PATTERNNAMESrecordID); strcat(outputString, szarString); // // StopCode (NODES.number or NODES.abbrName) // NODESKey0.recordID = PATTERNS.NODESrecordID; btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0); if(!(NODES.flags & NODES_FLAG_STOP)) { if(nI == 0) { number = (NODES.OBStopNumber <= 0 ? NODES.number : NODES.OBStopNumber); } else { number = (NODES.IBStopNumber <= 0 ? NODES.number : NODES.IBStopNumber); } sprintf(tempString, "%04ld", number); // strncpy(tempString, NODES.abbrName, NODES_ABBRNAME_LENGTH); // trim(tempString, NODES_ABBRNAME_LENGTH); } else { sprintf(tempString, "%04ld", NODES.number); } sprintf(szarString, "\"%s\",", tempString); strcat(outputString, szarString); // // Sequence // sprintf(tempString, "\"%d\"\r\n", seq++); strcat(outputString, tempString); // // Write it out and get the next node on the pattern // _lwrite(hfOutputFile, outputString, strlen(outputString)); strcpy(outputString, outputStringSave); rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2); } // while on patterns rcode2 = btrieve(B_GETNEXT, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0); } } // nI // // Get the next route // rcode2 = btrieve(B_GETNEXT, TMS_ROUTES, &ROUTES, &ROUTESKey1, 1); } // // Close the file // _lclose(hfOutputFile); // // ========================================== // Bus Trips File - oci_trips_{RouteCode}.dat // ========================================== // // // Traverse the Routes Table // rcode2 = btrieve(B_GETFIRST, TMS_ROUTES, &ROUTES, &ROUTESKey1, 1); while(rcode2 == 0) { if(StatusBarAbort()) { goto done; } strncpy(tempString, ROUTES.number, ROUTES_NUMBER_LENGTH); trim(tempString, ROUTES_NUMBER_LENGTH); ptr = tempString; while(ptr && *ptr == ' ') { ptr++; } sprintf(outputFileName, "oci_trips_%s.csv", ptr); hfOutputFile = _lcreat(outputFileName, 0); if(hfOutputFile == HFILE_ERROR) { LoadString(hInst, ERROR_320, szFormatString, SZFORMATSTRING_LENGTH); sprintf(szarString, szFormatString, outputFileName); MessageBeep(MB_ICONSTOP); MessageBox(NULL, szarString, TMS, MB_OK | MB_ICONSTOP); goto done; } // // Write out the header // strcpy(outputString, "\"RouteCode\",\"DirectionCode\",\"PatternCode\",\"TripCode\",\"StopCode\",\"Sequence\",\"ArrivalTime\",\"DepartureTime\",\"TimingPoint\",\"Bicycles\",\"ServiceCode\"\r\n"); _lwrite(hfOutputFile, outputString, strlen(outputString)); StatusBarText(outputFileName); // // Go through the services // rcode2 = btrieve(B_GETFIRST, TMS_SERVICES, &SERVICES, &SERVICESKey1, 1); while(rcode2 == 0) { if(StatusBarAbort()) { goto done; } strncpy(szServiceCode, SERVICES.name, SERVICES_NAME_LENGTH); trim(szServiceCode, SERVICES_NAME_LENGTH); // // Loop through the directions // for(nI = 0; nI < 2; nI++) { if(ROUTES.DIRECTIONSrecordID[nI] == NO_RECORD) { continue; } // // RouteCode (ROUTES.number) // strncpy(tempString, ROUTES.number, ROUTES_NUMBER_LENGTH); trim(tempString, ROUTES_NUMBER_LENGTH); ptr = tempString; while(ptr && *ptr == ' ') { ptr++; } sprintf(szarString, "\"%s\",", ptr); strcpy(outputString, szarString); // // DirectionCode (DIRECTIONS.abbrName) // DIRECTIONSKey0.recordID = ROUTES.DIRECTIONSrecordID[nI]; btrieve(B_GETEQUAL, TMS_DIRECTIONS, &DIRECTIONS, &DIRECTIONSKey0, 0); strncpy(tempString, DIRECTIONS.abbrName, DIRECTIONS_ABBRNAME_LENGTH); trim(tempString, DIRECTIONS_ABBRNAME_LENGTH); sprintf(szarString, "\"%s\",", tempString); strcat(outputString, szarString); strcpy(out2, outputString); // // Get the trips for this route/ser/dir // TRIPSKey1.ROUTESrecordID = ROUTES.recordID; TRIPSKey1.SERVICESrecordID = SERVICES.recordID; TRIPSKey1.directionIndex = nI; TRIPSKey1.tripSequence = NO_RECORD; rcode2 = btrieve(B_GETGREATER, TMS_TRIPS, &TRIPS, &TRIPSKey1, 1); while(rcode2 == 0 && TRIPS.ROUTESrecordID == ROUTES.recordID && TRIPS.SERVICESrecordID == SERVICES.recordID && TRIPS.directionIndex == nI) { strcpy(outputString, out2); // // PatternCode (SERVICES.recordID-PATTERNNAMES.recordID) // sprintf(szarString, "\"%ld-%ld\",", TRIPS.SERVICESrecordID, TRIPS.PATTERNNAMESrecordID); strcat(outputString, szarString); // // TripCode (TRIPS.tripNumber) // sprintf(szarString, "\"%ld\",", TRIPS.tripNumber); strcat(outputString, szarString); // // Does this vehicle have a bike rack? // bBikeRack = FALSE; if(TRIPS.BUSTYPESrecordID != NO_RECORD) { BUSTYPESKey0.recordID = TRIPS.BUSTYPESrecordID; rcode2 = btrieve(B_GETEQUAL, TMS_BUSTYPES, &BUSTYPES, &BUSTYPESKey0, 0); if(rcode2 == 0) { if(BUSTYPES.flags & BUSTYPES_FLAG_CARRIER) { bBikeRack = TRUE; } } } // // Generate the trip // GenerateTrip(TRIPS.ROUTESrecordID, TRIPS.SERVICESrecordID, TRIPS.directionIndex, TRIPS.PATTERNNAMESrecordID, TRIPS.timeAtMLP, GENERATETRIP_FLAG_DISPLAYERRORS, >Results); // // Go through the pattern twice // // Pass 1 - Determine distances at each timepoint // if(GTResults.tripDistance != 0.0) { PATTERNSKey2.ROUTESrecordID = ROUTES.recordID; PATTERNSKey2.SERVICESrecordID = SERVICES.recordID; PATTERNSKey2.directionIndex = nI; PATTERNSKey2.PATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID; PATTERNSKey2.nodeSequence = NO_RECORD; rcode2 = btrieve(B_GETGREATER, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2); tripIndex = 0; distanceToHere = 0.0; while(rcode2 == 0 && PATTERNS.ROUTESrecordID == ROUTES.recordID && PATTERNS.SERVICESrecordID == SERVICES.recordID && PATTERNS.directionIndex == nI && PATTERNS.PATTERNNAMESrecordID == TRIPS.PATTERNNAMESrecordID) { NODESKey0.recordID = PATTERNS.NODESrecordID; rcode2 = btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0); if(PATTERNS.flags & PATTERNS_FLAG_BUSSTOP) { distanceToHere += (float)GreatCircleDistance(prevLon, prevLat, NODES.longitude, NODES.latitude); } else { tripDistances[tripIndex] = distanceToHere; tripIndex++; } prevLat = NODES.latitude; prevLon = NODES.longitude; rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2); } } // // Save outputString to this point // strcpy(outputStringSave, outputString); // // Pass 2 - Determine time interpolations and output the records // PATTERNSKey2.ROUTESrecordID = ROUTES.recordID; PATTERNSKey2.SERVICESrecordID = SERVICES.recordID; PATTERNSKey2.directionIndex = nI; PATTERNSKey2.PATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID; PATTERNSKey2.nodeSequence = NO_RECORD; rcode2 = btrieve(B_GETGREATER, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2); tripIndex = 0; seq = 1; distanceToHere = 0.0; while(rcode2 == 0 && PATTERNS.ROUTESrecordID == ROUTES.recordID && PATTERNS.SERVICESrecordID == SERVICES.recordID && PATTERNS.directionIndex == nI && PATTERNS.PATTERNNAMESrecordID == TRIPS.PATTERNNAMESrecordID) { NODESKey0.recordID = PATTERNS.NODESrecordID; rcode2 = btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0); if(PATTERNS.flags & PATTERNS_FLAG_BUSSTOP) { if(GTResults.tripDistance == 0) { timeAtStop = GTResults.tripTimes[tripIndex - 1]; } else { distanceToHere += (float)GreatCircleDistance(prevLon, prevLat, NODES.longitude, NODES.latitude); timeAtStop = (long)((GTResults.tripTimes[tripIndex] - GTResults.tripTimes[tripIndex - 1]) * (distanceToHere / (tripDistances[tripIndex] - tripDistances[tripIndex - 1]))); timeAtStop += (GTResults.tripTimes[tripIndex - 1]); } } else { timeAtStop = GTResults.tripTimes[tripIndex]; distanceToHere = 0.0; tripIndex++; } // // StopCode (NODES.number or NODES.abbrName) // /* if(NODES.flags & NODES_FLAG_STOP) { sprintf(szarString, "\"%04ld\",", NODES.number); } else { strncpy(tempString, NODES.abbrName, NODES_ABBRNAME_LENGTH); trim(tempString, NODES_ABBRNAME_LENGTH); sprintf(szarString, "\"%s\",", tempString); } */ if(!(NODES.flags & NODES_FLAG_STOP)) { if(nI == 0) { number = (NODES.OBStopNumber <= 0 ? NODES.number : NODES.OBStopNumber); } else { number = (NODES.IBStopNumber <= 0 ? NODES.number : NODES.IBStopNumber); } sprintf(szarString, "\"%04ld\",", number); } else { sprintf(szarString, "\"%04ld\",", NODES.number); } strcat(outputString, szarString); // // Sequence // sprintf(szarString, "\"%d\",", seq++); strcat(outputString, szarString); // // ArrivalTime (Time at the stop, in seconds) // // Now time is in HHMM (11-Aug-08) // // sprintf(szarString, "\"%ld\",", timeAtStop); sprintf(szarString, "\"%s\",", TcharNAP(timeAtStop, FALSE)); strcat(outputString, szarString); // // DepartureTime (Time at the stop, in seconds) // // Now time is in HHMM (11-Aug-08) // // sprintf(szarString, "\"%ld\",", timeAtStop); sprintf(szarString, "\"%s\",", TcharNAP(timeAtStop, FALSE)); strcat(outputString, szarString); // // Timepoint? // sprintf(tempString, "%s", (NODES.flags & NODES_FLAG_STOP ? "False" : "True")); sprintf(szarString, "\"%s\",", tempString); strcat(outputString, szarString); // // Bicycles? // sprintf(tempString, "%s", (bBikeRack ? "True" : "False")); sprintf(szarString, "\"%s\",", tempString); strcat(outputString, szarString); // // ServiceCode // sprintf(szarString, "\"%s\"\r\n", szServiceCode); strcat(outputString, szarString); // // Write it out and go back // _lwrite(hfOutputFile, outputString, strlen(outputString)); strcpy(outputString, outputStringSave); prevLat = NODES.latitude; prevLon = NODES.longitude; rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2); } // while on pattern // // Get the next trip // rcode2 = btrieve(B_GETNEXT, TMS_TRIPS, &TRIPS, &TRIPSKey1, 1); } // while on trips } // nI (directions on the route) // // Get the next service // rcode2 = btrieve(B_GETNEXT, TMS_SERVICES, &SERVICES, &SERVICESKey1, 1); } // // Close the file // _lclose(hfOutputFile); // // Get the next route // rcode2 = btrieve(B_GETNEXT, TMS_ROUTES, &ROUTES, &ROUTESKey1, 1); } // // Blocks // // // ============================ // Blocks File - oci_blocks.dat // ============================ // pTRIPSChunk = &TRIPS.standard; sprintf(outputFileName, "oci_blocks.csv", ptr); hfOutputFile = _lcreat(outputFileName, 0); if(hfOutputFile == HFILE_ERROR) { LoadString(hInst, ERROR_320, szFormatString, SZFORMATSTRING_LENGTH); sprintf(szarString, szFormatString, outputFileName); MessageBeep(MB_ICONSTOP); MessageBox(NULL, szarString, TMS, MB_OK | MB_ICONSTOP); goto done; } // // Write out the header // strcpy(outputString, "\"BlockCode\",\"ServiceCode\",\"TripCode\",\"Sequence\",\"StartStopCode\",\"EndStopCode\",\"InService\"\r\n"); _lwrite(hfOutputFile, outputString, strlen(outputString)); StatusBarText(outputFileName); // // Traverse the Routes Table // rcode2 = btrieve(B_GETFIRST, TMS_ROUTES, &ROUTES, &ROUTESKey1, 1); while(rcode2 == 0) { if(StatusBarAbort()) { goto done; } // // Go through the services // rcode2 = btrieve(B_GETFIRST, TMS_SERVICES, &SERVICES, &SERVICESKey1, 1); while(rcode2 == 0) { if(StatusBarAbort()) { goto done; } strncpy(szServiceCode, SERVICES.name, SERVICES_NAME_LENGTH); trim(szServiceCode, SERVICES_NAME_LENGTH); // // Get all the blocks on this route group // NODESKey1.flags = NODES_FLAG_GARAGE; memset(NODESKey1.abbrName, 0x00, NODES_ABBRNAME_LENGTH); rcode2 = btrieve(B_GETGREATEROREQUAL, TMS_NODES, &NODES, &NODESKey1, 1); bFirst = TRUE; while(rcode2 == 0 && NODES.flags & NODES_FLAG_GARAGE) { // // Cycle through the blocks // assignedToNODESrecordID = bFirst ? NO_RECORD : NODES.recordID; TRIPSKey2.assignedToNODESrecordID = assignedToNODESrecordID; TRIPSKey2.RGRPROUTESrecordID = ROUTES.recordID; TRIPSKey2.SGRPSERVICESrecordID = SERVICES.recordID; TRIPSKey2.blockNumber = 1; TRIPSKey2.blockSequence = NO_TIME; rcode2 = btrieve(B_GETGREATEROREQUAL, TMS_TRIPS, &TRIPS, &TRIPSKey2, 2); blockNumber = NO_RECORD; // // Get the first trip on the block // while(rcode2 == 0 && pTRIPSChunk->assignedToNODESrecordID == assignedToNODESrecordID && pTRIPSChunk->RGRPROUTESrecordID == ROUTES.recordID && pTRIPSChunk->SGRPSERVICESrecordID == SERVICES.recordID) { if(StatusBarAbort()) { goto done; } if(pTRIPSChunk->blockNumber != blockNumber) { seq = 1; blockNumber = pTRIPSChunk->blockNumber; } // // Gen the whole trip // GenerateTrip(TRIPS.ROUTESrecordID, TRIPS.SERVICESrecordID, TRIPS.directionIndex, TRIPS.PATTERNNAMESrecordID, TRIPS.timeAtMLP, GENERATETRIP_FLAG_DISPLAYERRORS, >Results); // // Pullout? // if(pTRIPSChunk->POGNODESrecordID == NO_RECORD) { fromNODESrecordID = GTResults.firstNODESrecordID; fromTime = GTResults.firstNodeTime; } else { GCTData.fromPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID; GCTData.toPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID; GCTData.fromROUTESrecordID = pTRIPSChunk->RGRPROUTESrecordID; GCTData.fromSERVICESrecordID = pTRIPSChunk->SGRPSERVICESrecordID; GCTData.toROUTESrecordID = pTRIPSChunk->RGRPROUTESrecordID; GCTData.toSERVICESrecordID = pTRIPSChunk->SGRPSERVICESrecordID; GCTData.fromNODESrecordID = pTRIPSChunk->POGNODESrecordID; GCTData.toNODESrecordID = GTResults.firstNODESrecordID; GCTData.timeOfDay = GTResults.firstNodeTime; dhd = GetConnectionTime(GCT_FLAG_DEADHEADTIME, &GCTData, &distance); distance = (float)fabs((double)distance); if(dhd == NO_TIME) { dhd = 0; } fromNODESrecordID = pTRIPSChunk->POGNODESrecordID; fromTime = GTResults.firstNodeTime - dhd; // // Output the pull-out deadhead record // // Start and End Stop codes // NODESKey0.recordID = pTRIPSChunk->POGNODESrecordID; btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0); strncpy(tempString, NODES.abbrName, NODES_ABBRNAME_LENGTH); trim(tempString, NODES_ABBRNAME_LENGTH); NODESKey0.recordID = GTResults.firstNODESrecordID; btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0); strncpy(szarString, NODES.abbrName, NODES_ABBRNAME_LENGTH); trim(szarString, NODES_ABBRNAME_LENGTH); // // Write it // sprintf(outputString, "\"%ld\",\"%s\",\"\",\"%d\",\"%s\",\"%s\",\"False\"\r\n", pTRIPSChunk->blockNumber, szServiceCode, seq, tempString, szarString); _lwrite(hfOutputFile, outputString, strlen(outputString)); seq++; } // // Start/end trip details // sprintf(szTripCode, "%ld", TRIPS.tripNumber); // // Start and End Stop codes // NODESKey0.recordID = GTResults.firstNODESrecordID; btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0); strncpy(tempString, NODES.abbrName, NODES_ABBRNAME_LENGTH); trim(tempString, NODES_ABBRNAME_LENGTH); NODESKey0.recordID = GTResults.lastNODESrecordID; btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0); strncpy(szarString, NODES.abbrName, NODES_ABBRNAME_LENGTH); trim(szarString, NODES_ABBRNAME_LENGTH); // // Write it // sprintf(outputString, "\"%ld\",\"%s\",\"%s\",\"%d\",\"%s\",\"%s\",\"True\"\r\n", pTRIPSChunk->blockNumber, szServiceCode, szTripCode, seq, tempString, szarString); _lwrite(hfOutputFile, outputString, strlen(outputString)); seq++; // // Pullin // if(pTRIPSChunk->PIGNODESrecordID == NO_RECORD) { toNODESrecordID = GTResults.lastNODESrecordID; toTime = GTResults.lastNodeTime; } else { GCTData.fromPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID; GCTData.toPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID; GCTData.fromROUTESrecordID = pTRIPSChunk->RGRPROUTESrecordID; GCTData.fromSERVICESrecordID = pTRIPSChunk->SGRPSERVICESrecordID; GCTData.toROUTESrecordID = pTRIPSChunk->RGRPROUTESrecordID; GCTData.toSERVICESrecordID = pTRIPSChunk->SGRPSERVICESrecordID; GCTData.fromNODESrecordID = GTResults.lastNODESrecordID; GCTData.toNODESrecordID = pTRIPSChunk->PIGNODESrecordID; GCTData.timeOfDay = GTResults.lastNodeTime; dhd = GetConnectionTime(GCT_FLAG_DEADHEADTIME, &GCTData, &distance); distance = (float)fabs((double)distance); if(dhd == NO_TIME) { dhd = 0; } toNODESrecordID = pTRIPSChunk->PIGNODESrecordID; toTime = GTResults.lastNodeTime + dhd; // // Output the pull-in deadhead record // // Start and End Stop codes // NODESKey0.recordID = GTResults.lastNODESrecordID; btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0); strncpy(tempString, NODES.abbrName, NODES_ABBRNAME_LENGTH); trim(tempString, NODES_ABBRNAME_LENGTH); NODESKey0.recordID = pTRIPSChunk->PIGNODESrecordID; btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0); strncpy(szarString, NODES.abbrName, NODES_ABBRNAME_LENGTH); trim(szarString, NODES_ABBRNAME_LENGTH); // // Write it // sprintf(outputString, "\"%ld\",\"%s\",\"\",\"%d\",\"%s\",\"%s\",\"False\"\r\n", pTRIPSChunk->blockNumber, szServiceCode, seq, tempString, szarString); _lwrite(hfOutputFile, outputString, strlen(outputString)); seq++; } rcode2 = btrieve(B_GETNEXT, TMS_TRIPS, &TRIPS, &TRIPSKey2, 2); } // while blocks on this garage node // // Get the next garage node // if(bFirst) { bFirst = FALSE; } else { rcode2 = btrieve(B_GETNEXT, TMS_NODES, &NODES, &NODESKey1, 1); } } // while cycling through garage nodes // // Get the next service // rcode2 = btrieve(B_GETNEXT, TMS_SERVICES, &SERVICES, &SERVICESKey1, 1); } // // Get the next route // rcode2 = btrieve(B_GETNEXT, TMS_ROUTES, &ROUTES, &ROUTESKey1, 1); } // // Close the file // _lclose(hfOutputFile); // // All done // StatusBar(-1L, -1L); bFinishedOK = TRUE; done: chdir(".."); // Back to where we started from StatusBarEnd(); if(!bFinishedOK) { TMSError((HWND)NULL, MB_ICONINFORMATION, ERROR_227, (HANDLE)NULL); } if(bGotError) { TMSError((HWND)NULL, MB_ICONINFORMATION, ERROR_350, (HANDLE)NULL); } _lclose(hfErrorLog); distanceMeasure = distanceMeasureSave; recordLength[TMS_COMMENTS] = COMMENTS_FIXED_LENGTH; return(bFinishedOK); }
BOOL CDailyOpsRS::OnInitDialog() { CDialog::OnInitDialog(); // // Set up poiners to the controls // pListCtrlPOTENTIALSPLITS = (CListCtrl *)GetDlgItem(DAILYOPSRS_POTENTIALSPLITS); pListCtrlCURRENTSPLITS = (CListCtrl *)GetDlgItem(DAILYOPSRS_CURRENTSPLITS); pComboBoxSTARTSPLIT = (CComboBox *)GetDlgItem(DAILYOPSRS_STARTSPLIT); pComboBoxENDSPLIT = (CComboBox *)GetDlgItem(DAILYOPSRS_ENDSPLIT); pButtonIDREMOVE = (CButton *)GetDlgItem(IDREMOVE); pButtonIDCANCEL = (CButton *)GetDlgItem(IDCANCEL); // // Initialize m_RP // int nI; for(nI = 0; nI < RPMAX; nI++) { m_RP[nI].TRIPSrecordID = NO_RECORD; m_RP[nI].NODESrecordID = NO_RECORD; m_RP[nI].time = NO_TIME; m_RP[nI].flags = 0; m_RP[nI].startDRIVERSrecordID = NO_RECORD; m_RP[nI].endDRIVERSrecordID = NO_RECORD; m_RP[nI].DAILYOPSrecordID = NO_RECORD; } // // What type of run is this? // m_bCrewOnly = (m_pPassedData->flags & RUNSPLIT_FLAGS_CREWONLY); // // Get the run details // long runNumber; int rcode2; if(m_bCrewOnly) { CREWONLY.recordID = m_pPassedData->RUNSrecordID; rcode2 = btrieve(B_GETEQUAL, TMS_CREWONLY, &CREWONLY, &CREWONLYKey0, 0); runNumber = CREWONLY.runNumber; } else { RUNSKey0.recordID = m_pPassedData->RUNSrecordID; rcode2 = btrieve(B_GETEQUAL, TMS_RUNS, &RUNS, &RUNSKey0, 0); runNumber = RUNS.runNumber; } if(rcode2 != 0) { sprintf(tempString, "Invalid RUNSrecordID passed to DailyOpsRS\n\nValue was %ld", m_pPassedData->RUNSrecordID); MessageBox(tempString, TMS, MB_OK); OnCancel(); return TRUE; } // // Put the run number in the title. On an automatic, // add the driver's name and a notification to the bar. // GetWindowText(szFormatString, SZFORMATSTRING_LENGTH); sprintf(tempString, szFormatString, runNumber); if(m_pPassedData->flags & RUNSPLIT_FLAGS_AUTOMATIC) { strcat(tempString, " - Due to absence of "); strcat(tempString, BuildOperatorString(m_pPassedData->DRIVERSrecordID)); pButtonIDCANCEL->EnableWindow(FALSE); } SetWindowText(tempString); // // Set the styles for the list controls // DWORD dwExStyles; dwExStyles = pListCtrlPOTENTIALSPLITS->GetExtendedStyle(); pListCtrlPOTENTIALSPLITS->SetExtendedStyle(dwExStyles | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_INFOTIP); dwExStyles = pListCtrlCURRENTSPLITS->GetExtendedStyle(); pListCtrlCURRENTSPLITS->SetExtendedStyle(dwExStyles | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_INFOTIP); // // Set up the headers on the potential splits list control // LVCOLUMN LVC; LVC.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH; LVC.fmt = LVCFMT_CENTER; LVC.cx = 42; LVC.pszText = "Status"; pListCtrlPOTENTIALSPLITS->InsertColumn(0, &LVC); LVC.cx = 50; LVC.pszText = "Relief"; pListCtrlPOTENTIALSPLITS->InsertColumn(1, &LVC); LVC.cx = 50; LVC.pszText = "At"; pListCtrlPOTENTIALSPLITS->InsertColumn(2, &LVC); // // Set up the headers on the current splits list control // LVC.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH; LVC.fmt = LVCFMT_CENTER; LVC.cx = 25; LVC.pszText = ""; pListCtrlCURRENTSPLITS->InsertColumn(0, &LVC); LVC.cx = 50; LVC.pszText = "Relief"; pListCtrlCURRENTSPLITS->InsertColumn(1, &LVC); LVC.cx = 50; LVC.pszText = "At"; pListCtrlCURRENTSPLITS->InsertColumn(2, &LVC); LVC.cx = 50; LVC.pszText = "Relief"; pListCtrlCURRENTSPLITS->InsertColumn(3, &LVC); LVC.cx = 50; LVC.pszText = "At"; pListCtrlCURRENTSPLITS->InsertColumn(4, &LVC); GenerateTripDef GTResults; GetConnectionTimeDef GCTData; float distance; BOOL bFound; BOOL bStartOfPiece; BOOL bEndOfPiece; BOOL bCrewOnly; long pieceNumber; long serviceRecordID; long runtype; long dhdTime; long serviceNumber; long assignedToNODESrecordID; long RGRPROUTESrecordID; long SGRPSERVICESrecordID; long blockNumber; int counter; int serviceIndex; m_numRP = 0; // // Crew only runs - get the start/end timepoints and times // if(m_bCrewOnly) { m_RP[m_numRP].NODESrecordID = CREWONLY.startNODESrecordID; m_RP[m_numRP].time = CREWONLY.startTime; m_RP[m_numRP].flags = RP_FLAGS_STARTOFPIECE; m_RP[m_numRP].TRIPSrecordID = NO_RECORD; m_numRP++; m_RP[m_numRP].NODESrecordID = CREWONLY.endNODESrecordID; m_RP[m_numRP].time = CREWONLY.endTime; m_RP[m_numRP].flags = RP_FLAGS_ENDOFPIECE; m_RP[m_numRP].TRIPSrecordID = NO_RECORD; m_numRP++; } // // Regular runs are a little more complicated // else { // // Determine the service index/number // SERVICESKey0.recordID = m_pPassedData->SERVICESrecordIDInEffect; btrieve(B_GETEQUAL, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0); serviceNumber = SERVICES.number; // // Set up the index into the node labels string // serviceIndex = m_ServiceNumber - 1; if(serviceIndex < 0 || serviceIndex > NODES_RELIEFLABELS_LENGTH - 1) { serviceIndex = 0; } // // Get some pertinent run information // PROPOSEDRUNDef PROPOSEDRUN; COSTDef COST; GetRunElements(NULL, &RUNS, &PROPOSEDRUN, &COST, TRUE); if(m_bCrewOnly) { CREWONLY.recordID = m_pPassedData->RUNSrecordID; rcode2 = btrieve(B_GETEQUAL, TMS_CREWONLY, &CREWONLY, &CREWONLYKey0, 0); runNumber = CREWONLY.runNumber; } else { RUNSKey0.recordID = m_pPassedData->RUNSrecordID; rcode2 = btrieve(B_GETEQUAL, TMS_RUNS, &RUNS, &RUNSKey0, 0); runNumber = RUNS.runNumber; } // // Cycle through the run // runNumber = RUNS.runNumber; serviceRecordID = RUNS.SERVICESrecordID; runtype = RUNS.cutAsRuntype; btrieve(B_GETPOSITION, TMS_RUNS, &RUNS, &RUNSKey0, 0); rcode2 = btrieve(B_GETDIRECT, TMS_RUNS, &RUNS, &RUNSKey1, 1); while(rcode2 == 0 && runNumber == RUNS.runNumber && serviceRecordID == RUNS.SERVICESrecordID) { pieceNumber = RUNS.pieceNumber - 1; // // Get the report at location and time // if(COST.TRAVEL[pieceNumber].startNODESrecordID == NO_RECORD) { m_RP[m_numRP].NODESrecordID = PROPOSEDRUN.piece[pieceNumber].fromNODESrecordID; } else { m_RP[m_numRP].NODESrecordID = COST.TRAVEL[pieceNumber].startNODESrecordID; } m_RP[m_numRP].time = PROPOSEDRUN.piece[pieceNumber].fromTime - COST.PIECECOST[pieceNumber].reportTime - COST.TRAVEL[pieceNumber].startTravelTime; if(PROPOSEDRUN.piece[pieceNumber].prior.startTime != NO_TIME) { m_RP[m_numRP].time -= PROPOSEDRUN.piece[pieceNumber].prior.startTime; } m_RP[m_numRP].flags = RP_FLAGS_STARTOFPIECE; m_RP[m_numRP].TRIPSrecordID = NO_RECORD; m_numRP++; // // Generate the start trip // TRIPSKey0.recordID = RUNS.start.TRIPSrecordID; btrieve(B_GETEQUAL, TMS_TRIPS, &TRIPS, &TRIPSKey0, 0); GenerateTrip(TRIPS.ROUTESrecordID, TRIPS.SERVICESrecordID, TRIPS.directionIndex, TRIPS.PATTERNNAMESrecordID, TRIPS.timeAtMLP, GENERATETRIP_FLAG_DISPLAYERRORS | GENERATETRIP_FLAG_GETLABELS, >Results); // // Is the node a pullout? // bFound = FALSE; // bStartOfPiece = TRUE; if(TRIPS.standard.POGNODESrecordID == RUNS.start.NODESrecordID) { GCTData.fromPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID; GCTData.toPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID; GCTData.fromROUTESrecordID = TRIPS.standard.RGRPROUTESrecordID; GCTData.fromSERVICESrecordID = TRIPS.standard.SGRPSERVICESrecordID; GCTData.toROUTESrecordID = TRIPS.standard.RGRPROUTESrecordID; GCTData.toSERVICESrecordID = TRIPS.standard.SGRPSERVICESrecordID; GCTData.fromNODESrecordID = TRIPS.standard.POGNODESrecordID; GCTData.toNODESrecordID = GTResults.firstNODESrecordID; GCTData.timeOfDay = GTResults.firstNodeTime; dhdTime = GetConnectionTime(GCT_FLAG_DEADHEADTIME, &GCTData, &distance); m_RP[m_numRP].NODESrecordID = RUNS.start.NODESrecordID; m_RP[m_numRP].time = GTResults.firstNodeTime - (dhdTime == NO_TIME ? 0 : dhdTime); // m_RP[m_numRP].flags = RP_FLAGS_STARTOFPIECE; m_RP[m_numRP].flags = 0; m_RP[m_numRP].TRIPSrecordID = TRIPS.recordID; m_numRP++; bFound = TRUE; // bStartOfPiece = FALSE; } // // Find any relief points on the trip // PATTERNSKey2.ROUTESrecordID = TRIPS.ROUTESrecordID; PATTERNSKey2.SERVICESrecordID = TRIPS.SERVICESrecordID; PATTERNSKey2.directionIndex = TRIPS.directionIndex; PATTERNSKey2.PATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID; PATTERNSKey2.nodeSequence = NO_RECORD; rcode2 = btrieve(B_GETGREATEROREQUAL, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2); counter = 0; // // Ensure that if there wasn't a P/O that we're starting at the right node // while(rcode2 == 0 && PATTERNS.ROUTESrecordID == TRIPS.ROUTESrecordID && PATTERNS.SERVICESrecordID == TRIPS.SERVICESrecordID && PATTERNS.directionIndex == TRIPS.directionIndex && PATTERNS.PATTERNNAMESrecordID == TRIPS.PATTERNNAMESrecordID) { if(!(PATTERNS.flags & PATTERNS_FLAG_BUSSTOP)) { if(bFound || PATTERNS.NODESrecordID == RUNS.start.NODESrecordID) { bFound = TRUE; // In case we've hit PATTERNS.NODESrecordID == startNODESrecordID NODESKey0.recordID = PATTERNS.NODESrecordID; btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0); if(CheckNodeLabel(GTResults.labelledNODESrecordIDs[counter], &NODES, (int)serviceIndex)) { m_RP[m_numRP].NODESrecordID = PATTERNS.NODESrecordID; m_RP[m_numRP].time = GTResults.tripTimes[counter]; // if(bStartOfPiece) // { // m_RP[m_numRP].flags = RP_FLAGS_STARTOFPIECE; // bStartOfPiece = FALSE; // } // else // { m_RP[m_numRP].flags = 0; // } m_RP[m_numRP].TRIPSrecordID = TRIPS.recordID; m_numRP++; } } counter++; } rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2); } // // Does the first trip pull in? // bFound = FALSE; if(TRIPS.standard.PIGNODESrecordID == RUNS.end.NODESrecordID) { GCTData.fromPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID; GCTData.toPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID; GCTData.fromROUTESrecordID = TRIPS.standard.RGRPROUTESrecordID; GCTData.fromSERVICESrecordID = TRIPS.standard.SGRPSERVICESrecordID; GCTData.toROUTESrecordID = TRIPS.standard.RGRPROUTESrecordID; GCTData.toSERVICESrecordID = TRIPS.standard.SGRPSERVICESrecordID; GCTData.fromNODESrecordID = GTResults.lastNODESrecordID; GCTData.toNODESrecordID = TRIPS.standard.PIGNODESrecordID; GCTData.timeOfDay = GTResults.lastNodeTime; dhdTime = GetConnectionTime(GCT_FLAG_DEADHEADTIME, &GCTData, &distance); m_RP[m_numRP].NODESrecordID = RUNS.end.NODESrecordID; m_RP[m_numRP].time = GTResults.lastNodeTime + (dhdTime == NO_TIME ? 0 : dhdTime); // m_RP[m_numRP].flags = RP_FLAGS_ENDOFPIECE; m_RP[m_numRP].flags = 0; m_RP[m_numRP].TRIPSrecordID = TRIPS.recordID; m_numRP++; bFound = TRUE; } // // Continue through the rest of the block unless we've already pulled-in // if(!bFound) { TRIPSKey0.recordID = RUNS.start.TRIPSrecordID; btrieve(B_GETEQUAL, TMS_TRIPS, &TRIPS, &TRIPSKey0, 0); btrieve(B_GETPOSITION, TMS_TRIPS, &TRIPS, &TRIPSKey0, 0); rcode2 = btrieve(B_GETDIRECT, TMS_TRIPS, &TRIPS, &TRIPSKey2, 2); assignedToNODESrecordID = TRIPS.standard.assignedToNODESrecordID; RGRPROUTESrecordID = TRIPS.standard.RGRPROUTESrecordID; SGRPSERVICESrecordID = TRIPS.standard.SGRPSERVICESrecordID; blockNumber = TRIPS.standard.blockNumber; rcode2 = btrieve(B_GETNEXT, TMS_TRIPS, &TRIPS, &TRIPSKey2, 2); bEndOfPiece = FALSE; while(rcode2 == 0 && TRIPS.standard.assignedToNODESrecordID == assignedToNODESrecordID && TRIPS.standard.RGRPROUTESrecordID == RGRPROUTESrecordID && TRIPS.standard.SGRPSERVICESrecordID == SGRPSERVICESrecordID && TRIPS.standard.blockNumber == blockNumber) { // // Generate the trip // GenerateTrip(TRIPS.ROUTESrecordID, TRIPS.SERVICESrecordID, TRIPS.directionIndex, TRIPS.PATTERNNAMESrecordID, TRIPS.timeAtMLP, GENERATETRIP_FLAG_DISPLAYERRORS | GENERATETRIP_FLAG_GETLABELS, >Results); // // Find any relief points on the trip // PATTERNSKey2.ROUTESrecordID = TRIPS.ROUTESrecordID; PATTERNSKey2.SERVICESrecordID = TRIPS.SERVICESrecordID; PATTERNSKey2.directionIndex = TRIPS.directionIndex; PATTERNSKey2.PATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID; PATTERNSKey2.nodeSequence = NO_RECORD; rcode2 = btrieve(B_GETGREATEROREQUAL, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2); counter = 0; while(rcode2 == 0 && PATTERNS.ROUTESrecordID == TRIPS.ROUTESrecordID && PATTERNS.SERVICESrecordID == TRIPS.SERVICESrecordID && PATTERNS.directionIndex == TRIPS.directionIndex && PATTERNS.PATTERNNAMESrecordID == TRIPS.PATTERNNAMESrecordID) { if(!(PATTERNS.flags & PATTERNS_FLAG_BUSSTOP)) { if(TRIPS.recordID == RUNS.end.TRIPSrecordID && PATTERNS.NODESrecordID == RUNS.end.NODESrecordID) { m_RP[m_numRP].NODESrecordID = PATTERNS.NODESrecordID; m_RP[m_numRP].time = GTResults.tripTimes[counter]; // m_RP[m_numRP].flags = RP_FLAGS_ENDOFPIECE; m_RP[m_numRP].flags = 0; bEndOfPiece = TRUE; m_RP[m_numRP].TRIPSrecordID = TRIPS.recordID; m_numRP++; break; } else { NODESKey0.recordID = PATTERNS.NODESrecordID; btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0); if(CheckNodeLabel(GTResults.labelledNODESrecordIDs[counter], &NODES, (int)serviceIndex)) { m_RP[m_numRP].NODESrecordID = PATTERNS.NODESrecordID; m_RP[m_numRP].time = GTResults.tripTimes[counter]; m_RP[m_numRP].flags = 0; m_RP[m_numRP].TRIPSrecordID = TRIPS.recordID; m_numRP++; } } counter++; } rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2); } // // Check for a pull-in // if(TRIPS.standard.PIGNODESrecordID == RUNS.end.NODESrecordID) { GCTData.fromPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID; GCTData.toPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID; GCTData.fromROUTESrecordID = TRIPS.standard.RGRPROUTESrecordID; GCTData.fromSERVICESrecordID = TRIPS.standard.SGRPSERVICESrecordID; GCTData.toROUTESrecordID = TRIPS.standard.RGRPROUTESrecordID; GCTData.toSERVICESrecordID = TRIPS.standard.SGRPSERVICESrecordID; GCTData.fromNODESrecordID = GTResults.lastNODESrecordID; GCTData.toNODESrecordID = TRIPS.standard.PIGNODESrecordID; GCTData.timeOfDay = GTResults.lastNodeTime; dhdTime = GetConnectionTime(GCT_FLAG_DEADHEADTIME, &GCTData, &distance); m_RP[m_numRP].NODESrecordID = RUNS.end.NODESrecordID; m_RP[m_numRP].time = GTResults.lastNodeTime + (dhdTime == NO_TIME ? 0 : dhdTime); // m_RP[m_numRP].flags = RP_FLAGS_ENDOFPIECE; m_RP[m_numRP].flags = 0; bEndOfPiece = TRUE; m_RP[m_numRP].TRIPSrecordID = TRIPS.recordID; m_numRP++; } // // If we've hit the end of the piece, we're done // if(bEndOfPiece) { // // Get the turnin location and time if they differ from where we are // if(COST.TRAVEL[pieceNumber].endNODESrecordID == NO_RECORD) { m_RP[m_numRP - 1].flags = RP_FLAGS_ENDOFPIECE; } else { if(COST.TRAVEL[pieceNumber].endNODESrecordID == NO_RECORD) { m_RP[m_numRP].NODESrecordID = PROPOSEDRUN.piece[pieceNumber].toNODESrecordID; } else { m_RP[m_numRP].NODESrecordID = COST.TRAVEL[pieceNumber].endNODESrecordID; } m_RP[m_numRP].time = PROPOSEDRUN.piece[pieceNumber].toTime + COST.PIECECOST[pieceNumber].turninTime + COST.TRAVEL[pieceNumber].endTravelTime; if(PROPOSEDRUN.piece[pieceNumber].after.endTime != NO_TIME) { m_RP[m_numRP].time += PROPOSEDRUN.piece[pieceNumber].after.endTime; } m_RP[m_numRP].flags = RP_FLAGS_ENDOFPIECE; m_RP[m_numRP].TRIPSrecordID = NO_RECORD; m_numRP++; } break; } // // Get the next trip in the block // rcode2 = btrieve(B_GETNEXT, TMS_TRIPS, &TRIPS, &TRIPSKey2, 2); } } // // Get the next piece of the run // rcode2 = btrieve(B_GETNEXT, TMS_RUNS, &RUNS, &RUNSKey1, 1); } } // // Put any inseted points into the list // int currentRP = m_numRP; DAILYOPSKey1.recordTypeFlag = DAILYOPS_FLAG_OPENWORK; DAILYOPSKey1.recordFlags = DAILYOPS_FLAG_RUNSPLITINSERT; DAILYOPSKey1.pertainsToDate = m_pPassedData->pertainsToDate; DAILYOPSKey1.pertainsToTime = NO_TIME; rcode2 = btrieve(B_GETGREATEROREQUAL, TMS_DAILYOPS, &DAILYOPS, &DAILYOPSKey1, 1); while(rcode2 == 0 && DAILYOPS.recordTypeFlag == DAILYOPS_FLAG_OPENWORK && DAILYOPS.pertainsToDate == m_pPassedData->pertainsToDate) { if(DAILYOPS.recordFlags & DAILYOPS_FLAG_RUNSPLITINSERT) { if(DAILYOPS.DAILYOPSrecordID == NO_RECORD) // not deleted { bCrewOnly = DAILYOPS.DOPS.OpenWork.splitStartTRIPSrecordID; // used on a run split insert if(m_bCrewOnly == bCrewOnly) { if(DAILYOPS.DOPS.OpenWork.RUNSrecordID == m_pPassedData->RUNSrecordID) { m_RP[m_numRP].NODESrecordID = DAILYOPS.DOPS.OpenWork.splitStartNODESrecordID; m_RP[m_numRP].time = DAILYOPS.DOPS.OpenWork.splitStartTime; m_RP[m_numRP].TRIPSrecordID = NO_RECORD; m_RP[m_numRP].DAILYOPSrecordID = DAILYOPS.recordID; m_RP[m_numRP].flags |= RP_FLAGS_INSERTED; m_numRP++; } } } } rcode2 = btrieve(B_GETNEXT, TMS_DAILYOPS, &DAILYOPS, &DAILYOPSKey1, 1); } // // If there were any additions, sort the list // if(m_numRP != currentRP) { qsort((void *)m_RP, m_numRP, sizeof(RPDef), sort_RP); } // // Get the current splits // LVITEM LVI; BOOL bRecordFlag = (m_bCrewOnly ? DAILYOPS_FLAG_RUNSPLITCREWONLY : DAILYOPS_FLAG_RUNSPLIT); int numCurrent = 0; int startIndex, endIndex; DAILYOPSKey1.recordTypeFlag = DAILYOPS_FLAG_OPENWORK; DAILYOPSKey1.recordFlags = 0; //bRecordFlag; DAILYOPSKey1.pertainsToDate = m_pPassedData->pertainsToDate; DAILYOPSKey1.pertainsToTime = NO_TIME; rcode2 = btrieve(B_GETGREATEROREQUAL, TMS_DAILYOPS, &DAILYOPS, &DAILYOPSKey1, 1); while(rcode2 == 0 && DAILYOPS.recordTypeFlag == DAILYOPS_FLAG_OPENWORK && DAILYOPS.pertainsToDate == m_pPassedData->pertainsToDate) { if(DAILYOPS.recordFlags & bRecordFlag) { if(!ANegatedRecord(DAILYOPS.recordID, 1)) // if(DAILYOPS.DAILYOPSrecordID == NO_RECORD && // !(DAILYOPS.recordFlags & DAILYOPS_FLAG_OPENWORKASSIGN)) // not unsplit prior to this { if(DAILYOPS.DOPS.OpenWork.RUNSrecordID == m_pPassedData->RUNSrecordID) { // // Get the start of the split // for(startIndex = NO_RECORD, nI = 0; nI < m_numRP; nI++) { if(DAILYOPS.DOPS.OpenWork.splitStartNODESrecordID == m_RP[nI].NODESrecordID && DAILYOPS.DOPS.OpenWork.splitStartTime == m_RP[nI].time) { startIndex = nI; break; } } // // Get the end of the split // if(startIndex != NO_RECORD) { for(endIndex = NO_RECORD, nI = startIndex + 1; nI < m_numRP; nI++) { if(DAILYOPS.DOPS.OpenWork.splitEndNODESrecordID == m_RP[nI].NODESrecordID && DAILYOPS.DOPS.OpenWork.splitEndTime == m_RP[nI].time) { endIndex = nI; break; } } // // Got both start and end // if(endIndex != NO_RECORD) { // // Set the flags // for(nI = startIndex; nI <= endIndex; nI++) { if(nI == startIndex) { m_RP[nI].flags |= RP_FLAGS_SPLITATSTART; m_RP[nI].startDRIVERSrecordID = DAILYOPS.DRIVERSrecordID; } else if(nI == endIndex) { m_RP[nI].flags |= RP_FLAGS_SPLITATEND; m_RP[nI].endDRIVERSrecordID = DAILYOPS.DRIVERSrecordID; } else { m_RP[nI].flags |= RP_FLAGS_SPLITMIDDLE; m_RP[nI].startDRIVERSrecordID = DAILYOPS.DRIVERSrecordID; m_RP[nI].endDRIVERSrecordID = DAILYOPS.DRIVERSrecordID; } } // // Display it in the current splits // LVI.mask = LVIF_TEXT | LVIF_PARAM; LVI.iItem = numCurrent; LVI.iSubItem = 0; itoa(numCurrent + 1, tempString, 10); LVI.pszText = tempString; LVI.lParam = MAKELONG(startIndex, endIndex); LVI.iItem = pListCtrlCURRENTSPLITS->InsertItem(&LVI); // // Node // NODESKey0.recordID = DAILYOPS.DOPS.OpenWork.splitStartNODESrecordID; btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0); strncpy(szarString, NODES.abbrName, NODES_ABBRNAME_LENGTH); trim(szarString, NODES_ABBRNAME_LENGTH); LVI.mask = LVIF_TEXT; LVI.iItem = numCurrent; LVI.iSubItem = 1; LVI.pszText = szarString; LVI.iItem = pListCtrlCURRENTSPLITS->SetItem(&LVI); // // At // strcpy(tempString, Tchar(DAILYOPS.DOPS.OpenWork.splitStartTime)); LVI.mask = LVIF_TEXT; LVI.iItem = numCurrent; LVI.iSubItem = 2; LVI.pszText = tempString; LVI.iItem = pListCtrlCURRENTSPLITS->SetItem(&LVI); // // Node // NODESKey0.recordID = DAILYOPS.DOPS.OpenWork.splitEndNODESrecordID; btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0); strncpy(szarString, NODES.abbrName, NODES_ABBRNAME_LENGTH); trim(szarString, NODES_ABBRNAME_LENGTH); LVI.mask = LVIF_TEXT; LVI.iItem = numCurrent; LVI.iSubItem = 3; LVI.pszText = szarString; LVI.iItem = pListCtrlCURRENTSPLITS->SetItem(&LVI); // // At // strcpy(tempString, Tchar(DAILYOPS.DOPS.OpenWork.splitEndTime)); LVI.mask = LVIF_TEXT; LVI.iItem = numCurrent; LVI.iSubItem = 4; LVI.pszText = tempString; LVI.iItem = pListCtrlCURRENTSPLITS->SetItem(&LVI); numCurrent++; } } } } } rcode2 = btrieve(B_GETNEXT, TMS_DAILYOPS, &DAILYOPS, &DAILYOPSKey1, 1); } // // List all the potential split points and times // DisplayPotentials(); // // Dropdowns // DisplayDropdowns(); // // When we come in with the AUTOMATIC flag, it means that an // absence has been registered and we're generating this run // split, well, automatically, Position the selections to be // as close to the start and end of the incoming times as // possible, and fire up an OnPreview() to see where it sits // if(m_pPassedData->flags & RUNSPLIT_FLAGS_AUTOMATIC) { /* startIndex = NO_RECORD; endIndex = NO_RECORD; for(nI = 0; nI < m_numRP; nI++) { if(m_pPassedData->fromTime <= m_RP[nI].time && startIndex == NO_RECORD) { startIndex = nI; } endIndex = nI; if(m_pPassedData->toTime <= m_RP[nI].time) { break; } } for(nI = startIndex; nI <= endIndex; nI++) { if(nI == startIndex) { m_RP[nI].flags |= RP_FLAGS_SPLITATSTART; } else if(nI == endIndex) { m_RP[nI].flags |= RP_FLAGS_SPLITATEND; } else { m_RP[nI].flags |= RP_FLAGS_SPLITMIDDLE; } } */ OnPreview(); } return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }
BOOL CALLBACK ADDBLOCKMsgProc(HWND hWndDlg, UINT Message, WPARAM wParam, LPARAM lParam) { typedef struct STATSStruct { float dhdDist; long dhdTime; long layTime; float revDist; long revTime; } STATSDef; typedef struct PARMSStruct { BOOL bStandard; BOOL bDropback; BOOL bInterlining; BOOL bServiceWrap; BOOL bDeadheading; BOOL bDeadheadAll; long maxDeadheadTime; } PARMSDef; static PDISPLAYINFO pDI; static HANDLE hCtlALLROUTES; static HANDLE hCtlCC; static HANDLE hCtlCOMMENTCODE; static HANDLE hCtlORROUTE; static HANDLE hCtlFROMROUTE; static HANDLE hCtlFROMSERVICE; static HANDLE hCtlLISTBOXTITLE; static HANDLE hCtlTRIPS; static HANDLE hCtlMIN; static HANDLE hCtlMINVEHICLES; static HANDLE hCtlMAX; static HANDLE hCtlMAXVEHICLES; static HANDLE hCtlILYES; static HANDLE hCtlILNO; static HANDLE hCtlSWYES; static HANDLE hCtlSWNO; static HANDLE hCtlDHYES; static HANDLE hCtlDHNO; static HANDLE hCtlDEADHEADALL; static HANDLE hCtlDEADHEADTHOSE; static HANDLE hCtlDEADHEADMINS; static HANDLE hCtlTEXT_MINUTES; static HANDLE hCtlIDREMOVE; static HANDLE hCtlIDPREVIEW; static HANDLE hCtlIDOPTIMAL; static HANDLE hCtlIDMANUAL; static HANDLE hCtlSTANDARD; static HANDLE hCtlDROPBACK; static HANDLE hCtlDEADHEADSTOUSE; static int tabPos[TABSET] = {32}; GenerateTripDef GTResults; GetConnectionTimeDef GCTData; PARMSDef PARMS; BLOCKSDef *pTRIPSChunk; LAYOVERDef *pLayover; float distance; short int wmId; short int wmEvent; BOOL bFound; BOOL bEnable; BOOL bAbort; char routeName[ROUTES_NAME_LENGTH + 1]; char routeNumber[ROUTES_NUMBER_LENGTH + 1]; char serviceName[SERVICES_NAME_LENGTH + 1]; long fromRouteRecordID; long fromServiceRecordID; long lastBlock; long minutes; long percent; long tempLong; long minVehicles; long maxVehicles; long commentRecordID; long position; long flags; long dhd; WORD DlgWidthUnits; int adjustedTabPos[TABSET]; int nI; int nJ; int nK; int nRc; int rcode2; int numRoutes; int numTrips; int maxTrips; int numComments; int numSelected; int fromRoutePosition; int fromServicePosition; int blockingType; int layoverType; long *pTRIPSrecordIDs = NULL; int *pSelected = NULL; switch(Message) { // // WM_INITDIALOG - Initialize the dialog // case WM_INITDIALOG: pDI = (PDISPLAYINFO)lParam; if(pDI == NULL) { SendMessage(hWndDlg, WM_COMMAND, MAKEWPARAM(IDCANCEL, 0), (LPARAM)0); break; } m_numConnectionAlerts = 0; // // Set up some control handles for later use // hCtlALLROUTES = GetDlgItem(hWndDlg, ADDBLOCK_ALLROUTES); hCtlCC = GetDlgItem(hWndDlg, ADDBLOCK_CC); hCtlCOMMENTCODE = GetDlgItem(hWndDlg, ADDBLOCK_COMMENTCODE); hCtlORROUTE = GetDlgItem(hWndDlg, ADDBLOCK_ORROUTE); hCtlFROMROUTE = GetDlgItem(hWndDlg, ADDBLOCK_FROMROUTE); hCtlFROMSERVICE = GetDlgItem(hWndDlg, ADDBLOCK_FROMSERVICE); hCtlLISTBOXTITLE = GetDlgItem(hWndDlg, ADDBLOCK_LISTBOXTITLE); hCtlTRIPS = GetDlgItem(hWndDlg, ADDBLOCK_TRIPS); hCtlMIN = GetDlgItem(hWndDlg, ADDBLOCK_MIN); hCtlMINVEHICLES = GetDlgItem(hWndDlg, ADDBLOCK_MINVEHICLES); hCtlMAX = GetDlgItem(hWndDlg, ADDBLOCK_MAX); hCtlMAXVEHICLES = GetDlgItem(hWndDlg, ADDBLOCK_MAXVEHICLES); hCtlILYES = GetDlgItem(hWndDlg, ADDBLOCK_ILYES); hCtlILNO = GetDlgItem(hWndDlg, ADDBLOCK_ILNO); hCtlSWYES = GetDlgItem(hWndDlg, ADDBLOCK_SWYES); hCtlSWNO = GetDlgItem(hWndDlg, ADDBLOCK_SWNO); hCtlDHYES = GetDlgItem(hWndDlg, ADDBLOCK_DHYES); hCtlDHNO = GetDlgItem(hWndDlg, ADDBLOCK_DHNO); hCtlDEADHEADALL = GetDlgItem(hWndDlg, ADDBLOCK_DEADHEADALL); hCtlDEADHEADTHOSE = GetDlgItem(hWndDlg, ADDBLOCK_DEADHEADTHOSE); hCtlDEADHEADMINS = GetDlgItem(hWndDlg, ADDBLOCK_DEADHEADMINS); hCtlTEXT_MINUTES = GetDlgItem(hWndDlg, ADDBLOCK_TEXT_MINUTES); hCtlIDREMOVE = GetDlgItem(hWndDlg, IDREMOVE); hCtlIDPREVIEW = GetDlgItem(hWndDlg, IDPREVIEW); hCtlIDOPTIMAL = GetDlgItem(hWndDlg, IDOPTIMAL); hCtlIDMANUAL = GetDlgItem(hWndDlg, IDMANUAL); hCtlSTANDARD = GetDlgItem(hWndDlg, ADDBLOCK_STANDARD); hCtlDROPBACK = GetDlgItem(hWndDlg, ADDBLOCK_DROPBACK); hCtlDEADHEADSTOUSE = GetDlgItem(hWndDlg, ADDBLOCK_DEADHEADSTOUSE); // // Set up the tab stops for ADDBLOCK_LISTBOXTITLE and ADDBLOCK_TRIPS // DlgWidthUnits = LOWORD(GetDialogBaseUnits()) / 4; for(nJ = 0; nJ < TABSET; nJ++) { adjustedTabPos[nJ] = (DlgWidthUnits * tabPos[nJ] * 2); } SendMessage(hCtlLISTBOXTITLE, LB_SETTABSTOPS, (WPARAM)TABSET, (LPARAM)adjustedTabPos); LoadString(hInst, TEXT_019, tempString, TEMPSTRING_LENGTH); SendMessage(hCtlLISTBOXTITLE, LB_ADDSTRING, 0, (LONG)(LPSTR)tempString); SendMessage(hCtlTRIPS, LB_SETTABSTOPS, (WPARAM)TABSET, (LPARAM)adjustedTabPos); // // Default to all routes and this service // SendMessage(hCtlALLROUTES, BM_SETCHECK, (WPARAM)TRUE, (LPARAM)0); if(SetUpServiceList(hWndDlg, ADDBLOCK_FROMSERVICE, pDI->fileInfo.serviceRecordID) == 0) { SendMessage(hWndDlg, WM_COMMAND, MAKEWPARAM(IDCANCEL, 0), (LPARAM)0); break; } // // Set up the route listbox // numRoutes = 0; SendMessage(hCtlFROMROUTE, LB_RESETCONTENT, (WPARAM)(WPARAM)0, (LPARAM)0); rcode2 = btrieve(B_GETFIRST, TMS_ROUTES, &ROUTES, &ROUTESKey1, 1); while(rcode2 == 0) { strncpy(tempString, ROUTES.number, ROUTES_NUMBER_LENGTH); trim(tempString, ROUTES_NUMBER_LENGTH); strncpy(szarString, ROUTES.name, ROUTES_NAME_LENGTH); trim(szarString, ROUTES_NAME_LENGTH); strcat(tempString, " - "); strcat(tempString, szarString); nI = (int)SendMessage(hCtlFROMROUTE, LB_ADDSTRING, (WPARAM)0, (LONG)(LPSTR)tempString); SendMessage(hCtlFROMROUTE, LB_SETITEMDATA, (WPARAM)nI, ROUTES.recordID); numRoutes++; rcode2 = btrieve(B_GETNEXT, TMS_ROUTES, &ROUTES, &ROUTESKey1, 1); } if(numRoutes == 0) { TMSError(hWndDlg, MB_ICONSTOP, ERROR_008, (HANDLE)NULL); SendMessage(hWndDlg, WM_COMMAND, MAKEWPARAM(IDCANCEL,0), (LPARAM)0); break; } // // Comment codes combo box // numComments = SetUpCommentList(hWndDlg, ADDBLOCK_COMMENTCODE); if(numComments == 0) { EnableWindow(hCtlCC, FALSE); EnableWindow(hCtlCOMMENTCODE, FALSE); } // // Default to "Min" vechicle requirements, but with a blank field // SendMessage(hCtlMIN, BM_SETCHECK, (WPARAM)TRUE, (LPARAM)0); SendMessage(hCtlMINVEHICLES, WM_SETTEXT, (WPARAM)0, (LONG)(LPSTR)""); // // Default to allowing deadheading, service wraps, and interlining // SendMessage(hCtlILYES, BM_SETCHECK, (WPARAM)TRUE, (LPARAM)0); SendMessage(hCtlSWYES, BM_SETCHECK, (WPARAM)TRUE, (LPARAM)0); SendMessage(hCtlDHYES, BM_SETCHECK, (WPARAM)TRUE, (LPARAM)0); SendMessage(hCtlDEADHEADALL, BM_SETCHECK, (WPARAM)TRUE, (LPARAM)0); // // Clear out edit controls associated with a spin control // SendMessage(hCtlDEADHEADMINS, WM_SETTEXT, (WPARAM)0, (LONG)(LPSTR)""); // // Default to this table's blocking technique // if(pDI->fileInfo.fileNumber == TMS_STANDARDBLOCKS) { SendMessage(hCtlSTANDARD, BM_SETCHECK, (WPARAM)TRUE, (LPARAM)0); EnableWindow(hCtlDROPBACK, FALSE); } else { SendMessage(hCtlDROPBACK, BM_SETCHECK, (WPARAM)TRUE, (LPARAM)0); EnableWindow(hCtlSTANDARD, FALSE); } // // Set up the m_pPICKEDTRIPS structure // if(m_pPICKEDTRIPS == NULL) { m_pPICKEDTRIPS = (PICKEDTRIPSDef *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(PICKEDTRIPSDef) * m_maxPICKEDTRIPS); if(m_pPICKEDTRIPS == NULL) { AllocationError(__FILE__, __LINE__, FALSE); goto OptimalBlockCleanup; } } // // Set up the "destination" // flags = PLACEMENT_ROUTE | PLACEMENT_SERVICE; DisplayPlacement(hWndDlg, ADDBLOCK_DESTINATION, pDI, flags); break; // // WM_CLOSE // case WM_CLOSE: SendMessage(hWndDlg, WM_COMMAND, MAKEWPARAM(IDCANCEL, 0), (LPARAM)0); break; // // WM_COMMAND // // Note: The outbound and inbound direction buttons get // disabled when the route is set to "All routes" // case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); switch(wmId) { // // ADDBLOCK_ALLROUTES radio button // case ADDBLOCK_ALLROUTES: SendMessage(hCtlFROMROUTE, LB_SETSEL, (WPARAM)(FALSE), (LPARAM)(-1)); SendMessage(hCtlCOMMENTCODE, CB_SETCURSEL, (WPARAM)(-1), (LPARAM)0); break; // // ADDBLOCK_CC radio button // case ADDBLOCK_CC: SendMessage(hCtlCOMMENTCODE, CB_SETCURSEL, (WPARAM)0, (LPARAM)0); break; // // ADDBLOCK_ORROUTE radio button // case ADDBLOCK_ORROUTE: SendMessage(hCtlCOMMENTCODE, CB_SETCURSEL, (WPARAM)(-1), (LPARAM)0); nI = (int)SendMessage(hCtlFROMROUTE, LB_GETCURSEL, (WPARAM)0, (LPARAM)0); if(nI == CB_ERR) { nJ = (int)SendMessage(hCtlFROMROUTE, LB_GETCOUNT, (WPARAM)0, (LPARAM)0); if(nJ == 0) break; for(nI = 0; nI < nJ; nI++) { tempLong = SendMessage(hCtlFROMROUTE, LB_GETITEMDATA, (WPARAM)nI, (LPARAM)0); if(tempLong == pDI->fileInfo.routeRecordID) { SendMessage(hCtlFROMROUTE, LB_SETCURSEL, (WPARAM)nI, (LPARAM)0); break; } } } // // ADDBLOCK_FROMROUTE listbox // case ADDBLOCK_FROMROUTE: switch(wmEvent) { case LBN_SELCHANGE: if(SendMessage(hCtlALLROUTES, BM_GETCHECK, (WPARAM)0, (LPARAM)0)) { SendMessage(hCtlALLROUTES, BM_SETCHECK, (WPARAM)FALSE, (LPARAM)0); SendMessage(hCtlORROUTE, BM_SETCHECK, (WPARAM)TRUE, (LPARAM)0); } break; } break; // // ADDBLOCK_LISTBOXTITLE // case ADDBLOCK_LISTBOXTITLE: // Title string SendMessage(hCtlLISTBOXTITLE, LB_SETSEL, (WPARAM)FALSE, (LPARAM)(-1)); break; // // ADDBLOCK_TRIPS // case ADDBLOCK_TRIPS: // List box switch(wmEvent) { case LBN_SELCHANGE: case LBN_SELCANCEL: bEnable = SendMessage(hCtlTRIPS, LB_GETSELCOUNT, (WPARAM)0, (LPARAM)0) > 0; EnableWindow(hCtlIDREMOVE, bEnable); EnableWindow(hCtlIDPREVIEW, bEnable); break; case LBN_DBLCLK: SendMessage(hWndDlg, WM_COMMAND, MAKEWPARAM(IDPREVIEW, 0), (LPARAM)0); EnableWindow(hCtlIDPREVIEW, TRUE); break; } break; // // ADDBLOCK_MIN // case ADDBLOCK_MIN: EnableWindow(hCtlMINVEHICLES, TRUE); EnableWindow(hCtlMAXVEHICLES, FALSE); break; // // ADDBLOCK_MAX // case ADDBLOCK_MAX: EnableWindow(hCtlMINVEHICLES, FALSE); EnableWindow(hCtlMAXVEHICLES, TRUE); break; // // ADDBLOCK_DHYES / ADDBLOCK_DHNO // case ADDBLOCK_DHYES: case ADDBLOCK_DHNO: bEnable = SendMessage(hCtlDHYES, BM_GETCHECK, (WPARAM)0, (LPARAM)0); EnableWindow(hCtlDEADHEADALL, bEnable); EnableWindow(hCtlDEADHEADSTOUSE, bEnable); EnableWindow(hCtlDEADHEADTHOSE, bEnable); EnableWindow(hCtlDEADHEADMINS, bEnable); EnableWindow(hCtlTEXT_MINUTES, bEnable); break; // // IDPREVIEW // case IDPREVIEW: // Button text: "Preview" nI = SendMessage(hCtlTRIPS, LB_GETSELCOUNT, (WPARAM)0, (LPARAM)0); if(nI == 0 || nI == LB_ERR) { break; } pSelected = (int *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(int) * nI); if(pSelected == NULL) { AllocationError(__FILE__, __LINE__, FALSE); break; } numSelected = (int)SendMessage(hCtlTRIPS, LB_GETSELITEMS, (WPARAM)nI, (LPARAM)pSelected); if(numSelected >= m_maxPICKEDTRIPS) { m_maxPICKEDTRIPS += (numSelected + 1); m_pPICKEDTRIPS = (PICKEDTRIPSDef *)HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, m_pPICKEDTRIPS, sizeof(PICKEDTRIPSDef) * m_maxPICKEDTRIPS); if(m_pPICKEDTRIPS == NULL) { AllocationError(__FILE__, __LINE__, TRUE); break; } } for(nI = 0; nI < numSelected; nI++) { position = SendMessage(hCtlTRIPS, LB_GETITEMDATA, (WPARAM)pSelected[nI], (LPARAM)0); fromRoutePosition = LOWORD(position); fromServicePosition = HIWORD(position); m_pPICKEDTRIPS[nI].ROUTESrecordID = SendMessage(hCtlFROMROUTE, LB_GETITEMDATA, (WPARAM)fromRoutePosition, (LPARAM)0); m_pPICKEDTRIPS[nI].SERVICESrecordID = SendMessage(hCtlFROMSERVICE, CB_GETITEMDATA, (WPARAM)fromServicePosition, (LPARAM)0); } DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_PREVIEWT), hWndDlg, (DLGPROC)PREVIEWTMsgProc, (LPARAM)numSelected); TMSHeapFree(pSelected); break; // // IDADD // case IDADD: // Button text: "&Add Trip(s)" // // Get the service // fromServicePosition = (int)SendMessage(hCtlFROMSERVICE, CB_GETCURSEL, (WPARAM)0, (LPARAM)0); if(fromServicePosition == CB_ERR) { break; } fromServiceRecordID = SendMessage(hCtlFROMSERVICE, CB_GETITEMDATA, (WPARAM)fromServicePosition, (LPARAM)0); SERVICESKey0.recordID = fromServiceRecordID; btrieve(B_GETEQUAL, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0); strncpy(serviceName, SERVICES.name, SERVICES_NAME_LENGTH); trim(serviceName, SERVICES_NAME_LENGTH); // // Get the route(s) // // All // if(SendMessage(hCtlALLROUTES, BM_GETCHECK, (WPARAM)0, (LPARAM)0)) { SendMessage(hCtlFROMROUTE, LB_SETSEL, (WPARAM)(TRUE), (LPARAM)(-1)); } // // Those labelled... // else if(SendMessage(hCtlCC, BM_GETCHECK, (WPARAM)0, (LPARAM)0)) { nK = (int)SendMessage(hCtlCOMMENTCODE, CB_GETCURSEL, (WPARAM)0, (LPARAM)0); commentRecordID = (nK == CB_ERR ? NO_RECORD : SendMessage(hCtlCOMMENTCODE, CB_GETITEMDATA, (WPARAM)nK, (LPARAM)0)); if(commentRecordID == NO_RECORD) { break; } nJ = (int)SendMessage(hCtlFROMROUTE, LB_GETCOUNT, (WPARAM)0, (LPARAM)0); for(nI = 0; nI < nJ; nI++) { ROUTESKey0.recordID = SendMessage(hCtlFROMROUTE, LB_GETITEMDATA, (WPARAM)nI, (LPARAM)0); rcode2 = btrieve(B_GETEQUAL, TMS_ROUTES, &ROUTES, &ROUTESKey0, 0); if(ROUTES.COMMENTSrecordID == commentRecordID) { SendMessage(hCtlFROMROUTE, LB_SETSEL, (WPARAM)TRUE, (LPARAM)nI); } } } // // Got the selections - continue // nI = (int)SendMessage(hCtlFROMROUTE, LB_GETSELCOUNT, (WPARAM)0, (LPARAM)0); if(nI == 0 || nI == LB_ERR) { break; } pSelected = (int *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(int) * nI); if(pSelected == NULL) { AllocationError(__FILE__, __LINE__, FALSE); break; } numSelected = (int)SendMessage(hCtlFROMROUTE, LB_GETSELITEMS, (WPARAM)nI, (LPARAM)pSelected); // // Add the results to the "to be blocked" list box // for(nI = 0; nI < numSelected; nI++) { fromRoutePosition = pSelected[nI]; fromRouteRecordID = SendMessage(hCtlFROMROUTE, LB_GETITEMDATA, (WPARAM)fromRoutePosition, (LPARAM)0); // // Before we go any further, let's see if we've got this one already // position = MAKELONG(fromRoutePosition, fromServicePosition); nJ = SendMessage(hCtlTRIPS, LB_GETCOUNT, (WPARAM)0, (LPARAM)0); for(bFound = FALSE, nK = 0; nK < nJ; nK++) { tempLong = SendMessage(hCtlTRIPS, LB_GETITEMDATA, (WPARAM)nK, (LPARAM)0); if(tempLong == position) { bFound = TRUE; break; } } if(bFound) { continue; } // // Not found // EnableWindow(hCtlIDOPTIMAL, TRUE); EnableWindow(hCtlIDMANUAL, TRUE); // // Display it // ROUTESKey0.recordID = fromRouteRecordID; btrieve(B_GETEQUAL, TMS_ROUTES, &ROUTES, &ROUTESKey0, 0); strncpy(routeNumber, ROUTES.number, ROUTES_NUMBER_LENGTH); trim(routeNumber, ROUTES_NUMBER_LENGTH); strncpy(routeName, ROUTES.name, ROUTES_NAME_LENGTH); trim(routeName, ROUTES_NAME_LENGTH); strcpy(tempString, routeNumber); strcat(tempString, " - "); strcat(tempString, routeName); tempString[tabPos[0]] = '\0'; strcat(tempString, "\t"); strcat(tempString, serviceName); nK = (int)SendMessage(hCtlTRIPS, LB_ADDSTRING, (WPARAM)0, (LONG)(LPSTR)tempString); SendMessage(hCtlTRIPS, LB_SETITEMDATA, (WPARAM)nK, (LPARAM)position); } SendMessage(hCtlFROMROUTE, LB_SETSEL, (WPARAM)FALSE, (LPARAM)(-1)); TMSHeapFree(pSelected); break; // // IDREMOVE // case IDREMOVE: // Button text: "Remove" nI = (int)SendMessage(hCtlTRIPS, LB_GETSELCOUNT, (WPARAM)0, (LPARAM)0); if(nI == 0 || nI == LB_ERR) { break; } pSelected = (int *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(int) * nI); if(pSelected == NULL) { AllocationError(__FILE__, __LINE__, FALSE); break; } numSelected = (int)SendMessage(hCtlTRIPS, LB_GETSELITEMS, (WPARAM)nI, (LPARAM)pSelected); // // Process the list from the back to the front // for(nI = numSelected - 1; nI >= 0; nI--) { SendMessage(hCtlTRIPS, LB_DELETESTRING, (WPARAM)pSelected[nI], (LPARAM)0); } if(SendMessage(hCtlTRIPS, LB_GETCOUNT, (WPARAM)0, (LPARAM)0) == 0) { EnableWindow(hCtlIDOPTIMAL, FALSE); EnableWindow(hCtlIDMANUAL, FALSE); } EnableWindow(hCtlIDREMOVE, FALSE); EnableWindow(hCtlIDPREVIEW, FALSE); TMSHeapFree(pSelected); break; // // IDCANCEL // case IDCANCEL: EndDialog(hWndDlg, FALSE); break; // // IDHELP // case IDHELP: WinHelp(hWndDlg, szarHelpFile, HELP_CONTEXT, The_Standard_Blocks_Table); break; // // IDMANUAL and IDOPTIMAL // case IDMANUAL: case IDOPTIMAL: m_bNetworkMode = FALSE; // // Get the parameters // PARMS.bStandard = SendMessage(hCtlSTANDARD, BM_GETCHECK, (WPARAM)0, (LPARAM)0); PARMS.bDropback = SendMessage(hCtlDROPBACK, BM_GETCHECK, (WPARAM)0, (LPARAM)0); // // Standard and Dropback are mutually exclusive on a manual block // if(wmId == IDMANUAL) { if(PARMS.bStandard && PARMS.bDropback) { TMSError(hWndDlg, MB_ICONSTOP, ERROR_134, hCtlSTANDARD); break; } } // // At least one of Standard or Dropback must be chosen prior to pressing Optimal // else { if(!PARMS.bStandard && !PARMS.bDropback) { TMSError(hWndDlg, MB_ICONSTOP, ERROR_135, hCtlSTANDARD); break; } } // // Get the rest of the parameters // PARMS.bInterlining = SendMessage(hCtlILYES, BM_GETCHECK, (WPARAM)0, (LPARAM)0); PARMS.bServiceWrap = SendMessage(hCtlSWYES, BM_GETCHECK, (WPARAM)0, (LPARAM)0); PARMS.bDeadheading = SendMessage(hCtlDHYES, BM_GETCHECK, (WPARAM)0, (LPARAM)0); if(!PARMS.bDeadheading) { PARMS.bDeadheadAll = FALSE; PARMS.maxDeadheadTime = NO_TIME; } else { SendMessage(hCtlDEADHEADMINS, WM_GETTEXT, (WPARAM)TEMPSTRING_LENGTH, (LONG)(LPSTR)tempString); if(strcmp(tempString, "") == 0) { PARMS.bDeadheadAll = TRUE; PARMS.maxDeadheadTime = NO_TIME; } else { PARMS.bDeadheadAll = FALSE; PARMS.maxDeadheadTime = atol(tempString) * 60; } } // // Build the list of selected trips // m_numPICKEDTRIPS = SendMessage(hCtlTRIPS, LB_GETCOUNT, (WPARAM)0, (LPARAM)0); if(m_numPICKEDTRIPS >= m_maxPICKEDTRIPS) { m_maxPICKEDTRIPS += (m_numPICKEDTRIPS + 1); m_pPICKEDTRIPS = (PICKEDTRIPSDef *)HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, m_pPICKEDTRIPS, sizeof(PICKEDTRIPSDef) * m_maxPICKEDTRIPS); if(m_pPICKEDTRIPS == NULL) { AllocationError(__FILE__, __LINE__, TRUE); break; } } for(nI = 0; nI < m_numPICKEDTRIPS; nI++) { position = SendMessage(hCtlTRIPS, LB_GETITEMDATA, (WPARAM)nI, (LPARAM)0); fromRoutePosition = LOWORD(position); fromServicePosition = HIWORD(position); m_pPICKEDTRIPS[nI].ROUTESrecordID = SendMessage(hCtlFROMROUTE, LB_GETITEMDATA, (WPARAM)fromRoutePosition, (LPARAM)0); m_pPICKEDTRIPS[nI].SERVICESrecordID = SendMessage(hCtlFROMSERVICE, CB_GETITEMDATA, (WPARAM)fromServicePosition, (LPARAM)0); } // // Dropback blocking isn't permitted unless it's been "standard" blocked already // if(PARMS.bDropback) { bAbort = FALSE; for(nI = 0; nI < m_numPICKEDTRIPS; nI++) { if(bAbort) break; for(nJ = 0; nJ < 2; nJ++) { if(bAbort) break; ROUTESKey0.recordID = m_pPICKEDTRIPS[nI].ROUTESrecordID; btrieve(B_GETEQUAL, TMS_ROUTES, &ROUTES, &ROUTESKey0, 0); if(ROUTES.DIRECTIONSrecordID[nJ] == NO_RECORD) continue; TRIPSKey1.ROUTESrecordID = m_pPICKEDTRIPS[nI].ROUTESrecordID; TRIPSKey1.SERVICESrecordID = m_pPICKEDTRIPS[nI].SERVICESrecordID; TRIPSKey1.directionIndex = nJ; TRIPSKey1.tripSequence = NO_TIME; rcode2 = btrieve(B_GETGREATEROREQUAL, TMS_TRIPS, &TRIPS, &TRIPSKey1, 1); while(rcode2 == 0 && TRIPS.ROUTESrecordID == m_pPICKEDTRIPS[nI].ROUTESrecordID && TRIPS.SERVICESrecordID == m_pPICKEDTRIPS[nI].SERVICESrecordID && TRIPS.directionIndex == nJ) { if(TRIPS.standard.blockNumber == 0) { LoadString(hInst, TEXT_245, szFormatString, sizeof(szFormatString)); strncpy(routeNumber, ROUTES.number, ROUTES_NUMBER_LENGTH); trim(routeNumber, ROUTES_NUMBER_LENGTH); strncpy(routeName, ROUTES.name, ROUTES_NAME_LENGTH); trim(routeName, ROUTES_NAME_LENGTH); SERVICESKey0.recordID = m_pPICKEDTRIPS[nI].SERVICESrecordID; btrieve(B_GETEQUAL, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0); strncpy(serviceName, SERVICES.name, SERVICES_NAME_LENGTH); trim(serviceName, SERVICES_NAME_LENGTH); sprintf(tempString, szFormatString, serviceName, routeNumber, routeName); MessageBeep(MB_ICONSTOP); MessageBox(hWndDlg, tempString, TMS, MB_OK); bAbort = TRUE; break; } rcode2 = btrieve(B_GETNEXT, TMS_TRIPS, &TRIPS, &TRIPSKey1, 1); } } } if(bAbort) break; } // // IDMANUAL - Go into MANBLOCK // if(wmId == IDMANUAL) { pDI->otherData = (long)(&PARMS); nRc = BlockDialog(pDI); if(nRc) { EndDialog(hWndDlg, TRUE); } break; } // // IDOPTIMAL // for(blockingType = 0; blockingType < 2; blockingType++) { if(blockingType == 0) { if(!PARMS.bStandard) { continue; } StatusBarStart(hWndDlg, "Optimal Standard Blocking Status"); pTRIPSChunk = &TRIPS.standard; pLayover = &StandardLayover; layoverType = TMS_STANDARDBLOCKS; } else { if(!PARMS.bDropback) { continue; } StatusBarStart(hWndDlg, "Optimal Dropback Blocking Status"); pTRIPSChunk = &TRIPS.dropback; pLayover = &DropbackLayover; layoverType = TMS_DROPBACKBLOCKS; } StatusBar(-1L, -1L); StatusBarText("Initializing..."); // // Initialize the interlining option // BLSetOptions(SendMessage(hCtlILYES, BM_GETCHECK, (WPARAM)0, (LPARAM)0)); // // Loop through numPICKEDTRIPS to determine what we're dealing with // StatusBarText("Examining selected trips..."); m_numConnectionAlerts = 0; maxTrips = 512; pTRIPSrecordIDs = (long *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(long) * maxTrips); if(pTRIPSrecordIDs == NULL) { AllocationError(__FILE__, __LINE__, FALSE); goto OptimalBlockCleanup; } for(numTrips = 0, nI = 0; nI < m_numPICKEDTRIPS; nI++) { StatusBar((long)nI, (long)m_numPICKEDTRIPS); if(StatusBarAbort()) { goto OptimalBlockCleanup; } m_bEstablishRUNTIMES = TRUE; TRIPSKey1.ROUTESrecordID = m_pPICKEDTRIPS[nI].ROUTESrecordID; TRIPSKey1.SERVICESrecordID = m_pPICKEDTRIPS[nI].SERVICESrecordID; TRIPSKey1.directionIndex = NO_RECORD; TRIPSKey1.tripSequence = NO_RECORD; rcode2 = btrieve(B_GETGREATEROREQUAL, TMS_TRIPS, &TRIPS, &TRIPSKey1, 1); while(rcode2 == 0 && (m_pPICKEDTRIPS[nI].ROUTESrecordID == NO_RECORD || TRIPS.ROUTESrecordID == m_pPICKEDTRIPS[nI].ROUTESrecordID) && (m_pPICKEDTRIPS[nI].SERVICESrecordID == NO_RECORD || TRIPS.SERVICESrecordID == m_pPICKEDTRIPS[nI].SERVICESrecordID)) { if(pTRIPSChunk->blockNumber == 0) { if(numTrips >= maxTrips) { maxTrips += 512; pTRIPSrecordIDs = (long *)HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, pTRIPSrecordIDs, sizeof(long) * maxTrips); if(pTRIPSrecordIDs == NULL) { AllocationError(__FILE__, __LINE__, TRUE); goto OptimalBlockCleanup; } } pTRIPSrecordIDs[numTrips++] = TRIPS.recordID; } rcode2 = btrieve(B_GETNEXT, TMS_TRIPS, &TRIPS, &TRIPSKey1, 1); } } if((m_numTripsForBlocker = numTrips) == 0) { TMSError(hWndDlg, MB_ICONSTOP, ERROR_102, (HANDLE)NULL); goto OptimalBlockCleanup; } // // If m_numConnectionAlerts is non-zero, blow him off // if(m_numConnectionAlerts != 0) { TMSError(hWndDlg, MB_ICONSTOP, ERROR_173, (HANDLE)NULL); goto OptimalBlockCleanup; } // // Make sure that we're not going in with bad values for min & max layover // if(pLayover->minimum.type == NO_RECORD || pLayover->maximum.type == NO_RECORD || (pLayover->maximum.type == 0 && pLayover->maximum.minutes == 0)) { MessageBeep(MB_ICONSTOP); LoadString(hInst, ERROR_030, szarString, sizeof(szarString)); MessageBox(hWndDlg, szarString, TMS, MB_ICONSTOP); nRc = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_LAYOVER), hWndDlg, (DLGPROC)LAYOVERMsgProc, (LPARAM)layoverType); if(!nRc) goto OptimalBlockCleanup; } // // Generate trip data into TRIPINFO // StatusBarText("Building trip data..."); StatusBar(0L, 0L); BLInitNetwork(); for(nI = 0; nI < numTrips; nI++) { StatusBar((long)nI, (long)numTrips); if(StatusBarAbort()) goto OptimalBlockCleanup; TRIPSKey0.recordID = pTRIPSrecordIDs[nI]; btrieve(B_GETEQUAL, TMS_TRIPS, &TRIPS, &TRIPSKey0, 0); nJ = GenerateTrip(TRIPS.ROUTESrecordID, TRIPS.SERVICESrecordID, TRIPS.directionIndex, TRIPS.PATTERNNAMESrecordID, TRIPS.timeAtMLP, GENERATETRIP_FLAG_DISPLAYERRORS, >Results); // // If we've got a one-node trip, fool the blocker // if(GTResults.firstNODESrecordID == GTResults.lastNODESrecordID && GTResults.firstNodeTime == GTResults.lastNodeTime) { GTResults.lastNodeTime++; } if(nJ != 0) { TRIPINFODef TRIPINFOrec; TRIPINFOrec.TRIPSrecordID = TRIPS.recordID; TRIPINFOrec.BUSTYPESrecordID = TRIPS.BUSTYPESrecordID; TRIPINFOrec.ROUTESrecordID = TRIPS.ROUTESrecordID; // // If we're doing a dropback, and the standard block pulls out or in, // then replace the start/end node/time with the pullout/in gar/time. // // Check pullouts // if(PARMS.bStandard || TRIPS.standard.POGNODESrecordID == NO_RECORD) { TRIPINFOrec.startNODESrecordID = GTResults.firstNODESrecordID; TRIPINFOrec.startTime = GTResults.firstNodeTime; } else { GCTData.fromPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID; GCTData.toPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID; GCTData.fromROUTESrecordID = TRIPS.ROUTESrecordID; GCTData.fromSERVICESrecordID = TRIPS.SERVICESrecordID; GCTData.toROUTESrecordID = TRIPS.ROUTESrecordID; GCTData.toSERVICESrecordID = TRIPS.SERVICESrecordID; GCTData.fromNODESrecordID = TRIPS.standard.POGNODESrecordID; GCTData.toNODESrecordID = GTResults.firstNODESrecordID; GCTData.timeOfDay = GTResults.firstNodeTime; dhd = GetConnectionTime(GCT_FLAG_DEADHEADTIME, &GCTData, &distance); distance = (float)fabs((double)distance); if(dhd == NO_TIME) dhd = 0; TRIPINFOrec.startNODESrecordID = TRIPS.standard.POGNODESrecordID; TRIPINFOrec.startTime = GTResults.firstNodeTime - dhd; } // // Check pullins // if(PARMS.bStandard || TRIPS.standard.PIGNODESrecordID == NO_RECORD) { TRIPINFOrec.endNODESrecordID = GTResults.lastNODESrecordID; TRIPINFOrec.endTime = GTResults.lastNodeTime; } else { GCTData.fromPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID; GCTData.toPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID; GCTData.fromROUTESrecordID = TRIPS.ROUTESrecordID; GCTData.fromSERVICESrecordID = TRIPS.SERVICESrecordID; GCTData.toROUTESrecordID = TRIPS.ROUTESrecordID; GCTData.toSERVICESrecordID = TRIPS.SERVICESrecordID; GCTData.fromNODESrecordID = GTResults.lastNODESrecordID; GCTData.toNODESrecordID = TRIPS.standard.PIGNODESrecordID; GCTData.timeOfDay = GTResults.lastNodeTime; dhd = GetConnectionTime(GCT_FLAG_DEADHEADTIME, &GCTData, &distance); distance = (float)fabs((double)distance); if(dhd == NO_TIME) dhd = 0; TRIPINFOrec.endNODESrecordID = TRIPS.standard.PIGNODESrecordID; TRIPINFOrec.endTime = GTResults.lastNodeTime + dhd; } // // Figure out the minimum layover // if(pTRIPSChunk->layoverMin != NO_TIME) TRIPINFOrec.layoverMin = pTRIPSChunk->layoverMin; else { minutes = pLayover->minimum.minutes * 60; percent = (GTResults.lastNodeTime - GTResults.firstNodeTime) * pLayover->minimum.percent / 100; if(pLayover->minimum.type == 0) TRIPINFOrec.layoverMin = minutes; else if(pLayover->minimum.type == 1) TRIPINFOrec.layoverMin = percent; else if(pLayover->minimum.type == 2) TRIPINFOrec.layoverMin = pLayover->minimum.lower ? min(minutes, percent) : max(minutes, percent); } // // Figure out the maximum layover // if(pTRIPSChunk->layoverMax != NO_TIME) TRIPINFOrec.layoverMax = pTRIPSChunk->layoverMax; else { minutes = pLayover->maximum.minutes * 60; percent = (GTResults.lastNodeTime - GTResults.firstNodeTime) * pLayover->maximum.percent / 100; if(pLayover->maximum.type == 0) TRIPINFOrec.layoverMax = minutes; else if(pLayover->maximum.type == 1) TRIPINFOrec.layoverMax = percent; else if(pLayover->maximum.type == 2) TRIPINFOrec.layoverMax = pLayover->maximum.lower ? min(minutes, percent) : max(minutes, percent); } // // And generate the trip arc // BLGenerateTripArc( &TRIPINFOrec ); } } // // If m_numConnectionAlerts is non-zero, blow him off // if(m_numConnectionAlerts != 0) { TMSError(hWndDlg, MB_ICONSTOP, ERROR_173, (HANDLE)NULL); goto OptimalBlockCleanup; } // // Generate the wait arcs between the trips // StatusBarText("Generating wait arcs..."); StatusBar(-1L, -1L); BLGenerateWaitArcs(FALSE); // // Generate deadhead and equivalence data into DEADHEADINFO // rcode2 = btrieve(B_GETFIRST, TMS_CONNECTIONS, &CONNECTIONS, &CONNECTIONSKey0, 0); numDeadheadsForBlocker = 0; while(rcode2 == 0) { if(StatusBarAbort()) goto OptimalBlockCleanup; if(PARMS.bDeadheading) { if((CONNECTIONS.flags & CONNECTIONS_FLAG_DEADHEADTIME) && (PARMS.bDeadheadAll || CONNECTIONS.connectionTime <= PARMS.maxDeadheadTime)) { DEADHEADINFODef DEADHEADINFOrec; DEADHEADINFOrec.fromTimeOfDay = CONNECTIONS.fromTimeOfDay; DEADHEADINFOrec.toTimeOfDay = CONNECTIONS.toTimeOfDay; DEADHEADINFOrec.fromNODESrecordID = CONNECTIONS.fromNODESrecordID; DEADHEADINFOrec.toNODESrecordID = CONNECTIONS.toNODESrecordID; DEADHEADINFOrec.flags = CONNECTIONS.flags; DEADHEADINFOrec.deadheadTime = CONNECTIONS.connectionTime; BLGenerateDeadheadArcs( &DEADHEADINFOrec ); numDeadheadsForBlocker++; } } if(CONNECTIONS.flags & CONNECTIONS_FLAG_EQUIVALENT) { DEADHEADINFODef DEADHEADINFOrec; DEADHEADINFOrec.fromTimeOfDay = CONNECTIONS.fromTimeOfDay; DEADHEADINFOrec.toTimeOfDay = CONNECTIONS.toTimeOfDay; DEADHEADINFOrec.fromNODESrecordID = CONNECTIONS.fromNODESrecordID; DEADHEADINFOrec.toNODESrecordID = CONNECTIONS.toNODESrecordID; DEADHEADINFOrec.flags = CONNECTIONS.flags; DEADHEADINFOrec.deadheadTime = 0; BLGenerateDeadheadArcs( &DEADHEADINFOrec ); numDeadheadsForBlocker++; } rcode2 = btrieve(B_GETNEXT, TMS_CONNECTIONS, &CONNECTIONS, &CONNECTIONSKey0, 0); } if(StatusBarAbort()) goto OptimalBlockCleanup; // // Get the minimum and maximum number of vehicles parameters. // This only applies to Optimal, so it's done here rather than above. // if(SendMessage(hCtlMIN, BM_GETCHECK, (WPARAM)0, (LPARAM)0)) { maxVehicles = NO_TIME; SendMessage(hCtlMINVEHICLES, WM_GETTEXT, (WPARAM)TEMPSTRING_LENGTH, (LONG)(LPSTR)tempString); if(strcmp(tempString, "") == 0) minVehicles = NO_TIME; else minVehicles = atol(tempString); } else { minVehicles = NO_TIME; SendMessage(hCtlMAXVEHICLES, WM_GETTEXT, (WPARAM)TEMPSTRING_LENGTH, (LONG)(LPSTR)tempString); if(strcmp(tempString, "") == 0) maxVehicles = NO_TIME; else maxVehicles = atol(tempString); } // // Call the blocker // m_pBLOCKSDATA = (BLOCKSDATADef *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(BLOCKSDATADef) * m_numTripsForBlocker); if(m_pBLOCKSDATA == NULL) { AllocationError(__FILE__, __LINE__, FALSE); goto OptimalBlockCleanup; } StatusBarText("Optimal blocking in progress..."); sblock(minVehicles, maxVehicles); if(StatusBarAbort()) { goto OptimalBlockCleanup; } // // Update the file with the results // lastBlock = GetNewBlockNumber(pDI); StatusBarText("Blocking complete - writing results..."); StatusBarEnableCancel(FALSE); for(nJ = 0; nJ < numTrips; nJ++) { StatusBar((long)nJ, (long)numTrips); TRIPSKey0.recordID = m_pBLOCKSDATA[nJ].TRIPSrecordID; if((rcode2 = btrieve(B_GETEQUAL, TMS_TRIPS, &TRIPS, &TRIPSKey0, 0)) != 0) { MessageBeep(MB_ICONSTOP); LoadString(hInst, ERROR_015, szarString, sizeof(szarString)); SetFocus(hCtlFROMROUTE); MessageBox(hWndDlg, szarString, TMS, MB_ICONSTOP); goto OptimalBlockCleanup; } GenerateTrip(TRIPS.ROUTESrecordID, TRIPS.SERVICESrecordID, TRIPS.directionIndex, TRIPS.PATTERNNAMESrecordID, TRIPS.timeAtMLP, GENERATETRIP_FLAG_DISPLAYERRORS, >Results); pTRIPSChunk->blockNumber = m_pBLOCKSDATA[nJ].blockNumber + lastBlock; pTRIPSChunk->RGRPROUTESrecordID = pDI->fileInfo.routeRecordID; pTRIPSChunk->SGRPSERVICESrecordID = pDI->fileInfo.serviceRecordID; pTRIPSChunk->blockSequence = GTResults.firstNodeTime; btrieve(B_UPDATE, TMS_TRIPS, &TRIPS, &TRIPSKey0, 0); } OptimalBlockCleanup: BLCleanup(); TMSHeapFree(m_pBLOCKSDATA); TMSHeapFree(pTRIPSrecordIDs); m_numTripsForBlocker = 0; StatusBarEnd(); } // blockingType EndDialog(hWndDlg, TRUE); break; } break; // End of WM_COMMAND default: return FALSE; } return TRUE; } // End of ADDBLOCKMsgProc
void InitTravelMatrix(long SERVICESrecordID, BOOL bDisplayStatus) { typedef struct PATHStruct { long NODESrecordID; long ROUTESrecordID; long directionIndex; long PATTERNNAMESrecordID; long nodeSequence; } PATHDef; typedef struct COMBINEDStruct { long fromNODESrecordID; long toNODESrecordID; long ROUTESrecordID; long directionIndex; long PATTERNNAMESrecordID; int fromNodePos; int toNodePos; } COMBINEDDef; typedef struct BESTStruct { long fromNODESrecordID; long toNODESrecordID; long TRIPSrecordID; long cushionTime; long dwellTime; long tripTime[2]; } BESTDef; PATHDef from[UPPERLIMIT]; PATHDef to[UPPERLIMIT]; COMBINEDDef fromTo[UPPERLIMIT]; GenerateTripDef GTResults; GetConnectionTimeDef GCTData; float distance; long fromEquiv[UPPERLIMIT]; long toEquiv[UPPERLIMIT]; long NODESrecordID; long nodeList[50]; long fromNODESrecordID; long toNODESrecordID; long deadheadTime; BOOL bFound; int rcode2; int numNodes; int nI; int nJ; int nK; int nL; int nM; int pos; int numFromEquiv; int numToEquiv; int numFromTo; int numFrom; int numTo; int serviceIndex; // // Set up the service index // SERVICESKey0.recordID = SERVICESrecordID; btrieve(B_GETEQUAL, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0); serviceIndex = SERVICES.number - 1; if(serviceIndex < 0 || serviceIndex > NODES_RELIEFLABELS_LENGTH - 1) { serviceIndex = 0; } strncpy(szarString, SERVICES.name, SERVICES_NAME_LENGTH); trim(szarString, SERVICES_NAME_LENGTH); // // Show the status bar // if(bDisplayStatus) { sprintf(tempString, "Status for service %s", szarString); StatusBarStart(NULL, tempString); LoadString(hInst, TEXT_135, tempString, TEMPSTRING_LENGTH); StatusBarText(tempString); } // // Set up the node equivalences // rcode2 = btrieve(B_GETFIRST, TMS_CONNECTIONS, &CONNECTIONS, &CONNECTIONSKey0, 0); numNodeEquiv = 0; while(rcode2 == 0 && numNodeEquiv < MAXNODEEQUIV) { if(CONNECTIONS.flags & CONNECTIONS_FLAG_EQUIVALENT) { NODEEQUIV[numNodeEquiv].fromNODESrecordID = CONNECTIONS.fromNODESrecordID; NODEEQUIV[numNodeEquiv].toNODESrecordID = CONNECTIONS.toNODESrecordID; numNodeEquiv++; } rcode2 = btrieve(B_GETNEXT, TMS_CONNECTIONS, &CONNECTIONS, &CONNECTIONSKey0, 0); } // // Set up, along with all garages, all relief points // rcode2 = btrieve(B_GETFIRST, TMS_NODES, &NODES, &NODESKey0, 0); numNodes = 0; while(rcode2 == 0) { if(NODES.flags & NODES_FLAG_GARAGE || (NODES.reliefLabels[serviceIndex] != ' ' && NODES.reliefLabels[serviceIndex] != '-')) { nodeList[numNodes] = NODES.recordID; numNodes++; } rcode2 = btrieve(B_GETNEXT, TMS_NODES, &NODES, &NODESKey0, 0); } // // Free any previous incarnation of the travel matrix // for(nI = 0; nI < numInTM[serviceIndex]; nI++) { TMSHeapFree(TRAVELMATRIX[serviceIndex][nI].pTrips); } // // Build the matrix // numInTM[serviceIndex] = 0; for(nI = 0; nI < numNodes - 1; nI++) { if(bDisplayStatus) { StatusBar((long)nI, (long)numNodes); } for(nJ = 1; nJ < numNodes; nJ++) { for(nK = 0; nK < 2; nK++) { fromNODESrecordID = nK == 0 ? nodeList[nI] : nodeList[nJ]; toNODESrecordID = nK == 0 ? nodeList[nJ] : nodeList[nI]; // // Get the node equivalences from the NODEEQUIV structure // numFromEquiv = 0; numToEquiv = 0; for(nL = 0; nL < numNodeEquiv; nL++) { if(NODEEQUIV[nL].fromNODESrecordID == fromNODESrecordID) { fromEquiv[numFromEquiv++] = NODEEQUIV[nL].toNODESrecordID; } else if(NODEEQUIV[nL].toNODESrecordID == fromNODESrecordID) { fromEquiv[numFromEquiv++] = NODEEQUIV[nL].fromNODESrecordID; } else if(NODEEQUIV[nL].fromNODESrecordID == toNODESrecordID) { toEquiv[numToEquiv++] = NODEEQUIV[nL].toNODESrecordID; } else if(NODEEQUIV[nL].toNODESrecordID == toNODESrecordID) { toEquiv[numToEquiv++] = NODEEQUIV[nL].fromNODESrecordID; } } // // Ok, we know where we are (fromNODESrecordID) and where we have to go to (toNODESrecordID). // // The algorithm is find the route required to get us from a to b in the shortest time, // placing instructions in "travelInstructions". // // First, get a list of patterns that fromNODESrecordID (or one of its equivalences) reside in. // Note that we keep PATTERNS.NODESrecordID, as it may actually be the substituted, equivalent, node. // numFrom = 0; for(nL = 0; nL < numFromEquiv + 1; nL++) { NODESrecordID = nL == 0 ? fromNODESrecordID : fromEquiv[nL - 1]; PATTERNSKey1.NODESrecordID = NODESrecordID; rcode2 = btrieve(B_GETEQUAL, TMS_PATTERNS, &PATTERNS, &PATTERNSKey1, 1); while(rcode2 == 0 && PATTERNS.NODESrecordID == NODESrecordID) { if(PATTERNS.SERVICESrecordID == SERVICESrecordID) { from[numFrom].NODESrecordID = PATTERNS.NODESrecordID; from[numFrom].ROUTESrecordID = PATTERNS.ROUTESrecordID; from[numFrom].directionIndex = PATTERNS.directionIndex; from[numFrom].PATTERNNAMESrecordID = PATTERNS.PATTERNNAMESrecordID; from[numFrom].nodeSequence = PATTERNS.nodeSequence; numFrom++; } rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey1, 1); } } // // If there weren't any, cycle through // if(numFrom == 0) { continue; } // // Now, get a list of patterns that toNODESrecordID are in. // numTo = 0; for(nL = 0; nL < numToEquiv + 1; nL++) { NODESrecordID = nL == 0 ? toNODESrecordID : toEquiv[nL - 1]; PATTERNSKey1.NODESrecordID = NODESrecordID; rcode2 = btrieve(B_GETEQUAL, TMS_PATTERNS, &PATTERNS, &PATTERNSKey1, 1); while(rcode2 == 0 && PATTERNS.NODESrecordID == NODESrecordID) { if(PATTERNS.SERVICESrecordID == SERVICESrecordID) { to[numTo].NODESrecordID = PATTERNS.NODESrecordID; to[numTo].ROUTESrecordID = PATTERNS.ROUTESrecordID; to[numTo].directionIndex = PATTERNS.directionIndex; to[numTo].PATTERNNAMESrecordID = PATTERNS.PATTERNNAMESrecordID; to[numTo].nodeSequence = PATTERNS.nodeSequence; numTo++; } rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey1, 1); } } // // If there weren't any, cycle through // if(numTo == 0) continue; // // Develop a list of patterns that have both the from and to nodes // on them, and that have the "to" node following the "from" node. // // First, "merge" the lists // numFromTo = 0; for(nL = 0; nL < numFrom; nL++) { for(nM = 0; nM < numTo; nM++) { if(from[nL].ROUTESrecordID == to[nM].ROUTESrecordID && from[nL].directionIndex == to[nM].directionIndex && from[nL].PATTERNNAMESrecordID == to[nM].PATTERNNAMESrecordID && from[nL].nodeSequence < to[nM].nodeSequence) { fromTo[numFromTo].fromNODESrecordID = from[nL].NODESrecordID; fromTo[numFromTo].toNODESrecordID = to[nM].NODESrecordID; fromTo[numFromTo].ROUTESrecordID = from[nL].ROUTESrecordID; fromTo[numFromTo].directionIndex = from[nL].directionIndex; fromTo[numFromTo].PATTERNNAMESrecordID = from[nL].PATTERNNAMESrecordID; fromTo[numFromTo].fromNodePos = NO_RECORD; fromTo[numFromTo].toNodePos = NO_RECORD; numFromTo++; } } } // // Did we get any? // if(numFromTo == 0) continue; // // Second, establish fromNodePos and toNodePos so we // know where to look on the tripTimes array later on // for(nL = 0; nL < numFromTo; nL++) { PATTERNSKey2.ROUTESrecordID = fromTo[nL].ROUTESrecordID; PATTERNSKey2.SERVICESrecordID = SERVICESrecordID; PATTERNSKey2.directionIndex = fromTo[nL].directionIndex; PATTERNSKey2.PATTERNNAMESrecordID = fromTo[nL].PATTERNNAMESrecordID; PATTERNSKey2.nodeSequence = NO_RECORD; rcode2 = btrieve(B_GETGREATER, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2); pos = 0; while(rcode2 == 0 && PATTERNS.ROUTESrecordID == fromTo[nL].ROUTESrecordID && PATTERNS.SERVICESrecordID == SERVICESrecordID && PATTERNS.directionIndex == fromTo[nL].directionIndex && PATTERNSKey2.PATTERNNAMESrecordID == fromTo[nL].PATTERNNAMESrecordID) { if(!(PATTERNS.flags & PATTERNS_FLAG_BUSSTOP)) { if(PATTERNS.NODESrecordID == fromTo[nL].fromNODESrecordID && fromTo[nL].fromNodePos == NO_RECORD) { fromTo[nL].fromNodePos = pos; } else if(PATTERNS.NODESrecordID == fromTo[nL].toNODESrecordID && fromTo[nL].toNodePos == NO_RECORD) { fromTo[nL].toNodePos = pos; break; } pos++; } rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2); } } // // Build the matrix // TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].fromNODESrecordID = fromNODESrecordID; // nodeList[nI]; TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].toNODESrecordID = toNODESrecordID; // nodeList[nJ]; TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips = (TMTRIPSDef *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(TMTRIPSDef) * 50); if(TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips == NULL) { AllocationError(__FILE__, __LINE__, FALSE); return; } TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].currentAlloc = 50; TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].numTrips = 0; for(nL = 0; nL < numFromTo; nL++) { TRIPSKey1.ROUTESrecordID = fromTo[nL].ROUTESrecordID; TRIPSKey1.SERVICESrecordID = SERVICESrecordID; TRIPSKey1.directionIndex = fromTo[nL].directionIndex; TRIPSKey1.tripSequence = NO_RECORD; rcode2 = btrieve(B_GETGREATEROREQUAL, TMS_TRIPS, &TRIPS, &TRIPSKey1, 1); while(rcode2 == 0 && TRIPS.ROUTESrecordID == fromTo[nL].ROUTESrecordID && TRIPS.SERVICESrecordID == SERVICESrecordID && TRIPS.directionIndex == fromTo[nL].directionIndex) { if(TRIPS.PATTERNNAMESrecordID == fromTo[nL].PATTERNNAMESrecordID) { GenerateTrip(TRIPS.ROUTESrecordID, TRIPS.SERVICESrecordID, TRIPS.directionIndex, TRIPS.PATTERNNAMESrecordID, TRIPS.timeAtMLP, GENERATETRIP_FLAG_DISPLAYERRORS, >Results); nM = TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].numTrips; TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips[nM].TRIPSrecordID = TRIPS.recordID; TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips[nM].tripTime[0] = GTResults.tripTimes[fromTo[nL].fromNodePos]; TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips[nM].tripTime[1] = GTResults.tripTimes[fromTo[nL].toNodePos]; TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].numTrips++; if(TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].numTrips >= TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].currentAlloc) { TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].currentAlloc += 50; TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips = (TMTRIPSDef *)HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips, sizeof(TMTRIPSDef) * TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].currentAlloc); if(TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips == NULL) { AllocationError(__FILE__, __LINE__, TRUE); return; } } } rcode2 = btrieve(B_GETNEXT, TMS_TRIPS, &TRIPS, &TRIPSKey1, 1); } // // Pass 2 - check on pullouts and pullins // rcode2 = btrieve(B_GETFIRST, TMS_TRIPS, &TRIPS, &TRIPSKey2, 2); while(rcode2 == 0) { // // Pullout // if(TRIPS.SERVICESrecordID == SERVICESrecordID && TRIPS.standard.POGNODESrecordID == fromNODESrecordID) { PATTERNSKey1.NODESrecordID = toNODESrecordID; rcode2 = btrieve(B_GETEQUAL, TMS_PATTERNS, &PATTERNS, &PATTERNSKey1, 1); bFound = FALSE; while(rcode2 == 0 && PATTERNS.NODESrecordID == toNODESrecordID) { if(PATTERNS.ROUTESrecordID == TRIPS.ROUTESrecordID && PATTERNS.SERVICESrecordID == TRIPS.SERVICESrecordID && PATTERNS.directionIndex == TRIPS.directionIndex && PATTERNS.PATTERNNAMESrecordID == TRIPS.PATTERNNAMESrecordID) { bFound = TRUE; break; } rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey1, 1); } if(bFound) { PATTERNSKey2.ROUTESrecordID = TRIPS.ROUTESrecordID; PATTERNSKey2.SERVICESrecordID = TRIPS.SERVICESrecordID; PATTERNSKey2.directionIndex = TRIPS.directionIndex; PATTERNSKey2.PATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID; PATTERNSKey2.nodeSequence = NO_RECORD; rcode2 = btrieve(B_GETGREATER, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2); pos = 0; while(rcode2 == 0 && PATTERNS.ROUTESrecordID == TRIPS.ROUTESrecordID && PATTERNS.SERVICESrecordID == TRIPS.SERVICESrecordID && PATTERNS.directionIndex == TRIPS.directionIndex && PATTERNSKey2.PATTERNNAMESrecordID == TRIPS.PATTERNNAMESrecordID) { if(!(PATTERNS.flags & PATTERNS_FLAG_BUSSTOP)) { if(PATTERNS.NODESrecordID == toNODESrecordID) break; pos++; } rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2); } GenerateTrip(TRIPS.ROUTESrecordID, TRIPS.SERVICESrecordID, TRIPS.directionIndex, TRIPS.PATTERNNAMESrecordID, TRIPS.timeAtMLP, GENERATETRIP_FLAG_DISPLAYERRORS, >Results); GCTData.fromPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID; GCTData.toPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID; GCTData.fromROUTESrecordID = TRIPS.ROUTESrecordID; GCTData.fromSERVICESrecordID = TRIPS.SERVICESrecordID; GCTData.toROUTESrecordID = TRIPS.ROUTESrecordID; GCTData.toSERVICESrecordID = TRIPS.SERVICESrecordID; GCTData.fromNODESrecordID = TRIPS.standard.POGNODESrecordID; GCTData.toNODESrecordID = GTResults.firstNODESrecordID; GCTData.timeOfDay = GTResults.firstNodeTime; deadheadTime = GetConnectionTime(GCT_FLAG_DEADHEADTIME, &GCTData, &distance); distance = (float)fabs((double)distance); if(deadheadTime != NO_RECORD) { nM = TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].numTrips; TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips[nM].TRIPSrecordID = TRIPS.recordID; TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips[nM].tripTime[0] = GTResults.firstNodeTime - deadheadTime; TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips[nM].tripTime[1] = GTResults.tripTimes[pos]; TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].numTrips++; if(TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].numTrips >= TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].currentAlloc) { TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].currentAlloc += 50; TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips = (TMTRIPSDef *)HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips, sizeof(TMTRIPSDef) * TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].currentAlloc); if(TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips == NULL) { AllocationError(__FILE__, __LINE__, FALSE); return; } } } } } // // Pullin // if(TRIPS.SERVICESrecordID == SERVICESrecordID && TRIPS.standard.PIGNODESrecordID == toNODESrecordID) { PATTERNSKey1.NODESrecordID = fromNODESrecordID; rcode2 = btrieve(B_GETEQUAL, TMS_PATTERNS, &PATTERNS, &PATTERNSKey1, 1); bFound = FALSE; while(rcode2 == 0 && PATTERNS.NODESrecordID == fromNODESrecordID) { if(PATTERNS.ROUTESrecordID == TRIPS.ROUTESrecordID && PATTERNS.SERVICESrecordID == TRIPS.SERVICESrecordID && PATTERNS.directionIndex == TRIPS.directionIndex && PATTERNS.PATTERNNAMESrecordID == TRIPS.PATTERNNAMESrecordID) { bFound = TRUE; break; } rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey1, 1); } if(bFound) { PATTERNSKey2.ROUTESrecordID = TRIPS.ROUTESrecordID; PATTERNSKey2.SERVICESrecordID = TRIPS.SERVICESrecordID; PATTERNSKey2.directionIndex = TRIPS.directionIndex; PATTERNSKey2.PATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID; PATTERNSKey2.nodeSequence = NO_RECORD; rcode2 = btrieve(B_GETGREATER, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2); pos = 0; while(rcode2 == 0 && PATTERNS.ROUTESrecordID == TRIPS.ROUTESrecordID && PATTERNS.SERVICESrecordID == TRIPS.SERVICESrecordID && PATTERNS.directionIndex == TRIPS.directionIndex && PATTERNSKey2.PATTERNNAMESrecordID == TRIPS.PATTERNNAMESrecordID) { if(!(PATTERNS.flags & PATTERNS_FLAG_BUSSTOP)) { if(PATTERNS.NODESrecordID == fromNODESrecordID) break; pos++; } rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2); } GenerateTrip(TRIPS.ROUTESrecordID, TRIPS.SERVICESrecordID, TRIPS.directionIndex, TRIPS.PATTERNNAMESrecordID, TRIPS.timeAtMLP, GENERATETRIP_FLAG_DISPLAYERRORS, >Results); GCTData.fromPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID; GCTData.toPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID; GCTData.fromROUTESrecordID = TRIPS.ROUTESrecordID; GCTData.fromSERVICESrecordID = TRIPS.SERVICESrecordID; GCTData.toROUTESrecordID = TRIPS.ROUTESrecordID; GCTData.toSERVICESrecordID = TRIPS.SERVICESrecordID; GCTData.fromNODESrecordID = GTResults.lastNODESrecordID; GCTData.toNODESrecordID = TRIPS.standard.PIGNODESrecordID; GCTData.timeOfDay = GTResults.lastNodeTime; deadheadTime = GetConnectionTime(GCT_FLAG_DEADHEADTIME, &GCTData, &distance); distance = (float)fabs((double)distance); if(deadheadTime != NO_RECORD) { nM = TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].numTrips; TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips[nM].TRIPSrecordID = TRIPS.recordID; TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips[nM].tripTime[0] = GTResults.tripTimes[pos]; TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips[nM].tripTime[1] = GTResults.lastNodeTime + deadheadTime; TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].numTrips++; if(TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].numTrips >= TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].currentAlloc) { TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].currentAlloc += 50; TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips = (TMTRIPSDef *)HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips, sizeof(TMTRIPSDef) * TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].currentAlloc); if(TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips == NULL) { AllocationError(__FILE__, __LINE__, FALSE); return; } } } } } rcode2 = btrieve(B_GETNEXT, TMS_TRIPS, &TRIPS, &TRIPSKey2, 2); } }// nL numInTM[serviceIndex]++; } // nK } // nJ } // nI if(bDisplayStatus) { StatusBar((long)numNodes, (long)numNodes); StatusBarEnd(); } }