Permalink
Browse files

API V1.23 - new pgaset command, to be used soon

  • Loading branch information...
1 parent 5ab2f3a commit e931b72753233ba25a84015b2c154c3700457972 @kanoi kanoi committed Dec 18, 2012
Showing with 98 additions and 3 deletions.
  1. +20 −2 API-README
  2. +77 −1 api.c
  3. +1 −0 miner.h
View
@@ -330,9 +330,20 @@ The list of requests - a (*) means it requires privileged access - and replies a
queue, scantime, expiry
N is an integer in the range 0 to 9999
- substats USBSTATS Stats of all LIBUSB mining devices except ztex
+ usbstats USBSTATS Stats of all LIBUSB mining devices except ztex
e.g. Name=MMQ,ID=0,Stat=SendWork,Count=99,...|
+ pgaset|N,opt[,val] (*)
+ none There is no reply section just the STATUS section
+ stating the results of setting PGA N with opt[,val]
+ This is only available if PGA mining is enabled
+
+ If the PGA does not support any set options, it will
+ always return a WARN stating pgaset isn't supported
+
+ If opt=help it will return an INFO status with a
+ help message about the options available
+
When you enable, disable or restart a GPU or PGA, you will also get Thread messages
in the cgminer status window
@@ -386,7 +397,14 @@ miner.php - an example web page to access the API
Feature Changelog for external applications using the API:
-API V1.22
+API V1.23
+
+Added API commands:
+ 'pgaset'
+
+----------
+
+API V1.22 (cgminer v2.10.1)
Enforced output limitation:
all extra records beyond the output limit of the API (~64k) are ignored
View
78 api.c
@@ -133,7 +133,7 @@ static const char SEPARATOR = '|';
#define SEPSTR "|"
static const char GPUSEP = ',';
-static const char *APIVERSION = "1.22";
+static const char *APIVERSION = "1.23";
static const char *DEAD = "Dead";
#if defined(HAVE_OPENCL) || defined(HAVE_AN_FPGA)
static const char *SICK = "Sick";
@@ -379,6 +379,14 @@ static const char *JSON_PARAMETER = "parameter";
#define MSG_USBSTA 87
#define MSG_NOUSTA 88
+#ifdef HAVE_AN_FPGA
+#define MSG_MISPGAOPT 89
+#define MSG_PGANOSET 90
+#define MSG_PGAHELP 91
+#define MSG_PGASETOK 92
+#define MSG_PGASETERR 93
+#endif
+
enum code_severity {
SEVERITY_ERR,
SEVERITY_WARN,
@@ -544,6 +552,13 @@ struct CODES {
{ SEVERITY_ERR, MSG_CONVAL, PARAM_STR, "Missing config value N for '%s,N'" },
{ SEVERITY_SUCC, MSG_USBSTA, PARAM_NONE, "USB Statistics" },
{ SEVERITY_INFO, MSG_NOUSTA, PARAM_NONE, "No USB Statistics" },
+#ifdef HAVE_AN_FPGA
+ { SEVERITY_ERR, MSG_MISPGAOPT, PARAM_NONE, "Missing option after PGA number" },
+ { SEVERITY_WARN, MSG_PGANOSET, PARAM_PGA, "PGA %d does not support pgaset" },
+ { SEVERITY_INFO, MSG_PGAHELP, PARAM_BOTH, "PGA %d set help: %s" },
+ { SEVERITY_SUCC, MSG_PGASETOK, PARAM_BOTH, "PGA %d set OK" },
+ { SEVERITY_ERR, MSG_PGASETERR, PARAM_BOTH, "PGA %d set failed: %s" },
+#endif
{ SEVERITY_FAIL, 0, 0, NULL }
};
@@ -3142,6 +3157,64 @@ static void usbstats(struct io_data *io_data, __maybe_unused SOCKETTYPE c, __may
#endif
}
+#ifdef HAVE_AN_FPGA
+static void pgaset(struct io_data *io_data, __maybe_unused SOCKETTYPE c, __maybe_unused char *param, bool isjson, __maybe_unused char group)
+{
+ char buf[TMPBUFSIZ];
+ int numpga = numpgas();
+
+ if (numpga == 0) {
+ message(io_data, MSG_PGANON, 0, NULL, isjson);
+ return;
+ }
+
+ if (param == NULL || *param == '\0') {
+ message(io_data, MSG_MISID, 0, NULL, isjson);
+ return;
+ }
+
+ char *opt = strchr(param, ',');
+ if (opt)
+ *(opt++) = '\0';
+ if (!opt || !*opt) {
+ message(io_data, MSG_MISPGAOPT, 0, NULL, isjson);
+ return;
+ }
+
+ int id = atoi(param);
+ if (id < 0 || id >= numpga) {
+ message(io_data, MSG_INVPGA, id, NULL, isjson);
+ return;
+ }
+
+ int dev = pgadevice(id);
+ if (dev < 0) { // Should never happen
+ message(io_data, MSG_INVPGA, id, NULL, isjson);
+ return;
+ }
+
+ struct cgpu_info *cgpu = devices[dev];
+ struct device_api *api = cgpu->api;
+
+ char *set = strchr(opt, ',');
+ if (set)
+ *(set++) = '\0';
+
+ if (!api->set_device)
+ message(io_data, MSG_PGANOSET, id, NULL, isjson);
+ else {
+ char *ret = api->set_device(cgpu, opt, set, buf);
+ if (ret) {
+ if (strcasecmp(opt, "help") == 0)
+ message(io_data, MSG_PGAHELP, id, ret, isjson);
+ else
+ message(io_data, MSG_PGASETERR, id, ret, isjson);
+ } else
+ message(io_data, MSG_PGASETOK, id, NULL, isjson);
+ }
+}
+#endif
+
static void checkcommand(struct io_data *io_data, __maybe_unused SOCKETTYPE c, char *param, bool isjson, char group);
struct CMDS {
@@ -3198,6 +3271,9 @@ struct CMDS {
{ "debug", debugstate, true },
{ "setconfig", setconfig, true },
{ "usbstats", usbstats, false },
+#ifdef HAVE_AN_FPGA
+ { "pgaset", pgaset, true },
+#endif
{ NULL, NULL, false }
};
View
@@ -277,6 +277,7 @@ struct device_api {
struct api_data *(*get_api_stats)(struct cgpu_info *);
bool (*get_stats)(struct cgpu_info *);
void (*identify_device)(struct cgpu_info *); // e.g. to flash a led
+ char *(*set_device)(struct cgpu_info *, char *option, char *setting, char *replybuf);
// Thread-specific functions
bool (*thread_prepare)(struct thr_info *);

0 comments on commit e931b72

Please sign in to comment.