PyObject *py_device_upgrade(py_device_object *self, PyObject *args, PyObject *kwds) { FILE *fp = NULL; char *filename = NULL; int count = 0; int wait = -1; char *version_str; PyObject *wait_obj = NULL; char *kwlist[] = {"filename", "wait", NULL}; int success; if(!PyArg_ParseTupleAndKeywords(args, kwds, "sO!", kwlist, &filename, &PyBool_Type, &wait_obj)) return NULL; Py_INCREF(wait_obj); wait = PyObject_IsTrue(wait_obj); Py_DECREF(wait_obj); if(wait < 0) return NULL; fp = fopen(filename, "rb"); if(!fp) { PyErr_SetString(PyExc_IOError, "unable to open firmware file"); return NULL; } success = hdhomerun_device_upgrade(self->hd, fp); fclose(fp); fp = NULL; if(success == -1) { PyErr_SetString(hdhomerun_device_error, "error sending upgrade file to hdhomerun device"); return NULL; } else if(success == 0) { PyErr_SetString(hdhomerun_device_error, "the hdhomerun device rejected the firmware upgrade"); return NULL; } if(wait > 0) { /* Wait for the device to come back online */ msleep_minimum(10000); while (1) { if(hdhomerun_device_get_version(self->hd, &version_str, NULL) >= 0) break; count++; if (count > 30) { PyErr_SetString(hdhomerun_device_error, "error finding device after firmware upgrade"); return NULL; } msleep_minimum(1000); } } Py_RETURN_NONE; }
static int cmd_upgrade(const char *filename) { FILE *fp = fopen(filename, "rb"); if (!fp) { fprintf(stderr, "unable to open file %s\n", filename); return -1; } printf("uploading firmware...\n"); if (hdhomerun_device_upgrade(hd, fp) <= 0) { fprintf(stderr, "error sending upgrade file to hdhomerun device\n"); fclose(fp); return -1; } fclose(fp); msleep_minimum(2000); printf("upgrading firmware...\n"); msleep_minimum(8000); printf("rebooting...\n"); int count = 0; char *version_str; while (1) { if (hdhomerun_device_get_version(hd, &version_str, NULL) >= 0) { break; } count++; if (count > 30) { fprintf(stderr, "error finding device after firmware upgrade\n"); return -1; } msleep_minimum(1000); } printf("upgrade complete - now running firmware %s\n", version_str); return 0; }