Skip to content

Commit

Permalink
Merge pull request #961 from frogonwheels/time-64bit
Browse files Browse the repository at this point in the history
Implement 64bit Time storage
  • Loading branch information
dexterbg committed Jan 14, 2024
2 parents 29cc073 + cb54a51 commit dd78d24
Show file tree
Hide file tree
Showing 10 changed files with 427 additions and 34 deletions.
10 changes: 5 additions & 5 deletions vehicle/OVMS.V3/components/ovms_cellular/src/gsmnmea.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ static unsigned long JdFromYMD(int year, int month, int day)
* date: "ddmmyy"
* time: "hhmmss"
*/
static unsigned long utc_to_timestamp(const char* date, const char* time)
static int64_t utc_to_timestamp(const char* date, const char* time)
{
int day, month, year, hour, minute, second;

Expand All @@ -93,8 +93,8 @@ static unsigned long utc_to_timestamp(const char* date, const char* time)
minute = (time[2]-'0')*10 + (time[3]-'0');
second = (time[4]-'0')*10 + (time[5]-'0');

return
(JdFromYMD(2000+year, month, day) - JDEpoch) * (24L * 3600)
int64_t jd = JdFromYMD(2000+year, month, day);
return (jd - JDEpoch) * (24L * 3600)
+ ((hour * 60L + minute) * 60) + second;
}

Expand Down Expand Up @@ -212,7 +212,7 @@ void GsmNMEA::IncomingLine(const std::string line)
*StdMetrics.ms_v_pos_latitude = (float) lat;
*StdMetrics.ms_v_pos_longitude = (float) lon;
*StdMetrics.ms_v_pos_altitude = (float) alt;
*StdMetrics.ms_v_pos_gpstime = (int) time(NULL);
*StdMetrics.ms_v_pos_gpstime = time(NULL);
}

// upodate gpslock last, so listeners will see updated lat/lon values:
Expand Down Expand Up @@ -269,7 +269,7 @@ void GsmNMEA::IncomingLine(const std::string line)

