Add name to HAL Notifier

This commit is contained in:
Peter Johnson
2019-11-09 11:41:58 -08:00
parent 2da64d15f6
commit 3e049e02f0
10 changed files with 74 additions and 2 deletions

View File

@@ -1,5 +1,5 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) 2016-2018 FIRST. All Rights Reserved. */
/* Copyright (c) 2016-2019 FIRST. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
@@ -19,6 +19,11 @@ public class NotifierJNI extends JNIWrapper {
*/
public static native int initializeNotifier();
/**
* Sets the name of the notifier.
*/
public static native void setNotifierName(int notifierHandle, String name);
/**
* Wakes up the waiter with time=0. Note: after this function is called, all
* calls to waitForNotifierAlarm() will immediately start returning 0.

View File

@@ -139,6 +139,9 @@ HAL_NotifierHandle HAL_InitializeNotifier(int32_t* status) {
return handle;
}
void HAL_SetNotifierName(HAL_NotifierHandle notifierHandle, const char* name,
int32_t* status) {}
void HAL_StopNotifier(HAL_NotifierHandle notifierHandle, int32_t* status) {
auto notifier = notifierHandles->Get(notifierHandle);
if (!notifier) return;

View File

@@ -10,6 +10,8 @@
#include <cassert>
#include <cstdio>
#include <wpi/jni_util.h>
#include "HALUtil.h"
#include "edu_wpi_first_hal_NotifierJNI.h"
#include "hal/Notifier.h"
@@ -37,6 +39,21 @@ Java_edu_wpi_first_hal_NotifierJNI_initializeNotifier
return (jint)notifierHandle;
}
/*
* Class: edu_wpi_first_hal_NotifierJNI
* Method: setNotifierName
* Signature: (ILjava/lang/String;)V
*/
JNIEXPORT void JNICALL
Java_edu_wpi_first_hal_NotifierJNI_setNotifierName
(JNIEnv* env, jclass cls, jint notifierHandle, jstring name)
{
int32_t status = 0;
HAL_SetNotifierName((HAL_NotifierHandle)notifierHandle,
wpi::java::JStringRef{env, name}.c_str(), &status);
CheckStatus(env, status);
}
/*
* Class: edu_wpi_first_hal_NotifierJNI
* Method: stopNotifier

View File

@@ -1,5 +1,5 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) 2016-2018 FIRST. All Rights Reserved. */
/* Copyright (c) 2016-2019 FIRST. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
@@ -31,6 +31,15 @@ extern "C" {
*/
HAL_NotifierHandle HAL_InitializeNotifier(int32_t* status);
/**
* Sets the name of a notifier.
*
* @param notifierHandle the notifier handle
* @param name name
*/
void HAL_SetNotifierName(HAL_NotifierHandle notifierHandle, const char* name,
int32_t* status);
/**
* Stops a notifier from running.
*

View File

@@ -8,6 +8,7 @@
#include "hal/Notifier.h"
#include <chrono>
#include <string>
#include <wpi/condition_variable.h>
#include <wpi/mutex.h>
@@ -20,6 +21,7 @@
namespace {
struct Notifier {
std::string name;
uint64_t waitTime;
bool updatedAlarm = false;
bool active = true;
@@ -71,6 +73,14 @@ HAL_NotifierHandle HAL_InitializeNotifier(int32_t* status) {
return handle;
}
void HAL_SetNotifierName(HAL_NotifierHandle notifierHandle, const char* name,
int32_t* status) {
auto notifier = notifierHandles->Get(notifierHandle);
if (!notifier) return;
std::scoped_lock lock(notifier->mutex);
notifier->name = name;
}
void HAL_StopNotifier(HAL_NotifierHandle notifierHandle, int32_t* status) {
auto notifier = notifierHandles->Get(notifierHandle);
if (!notifier) return;

View File

@@ -11,6 +11,7 @@
#include <hal/FRCUsageReporting.h>
#include <hal/Notifier.h>
#include <wpi/SmallString.h>
#include "frc/Timer.h"
#include "frc/Utility.h"
@@ -91,6 +92,13 @@ Notifier& Notifier::operator=(Notifier&& rhs) {
return *this;
}
void Notifier::SetName(const wpi::Twine& name) {
wpi::SmallString<64> nameBuf;
int32_t status = 0;
HAL_SetNotifierName(m_notifier,
name.toNullTerminatedStringRef(nameBuf).data(), &status);
}
void Notifier::SetHandler(std::function<void()> handler) {
std::scoped_lock lock(m_processMutex);
m_handler = handler;

View File

@@ -60,6 +60,7 @@ TimedRobot::TimedRobot(units::second_t period) : IterativeRobotBase(period) {
int32_t status = 0;
m_notifier = HAL_InitializeNotifier(&status);
wpi_setHALError(status);
HAL_SetNotifierName(m_notifier, "TimedRobot", &status);
HAL_Report(HALUsageReporting::kResourceType_Framework,
HALUsageReporting::kFramework_Timed);

View File

@@ -16,6 +16,7 @@
#include <hal/Types.h>
#include <units/units.h>
#include <wpi/Twine.h>
#include <wpi/deprecated.h>
#include <wpi/mutex.h>
@@ -46,6 +47,13 @@ class Notifier : public ErrorBase {
Notifier(Notifier&& rhs);
Notifier& operator=(Notifier&& rhs);
/**
* Sets the name of the notifier. Used for debugging purposes only.
*
* @param name Name
*/
void SetName(const wpi::Twine& name);
/**
* Change the handler function.
*

View File

@@ -138,6 +138,16 @@ public class Notifier implements AutoCloseable {
m_thread.start();
}
/**
* Sets the name of the notifier. Used for debugging purposes only.
*
* @param name Name
*/
public void setName(String name) {
m_thread.setName(name);
NotifierJNI.setNotifierName(m_notifier.get(), name);
}
/**
* Change the handler function.
*

View File

@@ -43,6 +43,7 @@ public class TimedRobot extends IterativeRobotBase {
*/
protected TimedRobot(double period) {
super(period);
NotifierJNI.setNotifierName(m_notifier, "TimedRobot");
HAL.report(tResourceType.kResourceType_Framework, tInstances.kFramework_Timed);
}