diff --git a/fw/funconfig.h b/fw/funconfig.h index f6274d1..51c3556 100644 --- a/fw/funconfig.h +++ b/fw/funconfig.h @@ -39,6 +39,7 @@ #define MAX_TIP_TEMP 500 #define TURN_OFF_DELAY 2 #define CYCLES_PER_MEASURE 2 +#define BOARD_MAX_VOLTAGE 28000 #endif // _FUNCONFIG_H diff --git a/fw/main.c b/fw/main.c index 9d45d61..f5b4015 100644 --- a/fw/main.c +++ b/fw/main.c @@ -422,7 +422,7 @@ __attribute__((noreturn)) int main(void) u8g2_SetBitmapMode(u8g2, 1); u8g2_SetFontMode(u8g2, 1); u8g2_SetFont(u8g2, u8g2_font_5x8_tr); - u8g2_DrawStr(u8g2, 0, 18, "negotiating..."); + u8g2_DrawStr(u8g2, x_off+0, y_off+7, "Negotiating..."); u8g2_SendBuffer(u8g2); // Init USBPD @@ -437,7 +437,7 @@ __attribute__((noreturn)) int main(void) u8g2_SendBuffer(u8g2); Delay_Ms(5000); } else { - pd_get_profile(&pd_profile, 100); + pd_get_profile(&pd_profile, 60); // TODO: let the user decide the power profile pd_profile.set_temp = 200; diff --git a/fw/pd.c b/fw/pd.c index cc7c2b7..814b5ed 100644 --- a/fw/pd.c +++ b/fw/pd.c @@ -3,9 +3,14 @@ #define USBPD_IMPLEMENTATION #include "usbpd.h" +#include "funconfig.h" +#include "display.h" + #include "pd.h" +extern u8g2_t *u8g2; + static size_t cap_count = 0; static USBPD_SPR_CapabilitiesMessage_t *capabilities = NULL; static USBPD_Result_e result; @@ -35,7 +40,15 @@ bool pd_negotiate(USBPD_VCC_e vcc) if (now - start > Ticks_from_Ms(5000)) { break; } - Delay_Ms(100); + + u8g2_ClearBuffer(u8g2); + u8g2_SetBitmapMode(u8g2, 1); + u8g2_SetFontMode(u8g2, 1); + u8g2_SetFont(u8g2, u8g2_font_5x8_tr); + u8g2_DrawStr(u8g2, 0, 8+7, USBPD_StateToStr(USBPD_GetState())); + u8g2_SendBuffer(u8g2); + + Delay_Ms(1); } if (result != eUSBPD_OK) { return false; @@ -78,12 +91,28 @@ bool pd_get_profile(struct pd_profile_t *profile, uint16_t min_power) // } break; case eUSBPD_PDO_AUGMENTED: - // TODO: EPR + switch (pdo->Header.AugmentedType) { + case eUSBPD_APDO_SPR_PPS: + // TODO: SPR_PPS + break; + case eUSBPD_APDO_SPR_AVS: + // TODO: SPR AVS + break; + case eUSBPD_APDO_EPR_AVS: + /* TODO: EPR AVS + voltage = pdo->EPR_AVS.MaxVoltageIn100mV * 100; + current = pdo->EPR_AVS.PeakCurrent * 1000; + power = pdo->EPR_AVS.PDPIn1W; + */ + break; + default: + break; + } break; } // Selects the first PDO that meets the minimum power requirement - if (power >= min_power) { + if (power >= min_power && voltage <= BOARD_MAX_VOLTAGE) { if (USBPD_SelectPDO(i, 0) != eUSBPD_OK) { return false; }