if (m_gpstime_enabled)
{
int tm = utc_to_timestamp(date, time);
auto tm = utc_to_timestamp(date, time);
if (tm < 1572735600) // 2019-11-03 00:00:00
tm += (1024*7*86400); // Nasty kludge to workaround SIM5360 week rollover
MyTime.Set(TAG, 2, true, tm);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,9 @@ void xmi_trip_since_parked(int verbosity, OvmsWriter* writer, OvmsCommand* cmd,

float distance = StdMetrics.ms_v_pos_trip->AsFloat(rangeUnit);
//Trip timer
int start = trio->ms_v_trip_park_time_start->AsInt();
int stop = trio->ms_v_trip_park_time_stop->AsInt();
int time = stop - start;
time_t start = trio->ms_v_trip_park_time_start->AsInt();
time_t stop = trio->ms_v_trip_park_time_stop->AsInt();
time_t time = stop - start;

int num_seconds = time;
int hours = num_seconds / (60 * 60);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,8 +119,8 @@ class OvmsVehicleMitsubishi : public OvmsVehicle
OvmsMetricFloat* ms_v_trip_park_ac_kwh = MyMetrics.InitFloat("xmi.e.trip.park.ac.kwh", 10, 0, kWh);
OvmsMetricFloat* ms_v_trip_park_soc_start = MyMetrics.InitFloat("xmi.e.trip.park.soc.start", 10, 0, Percentage);
OvmsMetricFloat* ms_v_trip_park_soc_stop = MyMetrics.InitFloat("xmi.e.trip.park.soc.stop", 10, 0, Percentage);
OvmsMetricInt* ms_v_trip_park_time_start = MyMetrics.InitInt("xmi.e.trip.park.time.start", 10, 0, Seconds);
OvmsMetricInt* ms_v_trip_park_time_stop = MyMetrics.InitInt("xmi.e.trip.park.time.stop", 10, 0, Seconds);
OvmsMetricInt64* ms_v_trip_park_time_start = MyMetrics.InitInt64("xmi.e.trip.park.time.start", 10, 0, DateLocal);
OvmsMetricInt64* ms_v_trip_park_time_stop = MyMetrics.InitInt64("xmi.e.trip.park.time.stop", 10, 0, DateLocal);

OvmsMetricFloat* ms_v_pos_trip_charge = MyMetrics.InitFloat("xmi.e.trip.charge", 10, 0, Kilometers);
OvmsMetricFloat* ms_v_trip_charge_energy_used = MyMetrics.InitFloat("xmi.e.trip.charge.energy.used", 10, 0, kWh);
Expand All @@ -139,7 +139,7 @@ class OvmsVehicleMitsubishi : public OvmsVehicle

void vehicle_mitsubishi_car_on(bool isOn);

int mi_start_time_utc;
time_t mi_start_time_utc;

//config variables
bool cfg_heater_old;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,8 @@ void OvmsVehicleTeslaRoadster::IncomingFrameCan1(CAN_frame_t* p_frame)
}
case 0x81: // Time/Date UTC
{
int tm = ((int)d[7]<<24) + ((int)d[6]<<16) + ((int)d[5]<<8) + d[4];
// TODO: Only 32 bit time_t
time_t tm = ((int)d[7]<<24) + ((int)d[6]<<16) + ((int)d[5]<<8) + d[4];
MyTime.Set(TAG, 2, true, tm);
break;
}
Expand Down
2 changes: 1 addition & 1 deletion vehicle/OVMS.V3/components/vehicle_vweup/src/vweup_obd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1215,7 +1215,7 @@ void OvmsVehicleVWeUp::IncomingPollReply(const OvmsPoller::poll_job_t &job, uint
case VWUP_MFD_SERV_TIME:
if (PollReply.FromUint16("VWUP_MFD_SERV_TIME", value) && value > 0) { // excluding value of 0 seems to be necessary for now
// Send notification?
int now = StdMetrics.ms_m_timeutc->AsInt();
time_t now = StdMetrics.ms_m_timeutc->AsInt();
int threshold = MyConfig.GetParamValueInt("xvu", "serv_warn_days", 30);
int old_value = ROUNDPREC((StdMetrics.ms_v_env_service_time->AsInt() - now) / 86400.0f, 0);
if (old_value > threshold && value <= threshold) {
Expand Down
6 changes: 3 additions & 3 deletions vehicle/OVMS.V3/main/metrics_standard.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ MetricsStandard::MetricsStandard()
ms_m_tasks = new OvmsMetricInt(MS_M_TASKS, SM_STALE_MID);
ms_m_freeram = new OvmsMetricInt(MS_M_FREERAM, SM_STALE_MID);
ms_m_monotonic = new OvmsMetricInt(MS_M_MONOTONIC, SM_STALE_MIN, Seconds);
ms_m_timeutc = new OvmsMetricInt(MS_M_TIME_UTC, SM_STALE_MIN, DateUTC);
ms_m_timeutc = new OvmsMetricInt64(MS_M_TIME_UTC, SM_STALE_MIN, DateUTC);

ms_m_net_type = new OvmsMetricString(MS_N_TYPE, SM_STALE_MAX);
ms_m_net_sq = new OvmsMetricInt(MS_N_SQ, SM_STALE_MAX, dbm);
Expand Down Expand Up @@ -249,7 +249,7 @@ MetricsStandard::MetricsStandard()
ms_v_env_cabinvent = new OvmsMetricString(MS_V_ENV_CABINVENT, SM_STALE_MID);

ms_v_env_service_range = new OvmsMetricInt(MS_V_ENV_SERV_RANGE, SM_STALE_MID, Kilometers);
ms_v_env_service_time = new OvmsMetricInt(MS_V_ENV_SERV_TIME, SM_STALE_MID, DateLocal);
ms_v_env_service_time = new OvmsMetricInt64(MS_V_ENV_SERV_TIME, SM_STALE_MID, DateLocal);

//
// Position / movement metrics
Expand All @@ -259,7 +259,7 @@ MetricsStandard::MetricsStandard()
ms_v_pos_gpshdop = new OvmsMetricFloat(MS_V_POS_GPSHDOP, SM_STALE_MIN);
ms_v_pos_satcount= new OvmsMetricInt(MS_V_POS_SATCOUNT, SM_STALE_MIN);
ms_v_pos_gpssq = new OvmsMetricInt(MS_V_POS_GPSSQ, SM_STALE_MIN, Percentage);
ms_v_pos_gpstime = new OvmsMetricInt(MS_V_POS_GPSTIME, SM_STALE_MIN, DateLocal);
ms_v_pos_gpstime = new OvmsMetricInt64(MS_V_POS_GPSTIME, SM_STALE_MIN, DateLocal);
ms_v_pos_latitude = new OvmsMetricFloat(MS_V_POS_LATITUDE, SM_STALE_MIN, Other, true);
ms_v_pos_longitude = new OvmsMetricFloat(MS_V_POS_LONGITUDE, SM_STALE_MIN, Other, true);
ms_v_pos_location = new OvmsMetricString(MS_V_POS_LOCATION, SM_STALE_MID);
Expand Down
6 changes: 3 additions & 3 deletions vehicle/OVMS.V3/main/metrics_standard.h
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,7 @@ class MetricsStandard
OvmsMetricInt* ms_m_tasks;
OvmsMetricInt* ms_m_freeram;
OvmsMetricInt* ms_m_monotonic;
OvmsMetricInt* ms_m_timeutc;
OvmsMetricInt64* ms_m_timeutc;

OvmsMetricString* ms_m_net_type; // none, wifi, modem
OvmsMetricInt* ms_m_net_sq; // Network signal quality [dbm]
Expand Down Expand Up @@ -489,7 +489,7 @@ class MetricsStandard
OvmsMetricString* ms_v_env_cabinintake; // Cabin intake type (fresh, recirc, etc)
OvmsMetricString* ms_v_env_cabinvent; // Cabin vent type (comma-separated list of feet, face, screen, etc)
OvmsMetricInt* ms_v_env_service_range; // Distance to next scheduled maintenance/service [km]
OvmsMetricInt* ms_v_env_service_time; // Time of scheduled maintenance/service [DateLocal]
OvmsMetricInt64* ms_v_env_service_time; // Time of scheduled maintenance/service [DateLocal]

//
// Position / location metrics
Expand All @@ -499,7 +499,7 @@ class MetricsStandard
OvmsMetricFloat* ms_v_pos_gpshdop; // Horizontal dilution of precision (smaller=better)
OvmsMetricInt* ms_v_pos_satcount;
OvmsMetricInt* ms_v_pos_gpssq; // GPS signal quality [%] (<30 unusable, >50 good, >80 excellent)
OvmsMetricInt* ms_v_pos_gpstime; // Time (UTC) of GPS coordinates [Seconds]
OvmsMetricInt64* ms_v_pos_gpstime; // Time (UTC) of GPS coordinates [Seconds]
OvmsMetricFloat* ms_v_pos_latitude;
OvmsMetricFloat* ms_v_pos_longitude;
OvmsMetricString* ms_v_pos_location; // Name of current location if defined
Expand Down
2 changes: 1 addition & 1 deletion vehicle/OVMS.V3/main/ovms_housekeeping.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ void HousekeepingTicker1( TimerHandle_t timer )

monotonictime++;
StandardMetrics.ms_m_monotonic->SetValue((int)monotonictime);
StandardMetrics.ms_m_timeutc->SetValue((int)time(NULL));
StandardMetrics.ms_m_timeutc->SetValue(time(NULL));

HousekeepingUpdate12V();
MyEvents.SignalEvent("ticker.1", NULL);
Expand Down

0 comments on commit dd78d24

Please sign in to comment.