Skip to content

Commit a5ddcdd

Browse files
authored
Added support for Argo WREM-3 A/C remote protocol [part1] (#1920)
* Added support for Argo WREM-3 A/C remote protocol Signed-off-by: Mateusz Bronk <[email protected]> Co-authored-by: Mateusz Bronk <[email protected]>
1 parent 55ce002 commit a5ddcdd

File tree

17 files changed

+3411
-295
lines changed

17 files changed

+3411
-295
lines changed

src/IRac.cpp

Lines changed: 104 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,36 @@
6464
#endif // ESP8266
6565
#endif // STRCASECMP
6666

67+
#ifndef UNIT_TEST
68+
#define OUTPUT_DECODE_RESULTS_FOR_UT(ac)
69+
#else
70+
/* NOTE: THIS IS NOT A DOXYGEN COMMENT (would require ENABLE_PREPROCESSING-YES)
71+
/// If compiling for UT *and* a test receiver @c IRrecv is provided via the
72+
/// @c _utReceived param, this injects an "output" gadget @c _lastDecodeResults
73+
/// into the @c IRAc::sendAc method, so that the UT code may parse the "sent"
74+
/// value and drive further assertions
75+
///
76+
/// @note The @c decode_results "returned" is a shallow copy (empty rawbuf),
77+
/// mostly b/c the class does not have a custom/deep copy c-tor
78+
/// and defining it would be an overkill for this purpose
79+
/// @note For future maintainers: If @c IRAc class is ever refactored to use
80+
/// polymorphism (static or dynamic)... this macro should be removed
81+
/// and replaced with proper GMock injection.
82+
*/
83+
#define OUTPUT_DECODE_RESULTS_FOR_UT(ac) \
84+
{ \
85+
if (_utReceiver) { \
86+
_lastDecodeResults = nullptr; \
87+
(ac)._irsend.makeDecodeResult(); \
88+
if (_utReceiver->decode(&(ac)._irsend.capture)) { \
89+
_lastDecodeResults = std::unique_ptr<decode_results>( \
90+
new decode_results((ac)._irsend.capture)); \
91+
_lastDecodeResults->rawbuf = nullptr; \
92+
} \
93+
} \
94+
}
95+
#endif // UNIT_TEST
96+
6797
/// Class constructor
6898
/// @param[in] pin Gpio pin to use when transmitting IR messages.
6999
/// @param[in] inverted true, gpio output defaults to high. false, to low.
@@ -464,6 +494,41 @@ void IRac::argo(IRArgoAC *ac,
464494
ac->setNight(sleep >= 0); // Convert to a boolean.
465495
ac->send();
466496
}
497+
498+
/// Send an Argo A/C WREM-3 AC **control** message with the supplied settings.
499+
/// @param[in, out] ac A Ptr to an IRArgoAC_WREM3 object to use.
500+
/// @param[in] on The power setting.
501+
/// @param[in] mode The operation mode setting.
502+
/// @param[in] degrees The set temperature setting in degrees Celsius.
503+
/// @param[in] fan The speed setting for the fan.
504+
/// @param[in] swingv The vertical swing setting.
505+
/// @param[in] night Enable night mode (raises temp by +1*C after 1h).
506+
/// @param[in] econo Enable eco mode (limits power consumed).
507+
/// @param[in] turbo Run the device in turbo/powerful mode.
508+
/// @param[in] filter Enable filter mode
509+
/// @param[in] light Enable device display/LEDs
510+
void IRac::argoWrem3_ACCommand(IRArgoAC_WREM3 *ac, const bool on,
511+
const stdAc::opmode_t mode, const float degrees,
512+
const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv,
513+
const bool night, const bool econo, const bool turbo, const bool filter,
514+
const bool light) {
515+
ac->begin();
516+
ac->setMessageType(argoIrMessageType_t::AC_CONTROL);
517+
ac->setPower(on);
518+
ac->setMode(ac->convertMode(mode));
519+
ac->setTemp(degrees);
520+
ac->setFan(ac->convertFan(fan));
521+
ac->setFlap(ac->convertSwingV(swingv));
522+
ac->setNight(night);
523+
ac->setEco(econo);
524+
ac->setMax(turbo);
525+
ac->setFilter(filter);
526+
ac->setLight(light);
527+
// No "sensorTemp" mode/value support in common (yet)
528+
// No Clean setting available.
529+
// No Beep setting available - always beeps in this mode :)
530+
ac->send();
531+
}
467532
#endif // SEND_ARGO
468533

469534
#if SEND_BOSCH144
@@ -2850,9 +2915,18 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
28502915
#if SEND_ARGO
28512916
case ARGO:
28522917
{
2853-
IRArgoAC ac(_pin, _inverted, _modulation);
2854-
argo(&ac, send.power, send.mode, degC, send.fanspeed, send.swingv,
2855-
send.turbo, send.sleep);
2918+
if (send.model == argo_ac_remote_model_t::SAC_WREM3) {
2919+
IRArgoAC_WREM3 ac(_pin, _inverted, _modulation);
2920+
argoWrem3_ACCommand(&ac, send.power, send.mode, send.degrees,
2921+
send.fanspeed, send.swingv, send.quiet, send.econo, send.turbo,
2922+
send.filter, send.light);
2923+
OUTPUT_DECODE_RESULTS_FOR_UT(ac);
2924+
} else {
2925+
IRArgoAC ac(_pin, _inverted, _modulation);
2926+
argo(&ac, send.power, send.mode, degC, send.fanspeed, send.swingv,
2927+
send.turbo, send.sleep);
2928+
OUTPUT_DECODE_RESULTS_FOR_UT(ac);
2929+
}
28562930
break;
28572931
}
28582932
#endif // SEND_ARGO
@@ -3666,6 +3740,11 @@ int16_t IRac::strToModel(const char *str, const int16_t def) {
36663740
return whirlpool_ac_remote_model_t::DG11J13A;
36673741
} else if (!STRCASECMP(str, kDg11j191Str)) {
36683742
return whirlpool_ac_remote_model_t::DG11J191;
3743+
// Argo A/C models
3744+
} else if (!STRCASECMP(str, kArgoWrem2Str)) {
3745+
return argo_ac_remote_model_t::SAC_WREM2;
3746+
} else if (!STRCASECMP(str, kArgoWrem3Str)) {
3747+
return argo_ac_remote_model_t::SAC_WREM3;
36693748
} else {
36703749
int16_t number = atoi(str);
36713750
if (number > 0)
@@ -3796,6 +3875,12 @@ namespace IRAcUtils {
37963875
#endif // DECODE_AMCOR
37973876
#if DECODE_ARGO
37983877
case decode_type_t::ARGO: {
3878+
if (IRArgoAC_WREM3::isValidWrem3Message(result->state, result->bits,
3879+
true)) {
3880+
IRArgoAC_WREM3 ac(kGpioUnused);
3881+
ac.setRaw(result->state, result->bits / 8);
3882+
return ac.toString();
3883+
}
37993884
IRArgoAC ac(kGpioUnused);
38003885
ac.setRaw(result->state, result->bits / 8);
38013886
return ac.toString();
@@ -4258,15 +4343,23 @@ namespace IRAcUtils {
42584343
#endif // DECODE_AMCOR
42594344
#if DECODE_ARGO
42604345
case decode_type_t::ARGO: {
4261-
IRArgoAC ac(kGpioUnused);
42624346
const uint16_t length = decode->bits / 8;
4263-
switch (length) {
4264-
case kArgoStateLength:
4265-
ac.setRaw(decode->state, length);
4266-
*result = ac.toCommon();
4267-
break;
4268-
default:
4269-
return false;
4347+
if (IRArgoAC_WREM3::isValidWrem3Message(decode->state,
4348+
decode->bits, true)) {
4349+
IRArgoAC_WREM3 ac(kGpioUnused);
4350+
ac.setRaw(decode->state, length);
4351+
*result = ac.toCommon();
4352+
} else {
4353+
IRArgoAC ac(kGpioUnused);
4354+
switch (length) {
4355+
case kArgoStateLength:
4356+
case kArgoShortStateLength:
4357+
ac.setRaw(decode->state, length);
4358+
*result = ac.toCommon();
4359+
break;
4360+
default:
4361+
return false;
4362+
}
42704363
}
42714364
break;
42724365
}

src/IRac.h

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
#ifndef UNIT_TEST
77
#include <Arduino.h>
8+
#else
9+
#include <memory>
810
#endif
911
#include "IRremoteESP8266.h"
1012
#include "ir_Airton.h"
@@ -103,10 +105,17 @@ class IRac {
103105
stdAc::state_t getStatePrev(void);
104106
bool hasStateChanged(void);
105107
stdAc::state_t next; ///< The state we want the device to be in after we send
106-
#ifndef UNIT_TEST
108+
#ifdef UNIT_TEST
109+
/// @cond IGNORE
110+
/// UT-specific
111+
/// See @c OUTPUT_DECODE_RESULTS_FOR_UT macro description in IRac.cpp
112+
std::shared_ptr<IRrecv> _utReceiver = nullptr;
113+
std::unique_ptr<decode_results> _lastDecodeResults = nullptr;
114+
/// @endcond
115+
#else
107116

108117
private:
109-
#endif
118+
#endif // UNIT_TEST
110119
uint16_t _pin; ///< The GPIO to use to transmit messages from.
111120
bool _inverted; ///< IR LED is lit when GPIO is LOW (true) or HIGH (false)?
112121
bool _modulation; ///< Is frequency modulation to be used?
@@ -134,6 +143,11 @@ class IRac {
134143
const bool on, const stdAc::opmode_t mode, const float degrees,
135144
const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv,
136145
const bool turbo, const int16_t sleep = -1);
146+
void argoWrem3_ACCommand(IRArgoAC_WREM3 *ac,
147+
const bool on, const stdAc::opmode_t mode, const float degrees,
148+
const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv,
149+
const bool night, const bool econo, const bool turbo, const bool filter,
150+
const bool light);
137151
#endif // SEND_ARGO
138152
#if SEND_BOSCH144
139153
void bosch144(IRBosch144AC *ac,

src/IRrecv.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -943,8 +943,20 @@ bool IRrecv::decode(decode_results *results, irparams_t *save,
943943
return true;
944944
#endif
945945
#if DECODE_ARGO
946-
DPRINTLN("Attempting Argo decode");
947-
if (decodeArgo(results, offset) ||
946+
DPRINTLN("Attempting Argo WREM3 decode (AC Control)");
947+
if (decodeArgoWREM3(results, offset, kArgo3AcControlStateLength * 8, true))
948+
return true;
949+
DPRINTLN("Attempting Argo WREM3 decode (iFeel report)");
950+
if (decodeArgoWREM3(results, offset, kArgo3iFeelReportStateLength * 8, true))
951+
return true;
952+
DPRINTLN("Attempting Argo WREM3 decode (Config)");
953+
if (decodeArgoWREM3(results, offset, kArgo3ConfigStateLength * 8, true))
954+
return true;
955+
DPRINTLN("Attempting Argo WREM3 decode (Timer)");
956+
if (decodeArgoWREM3(results, offset, kArgo3TimerStateLength * 8, true))
957+
return true;
958+
DPRINTLN("Attempting Argo WREM2 decode");
959+
if (decodeArgo(results, offset, kArgoBits) ||
948960
decodeArgo(results, offset, kArgoShortBits, false)) return true;
949961
#endif // DECODE_ARGO
950962
#if DECODE_SHARP_AC

src/IRrecv.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,9 @@ class IRrecv {
294294
#if DECODE_ARGO
295295
bool decodeArgo(decode_results *results, uint16_t offset = kStartOffset,
296296
const uint16_t nbits = kArgoBits, const bool strict = true);
297+
bool decodeArgoWREM3(decode_results *results, uint16_t offset = kStartOffset,
298+
const uint16_t nbits = kArgo3AcControlStateLength * 8,
299+
const bool strict = true);
297300
#endif // DECODE_ARGO
298301
#if DECODE_ARRIS
299302
bool decodeArris(decode_results *results, uint16_t offset = kStartOffset,

src/IRremoteESP8266.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1134,6 +1134,10 @@ const uint16_t kArgoStateLength = 12;
11341134
const uint16_t kArgoShortStateLength = 4;
11351135
const uint16_t kArgoBits = kArgoStateLength * 8;
11361136
const uint16_t kArgoShortBits = kArgoShortStateLength * 8;
1137+
const uint16_t kArgo3AcControlStateLength = 6; // Bytes
1138+
const uint16_t kArgo3iFeelReportStateLength = 2; // Bytes
1139+
const uint16_t kArgo3TimerStateLength = 9; // Bytes
1140+
const uint16_t kArgo3ConfigStateLength = 4; // Bytes
11371141
const uint16_t kArgoDefaultRepeat = kNoRepeat;
11381142
const uint16_t kArrisBits = 32;
11391143
const uint16_t kBosch144StateLength = 18;

src/IRsend.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,11 @@ enum lg_ac_remote_model_t {
202202
LG6711A20083V, // (5) Same as GE6711AR2853M, but only SwingV toggle.
203203
};
204204

205+
/// Argo A/C model numbers
206+
enum argo_ac_remote_model_t {
207+
SAC_WREM2 = 1, // (1) ARGO WREM2 remote (default)
208+
SAC_WREM3 // (2) ARGO WREM3 remote (touch buttons), bit-len vary by cmd
209+
};
205210

206211
// Classes
207212

@@ -528,9 +533,13 @@ class IRsend {
528533
#endif
529534
#if SEND_ARGO
530535
void sendArgo(const unsigned char data[],
536+
const uint16_t nbytes = kArgoStateLength,
537+
const uint16_t repeat = kArgoDefaultRepeat,
538+
bool sendFooter = false);
539+
void sendArgoWREM3(const unsigned char data[],
531540
const uint16_t nbytes = kArgoStateLength,
532541
const uint16_t repeat = kArgoDefaultRepeat);
533-
#endif
542+
#endif // SEND_ARGO
534543
#if SEND_TROTEC
535544
void sendTrotec(const unsigned char data[],
536545
const uint16_t nbytes = kTrotecStateLength,

src/IRtext.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,12 @@ IRTEXT_CONST_STRING(kOffTimerStr, D_STR_OFFTIMER); ///< "Off Timer"
6868
IRTEXT_CONST_STRING(kTimerModeStr, D_STR_TIMERMODE); ///< "Timer Mode"
6969
IRTEXT_CONST_STRING(kClockStr, D_STR_CLOCK); ///< "Clock"
7070
IRTEXT_CONST_STRING(kCommandStr, D_STR_COMMAND); ///< "Command"
71+
IRTEXT_CONST_STRING(kConfigCommandStr, D_STR_CONFIG); ///< "Config"
7172
IRTEXT_CONST_STRING(kXFanStr, D_STR_XFAN); ///< "XFan"
7273
IRTEXT_CONST_STRING(kHealthStr, D_STR_HEALTH); ///< "Health"
7374
IRTEXT_CONST_STRING(kModelStr, D_STR_MODEL); ///< "Model"
7475
IRTEXT_CONST_STRING(kTempStr, D_STR_TEMP); ///< "Temp"
76+
IRTEXT_CONST_STRING(kIFeelReportStr, D_STR_IFEELREPORT); ///< "IFeel Report"
7577
IRTEXT_CONST_STRING(kIFeelStr, D_STR_IFEEL); ///< "IFeel"
7678
IRTEXT_CONST_STRING(kHumidStr, D_STR_HUMID); ///< "Humid"
7779
IRTEXT_CONST_STRING(kSaveStr, D_STR_SAVE); ///< "Save"
@@ -160,6 +162,7 @@ IRTEXT_CONST_STRING(kMaxStr, D_STR_MAX); ///< "Max"
160162
IRTEXT_CONST_STRING(kMaximumStr, D_STR_MAXIMUM); ///< "Maximum"
161163
IRTEXT_CONST_STRING(kMinStr, D_STR_MIN); ///< "Min"
162164
IRTEXT_CONST_STRING(kMinimumStr, D_STR_MINIMUM); ///< "Minimum"
165+
IRTEXT_CONST_STRING(kMedHighStr, D_STR_MED_HIGH); ///< "Med-high"
163166
IRTEXT_CONST_STRING(kMedStr, D_STR_MED); ///< "Med"
164167
IRTEXT_CONST_STRING(kMediumStr, D_STR_MEDIUM); ///< "Medium"
165168

@@ -205,6 +208,12 @@ IRTEXT_CONST_STRING(kSwingVModeStr, D_STR_SWINGVMODE); ///< "Swing(V) Mode"
205208
IRTEXT_CONST_STRING(kSwingVToggleStr, D_STR_SWINGVTOGGLE); ///<
206209
///< "Swing(V) Toggle"
207210
IRTEXT_CONST_STRING(kTurboToggleStr, D_STR_TURBOTOGGLE); ///< "Turbo Toggle"
211+
IRTEXT_CONST_STRING(kScheduleStr, D_STR_SCHEDULE); ///< "Schedule"
212+
IRTEXT_CONST_STRING(kChStr, D_STR_CH); ///< "CH#"
213+
IRTEXT_CONST_STRING(kTimerActiveDaysStr, D_STR_TIMER_ACTIVE_DAYS);
214+
///< "TimerActiveDays"
215+
IRTEXT_CONST_STRING(kKeyStr, D_STR_KEY); ///< "Key"
216+
IRTEXT_CONST_STRING(kValueStr, D_STR_VALUE); ///< "Value"
208217

209218
// Separators & Punctuation
210219
const char kTimeSep = D_CHR_TIME_SEP; ///< ':'
@@ -281,6 +290,8 @@ IRTEXT_CONST_STRING(k122lzfStr, D_STR_122LZF); ///< "122LZF"
281290
IRTEXT_CONST_STRING(kDg11j13aStr, D_STR_DG11J13A); ///< "DG11J13A"
282291
IRTEXT_CONST_STRING(kDg11j104Str, D_STR_DG11J104); ///< "DG11J104"
283292
IRTEXT_CONST_STRING(kDg11j191Str, D_STR_DG11J191); ///< "DG11J191"
293+
IRTEXT_CONST_STRING(kArgoWrem2Str, D_STR_ARGO_WREM2); ///< "WREM3"
294+
IRTEXT_CONST_STRING(kArgoWrem3Str, D_STR_ARGO_WREM3); ///< "WREM3"
284295

285296
#define D_STR_UNSUPPORTED "?" // Unsupported protocols will be showing as
286297
// a question mark, check for length > 1

src/IRtext.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ extern IRTEXT_CONST_PTR(kAkb73757604Str);
3939
extern IRTEXT_CONST_PTR(kAkb74955603Str);
4040
extern IRTEXT_CONST_PTR(kAkb75215403Str);
4141
extern IRTEXT_CONST_PTR(kArdb1Str);
42+
extern IRTEXT_CONST_PTR(kArgoWrem2Str);
43+
extern IRTEXT_CONST_PTR(kArgoWrem3Str);
4244
extern IRTEXT_CONST_PTR(kArjw2Str);
4345
extern IRTEXT_CONST_PTR(kArrah2eStr);
4446
extern IRTEXT_CONST_PTR(kArreb1eStr);
@@ -57,6 +59,7 @@ extern IRTEXT_CONST_PTR(kCelsiusFahrenheitStr);
5759
extern IRTEXT_CONST_PTR(kCelsiusStr);
5860
extern IRTEXT_CONST_PTR(kCentreStr);
5961
extern IRTEXT_CONST_PTR(kChangeStr);
62+
extern IRTEXT_CONST_PTR(kChStr);
6063
extern IRTEXT_CONST_PTR(kCirculateStr);
6164
extern IRTEXT_CONST_PTR(kCkpStr);
6265
extern IRTEXT_CONST_PTR(kCleanStr);
@@ -66,6 +69,7 @@ extern IRTEXT_CONST_PTR(kColonSpaceStr);
6669
extern IRTEXT_CONST_PTR(kComfortStr);
6770
extern IRTEXT_CONST_PTR(kCommaSpaceStr);
6871
extern IRTEXT_CONST_PTR(kCommandStr);
72+
extern IRTEXT_CONST_PTR(kConfigCommandStr);
6973
extern IRTEXT_CONST_PTR(kCoolStr);
7074
extern IRTEXT_CONST_PTR(kCoolingStr);
7175
extern IRTEXT_CONST_PTR(kDashStr);
@@ -109,13 +113,15 @@ extern IRTEXT_CONST_PTR(kHoldStr);
109113
extern IRTEXT_CONST_PTR(kHourStr);
110114
extern IRTEXT_CONST_PTR(kHoursStr);
111115
extern IRTEXT_CONST_PTR(kHumidStr);
116+
extern IRTEXT_CONST_PTR(kIFeelReportStr);
112117
extern IRTEXT_CONST_PTR(kIFeelStr);
113118
extern IRTEXT_CONST_PTR(kISeeStr);
114119
extern IRTEXT_CONST_PTR(kIdStr);
115120
extern IRTEXT_CONST_PTR(kIndirectStr);
116121
extern IRTEXT_CONST_PTR(kInsideStr);
117122
extern IRTEXT_CONST_PTR(kIonStr);
118123
extern IRTEXT_CONST_PTR(kJkeStr);
124+
extern IRTEXT_CONST_PTR(kKeyStr);
119125
extern IRTEXT_CONST_PTR(kKkg29ac1Str);
120126
extern IRTEXT_CONST_PTR(kKkg9ac1Str);
121127
extern IRTEXT_CONST_PTR(kLastStr);
@@ -139,6 +145,7 @@ extern IRTEXT_CONST_PTR(kMaxRightNoSpaceStr);
139145
extern IRTEXT_CONST_PTR(kMaxRightStr);
140146
extern IRTEXT_CONST_PTR(kMaxStr);
141147
extern IRTEXT_CONST_PTR(kMaximumStr);
148+
extern IRTEXT_CONST_PTR(kMedHighStr);
142149
extern IRTEXT_CONST_PTR(kMedStr);
143150
extern IRTEXT_CONST_PTR(kMediumStr);
144151
extern IRTEXT_CONST_PTR(kMidStr);
@@ -188,8 +195,10 @@ extern IRTEXT_CONST_PTR(kRlt0541htaaStr);
188195
extern IRTEXT_CONST_PTR(kRlt0541htabStr);
189196
extern IRTEXT_CONST_PTR(kRoomStr);
190197
extern IRTEXT_CONST_PTR(kSaveStr);
198+
extern IRTEXT_CONST_PTR(kScheduleStr);
191199
extern IRTEXT_CONST_PTR(kSecondStr);
192200
extern IRTEXT_CONST_PTR(kSecondsStr);
201+
extern IRTEXT_CONST_PTR(kSensorReportStr);
193202
extern IRTEXT_CONST_PTR(kSensorStr);
194203
extern IRTEXT_CONST_PTR(kSensorTempStr);
195204
extern IRTEXT_CONST_PTR(kSetStr);
@@ -213,6 +222,7 @@ extern IRTEXT_CONST_PTR(kTempDownStr);
213222
extern IRTEXT_CONST_PTR(kTempStr);
214223
extern IRTEXT_CONST_PTR(kTempUpStr);
215224
extern IRTEXT_CONST_PTR(kThreeLetterDayOfWeekStr);
225+
extern IRTEXT_CONST_PTR(kTimerActiveDaysStr);
216226
extern IRTEXT_CONST_PTR(kTimerModeStr);
217227
extern IRTEXT_CONST_PTR(kTimerStr);
218228
extern IRTEXT_CONST_PTR(kToggleStr);
@@ -224,6 +234,7 @@ extern IRTEXT_CONST_PTR(kTypeStr);
224234
extern IRTEXT_CONST_PTR(kUnknownStr);
225235
extern IRTEXT_CONST_PTR(kUpStr);
226236
extern IRTEXT_CONST_PTR(kUpperStr);
237+
extern IRTEXT_CONST_PTR(kValueStr);
227238
extern IRTEXT_CONST_PTR(kV9014557AStr);
228239
extern IRTEXT_CONST_PTR(kV9014557BStr);
229240
extern IRTEXT_CONST_PTR(kVaneStr);

0 commit comments

Comments
 (0)