diff --git a/esphome/cpp_generator.py b/esphome/cpp_generator.py index 691f45f91f..8460c1d462 100644 --- a/esphome/cpp_generator.py +++ b/esphome/cpp_generator.py @@ -310,6 +310,19 @@ class FloatLiteral(Literal): return f"{self.f}f" +class BinOpExpression(Expression): + __slots__ = ("op", "lhs", "rhs") + + def __init__(self, op: str, lhs: SafeExpType, rhs: SafeExpType): + # Remove every None on end + self.op = op + self.lhs = safe_exp(lhs) + self.rhs = safe_exp(rhs) + + def __str__(self): + return f"{self.lhs} {self.op} {self.rhs}" + + def safe_exp(obj: SafeExpType) -> Expression: """Try to convert obj to an expression by automatically converting native python types to expressions/literals. @@ -756,6 +769,10 @@ class MockObj(Expression): next_op = "->" return MockObj(f"{self.base}[{item}]", next_op) + def __or__(self, other: SafeExpType) -> "MockObj": + op = BinOpExpression("|", self, other) + return MockObj(op) + class MockObjEnum(MockObj): def __init__(self, *args, **kwargs): diff --git a/esphome/pins.py b/esphome/pins.py index ae762c1a1a..2b3adce86d 100644 --- a/esphome/pins.py +++ b/esphome/pins.py @@ -90,7 +90,7 @@ def gpio_flags_expr(mode): CONF_PULLDOWN: cg.gpio_Flags.FLAG_PULLDOWN, } active_flags = [v for k, v in FLAGS_MAPPING.items() if mode.get(k)] - if active_flags: + if not active_flags: return cg.gpio_Flags.FLAG_NONE return reduce(operator.or_, active_flags)