BB1: full E40 S16F11 body — MF, PRRECIPEMETHOD, RCPVARS, PRPROCESSPARAMS
Replaces the simplified <L,3 PRJOBID PPID MTRLOUTSPEC> demo body with
the full SEMI E40-0705 §10.2 shape:
<L,5 PRJOBID MF PRRECIPEMETHOD
<L,2 PPID <L,n <L,2 RCPPARNM RCPPARVAL>>>
<L,n MTRLOUTSPEC>
<L,n <L,2 PARAMNAME PARAMVAL>>>
ProcessJob now carries the extra fields (MaterialFlag, ProcessRecipeMethod,
RcpVar[], ProcessParam[]) so a tool's recipe engine can later consume
the recipe-variable overrides and per-job process parameters. Server
S16F11 dispatch populates them via the new ProcessJobStore::set_e40_extras
helper after a successful create.
MaterialFlag + ProcessRecipeMethod enums live in their own tiny header
(`e40_constants.hpp`) so process_jobs.hpp (the store) can use them
without dragging in messages_helpers.hpp (which would create a circular
include via data_model.hpp).
The simplified 3-arg HostHandler::send_create_process_job convenience
remains; it constructs a sensible-default PRJobCreateRequest internally.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
+21
-6
@@ -782,16 +782,31 @@ TEST_CASE("S14F11 / S14F12 DeleteControlJob round-trip") {
|
||||
CHECK(*ack_byte(ack) == 2);
|
||||
}
|
||||
|
||||
TEST_CASE("S16F11 / S16F12 PRJobCreate round-trip") {
|
||||
auto req = s16f11_pr_job_create("PJ-1", "RECIPE-A", {"WFR-1", "WFR-2"});
|
||||
CHECK(req.stream == 16);
|
||||
CHECK(req.function == 11);
|
||||
TEST_CASE("S16F11 / S16F12 PRJobCreate round-trip (full E40 body)") {
|
||||
PRJobCreateRequest req_struct{
|
||||
"PJ-1",
|
||||
MaterialFlag::Substrate,
|
||||
ProcessRecipeMethod::RecipeWithVariableTuning,
|
||||
RecipeSpec{"RECIPE-A",
|
||||
{RecipeVariable{"TEMP", s2::Item::u4(450)},
|
||||
RecipeVariable{"TIME", s2::Item::u4(60)}}},
|
||||
{"WFR-1", "WFR-2"},
|
||||
{ProcessParameter{"LotID", s2::Item::ascii("LOT-42")}}};
|
||||
auto m = s16f11_pr_job_create(req_struct);
|
||||
CHECK(m.stream == 16);
|
||||
CHECK(m.function == 11);
|
||||
|
||||
auto parsed = parse_s16f11(req);
|
||||
auto parsed = parse_s16f11(m);
|
||||
REQUIRE(parsed.has_value());
|
||||
CHECK(parsed->prjobid == "PJ-1");
|
||||
CHECK(parsed->ppid == "RECIPE-A");
|
||||
CHECK(parsed->mf == MaterialFlag::Substrate);
|
||||
CHECK(parsed->prrecipemethod == ProcessRecipeMethod::RecipeWithVariableTuning);
|
||||
CHECK(parsed->rcpspec.ppid == "RECIPE-A");
|
||||
REQUIRE(parsed->rcpspec.rcpvars.size() == 2);
|
||||
CHECK(parsed->rcpspec.rcpvars[0].name == "TEMP");
|
||||
CHECK(parsed->mtrloutspec == std::vector<std::string>{"WFR-1", "WFR-2"});
|
||||
REQUIRE(parsed->prprocessparams.size() == 1);
|
||||
CHECK(parsed->prprocessparams[0].name == "LotID");
|
||||
|
||||
CHECK(*ack_byte(s16f12_pr_job_create_ack(HostCmdAck::Accept)) == 0);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user