PROCESS_THREAD(debug_process, ev, data) {
  char line[MAX_LINE_LENGTH];
  uint16_t read;
  uint8_t b;
  uint32_t flashAddress = 0;
  uint32_t flashCount = 0;
  uint32_t t = 0;

  PROCESS_BEGIN();

  while (1) {
    PROCESS_YIELD();

    while (dma_ring_buffer_readline(&g_debugUsartDmaInputRingBuffer, line, MAX_LINE_LENGTH)) {
      if (strcmp(line, "!CONNECT\n") == 0) {
        debug_write_line("+OK");
        debug_write_line("!clear");
        debug_write_line("!set name,dc-electronic-load");
        debug_write_line("!set description,'DC Electonic Load'");
      }
      
      else if (strcmp(line, "!RESET\n") == 0) {
        debug_write_line("+OK");
        NVIC_SystemReset();
      }

#ifdef ADC_ENABLE
      else if (strcmp(line, "!ADCLAST\n") == 0) {
        debug_write("+OK ");
        debug_write_u16(lastAdcValue[0], 10);
        debug_write(",");
        debug_write_u16(lastAdcValue[1], 10);
        debug_write(",");
        debug_write_u16(lastAdcValue[2], 10);
        debug_write(",");
        debug_write_u16(lastAdcValue[3], 10);
        debug_write(",");
        debug_write_u16(setCurrentMilliamps, 10);
        debug_write_line("");
      } else if (strcmp(line, "!ADCRAW\n") == 0) {
        debug_write("+OK ");
        debug_write_u16(adc_sample(ADC_CH0_SINGLE), 10);
        debug_write(",");
        debug_write_u16(adc_sample(ADC_CH1_SINGLE), 10);
        debug_write(",");
        debug_write_u16(adc_sample(ADC_CH2_SINGLE), 10);
        debug_write(",");
        debug_write_u16(adc_sample(ADC_CH3_SINGLE), 10);
        debug_write_line("");
      }
#endif

#ifdef FAN_ENABLE
      else if (strncmp(line, "!FANSET ", 8) == 0) {
        uint8_t fanSetOverride = atoi(line + 8);
        fan_set(fanSetOverride);
        debug_write_line("+OK");
      } else if (strcmp(line, "!FANGET\n") == 0) {
        debug_write("+OK ");
        debug_write_u8(fan_get(), 10);
        debug_write_line("");
      }
#endif

#ifdef DISP6800_ENABLE
      else if (strcmp(line, "!DISPON\n") == 0) {
        disp6800_set_display_onoff(DISP6800_DISPLAY_ON);
        debug_write_line("+OK");
      } else if (strcmp(line, "!DISPOFF\n") == 0) {
        disp6800_set_display_onoff(DISP6800_DISPLAY_OFF);
        debug_write_line("+OK");
      }
#endif

#ifdef FLASH_ENABLE
      else if (strcmp(line, "!FLASHCLEAR\n") == 0) {
        flashsst25_erase_chip();
        debug_write_line("+OK");
      } else if (strncmp(line, "!FLASHWRITE ", 12) == 0) {
        flashAddress = atoi(line + 12);
        flashCount = FLASH_BLOCK_SIZE;

        debug_write_line("+READY");
        t = time_ms();
        while (1) {
          if (flashCount <= 0) {
            debug_write("+OK ");
            debug_write_u32(flashAddress, 10);
            debug_write_line("");
            break;
          }
          if ((time_ms() - t) > 5000) {
            debug_write_line("-FAIL");
            break;
          }
          if ((read = dma_ring_buffer_read(&g_debugUsartDmaInputRingBuffer, (uint8_t*)line, MIN(flashCount, sizeof(line)))) <= 0) {
            continue;
          }
          flashsst25_write(flashAddress, (uint8_t*)line, read);
          flashAddress += read;
          flashCount -= read;
          t = time_ms();
        }
      } else if (strncmp(line, "!FLASHREAD ", 11) == 0) {
        flashAddress = atoi(line + 11);
        flashCount = FLASH_BLOCK_SIZE;
        debug_write_line("+OK");
        flashsst25_read_begin(flashAddress);
        while (flashCount > 0) {
          b = flashsst25_read();
          debug_write_bytes(&b, 1);
          flashCount--;
        }
        flashsst25_read_end();
      }
#endif

      else {
        debug_write("?Unknown command: ");
        debug_write_line(line);
      }
    }
  }

  PROCESS_END();
}
static json_t *fan_put(struct rest_uri_param *param)
{
	json_t *req;
	json_t *TachoMeterThreshold;
	result_t rs = RESULT_OK;
	put_fan_t put_fan_info = { {0} };
	uint32 value;
	json_t *elem = NULL;
	json_t *obj = NULL;
	int32 i = 0;
	int32 array_size;
	int32 tzone_idx, fan_idx = 0;

	tzone_idx = get_asset_idx(param, "zone_id", MC_TYPE_TZONE);
	if (tzone_idx == -1) {
		HTTPD_ERR("get cooling zone index fail\n");
		return NULL;
	}

	fan_idx = get_asset_idx(param, "fan_id", MC_TYPE_FAN);
	if (fan_idx == -1) {
		HTTPD_ERR("get fan index fail\n");
		return NULL;
	}

	rs = libwrap_pre_put_fan(tzone_idx, fan_idx, &put_fan_info);
	if (rs != RESULT_OK) {
		HTTPD_ERR("fan pre put fail, result is %d\n", rs);
		return NULL;
	}

	req = json_parse(param->json_data);
	put_prepare_str(req, put_fan_info.descr, DESCRIPTION_LEN, RMM_JSON_DESC);
	put_prepare_str(req, put_fan_info.asset_tag, REST_ASSET_TAG_LEN, RMM_JSON_ASSET_TAG);
	TachoMeterThreshold = json_object_get(req, RMM_JSON_THRESHOLD);
	if (TachoMeterThreshold != NULL) {
		array_size = json_array_size(TachoMeterThreshold);
		for (i = 0; i < array_size; i++) {
			elem = NULL;
			elem = json_array_get(TachoMeterThreshold, i);
			if (elem == NULL) {
				HTTPD_ERR("tacho meter thresh get error\n");
				return NULL;
			}
			put_prepare_int(elem, &(put_fan_info.threshold.lower_non_critical), RMM_JSON_LOWER_NON_CRITICAL);
			put_prepare_int(elem, &(put_fan_info.threshold.upper_non_critical), RMM_JSON_UPPER_NON_CRITICAL);
			put_prepare_int(elem, &(put_fan_info.threshold.lower_critical), RMM_JSON_LOWER_CRITICAL);
			put_prepare_int(elem, &(put_fan_info.threshold.upper_critical), RMM_JSON_UPPER_CRITICAL);
		}
	}
	
	rs = libwrap_put_fan(tzone_idx, fan_idx, put_fan_info);
	if (rs != RESULT_OK) {
		HTTPD_ERR("fan put fail, result is %d\n", rs);
		return NULL;
	}
	json_free(req);

	int8 buff[128] = {};
	snprintf(buff, sizeof(buff), "%d", ((tzone_idx - 1) * MAX_PWM_NUM + fan_idx));
	rf_log(INFO, MSGFanUpdate, buff);
	return fan_get(param);
}