Browse Source

Merge pull request #301 from kanoi/minerphp

API new command 'coin' with mining information
nfactor-troky
Con Kolivas 12 years ago
parent
commit
af32fb9a3d
  1. 9
      API-README
  2. 60
      api.c
  3. 19
      cgminer.c
  4. 4
      miner.h

9
API-README

@ -281,6 +281,12 @@ The list of requests - a (*) means it requires privileged access - and replies a
none There is no reply section just the STATUS section none There is no reply section just the STATUS section
stating what failover-only was set to stating what failover-only was set to
coin COIN Coin mining information:
Hash Method=sha256/scrypt,
Current Block Time=N.N, <- 0 means none
Current Block Hash=XXXX..., <- blank if none
LP=true/false| <- LP is in use on at least 1 pool
When you enable, disable or restart a GPU or PGA, you will also get Thread messages When you enable, disable or restart a GPU or PGA, you will also get Thread messages
in the cgminer status window in the cgminer status window
@ -335,6 +341,9 @@ Feature Changelog for external applications using the API:
API V1.17 API V1.17
Added API commands:
'coin'
Modified API commands: Modified API commands:
'summary' - add 'Work Utility' 'summary' - add 'Work Utility'
'pools' - add 'Diff1 Shares' 'pools' - add 'Diff1 Shares'

60
api.c

