static int8_t parse_set_error_led(char *bfr, int8_t bfr_length)
{
	char flash_string[16];
	int16_t flash_rate;
	LedFlashState_t flash_state;

	uint8_t param_count = sscanf_P(bfr, PSTR("SEL %s %d"), flash_string,
			&flash_rate);

	if (1 > param_count)
	{
		send_response_P(PSTR(":ERR PARAM\n"));
		return ERR_PARAM;
	}

	if (0 == strcmp(flash_string, "ON"))
	{
		flash_state = STATUS_LED_ON;
		if (1 == param_count)
			flash_rate = 0;
	}
	else if (0 == strcmp(flash_string, "OFF"))
	{
		flash_state = STATUS_LED_OFF;
		if (1 == param_count)
			flash_rate = 0;
	}
	else if (0 == strcmp(flash_string, "FLASH"))
	{
		if (2 != param_count)
		{
			send_response_P(PSTR(":ERR PARAM\n"));
			return ERR_PARAM;
		}

		flash_state = STATUS_LED_FLASH;
	}
	else
	{
		send_response_P(PSTR(":ERR PARAM\n"));
		return ERR_PARAM;
	}

	if (0 == set_error_led(flash_state, COMPUTE_TICKS(flash_rate)))
	{
		send_response_P(PSTR(":OK\n"));
		return 0;
	}
	else
	{
		send_response_P(PSTR(":ERR EXEC\n"));
		return ERR_EXEC;
	}
}
Beispiel #2
0
void set_error_ts(uint8_t errornum, uint8_t track, uint8_t sector) {
  uint8_t *msg = error_buffer;
  uint8_t i = 0;

  current_error = errornum;
  buffers[ERRORBUFFER_IDX].data     = error_buffer;
  buffers[ERRORBUFFER_IDX].lastused = 0;
  buffers[ERRORBUFFER_IDX].position = 0;
  memset(error_buffer,0,sizeof(error_buffer));

  msg = appendnumber(msg,errornum);
  *msg++ = ',';

  if (errornum == ERROR_STATUS) {
    switch(sector) {
    case 0:
    default:
      *msg++ = 'E';
      msg = appendnumber(msg, file_extension_mode);
      msg = appendbool(msg, 0, globalflags & EXTENSION_HIDING);

      msg = appendbool(msg, '*', globalflags & POSTMATCH);

      *msg++ = 'I';
      msg = appendnumber(msg, image_as_dir);

      *msg++ = ':';
      *msg++ = 'R';
      ustrcpy(msg, rom_filename);
      msg += ustrlen(rom_filename);

      break;
    case 1: // Drive Config
      *msg++ = 'D';
      while(i < 8) {
        if(map_drive(i) != 0x0f) {
          *msg++ = ':';
          msg = appendnumber(msg,i);
          *msg++ = '=';
          msg = appendnumber(msg,map_drive(i));
        }
        i++;
      }
      break;
    }

  } else if (errornum == ERROR_LONGVERSION || errornum == ERROR_DOSVERSION) {
    /* Start with the name and version number */
    while ((*msg++ = pgm_read_byte(versionstr+i++))) ;

    /* Append the long version if requested */
    if (errornum == ERROR_LONGVERSION) {
      i = 0;
      msg--;
      while ((*msg++ = toupper((int)pgm_read_byte(longverstr+i++)))) ;
    }

    msg--;
  } else {
    msg = appendmsg(msg,messages,errornum);
  }
  *msg++ = ',';

  msg = appendnumber(msg,track);
  *msg++ = ',';

  msg = appendnumber(msg,sector);
  *msg = 13;

  if (errornum >= 20 && errornum != ERROR_DOSVERSION) {
    // FIXME: Compare to E648
    // NOTE: 1571 doesn't write the BAM and closes some buffers if an error occured
    led_state |= LED_ERROR;
  } else {
    led_state &= (uint8_t)~LED_ERROR;
    set_error_led(0);
  }
  buffers[ERRORBUFFER_IDX].lastused = msg - error_buffer;

  /* Send message without the final 0x0d */
  display_errorchannel(msg - error_buffer, error_buffer);
}