// File: Eba-M[P]E3DC-Control/awattar.cpp
// Function: fHighprice(std::vector<watt_s, std::allocator<watt_s>>&, std::vector<wetter_s, std::allocator<wetter_s>>&, int, int, float, float&, int&, float&)
float fHighprice(std::vector<watt_s> &w,std::vector<wetter_s> &wetter,int ab,int bis,float preis,float &minsoc,int &maxpos,float &maxsoc)    // Anzahle Einträge mit > preis
{                                            // l1 = erste position h1 = letzte Position
    float x1 = 0;   // x1 = Bedarf
    float x2 = 0;   // solarer zugewinn
    float x3 = 0;   // Verbrauch/Ertrag
    float x4 = 0;   // maximale Entladung = Bedarf
    minsoc = 0; // min erreicher Soc
    maxsoc = 0; // maximal erreicher Soc
    maxpos = 0;
    if (wetter.size() == 0)
        return 0;
    for (int j = ab; (j <= bis)&&(j<w.size()); j++ )
    {
        x3 = wetter[j].hourly + wetter[j].wpbedarf - wetter[j].solar;;
        // Suchen nach Hoch und Tiefs
        if (w[j].pp > preis) 
        {
            if (x3 > 0)  // Verbrauch bei höheren Preis
            {
                if (x2 > 0)
                {
                    if (x2>x3)    // Konnte schon nachgeladen werden, dann vom bedarf abziehen.
                        x2 = x2 - x3;
                    else
                    {
                        x3 = x3 - x2; // solaren Zugewinn abziehen
                        x1 = x1 + x3; // Bedarf hinzurechen
                        x2 = 0;       // Zugewinn ist nun 0
                        x4 = x4 + x3; // MinSoC
                    }
                }
                        // mit Solaretrag verrechnen
                else
                {
                    x1 = x1 + x3;
                    x4 = x4 + x3;
                    if (x4 > minsoc&&(j<maxpos||maxpos==0))
                        minsoc = x4;
                    if (x1>=100) return x1;
                }
            }
            else // Ertrag bei höheren Preis
            {
                x2 = x2 - x3;
                if (x2>maxsoc) {
                    maxsoc = x2;
                    maxpos = j;
                }
// Highpricesuche abbrechen
                if (x2 > 100)
                return x1;
                    
            }
        } else
            if (x3 < 0)
            {              // PV Überschuss ?
                x2 = x2 - x3;
                if (x2>maxsoc) {
                    maxsoc = x2;
                    maxpos = j;
                }
                if (x2 > 100)
                {
                    x2 = 100;
                    maxsoc = x2;
                    maxpos = j;
                    // Wenn der Speicher voll ist, kann abgebrochen werden?
                    return x1;
                }
            }
    }
    return x1;
}