@ -187,6 +187,11 @@ static const char *NULLSTR = "(null)";
static const char *TRUESTR = "true"; static const char *TRUESTR = "true";
static const char *FALSESTR = "false"; static const char *FALSESTR = "false";
#ifdef USE_SCRYPT
static const char *SCRYPTSTR = "scrypt";
#endif
static const char *SHA256STR = "sha256";
static const char *DEVICECODE = "" static const char *DEVICECODE = ""
#ifdef HAVE_OPENCL #ifdef HAVE_OPENCL
"GPU " "GPU "
@ -232,7 +237,7 @@ static const char *OSINFO =
#define _SUMMARY "SUMMARY" #define _SUMMARY "SUMMARY"
#define _STATUS "STATUS" #define _STATUS "STATUS"
#define _VERSION "VERSION" #define _VERSION "VERSION"
#define _MINECON "CONFIG" #define _MINECONFIG "CONFIG"
#define _GPU "GPU" #define _GPU "GPU"
#ifdef HAVE_AN_FPGA #ifdef HAVE_AN_FPGA
@ -252,6 +257,7 @@ static const char *OSINFO =
#define _RESTART "RESTART" #define _RESTART "RESTART"
#define _MINESTATS "STATS" #define _MINESTATS "STATS"
#define _CHECK "CHECK" #define _CHECK "CHECK"
#define _MINECOIN "COIN"
static const char ISJSON = '{'; static const char ISJSON = '{';
#define JSON0 "{" #define JSON0 "{"
@ -267,7 +273,7 @@ static const char ISJSON = '{';
#define JSON_SUMMARY JSON1 _SUMMARY JSON2 #define JSON_SUMMARY JSON1 _SUMMARY JSON2
#define JSON_STATUS JSON1 _STATUS JSON2 #define JSON_STATUS JSON1 _STATUS JSON2
#define JSON_VERSION JSON1 _VERSION JSON2 #define JSON_VERSION JSON1 _VERSION JSON2
#define JSON_MINECON JSON1 _MINECON JSON2 #define JSON_MINECONFIG JSON1 _MINECONFIG JSON2
#define JSON_GPU JSON1 _GPU JSON2 #define JSON_GPU JSON1 _GPU JSON2
#ifdef HAVE_AN_FPGA #ifdef HAVE_AN_FPGA
@ -288,6 +294,7 @@ static const char ISJSON = '{';
#define JSON_CLOSE JSON3 #define JSON_CLOSE JSON3
#define JSON_MINESTATS JSON1 _MINESTATS JSON2 #define JSON_MINESTATS JSON1 _MINESTATS JSON2
#define JSON_CHECK JSON1 _CHECK JSON2 #define JSON_CHECK JSON1 _CHECK JSON2
#define JSON_MINECOIN JSON1 _MINECOIN JSON2
#define JSON_END JSON4 JSON5 #define JSON_END JSON4 JSON5
static const char *JSON_COMMAND = "command"; static const char *JSON_COMMAND = "command";
@ -329,7 +336,7 @@ static const char *JSON_PARAMETER = "parameter";
#define MSG_NOGPUADL 30 #define MSG_NOGPUADL 30
#define MSG_INVINT 31 #define MSG_INVINT 31
#define MSG_GPUINT 32 #define MSG_GPUINT 32
#define MSG_MINECON 33 #define MSG_MINECONFIG 33
#define MSG_GPUMERR 34 #define MSG_GPUMERR 34
#define MSG_GPUMEM 35 #define MSG_GPUMEM 35
#define MSG_GPUEERR 36 #define MSG_GPUEERR 36
@ -382,6 +389,7 @@ static const char *JSON_PARAMETER = "parameter";
#define MSG_MISBOOL 75 #define MSG_MISBOOL 75
#define MSG_INVBOOL 76 #define MSG_INVBOOL 76
#define MSG_FOO 77 #define MSG_FOO 77
#define MSG_MINECOIN 78
enum code_severity { enum code_severity {
SEVERITY_ERR, SEVERITY_ERR,
@ -496,7 +504,7 @@ struct CODES {
{ SEVERITY_ERR, MSG_NOGPUADL,PARAM_GPU, "GPU %d does not have ADL" }, { SEVERITY_ERR, MSG_NOGPUADL,PARAM_GPU, "GPU %d does not have ADL" },
{ SEVERITY_ERR, MSG_INVINT, PARAM_STR, "Invalid intensity (%s) - must be '" _DYNAMIC "' or range " _MIN_INTENSITY_STR " - " _MAX_INTENSITY_STR }, { SEVERITY_ERR, MSG_INVINT, PARAM_STR, "Invalid intensity (%s) - must be '" _DYNAMIC "' or range " _MIN_INTENSITY_STR " - " _MAX_INTENSITY_STR },
{ SEVERITY_INFO, MSG_GPUINT, PARAM_BOTH, "GPU %d set new intensity to %s" }, { SEVERITY_INFO, MSG_GPUINT, PARAM_BOTH, "GPU %d set new intensity to %s" },
{ SEVERITY_SUCC, MSG_MINECON, PARAM_NONE, "CGMiner config" }, { SEVERITY_SUCC, MSG_MINECONFIG,PARAM_NONE, "CGMiner config" },
#ifdef HAVE_OPENCL #ifdef HAVE_OPENCL
{ SEVERITY_ERR, MSG_GPUMERR, PARAM_BOTH, "Setting GPU %d memoryclock to (%s) reported failure" }, { SEVERITY_ERR, MSG_GPUMERR, PARAM_BOTH, "Setting GPU %d memoryclock to (%s) reported failure" },
{ SEVERITY_SUCC, MSG_GPUMEM, PARAM_BOTH, "Setting GPU %d memoryclock to (%s) reported success" }, { SEVERITY_SUCC, MSG_GPUMEM, PARAM_BOTH, "Setting GPU %d memoryclock to (%s) reported success" },
@ -534,6 +542,7 @@ struct CODES {
{ SEVERITY_ERR, MSG_MISBOOL, PARAM_NONE, "Missing parameter: true/false" }, { SEVERITY_ERR, MSG_MISBOOL, PARAM_NONE, "Missing parameter: true/false" },
{ SEVERITY_ERR, MSG_INVBOOL, PARAM_NONE, "Invalid parameter should be true or false" }, { SEVERITY_ERR, MSG_INVBOOL, PARAM_NONE, "Invalid parameter should be true or false" },
{ SEVERITY_SUCC, MSG_FOO, PARAM_BOOL, "Failover-Only set to %s" }, { SEVERITY_SUCC, MSG_FOO, PARAM_BOOL, "Failover-Only set to %s" },
{ SEVERITY_SUCC, MSG_MINECOIN,PARAM_NONE, "CGMiner coin" },
{ SEVERITY_FAIL, 0, 0, NULL } { SEVERITY_FAIL, 0, 0, NULL }
}; };
@ -1232,9 +1241,9 @@ static void minerconfig(__maybe_unused SOCKETTYPE c, __maybe_unused char *param,
#endif #endif
sprintf(io_buffer, isjson sprintf(io_buffer, isjson
? "%s," JSON_MINECON ? "%s," JSON_MINECONFIG
: "%s" _MINECON ",", : "%s" _MINECONFIG ",",
message(MSG_MINECON, 0, NULL, isjson)); message(MSG_MINECONFIG, 0, NULL, isjson));
root = api_add_int(root, "GPU Count", &gpucount, false); root = api_add_int(root, "GPU Count", &gpucount, false);
root = api_add_int(root, "PGA Count", &pgacount, false); root = api_add_int(root, "PGA Count", &pgacount, false);
@ -2741,6 +2750,42 @@ static void failoveronly(__maybe_unused SOCKETTYPE c, char *param, bool isjson,
strcpy(io_buffer, message(MSG_FOO, tf, NULL, isjson)); strcpy(io_buffer, message(MSG_FOO, tf, NULL, isjson));
} }
static void minecoin(__maybe_unused SOCKETTYPE c, __maybe_unused char *param, bool isjson, __maybe_unused char group)
{
struct api_data *root = NULL;
char buf[TMPBUFSIZ];
sprintf(io_buffer, isjson
? "%s," JSON_MINECOIN
: "%s" _MINECOIN ",",
message(MSG_MINECOIN, 0, NULL, isjson));
#ifdef USE_SCRYPT
if (opt_scrypt)
root = api_add_const(root, "Hash Method", SCRYPTSTR, false);
else
#endif
root = api_add_const(root, "Hash Method", SHA256STR, false);
mutex_lock(&ch_lock);
if (current_fullhash && *current_fullhash) {
root = api_add_timeval(root, "Current Block Time", &block_timeval, true);
root = api_add_string(root, "Current Block Hash", current_fullhash, true);
} else {
struct timeval t = {0,0};
root = api_add_timeval(root, "Current Block Time", &t, true);
root = api_add_const(root, "Current Block Hash", BLANK, false);
}
mutex_unlock(&ch_lock);
root = api_add_bool(root, "LP", &have_longpoll, false);
root = print_data(root, buf, isjson);
if (isjson)
strcat(buf, JSON_CLOSE);
strcat(io_buffer, buf);
}
static void checkcommand(__maybe_unused SOCKETTYPE c, char *param, bool isjson, char group); static void checkcommand(__maybe_unused SOCKETTYPE c, char *param, bool isjson, char group);
struct CMDS { struct CMDS {
@ -2792,6 +2837,7 @@ struct CMDS {
{ "stats", minerstats, false }, { "stats", minerstats, false },
{ "check", checkcommand, false }, { "check", checkcommand, false },
{ "failover-only", failoveronly, true }, { "failover-only", failoveronly, true },
{ "coin", minecoin, false },
{ NULL, NULL, false } { NULL, NULL, false }
}; };

19
cgminer.c

@ -85,7 +85,7 @@ static char packagename[255];
bool opt_protocol; bool opt_protocol;
static bool opt_benchmark; static bool opt_benchmark;
static bool have_longpoll; bool have_longpoll;
static bool want_per_device_stats; static bool want_per_device_stats;
bool use_syslog; bool use_syslog;
bool opt_quiet; bool opt_quiet;
@ -167,7 +167,7 @@ static pthread_mutex_t hash_lock;
static pthread_mutex_t qd_lock; static pthread_mutex_t qd_lock;
static pthread_mutex_t *stgd_lock; static pthread_mutex_t *stgd_lock;
pthread_mutex_t console_lock; pthread_mutex_t console_lock;
static pthread_mutex_t ch_lock; pthread_mutex_t ch_lock;
static pthread_rwlock_t blk_lock; static pthread_rwlock_t blk_lock;
pthread_rwlock_t netacc_lock; pthread_rwlock_t netacc_lock;
@ -210,8 +210,10 @@ bool curses_active;
static char current_block[37]; static char current_block[37];
static char *current_hash; static char *current_hash;
char *current_fullhash;
static char datestamp[40]; static char datestamp[40];
static char blocktime[30]; static char blocktime[30];
struct timeval block_timeval;
struct block { struct block {
char hash[37]; char hash[37];
@ -2773,22 +2775,27 @@ static void restart_threads(void)
static void set_curblock(char *hexstr, unsigned char *hash) static void set_curblock(char *hexstr, unsigned char *hash)
{ {
unsigned char hash_swap[32]; unsigned char hash_swap[32];
struct timeval tv_now; unsigned char block_hash_swap[32];
char *old_hash; char *old_hash;
strcpy(current_block, hexstr); strcpy(current_block, hexstr);
gettimeofday(&tv_now, NULL);
get_timestamp(blocktime, &tv_now);
swap256(hash_swap, hash); swap256(hash_swap, hash);
swap256(block_hash_swap, hash+4);
/* Don't free current_hash directly to avoid dereferencing when read /* Don't free current_hash directly to avoid dereferencing when read
* elsewhere */ * elsewhere - and update block_timeval inside the same lock */
mutex_lock(&ch_lock); mutex_lock(&ch_lock);
gettimeofday(&block_timeval, NULL);
old_hash = current_hash; old_hash = current_hash;
current_hash = bin2hex(hash_swap, 16); current_hash = bin2hex(hash_swap, 16);
free(old_hash); free(old_hash);
old_hash = current_fullhash;
current_fullhash = bin2hex(block_hash_swap, 32);
free(old_hash);
mutex_unlock(&ch_lock); mutex_unlock(&ch_lock);
get_timestamp(blocktime, &block_timeval);
if (unlikely(!current_hash)) if (unlikely(!current_hash))
quit (1, "set_curblock OOM"); quit (1, "set_curblock OOM");
applog(LOG_INFO, "New block: %s...", current_hash); applog(LOG_INFO, "New block: %s...", current_hash);

4
miner.h

@ -552,6 +552,7 @@ static inline void rwlock_init(pthread_rwlock_t *lock)
struct pool; struct pool;
extern bool opt_protocol; extern bool opt_protocol;
extern bool have_longpoll;
extern char *opt_kernel_path; extern char *opt_kernel_path;
extern char *opt_socks_proxy; extern char *opt_socks_proxy;
extern char *cgminer_path; extern char *cgminer_path;
@ -595,6 +596,7 @@ extern bool fulltest(const unsigned char *hash, const unsigned char *target);
extern int opt_scantime; extern int opt_scantime;
extern pthread_mutex_t console_lock; extern pthread_mutex_t console_lock;
extern pthread_mutex_t ch_lock;
extern pthread_mutex_t restart_lock; extern pthread_mutex_t restart_lock;
extern pthread_cond_t restart_cond; extern pthread_cond_t restart_cond;
@ -669,6 +671,8 @@ extern unsigned int total_go, total_ro;
extern const int opt_cutofftemp; extern const int opt_cutofftemp;
extern int opt_log_interval; extern int opt_log_interval;
extern unsigned long long global_hashrate; extern unsigned long long global_hashrate;
extern char *current_fullhash;
extern struct timeval block_timeval;
#ifdef HAVE_OPENCL #ifdef HAVE_OPENCL
typedef struct { typedef struct {

Loading…
Cancel
Save