www/js/rec_edit.js

branch
stable
changeset 350
c314277905e6
parent 348
5fc0f4b42224
child 352
9d2a4703bdac
equal deleted inserted replaced
349:0e44535f7435 350:c314277905e6
44 44
45 $(document).ready(function () { 45 $(document).ready(function () {
46 46
47 var to_100 = false; // Fermentables adjust to 100% 47 var to_100 = false; // Fermentables adjust to 100%
48 var preboil_sg = 0; 48 var preboil_sg = 0;
49 // var sugarsm = 0; // Sugars after mash
50 // var sugarsf = 0; // Sugars after boil
51 var psugar = 0; // Percentage real sugars 49 var psugar = 0; // Percentage real sugars
52 var pcara = 0; // Percentage cara/crystal malts 50 var pcara = 0; // Percentage cara/crystal malts
53 var svg = 77; // Default attenuation 51 var svg = 77; // Default attenuation
54 var mashkg = 0; // Malt in mash weight 52 var mashkg = 0; // Malt in mash weight
55 var hop_flavour = 0; 53 var hop_flavour = 0;
438 $("#w2_amount").val(dataRecord.w2_amount); 436 $("#w2_amount").val(dataRecord.w2_amount);
439 } 437 }
440 $('#wg_amount').val(mash_infuse); 438 $('#wg_amount').val(mash_infuse);
441 }; 439 };
442 440
443 /* function GetBUGUMin() {
444
445 var Result = 0;
446
447 if (((dataRecord.st_og_max + dataRecord.st_og_min) > 0) && ((dataRecord.st_ibu_max + dataRecord.st_ibu_min) > 0)) {
448 var G = (dataRecord.st_og_max - dataRecord.st_og_min) / ((dataRecord.st_og_max + dataRecord.st_og_min) / 2);
449 var B = (dataRecord.st_ibu_max - dataRecord.st_ibu_min) / ((dataRecord.st_ibu_max + dataRecord.st_ibu_min) / 2);
450 if (G > B)
451 Result = ((dataRecord.st_ibu_max + dataRecord.st_ibu_min) / 2) / (1000 * (dataRecord.st_og_max - 1));
452 else
453 Result = dataRecord.st_ibu_min / (1000 * (((dataRecord.st_og_max + dataRecord.st_og_min) / 2) - 1));
454 }
455 console.log("GetBUGUMin(): "+Result);
456 return Result;
457 }
458
459 function GetBUGUMax() {
460
461 var Result = 0;
462
463 if (((dataRecord.st_og_max + dataRecord.st_og_min) > 0) && ((dataRecord.st_ibu_max + dataRecord.st_ibu_min) > 0) && (dataRecord.st_og_min > 0)) {
464 var G = (dataRecord.st_og_max - dataRecord.st_og_min) / ((dataRecord.st_og_max + dataRecord.st_og_min) / 2);
465 var B = (dataRecord.st_ibu_max - dataRecord.st_ibu_min) / ((dataRecord.st_ibu_max + dataRecord.st_ibu_min) / 2);
466 if (G > B)
467 Result = ((dataRecord.st_ibu_min + dataRecord.st_ibu_max) / 2) / (1000 * (dataRecord.st_og_min - 1));
468 else
469 Result = dataRecord.st_ibu_max / (1000 * (((dataRecord.st_og_max + dataRecord.st_og_min) / 2) - 1));
470
471 }
472 console.log("GetBUGUMax(): "+Result);
473 return Result;
474 } */
475
476 function GetBUGU() { 441 function GetBUGU() {
477 var gu = (dataRecord.est_og - 1) * 1000; 442 var gu = (dataRecord.est_og - 1) * 1000;
478 if (gu > 0) 443 if (gu > 0)
479 return dataRecord.est_ibu / gu; 444 return dataRecord.est_ibu / gu;
480 else 445 else
485 var BUGU = GetBUGU(); 450 var BUGU = GetBUGU();
486 return (-1.2 * BUGU + 1.4); 451 return (-1.2 * BUGU + 1.4);
487 } 452 }
488 453
489 function setWaterAgent(name, amount) { 454 function setWaterAgent(name, amount) {
490 console.log("setWaterAgent(" + name + ", " + amount + ")"); 455 //console.log("setWaterAgent(" + name + ", " + amount + ")");
491 var rows = $('#miscGrid').jqxGrid('getrows'); 456 var rows = $('#miscGrid').jqxGrid('getrows');
492 if (amount == 0) { 457 if (amount == 0) {
493 for (var i = 0; i < rows.length; i++) { 458 for (var i = 0; i < rows.length; i++) {
494 var row = rows[i]; 459 var row = rows[i];
495 if (row.m_name == name) { 460 if (row.m_name == name) {
534 } 499 }
535 } 500 }
536 } 501 }
537 502
538 function setRangeIndicator(ion, rangeCode) { 503 function setRangeIndicator(ion, rangeCode) {
539 if (rangeCode == "laag") 504 if ((rangeCode == "laag") || (rangeCode == "hoog"))
540 $("#wr_"+ion).html("<img src='images/dialog-error.png'><span style='vertical-align: top; font-size: 10px; font-style: italic;'>"+rangeCode + "</span>"); 505 $("#wr_"+ion).html("<img src='images/dialog-error.png'><span style='vertical-align: top; font-size: 10px; font-style: italic;'>"+rangeCode + "</span>");
541 else if (rangeCode == "hoog")
542 $("#wr_"+ion).html("<img src='images/dialog-error.png'><span style='vertical-align: top; font-size: 10px; font-style: italic;'>"+rangeCode+"</span>");
543 else 506 else
544 $("#wr_"+ion).html("<img src='images/dialog-ok-apply.png'>"); 507 $("#wr_"+ion).html("<img src='images/dialog-ok-apply.png'>");
545 } 508 }
546 509
547 function mix(v1, v2, c1, c2) { 510 function mix(v1, v2, c1, c2) {
620 case 4: C1 = -149; // Sour malt 583 case 4: C1 = -149; // Sour malt
621 break; 584 break;
622 } 585 }
623 } 586 }
624 x = C1 * (pHZ - row.f_di_ph); // AcidRequired(ZpH) 587 x = C1 * (pHZ - row.f_di_ph); // AcidRequired(ZpH)
625 // console.log(row.f_name+" C1: "+C1+" ZpH: "+pHZ+" di_ph: "+row.f_di_ph+" acid rquired: "+x);
626 Result += x * row.f_amount; 588 Result += x * row.f_amount;
627 } 589 }
628 } 590 }
629 // console.log("Final: "+Result);
630 return Result; 591 return Result;
631 } 592 }
632 593
633 function MashpH() { 594 function MashpH() {
634 var n = 0; 595 var n = 0;
649 } 610 }
650 611
651 function GetAcidSpecs(AT) { 612 function GetAcidSpecs(AT) {
652 switch(AT) { 613 switch(AT) {
653 case 0: return { // Melkzuur 614 case 0: return { // Melkzuur
654 pK1: 3.08, 615 pK1: 3.86,
655 pK2: 20, 616 pK2: 20,
656 pK3: 20, 617 pK3: 20,
657 MolWt: 90.08, 618 MolWt: 90.08,
658 AcidSG: 1214, 619 AcidSG: 1214,
659 AcidPrc: 0.88 620 AcidPrc: 0.88
660 }; 621 };
661 case 1: return { // Zoutzuur 622 case 1: return { // Zoutzuur
662 pK1: -10, 623 pK1: -7,
663 pK2: 20, 624 pK2: 20,
664 pK3: 20, 625 pK3: 20,
665 MolWt: 36.46, 626 MolWt: 36.46,
666 AcidSG: 1142, 627 AcidSG: 1142,
667 AcidPrc: 0.28 628 AcidPrc: 0.28
673 MolWt: 98.00, 634 MolWt: 98.00,
674 AcidSG: 1170, 635 AcidSG: 1170,
675 AcidPrc: 0.25 636 AcidPrc: 0.25
676 }; 637 };
677 case 3: return { // Zwavelzuur 638 case 3: return { // Zwavelzuur
678 pK1: -10, 639 pK1: -1,
679 pK2: 1.92, 640 pK2: 1.92,
680 pK3: 20, 641 pK3: 20,
681 MolWt: 98.07, 642 MolWt: 98.07,
682 AcidSG: 1700, 643 AcidSG: 1700,
683 AcidPrc: 0.93 644 AcidPrc: 0.93
789 dataRecord.wa_base_name = 0; 750 dataRecord.wa_base_name = 0;
790 } 751 }
791 if (last_base == '') 752 if (last_base == '')
792 last_base = BaseTypeData[$("#wa_base_name").val()].nl; 753 last_base = BaseTypeData[$("#wa_base_name").val()].nl;
793 754
794 var AT = dataRecord.wa_acid_name; // parseFloat($("#wa_acid_name").jqxNumberInput('decimal')); 755 var AT = dataRecord.wa_acid_name;
795 var BT = dataRecord.wa_base_name; //parseFloat($("#wa_base_name").jqxNumberInput('decimal')); 756 var BT = dataRecord.wa_base_name;
796 757
797 var result = GetAcidSpecs(AT); 758 var result = GetAcidSpecs(AT);
798 var pK1 = result.pK1; 759 var pK1 = result.pK1;
799 var pK2 = result.pK2; 760 var pK2 = result.pK2;
800 var pK3 = result.pK3; 761 var pK3 = result.pK3;
976 937
977 var deltapH = 0.001; 938 var deltapH = 0.001;
978 var deltapd = 0.1; 939 var deltapd = 0.1;
979 var pd = ProtonDeficit(pHa); 940 var pd = ProtonDeficit(pHa);
980 var n = 0; 941 var n = 0;
981 // console.log("n: "+n+" pd: "+pd+" protonDeficit: "+protonDeficit+" frac: "+frac+" pHa: "+pHa);
982
983 while (((pd < (protonDeficit - deltapd)) || (pd > (protonDeficit + deltapd))) && (n < 2000)) { 942 while (((pd < (protonDeficit - deltapd)) || (pd > (protonDeficit + deltapd))) && (n < 2000)) {
984 n++; 943 n++;
985 if (pd < (protonDeficit-deltapd)) 944 if (pd < (protonDeficit-deltapd))
986 pHa -= deltapH; 945 pHa -= deltapH;
987 else if (pd > (protonDeficit+deltapd)) 946 else if (pd > (protonDeficit+deltapd))
1120 dataRecord.sparge_source = 0; 1079 dataRecord.sparge_source = 0;
1121 $("#sparge_source").val(0); 1080 $("#sparge_source").val(0);
1122 } 1081 }
1123 } 1082 }
1124 1083
1125 console.log("calcSparge() target pH: "+TargetpH+" Source: "+Source_pH+" alkalinity: "+Source_alkalinity); 1084 //console.log("calcSparge() target pH: "+TargetpH+" Source: "+Source_pH+" alkalinity: "+Source_alkalinity);
1126 1085
1127 // Step 1: Compute the mole fractions of carbonic (f1o), bicarbonate (f2o) and carbonate(f3o) at the water pH 1086 // Step 1: Compute the mole fractions of carbonic (f1o), bicarbonate (f2o) and carbonate(f3o) at the water pH
1128 var r1 = Math.pow(10, Source_pH - 6.38); 1087 var r1 = Math.pow(10, Source_pH - 6.38);
1129 var r2 = Math.pow(10, Source_pH - 10.33); 1088 var r2 = Math.pow(10, Source_pH - 10.373);
1130 var d = 1 + r1 + r1*r2; 1089 var d = 1 + r1 + r1*r2;
1131 var f1 = 1/d; 1090 var f1 = 1/d;
1132 var f2 = r1/d; 1091 var f2 = r1/d;
1133 var f3 = r1 * r2 / d; 1092 var f3 = r1 * r2 / d;
1134 1093
1135 //Step 2. Compute the mole fractions at pH = 4.3 (the pH which defines alkalinity) 1094 //Step 2. Compute the mole fractions at pH = 4.3 (the pH which defines alkalinity)
1136 var r143 = Math.pow(10, 4.3 - 6.38); 1095 var r143 = Math.pow(10, 4.3 - 6.38);
1137 var r243 = Math.pow(10, 4.3 - 10.33); 1096 var r243 = Math.pow(10, 4.3 - 10.373);
1138 var d43 = 1 + r143 + r143*r243; 1097 var d43 = 1 + r143 + r143*r243;
1139 var f143 = 1/d43; 1098 var f143 = 1/d43;
1140 var f243 = r143 / d43; 1099 var f243 = r143 / d43;
1141 var f343 = r143 * r243 / d43; 1100 var f343 = r143 * r243 / d43;
1142 1101
1143 //Step 3. Convert the sample alkalinity to milliequivalents/L 1102 //Step 3. Convert the sample alkalinity to milliequivalents/L
1144 var alkalinity = Source_alkalinity / 50; 1103 var alkalinity = Source_alkalinity / 50;
1145 //Step 4. Solve 1104 //Step 4. Solve
1146 alkalinity = alkalinity / ((f143-f1)+(f3-f343)); 1105 var Ct = (alkalinity - 1000 * (Math.pow(10, -4.3) - Math.pow(10, -Source_pH))) / ((f143-f1)+(f3-f343));
1147 1106
1148 //Step 5. Compute mole fractions at desired pH 1107 //Step 5. Compute mole fractions at desired pH
1149 var r1g = Math.pow(10, TargetpH - 6.38); 1108 var r1g = Math.pow(10, TargetpH - 6.38);
1150 var r2g = Math.pow(10, TargetpH - 10.33); 1109 var r2g = Math.pow(10, TargetpH - 10.373);
1151 var dg = 1 + r1g + r1g*r2g; 1110 var dg = 1 + r1g + r1g*r2g;
1152 var f1g = 1/dg; 1111 var f1g = 1/dg;
1153 var f2g = r1g / dg; 1112 var f2g = r1g / dg;
1154 var f3g = r1g * r2g / dg; 1113 var f3g = r1g * r2g / dg;
1155 1114
1156 //Step 6. Use these to compute the milliequivalents acid required per liter (mEq/L) 1115 //Step 6. Use these to compute the milliequivalents acid required per liter (mEq/L)
1157 var Acid = alkalinity * ((f1g-f1)+(f3-f3g)) + Math.pow(10, -TargetpH) - Math.pow(10, -Source_pH); //mEq/l 1116 var Acid = Ct * ((f1g-f1)+(f3-f3g)) + Math.pow(10, -TargetpH) - Math.pow(10, -Source_pH); //mEq/l
1117 Acid += 0.01; // Add acid that would be required for distilled water.
1158 if (dataRecord.sparge_acid_type < 0 || dataRecord.sparge_acid_type > 3) { 1118 if (dataRecord.sparge_acid_type < 0 || dataRecord.sparge_acid_type > 3) {
1159 dataRecord.sparge_acid_type = 0; 1119 dataRecord.sparge_acid_type = 0;
1160 $("#sparge_acid_type").val(0); 1120 $("#sparge_acid_type").val(0);
1161 } 1121 }
1122
1123 //Step 8. Get the acid data.
1162 var AT = dataRecord.sparge_acid_type; 1124 var AT = dataRecord.sparge_acid_type;
1163 var result = GetAcidSpecs(AT); 1125 var result = GetAcidSpecs(AT);
1164 var pK1 = result.pK1; 1126 var pK1 = result.pK1;
1165 var pK2 = result.pK2; 1127 var pK2 = result.pK2;
1166 var pK3 = result.pK3; 1128 var pK3 = result.pK3;
1174 1136
1175 //Step 10. Multiply by molecular weight of the acid 1137 //Step 10. Multiply by molecular weight of the acid
1176 Acid *= MolWt; //mg 1138 Acid *= MolWt; //mg
1177 1139
1178 Acid = Acid / AcidSG; //ml ; 88% lactic solution 1140 Acid = Acid / AcidSG; //ml ; 88% lactic solution
1179 f1 = dataRecord.sparge_acid_perc; 1141 var f1 = dataRecord.sparge_acid_perc;
1180 if (f1 <= 0.1) 1142 if (f1 <= 0.1)
1181 f1 = AcidPrc; 1143 f1 = AcidPrc;
1182 Acid = Acid * AcidPrc / (f1 / 100); 1144 Acid = Acid * AcidPrc / (f1 / 100);
1183 1145
1184 Acid *= dataRecord.sparge_volume; //ml lactic acid total 1146 Acid *= dataRecord.sparge_volume; //ml lactic acid total
2564 row["step_name"] = "Stap 1"; 2526 row["step_name"] = "Stap 1";
2565 row["step_type"] = 0; 2527 row["step_type"] = 0;
2566 row["step_infuse_amount"] = 15; 2528 row["step_infuse_amount"] = 15;
2567 row["step_temp"] = 62.0; 2529 row["step_temp"] = 62.0;
2568 row['step_time'] = 20.0; 2530 row['step_time'] = 20.0;
2531 row['step_thickness'] = 0;
2569 row['ramp_time'] = 1.0; 2532 row['ramp_time'] = 1.0;
2570 row['end_temp'] = 62.0; 2533 row['end_temp'] = 62.0;
2571 return row; 2534 return row;
2572 } 2535 }
2573 var mashSource = { 2536 var mashSource = {
2579 { name: 'step_name', type: 'string' }, 2542 { name: 'step_name', type: 'string' },
2580 { name: 'step_type', type: 'int' }, 2543 { name: 'step_type', type: 'int' },
2581 { name: 'step_infuse_amount', type: 'float' }, 2544 { name: 'step_infuse_amount', type: 'float' },
2582 { name: 'step_temp', type: 'float' }, 2545 { name: 'step_temp', type: 'float' },
2583 { name: 'step_time', type: 'float' }, 2546 { name: 'step_time', type: 'float' },
2547 { name: 'step_thickness', type: 'float' },
2584 { name: 'ramp_time', type: 'float' }, 2548 { name: 'ramp_time', type: 'float' },
2585 { name: 'end_temp', type: 'float' } 2549 { name: 'end_temp', type: 'float' }
2586 ], 2550 ],
2587 addrow: function (rowid, rowdata, position, commit) { 2551 addrow: function (rowid, rowdata, position, commit) {
2588 commit(true); 2552 commit(true);
2634 ready: function() { 2598 ready: function() {
2635 calcFermentables(); 2599 calcFermentables();
2636 calcInit(); 2600 calcInit();
2637 $('#jqxLoader').jqxLoader('close'); 2601 $('#jqxLoader').jqxLoader('close');
2638 $('#jqxTabs').jqxTabs('first'); 2602 $('#jqxTabs').jqxTabs('first');
2639 // setReadonly(dataRecord.locked);
2640 }, 2603 },
2641 columns: [ 2604 columns: [
2642 { text: 'Stap naam', datafield: 'step_name' }, 2605 { text: 'Stap naam', datafield: 'step_name' },
2643 { text: 'Stap type', datafield: 'step_type', width: 175, 2606 { text: 'Stap type', datafield: 'step_type', width: 175,
2644 cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) { 2607 cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
2648 { text: 'Start &deg;C', datafield: 'step_temp', width: 90, align: 'right', cellsalign: 'right', cellsformat: 'f1' }, 2611 { text: 'Start &deg;C', datafield: 'step_temp', width: 90, align: 'right', cellsalign: 'right', cellsformat: 'f1' },
2649 { text: 'Eind &deg;C', datafield: 'end_temp', width: 90, align: 'right', cellsalign: 'right', cellsformat: 'f1' }, 2612 { text: 'Eind &deg;C', datafield: 'end_temp', width: 90, align: 'right', cellsalign: 'right', cellsformat: 'f1' },
2650 { text: 'Rust min.', datafield: 'step_time', width: 90, align: 'right', cellsalign: 'right' }, 2613 { text: 'Rust min.', datafield: 'step_time', width: 90, align: 'right', cellsalign: 'right' },
2651 { text: 'Stap min.', datafield: 'ramp_time', width: 90, align: 'right', cellsalign: 'right' }, 2614 { text: 'Stap min.', datafield: 'ramp_time', width: 90, align: 'right', cellsalign: 'right' },
2652 { text: 'Infuse L.', datafield: 'step_infuse_amount', width: 90, align: 'right', cellsalign: 'right', cellsformat: 'f1' }, 2615 { text: 'Infuse L.', datafield: 'step_infuse_amount', width: 90, align: 'right', cellsalign: 'right', cellsformat: 'f1' },
2616 { text: 'L/Kg.', datafield: 'step_thickness', width: 90, align: 'right', cellsalign: 'right', cellsformat: 'f2' },
2653 { text: '', datafield: 'Edit', columntype: 'button', width: 100, align: 'center', cellsrenderer: function () { 2617 { text: '', datafield: 'Edit', columntype: 'button', width: 100, align: 'center', cellsrenderer: function () {
2654 return "Wijzig"; 2618 return "Wijzig";
2655 }, buttonclick: function (row) { 2619 }, buttonclick: function (row) {
2656 mashRow = row; 2620 mashRow = row;
2657 mashData = $("#mashGrid").jqxGrid('getrowdata', mashRow); 2621 mashData = $("#mashGrid").jqxGrid('getrowdata', mashRow);
3419 if (i == 0) 3383 if (i == 0)
3420 row["step_infuse_amount"] = mash_infuse; 3384 row["step_infuse_amount"] = mash_infuse;
3421 else 3385 else
3422 row["step_infuse_amount"] = 0; 3386 row["step_infuse_amount"] = 0;
3423 row["step_temp"] = data.step_temp; 3387 row["step_temp"] = data.step_temp;
3388 if (mashkg > 0)
3389 row["step_thickness"] = parseFloat(mash_infuse / mashkg);
3390 else
3391 row["step_thickness"] = 0;
3424 row["end_temp"] = data.end_temp; 3392 row["end_temp"] = data.end_temp;
3425 row["step_time"] = data.step_time; 3393 row["step_time"] = data.step_time;
3426 row["ramp_time"] = data.ramp_time; 3394 row["ramp_time"] = data.ramp_time;
3427 var commit = $("#mashGrid").jqxGrid('addrow', null, row); 3395 var commit = $("#mashGrid").jqxGrid('addrow', null, row);
3428 } 3396 }
3440 modalOpacity: 0.40 3408 modalOpacity: 0.40
3441 }); 3409 });
3442 $("#MashReady").jqxButton({ template: "success", width: '90px', theme: theme }); 3410 $("#MashReady").jqxButton({ template: "success", width: '90px', theme: theme });
3443 $("#MashReady").click(function () { 3411 $("#MashReady").click(function () {
3444 $("#mashGrid").jqxGrid('sortby', 'step_temp', 'asc'); 3412 $("#mashGrid").jqxGrid('sortby', 'step_temp', 'asc');
3413 mash_infuse = 0;
3414 var rows = $('#mashGrid').jqxGrid('getrows');
3415 for (var i = 0; i < rows.length; i++) {
3416 var row = rows[i];
3417 if (row.step_type == 0) // Infusion
3418 mash_infuse += parseFloat(row.step_infuse_amount);
3419 var rowdata = $("#mashGrid").jqxGrid('getrowdata', i);
3420 if (mashkg > 0)
3421 rowdata.step_thickness = parseFloat(mash_infuse / mashkg);
3422 else
3423 rowdata.step_thickness = 0;
3424 }
3445 }); 3425 });
3446 $("#wstep_name").jqxInput({ theme: theme, width: 320, height: 23 }); 3426 $("#wstep_name").jqxInput({ theme: theme, width: 320, height: 23 });
3447 $("#wstep_name").on('change', function (event) { 3427 $("#wstep_name").on('change', function (event) {
3448 var rowdata = $("#mashGrid").jqxGrid('getrowdata', mashRow); 3428 var rowdata = $("#mashGrid").jqxGrid('getrowdata', mashRow);
3449 rowdata.step_name = event.args.value; 3429 rowdata.step_name = event.args.value;

mercurial