// Assembly:
subq $0x68, %rsp
movq 0x70(%rsp), %rax
movq %rdi, 0x58(%rsp)
movq %rsi, 0x50(%rsp)
movl %edx, 0x4c(%rsp)
movl %ecx, 0x48(%rsp)
movss %xmm0, 0x44(%rsp)
movq %r8, 0x38(%rsp)
movq %r9, 0x30(%rsp)
xorps %xmm0, %xmm0
movss %xmm0, 0x2c(%rsp)
xorps %xmm0, %xmm0
movss %xmm0, 0x28(%rsp)
xorps %xmm0, %xmm0
movss %xmm0, 0x24(%rsp)
xorps %xmm0, %xmm0
movss %xmm0, 0x20(%rsp)
movq 0x38(%rsp), %rax
xorps %xmm0, %xmm0
movss %xmm0, (%rax)
movq 0x70(%rsp), %rax
xorps %xmm0, %xmm0
movss %xmm0, (%rax)
movq 0x30(%rsp), %rax
movl $0x0, (%rax)
movq 0x50(%rsp), %rdi
callq 0x1cc80
cmpq $0x0, %rax
jne 0x43c20
xorps %xmm0, %xmm0
movss %xmm0, 0x64(%rsp)
jmp 0x43f07
movl 0x4c(%rsp), %eax
movl %eax, 0x1c(%rsp)
movl 0x1c(%rsp), %ecx
xorl %eax, %eax
cmpl 0x48(%rsp), %ecx
movb %al, 0x1b(%rsp)
jg 0x43c5e
movslq 0x1c(%rsp), %rax
movq %rax, 0x10(%rsp)
movq 0x58(%rsp), %rdi
callq 0x1ce80
movq %rax, %rcx
movq 0x10(%rsp), %rax
cmpq %rcx, %rax
setb %al
movb %al, 0x1b(%rsp)
movb 0x1b(%rsp), %al
testb $0x1, %al
jne 0x43c6b
jmp 0x43efb
movq 0x50(%rsp), %rdi
movslq 0x1c(%rsp), %rsi
callq 0x1cca0
movss 0x14(%rax), %xmm0
movss %xmm0, 0x8(%rsp)
movq 0x50(%rsp), %rdi
movslq 0x1c(%rsp), %rsi
callq 0x1cca0
movss 0x8(%rsp), %xmm0
addss 0x24(%rax), %xmm0
movss %xmm0, 0xc(%rsp)
movq 0x50(%rsp), %rdi
movslq 0x1c(%rsp), %rsi
callq 0x1cca0
movss 0xc(%rsp), %xmm0
subss 0x1c(%rax), %xmm0
movss %xmm0, 0x24(%rsp)
movq 0x58(%rsp), %rdi
movslq 0x1c(%rsp), %rsi
callq 0x1ce20
movss 0x8(%rax), %xmm0
ucomiss 0x44(%rsp), %xmm0
jbe 0x43e52
movss 0x24(%rsp), %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jbe 0x43deb
movss 0x28(%rsp), %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jbe 0x43d69
movss 0x28(%rsp), %xmm0
ucomiss 0x24(%rsp), %xmm0
jbe 0x43d25
movss 0x28(%rsp), %xmm0
subss 0x24(%rsp), %xmm0
movss %xmm0, 0x28(%rsp)
jmp 0x43d64
movss 0x24(%rsp), %xmm0
subss 0x28(%rsp), %xmm0
movss %xmm0, 0x24(%rsp)
movss 0x2c(%rsp), %xmm0
addss 0x24(%rsp), %xmm0
movss %xmm0, 0x2c(%rsp)
xorps %xmm0, %xmm0
movss %xmm0, 0x28(%rsp)
movss 0x20(%rsp), %xmm0
addss 0x24(%rsp), %xmm0
movss %xmm0, 0x20(%rsp)
jmp 0x43de9
movss 0x2c(%rsp), %xmm0
addss 0x24(%rsp), %xmm0
movss %xmm0, 0x2c(%rsp)
movss 0x20(%rsp), %xmm0
addss 0x24(%rsp), %xmm0
movss %xmm0, 0x20(%rsp)
movss 0x20(%rsp), %xmm0
movq 0x38(%rsp), %rax
ucomiss (%rax), %xmm0
jbe 0x43dc3
movl 0x1c(%rsp), %eax
movq 0x30(%rsp), %rcx
cmpl (%rcx), %eax
jl 0x43db4
movq 0x30(%rsp), %rax
cmpl $0x0, (%rax)
jne 0x43dc3
movss 0x20(%rsp), %xmm0
movq 0x38(%rsp), %rax
movss %xmm0, (%rax)
movss 0x2c(%rsp), %xmm0
movss 0x1c27f(%rip), %xmm1    # 0x60050
ucomiss %xmm1, %xmm0
jb 0x43de7
movss 0x2c(%rsp), %xmm0
movss %xmm0, 0x64(%rsp)
jmp 0x43f07
jmp 0x43de9
jmp 0x43e4d
movss 0x28(%rsp), %xmm0
subss 0x24(%rsp), %xmm0
movss %xmm0, 0x28(%rsp)
movss 0x28(%rsp), %xmm0
movq 0x70(%rsp), %rax
ucomiss (%rax), %xmm0
jbe 0x43e27
movss 0x28(%rsp), %xmm0
movq 0x70(%rsp), %rax
movss %xmm0, (%rax)
movl 0x1c(%rsp), %ecx
movq 0x30(%rsp), %rax
movl %ecx, (%rax)
movss 0x28(%rsp), %xmm0
movss 0x1c21b(%rip), %xmm1    # 0x60050
ucomiss %xmm1, %xmm0
jbe 0x43e4b
movss 0x2c(%rsp), %xmm0
movss %xmm0, 0x64(%rsp)
jmp 0x43f07
jmp 0x43e4d
jmp 0x43ee9
xorps %xmm0, %xmm0
ucomiss 0x24(%rsp), %xmm0
jbe 0x43ee7
movss 0x28(%rsp), %xmm0
subss 0x24(%rsp), %xmm0
movss %xmm0, 0x28(%rsp)
movss 0x28(%rsp), %xmm0
movq 0x70(%rsp), %rax
ucomiss (%rax), %xmm0
jbe 0x43e9c
movss 0x28(%rsp), %xmm0
movq 0x70(%rsp), %rax
movss %xmm0, (%rax)
movl 0x1c(%rsp), %ecx
movq 0x30(%rsp), %rax
movl %ecx, (%rax)
movss 0x28(%rsp), %xmm0
movss 0x1c1a6(%rip), %xmm1    # 0x60050
ucomiss %xmm1, %xmm0
jbe 0x43ee5
movss 0x1c199(%rip), %xmm0    # 0x60050
movss %xmm0, 0x28(%rsp)
movss 0x28(%rsp), %xmm0
movq 0x70(%rsp), %rax
movss %xmm0, (%rax)
movl 0x1c(%rsp), %ecx
movq 0x30(%rsp), %rax
movl %ecx, (%rax)
movss 0x2c(%rsp), %xmm0
movss %xmm0, 0x64(%rsp)
jmp 0x43f07
jmp 0x43ee7
jmp 0x43ee9
jmp 0x43eeb
movl 0x1c(%rsp), %eax
addl $0x1, %eax
movl %eax, 0x1c(%rsp)
jmp 0x43c28
movss 0x2c(%rsp), %xmm0
movss %xmm0, 0x64(%rsp)
movss 0x64(%rsp), %xmm0
addq $0x68, %rsp
retq
nopw %cs:(%rax,%rax)