Bayley Wang
/
foc-ed_in_the_bot_compact
robot
CommandProcessor/cmd_set_get.cpp
- Committer:
- bwang
- Date:
- 2018-11-13
- Revision:
- 252:38644631ed97
- Parent:
- 247:da647f7185b7
File content as of revision 252:38644631ed97:
#include "mbed.h" #include "CommandProcessor.h" #include "PreferenceWriter.h" #include "globals.h" #include "errors.h" #include "prefs.h" #include "tables.h" #include "defaults.h" #include "derived.h" void cmd_ls(Serial *pc) { if (control.enabled) { pc->printf("%s\n", "Turn motor off first"); return; } DPRINT(PREFS_VALID); DPRINT(TORQUE_MODE); FPRINT(MAX_TQPCT_PLUS); FPRINT(MAX_TQPCT_MINUS); FPRINT(TORQUE_MAX); FPRINT(W_MAX); FPRINT(BUS_VOLTAGE); FPRINT(F_SW); FPRINT(K_LOOP_D); FPRINT(KI_BASE_D); FPRINT(K_LOOP_Q); FPRINT(KI_BASE_Q); FPRINT2(KP_D); FPRINT2(KI_D); FPRINT2(KP_Q); FPRINT2(KI_Q); FPRINT(F_SLOW_LOOP); FPRINT(INTEGRAL_MAX); FPRINT(OVERMODULATION_FACTOR); FPRINT(V_PHASE_SWIZZLE); DPRINT(W_FILTER_WINDOW); FPRINT(DQ_FILTER_STRENGTH); DPRINT(THROTTLE_FILTER_WINDOW); FPRINT(POLE_PAIRS); FPRINT(POS_OFFSET); FPRINT(RESOLVER_LOBES); DPRINT(CPR); FPRINT(Ld); FPRINT(Lq); FPRINT(FLUX_LINKAGE); FPRINT(Rs); FPRINT(KT); FPRINT(W_SAFE); FPRINT(W_CRAZY); DPRINT(TH_LIMIT_LOW); DPRINT(TH_LIMIT_HIGH); DPRINT2(ROWS); DPRINT2(COLUMNS); FPRINT(W_STEP); DPRINT(ENABLE_LOGGING); DPRINT(LOG_PAGE_SIZE); DPRINT(LOG_HEADER_SIZE); DPRINT(LOG_PACKET_SIZE); DPRINT(LOG_BAUD_RATE); FPRINT(K_LOOP_W); FPRINT(KI_BASE_W); FPRINT(W_SETPOINT_MAX); FPRINT(W_LOOP_MAX_TQ); } #define ls_specialf(a) if (strcmp(buf, #a) == 0) {pc->printf("%s: %f\n", #a, a); return;} #define ls_speciald(a) if (strcmp(buf, #a) == 0) {pc->printf("%s: %d\n", #a, a); return;} void cmd_ls2(Serial *pc, char *buf) { if (strcmp(buf, "mode") == 0) { pc->printf("%s\n", mode_to_str(BREMS_mode)); return; } if (strcmp(buf, "src") == 0) { pc->printf("%s\n", src_to_str(BREMS_src)); return; } if (strcmp(buf, "op") == 0) { pc->printf("%s\n", op_to_str(BREMS_op)); return; } ls_specialf(KP_D); ls_specialf(KP_Q); ls_specialf(KP_W); ls_specialf(KI_D); ls_specialf(KI_Q); ls_specialf(KI_W); ls_speciald(ROWS); ls_speciald(COLUMNS); float *fptr = checkf(buf); if (fptr != NULL) pc->printf("%s: %f\n", buf, *fptr); int *nptr = NULL; if (fptr == NULL) nptr = checkn(buf); if (nptr != NULL) pc->printf("%s: %d\n", buf, *nptr); if (nptr == NULL && fptr == NULL) pc->printf("%s\n", "No Such Parameter"); } void cmd_defaults(Serial *pc) { if (BREMS_mode == MODE_RUN || BREMS_mode == MODE_ZERO || BREMS_mode == MODE_CHR) { pc->printf("%s\n", "Can only do that in CFG mode"); return; } DEFAULT(TORQUE_MODE); DEFAULT(MAX_TQPCT_PLUS); DEFAULT(MAX_TQPCT_MINUS); DEFAULT(TORQUE_MAX); DEFAULT(W_MAX); DEFAULT(BUS_VOLTAGE); DEFAULT(F_SW); DEFAULT(K_LOOP_D); DEFAULT(KI_BASE_D); DEFAULT(K_LOOP_Q); DEFAULT(KI_BASE_Q); DEFAULT(F_SLOW_LOOP); DEFAULT(INTEGRAL_MAX); DEFAULT(OVERMODULATION_FACTOR); DEFAULT(V_PHASE_SWIZZLE); DEFAULT(W_FILTER_WINDOW); DEFAULT(DQ_FILTER_STRENGTH); DEFAULT(THROTTLE_FILTER_WINDOW); DEFAULT(POLE_PAIRS); DEFAULT(POS_OFFSET); DEFAULT(RESOLVER_LOBES); DEFAULT(CPR); DEFAULT(Ld); DEFAULT(Lq); DEFAULT(FLUX_LINKAGE); DEFAULT(Rs); DEFAULT(KT); DEFAULT(W_SAFE); DEFAULT(W_CRAZY); DEFAULT(TH_LIMIT_LOW); DEFAULT(TH_LIMIT_HIGH); DEFAULT(W_STEP); DEFAULT(ENABLE_LOGGING); DEFAULT(LOG_PAGE_SIZE); DEFAULT(LOG_HEADER_SIZE); DEFAULT(LOG_PACKET_SIZE); DEFAULT(LOG_BAUD_RATE); DEFAULT(K_LOOP_W); DEFAULT(KI_BASE_W); DEFAULT(W_SETPOINT_MAX); DEFAULT(W_LOOP_MAX_TQ); pc->printf("Defaults Loaded\n"); } void cmd_reload(Serial *pc, PreferenceWriter *pref) { if (BREMS_mode == MODE_RUN || BREMS_mode == MODE_ZERO || BREMS_mode == MODE_CHR) { pc->printf("%s\n", "Can only do that in CFG mode"); return; } pref->load(); if (_PREFS_VALID) pc->printf("Flash Values Loaded\n"); } void cmd_set(Serial *pc, char *buf, char *val) { float *fptr = checkf(buf); if (fptr != NULL) *fptr = (float) (atof(val)); int *nptr = NULL; if (fptr == NULL) nptr = checkn(buf); if (nptr != NULL) *nptr = (int) (atoi(val)); if (nptr != NULL || fptr != NULL) cmd_ls2(pc, buf); if (nptr == NULL && fptr == NULL) pc->printf("%s\n", "No Such Parameter"); } void cmd_flush(Serial *pc, PreferenceWriter *pref) { if (control.user_cmd != 0.0f || control.torque_percent != 0.0f) { pc->printf("%s\n", "Turn off motor first"); return; } io.logger->disable(); if (!pref->ready()) pref->open(); _PREFS_VALID = 1; pref->flush(); io.logger->enable(); } void cmd_query_err(Serial *pc) { if ((moded_errors & (1 << ERR_THROTTLE_DISABLED)) != 0) pc->printf("%s\n", "Throttle disabled"); if ((moded_errors & (1 << ERR_POS_INVALID)) != 0) pc->printf("%s\n", "No encoder index"); if ((moded_errors & (1 << ERR_NOT_DRIVING)) != 0) pc->printf("%s\n", "Not driving"); if (moded_errors == 0) pc->printf("%s\n", "No errors"); } void cmd_query(Serial *pc, char *buf) { if (strcmp(buf, "pos") == 0) pc->printf("%f\n", foc.p); else if (strcmp(buf, "w") == 0) pc->printf("%f\n", read.w); else if (strcmp(buf, "cmd") == 0) pc->printf("%f\n", control.user_cmd); else if (strcmp(buf, "d") == 0) pc->printf("%f\n", foc.d); else if (strcmp(buf, "q") == 0) pc->printf("%f\n", foc.q); else if (strcmp(buf, "d_ref") == 0) pc->printf("%f\n", control.d_ref); else if (strcmp(buf, "q_ref") == 0) pc->printf("%f\n", control.q_ref); else if (strcmp(buf, "vd") == 0) pc->printf("%f\n", foc.vd); else if (strcmp(buf, "vq") == 0) pc->printf("%f\n", foc.vq); else if (strcmp(buf, "tq") == 0) pc->printf("%f\n", control.torque_percent); else if (strcmp(buf, "ia") == 0) pc->printf("%f\n", foc.ia); else if (strcmp(buf, "ib") == 0) pc->printf("%f\n", foc.ib); else if (strcmp(buf, "ic") == 0) pc->printf("%f\n", -foc.ia - foc.ib); else if (strcmp(buf, "errors") == 0) cmd_query_err(pc); else pc->printf("%s\n", "No such parameter"); } void cmdf_w(Serial *pc) { union {int16_t s; uint16_t u;}; s = (int)(read.w); uint8_t h, l; h = (u & 0xff00) >> 8; l = (u & 0x00ff); pc->putc(h); pc->putc(l); } void cmdf_data(Serial *pc) { char packet[8]; packet[0] = (char)(read.w / 8.0f); packet[1] = (char)(control.d_ref / 2.0f + 128.0f); packet[2] = (char)(control.d_filtered / 2.0f + 128.0f); packet[3] = (char)(control.q_ref / 2.0f + 128.0f); packet[4] = (char)(control.q_filtered / 2.0f + 128.0f); packet[5] = (char)(255.0f * control.torque_percent); packet[6] = (char)(255.0f / (1.0f + _OVERMODULATION_FACTOR) * foc.vd / 2.0f + 128.0f); packet[7] = (char)(255.0f / (1.0f + _OVERMODULATION_FACTOR) * foc.vq / 2.0f + 128.0f); pc->putc(packet[0]); pc->putc(packet[1]); pc->putc(packet[2]); pc->putc(packet[3]); pc->putc(packet[4]); pc->putc(packet[5]); pc->putc(packet[6]); pc->putc(packet[7]); }