Skip to content

Commit 4dcc4cc

Browse files
authored
ptm: Add some api related to play/step history (#564)
1 parent e4b9050 commit 4dcc4cc

File tree

4 files changed

+98
-0
lines changed

4 files changed

+98
-0
lines changed

libctru/include/3ds/services/ptmsysm.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,19 @@ Result PTMSYSM_GetWakeReason(PtmSleepConfig *outSleepConfig);
8787
/// Cancels the "half-awake" state and fully wakes up the 3DS after some delay.
8888
Result PTMSYSM_Awaken(void);
8989

90+
/// Clear the "step history".
91+
Result PTMSYSM_ClearStepHistory(void);
92+
93+
/**
94+
* @brief Sets the system's step count history.
95+
* @param hours Number of hours to set the step count history for.
96+
* @param stepValue Pointer to read the step count history from. (The buffer size must be at least `hours` in length)
97+
*/
98+
Result PTMSYSM_SetStepHistory(u32 hours, const u16 *stepValue);
99+
100+
/// Clear the "play history".
101+
Result PTMSYSM_ClearPlayHistory(void);
102+
90103
/**
91104
* @brief Sets the user time by updating the user time offset.
92105
* @param msY2k The number of milliseconds since 01/01/2000.

libctru/include/3ds/services/ptmu.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,13 @@ Result PTMU_GetBatteryChargeState(u8 *out);
4040
*/
4141
Result PTMU_GetPedometerState(u8 *out);
4242

43+
/**
44+
* @brief Gets the system's step count history.
45+
* @param hours Number of hours to get the step count history for.
46+
* @param stepValue Pointer to output the step count history to. (The buffer size must be at least `hours` in length)
47+
*/
48+
Result PTMU_GetStepHistory(u32 hours, u16 *stepValue);
49+
4350
/**
4451
* @brief Gets the pedometer's total step count.
4552
* @param steps Pointer to write the total step count to.

libctru/source/services/ptmsysm.c

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include <string.h>
2+
#include <time.h>
23
#include <3ds/types.h>
34
#include <3ds/result.h>
45
#include <3ds/svc.h>
@@ -150,6 +151,55 @@ Result PTMSYSM_RebootAsync(u64 timeout)
150151
return (Result)cmdbuf[1];
151152
}
152153

154+
Result PTMSYSM_ClearStepHistory(void)
155+
{
156+
Result ret;
157+
u32 *cmdbuf = getThreadCommandBuffer();
158+
cmdbuf[0] = IPC_MakeHeader(0x805,0,0); // 0x8050000
159+
160+
if(R_FAILED(ret = svcSendSyncRequest(ptmSysmHandle)))return ret;
161+
162+
return (Result)cmdbuf[1];
163+
}
164+
165+
Result PTMSYSM_SetStepHistory(u32 hours, const u16 *stepValue)
166+
{
167+
Result ret;
168+
169+
time_t raw;
170+
time(&raw);
171+
double msTime = difftime(raw, 0x386D4380); // 01.01.2000 00:00:00 UTC
172+
msTime = msTime * 1000.0f;
173+
174+
s64 msiTime = (s64)msTime;
175+
u32 msiTimeLo, msiTimeHi;
176+
msiTimeLo = (u32)(msiTime & 0xFFFFFFFF); // Low 32 Bit
177+
msiTimeHi = (u32)((msiTime >> 32) & 0xFFFFFFFF); // High 32 Bit
178+
179+
u32 *cmdbuf = getThreadCommandBuffer();
180+
cmdbuf[0] = IPC_MakeHeader(0x806, 3, 2); // 0x80600C2
181+
cmdbuf[1] = hours;
182+
cmdbuf[2] = msiTimeLo;
183+
cmdbuf[3] = msiTimeHi;
184+
cmdbuf[4] = IPC_Desc_Buffer(hours, IPC_BUFFER_R);
185+
cmdbuf[5] = (u32)stepValue;
186+
187+
if(R_FAILED(ret = svcSendSyncRequest(ptmSysmHandle)))return ret;
188+
189+
return (Result)cmdbuf[1];
190+
}
191+
192+
Result PTMSYSM_ClearPlayHistory(void)
193+
{
194+
Result ret;
195+
u32 *cmdbuf = getThreadCommandBuffer();
196+
cmdbuf[0] = IPC_MakeHeader(0x80A,0,0); // 0x80A0000
197+
198+
if(R_FAILED(ret = svcSendSyncRequest(ptmSysmHandle)))return ret;
199+
200+
return (Result)cmdbuf[1];
201+
}
202+
153203
Result PTMSYSM_SetUserTime(s64 msY2k)
154204
{
155205
Result ret;

libctru/source/services/ptmu.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include <stdlib.h>
2+
#include <time.h>
23
#include <3ds/types.h>
34
#include <3ds/result.h>
45
#include <3ds/svc.h>
@@ -85,6 +86,33 @@ Result PTMU_GetPedometerState(u8 *out)
8586
return (Result)cmdbuf[1];
8687
}
8788

89+
Result PTMU_GetStepHistory(u32 hours, u16 *stepValue)
90+
{
91+
Result ret=0;
92+
93+
time_t raw;
94+
time(&raw);
95+
double msTime = difftime(raw, 0x386D4380); // 01.01.2000 00:00:00 UTC
96+
msTime = msTime * 1000.0f;
97+
98+
s64 msiTime = (s64)msTime;
99+
u32 msiTimeLo, msiTimeHi;
100+
msiTimeLo = (u32)(msiTime & 0xFFFFFFFF); // Low 32 Bit
101+
msiTimeHi = (u32)((msiTime >> 32) & 0xFFFFFFFF); // High 32 Bit
102+
103+
u32 *cmdbuf = getThreadCommandBuffer();
104+
cmdbuf[0] = IPC_MakeHeader(0xB, 3, 2); // 0x00B00C2
105+
cmdbuf[1] = hours;
106+
cmdbuf[2] = msiTimeLo;
107+
cmdbuf[3] = msiTimeHi;
108+
cmdbuf[4] = IPC_Desc_Buffer(hours, IPC_BUFFER_W);
109+
cmdbuf[5] = (u32)stepValue;
110+
111+
if(R_FAILED(ret = svcSendSyncRequest(ptmuHandle)))return ret;
112+
113+
return (Result)cmdbuf[1];
114+
}
115+
88116
Result PTMU_GetTotalStepCount(u32 *steps)
89117
{
90118
Result ret=0;

0 commit comments

Comments
 (0)